LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSAibG9nbWF0Y2guaCIKCiNpZmRlZiBIQVZFX1JFR0VYX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8cmVnZXguaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlICJ1dGlsX2Z1bmNzL2hlYWRlcl9nZW5lcmljLmgiCiNpbmNsdWRlICJ1dGlsX2Z1bmNzL2hlYWRlcl9zaW1wbGVfdGFibGUuaCIKCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGZpbGVuYW1lIHBhdHRlcm4KICogIGNvbnRhaW5zIHRoZSAlIGNoYXJhY3RlciBpbmRpY2F0aW5nIGEgdmFyaWFibGUKICogIGZpbGVuYW1lIChpLmUuIGl0IHVzZXMgZGF0ZS90aW1lIGZvcm1hdCBjb250cm9sCiAqICBjb2Rlcywgc2VlICdtYW4gZGF0ZScpIHRoZW4gZXhwYW5kcyB0aG9zZSBjb250cm9sCiAqICBjb2RlcyBiYXNlZCBvbiBjdXJyZW50IHRpbWUgYW5kIHNldHMgdGhlCiAqICBmaWxlbmFtZSBmaWVsZCBpbiB0aGUgc3RydWN0LgogKiAgUmV0dXJucyAxIGlmIHRoZSBmaWxlbmFtZSBjaGFuZ2VkLCAwIG90aGVyd2lzZQogKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCnN0YXRpYyBpbnQKbG9nbWF0Y2hfdXBkYXRlX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKiBwYXR0ZXJuLCBjaGFyICogY3VycmVudEZpbGVuYW1lKQp7CiAgICB0aW1lX3QgdDsKICAgIHN0cnVjdCB0bSAqdG1wOwogICAgY2hhciBuZXdGaWxlbmFtZVsyNTZdOwoKICAgIC8qCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiBpZiB0aGUgZmlsZW5hbWUgcGF0dGVybiBkb2Vzbid0IGhhdmUgdGhlICIlIiBjaGFyYWN0ZXIganVzdCByZXR1cm4sCiAgICAgKiBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqLwogICAgaWYgKHN0cmNocihwYXR0ZXJuLCAnJScpID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICB0ID0gdGltZShOVUxMKTsKICAgIHRtcCA9IGxvY2FsdGltZSgmdCk7CgogICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgcGVycm9yKCJsb2NhbHRpbWUiKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiByZXN1bHQgb2YgZXhwYW5zaW9uIG11c3QgZml0IGludG8gbmV3RmlsZW5hbWUsIG90aGVyd2lzZSByZXR1cm5pbmcgKi8KICAgIGlmIChzdHJmdGltZShuZXdGaWxlbmFtZSwgc2l6ZW9mKG5ld0ZpbGVuYW1lKSwgcGF0dGVybiwgdG1wKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogaWYgc2FtZSBhcyBjdXJyZW50IGZpbGVuYW1lLCBqdXN0IHJldHVybiAqLwogICAgaWYgKHN0cmNtcChjdXJyZW50RmlsZW5hbWUsIG5ld0ZpbGVuYW1lKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIC8qIG90aGVyd2lzZSB1cGRhdGUgY3VycmVudEZpbGVuYW1lIGFuZCByZXR1cm4gMSAqLwogICAgICAgIHN0cmNweShjdXJyZW50RmlsZW5hbWUsIG5ld0ZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfQoKc3RydWN0IGxvZ21hdGNoc3RhdCB7CiAgICBjaGFyICAgICAgICAgICAgZmlsZW5hbWVQYXR0ZXJuWzI1Nl07CiAgICBjaGFyICAgICAgICAgICAgZmlsZW5hbWVbMjU2XTsKICAgIGNoYXIgICAgICAgICAgICByZWdFeFsyNTZdOwogICAgY2hhciAgICAgICAgICAgIG5hbWVbMjU2XTsKICAgIEZJTEUgICAgICAgICAgICpsb2dmaWxlOwogICAgbG9uZyAgICAgICAgICAgIGN1cnJlbnRGaWxlUG9zaXRpb247CiAgICB1bnNpZ25lZCBsb25nICAgZ2xvYmFsTWF0Y2hDb3VudGVyOwogICAgdW5zaWduZWQgbG9uZyAgIGN1cnJlbnRNYXRjaENvdW50ZXI7CiAgICB1bnNpZ25lZCBsb25nICAgbWF0Y2hDb3VudGVyOwogICAgcmVnZXhfdCAgICAgICAgIHJlZ2V4QnVmZmVyOwogICAgaW50ICAgICAgICAgICAgIG15UmVnZXhFcnJvcjsKICAgIGludCAgICAgICAgICAgICB2aXJnaW47CiAgICBpbnQgICAgICAgICAgICAgdGhpc0luZGV4OwogICAgaW50ICAgICAgICAgICAgIGZyZXF1ZW5jeTsKfTsKCiNkZWZpbmUgTUFYTE9HTUFUQ0ggICAyNTAKCnN0YXRpYyBzdHJ1Y3QgbG9nbWF0Y2hzdGF0IGxvZ21hdGNoVGFibGVbTUFYTE9HTUFUQ0hdOwpzdGF0aWMgaW50ICAgICAgICAgICAgICAgICBsb2dtYXRjaENvdW50ID0gMDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIHVwZGF0ZUxvZ21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmFjayBieSBzbm1wZCBhbGFybXMgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAp1cGRhdGVMb2dtYXRjaChpbnQgaWluZGV4KQp7CgogICAgaW50ICAgICAgICAgICAgIG1hdGNoUmVzdWx0Q29kZTsKICAgIGNoYXIgICAgICAgICAgICBpbmJ1ZlsxMDI0XTsKICAgIGNoYXIgICAgICAgICAgICBwZXJmaWxlbmFtZVsxMDI0XTsKICAgIEZJTEUgICAgICAgICAgICpwZXJmaWxlOwogICAgdW5zaWduZWQgbG9uZyAgIHBvcywgY2NvdW50ZXIsIGNvdW50ZXI7CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwogICAgaW50ICAgICAgICAgICAgIHRvb2JpZzsKICAgIGludCAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gRkFMU0U7CiAgICBzdHJ1Y3Qgc3RhdCAgICAgc2I7CiAgICBjaGFyICAgICAgICAgICAgbGFzdEZpbGVuYW1lWzI1Nl07CgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqIHdlIGNhbiBuZXZlciBiZSBzdXJlIGlmIHRoaXMgaXMgdGhlICAKICAgICAqIGxhc3QgdGltZSB3ZSBhcmUgYmVpbmcgY2FsbGVkIGhlcmUsICAKICAgICAqIHNvIHdlIGFsd2F5cyB1cGRhdGUgYSBwZXJzaXN0ZW50ICAgICAKICAgICAqIGRhdGEgZmlsZSB3aXRoIG91ciBjdXJyZW50IGZpbGUgICAgICAKICAgICAqIHBvc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqLwoKICAgIHNucHJpbnRmKHBlcmZpbGVuYW1lLCBzaXplb2YocGVyZmlsZW5hbWUpLCAiJXMvc25tcGRfbG9nbWF0Y2hfJXMucG9zIiwKICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBsb2dtYXRjaFRhYmxlW2lpbmRleF0ubmFtZSk7CgogICAgaWYgKGxvZ21hdGNoVGFibGVbaWluZGV4XS52aXJnaW4pIHsKCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICogdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgYmVpbmcgIAogICAgICAgICAqIGNhbGxlZDsgbGV0J3MgdHJ5IHRvIGZpbmQgYW4gb2xkICAgICAKICAgICAgICAgKiBmaWxlIHBvc2l0aW9uIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQgCiAgICAgICAgICogZGF0YSBmaWxlIGFuZCByZXN0b3JlIGl0ICAgICAgICAgICAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKChwZXJmaWxlID0gZm9wZW4ocGVyZmlsZW5hbWUsICJyIikpKSB7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW50IGRhdGEgZmlsZSBleGlzdHMgc28gICAKICAgICAgICAgICAgICogbGV0J3MgcmVhZCBpdCBvdXQgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAqLwoKCiAgICAgICAgICAgIHBvcyA9IGNvdW50ZXIgPSBjY291bnRlciA9IDA7CgogICAgICAgICAgICBpZiAoZnNjYW5mKHBlcmZpbGUsICIlbHUgJWx1ICVsdSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgJnBvcywgJmNjb3VudGVyLCAmY291bnRlciwgbGFzdEZpbGVuYW1lKSkgewoKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICogdGhlIGRhdGEgY291bGQgYmUgcmVhZDsgbm93IGxldCdzICAgIAogICAgICAgICAgICAgICAgICogdHJ5IHRvIG9wZW4gdGhlICBsb2dmaWxlIHRvIGJlICAgICAgIAogICAgICAgICAgICAgICAgICogc2Nhbm5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgaWYgKGxvZ21hdGNoX3VwZGF0ZV9maWxlbmFtZShsb2dtYXRjaFRhYmxlW2lpbmRleF0uZmlsZW5hbWVQYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RmlsZW5hbWUpID09IDApIHsKCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlsZW5hbWUgaXMgc3RpbGwgdGhlIHNhbWUgYXMgCiAgICAgICAgICAgICAgICAgICAgICogdGhlIG9uZSBzdG9yZWQgaW4gdGhlIHBlcnNpc3RlbnQKICAgICAgICAgICAgICAgICAgICAgKiBkYXRhIGZpbGUuCiAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIGlmICgobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUgPQogICAgICAgICAgICAgICAgICAgICAgICBmb3Blbihsb2dtYXRjaFRhYmxlW2lpbmRleF0uZmlsZW5hbWUsICJyIikpKSB7CgoKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbG9nIGZpbGUgY291bGQgYmUgb3BlbmVkOyBub3cgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGxldCdzIHRyeSB0byBzZXQgdGhlIHBvaW50ZXIgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnNlZWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSwgcG9zLCBTRUVLX1NFVCkpIHsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBwb2ludGVyIGNvdWxkIGJlIHNldCAtIHRoaXMgaXMgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBtb3N0IHRoYXQgd2UgY2FuIGRvOiBpZiB0aGUgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBmaWxlICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemUgd2UgbXVzdCBhc3N1bWUgdGhhdCB0aGUgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0aWxsIHBvaW50cyB0byB3aGVyZSBpdCByZWFkIHRoZSAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbGUgbGFzdCB0aW1lOyBsZXQncyByZXN0b3JlIHRoZSAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID0gcG9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjb3VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5nbG9iYWxNYXRjaENvdW50ZXIgPSBjb3VudGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmY2xvc2UocGVyZmlsZSk7CiAgICAgICAgfQoKICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0udmlyZ2luID0gRkFMU0U7CiAgICB9CgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqIGNoZWNrIGlmIGEgbmV3IGlucHV0IGZpbGUgbmVlZHMgdG8gYmUgb3BlbmVkCiAgICAgKiBpZiB5ZXMsIHJlc2V0IGNvdW50ZXIgYW5kIHBvc2l0aW9uCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKi8KCiAgICBpZiAobG9nbWF0Y2hfdXBkYXRlX2ZpbGVuYW1lKGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZVBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZSkgPT0gMSkgewogICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID0gMDsgCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIgPSAwOwogICAgfQoKCiAgICAvKgogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICogbm93IHRoZSBwb2ludGVyIGFuZCB0aGUgY291bnRlciBhcmUgIAogICAgICogc2V0IGVpdGhlciB6ZXJvIG9yIHJlc2V0IHRvIG9sZCAgICAgIAogICAgICogdmFsdWU7IG5vdyBsZXQncyB0cnkgdG8gcmVhZCBzb21lICAgIAogICAgICogZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICovCgogICAgaWYgKHN0YXQobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lLCAmc2IpID09IDApIHsKCiAgICAgICAgaWYgKGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID4gc2Iuc3Rfc2l6ZSkgewogICAgICAgICAgICB0b29iaWcgPSBUUlVFOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRvb2JpZyA9IEZBTFNFOwogICAgICAgIH0KCiAgICAgICAgaWYgKChsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSA9CiAgICAgICAgICAgIGZvcGVuKGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZSwgInIiKSkpIHsKCiAgICAgICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgICAgICBmc2Vlayhsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSwKICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uLCBTRUVLX1NFVCk7CgogICAgICAgICAgICBpZiAocmVzdWx0IHx8IHRvb2JpZyB8fCAoZXJybm8gPT0gRUlOVkFMKQogICAgICAgICAgICAgICAgfHwgZmVvZihsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSkpIHsKCgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAqIHdoZW4gd2UgYXJlIGhlcmUgdGhhdCBtZWFucyB3ZSAgICAgICAKICAgICAgICAgICAgICAgICAqIGNvdWxkJ3Qgc2V0IHRoZSBmaWxlIHBvc2l0aW9uIG1heWJlICAKICAgICAgICAgICAgICAgICAqIHRoZSBmaWxlIHdhcyByb3RhdGVkOyBsZXQncyByZXNldCAgICAKICAgICAgICAgICAgICAgICAqIHRoZSBmaWxlcG9pbnRlciwgYnV0IG5vdCB0aGUgY291bnRlciAKICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAqLwoKCiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudEZpbGVQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudE1hdGNoQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICBmc2Vlayhsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSwgMCwgU0VFS19TRVQpOwogICAgICAgICAgICAgICAgYW55Q2hhbmdlcyA9IFRSVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlIChmZ2V0cwogICAgICAgICAgICAgICAgICAgKGluYnVmLCBzaXplb2YoaW5idWYpLCBsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSkpIHsKCiAgICAgICAgICAgICAgICBtYXRjaFJlc3VsdENvZGUgPQogICAgICAgICAgICAgICAgICAgIHJlZ2V4ZWMoJihsb2dtYXRjaFRhYmxlW2lpbmRleF0ucmVnZXhCdWZmZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYsIDAsIE5VTEwsIFJFR19OT1RFT0wpOwoKICAgICAgICAgICAgICAgIGlmIChtYXRjaFJlc3VsdENvZGUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5nbG9iYWxNYXRjaENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudE1hdGNoQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5tYXRjaENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24gPQogICAgICAgICAgICAgICAgZnRlbGwobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpOwogICAgICAgICAgICBmY2xvc2UobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpOwogICAgICAgIH0KICAgIH0KCgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqIGF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHNhZmUgdGhhdCAgICAKICAgICAqIG91ciBjdXJyZW50IGZpbGUgcG9zaXRpb24gaXMgICAgICAgICAKICAgICAqIHN0cmFpZ2h0ZW5lZCBvdXQgby5rLiAtIHdlIG5ldmVyICAgICAKICAgICAqIGtub3cgaWYgdGhpcyBpcyB0aGUgbGFzdCB0aW1lIHdlIGFyZSAKICAgICAqIGJlaW5nIGNhbGxlZCBzbyBzYXZlIHRoZSBwb3NpdGlvbiAgICAKICAgICAqIGluIGEgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqLwoKICAgIGlmIChhbnlDaGFuZ2VzICYmIChwZXJmaWxlID0gZm9wZW4ocGVyZmlsZW5hbWUsICJ3IikpKSB7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKiBvLmsuIGxldHMgd3JpdGUgb3V0IG91ciB2YXJpYWJsZSAgICAgCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqLwoKICAgICAgICBmcHJpbnRmKHBlcmZpbGUsICIlbHUgJWx1ICVsdSAlc1xuIiwKICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIsCiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uZ2xvYmFsTWF0Y2hDb3VudGVyLAogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lKTsKCiAgICAgICAgZmNsb3NlKHBlcmZpbGUpOwogICAgfQoKfQoKCnN0YXRpYyB2b2lkCnVwZGF0ZUxvZ21hdGNoX1NjaGVkdWxlZCh1bnNpZ25lZCBpbnQgcmVnaXN0cmF0aW9uTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvZ21hdGNoc3RhdCAqbG9nbWF0Y2h0YWJsZSkKewogICAgdXBkYXRlTG9nbWF0Y2gobG9nbWF0Y2h0YWJsZS0+dGhpc0luZGV4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogbG9nbWF0Y2hfcGFyc2VfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBwYXJzZSBvbmUgbGluZSBmcm9tIHNubXBkLmNvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCmxvZ21hdGNoX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY3B0cikKewoKICAgIGNoYXIgc3BhY2VfbmFtZTsKICAgIGNoYXIgc3BhY2VfcGF0aDsKCiAgICBpZiAobG9nbWF0Y2hDb3VudCA8IE1BWExPR01BVENIKSB7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3kgPSAzMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnRoaXNJbmRleCA9IGxvZ21hdGNoQ291bnQ7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAqIGJlIGNhcmVmdWwgdGhpcyBjb3VudGVyIG5lZWRzIHRvIGJlCiAgICAgICAgICogcmVzZXQgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKi8KCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5nbG9iYWxNYXRjaENvdW50ZXIgPSAwOwogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uY3VycmVudE1hdGNoQ291bnRlciA9IDA7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5tYXRjaENvdW50ZXIgPSAwOwogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0udmlyZ2luID0gVFJVRTsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmN1cnJlbnRGaWxlUG9zaXRpb24gPSAwOwoKCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKiBiZSBjYXJlZnVsOiB0aGUgZmxhZyAyNTUgbXVzdCBmaXQgdG8KICAgICAgICAgKiB0aGUgc2l6ZSBvZiByZWdFeCBhcyBkZWZpbmRlZCBpbgogICAgICAgICAqIGxvZ21hdGNoLmgKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKi8KCiAgICAgICAgc3NjYW5mKGNwdHIsICIlMjU1cyVjJTI1NXMlYyAlZCAlMjU1Y1xuIiwKICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5uYW1lLAoJICAgICAgICZzcGFjZV9uYW1lLAogICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmZpbGVuYW1lUGF0dGVybiwKCSAgICAgICAmc3BhY2VfcGF0aCwKICAgICAgICAgICAgICAgJihsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmZyZXF1ZW5jeSksCiAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnRXgpOwoKICAgICAgICAvKiBmaWxsIGluIGZpbGVuYW1lIHdpdGggaW5pdGlhbCBkYXRhICovCiAgICAgICAgc3RyY3B5KGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWUsCiAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWVQYXR0ZXJuKTsKICAgICAgICBsb2dtYXRjaF91cGRhdGVfZmlsZW5hbWUobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5maWxlbmFtZVBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWUpOwoKCS8qCgkgKiBMb2cgYW4gZXJyb3IgdGhlbiByZXR1cm4gaWYgYW55IG9mIHRoZSBzdHJpbmdzIHNjYW5uZWQgaW4gd2VyZQoJICogbGFyZ2VyIHRoZW4gdGhleSBzaG91bGQgaGF2ZSBiZWVuLgoJICovCglpZiAoc3BhY2VfbmFtZSAhPSAnICcpIHsKCQlzbm1wX2xvZyhMT0dfRVJSLCAibG9nbWF0Y2hfcGFyc2VfY29uZmlnOiB0aGUgbmFtZSBzY2FubmVkICIgXAoJCSAiaW4gZnJvbSBsaW5lICVzIGlzIHRvbyBsYXJnZS4gbG9nbWF0Y2hDb3VudCA9ICVkXG4iLAoJCSBjcHRyLCBsb2dtYXRjaENvdW50KTsKCQlyZXR1cm47Cgl9IGVsc2UgaWYgKHNwYWNlX3BhdGggIT0gJyAnKSB7CgkJc25tcF9sb2coTE9HX0VSUiwgImxvZ21hdGNoX3BhcnNlX2NvbmZpZzogdGhlIGZpbGUgbmFtZSAiIFwKCQkgInNjYW5uZWQgaW4gZnJvbSBsaW5lICVzIGlzIHRvbyBsYXJnZS4gbG9nbWF0Y2hDb3VudCA9ICVkXG4iLAoJCSAgICBjcHRyLCBsb2dtYXRjaENvdW50KTsKCQlyZXR1cm47Cgl9CgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICoganVzdCB0byBiZSBzYWZlICJOVUxMIiB0aGUgZW5kIG9mCiAgICAgICAgICogdGhlIGFyYXJ5IHJlZ0V4IGFzIHNzY2FuZiB3b24ndCBkbwogICAgICAgICAqIGl0IHdpdGggdGhlICVjIG1vZGlmaWVyCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICovCgogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnRXhbMjU1XSA9ICdcMCc7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAqIG5vdyBjb21waWxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKi8KCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5teVJlZ2V4RXJyb3IgPQogICAgICAgICAgICByZWdjb21wKCYobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5yZWdleEJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5yZWdFeCwKICAgICAgICAgICAgICAgICAgICBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOwoKICAgICAgICBpZiAobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3kgPiAwKSB7CiAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTTk1QQWxhcm1DYWxsYmFjayAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxvZ21hdGNoX1NjaGVkdWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0pCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbG9nbWF0Y2hDb3VudCsrOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBsb2dtYXRjaF9mcmVlX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIG1pYiBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQKbG9nbWF0Y2hfZnJlZV9jb25maWcodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogdGhlIG9ubHkgbWVtb3J5IHdlIGhhdmUgYWxsb2NhdGVkCiAgICAgKiBpcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSByZWdjb21wCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCBsb2dtYXRjaENvdW50OyBpKyspIHsKCiAgICAgICAgcmVnZnJlZSgmKGxvZ21hdGNoVGFibGVbaV0ucmVnZXhCdWZmZXIpKTsKICAgIH0KICAgIGxvZ21hdGNoQ291bnQgPSAwOwp9CgoKI2RlZmluZSBMT0dNQVRDSF9JTkZPICAgICAgIDAKI2RlZmluZSBMT0dNQVRDSF9JTkRFWCAgICAgIDEKI2RlZmluZSBMT0dNQVRDSF9OQU1FICAgICAgIDIKI2RlZmluZSBMT0dNQVRDSF9GSUxFTkFNRSAgIDMKI2RlZmluZSBMT0dNQVRDSF9SRUdFWCAgICAgIDQKI2RlZmluZSBMT0dNQVRDSF9HTE9CQUxDVFIgIDUKI2RlZmluZSBMT0dNQVRDSF9HTE9CQUxDTlQgIDYKI2RlZmluZSBMT0dNQVRDSF9DVVJSRU5UQ1RSIDcKI2RlZmluZSBMT0dNQVRDSF9DVVJSRU5UQ05UIDgKI2RlZmluZSBMT0dNQVRDSF9DT1VOVEVSICAgIDkKI2RlZmluZSBMT0dNQVRDSF9DT1VOVCAgICAgIDEwCiNkZWZpbmUgTE9HTUFUQ0hfRlJFUSAgICAgICAxMQojZGVmaW5lIExPR01BVENIX0VSUk9SICAgICAgMTAwCiNkZWZpbmUgTE9HTUFUQ0hfTVNHICAgICAgICAxMDEKCi8qCiAqIE9JRCBmdW5jdGlvbnMgCiAqLwoKc3RhdGljIHVfY2hhciAqCnZhcl9sb2dtYXRjaF90YWJsZShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwKICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RhdGljIGNoYXIgICAgIG1lc3NhZ2VbMTAyNF07CiAgICBpbnQgICAgICAgICAgICAgaWluZGV4OwogICAgc3RydWN0IGxvZ21hdGNoc3RhdCAqbG9nbWF0Y2g7CgogICAgaWYgKHZwLT5tYWdpYyA9PSBMT0dNQVRDSF9JTkZPKSB7CiAgICAgICAgaWYgKGhlYWRlcl9nZW5lcmljKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpCiAgICAgICAgICAgID09IE1BVENIX0ZBSUxFRCkKICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGhlYWRlcl9zaW1wbGVfdGFibGUKICAgICAgICAgICAgKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QsCiAgICAgICAgICAgICBsb2dtYXRjaENvdW50KSkKICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIH0KCgogICAgaWluZGV4ID0gbmFtZVsqbGVuZ3RoIC0gMV0gLSAxOwogICAgbG9nbWF0Y2ggPSAmbG9nbWF0Y2hUYWJsZVtpaW5kZXhdOwoKICAgIGlmIChsb2dtYXRjaC0+bXlSZWdleEVycm9yID09IDApCiAgICAgICAgdXBkYXRlTG9nbWF0Y2goaWluZGV4KTsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBMT0dNQVRDSF9JTkZPOgogICAgICAgIGxvbmdfcmV0ID0gTUFYTE9HTUFUQ0g7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX0lOREVYOgogICAgICAgIGxvbmdfcmV0ID0gaWluZGV4ICsgMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfTkFNRToKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihsb2dtYXRjaC0+bmFtZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbG9nbWF0Y2gtPm5hbWU7CgogICAgY2FzZSBMT0dNQVRDSF9GSUxFTkFNRToKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihsb2dtYXRjaC0+ZmlsZW5hbWUpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGxvZ21hdGNoLT5maWxlbmFtZTsKCiAgICBjYXNlIExPR01BVENIX1JFR0VYOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGxvZ21hdGNoLT5yZWdFeCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbG9nbWF0Y2gtPnJlZ0V4OwoKICAgIGNhc2UgTE9HTUFUQ0hfR0xPQkFMQ1RSOgogICAgY2FzZSBMT0dNQVRDSF9HTE9CQUxDTlQ6CiAgICAgICAgbG9uZ19yZXQgPSAobG9nbWF0Y2gtPmdsb2JhbE1hdGNoQ291bnRlcik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX0NVUlJFTlRDVFI6CiAgICBjYXNlIExPR01BVENIX0NVUlJFTlRDTlQ6CiAgICAgICAgbG9uZ19yZXQgPSAobG9nbWF0Y2gtPmN1cnJlbnRNYXRjaENvdW50ZXIpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9DT1VOVEVSOgogICAgY2FzZSBMT0dNQVRDSF9DT1VOVDoKICAgICAgICBsb25nX3JldCA9IChsb2dtYXRjaC0+bWF0Y2hDb3VudGVyKTsKICAgICAgICBsb2dtYXRjaC0+bWF0Y2hDb3VudGVyID0gMDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfRlJFUToKICAgICAgICBsb25nX3JldCA9IGxvZ21hdGNoLT5mcmVxdWVuY3k7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX0VSUk9SOgogICAgICAgIGlmIChsb2dtYXRjaC0+ZnJlcXVlbmN5ID49IDAgJiYgbG9nbWF0Y2gtPm15UmVnZXhFcnJvciA9PSAwKQogICAgICAgICAgICBsb25nX3JldCA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldCA9IDE7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9NU0c6CgogICAgICAgIHJlZ2Vycm9yKGxvZ21hdGNoLT5teVJlZ2V4RXJyb3IsICYobG9nbWF0Y2gtPnJlZ2V4QnVmZmVyKSwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICBzaXplb2YobWVzc2FnZSkpOwoKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihtZXNzYWdlKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBtZXNzYWdlOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9sb2dtYXRjaF90YWJsZVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KCiAgICByZXR1cm4gTlVMTDsKfQoKdm9pZAppbml0X2xvZ21hdGNoKHZvaWQpCnsKICAgIHN0cnVjdCB2YXJpYWJsZTIgbG9nbWF0Y2hfaW5mb1tdID0gewogICAgICAgIHtMT0dNQVRDSF9JTkZPLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMH0KICAgIH07CgogICAgc3RydWN0IHZhcmlhYmxlMiBsb2dtYXRjaF90YWJsZVtdID0gewogICAgICAgIHtMT0dNQVRDSF9JTkRFWCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHsxfX0sCiAgICAgICAge0xPR01BVENIX05BTUUsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHsyfX0sCiAgICAgICAge0xPR01BVENIX0ZJTEVOQU1FLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7M319LAogICAgICAgIHtMT0dNQVRDSF9SRUdFWCwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezR9fSwKICAgICAgICB7TE9HTUFUQ0hfR0xPQkFMQ1RSLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezV9fSwKICAgICAgICB7TE9HTUFUQ0hfR0xPQkFMQ05ULCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezZ9fSwKICAgICAgICB7TE9HTUFUQ0hfQ1VSUkVOVENUUiwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs3fX0sCiAgICAgICAge0xPR01BVENIX0NVUlJFTlRDTlQsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7OH19LAogICAgICAgIHtMT0dNQVRDSF9DT1VOVEVSLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezl9fSwKICAgICAgICB7TE9HTUFUQ0hfQ09VTlQsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTB9fSwKICAgICAgICB7TE9HTUFUQ0hfRlJFUSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHsxMX19LAogICAgICAgIHtMT0dNQVRDSF9FUlJPUiwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHsxMDB9fSwKICAgICAgICB7TE9HTUFUQ0hfTVNHLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTAxfX0KICAgIH07CgogICAgLyoKICAgICAqIERlZmluZSB0aGUgT0lEIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbWliIHRyZWUgdGhhdCB3ZSdyZQogICAgICogcmVnaXN0ZXJpbmcgdW5kZXJuZWF0aAogICAgICovCiAgICBvaWQgICAgICAgICAgICAgbG9nbWF0Y2hfaW5mb19vaWRbXSA9IHsgTkVUU05NUF9VQ0RBVklTX01JQiwgMTYsIDEgfTsKICAgIG9pZCAgICAgICAgICAgICBsb2dtYXRjaF92YXJpYWJsZXNfb2lkW10gPSB7IE5FVFNOTVBfVUNEQVZJU19NSUIsIDE2LCAyLCAxIH07CgogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBhZ2VudCB0byBoYW5kbGUgb3VyIG1pYiB0cmVlCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigidWNkLXNubXAvbG9nbWF0Y2giLCBsb2dtYXRjaF9pbmZvLCB2YXJpYWJsZTIsCiAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfaW5mb19vaWQpOwogICAgUkVHSVNURVJfTUlCKCJ1Y2Qtc25tcC9sb2dtYXRjaCIsIGxvZ21hdGNoX3RhYmxlLCB2YXJpYWJsZTIsCiAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfdmFyaWFibGVzX29pZCk7CgogICAgc25tcGRfcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoImxvZ21hdGNoIiwgbG9nbWF0Y2hfcGFyc2VfY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfZnJlZV9jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nbWF0Y2ggbmFtZSBwYXRoIGN5Y2xldGltZSByZWdleCIpOwoKfQoKI2VuZGlmIC8qIEhBVkVfUkVHRVhfSCAqLwo=