cGFja2FnZSBnbHMuY2gwMy5zMDgKLyoqCiAqIEpMUyAzLjg6CiAqIEFuIGlkZW50aWZpZXIgaXMgYW4gdW5saW1pdGVkLWxlbmd0aCBzZXF1ZW5jZSBvZiBKYXZhIGxldHRlcnMgYW5kIEphdmEKICogZGlnaXRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggbXVzdCBiZSBhIEphdmEgbGV0dGVyLiAuLi4gCiAqCiAqIExldHRlcnMgYW5kIGRpZ2l0cyBtYXkgYmUgZHJhd24gZnJvbSB0aGUgZW50aXJlIFVuaWNvZGUgY2hhcmFjdGVyIHNldC4uLiAKICoKICogQSCTSmF2YSBsZXR0ZXKUIGlzIGEgY2hhcmFjdGVyIGZvciB3aGljaCB0aGUgbWV0aG9kCiAqIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoaW50KSByZXR1cm5zIHRydWUuIEEgk0phdmEgbGV0dGVyLW9yLWRpZ2l0lAogKiBpcyBhIGNoYXJhY3RlciBmb3Igd2hpY2ggdGhlIG1ldGhvZCBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoaW50KQogKiByZXR1cm5zIHRydWUuICAKICovCmNsYXNzIElkZW50aWZpZXJDaGFycyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKCiAgICB2b2lkIHRlc3RBU0NJSUNoYXJzKCkgewogICAgICAgIC8vIElkZW50aWZpZXIgbWF5IG5vdCBzdGFydCB3aXRoIGEgZGlnaXQKICAgICAgICAvL2RlZiAxYSA9IDEgLy9AZmFpbDpwYXJzZQoKICAgICAgICAvLyBJZGVudGlmaWVyIG1heSBjb250YWluIGRpZ2l0cyBhZnRlciB0aGUgZmlyc3QgbGV0dGVyCiAgICAgICAgZGVmIGExID0gMiAKICAgICAgICBhc3NlcnQgYTEgPT0gMgoKICAgICAgICAvLyBJZGVudGlmaWVyIG1heSBjb250YWluIGFueSBvZiB0aGUgQVNDSUkgZGlnaXRzCiAgICAgICAgZGVmIGExMjM0NTY3ODkwID0gIkhlbGxvIgogICAgICAgIGFzc2VydCBhMTIzNDU2Nzg5MCA9PSAiSGVsbG8iCgogICAgICAgIC8vIElkZW50aWZpZXIgbWF5IGNvbnRhaW4gYW55IG9mIHRoZSBBU0NJSSB1cHBlciBvciBsb3dlciBjYXNlIGxldHRlcnMKICAgICAgICBkZWYgWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkEgPSAiYmFja3dvcmRzIgogICAgICAgIGFzc2VydCBaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQSA9PSAiYmFja3dvcmRzIgoKICAgICAgICAvLyBJZGVudGlmaWVyIG1heSBjb250YWluIGFueSBvZiB0aGUgQVNDSUkgdXBwZXIgb3IgbG93ZXIgY2FzZSBsZXR0ZXJzCiAgICAgICAgZGVmIHp5eHd2dXRzcnFwb25tbGtqaWdoZmVkY2JhID0gIkJBQ0tXT1JEUyIKICAgICAgICBhc3NlcnQgenl4d3Z1dHNycXBvbm1sa2ppZ2hmZWRjYmEgPT0gIkJBQ0tXT1JEUyIKICAgIH0KCiAgICB2b2lkIHRlc3ROb25Bc2NpaUNoYXJzKCkgewogICAgICAgIC8vIE5vbi1hc2NpaSBjaGFycyBlbmNvZGVkIGRpcmVjdGx5IGluIHRoZSBzdHJlYW0gb2YgdGV4dAogICAgICAgIGRlZiBhID0gMgogICAgICAgIGRlZiBhsiA9IGEgKiBhICAvLyBhLXNxdWFyZWQgaW4gbGF0aW4tMSBlbmNvZGluZwogICAgICAgIGFzc2VydCBhsiA9PSA0CiAgICAgICAgZGVmILUgPSAxMGUtNiAKICAgICAgICBhc3NlcnQgtSA9IDEwZS02CiAgICB9CgogICAgdm9pZCB0ZXN0RW5jb2RlZEFzY2lpQ2hhcnMoKSB7CiAgICAgICAgLy8gTm9uLWFzY2lpIGNoYXJzIGVuY29kZWQgZGlyZWN0bHkgaW4gdGhlIHN0cmVhbSBvZiB0ZXh0CiAgICAgICAgZGVmIGEgPSAyCiAgICAgICAgZGVmIGGyID0gYSAqIGEgIC8vIGEtc3F1YXJlZCBpbiBsYXRpbi0xIGVuY29kaW5nCiAgICAgICAgYXNzZXJ0IGGyID09IDQKICAgICAgICBkZWYgtSA9IDEwZS02IAogICAgICAgIGFzc2VydCC1ID0gMTBlLTYKICAgIH0KCiAgICAKICAgIHZvaWQgdGVzdENvbXBvc2VkQ2hhcigpIHsKICAgICAgICAvLyBFeGFtcGxlIHRha2VuIGZyb20gSkxTCiAgICAgICAgZGVmIFx1MDBjMSA9ICJMQVRJTiBDQVBJVEFMIExFVFRFUiBBIEFDVVRFIgogICAgICAgIC8vYXNzZXJ0IFx1MDA0YVwwMzAxID09ICJMQVRJTiBDQVBJVEFMIExFVFRFUiBBIEFDVVRFIiAvL0BmYWlsCiAgICB9CgogICAgdm9pZCB0ZXN0VmlzdWFsRXF1aXZhbGVudHMoKSB7CiAgICAgICAgLy8gRXhhbXBsZSB0YWtlbiBmcm9tIEpMUwogICAgICAgIGRlZiBBID0gIkEiCiAgICAgICAgLy9hc3NlcnQgYSA9PSBBIC8vQGZhaWwKICAgICAgICAvL2Fzc2VydCBcdTAzOTEgPT0gQSAvL0BmYWlsCiAgICAgICAgLy9hc3NlcnQgXHUwNDMwID09IEEgLy9AZmFpbAogICAgICAgIC8vYXNzZXJ0IFx1ZDgzNVx1ZGM4MiA9PSBBIC8vQGZhaWwKICAgIH0KfQoK