Ly8gRG8gbm90IHJlbW92ZSB0aGlzIGxpbmU6IGl0IGlzIHVzZWQgaW4gdGVzdCBiZWxvdwpwYWNrYWdlIGdyb292eQoKLyoqCiAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgcmVhZExpbmUoKSBtZXRob2Qgd29ya3Mgb24gUmVhZGVyL0lucHV0U3RyZWFtCiAqIAogKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgogKiBAYXV0aG9yIEpvYWNoaW0gQmF1bWFubgogKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAqLwoKY2xhc3MgUmVhZExpbmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewogICAgZGVmIGZpbGUKICAgIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvUmVhZExpbmVUZXN0Lmdyb292eSIpCiAgICB9CiAgICB2b2lkIHRlc3RSZWFkT25lTGluZUZyb21SZWFkZXIoKSB7CiAgICAgICAgZGVmIGxpbmUKICAgICAgICBmaWxlLndpdGhSZWFkZXIoKSB7bGluZSA9IGl0LnJlYWRMaW5lKCl9CiAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIi8vIERvIG5vdCByZW1vdmUgdGhpcyBsaW5lOiBpdCBpcyB1c2VkIGluIHRlc3QgYmVsb3ciCiAgICB9CiAgICAKICAgIHZvaWQgdGVzdFJlYWRPbmVMaW5lRnJvbUlucHV0U3RyZWFtKCkgewogICAgICAgIGRlZiBsaW5lCiAgICAgICAgZmlsZS53aXRoSW5wdXRTdHJlYW0oKSB7bGluZSA9IGl0LnJlYWRMaW5lKCl9CiAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIi8vIERvIG5vdCByZW1vdmUgdGhpcyBsaW5lOiBpdCBpcyB1c2VkIGluIHRlc3QgYmVsb3ciCiAgICB9CiAgICAKICAgIHN0YXRpYyB0ZXN0U3RyaW5nID0gIiDkXG4g9lxuXG4g/FxyXG4gNVxyXHIgN1xuXHIgOSIKICAgIHN0YXRpYyBleHBlY3RlZExpbmVzID0gWyAiIOQiLCAiIPYiLCAiIiwgIiD8IiwgIiA1IiwgIiIsICIgNyIsICIiLCAiIDkiIF0KICAgIHN0YXRpYyBTdHJpbmdbXSBleHBlY3RlZExpbmVzU2xvdyA9IFsgIiDkIiwgIiD2IiwgIiD8IiwgIiA1IiwgIiA3IiBdCiAgICBzdGF0aWMgaW50W10gZXhwZWN0ZWRDaGFycyA9IFsnICcsICc5JywgLTFdOwoKICAgIHZvaWQgcmVhZEZyb21SZWFkZXIoUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBleHBlY3RlZExpbmVzLmVhY2ggeyBleHBlY3RlZCAtPgogICAgICAgICAgICBkZWYgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpCiAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVhZGxpbmUgc2hvdWxkIHJldHVybiBjb3JyZWN0IGxpbmUiLCBleHBlY3RlZCwgbGluZSkKICAgICAgICB9CiAgICAgICAgYXNzZXJ0TnVsbCgiUmVhZGxpbmUgc2hvdWxkIHJldHVybiBudWxsIiwgcmVhZGVyLnJlYWRMaW5lKCkpCiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmVkUmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgICAgICAgIAogICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKSkKICAgICAgICByZWFkRnJvbVJlYWRlcihyZWFkZXIpCiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFJlYWRlclN1cHBvcnRpbmdNYXJrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgICAgICAgIAogICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpCiAgICAgICAgcmVhZEZyb21SZWFkZXIocmVhZGVyKQogICAgfQoKICAgIC8qCiAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgY2Fubm90IHJlYWQgbW9yZSB0aGFuIG9uZSBsaW5lIHNlcGFyYXRvcgogICAgICogVGh1cyBlbXB0eSBsaW5lcyBjYW4gYmUgcmV0dXJuZWQgaWYgbGluZSBzZXBhcmF0aW9uIGlzIFxyXG4uCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJTbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgICAgICAgIAogICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgU2xvd1N0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKTsKICAgICAgICBleHBlY3RlZExpbmVzU2xvdy5lYWNoIHsgZXhwZWN0ZWQgLT4KICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKQogICAgICAgICAgICB3aGlsZShsaW5lICE9IG51bGwgJiYgbGluZS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkKICAgICAgICAgICAgfSAKICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWFkbGluZSBzaG91bGQgcmV0dXJuIGNvcnJlY3QgbGluZSIsIGV4cGVjdGVkLCBsaW5lKTsgICAgCiAgICAgICAgfQogICAgICAgIGFzc2VydEVxdWFscygiUmVhZGxpbmUgc2hvdWxkIHJldHVybiBlbXB0eSBzdHJpbmciLCAiIiwgcmVhZGVyLnJlYWRMaW5lKCkpOwoKICAgICAgICBleHBlY3RlZENoYXJzLmVhY2ggeyBleHBlY3RlZCAtPgogICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlbWFpbmluZyBjaGFyYWN0ZXJzIGluY29ycmVjdCIsIGV4cGVjdGVkLCByZWFkZXIucmVhZCgpKSAgICAgICAgCiAgICAgICAgfQogICAgICAgIGFzc2VydE51bGwocmVhZGVyLnJlYWRMaW5lKCkpOwogICAgfQp9CmNsYXNzIFNsb3dTdHJpbmdSZWFkZXIgZXh0ZW5kcyBTdHJpbmdSZWFkZXIgewogICAgcHVibGljIFNsb3dTdHJpbmdSZWFkZXIoU3RyaW5nIHMpIHsgc3VwZXIocyk7IH0KICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZSB9Cn0K