Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgX19fXyAgICAgICAgICAgICAgICAgICAgICAgIF8gICAgICBfCi8vICAgICAvIF9fX3xfX19fIF8gICBfIF9fX18gICBfX19ffCB8X18gIHwgfAovLyAgICB8IHwgICAvIF9fX3wgfCB8IHwgIF8gIFwvIF9fX3wgIF8gIFx8IHwKLy8gICAgfCB8X19ffCB8ICB8IHxffCB8IHwgfCB8IHxfX198IHwgfCB8fF98Ci8vICAgICBcX19fX3xffCAgXF9fX19ffF98IHxffFxfX19ffF98IHxffChfKSBNZWRpYSBiZW5jaG1hcmtzCi8vICAgICAgICAgICAgCi8vCSCpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uLCBsaWNlbnNlZCB1bmRlciBBcGFjaGUgMi4wIAovLwovLyAgZmlsZSA6IENvdmFyaWFuY2VNYXRyaXguY3BwCi8vICBhdXRob3IgOiBKZWFuLVl2ZXMgQm91Z3VldCAtIGplYW4teXZlcy5ib3VndWV0QGludGVsLmNvbQovLyAgZGVzY3JpcHRpb24gOiBDb21wdXRlcyB0aGUgc2V0IG9mIHN0YW5kYXJkIGRldmlhdGlvbiBtYXRyaWNlcyBmb3IgYWxsIGFubmVhbGluZyBsYXllcnMKLy8gIG1vZGlmaWVkIDogCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZiBkZWZpbmVkKEhBVkVfQ09ORklHX0gpCiMgaW5jbHVkZSAiY29uZmlnLmgiCiNlbmRpZgoKI2luY2x1ZGUgIkNvdmFyaWFuY2VNYXRyaXguaCIKCiNpbmNsdWRlIDxtYXRoLmg+CgovL0NvbXB1dGVzIHRoZSBzZXQgb2Ygc3RhbmRhcmQgZGV2aWF0aW9uIG1hdHJpY2VzIGZvciBhIGdpdmVuIG51bWJlciBvZiBhbm5lYWxpbmcgbGF5ZXJzIGFuZCBhIHRyYWNraW5nIG1vZGVsCnZvaWQgR2VuZXJhdGVTdERldk1hdHJpY2VzKGludCBsYXllcnMsUG9zZVBhcmFtcyAmcGFyYW1zLCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxmbG9hdD4gPiAmc3RkRGV2cykKewoJc3RkRGV2cy5yZXNpemUobGF5ZXJzKTsKCglpbnQgTl9wb3NlX2FuZ2xlcyA9IChpbnQpIHBhcmFtcy5zdGRWZWMoKS5zaXplKCk7CgoJLy8gU2V0IHRoZSBmaW5lIGxldmVsIHN0YW5kYXJkIGRldmlhdGlvbiBtYXRyaXg6CglzdGREZXZzWzBdLnJlc2l6ZShOX3Bvc2VfYW5nbGVzKTsKCWZvcihpbnQgaT0wO2k8Tl9wb3NlX2FuZ2xlcztpKyspCgkJc3RkRGV2c1swXVtpXSA9IHBhcmFtcy5Qb3NlU3RkKGkpOwoKCWlmKGxheWVyczwyKSByZXR1cm47IC8vIFNpbmdsZSBsYXllciBzY2VuYXJpbyAoc3BlY2lhbCBjYXNlKQoKCWZsb2F0IGFscGhhX3NxcnQgPSAoZmxvYXQpIHNxcnQoKGRvdWJsZSkgQUxQSEFfTSk7CgoJLy9TZXQgdGhlIGxhc3QgbGF5ZXI6CglzdGREZXZzW2xheWVycy0xXS5yZXNpemUoTl9wb3NlX2FuZ2xlcyk7Cglmb3IoaW50IGk9MDtpPE5fcG9zZV9hbmdsZXM7aSsrKQoJCXN0ZERldnNbbGF5ZXJzLTFdW2ldID0gYWxwaGFfc3FydCAqIHN0ZERldnNbMF1baV07CgoJaWYobGF5ZXJzPDMpIHJldHVybjsgLy8gVHdvIGxheWVycyBzY2VuYXJpbwoKCS8vIFNldCBhbGwgdGhlIG90aGVyIG1hdHJpY2VzOgoJZm9yKGludCBqPWxheWVycy0yO2o+PTE7ai0tKQoJewlzdGREZXZzW2pdLnJlc2l6ZShOX3Bvc2VfYW5nbGVzKTsKCQlmb3IoaW50IGk9MDtpPE5fcG9zZV9hbmdsZXM7aSsrKQoJCQlzdGREZXZzW2pdW2ldID0gYWxwaGFfc3FydCAqIHN0ZERldnNbaisxXVtpXTsKCX0KfQoKLy9Db21wdXRlcyB0aGUgc2V0IG9mIHN0YW5kYXJkIGRldmlhdGlvbiBtYXRyaWNlcyBmb3IgYSBnaXZlbiBudW1iZXIgb2YgYW5uZWFsaW5nIGxheWVycyAodXNpbmcgcG9zZSBwYXJhbWV0ZXJzIGxvYWRlZCBmcm9tIGEgZmlsZSkKdm9pZCBHZW5lcmF0ZVN0RGV2TWF0cmljZXMoaW50IGxheWVycywgY29uc3QgY2hhciogZm5hbWUsIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGZsb2F0PiA+ICZzdGREZXZzKQp7CgkvLyBHZXQgdGhlIHBvc2UgcGFyYW1ldGVycyBmb3IgdGhlIHN0YW5kYXJkIGRldmlhdGlvbnMKCVBvc2VQYXJhbXMgcGFyYW1zOwoJcGFyYW1zLkluaXRpYWxpemUoZm5hbWUpOwoKCUdlbmVyYXRlU3REZXZNYXRyaWNlcyhsYXllcnMscGFyYW1zLHN0ZERldnMpOwp9Cg==