LyoqCiogQ29weXJpZ2h0IChDKSAyMDEzIGthbmdsaXFpYW5nLCBrYW5nbGlxQDE2My5jb20KKgoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKgoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKgoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KI2luY2x1ZGUgIlZhbGlkYXRvcnMuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJNUUNsaWVudEV4Y2VwdGlvbi5oIgojaW5jbHVkZSAiVXRpbEFsbC5oIgojaW5jbHVkZSAiTWl4QWxsLmgiCiNpbmNsdWRlICJNZXNzYWdlLmgiCiNpbmNsdWRlICJNUVByb3Rvcy5oIgojaW5jbHVkZSAiRGVmYXVsdE1RUHJvZHVjZXIuaCIKCm5hbWVzcGFjZSBybXEKewoKY29uc3Qgc3RkOjpzdHJpbmcgVmFsaWRhdG9yczo6dmFsaWRQYXR0ZXJuU3RyID0gIl5bYS16QS1aMC05Xy1dKyQiOwpjb25zdCBzaXplX3QgVmFsaWRhdG9yczo6Q0hBUkFDVEVSX01BWF9MRU5HVEggPSAyNTU7Cgpib29sIFZhbGlkYXRvcnM6OnJlZ3VsYXJFeHByZXNzaW9uTWF0Y2hlcihjb25zdCBzdGQ6OnN0cmluZyYgb3JpZ2luLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0dGVyblN0cikKewogICAgaWYgKFV0aWxBbGw6OmlzQmxhbmsob3JpZ2luKSkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKFV0aWxBbGw6OmlzQmxhbmsocGF0dGVyblN0cikpCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy9QYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVyblN0cik7CiAgICAvL01hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihvcmlnaW4pOwoKICAgIC8vcmV0dXJuIG1hdGNoZXIubWF0Y2hlcygpOwogICAgcmV0dXJuIHRydWU7Cn0KCnN0ZDo6c3RyaW5nIFZhbGlkYXRvcnM6OmdldEdyb3VwV2l0aFJlZ3VsYXJFeHByZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcmlnaW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXR0ZXJuU3RyKQp7CiAgICAvKlBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuU3RyKTsKICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihvcmlnaW4pOwogICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7CiAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgwKTsKICAgIH0qLwogICAgcmV0dXJuICIiOwp9Cgp2b2lkIFZhbGlkYXRvcnM6OmNoZWNrVG9waWMoY29uc3Qgc3RkOjpzdHJpbmcmIHRvcGljKQp7CiAgICBpZiAoVXRpbEFsbDo6aXNCbGFuayh0b3BpYykpCiAgICB7CiAgICAgICAgVEhST1dfTVFFWENFUFRJT04oTVFDbGllbnRFeGNlcHRpb24sICJ0aGUgc3BlY2lmaWVkIHRvcGljIGlzIGJsYW5rIiwgLTEpOwogICAgfQoKICAgIGlmICh0b3BpYy5sZW5ndGgoKSA+IENIQVJBQ1RFUl9NQVhfTEVOR1RIKQogICAgewogICAgICAgIFRIUk9XX01RRVhDRVBUSU9OKE1RQ2xpZW50RXhjZXB0aW9uLCAidGhlIHNwZWNpZmllZCB0b3BpYyBpcyBsb25nZXIgdGhhbiB0b3BpYyBtYXggbGVuZ3RoIDI1NS4iLCAtMSk7CiAgICB9CgogICAgLy8gVG9waWPD+9fWyse38dPrsaPB9NfWts6z5c27CiAgICBpZiAodG9waWMgPT0gTWl4QWxsOjpERUZBVUxUX1RPUElDKQogICAgewogICAgICAgIFRIUk9XX01RRVhDRVBUSU9OKE1RQ2xpZW50RXhjZXB0aW9uLCAidGhlIHRvcGljWyIgKyB0b3BpYyArICJdIGlzIGNvbmZsaWN0IHdpdGggZGVmYXVsdCB0b3BpYy4iLCAtMSk7CiAgICB9CgogICAgaWYgKCFyZWd1bGFyRXhwcmVzc2lvbk1hdGNoZXIodG9waWMsIHZhbGlkUGF0dGVyblN0cikpCiAgICB7CiAgICAgICAgc3RkOjpzdHJpbmcgc3RyOwogICAgICAgIHN0ciA9ICJ0aGUgc3BlY2lmaWVkIHRvcGljWyIgKyB0b3BpYyArICJdIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycywgYWxsb3dpbmcgb25seSIgKyB2YWxpZFBhdHRlcm5TdHI7CgogICAgICAgIFRIUk9XX01RRVhDRVBUSU9OKE1RQ2xpZW50RXhjZXB0aW9uLCBzdHIuY19zdHIoKSwgLTEpOwogICAgfQp9Cgp2b2lkIFZhbGlkYXRvcnM6OmNoZWNrR3JvdXAoY29uc3Qgc3RkOjpzdHJpbmcmIGdyb3VwKQp7CiAgICBpZiAoVXRpbEFsbDo6aXNCbGFuayhncm91cCkpCiAgICB7CiAgICAgICAgVEhST1dfTVFFWENFUFRJT04oTVFDbGllbnRFeGNlcHRpb24sICJ0aGUgc3BlY2lmaWVkIGdyb3VwIGlzIGJsYW5rIiwgLTEpOwogICAgfQoKICAgIGlmICghcmVndWxhckV4cHJlc3Npb25NYXRjaGVyKGdyb3VwLCB2YWxpZFBhdHRlcm5TdHIpKQogICAgewogICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKICAgICAgICBzdHIgPSAidGhlIHNwZWNpZmllZCBncm91cFsiICsgZ3JvdXAgKyAiXSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMsIGFsbG93aW5nIG9ubHkiICsgdmFsaWRQYXR0ZXJuU3RyOwoKICAgICAgICBUSFJPV19NUUVYQ0VQVElPTihNUUNsaWVudEV4Y2VwdGlvbiwgc3RyLmNfc3RyKCksIC0xKTsKICAgIH0KICAgIGlmIChncm91cC5sZW5ndGgoKSA+IENIQVJBQ1RFUl9NQVhfTEVOR1RIKQogICAgewogICAgICAgIFRIUk9XX01RRVhDRVBUSU9OKE1RQ2xpZW50RXhjZXB0aW9uLCAidGhlIHNwZWNpZmllZCBncm91cCBpcyBsb25nZXIgdGhhbiBncm91cCBtYXggbGVuZ3RoIDI1NS4iLCAtMSk7CiAgICB9Cn0KCnZvaWQgVmFsaWRhdG9yczo6Y2hlY2tNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1zZywgRGVmYXVsdE1RUHJvZHVjZXIqIHBEZWZhdWx0TVFQcm9kdWNlcikKewogICAgY2hlY2tUb3BpYyhtc2cuZ2V0VG9waWMoKSk7CgogICAgLy8vLyBib2R5CiAgICBpZiAobXNnLmdldEJvZHkoKSA9PSBOVUxMKQogICAgewogICAgICAgIFRIUk9XX01RRVhDRVBUSU9OKE1RQ2xpZW50RXhjZXB0aW9uLCAidGhlIG1lc3NhZ2UgYm9keSBpcyBudWxsIiwgTUVTU0FHRV9JTExFR0FMX1ZBTFVFKTsKICAgIH0KCiAgICBpZiAobXNnLmdldEJvZHlMZW4oKSA9PSAwKQogICAgewogICAgICAgIFRIUk9XX01RRVhDRVBUSU9OKE1RQ2xpZW50RXhjZXB0aW9uLCAidGhlIG1lc3NhZ2UgYm9keSBsZW5ndGggaXMgemVybyIsIE1FU1NBR0VfSUxMRUdBTF9WQUxVRSk7CiAgICB9CgogICAgaWYgKG1zZy5nZXRCb2R5TGVuKCkgPiBwRGVmYXVsdE1RUHJvZHVjZXItPmdldE1heE1lc3NhZ2VTaXplKCkpCiAgICB7CiAgICAgICAgY2hhciBpbmZvWzI1Nl07CiAgICAgICAgc25wcmludGYoaW5mbywgc2l6ZW9mKGluZm8pLCAidGhlIG1lc3NhZ2UgYm9keSBzaXplIG92ZXIgbWF4IHZhbHVlLCBNQVg6ICVkIiwgcERlZmF1bHRNUVByb2R1Y2VyLT5nZXRNYXhNZXNzYWdlU2l6ZSgpKTsKICAgICAgICBUSFJPV19NUUVYQ0VQVElPTihNUUNsaWVudEV4Y2VwdGlvbiwgaW5mbywgTUVTU0FHRV9JTExFR0FMX1ZBTFVFKTsKICAgIH0KfQoKfQo=