Lyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMTAgSm9lbCBkZSBHdXptYW4KICAgIGh0dHA6Ly9zcGlyaXQuc291cmNlZm9yZ2UubmV0LwoKICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovLyB0aGlzIGZpbGUgaW50ZW50aW9uYWxseSBjb250YWlucyBub24tYXNjaWkgY2hhcmFjdGVycwovLyBib29zdGluc3BlY3Q6bm9hc2NpaQoKI2luY2x1ZGUgPGJvb3N0L2RldGFpbC9saWdodHdlaWdodF90ZXN0LmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpX2NoYXIuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcWlfc3RyaW5nLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpX2RpcmVjdGl2ZS5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9xaV9hY3Rpb24uaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcGhvZW5peF9jb3JlLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXhfb3BlcmF0b3IuaHBwPgoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSAidGVzdC5ocHAiCgppbnQKbWFpbigpCnsKICAgIHVzaW5nIHNwaXJpdF90ZXN0Ojp0ZXN0OwogICAgdXNpbmcgc3Bpcml0X3Rlc3Q6OnRlc3RfYXR0cjsKICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6OnFpOjpsaXQ7CgogICAgewogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0Ojphc2NpaTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIngiLCBub19jYXNlW2NoYXJfXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiWCIsIG5vX2Nhc2VbY2hhcl8oJ3gnKV0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIlgiLCBub19jYXNlW2NoYXJfKCdYJyldKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4Iiwgbm9fY2FzZVtjaGFyXygnWCcpXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieCIsIG5vX2Nhc2VbY2hhcl8oJ3gnKV0pKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCJ6Iiwgbm9fY2FzZVtjaGFyXygnWCcpXSkpOwogICAgICAgIEJPT1NUX1RFU1QoIXRlc3QoInoiLCBub19jYXNlW2NoYXJfKCd4JyldKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4Iiwgbm9fY2FzZVtjaGFyXygnYScsICd6JyldKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJYIiwgbm9fY2FzZVtjaGFyXygnYScsICd6JyldKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiYSIsIG5vX2Nhc2VbY2hhcl8oJ2InLCAneicpXSkpOwogICAgICAgIEJPT1NUX1RFU1QoIXRlc3QoInoiLCBub19jYXNlW2NoYXJfKCdhJywgJ3knKV0pKTsKICAgIH0KCiAgICB7CiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpzcGlyaXQ6OmFzY2lpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiWCIsIG5vX2Nhc2VbJ3gnXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiWCIsIG5vX2Nhc2VbJ1gnXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieCIsIG5vX2Nhc2VbJ1gnXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieCIsIG5vX2Nhc2VbJ3gnXSkpOwogICAgICAgIEJPT1NUX1RFU1QoIXRlc3QoInoiLCBub19jYXNlWydYJ10pKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCJ6Iiwgbm9fY2FzZVsneCddKSk7CiAgICB9CgovLyBuZWVkZWQgZm9yIFZDNy4xIG9ubHkKI2lmIEJPT1NUX1dPUktBUk9VTkQoQk9PU1RfTVNWQywgQk9PU1RfVEVTVEVEX0FUKDEzMTApKQojcHJhZ21hIHNldGxvY2FsZSgiZnJlbmNoIikKI2VuZGlmCiAgICB7CiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpzcGlyaXQ6Omlzbzg4NTlfMTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsEiLCBub19jYXNlW2NoYXJfKCfhJyldKSk7CiAgICB9CgogICAgewogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0Ojppc284ODU5XzE7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJYIiwgbm9fY2FzZVtjaGFyXygiYS16IildKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiMSIsIG5vX2Nhc2VbY2hhcl8oImEteiIpXSkpOwoKICAgICAgICBCT09TVF9URVNUKHRlc3QoIskiLCBub19jYXNlW2NoYXJfKCLlLe8iKV0pKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCL/Iiwgbm9fY2FzZVtjaGFyXygi5S3vIildKSk7CiAgICB9CiNpZiBCT09TVF9XT1JLQVJPVU5EKEJPT1NUX01TVkMsIEJPT1NUX1RFU1RFRF9BVCgxMzEwKSkKI3ByYWdtYSBzZXRsb2NhbGUoIiIpCiNlbmRpZgoKICAgIHsKICAgICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnNwaXJpdDo6YXNjaWk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJCb2NoaSBCb2NoaSIsIG5vX2Nhc2VbbGl0KCJib2NoaSBib2NoaSIpXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiQk9DSEkgQk9DSEkiLCBub19jYXNlW2xpdCgiYm9jaGkgYm9jaGkiKV0pKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCJWYXZvbyIsIG5vX2Nhc2VbbGl0KCJib2NoaSBib2NoaSIpXSkpOwogICAgfQoKI2lmIEJPT1NUX1dPUktBUk9VTkQoQk9PU1RfTVNWQywgQk9PU1RfVEVTVEVEX0FUKDEzMTApKQojcHJhZ21hIHNldGxvY2FsZSgiZnJlbmNoIikKI2VuZGlmCiAgICB7CiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpzcGlyaXQ6Omlzbzg4NTlfMTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsHhIiwgbm9fY2FzZVtsaXQoIuHBIildKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLh4SIsIG5vX2Nhc2Vbbm9fY2FzZVtsaXQoIuHBIildXSkpOwogICAgfQojaWYgQk9PU1RfV09SS0FST1VORChCT09TVF9NU1ZDLCBCT09TVF9URVNURURfQVQoMTMxMCkpCiNwcmFnbWEgc2V0bG9jYWxlKCIiKQojZW5kaWYKCiAgICB7CiAgICAgICAgLy8gc2hvdWxkIHdvcmshCiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpzcGlyaXQ6OmFzY2lpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieCIsIG5vX2Nhc2Vbbm9fY2FzZVtjaGFyX11dKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4Iiwgbm9fY2FzZVtub19jYXNlW2NoYXJfKCd4JyldXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieWFiYWRhYmFkb28iLCBub19jYXNlW25vX2Nhc2VbbGl0KCJZYWJhZGFiYWRvbyIpXV0pKTsKICAgIH0KCiAgICB7CiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpzcGlyaXQ6OmFzY2lpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiWCIsIG5vX2Nhc2VbYWxudW1dKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCI2Iiwgbm9fY2FzZVthbG51bV0pKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCI6Iiwgbm9fY2FzZVthbG51bV0pKTsKCiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJYIiwgbm9fY2FzZVtsb3dlcl0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIngiLCBub19jYXNlW2xvd2VyXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiWCIsIG5vX2Nhc2VbdXBwZXJdKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4Iiwgbm9fY2FzZVt1cHBlcl0pKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCI6Iiwgbm9fY2FzZVtsb3dlcl0pKTsKICAgICAgICBCT09TVF9URVNUKCF0ZXN0KCI6Iiwgbm9fY2FzZVt1cHBlcl0pKTsKICAgIH0KCiAgICB7CiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpzcGlyaXQ6Omlzbzg4NTlfMTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIlgiLCBub19jYXNlW2FsbnVtXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiNiIsIG5vX2Nhc2VbYWxudW1dKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiOiIsIG5vX2Nhc2VbYWxudW1dKSk7CgogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiWCIsIG5vX2Nhc2VbbG93ZXJdKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4Iiwgbm9fY2FzZVtsb3dlcl0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIlgiLCBub19jYXNlW3VwcGVyXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieCIsIG5vX2Nhc2VbdXBwZXJdKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiOiIsIG5vX2Nhc2VbbG93ZXJdKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiOiIsIG5vX2Nhc2VbdXBwZXJdKSk7CiAgICB9CgogICAgewogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0OjpzdGFuZGFyZDsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIlgiLCBub19jYXNlW2FsbnVtXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiNiIsIG5vX2Nhc2VbYWxudW1dKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiOiIsIG5vX2Nhc2VbYWxudW1dKSk7CgogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiWCIsIG5vX2Nhc2VbbG93ZXJdKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4Iiwgbm9fY2FzZVtsb3dlcl0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIlgiLCBub19jYXNlW3VwcGVyXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgieCIsIG5vX2Nhc2VbdXBwZXJdKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiOiIsIG5vX2Nhc2VbbG93ZXJdKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiOiIsIG5vX2Nhc2VbdXBwZXJdKSk7CiAgICB9CgogICAgewogICAgICAgIC8vIGNoc2V0cwogICAgICAgIG5hbWVzcGFjZSBzdGFuZGFyZCA9IGJvb3N0OjpzcGlyaXQ6OnN0YW5kYXJkOwogICAgICAgIG5hbWVzcGFjZSBzdGFuZGFyZF93aWRlID0gYm9vc3Q6OnNwaXJpdDo6c3RhbmRhcmRfd2lkZTsKCiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJ4Iiwgc3RhbmRhcmQ6Om5vX2Nhc2Vbc3RhbmRhcmQ6OmNoYXJfKCJhLXoiKV0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIlgiLCBzdGFuZGFyZDo6bm9fY2FzZVtzdGFuZGFyZDo6Y2hhcl8oImEteiIpXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdChMIlgiLCBzdGFuZGFyZF93aWRlOjpub19jYXNlW3N0YW5kYXJkX3dpZGU6OmNoYXJfKEwiYS16IildKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KEwiWCIsIHN0YW5kYXJkX3dpZGU6Om5vX2Nhc2Vbc3RhbmRhcmRfd2lkZTo6Y2hhcl8oTCJYIildKSk7CiAgICB9CgogICAgewogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0OjpzdGFuZGFyZDsKICAgICAgICBzdGQ6OnN0cmluZyBzKCJib2NoaSBib2NoaSIpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiQm9jaGkgQm9jaGkiLCBub19jYXNlW2xpdChzLmNfc3RyKCkpXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiQm9jaGkgQm9jaGkiLCBub19jYXNlW2xpdChzKV0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIkJvY2hpIEJvY2hpIiwgbm9fY2FzZVtzLmNfc3RyKCldKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJCb2NoaSBCb2NoaSIsIG5vX2Nhc2Vbc10pKTsKICAgIH0KCiAgICB7ICAgLy8gbGF6eSBub19jYXNlIGNoYXJzCgogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0Ojphc2NpaTsKCiAgICAgICAgdXNpbmcgYm9vc3Q6OnBob2VuaXg6OnZhbDsKICAgICAgICB1c2luZyBib29zdDo6cGhvZW5peDo6cmVmOwogICAgICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6Ol8xOwoKICAgICAgICBCT09TVF9URVNUKCh0ZXN0KCJYIiwgbm9fY2FzZVt2YWwoJ3gnKV0pKSk7CiAgICAgICAgQk9PU1RfVEVTVCgodGVzdCgiaCIsIG5vX2Nhc2VbY2hhcl8odmFsKCdhJyksIHZhbCgnbicpKV0pKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCIwIiwgbm9fY2FzZVtjaGFyXyh2YWwoImEtejAtOSIpKV0pKTsKCiAgICAgICAgY2hhciBjaDsgLy8gbWFrZSBzdXJlIGxhenkgY2hhcnMgaGF2ZSBhbiBhdHRyaWJ1dGUKICAgICAgICBCT09TVF9URVNUKHRlc3QoIngiLCBub19jYXNlW2NoYXJfKHZhbCgneCcpKV1bcmVmKGNoKSA9IF8xXSkpOwogICAgICAgIEJPT1NUX1RFU1QoY2ggPT0gJ3gnKTsKICAgIH0KCiAgICB7ICAgLy8gbGF6eSBub19jYXNlIGxpdHMKCiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpzcGlyaXQ6OmFzY2lpOwogICAgICAgIHVzaW5nIGJvb3N0OjpwaG9lbml4Ojp2YWw7CgogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiQm9jaGkgQm9jaGkiLCBub19jYXNlW3ZhbCgiYm9jaGkgYm9jaGkiKV0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIkJPQ0hJIEJPQ0hJIiwgbm9fY2FzZVt2YWwoImJvY2hpIGJvY2hpIildKSk7CiAgICAgICAgQk9PU1RfVEVTVCghdGVzdCgiVmF2b28iLCBub19jYXNlW3ZhbCgiYm9jaGkgYm9jaGkiKV0pKTsKICAgIH0KCiAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKfQo=