LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAqCiAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwogKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgogKgogKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogKgogKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAqIHF1ZXN0aW9ucy4KICovCgojaW5jbHVkZSAiam5pLmgiCiNpbmNsdWRlICJqbmlfdXRpbC5oIgojaW5jbHVkZSAiamxvbmcuaCIKI2luY2x1ZGUgInN1bmZvbnRpZHMuaCIKI2luY2x1ZGUgInN1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlci5oIgoKI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlICJmdDJidWlsZC5oIgojaW5jbHVkZSBGVF9GUkVFVFlQRV9ICiNpbmNsdWRlIEZUX0dMWVBIX0gKI2luY2x1ZGUgRlRfQkJPWF9ICiNpbmNsdWRlIEZUX1NJWkVTX0gKI2luY2x1ZGUgRlRfT1VUTElORV9ICiNpbmNsdWRlIEZUX1NZTlRIRVNJU19ICgojaW5jbHVkZSAiZm9udHNjYWxlci5oIgoKI2RlZmluZSAgZnRGaXhlZDEgIChGVF9GaXhlZCkgKDEgPDwgMTYpCiNkZWZpbmUgIEZsb2F0VG9GVEZpeGVkKGYpIChGVF9GaXhlZCkoKGYpICogKGZsb2F0KShmdEZpeGVkMSkpCiNkZWZpbmUgIEZURml4ZWRUb0Zsb2F0KHgpICgoeCkgLyAoZmxvYXQpKGZ0Rml4ZWQxKSkKI2RlZmluZSAgRlQyNkRvdDZUb0Zsb2F0KHgpICAoKHgpIC8gKChmbG9hdCkgKDE8PDYpKSkKI2RlZmluZSAgUk9VTkQoeCkgKChpbnQpICh4KzAuNSkpCgp0eXBlZGVmIHN0cnVjdCB7CiAgICAvKiBJbXBvcnRhbnQgbm90ZToKICAgICAgICAgSk5JIGZvcmJpZHMgc2hhcmluZyBzYW1lIGVudiBiZXR3ZWVuIGRpZmZlcmVudCB0aHJlYWRzLgogICAgICAgICBXZSBhcmUgc2FmZSwgYmVjYXVzZSBwb2ludGVyIGlzIG92ZXJ3cml0dGVuIGV2ZXJ5IHRpbWUgd2UgZ2V0IGludG8KICAgICAgICAgSk5JIGNhbGwgKHNlZSBzZXR1cEZUQ29udGV4dCkuCgogICAgICAgICBQb2ludGVyIGlzIHVzZWQgYnkgZm9udCBkYXRhIHJlYWRpbmcgY2FsbGJhY2tzCiAgICAgICAgIHN1Y2ggYXMgUmVhZFRURm9udEZpbGVGdW5jLgoKICAgICAgICAgTkI6IFdlIG1heSBjb25zaWRlciBzd2l0Y2hpbmcgdG8gSk5JX0dldEVudi4gKi8KICAgIEpOSUVudiogZW52OwogICAgRlRfTGlicmFyeSBsaWJyYXJ5OwogICAgRlRfRmFjZSBmYWNlOwogICAgam9iamVjdCBmb250MkQ7CiAgICBqb2JqZWN0IGRpcmVjdEJ1ZmZlcjsKCiAgICB1bnNpZ25lZCBjaGFyKiBmb250RGF0YTsKICAgIHVuc2lnbmVkIGZvbnREYXRhT2Zmc2V0OwogICAgdW5zaWduZWQgZm9udERhdGFMZW5ndGg7CiAgICB1bnNpZ25lZCBmaWxlU2l6ZTsKICAgIFRUTGF5b3V0VGFibGVDYWNoZSogbGF5b3V0VGFibGVzOwp9IEZUU2NhbGVySW5mbzsKCnR5cGVkZWYgc3RydWN0IEZUU2NhbGVyQ29udGV4dCB7CiAgICBGVF9NYXRyaXggIHRyYW5zZm9ybTsgICAgIC8qIGdseXBoIHRyYW5zZm9ybSwgaW5jbHVkaW5nIGRldmljZSB0cmFuc2Zvcm0gKi8KICAgIGpib29sZWFuICAgdXNlU2JpdHM7ICAgICAgLyogc2JpdCB1c2FnZSBlbmFibGVkPyAqLwogICAgamludCAgICAgICBhYVR5cGU7ICAgICAgICAvKiBhbnRpYWxpYXNpbmcgbW9kZSAob2ZmL29uL2dyZXkvbGNkKSAqLwogICAgamludCAgICAgICBmbVR5cGU7ICAgICAgICAvKiBmcmFjdGlvbmFsIG1ldHJpY3MgLSBvbi9vZmYgKi8KICAgIGpib29sZWFuICAgZG9Cb2xkOyAgICAgICAgLyogcGVyZm9ybSBhbGdvcml0aG1pYyBib2xkaW5nPyAqLwogICAgamJvb2xlYW4gICBkb0l0YWxpemU7ICAgICAvKiBwZXJmb3JtIGFsZ29yaXRobWljIGl0YWxpY2l6aW5nPyAqLwogICAgaW50ICAgICAgICByZW5kZXJGbGFnczsgICAvKiBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIHBhcnRpY3VsYXIgZW5naW5lICovCiAgICBpbnQgICAgICAgIHBhdGhUeXBlOwogICAgaW50ICAgICAgICBwdHN6OyAgICAgICAgICAvKiBzaXplIGluIHBvaW50cyAqLwp9IEZUU2NhbGVyQ29udGV4dDsKCiNpZmRlZiBERUJVRwovKiBUaGVzZSBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgZnJlZXR5cGUgc291cmNlcyBpZiBERUJVRyBtYWNybyBpcyBkZWZpbmVkLgogICBUbyBzaW1wbGlmeSB3b3JrIHdpdGggZGVidWdpbmcgdmVyc2lvbiBvZiBmcmVldHlwZSB3ZSBkZWZpbmUKICAgdGhlbSBoZXJlLiAqLwppbnQgel92ZXJib3NlOwp2b2lkIHpfZXJyb3IoY2hhciAqcykge30KI2VuZGlmCgovKioqKioqKioqKioqKioqKiBFcnJvciBoYW5kbGluZyB1dGlsaXRpZXMgKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgam1ldGhvZElEIGludmFsaWRhdGVTY2FsZXJNSUQ7CgpKTklFWFBPUlQgdm9pZCBKTklDQUxMCkphdmFfc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyX2luaXRJRHMoCiAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3Qgc2NhbGVyLCBqY2xhc3MgRkZTQ2xhc3MpIHsKICAgIGludmFsaWRhdGVTY2FsZXJNSUQgPQogICAgICAgICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBGRlNDbGFzcywgImludmFsaWRhdGVTY2FsZXIiLCAiKClWIik7Cn0KCnN0YXRpYyB2b2lkIGZyZWVOYXRpdmVSZXNvdXJjZXMoSk5JRW52ICplbnYsIEZUU2NhbGVySW5mbyogc2NhbGVySW5mbykgewogICAgdm9pZCAqc3RyZWFtOwoKICAgIGlmIChzY2FsZXJJbmZvID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwoKICAgIC8vYXBwYXJlbnRseSBEb25lX0ZhY2Ugd2lsbCBvbmx5IGNsb3NlIHRoZSBzdHJlYW0KICAgIC8vIGJ1dCB3aWxsIG5vdCByZWxhc2UgdGhlIG1lbW9yeSBvZiBzdHJlYW0gc3RydWN0dXJlLgogICAgLy8gV2UgbmVlZCB0byBmcmVlIGl0IGV4cGxpY2l0bHkgdG8gYXZvaWQgbGVhay4KICAgIC8vRGlyZWN0IGFjY2VzcyB0byB0aGUgc3RyZWFtIGZpZWxkIG1pZ2h0IGJlIG5vdCBpZGVhbCBzb2x1dGlvbiBhcwogICAgLy8gaXQgaXMgY29uc2lkcmVkIHRvIGJlICJwcml2YXRlIi4KICAgIC8vQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZCBoYXZlIHN0b3JlZCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUKICAgIC8vIGluIHRoZSBzY2FsZXJJbmZvIGJ1dCB0aGlzIHdpbGwgaW5jcmVhc2Ugc2l6ZSBvZiB0aGUgc3RydWN0dXJlCiAgICAvLyBmb3Igbm8gZ29vZCByZWFzb24KICAgIHN0cmVhbSA9IHNjYWxlckluZm8tPmZhY2UtPnN0cmVhbTsKCiAgICBGVF9Eb25lX0ZhY2Uoc2NhbGVySW5mby0+ZmFjZSk7CiAgICBGVF9Eb25lX0ZyZWVUeXBlKHNjYWxlckluZm8tPmxpYnJhcnkpOwoKICAgIGlmIChzY2FsZXJJbmZvLT5kaXJlY3RCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICgqZW52KS0+RGVsZXRlR2xvYmFsUmVmKGVudiwgc2NhbGVySW5mby0+ZGlyZWN0QnVmZmVyKTsKICAgIH0KCiAgICBpZiAoc2NhbGVySW5mby0+Zm9udERhdGEgIT0gTlVMTCkgewogICAgICAgIGZyZWUoc2NhbGVySW5mby0+Zm9udERhdGEpOwogICAgfQoKICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgZnJlZShzdHJlYW0pOwogICB9CgogICAgZnJlZShzY2FsZXJJbmZvKTsKfQoKLyogaW52YWxpZGF0ZXMgc3RhdGUgb2YgamF2YSBzY2FsZXIgb2JqZWN0ICovCnN0YXRpYyB2b2lkIGludmFsaWRhdGVKYXZhU2NhbGVyKEpOSUVudiAqZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IHNjYWxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRTY2FsZXJJbmZvKiBzY2FsZXJJbmZvKSB7CiAgICBmcmVlTmF0aXZlUmVzb3VyY2VzKGVudiwgc2NhbGVySW5mbyk7CiAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgc2NhbGVyLCBpbnZhbGlkYXRlU2NhbGVyTUlEKTsKfQoKLyoqKioqKioqKioqKioqKioqKiogSS9PIGhhbmRsZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgRklMRURBVEFDQUNIRVNJWkUgMTAyNAoKLyogTkI6IGlzIGl0IGV2ZXIgY2FsbGVkPyAqLwpzdGF0aWMgdm9pZCBDbG9zZVRURm9udEZpbGVGdW5jKEZUX1N0cmVhbSBzdHJlYW0pIHsKICAgIEZUU2NhbGVySW5mbyAqc2NhbGVySW5mbyA9IChGVFNjYWxlckluZm8gKikgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyOwogICAgSk5JRW52KiBlbnYgPSBzY2FsZXJJbmZvLT5lbnY7CiAgICBqY2xhc3MgdG1wQ2xhc3MgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJzdW4vZm9udC9UcnVlVHlwZUZvbnQiKTsKICAgIGpmaWVsZElEIHBsYXROYW1lRmllbGQgPQogICAgICAgICAoKmVudiktPkdldEZpZWxkSUQoZW52LCB0bXBDbGFzcywgInBsYXROYW1lIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwogICAganN0cmluZyBwbGF0TmFtZSA9ICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVySW5mby0+Zm9udDJELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdE5hbWVGaWVsZCk7CiAgICBjb25zdCBjaGFyICpuYW1lID0gSk5VX0dldFN0cmluZ1BsYXRmb3JtQ2hhcnMoZW52LCBwbGF0TmFtZSwgTlVMTCk7CiAgICBKTlVfUmVsZWFzZVN0cmluZ1BsYXRmb3JtQ2hhcnMoZW52LCBwbGF0TmFtZSwgbmFtZSk7Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIFJlYWRUVEZvbnRGaWxlRnVuYyhGVF9TdHJlYW0gc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkZXN0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBudW1CeXRlcykKewogICAgRlRTY2FsZXJJbmZvICpzY2FsZXJJbmZvID0gKEZUU2NhbGVySW5mbyAqKSBzdHJlYW0tPnBhdGhuYW1lLnBvaW50ZXI7CiAgICBKTklFbnYqIGVudiA9IHNjYWxlckluZm8tPmVudjsKICAgIGpvYmplY3QgYkJ1ZmZlcjsKICAgIGludCBicmVhZCA9IDA7CgogICAgaWYgKG51bUJ5dGVzID09IDApIHJldHVybiAwOwoKICAgIC8qIExhcmdlIHJlYWRzIHdpbGwgYnlwYXNzIHRoZSBjYWNoZSBhbmQgZGF0YSBjb3B5aW5nICovCiAgICBpZiAobnVtQnl0ZXMgPiBGSUxFREFUQUNBQ0hFU0laRSkgewogICAgICAgIGJCdWZmZXIgPSAoKmVudiktPk5ld0RpcmVjdEJ5dGVCdWZmZXIoZW52LCBkZXN0QnVmZmVyLCBudW1CeXRlcyk7CiAgICAgICAgaWYgKGJCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAvKiBMb29wIHVudGlsIHRoZSByZWFkIHN1Y2NlZWRzIChvciBFT0YpLgogICAgICAgICAgICAgKiBUaGlzIHNob3VsZCBpbXByb3ZlIHJvYnVzdG5lc3MgaW4gdGhlIGV2ZW50IG9mIGEgcHJvYmxlbSBpbgogICAgICAgICAgICAgKiB0aGUgSS9PIHN5c3RlbS4gSWYgd2UgZmluZCB0aGF0IHdlIGV2ZXIgZW5kIHVwIHNwaW5uaW5nIGhlcmUKICAgICAgICAgICAgICogd2UgYXJlIGdvaW5nIHRvIGhhdmUgdG8gZG8gc29tZSBzZXJpb3VzIHdvcmsgdG8gcmVjb3Zlci4KICAgICAgICAgICAgICogSnVzdCByZXR1cm5pbmcgd2l0aG91dCByZWFkaW5nIHRoZSBkYXRhIHdpbGwgY2F1c2UgYSBjcmFzaC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHdoaWxlIChicmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhZCA9ICgqZW52KS0+Q2FsbEludE1ldGhvZChlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLT5mb250MkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLnR0UmVhZEJsb2NrTUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJ1ZmZlciwgb2Zmc2V0LCBudW1CeXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJyZWFkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIFdlIHByb2JhYmx5IGhpdCBidWcgYnVnIDQ4NDUzNzEuIEZvciByZWFzb25zIHRoYXQKICAgICAgICAgICAgICogYXJlIGN1cnJlbnRseSB1bmNsZWFyLCB0aGUgY2FsbCBzdGFja3MgYWZ0ZXIgdGhlIGluaXRpYWwKICAgICAgICAgICAgICogY3JlYXRlU2NhbGVyIGNhbGwgdGhhdCByZWFkIGxhcmdlIGFtb3VudHMgb2YgZGF0YSBzZWVtIHRvCiAgICAgICAgICAgICAqIGJlIE9LIGFuZCBjYW4gY3JlYXRlIHRoZSBieXRlIGJ1ZmZlciBhYm92ZSwgYnV0IHRoaXMgY29kZQogICAgICAgICAgICAgKiBpcyBoZXJlIGp1c3QgaW4gY2FzZS4KICAgICAgICAgICAgICogNDg0NTM3MSBpcyBmaXhlZCBub3cgc28gSSBkb24ndCBleHBlY3QgdGhpcyBjb2RlIHBhdGggdG8KICAgICAgICAgICAgICogZXZlciBnZXQgY2FsbGVkIGJ1dCBpdHMgaGFybWxlc3MgdG8gbGVhdmUgaXQgaGVyZSBvbiB0aGUKICAgICAgICAgICAgICogc21hbGwgY2hhbmNlIGl0cyBuZWVkZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBqYnl0ZUFycmF5IGJ5dGVBcnJheSA9IChqYnl0ZUFycmF5KQogICAgICAgICAgICAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBzY2FsZXJJbmZvLT5mb250MkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLnR0UmVhZEJ5dGVzTUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBudW1CeXRlcyk7CiAgICAgICAgICAgICgqZW52KS0+R2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgYnl0ZUFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBudW1CeXRlcywgKGpieXRlKilkZXN0QnVmZmVyKTsKICAgICAgICAgICAgcmV0dXJuIG51bUJ5dGVzOwogICAgICAgIH0KICAgIH0gLyogRG8gd2UgaGF2ZSBhIGNhY2hlIGhpdD8gKi8KICAgICAgZWxzZSBpZiAoc2NhbGVySW5mby0+Zm9udERhdGFPZmZzZXQgPD0gb2Zmc2V0ICYmCiAgICAgICAgc2NhbGVySW5mby0+Zm9udERhdGFPZmZzZXQgKyBzY2FsZXJJbmZvLT5mb250RGF0YUxlbmd0aCA+PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlcykKICAgIHsKICAgICAgICB1bnNpZ25lZCBjYWNoZU9mZnNldCA9IG9mZnNldCAtIHNjYWxlckluZm8tPmZvbnREYXRhT2Zmc2V0OwoKICAgICAgICBtZW1jcHkoZGVzdEJ1ZmZlciwgc2NhbGVySW5mby0+Zm9udERhdGErKHNpemVfdCljYWNoZU9mZnNldCwgbnVtQnl0ZXMpOwogICAgICAgIHJldHVybiBudW1CeXRlczsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogTXVzdCBmaWxsIHRoZSBjYWNoZSAqLwogICAgICAgIHNjYWxlckluZm8tPmZvbnREYXRhT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIHNjYWxlckluZm8tPmZvbnREYXRhTGVuZ3RoID0KICAgICAgICAgICAgICAgICAob2Zmc2V0ICsgRklMRURBVEFDQUNIRVNJWkUgPiBzY2FsZXJJbmZvLT5maWxlU2l6ZSkgPwogICAgICAgICAgICAgICAgIHNjYWxlckluZm8tPmZpbGVTaXplIC0gb2Zmc2V0IDogRklMRURBVEFDQUNIRVNJWkU7CiAgICAgICAgYkJ1ZmZlciA9IHNjYWxlckluZm8tPmRpcmVjdEJ1ZmZlcjsKICAgICAgICAvKiBMb29wIHVudGlsIGFsbCB0aGUgcmVhZCBzdWNjZWVkcyAob3IgRU9GKS4KICAgICAgICAgKiBUaGlzIHNob3VsZCBpbXByb3ZlIHJvYnVzdG5lc3MgaW4gdGhlIGV2ZW50IG9mIGEgcHJvYmxlbSBpbgogICAgICAgICAqIHRoZSBJL08gc3lzdGVtLiBJZiB3ZSBmaW5kIHRoYXQgd2UgZXZlciBlbmQgdXAgc3Bpbm5pbmcgaGVyZQogICAgICAgICAqIHdlIGFyZSBnb2luZyB0byBoYXZlIHRvIGRvIHNvbWUgc2VyaW91cyB3b3JrIHRvIHJlY292ZXIuCiAgICAgICAgICogSnVzdCByZXR1cm5pbmcgd2l0aG91dCByZWFkaW5nIHRoZSBkYXRhIHdpbGwgY2F1c2UgYSBjcmFzaC4KICAgICAgICAgKi8KICAgICAgICB3aGlsZSAoYnJlYWQgPT0gMCkgewogICAgICAgICAgICBicmVhZCA9ICgqZW52KS0+Q2FsbEludE1ldGhvZChlbnYsIHNjYWxlckluZm8tPmZvbnQyRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuRm9udElEcy50dFJlYWRCbG9ja01JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJ1ZmZlciwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLT5mb250RGF0YUxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoZGVzdEJ1ZmZlciwgc2NhbGVySW5mby0+Zm9udERhdGEsIG51bUJ5dGVzKTsKICAgICAgICByZXR1cm4gbnVtQnl0ZXM7CiAgICB9Cn0KCi8qCiAqIENsYXNzOiAgICAgc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyCiAqIE1ldGhvZDogICAgaW5pdE5hdGl2ZVNjYWxlcgogKiBTaWduYXR1cmU6IChMc3VuL2ZvbnQvRm9udDJEO0lJWkkpSgogKi8KSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfaW5pdE5hdGl2ZVNjYWxlcigKICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCBzY2FsZXIsIGpvYmplY3QgZm9udDJELCBqaW50IHR5cGUsCiAgICAgICAgamludCBpbmRleEluQ29sbGVjdGlvbiwgamJvb2xlYW4gc3VwcG9ydHNDSkssIGppbnQgZmlsZXNpemUpIHsKICAgIEZUU2NhbGVySW5mbyogc2NhbGVySW5mbyA9IE5VTEw7CiAgICBGVF9TdHJlYW0gZnRzdHJlYW07CiAgICBGVF9PcGVuX0FyZ3MgZnRfb3Blbl9hcmdzOwogICAgaW50IGVycm9yOwogICAgam9iamVjdCBiQnVmZmVyOwogICAgc2NhbGVySW5mbyA9IChGVFNjYWxlckluZm8qKSBjYWxsb2MoMSwgc2l6ZW9mKEZUU2NhbGVySW5mbykpOwoKICAgIGlmIChzY2FsZXJJbmZvID09IE5VTEwpCiAgICAgICAgcmV0dXJuIDA7CgogICAgc2NhbGVySW5mby0+ZW52ID0gZW52OwogICAgc2NhbGVySW5mby0+Zm9udDJEID0gZm9udDJEOwogICAgc2NhbGVySW5mby0+Zm9udERhdGFPZmZzZXQgPSAwOwogICAgc2NhbGVySW5mby0+Zm9udERhdGFMZW5ndGggPSAwOwogICAgc2NhbGVySW5mby0+ZmlsZVNpemUgPSBmaWxlc2l6ZTsKCiAgICAvKgogICAgICAgV2UgY2FuIGNvbnNpZGVyIHNoYXJpbmcgZnJlZXR5cGUgbGlicmFyeSBiZXR3ZWVuIGRpZmZlcmVudAogICAgICAgc2NhbGVycy4gSG93ZXZlciwgRnJlZXR5cGUgZG9jcyBzdWdnZXN0IHRvIHVzZSBkaWZmZXJlbnQgbGlicmFyaWVzCiAgICAgICBmb3IgZGlmZmVyZW50IHRocmVhZHMuIEFsc28sIG91ciBhcmNoaXRlY3R1cmUgaW1wbGllcyB0aGF0IHNpbmdsZQogICAgICAgRm9udFNjYWxlciBvYmplY3QgaXMgc2hhcmVkIGZvciBmb3IgZGlmZmVyZW50IHNpemVzL3RyYW5zZm9ybXMvc3R5bGVzCiAgICAgICBvZiB0aGUgc2FtZSBmb250LgoKICAgICAgIE9uIG90aGVyIGhhbmQgdGhlc2UgbWV0aG9kcyBjYW4gbm90IGJlIGNvbmN1cnJlbnRseSBleGVjdXRlZAogICAgICAgYmVjYXVzZWQgdGhleSBhcmUgInN5bmNocm9uaXplZCIgaW4gamF2YS4KICAgICovCiAgICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoJnNjYWxlckluZm8tPmxpYnJhcnkpOwogICAgaWYgKGVycm9yKSB7CiAgICAgICAgZnJlZShzY2FsZXJJbmZvKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiNkZWZpbmUgVFlQRTFfRlJPTV9KQVZBICAgICAgICAyCgogICAgZXJyb3IgPSAxOyAvKiB0cmlnZ2VycyBtZW1vcnkgZnJlZWluZyB1bmxlc3Mgd2UgY2xlYXIgaXQgKi8KICAgIGlmICh0eXBlID09IFRZUEUxX0ZST01fSkFWQSkgeyAvKiBUWVBFMSAqLwogICAgICAgIHNjYWxlckluZm8tPmZvbnREYXRhID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoZmlsZXNpemUpOwogICAgICAgIHNjYWxlckluZm8tPmRpcmVjdEJ1ZmZlciA9IE5VTEw7CiAgICAgICAgc2NhbGVySW5mby0+bGF5b3V0VGFibGVzID0gTlVMTDsKICAgICAgICBzY2FsZXJJbmZvLT5mb250RGF0YUxlbmd0aCA9IGZpbGVzaXplOwoKICAgICAgICBpZiAoc2NhbGVySW5mby0+Zm9udERhdGEgIT0gTlVMTCkgewogICAgICAgICAgICBiQnVmZmVyID0gKCplbnYpLT5OZXdEaXJlY3RCeXRlQnVmZmVyKGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlckluZm8tPmZvbnREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVySW5mby0+Zm9udERhdGFMZW5ndGgpOwogICAgICAgICAgICBpZiAoYkJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBmb250MkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuRm9udElEcy5yZWFkRmlsZU1JRCwgYkJ1ZmZlcik7CgogICAgICAgICAgICAgICAgZXJyb3IgPSBGVF9OZXdfTWVtb3J5X0ZhY2Uoc2NhbGVySW5mby0+bGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLT5mb250RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLT5mb250RGF0YUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluQ29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGVySW5mby0+ZmFjZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgeyAvKiBUcnVldHlwZSAqLwogICAgICAgIHNjYWxlckluZm8tPmZvbnREYXRhID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoRklMRURBVEFDQUNIRVNJWkUpOwogICAgICAgIGZ0c3RyZWFtID0gKEZUX1N0cmVhbSkgY2FsbG9jKDEsIHNpemVvZihGVF9TdHJlYW1SZWMpKTsKCiAgICAgICAgaWYgKGZ0c3RyZWFtICE9IE5VTEwgJiYgc2NhbGVySW5mby0+Zm9udERhdGEgIT0gTlVMTCkgewogICAgICAgICAgICBzY2FsZXJJbmZvLT5kaXJlY3RCdWZmZXIgPSAoKmVudiktPk5ld0RpcmVjdEJ5dGVCdWZmZXIoZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVySW5mby0+Zm9udERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFREFUQUNBQ0hFU0laRSk7CiAgICAgICAgICAgIGlmIChzY2FsZXJJbmZvLT5kaXJlY3RCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc2NhbGVySW5mby0+ZGlyZWN0QnVmZmVyID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlckluZm8tPmRpcmVjdEJ1ZmZlcik7CiAgICAgICAgICAgICAgICBmdHN0cmVhbS0+YmFzZSA9IE5VTEw7CiAgICAgICAgICAgICAgICBmdHN0cmVhbS0+c2l6ZSA9IGZpbGVzaXplOwogICAgICAgICAgICAgICAgZnRzdHJlYW0tPnBvcyA9IDA7CiAgICAgICAgICAgICAgICBmdHN0cmVhbS0+cmVhZCA9IChGVF9TdHJlYW1fSW9GdW5jKSBSZWFkVFRGb250RmlsZUZ1bmM7CiAgICAgICAgICAgICAgICBmdHN0cmVhbS0+Y2xvc2UgPSAoRlRfU3RyZWFtX0Nsb3NlRnVuYykgQ2xvc2VUVEZvbnRGaWxlRnVuYzsKICAgICAgICAgICAgICAgIGZ0c3RyZWFtLT5wYXRobmFtZS5wb2ludGVyID0gKHZvaWQgKikgc2NhbGVySW5mbzsKCiAgICAgICAgICAgICAgICBtZW1zZXQoJmZ0X29wZW5fYXJncywgMCwgc2l6ZW9mKEZUX09wZW5fQXJncykpOwogICAgICAgICAgICAgICAgZnRfb3Blbl9hcmdzLmZsYWdzID0gRlRfT1BFTl9TVFJFQU07CiAgICAgICAgICAgICAgICBmdF9vcGVuX2FyZ3Muc3RyZWFtID0gZnRzdHJlYW07CgogICAgICAgICAgICAgICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2Uoc2NhbGVySW5mby0+bGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdF9vcGVuX2FyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluQ29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZXJJbmZvLT5mYWNlKTsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGVycm9yIHx8IHNjYWxlckluZm8tPmRpcmVjdEJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgIGZyZWUoZnRzdHJlYW0pOwogICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGVycm9yKSB7CiAgICAgICAgRlRfRG9uZV9GcmVlVHlwZShzY2FsZXJJbmZvLT5saWJyYXJ5KTsKICAgICAgICBpZiAoc2NhbGVySW5mby0+ZGlyZWN0QnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgKCplbnYpLT5EZWxldGVHbG9iYWxSZWYoZW52LCBzY2FsZXJJbmZvLT5kaXJlY3RCdWZmZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoc2NhbGVySW5mby0+Zm9udERhdGEgIT0gTlVMTCkKICAgICAgICAgICAgZnJlZShzY2FsZXJJbmZvLT5mb250RGF0YSk7CiAgICAgICAgZnJlZShzY2FsZXJJbmZvKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICByZXR1cm4gcHRyX3RvX2psb25nKHNjYWxlckluZm8pOwp9CgpzdGF0aWMgZG91YmxlIGV1Y2xpZGlhbkRpc3RhbmNlKGRvdWJsZSBhLCBkb3VibGUgYikgewogICAgaWYgKGEgPCAwKSBhPS1hOwogICAgaWYgKGIgPCAwKSBiPS1iOwoKICAgIGlmIChhID09IDApIHJldHVybiBiOwogICAgaWYgKGIgPT0gMCkgcmV0dXJuIGE7CgogICAgcmV0dXJuIHNxcnQoYSphK2IqYik7Cn0KCkpOSUVYUE9SVCBqbG9uZyBKTklDQUxMCkphdmFfc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyX2NyZWF0ZVNjYWxlckNvbnRleHROYXRpdmUoCiAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3Qgc2NhbGVyLCBqbG9uZyBwU2NhbGVyLCBqZG91YmxlQXJyYXkgbWF0cml4LAogICAgICAgIGpib29sZWFuIHR0Rm9udCwgamludCBhYSwgamludCBmbSwgamZsb2F0IGJvbGRuZXNzLCBqZmxvYXQgaXRhbGljKSB7CiAgICBkb3VibGUgZG1hdFs0XSwgcHRzejsKICAgIEZUU2NhbGVyQ29udGV4dCAqY29udGV4dCA9CiAgICAgICAgICAgIChGVFNjYWxlckNvbnRleHQqKSBjYWxsb2MoMSwgc2l6ZW9mKEZUU2NhbGVyQ29udGV4dCkpOwogICAgRlRTY2FsZXJJbmZvICpzY2FsZXJJbmZvID0KICAgICAgICAgICAgIChGVFNjYWxlckluZm8qKSBqbG9uZ190b19wdHIocFNjYWxlcik7CgogICAgaWYgKGNvbnRleHQgPT0gTlVMTCkgewogICAgICAgIGludmFsaWRhdGVKYXZhU2NhbGVyKGVudiwgc2NhbGVyLCBOVUxMKTsKICAgICAgICByZXR1cm4gKGpsb25nKSAwOwogICAgfQogICAgKCplbnYpLT5HZXREb3VibGVBcnJheVJlZ2lvbihlbnYsIG1hdHJpeCwgMCwgNCwgZG1hdCk7CiAgICBwdHN6ID0gZXVjbGlkaWFuRGlzdGFuY2UoZG1hdFsyXSwgZG1hdFszXSk7IC8vaS5lLiB5LXNpemUKICAgIGlmIChwdHN6IDwgMS4wKSB7CiAgICAgICAgLy90ZXh0IGNhbiBub3QgYmUgc21hbGxlciB0aGFuIDEgcG9pbnQKICAgICAgICBwdHN6ID0gMS4wOwogICAgfQogICAgY29udGV4dC0+cHRzeiA9IChpbnQpKHB0c3ogKiA2NCk7CiAgICBjb250ZXh0LT50cmFuc2Zvcm0ueHggPSAgRmxvYXRUb0ZURml4ZWQoKGZsb2F0KWRtYXRbMF0vcHRzeik7CiAgICBjb250ZXh0LT50cmFuc2Zvcm0ueXggPSAtRmxvYXRUb0ZURml4ZWQoKGZsb2F0KWRtYXRbMV0vcHRzeik7CiAgICBjb250ZXh0LT50cmFuc2Zvcm0ueHkgPSAtRmxvYXRUb0ZURml4ZWQoKGZsb2F0KWRtYXRbMl0vcHRzeik7CiAgICBjb250ZXh0LT50cmFuc2Zvcm0ueXkgPSAgRmxvYXRUb0ZURml4ZWQoKGZsb2F0KWRtYXRbM10vcHRzeik7CiAgICBjb250ZXh0LT5hYVR5cGUgPSBhYTsKICAgIGNvbnRleHQtPmZtVHlwZSA9IGZtOwoKICAgIC8qIElmIHVzaW5nIGFsZ29yaXRobWljIHN0eWxpbmcsIHRoZSBiYXNlIHZhbHVlcyBhcmUKICAgICAqIGJvbGRuZXNzID0gMS4wLCBpdGFsaWMgPSAwLjAuCiAgICAgKi8KICAgIGNvbnRleHQtPmRvQm9sZCA9IChib2xkbmVzcyAhPSAxLjApOwogICAgY29udGV4dC0+ZG9JdGFsaXplID0gKGl0YWxpYyAhPSAwKTsKCiAgICByZXR1cm4gcHRyX3RvX2psb25nKGNvbnRleHQpOwp9CgpzdGF0aWMgaW50IHNldHVwRlRDb250ZXh0KEpOSUVudiAqZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZm9udDJELAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUU2NhbGVySW5mbyAqc2NhbGVySW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICBGVFNjYWxlckNvbnRleHQgKmNvbnRleHQpIHsKICAgIGludCBlcnJDb2RlID0gMDsKCiAgICBzY2FsZXJJbmZvLT5lbnYgPSBlbnY7CiAgICBzY2FsZXJJbmZvLT5mb250MkQgPSBmb250MkQ7CgogICAgaWYgKGNvbnRleHQgIT0gTlVMTCkgewogICAgICAgIEZUX1NldF9UcmFuc2Zvcm0oc2NhbGVySW5mby0+ZmFjZSwgJmNvbnRleHQtPnRyYW5zZm9ybSwgTlVMTCk7CgogICAgICAgIGVyckNvZGUgPSBGVF9TZXRfQ2hhcl9TaXplKHNjYWxlckluZm8tPmZhY2UsIDAsIGNvbnRleHQtPnB0c3osIDcyLCA3Mik7CgogICAgICAgIGlmIChlcnJDb2RlID09IDApIHsKICAgICAgICAgICAgZXJyQ29kZSA9IEZUX0FjdGl2YXRlX1NpemUoc2NhbGVySW5mby0+ZmFjZS0+c2l6ZSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBlcnJDb2RlOwp9CgovKiBmdHN5bnRoLmMgdXNlcyAoMHgxMDAwMCwgMHgwNjAwMCwgMHgwLCAweDEwMDAwKSBtYXRyaXggdG8gZ2V0IG9ibGlxdWUKICAgb3V0bGluZS4gIFRoZXJlZm9yZSB4IGNvb3JkaW5hdGUgd2lsbCBjaGFuZ2UgYnkgMHgwNjAwMCp5LgogICBOb3RlIHRoYXQgeSBjb29yZGluYXRlIGRvZXMgbm90IGNoYW5nZS4gKi8KI2RlZmluZSBPQkxJUVVFX01PRElGSUVSKHkpICAoY29udGV4dC0+ZG9JdGFsaXplID8gKCh5KSo2LzE2KSA6IDApCgovKgogKiBDbGFzczogICAgIHN1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcgogKiBNZXRob2Q6ICAgIGdldEZvbnRNZXRyaWNzTmF0aXZlCiAqIFNpZ25hdHVyZTogKExzdW4vZm9udC9Gb250MkQ7SilMc3VuL2ZvbnQvU3RyaWtlTWV0cmljczsKICovCkpOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0Rm9udE1ldHJpY3NOYXRpdmUoCiAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3Qgc2NhbGVyLCBqb2JqZWN0IGZvbnQyRCwKICAgICAgICBqbG9uZyBwU2NhbGVyQ29udGV4dCwgamxvbmcgcFNjYWxlcikgewoKICAgIGpvYmplY3QgbWV0cmljczsKICAgIGpmbG9hdCBheCwgYXksIGR4LCBkeSwgYngsIGJ5LCBseCwgbHksIG14LCBteTsKICAgIGpmbG9hdCBmMCA9IDAuMDsKICAgIEZUX1BvcyBibW9kaWZpZXIgPSAwOwogICAgRlRTY2FsZXJDb250ZXh0ICpjb250ZXh0ID0KICAgICAgICAoRlRTY2FsZXJDb250ZXh0KikgamxvbmdfdG9fcHRyKHBTY2FsZXJDb250ZXh0KTsKICAgIEZUU2NhbGVySW5mbyAqc2NhbGVySW5mbyA9CiAgICAgICAgICAgICAoRlRTY2FsZXJJbmZvKikgamxvbmdfdG9fcHRyKHBTY2FsZXIpOwoKICAgIGludCBlcnJDb2RlOwoKICAgIGlmIChpc051bGxTY2FsZXJDb250ZXh0KGNvbnRleHQpIHx8IHNjYWxlckluZm8gPT0gTlVMTCkgewogICAgICAgIHJldHVybiAoKmVudiktPk5ld09iamVjdChlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMuc3RyaWtlTWV0cmljc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLnN0cmlrZU1ldHJpY3NDdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYwLCBmMCwgZjAsIGYwLCBmMCwgZjAsIGYwLCBmMCwgZjAsIGYwKTsKICAgIH0KCiAgICBlcnJDb2RlID0gc2V0dXBGVENvbnRleHQoZW52LCBmb250MkQsIHNjYWxlckluZm8sIGNvbnRleHQpOwoKICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgbWV0cmljcyA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuRm9udElEcy5zdHJpa2VNZXRyaWNzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMuc3RyaWtlTWV0cmljc0N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjAsIGYwLCBmMCwgZjAsIGYwLCBmMCwgZjAsIGYwLCBmMCwgZjApOwogICAgICAgIGludmFsaWRhdGVKYXZhU2NhbGVyKGVudiwgc2NhbGVyLCBzY2FsZXJJbmZvKTsKICAgICAgICByZXR1cm4gbWV0cmljczsKICAgIH0KCiAgICAvKiBUaGlzIGlzIHVnbHkgYW5kIGhhcyB0byBiZSByZXdvcmtlZC4KICAgICAgIEZyZWV0eXBlIHByb3ZpZGUgbWVhbnMgdG8gYWRkIHN0eWxlIHRvIGdseXBoIGJ1dAogICAgICAgaXQgc2VlbXMgdGhlcmUgaXMgbm8gd2F5IHRvIGFkanVzdCBtZXRyaWNzIGFjY29yZGluZ2x5LgoKICAgICAgIFNvLCB3ZSBoYXZlIHRvIGRvIGFkdXN0IHRoZW0gZXhwbGljaXRseSBhbmQgc3RheSBjb25zaXN0ZW50IHdpdGggd2hhdAogICAgICAgZnJlZXR5cGUgZG9lcyB0byBvdXRsaW5lcy4gKi8KCiAgICAvKiBGb3IgYm9sZGluZyBnbHlwaHMgYXJlIG5vdCBqdXN0IHdpZGVuZWQuIEhlaWdodCBpcyBhbHNvIGNoYW5nZWQKICAgICAgIChzZWUgZnRzeW50aC5jKS4KCiAgICAgICBUT0RPOiBJbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gd2UgY291bGQgZG8gYmV0dGVyIGpvYiBhbmQgYWRqdXN0IG1ldHJpY3MKICAgICAgIHByb3BvcnRpb25hbGx5IHRvIGdseW9oIHNoYXBlLiAqLwogICAgaWYgKGNvbnRleHQtPmRvQm9sZCkgewogICAgICAgIGJtb2RpZmllciA9IEZUX011bEZpeCgKICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLT5mYWNlLT51bml0c19wZXJfRU0sCiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVySW5mby0+ZmFjZS0+c2l6ZS0+bWV0cmljcy55X3NjYWxlKS8yNDsKICAgIH0KCgogICAgLyoqKiogTm90ZTogb25seSBzb21lIG1ldHJpY3MgYXJlIGFmZmVjdGVkIGJ5IHN0eWxpbmcgKioqLwoKICAgIC8qIGFzY2VudCAqLwogICAgYXggPSAwOwogICAgYXkgPSAtKGpmbG9hdCkgRlQyNkRvdDZUb0Zsb2F0KAogICAgICAgICAgICAgICAgICAgICAgIHNjYWxlckluZm8tPmZhY2UtPnNpemUtPm1ldHJpY3MuYXNjZW5kZXIgKwogICAgICAgICAgICAgICAgICAgICAgIGJtb2RpZmllci8yKTsKICAgIC8qIGRlc2NlbnQgKi8KICAgIGR4ID0gMDsKICAgIGR5ID0gLShqZmxvYXQpIEZUMjZEb3Q2VG9GbG9hdCgKICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLT5mYWNlLT5zaXplLT5tZXRyaWNzLmRlc2NlbmRlciArCiAgICAgICAgICAgICAgICAgICAgICAgYm1vZGlmaWVyLzIpOwogICAgLyogYmFzZWxpbmUgKi8KICAgIGJ4ID0gYnkgPSAwOwoKICAgIC8qIGxlYWRpbmcgKi8KICAgIGx4ID0gMDsKICAgIGx5ID0gKGpmbG9hdCkgRlQyNkRvdDZUb0Zsb2F0KAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVySW5mby0+ZmFjZS0+c2l6ZS0+bWV0cmljcy5oZWlnaHQgKwogICAgICAgICAgICAgICAgICAgICAgYm1vZGlmaWVyKSArIGF5IC0gZHk7CiAgICAvKiBtYXggYWR2YW5jZSAqLwogICAgbXggPSAoamZsb2F0KSBGVDI2RG90NlRvRmxvYXQoCiAgICAgICAgICAgICAgICAgICAgIHNjYWxlckluZm8tPmZhY2UtPnNpemUtPm1ldHJpY3MubWF4X2FkdmFuY2UgKwogICAgICAgICAgICAgICAgICAgICAyKmJtb2RpZmllciArCiAgICAgICAgICAgICAgICAgICAgIE9CTElRVUVfTU9ESUZJRVIoc2NhbGVySW5mby0+ZmFjZS0+c2l6ZS0+bWV0cmljcy5oZWlnaHQpKTsKICAgIG15ID0gMDsKCiAgICBtZXRyaWNzID0gKCplbnYpLT5OZXdPYmplY3QoZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMuc3RyaWtlTWV0cmljc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMuc3RyaWtlTWV0cmljc0N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheCwgYXksIGR4LCBkeSwgYngsIGJ5LCBseCwgbHksIG14LCBteSk7CgogICAgcmV0dXJuIG1ldHJpY3M7Cn0KCi8qCiAqIENsYXNzOiAgICAgc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyCiAqIE1ldGhvZDogICAgZ2V0R2x5cGhBZHZhbmNlTmF0aXZlCiAqIFNpZ25hdHVyZTogKExzdW4vZm9udC9Gb250MkQ7SkkpRgogKi8KSk5JRVhQT1JUIGpmbG9hdCBKTklDQUxMCkphdmFfc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyX2dldEdseXBoQWR2YW5jZU5hdGl2ZSgKICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCBzY2FsZXIsIGpvYmplY3QgZm9udDJELAogICAgICAgIGpsb25nIHBTY2FsZXJDb250ZXh0LCBqbG9uZyBwU2NhbGVyLCBqaW50IGdseXBoQ29kZSkgewoKICAgLyogVGhpcyBtZXRob2QgaXMgcmFyZWx5IHVzZWQgYmVjYXVzZSByZXF1ZXN0cyBmb3IgbWV0cmljcyBhcmUgdXN1YWxseQogICAgICBjb3VwbGVkIHdpdGggcmVxdWVzdCBmb3IgYml0bWFwIGFuZCB0byBsYXJnZSBleHRlbmQgd29yayBjYW4gYmUgcmV1c2VkCiAgICAgICh0byBmaW5kIG91dCBtZXRyaWNzIHdlIG5lZWQgdG8gaGludCBnbHlwaCkuCiAgICAgIFNvLCB3ZSB0eXBpY2FsbHkgZ28gdGhyb3VnaCBnZXRHbHlwaEltYWdlIGNvZGUgcGF0aC4KCiAgICAgIEZvciBpbml0aWFsIGZyZWV0eXBlIGltcGxlbWVudGF0aW9uIHdlIGRlbGVnYXRlCiAgICAgIGFsbCB3b3JrIHRvIGdldEdseXBoSW1hZ2UgYnV0IGRyb3AgcmVzdWx0IGltYWdlLgogICAgICBUaGlzIGlzIHdhc3RlIG9mIHdvcmsgcmVsYXRlZCB0byBzY2FuIGNvbnZlcnNpb24gYW5kIGNvbnZlcnNpb24gZnJvbQogICAgICBmcmVldHlwZSBmb3JtYXQgdG8gb3VyIGZvcm1hdCBidXQgZm9yIG5vdyB0aGlzIHNlZW1zIHRvIGJlIG9rLgoKICAgICAgTkI6IGludmVzdGlnYXRlIHBlcmZvcm1hbmNlIGJlbmVmaXRzIG9mIHJlZmFjdG9yaW5nIGNvZGUKICAgICAgdG8gYXZvaWQgdW5uZWNlc2FyeSB3b3JrIHdpdGggYml0bWFwcy4gKi8KCiAgICBHbHlwaEluZm8gKmluZm87CiAgICBqZmxvYXQgYWR2YW5jZTsKICAgIGpsb25nIGltYWdlOwoKICAgIGltYWdlID0gSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0R2x5cGhJbWFnZU5hdGl2ZSgKICAgICAgICAgICAgICAgICBlbnYsIHNjYWxlciwgZm9udDJELCBwU2NhbGVyQ29udGV4dCwgcFNjYWxlciwgZ2x5cGhDb2RlKTsKICAgIGluZm8gPSAoR2x5cGhJbmZvKikgamxvbmdfdG9fcHRyKGltYWdlKTsKCiAgICBhZHZhbmNlID0gaW5mby0+YWR2YW5jZVg7CgogICAgZnJlZShpbmZvKTsKCiAgICByZXR1cm4gYWR2YW5jZTsKfQoKLyoKICogQ2xhc3M6ICAgICBzdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXIKICogTWV0aG9kOiAgICBnZXRHbHlwaE1ldHJpY3NOYXRpdmUKICogU2lnbmF0dXJlOiAoTHN1bi9mb250L0ZvbnQyRDtKSUxqYXZhL2F3dC9nZW9tL1BvaW50MkQvRmxvYXQ7KVYKICovCkpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0R2x5cGhNZXRyaWNzTmF0aXZlKAogICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHNjYWxlciwgam9iamVjdCBmb250MkQsIGpsb25nIHBTY2FsZXJDb250ZXh0LAogICAgICAgIGpsb25nIHBTY2FsZXIsIGppbnQgZ2x5cGhDb2RlLCBqb2JqZWN0IG1ldHJpY3MpIHsKCiAgICAgLyogQXMgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiB3ZSBkZWxlZ2F0ZSBhbGwgd29yayB0byBnZXRHbHlwaEltYWdlCiAgICAgICAgYnV0IGRyb3AgcmVzdWx0IGltYWdlLiBUaGlzIGlzIGNsZWFybHkgd2FzdGUgb2YgcmVzb3JjZXMuCgogICAgICAgIFRPRE86IGludmVzdGlnYXRlIHBlcmZvcm1hbmNlIGJlbmVmaXRzIG9mIHJlZmFjdG9yaW5nIGNvZGUKICAgICAgICAgICAgICBieSBhdm9pZGluZyBiaXRtYXAgZ2VuZXJhdGlvbiBhbmQgY29udmVyc2lvbiBmcm9tIEZUCiAgICAgICAgICAgICAgYml0bWFwIGZvcm1hdC4gKi8KICAgICBHbHlwaEluZm8gKmluZm87CgogICAgIGpsb25nIGltYWdlID0gSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0R2x5cGhJbWFnZU5hdGl2ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBzY2FsZXIsIGZvbnQyRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYWxlckNvbnRleHQsIHBTY2FsZXIsIGdseXBoQ29kZSk7CiAgICAgaW5mbyA9IChHbHlwaEluZm8qKSBqbG9uZ190b19wdHIoaW1hZ2UpOwoKICAgICAoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBtZXRyaWNzLCBzdW5Gb250SURzLnhGSUQsIGluZm8tPmFkdmFuY2VYKTsKICAgICAoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBtZXRyaWNzLCBzdW5Gb250SURzLnlGSUQsIGluZm8tPmFkdmFuY2VZKTsKCiAgICAgZnJlZShpbmZvKTsKfQoKCnN0YXRpYyBHbHlwaEluZm8qIGdldE51bGxHbHlwaEltYWdlKCkgewogICAgR2x5cGhJbmZvICpnbHlwaEluZm8gPSAgKEdseXBoSW5mbyopIGNhbGxvYygxLCBzaXplb2YoR2x5cGhJbmZvKSk7CiAgICByZXR1cm4gZ2x5cGhJbmZvOwp9CgpzdGF0aWMgdm9pZCBDb3B5QlcyR3JleTgoY29uc3Qgdm9pZCogc3JjSW1hZ2UsIGludCBzcmNSb3dCeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdEltYWdlLCBpbnQgZHN0Um93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgIGNvbnN0IFVJbnQ4KiBzcmNSb3cgPSAoVUludDgqKXNyY0ltYWdlOwogICAgVUludDgqIGRzdFJvdyA9IChVSW50OCopZHN0SW1hZ2U7CiAgICBpbnQgd2hvbGVCeXRlQ291bnQgPSB3aWR0aCA+PiAzOwogICAgaW50IHJlbWFpbmluZ0JpdHNDb3VudCA9IHdpZHRoICYgNzsKICAgIGludCBpLCBqOwoKICAgIHdoaWxlIChoZWlnaHQtLSkgewogICAgICAgIGNvbnN0IFVJbnQ4KiBzcmM4ID0gc3JjUm93OwogICAgICAgIFVJbnQ4KiBkc3RCeXRlID0gZHN0Um93OwogICAgICAgIHVuc2lnbmVkIHNyY1ZhbHVlOwoKICAgICAgICBzcmNSb3cgKz0gc3JjUm93Qnl0ZXM7CiAgICAgICAgZHN0Um93ICs9IGRzdFJvd0J5dGVzOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2hvbGVCeXRlQ291bnQ7IGkrKykgewogICAgICAgICAgICBzcmNWYWx1ZSA9ICpzcmM4Kys7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKICAgICAgICAgICAgICAgICpkc3RCeXRlKysgPSAoc3JjVmFsdWUgJiAweDgwKSA/IDB4RkYgOiAwOwogICAgICAgICAgICAgICAgc3JjVmFsdWUgPDw9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHJlbWFpbmluZ0JpdHNDb3VudCkgewogICAgICAgICAgICBzcmNWYWx1ZSA9ICpzcmM4OwogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVtYWluaW5nQml0c0NvdW50OyBqKyspIHsKICAgICAgICAgICAgICAgICpkc3RCeXRlKysgPSAoc3JjVmFsdWUgJiAweDgwKSA/IDB4RkYgOiAwOwogICAgICAgICAgICAgICAgc3JjVmFsdWUgPDw9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiNkZWZpbmUgR3JleTRUb0FscGhhMjU1KHZhbHVlKSAoKCh2YWx1ZSkgPDwgNCkgKyAoKHZhbHVlKSA+PiAzKSkKCnN0YXRpYyB2b2lkIENvcHlHcmV5NFRvR3JleTgoY29uc3Qgdm9pZCogc3JjSW1hZ2UsIGludCBzcmNSb3dCeXRlcywKICAgICAgICAgICAgICAgIHZvaWQqIGRzdEltYWdlLCBpbnQgZHN0Um93Qnl0ZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgIGNvbnN0IFVJbnQ4KiBzcmNSb3cgPSAoVUludDgqKSBzcmNJbWFnZTsKICAgICBVSW50OCogZHN0Um93ID0gKFVJbnQ4KikgZHN0SW1hZ2U7CiAgICAgaW50IGk7CgogICAgIHdoaWxlIChoZWlnaHQtLSkgewogICAgICAgICBjb25zdCBVSW50OCogc3JjOCA9IHNyY1JvdzsKICAgICAgICAgVUludDgqIGRzdEJ5dGUgPSBkc3RSb3c7CiAgICAgICAgIHVuc2lnbmVkIHNyY1ZhbHVlOwoKICAgICAgICAgc3JjUm93ICs9IHNyY1Jvd0J5dGVzOwogICAgICAgICBkc3RSb3cgKz0gZHN0Um93Qnl0ZXM7CgogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgewogICAgICAgICAgICAgc3JjVmFsdWUgPSAqc3JjOCsrOwogICAgICAgICAgICAgKmRzdEJ5dGUrKyA9IEdyZXk0VG9BbHBoYTI1NShzcmNWYWx1ZSAmIDB4MGYpOwogICAgICAgICAgICAgKmRzdEJ5dGUrKyA9IEdyZXk0VG9BbHBoYTI1NShzcmNWYWx1ZSA+PiA0KTsKICAgICAgICAgfQogICAgIH0KfQoKLyogV2UgbmVlZCBpdCBiZWNhdXNlIEZUIHJvd3MgYXJlIG9mdGVuIHBhZGRlZCB0byA0IGJ5dGUgYm91bmRhcmllcwogICAgYW5kIG91ciBpbnRlcm5hbCBmb3JtYXQgaXMgbm90IHBhZGRlZCAqLwpzdGF0aWMgdm9pZCBDb3B5RlRTdWJwaXhlbFRvU3VicGl4ZWwoY29uc3Qgdm9pZCogc3JjSW1hZ2UsIGludCBzcmNSb3dCeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdEltYWdlLCBpbnQgZHN0Um93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgIHVuc2lnbmVkIGNoYXIgKnNyY1JvdyA9ICh1bnNpZ25lZCBjaGFyICopIHNyY0ltYWdlOwogICAgdW5zaWduZWQgY2hhciAqZHN0Um93ID0gKHVuc2lnbmVkIGNoYXIgKikgZHN0SW1hZ2U7CgogICAgd2hpbGUgKGhlaWdodC0tKSB7CiAgICAgICAgbWVtY3B5KGRzdFJvdywgc3JjUm93LCB3aWR0aCk7CiAgICAgICAgc3JjUm93ICs9IHNyY1Jvd0J5dGVzOwogICAgICAgIGRzdFJvdyArPSBkc3RSb3dCeXRlczsKICAgIH0KfQoKLyogV2UgbmVlZCBpdCBiZWNhdXNlIEZUIHJvd3MgYXJlIG9mdGVuIHBhZGRlZCB0byA0IGJ5dGUgYm91bmRhcmllcwogICBhbmQgb3VyIGludGVybmFsIGZvcm1hdCBpcyBub3QgcGFkZGVkICovCnN0YXRpYyB2b2lkIENvcHlGVFN1YnBpeGVsVlRvU3VicGl4ZWwoY29uc3Qgdm9pZCogc3JjSW1hZ2UsIGludCBzcmNSb3dCeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3RJbWFnZSwgaW50IGRzdFJvd0J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgdW5zaWduZWQgY2hhciAqc3JjUm93ID0gKHVuc2lnbmVkIGNoYXIgKikgc3JjSW1hZ2UsICpzcmNCeXRlOwogICAgdW5zaWduZWQgY2hhciAqZHN0Um93ID0gKHVuc2lnbmVkIGNoYXIgKikgZHN0SW1hZ2UsICpkc3RCeXRlOwogICAgaW50IGk7CgogICAgd2hpbGUgKGhlaWdodCA+IDApIHsKICAgICAgICBzcmNCeXRlID0gc3JjUm93OwogICAgICAgIGRzdEJ5dGUgPSBkc3RSb3c7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKICAgICAgICAgICAgKmRzdEJ5dGUrKyA9ICpzcmNCeXRlOwogICAgICAgICAgICAqZHN0Qnl0ZSsrID0gKihzcmNCeXRlICsgc3JjUm93Qnl0ZXMpOwogICAgICAgICAgICAqZHN0Qnl0ZSsrID0gKihzcmNCeXRlICsgMipzcmNSb3dCeXRlcyk7CiAgICAgICAgICAgIHNyY0J5dGUrKzsKICAgICAgICB9CiAgICAgICAgc3JjUm93ICs9IDMqc3JjUm93Qnl0ZXM7CiAgICAgICAgZHN0Um93ICs9IGRzdFJvd0J5dGVzOwogICAgICAgIGhlaWdodCAtPSAzOwogICAgfQp9CgoKLyoKICogQ2xhc3M6ICAgICBzdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXIKICogTWV0aG9kOiAgICBnZXRHbHlwaEltYWdlTmF0aXZlCiAqIFNpZ25hdHVyZTogKExzdW4vZm9udC9Gb250MkQ7SkkpSgogKi8KSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0R2x5cGhJbWFnZU5hdGl2ZSgKICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCBzY2FsZXIsIGpvYmplY3QgZm9udDJELAogICAgICAgIGpsb25nIHBTY2FsZXJDb250ZXh0LCBqbG9uZyBwU2NhbGVyLCBqaW50IGdseXBoQ29kZSkgewoKICAgIGludCBlcnJvciwgaW1hZ2VTaXplOwogICAgVUludDE2IHdpZHRoLCBoZWlnaHQ7CiAgICBHbHlwaEluZm8gKmdseXBoSW5mbzsKICAgIGludCBnbHlwaF9pbmRleDsKICAgIGludCByZW5kZXJGbGFncyA9IEZUX0xPQURfUkVOREVSLCB0YXJnZXQ7CiAgICBGVF9HbHlwaFNsb3QgZnRnbHlwaDsKCiAgICBGVFNjYWxlckNvbnRleHQqIGNvbnRleHQgPQogICAgICAgIChGVFNjYWxlckNvbnRleHQqKSBqbG9uZ190b19wdHIocFNjYWxlckNvbnRleHQpOwogICAgRlRTY2FsZXJJbmZvICpzY2FsZXJJbmZvID0KICAgICAgICAgICAgIChGVFNjYWxlckluZm8qKSBqbG9uZ190b19wdHIocFNjYWxlcik7CgogICAgaWYgKGlzTnVsbFNjYWxlckNvbnRleHQoY29udGV4dCkgfHwgc2NhbGVySW5mbyA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIHB0cl90b19qbG9uZyhnZXROdWxsR2x5cGhJbWFnZSgpKTsKICAgIH0KCiAgICBlcnJvciA9IHNldHVwRlRDb250ZXh0KGVudiwgZm9udDJELCBzY2FsZXJJbmZvLCBjb250ZXh0KTsKICAgIGlmIChlcnJvcikgewogICAgICAgIGludmFsaWRhdGVKYXZhU2NhbGVyKGVudiwgc2NhbGVyLCBzY2FsZXJJbmZvKTsKICAgICAgICByZXR1cm4gcHRyX3RvX2psb25nKGdldE51bGxHbHlwaEltYWdlKCkpOwogICAgfQoKICAgIC8qIGlmIGFsZ29yaXRobWljIHN0eWxpbmcgaXMgcmVxdWlyZWQgdGhlbiB3ZSBkbyBub3QgcmVxdWVzdCBiaXRtYXAgKi8KICAgIGlmIChjb250ZXh0LT5kb0JvbGQgfHwgY29udGV4dC0+ZG9JdGFsaXplKSB7CiAgICAgICAgcmVuZGVyRmxhZ3MgPSAgRlRfTE9BRF9ERUZBVUxUOwogICAgfQoKICAgIC8qIE5COiBpbiBjYXNlIG9mIG5vbiBpZGVudGl0eSB0cmFuc2Zvcm0KICAgICB3ZSBtaWdodCBhbHNvIHByZWZlciB0byBkaXNhYmxlIHRyYW5zZm9ybSBiZWZvcmUgaGludGluZywKICAgICBhbmQgYXBwbHkgaXQgZXhwbGljaXRseSBhZnRlciBoaW50aW5nIGlzIHBlcmZvcm1lZC4KICAgICBPciB3ZSBjYW4gZGlzYWJsZSBoaW50aW5nLiAqLwoKICAgIC8qIHNlbGVjdCBhcHByb3ByaWF0ZSBoaW50aW5nIG1vZGUgKi8KICAgIGlmIChjb250ZXh0LT5hYVR5cGUgPT0gVEVYVF9BQV9PRkYpIHsKICAgICAgICB0YXJnZXQgPSBGVF9MT0FEX1RBUkdFVF9NT05POwogICAgfSBlbHNlIGlmIChjb250ZXh0LT5hYVR5cGUgPT0gVEVYVF9BQV9PTikgewogICAgICAgIHRhcmdldCA9IEZUX0xPQURfVEFSR0VUX05PUk1BTDsKICAgIH0gZWxzZSBpZiAoY29udGV4dC0+YWFUeXBlID09IFRFWFRfQUFfTENEX0hSR0IgfHwKICAgICAgICAgICAgICAgY29udGV4dC0+YWFUeXBlID09IFRFWFRfQUFfTENEX0hCR1IpIHsKICAgICAgICB0YXJnZXQgPSBGVF9MT0FEX1RBUkdFVF9MQ0Q7CiAgICB9IGVsc2UgewogICAgICAgIHRhcmdldCA9IEZUX0xPQURfVEFSR0VUX0xDRF9WOwogICAgfQogICAgcmVuZGVyRmxhZ3MgfD0gdGFyZ2V0OwoKICAgIGdseXBoX2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoc2NhbGVySW5mby0+ZmFjZSwgZ2x5cGhDb2RlKTsKCiAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoc2NhbGVySW5mby0+ZmFjZSwgZ2x5cGhDb2RlLCByZW5kZXJGbGFncyk7CiAgICBpZiAoZXJyb3IpIHsKICAgICAgICAvL2RvIG5vdCBkZXN0cm95IHNjYWxlciB5ZXQuCiAgICAgICAgLy90aGlzIGNhbiBiZSBwcm9ibGVtIG9mIHBhcnRpY3VsYXIgY29udGV4dCAoZS5nLiB3aXRoIGJhZCB0cmFuc2Zvcm0pCiAgICAgICAgcmV0dXJuIHB0cl90b19qbG9uZyhnZXROdWxsR2x5cGhJbWFnZSgpKTsKICAgIH0KCiAgICBmdGdseXBoID0gc2NhbGVySW5mby0+ZmFjZS0+Z2x5cGg7CgogICAgLyogYXBwbHkgc3R5bGVzICovCiAgICBpZiAoY29udGV4dC0+ZG9Cb2xkKSB7IC8qIGlmIGJvbGQgc3R5bGUgKi8KICAgICAgICBGVF9HbHlwaFNsb3RfRW1ib2xkZW4oZnRnbHlwaCk7CiAgICB9CiAgICBpZiAoY29udGV4dC0+ZG9JdGFsaXplKSB7IC8qIGlmIG9ibGlxdWUgKi8KICAgICAgICBGVF9HbHlwaFNsb3RfT2JsaXF1ZShmdGdseXBoKTsKICAgIH0KCiAgICAvKiBnZW5lcmF0ZSBiaXRtYXAgaWYgaXQgaXMgbm90IGRvbmUgeWV0CiAgICAgZS5nLiBpZiBhbGdvcml0aG1pYyBzdHlsaW5nIGlzIHBlcmZvcm1lZCBhbmQgc3R5bGUgd2FzIGFkZGVkIHRvIG91dGxpbmUgKi8KICAgIGlmIChmdGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUpIHsKICAgICAgICBGVF9SZW5kZXJfR2x5cGgoZnRnbHlwaCwgRlRfTE9BRF9UQVJHRVRfTU9ERSh0YXJnZXQpKTsKICAgIH0KCiAgICB3aWR0aCAgPSAoVUludDE2KSBmdGdseXBoLT5iaXRtYXAud2lkdGg7CiAgICBoZWlnaHQgPSAoVUludDE2KSBmdGdseXBoLT5iaXRtYXAucm93czsKCiAgICBpbWFnZVNpemUgPSB3aWR0aCpoZWlnaHQ7CiAgICBnbHlwaEluZm8gPSAoR2x5cGhJbmZvKikgbWFsbG9jKHNpemVvZihHbHlwaEluZm8pICsgaW1hZ2VTaXplKTsKICAgIGlmIChnbHlwaEluZm8gPT0gTlVMTCkgewogICAgICAgIGdseXBoSW5mbyA9IGdldE51bGxHbHlwaEltYWdlKCk7CiAgICAgICAgcmV0dXJuIHB0cl90b19qbG9uZyhnbHlwaEluZm8pOwogICAgfQogICAgZ2x5cGhJbmZvLT5jZWxsSW5mbyAgPSBOVUxMOwogICAgZ2x5cGhJbmZvLT5yb3dCeXRlcyAgPSB3aWR0aDsKICAgIGdseXBoSW5mby0+d2lkdGggICAgID0gd2lkdGg7CiAgICBnbHlwaEluZm8tPmhlaWdodCAgICA9IGhlaWdodDsKICAgIGdseXBoSW5mby0+dG9wTGVmdFggID0gKGZsb2F0KSAgZnRnbHlwaC0+Yml0bWFwX2xlZnQ7CiAgICBnbHlwaEluZm8tPnRvcExlZnRZICA9IChmbG9hdCkgLWZ0Z2x5cGgtPmJpdG1hcF90b3A7CgogICAgaWYgKGZ0Z2x5cGgtPmJpdG1hcC5waXhlbF9tb2RlID09ICBGVF9QSVhFTF9NT0RFX0xDRCkgewogICAgICAgIGdseXBoSW5mby0+d2lkdGggPSB3aWR0aC8zOwogICAgfSBlbHNlIGlmIChmdGdseXBoLT5iaXRtYXAucGl4ZWxfbW9kZSA9PSAgRlRfUElYRUxfTU9ERV9MQ0RfVikgewogICAgICAgIGdseXBoSW5mby0+aGVpZ2h0ID0gZ2x5cGhJbmZvLT5oZWlnaHQvMzsKICAgIH0KCiAgICBpZiAoY29udGV4dC0+Zm1UeXBlID09IFRFWFRfRk1fT04pIHsKICAgICAgICBkb3VibGUgYWR2aCA9IEZURml4ZWRUb0Zsb2F0KGZ0Z2x5cGgtPmxpbmVhckhvcmlBZHZhbmNlKTsKICAgICAgICBnbHlwaEluZm8tPmFkdmFuY2VYID0KICAgICAgICAgICAgKGZsb2F0KSAoYWR2aCAqIEZURml4ZWRUb0Zsb2F0KGNvbnRleHQtPnRyYW5zZm9ybS54eCkpOwogICAgICAgIGdseXBoSW5mby0+YWR2YW5jZVkgPQogICAgICAgICAgICAoZmxvYXQpIChhZHZoICogRlRGaXhlZFRvRmxvYXQoY29udGV4dC0+dHJhbnNmb3JtLnh5KSk7CiAgICB9IGVsc2UgewogICAgICAgIGlmICghZnRnbHlwaC0+YWR2YW5jZS55KSB7CiAgICAgICAgICAgIGdseXBoSW5mby0+YWR2YW5jZVggPQogICAgICAgICAgICAgICAgKGZsb2F0KSBST1VORChGVDI2RG90NlRvRmxvYXQoZnRnbHlwaC0+YWR2YW5jZS54KSk7CiAgICAgICAgICAgIGdseXBoSW5mby0+YWR2YW5jZVkgPSAwOwogICAgICAgIH0gZWxzZSBpZiAoIWZ0Z2x5cGgtPmFkdmFuY2UueCkgewogICAgICAgICAgICBnbHlwaEluZm8tPmFkdmFuY2VYID0gMDsKICAgICAgICAgICAgZ2x5cGhJbmZvLT5hZHZhbmNlWSA9CiAgICAgICAgICAgICAgICAoZmxvYXQpIFJPVU5EKEZUMjZEb3Q2VG9GbG9hdCgtZnRnbHlwaC0+YWR2YW5jZS55KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2x5cGhJbmZvLT5hZHZhbmNlWCA9IEZUMjZEb3Q2VG9GbG9hdChmdGdseXBoLT5hZHZhbmNlLngpOwogICAgICAgICAgICBnbHlwaEluZm8tPmFkdmFuY2VZID0gRlQyNkRvdDZUb0Zsb2F0KC1mdGdseXBoLT5hZHZhbmNlLnkpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoaW1hZ2VTaXplID09IDApIHsKICAgICAgICBnbHlwaEluZm8tPmltYWdlID0gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2x5cGhJbmZvLT5pbWFnZSA9ICh1bnNpZ25lZCBjaGFyKikgZ2x5cGhJbmZvICsgc2l6ZW9mKEdseXBoSW5mbyk7CiAgICAgICAgLy9jb252ZXJ0IHJlc3VsdCB0byBvdXRwdXQgZm9ybWF0CiAgICAgICAgLy9vdXRwdXQgZm9ybWF0IGlzIGVpdGhlciAzIGJ5dGVzIHBlciBwaXhlbCAoZm9yIHN1YnBpeGVsIG1vZGVzKQogICAgICAgIC8vIG9yIDEgYnl0ZSBwZXIgcGl4ZWwgZm9yIEFBIGFuZCBCJlcKICAgICAgICBpZiAoZnRnbHlwaC0+Yml0bWFwLnBpeGVsX21vZGUgPT0gIEZUX1BJWEVMX01PREVfTU9OTykgewogICAgICAgICAgICAvKiBjb252ZXJ0IGZyb20gOCBwaXhlbHMgcGVyIGJ5dGUgdG8gMSBieXRlIHBlciBwaXhlbCAqLwogICAgICAgICAgICBDb3B5QlcyR3JleTgoZnRnbHlwaC0+Yml0bWFwLmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0Z2x5cGgtPmJpdG1hcC5waXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGdseXBoSW5mby0+aW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKICAgICAgICB9IGVsc2UgaWYgKGZ0Z2x5cGgtPmJpdG1hcC5waXhlbF9tb2RlID09ICBGVF9QSVhFTF9NT0RFX0dSQVkpIHsKICAgICAgICAgICAgLyogYnl0ZSBwZXIgcGl4ZWwgdG8gYnl0ZSBwZXIgcGl4ZWwgPT4ganVzdCBjb3B5ICovCiAgICAgICAgICAgIG1lbWNweShnbHlwaEluZm8tPmltYWdlLCBmdGdseXBoLT5iaXRtYXAuYnVmZmVyLCBpbWFnZVNpemUpOwogICAgICAgIH0gZWxzZSBpZiAoZnRnbHlwaC0+Yml0bWFwLnBpeGVsX21vZGUgPT0gIEZUX1BJWEVMX01PREVfR1JBWTQpIHsKICAgICAgICAgICAgLyogNCBiaXRzIHBlciBwaXhlbCB0byBieXRlIHBlciBwaXhlbCAqLwogICAgICAgICAgICBDb3B5R3JleTRUb0dyZXk4KGZ0Z2x5cGgtPmJpdG1hcC5idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRnbHlwaC0+Yml0bWFwLnBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGdseXBoSW5mby0+aW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKICAgICAgICB9IGVsc2UgaWYgKGZ0Z2x5cGgtPmJpdG1hcC5waXhlbF9tb2RlID09ICBGVF9QSVhFTF9NT0RFX0xDRCkgewogICAgICAgICAgICAvKiAzIGJ5dGVzIHBlciBwaXhlbCB0byAzIGJ5dGVzIHBlciBwaXhlbCAqLwogICAgICAgICAgICBDb3B5RlRTdWJwaXhlbFRvU3VicGl4ZWwoZnRnbHlwaC0+Yml0bWFwLmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0Z2x5cGgtPmJpdG1hcC5waXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGdseXBoSW5mby0+aW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKICAgICAgICB9IGVsc2UgaWYgKGZ0Z2x5cGgtPmJpdG1hcC5waXhlbF9tb2RlID09ICBGVF9QSVhFTF9NT0RFX0xDRF9WKSB7CiAgICAgICAgICAgIC8qIDMgYnl0ZXMgcGVyIHBpeGVsIHRvIDMgYnl0ZXMgcGVyIHBpeGVsICovCiAgICAgICAgICAgIENvcHlGVFN1YnBpeGVsVlRvU3VicGl4ZWwoZnRnbHlwaC0+Yml0bWFwLmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGdseXBoLT5iaXRtYXAucGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgZ2x5cGhJbmZvLT5pbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCozLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CiAgICAgICAgICAgIGdseXBoSW5mby0+cm93Qnl0ZXMgKj0zOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZyZWUoZ2x5cGhJbmZvKTsKICAgICAgICAgICAgZ2x5cGhJbmZvID0gZ2V0TnVsbEdseXBoSW1hZ2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHB0cl90b19qbG9uZyhnbHlwaEluZm8pOwp9CgoKLyoKICogQ2xhc3M6ICAgICBzdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXIKICogTWV0aG9kOiAgICBnZXRMYXlvdXRUYWJsZUNhY2hlTmF0aXZlCiAqIFNpZ25hdHVyZTogKEopSgogKi8KSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0TGF5b3V0VGFibGVDYWNoZU5hdGl2ZSgKICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCBzY2FsZXIsIGpsb25nIHBTY2FsZXIpIHsKICAgIEZUU2NhbGVySW5mbyAqc2NhbGVySW5mbyA9IChGVFNjYWxlckluZm8qKSBqbG9uZ190b19wdHIocFNjYWxlcik7CgogICAgaWYgKHNjYWxlckluZm8gPT0gTlVMTCkgewogICAgICAgIGludmFsaWRhdGVKYXZhU2NhbGVyKGVudiwgc2NhbGVyLCBzY2FsZXJJbmZvKTsKICAgICAgICByZXR1cm4gMEw7CiAgICB9CgogICAgLy8gaW5pdCBsYXlvdXQgdGFibGUgY2FjaGUgaW4gZm9udAogICAgLy8gd2UncmUgYXNzdW1pbmcgdGhlIGZvbnQgaXMgYSBmaWxlIGZvbnQgYW5kIG1vcmVvdmVyIGl0IGlzIFRydWV0eXBlIGZvbnQKICAgIC8vIG90aGVyd2lzZSB3ZSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgaGVyZS4uLgogICAgaWYgKHNjYWxlckluZm8tPmxheW91dFRhYmxlcyA9PSBOVUxMKSB7CiAgICAgICAgc2NhbGVySW5mby0+bGF5b3V0VGFibGVzID0gbmV3TGF5b3V0VGFibGVDYWNoZSgpOwogICAgfQoKICAgIHJldHVybiBwdHJfdG9famxvbmcoc2NhbGVySW5mby0+bGF5b3V0VGFibGVzKTsKfQoKLyoKICogQ2xhc3M6ICAgICBzdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXIKICogTWV0aG9kOiAgICBkaXNwb3NlTmF0aXZlU2NhbGVyCiAqIFNpZ25hdHVyZTogKEopVgogKi8KSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTApKYXZhX3N1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcl9kaXNwb3NlTmF0aXZlU2NhbGVyKAogICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHNjYWxlciwgamxvbmcgcFNjYWxlcikgewogICAgRlRTY2FsZXJJbmZvKiBzY2FsZXJJbmZvID0gKEZUU2NhbGVySW5mbyAqKSBqbG9uZ190b19wdHIocFNjYWxlcik7CgogICAgLyogRnJlZXR5cGUgZnVuY3Rpb25zICptYXkqIGNhdXNlIGNhbGxiYWNrIHRvIGphdmEKICAgICAgIHRoYXQgY2FuIHVzZSBjYWNoZWQgdmFsdWVzLiBNYWtlIHN1cmUgb3VyIGNhY2hlIGlzIHVwIHRvIGRhdGUuCiAgICAgICBOQjogc2NhbGVyIGNvbnRleHQgaXMgbm90IGltcG9ydGFudCBhdCB0aGlzIHBvaW50LCBjYW4gdXNlIE5VTEwuICovCiAgICBpbnQgZXJyQ29kZSA9IHNldHVwRlRDb250ZXh0KGVudiwgc2NhbGVyLCBzY2FsZXJJbmZvLCBOVUxMKTsKICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZyZWVOYXRpdmVSZXNvdXJjZXMoZW52LCBzY2FsZXJJbmZvKTsKfQoKLyoKICogQ2xhc3M6ICAgICBzdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXIKICogTWV0aG9kOiAgICBnZXROdW1HbHlwaHNOYXRpdmUKICogU2lnbmF0dXJlOiAoKUkKICovCkpOSUVYUE9SVCBqaW50IEpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0TnVtR2x5cGhzTmF0aXZlKAogICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHNjYWxlciwgamxvbmcgcFNjYWxlcikgewogICAgRlRTY2FsZXJJbmZvKiBzY2FsZXJJbmZvID0gKEZUU2NhbGVySW5mbyAqKSBqbG9uZ190b19wdHIocFNjYWxlcik7CgogICAgaWYgKHNjYWxlckluZm8gPT0gTlVMTCB8fCBzY2FsZXJJbmZvLT5mYWNlID09IE5VTEwpIHsgLyogYmFkL251bGwgc2NhbGVyICovCiAgICAgICAgLyogbnVsbCBzY2FsZXIgY2FuIHJlbmRlciAxIGdseXBoIC0gIm1pc3NpbmcgZ2x5cGgiIHdpdGggY29kZSAwCiAgICAgICAgICAgKGFsbCBnbHlwaCBjb2RlcyByZXF1ZXN0ZWQgYnkgdXNlciBhcmUgbWFwcGVkIHRvIGNvZGUgMCBhdAogICAgICAgICAgIHZhbGlkYXRpb24gc3RlcCkgKi8KICAgICAgICBpbnZhbGlkYXRlSmF2YVNjYWxlcihlbnYsIHNjYWxlciwgc2NhbGVySW5mbyk7CiAgICAgICAgcmV0dXJuIChqaW50KSAxOwogICAgfQoKICAgIHJldHVybiAoamludCkgc2NhbGVySW5mby0+ZmFjZS0+bnVtX2dseXBoczsKfQoKLyoKICogQ2xhc3M6ICAgICBzdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXIKICogTWV0aG9kOiAgICBnZXRNaXNzaW5nR2x5cGhDb2RlTmF0aXZlCiAqIFNpZ25hdHVyZTogKClJCiAqLwpKTklFWFBPUlQgamludCBKTklDQUxMCkphdmFfc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyX2dldE1pc3NpbmdHbHlwaENvZGVOYXRpdmUoCiAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3Qgc2NhbGVyLCBqbG9uZyBwU2NhbGVyKSB7CgogICAgLyogSXMgaXQgYWx3YXlzIDAgZm9yIGZyZWV0eXBlPyAqLwogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIENsYXNzOiAgICAgc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyCiAqIE1ldGhvZDogICAgZ2V0R2x5cGhDb2RlTmF0aXZlCiAqIFNpZ25hdHVyZTogKEMpSQogKi8KSk5JRVhQT1JUIGppbnQgSk5JQ0FMTApKYXZhX3N1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcl9nZXRHbHlwaENvZGVOYXRpdmUoCiAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3Qgc2NhbGVyLCBqbG9uZyBwU2NhbGVyLCBqY2hhciBjaGFyQ29kZSkgewoKICAgIEZUU2NhbGVySW5mbyogc2NhbGVySW5mbyA9IChGVFNjYWxlckluZm8gKikgamxvbmdfdG9fcHRyKHBTY2FsZXIpOwogICAgaW50IGVyckNvZGU7CgogICAgaWYgKHNjYWxlciA9PSBOVUxMIHx8IHNjYWxlckluZm8tPmZhY2UgPT0gTlVMTCkgeyAvKiBiYWQvbnVsbCBzY2FsZXIgKi8KICAgICAgICBpbnZhbGlkYXRlSmF2YVNjYWxlcihlbnYsIHNjYWxlciwgc2NhbGVySW5mbyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogRnJlZXR5cGUgZnVuY3Rpb25zICptYXkqIGNhdXNlIGNhbGxiYWNrIHRvIGphdmEKICAgICAgIHRoYXQgY2FuIHVzZSBjYWNoZWQgdmFsdWVzLiBNYWtlIHN1cmUgb3VyIGNhY2hlIGlzIHVwIHRvIGRhdGUuCiAgICAgICBTY2FsZXIgY29udGV4dCBpcyBub3QgaW1wb3J0YW50IGhlcmUsIGNhbiB1c2UgTlVMTC4gKi8KICAgIGVyckNvZGUgPSBzZXR1cEZUQ29udGV4dChlbnYsIHNjYWxlciwgc2NhbGVySW5mbywgTlVMTCk7CiAgICBpZiAoZXJyQ29kZSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHJldHVybiBGVF9HZXRfQ2hhcl9JbmRleChzY2FsZXJJbmZvLT5mYWNlLCBjaGFyQ29kZSk7Cn0KCgojZGVmaW5lIEZsb2F0VG9GMjZEb3Q2KHgpICgodW5zaWduZWQgaW50KSAoKHgpKjY0KSkKCnN0YXRpYyBGVF9PdXRsaW5lKiBnZXRGVE91dGxpbmUoSk5JRW52KiBlbnYsIGpvYmplY3QgZm9udDJELAogICAgICAgIEZUU2NhbGVyQ29udGV4dCAqY29udGV4dCwgRlRTY2FsZXJJbmZvKiBzY2FsZXJJbmZvLAogICAgICAgIGppbnQgZ2x5cGhDb2RlLCBqZmxvYXQgeHBvcywgamZsb2F0IHlwb3MpIHsKICAgIGludCByZW5kZXJGbGFnczsKICAgIGludCBnbHlwaF9pbmRleDsKICAgIEZUX0Vycm9yIGVycm9yOwogICAgRlRfR2x5cGhTbG90IGZ0Z2x5cGg7CgogICAgaWYgKGdseXBoQ29kZSA+PSBJTlZJU0lCTEVfR0xZUEhTIHx8CiAgICAgICAgICAgIGlzTnVsbFNjYWxlckNvbnRleHQoY29udGV4dCkgfHwgc2NhbGVySW5mbyA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZXJyb3IgPSBzZXR1cEZUQ29udGV4dChlbnYsIGZvbnQyRCwgc2NhbGVySW5mbywgY29udGV4dCk7CiAgICBpZiAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByZW5kZXJGbGFncyA9IEZUX0xPQURfTk9fSElOVElORyB8IEZUX0xPQURfTk9fQklUTUFQOwoKICAgIGdseXBoX2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoc2NhbGVySW5mby0+ZmFjZSwgZ2x5cGhDb2RlKTsKCiAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoc2NhbGVySW5mby0+ZmFjZSwgZ2x5cGhDb2RlLCByZW5kZXJGbGFncyk7CiAgICBpZiAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBmdGdseXBoID0gc2NhbGVySW5mby0+ZmFjZS0+Z2x5cGg7CgogICAgLyogYXBwbHkgc3R5bGVzICovCiAgICBpZiAoY29udGV4dC0+ZG9Cb2xkKSB7IC8qIGlmIGJvbGQgc3R5bGUgKi8KICAgICAgICBGVF9HbHlwaFNsb3RfRW1ib2xkZW4oZnRnbHlwaCk7CiAgICB9CiAgICBpZiAoY29udGV4dC0+ZG9JdGFsaXplKSB7IC8qIGlmIG9ibGlxdWUgKi8KICAgICAgICBGVF9HbHlwaFNsb3RfT2JsaXF1ZShmdGdseXBoKTsKICAgIH0KCiAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSgmZnRnbHlwaC0+b3V0bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0VG9GMjZEb3Q2KHhwb3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgLUZsb2F0VG9GMjZEb3Q2KHlwb3MpKTsKCiAgICByZXR1cm4gJmZ0Z2x5cGgtPm91dGxpbmU7Cn0KCiNkZWZpbmUgRjI2RG90NlRvRmxvYXQobikgKCgoZmxvYXQpKG4pKS8oKGZsb2F0KSA2NCkpCgovKiBUeXBlcyBvZiBHZW5lcmFsUGF0aCBzZWdtZW50cy4KICAgVE9ETzogcHVsbCBjb25zdGFudHMgZnJvbSBvdGhlciBwbGFjZT8gKi8KCiNkZWZpbmUgU0VHX1VOS05PV04gLTEKI2RlZmluZSBTRUdfTU9WRVRPICAgMAojZGVmaW5lIFNFR19MSU5FVE8gICAxCiNkZWZpbmUgU0VHX1FVQURUTyAgIDIKI2RlZmluZSBTRUdfQ1VCSUNUTyAgMwojZGVmaW5lIFNFR19DTE9TRSAgICA0CgojZGVmaW5lIFdJTkRfTk9OX1pFUk8gMAojZGVmaW5lIFdJTkRfRVZFTl9PREQgMQoKLyogUGxhY2Vob2xkZXIgdG8gYWNjdW11bGF0ZSBHZW5lcmFsUGF0aCBkYXRhICovCnR5cGVkZWYgc3RydWN0IHsKICAgIGppbnQgbnVtVHlwZXM7CiAgICBqaW50IG51bUNvb3JkczsKICAgIGppbnQgbGVuVHlwZXM7CiAgICBqaW50IGxlbkNvb3JkczsKICAgIGppbnQgd3I7CiAgICBqYnl0ZSogcG9pbnRUeXBlczsKICAgIGpmbG9hdCogcG9pbnRDb29yZHM7Cn0gR1BEYXRhOwoKLyogcmV0dXJucyAwIG9uIGZhaWx1cmUgKi8Kc3RhdGljIGludCBhbGxvY2F0ZVNwYWNlRm9yR1AoR1BEYXRhKiBncGRhdGEsIGludCBucG9pbnRzLCBpbnQgbmNvbnRvdXJzKSB7CiAgICBpbnQgbWF4VHlwZXMsIG1heENvb3JkczsKCiAgICAvKiB3ZSBtYXkgaGF2ZSB1cCB0byBOIGludGVybWVkaWF0ZSBwb2ludHMgcGVyIGNvbnRvdXIKICAgICAgIChhbmQgZm9yIGVhY2ggcG9pbnQgY2FuIGFjdHVhbGx5IGNhdXNlIG5ldyBjdXJ2ZSB0byBiZSBnZW5lcmF0ZWQpCiAgICAgICBJbiBhZGRpdGlvbiB3ZSBjYW4gYWxzbyBoYXZlIDIgZXh0cmEgcG9pbnQgcGVyIG91dGxpbmUuCiAgICAgKi8KICAgIG1heFR5cGVzICA9IDIqbnBvaW50cyAgKyAyKm5jb250b3VyczsKICAgIG1heENvb3JkcyA9IDQqKG5wb2ludHMgKyAyKm5jb250b3Vycyk7IC8vd2UgbWF5IG5lZWQgdG8gaW5zZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwIHRvIG4tMSBpbnRlcm1lZGlhdGUgcG9pbnRzCgogICAgLyogZmlyc3QgdXNhZ2UgLSBhbGxvY2F0ZSBzcGFjZSBhbmQgaW50aWFsaXplIGFsbCBmaWVsZHMgKi8KICAgIGlmIChncGRhdGEtPnBvaW50VHlwZXMgPT0gTlVMTCB8fCBncGRhdGEtPnBvaW50Q29vcmRzID09IE5VTEwpIHsKICAgICAgICBncGRhdGEtPmxlblR5cGVzICA9IG1heFR5cGVzOwogICAgICAgIGdwZGF0YS0+bGVuQ29vcmRzID0gbWF4Q29vcmRzOwogICAgICAgIGdwZGF0YS0+cG9pbnRUeXBlcyAgPSAoamJ5dGUqKQogICAgICAgICAgICAgbWFsbG9jKGdwZGF0YS0+bGVuVHlwZXMqc2l6ZW9mKGpieXRlKSk7CiAgICAgICAgZ3BkYXRhLT5wb2ludENvb3JkcyA9IChqZmxvYXQqKQogICAgICAgICAgICAgbWFsbG9jKGdwZGF0YS0+bGVuQ29vcmRzKnNpemVvZihqZmxvYXQpKTsKICAgICAgICBncGRhdGEtPm51bVR5cGVzID0gMDsKICAgICAgICBncGRhdGEtPm51bUNvb3JkcyA9IDA7CiAgICAgICAgZ3BkYXRhLT53ciA9IFdJTkRfTk9OX1pFUk87IC8qIEJ5IGRlZmF1bHQsIG91dGxpbmVzIGFyZSBmaWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIG5vbi16ZXJvIHdpbmRpbmcgcnVsZS4gKi8KICAgIH0gZWxzZSB7CiAgICAgICAgLyogZG8gd2UgaGF2ZSBlbm91Z2ggc3BhY2U/ICovCiAgICAgICAgaWYgKGdwZGF0YS0+bGVuVHlwZXMgLSBncGRhdGEtPm51bVR5cGVzIDwgbWF4VHlwZXMpIHsKICAgICAgICAgICAgZ3BkYXRhLT5sZW5UeXBlcyAgKz0gbWF4VHlwZXM7CiAgICAgICAgICAgIGdwZGF0YS0+cG9pbnRUeXBlcyAgPSAoamJ5dGUqKQogICAgICAgICAgICAgIHJlYWxsb2MoZ3BkYXRhLT5wb2ludFR5cGVzLCBncGRhdGEtPmxlblR5cGVzKnNpemVvZihqYnl0ZSkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGdwZGF0YS0+bGVuQ29vcmRzIC0gZ3BkYXRhLT5udW1Db29yZHMgPCBtYXhDb29yZHMpIHsKICAgICAgICAgICAgZ3BkYXRhLT5sZW5Db29yZHMgKz0gbWF4Q29vcmRzOwogICAgICAgICAgICBncGRhdGEtPnBvaW50Q29vcmRzID0gKGpmbG9hdCopCiAgICAgICAgICAgICAgcmVhbGxvYyhncGRhdGEtPnBvaW50Q29vcmRzLCBncGRhdGEtPmxlbkNvb3JkcypzaXplb2YoamZsb2F0KSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIGZhaWx1cmUgaWYgYW55IG9mIG1hbGxvY3MgZmFpbGVkICovCiAgICBpZiAoZ3BkYXRhLT5wb2ludFR5cGVzID09IE5VTEwgfHwgIGdwZGF0YS0+cG9pbnRDb29yZHMgPT0gTlVMTCkKICAgICAgICByZXR1cm4gMDsKICAgIGVsc2UKICAgICAgICByZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgYWRkVG9HUChHUERhdGEqIGdwZGF0YSwgRlRfT3V0bGluZSpvdXRsaW5lKSB7CiAgICBqYnl0ZSBjdXJyZW50X3R5cGU9U0VHX1VOS05PV047CiAgICBpbnQgaSwgajsKICAgIGpmbG9hdCB4LCB5OwoKICAgIGogPSAwOwogICAgZm9yKGk9MDsgaTxvdXRsaW5lLT5uX3BvaW50czsgaSsrKSB7CiAgICAgICAgeCA9ICBGMjZEb3Q2VG9GbG9hdChvdXRsaW5lLT5wb2ludHNbaV0ueCk7CiAgICAgICAgeSA9IC1GMjZEb3Q2VG9GbG9hdChvdXRsaW5lLT5wb2ludHNbaV0ueSk7CgogICAgICAgIGlmIChGVF9DVVJWRV9UQUcob3V0bGluZS0+dGFnc1tpXSkgPT0gRlRfQ1VSVkVfVEFHX09OKSB7CiAgICAgICAgICAgIC8qIElmIGJpdCAwIGlzIHVuc2V0LCB0aGUgcG9pbnQgaXMgIm9mZiIgdGhlIGN1cnZlLAogICAgICAgICAgICAgaS5lLiwgYSBCZXppZXIgY29udHJvbCBwb2ludCwgd2hpbGUgaXQgaXMgIm9uIiB3aGVuIHNldC4gKi8KICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBTRUdfVU5LTk9XTikgeyAvKiBzcGVjaWFsIGNhc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyeSBmaXJzdCBwb2ludCAqLwogICAgICAgICAgICAgICAgLyogYWRkIHNlZ21lbnQgKi8KICAgICAgICAgICAgICAgIGdwZGF0YS0+cG9pbnRUeXBlc1tncGRhdGEtPm51bVR5cGVzKytdID0gU0VHX01PVkVUTzsKICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9IFNFR19MSU5FVE87CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBncGRhdGEtPnBvaW50VHlwZXNbZ3BkYXRhLT5udW1UeXBlcysrXSA9IGN1cnJlbnRfdHlwZTsKICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9IFNFR19MSU5FVE87CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IFNFR19VTktOT1dOKSB7IC8qIHNwZWNpYWwgY2FzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyeSBmaXJzdCBwb2ludCAqLwogICAgICAgICAgICAgICAgaWYgKEZUX0NVUlZFX1RBRyhvdXRsaW5lLT50YWdzW2krMV0pID09IEZUX0NVUlZFX1RBR19PTikgewogICAgICAgICAgICAgICAgICAgIC8qIGp1c3Qgc2tpcCBmaXJzdCBwb2ludC4gQWRob2MgaGV1cmlzdGljPyAqLwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB4ID0gKHggKyBGMjZEb3Q2VG9GbG9hdChvdXRsaW5lLT5wb2ludHNbaSsxXS54KSkvMjsKICAgICAgICAgICAgICAgICAgICB5ID0gKHkgLSBGMjZEb3Q2VG9GbG9hdChvdXRsaW5lLT5wb2ludHNbaSsxXS55KSkvMjsKICAgICAgICAgICAgICAgICAgICBncGRhdGEtPnBvaW50VHlwZXNbZ3BkYXRhLT5udW1UeXBlcysrXSA9IFNFR19NT1ZFVE87CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlID0gU0VHX0xJTkVUTzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChGVF9DVVJWRV9UQUcob3V0bGluZS0+dGFnc1tpXSkgPT0gRlRfQ1VSVkVfVEFHX0NVQklDKSB7CiAgICAgICAgICAgICAgICAvKiBCaXQgMSBpcyBtZWFuaW5nZnVsIGZvciCRb2ZmkiBwb2ludHMgb25seS4KICAgICAgICAgICAgICAgICAgIElmIHNldCwgaXQgaW5kaWNhdGVzIGEgdGhpcmQtb3JkZXIgQmV6aWVyIGFyYyBjb250cm9sCiAgICAgICAgICAgICAgICAgICBwb2ludDsgYW5kIGEgc2Vjb25kLW9yZGVyIGNvbnRyb2wgcG9pbnQgaWYgdW5zZXQuICAqLwogICAgICAgICAgICAgICAgY3VycmVudF90eXBlID0gU0VHX0NVQklDVE87CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiB0d28gc3VjY2Vzc2l2ZSBjb25pYyAib2ZmIiBwb2ludHMgZm9yY2VzIHRoZSByYXN0ZXJpemVyCiAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgKGR1cmluZyB0aGUgc2Nhbi1saW5lIGNvbnZlcnNpb24gcHJvY2VzcwogICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlbHkpIGEgdmlydHVhbCAib24iIHBvaW50IGFtaWRzdCB0aGVtLCBhdCB0aGVpcgogICAgICAgICAgICAgICAgICAgZXhhY3QgbWlkZGxlLiBUaGlzIGdyZWF0bHkgZmFjaWxpdGF0ZXMgdGhlIGRlZmluaXRpb24gb2YKICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmUgY29uaWMgQmV6aWVyIGFyY3MuICBNb3Jlb3ZlciwgaXQgaXMgdGhlIHdheQogICAgICAgICAgICAgICAgICAgb3V0bGluZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gKi8KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gU0VHX1FVQURUTykgewogICAgICAgICAgICAgICAgICAgIGdwZGF0YS0+cG9pbnRDb29yZHNbZ3BkYXRhLT5udW1Db29yZHMrK10gPQogICAgICAgICAgICAgICAgICAgICAgICBGMjZEb3Q2VG9GbG9hdChvdXRsaW5lLT5wb2ludHNbaV0ueCArCiAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tpLTFdLngpLzI7CiAgICAgICAgICAgICAgICAgICAgZ3BkYXRhLT5wb2ludENvb3Jkc1tncGRhdGEtPm51bUNvb3JkcysrXSA9CiAgICAgICAgICAgICAgICAgICAgICAgIC0gRjI2RG90NlRvRmxvYXQob3V0bGluZS0+cG9pbnRzW2ldLnkgKwogICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbaS0xXS55KS8yOwogICAgICAgICAgICAgICAgICAgIGdwZGF0YS0+cG9pbnRUeXBlc1tncGRhdGEtPm51bVR5cGVzKytdID0gU0VHX1FVQURUTzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9IFNFR19RVUFEVE87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ3BkYXRhLT5wb2ludENvb3Jkc1tncGRhdGEtPm51bUNvb3JkcysrXSA9IHg7CiAgICAgICAgZ3BkYXRhLT5wb2ludENvb3Jkc1tncGRhdGEtPm51bUNvb3JkcysrXSA9IHk7CiAgICAgICAgaWYgKG91dGxpbmUtPmNvbnRvdXJzW2pdID09IGkpIHsgLy9lbmQgb2YgY29udG91cgogICAgICAgICAgICBpbnQgc3RhcnQgPSBqID4gMCA/IG91dGxpbmUtPmNvbnRvdXJzW2otMV0rMSA6IDA7CiAgICAgICAgICAgIGdwZGF0YS0+cG9pbnRUeXBlc1tncGRhdGEtPm51bVR5cGVzKytdID0gY3VycmVudF90eXBlOwogICAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IFNFR19RVUFEVE8gJiYKICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKG91dGxpbmUtPnRhZ3Nbc3RhcnRdKSAhPSBGVF9DVVJWRV9UQUdfT04pIHsKICAgICAgICAgICAgICAgIGdwZGF0YS0+cG9pbnRDb29yZHNbZ3BkYXRhLT5udW1Db29yZHMrK10gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKEYyNkRvdDZUb0Zsb2F0KG91dGxpbmUtPnBvaW50c1tzdGFydF0ueCkgKyB4KS8yOwogICAgICAgICAgICAgICAgZ3BkYXRhLT5wb2ludENvb3Jkc1tncGRhdGEtPm51bUNvb3JkcysrXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLUYyNkRvdDZUb0Zsb2F0KG91dGxpbmUtPnBvaW50c1tzdGFydF0ueSkgKyB5KS8yOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ3BkYXRhLT5wb2ludENvb3Jkc1tncGRhdGEtPm51bUNvb3JkcysrXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMjZEb3Q2VG9GbG9hdChvdXRsaW5lLT5wb2ludHNbc3RhcnRdLngpOwogICAgICAgICAgICAgICAgZ3BkYXRhLT5wb2ludENvb3Jkc1tncGRhdGEtPm51bUNvb3JkcysrXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRjI2RG90NlRvRmxvYXQob3V0bGluZS0+cG9pbnRzW3N0YXJ0XS55KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBncGRhdGEtPnBvaW50VHlwZXNbZ3BkYXRhLT5udW1UeXBlcysrXSA9IFNFR19DTE9TRTsKICAgICAgICAgICAgY3VycmVudF90eXBlID0gU0VHX1VOS05PV047CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICB9CgogICAgLyogSWYgc2V0IHRvIDEsIHRoZSBvdXRsaW5lIHdpbGwgYmUgZmlsbGVkIHVzaW5nIHRoZSBldmVuLW9kZCBmaWxsIHJ1bGUgKi8KICAgIGlmIChvdXRsaW5lLT5mbGFncyAmIEZUX09VVExJTkVfRVZFTl9PRERfRklMTCkgewogICAgICAgIGdwZGF0YS0+d3IgPSBXSU5EX0VWRU5fT0REOwogICAgfQp9CgpzdGF0aWMgdm9pZCBmcmVlR1AoR1BEYXRhKiBncGRhdGEpIHsKICAgIGlmIChncGRhdGEtPnBvaW50Q29vcmRzICE9IE5VTEwpIHsKICAgICAgICBmcmVlKGdwZGF0YS0+cG9pbnRDb29yZHMpOwogICAgICAgIGdwZGF0YS0+cG9pbnRDb29yZHMgPSBOVUxMOwogICAgICAgIGdwZGF0YS0+bnVtQ29vcmRzID0gMDsKICAgICAgICBncGRhdGEtPmxlbkNvb3JkcyA9IDA7CiAgICB9CiAgICBpZiAoZ3BkYXRhLT5wb2ludFR5cGVzICE9IE5VTEwpIHsKICAgICAgICBmcmVlKGdwZGF0YS0+cG9pbnRUeXBlcyk7CiAgICAgICAgZ3BkYXRhLT5wb2ludFR5cGVzID0gTlVMTDsKICAgICAgICBncGRhdGEtPm51bVR5cGVzID0gMDsKICAgICAgICBncGRhdGEtPmxlblR5cGVzID0gMDsKICAgIH0KfQoKc3RhdGljIGpvYmplY3QgZ2V0R2x5cGhHZW5lcmFsUGF0aChKTklFbnYqIGVudiwgam9iamVjdCBmb250MkQsCiAgICAgICAgRlRTY2FsZXJDb250ZXh0ICpjb250ZXh0LCBGVFNjYWxlckluZm8gKnNjYWxlckluZm8sCiAgICAgICAgamludCBnbHlwaENvZGUsIGpmbG9hdCB4cG9zLCBqZmxvYXQgeXBvcykgewoKICAgIEZUX091dGxpbmUqIG91dGxpbmU7CiAgICBqb2JqZWN0IGdwID0gTlVMTDsKICAgIGpieXRlQXJyYXkgdHlwZXM7CiAgICBqZmxvYXRBcnJheSBjb29yZHM7CiAgICBHUERhdGEgZ3BkYXRhOwoKICAgIG91dGxpbmUgPSBnZXRGVE91dGxpbmUoZW52LCBmb250MkQsIGNvbnRleHQsIHNjYWxlckluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoQ29kZSwgeHBvcywgeXBvcyk7CgogICAgaWYgKG91dGxpbmUgPT0gTlVMTCB8fCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwKSB7CiAgICAgICAgcmV0dXJuIGdwOwogICAgfQoKICAgIGdwZGF0YS5wb2ludFR5cGVzICA9IE5VTEw7CiAgICBncGRhdGEucG9pbnRDb29yZHMgPSBOVUxMOwogICAgaWYgKCFhbGxvY2F0ZVNwYWNlRm9yR1AoJmdwZGF0YSwgb3V0bGluZS0+bl9wb2ludHMsIG91dGxpbmUtPm5fY29udG91cnMpKSB7CiAgICAgICAgcmV0dXJuIGdwOwogICAgfQoKICAgIGFkZFRvR1AoJmdwZGF0YSwgb3V0bGluZSk7CgogICAgdHlwZXMgID0gKCplbnYpLT5OZXdCeXRlQXJyYXkoZW52LCBncGRhdGEubnVtVHlwZXMpOwogICAgY29vcmRzID0gKCplbnYpLT5OZXdGbG9hdEFycmF5KGVudiwgZ3BkYXRhLm51bUNvb3Jkcyk7CgogICAgaWYgKHR5cGVzICYmIGNvb3JkcykgewogICAgICAgICgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgdHlwZXMsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BkYXRhLm51bVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZGF0YS5wb2ludFR5cGVzKTsKICAgICAgICAoKmVudiktPlNldEZsb2F0QXJyYXlSZWdpb24oZW52LCBjb29yZHMsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZGF0YS5udW1Db29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZGF0YS5wb2ludENvb3Jkcyk7CiAgICAgICAgZ3AgPSAoKmVudiktPk5ld09iamVjdChlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLmdwQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLmdwQ3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BkYXRhLndyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGRhdGEubnVtVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGRhdGEubnVtQ29vcmRzKTsKICAgIH0KCiAgICBmcmVlR1AoJmdwZGF0YSk7CgogICAgcmV0dXJuIGdwOwp9CgovKgogKiBDbGFzczogICAgIHN1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcgogKiBNZXRob2Q6ICAgIGdldEdseXBoT3V0bGluZU5hdGl2ZQogKiBTaWduYXR1cmU6IChMc3VuL2ZvbnQvRm9udDJEO0pJRkYpTGphdmEvYXd0L2dlb20vR2VuZXJhbFBhdGg7CiAqLwpKTklFWFBPUlQgam9iamVjdCBKTklDQUxMCkphdmFfc3VuX2ZvbnRfRnJlZXR5cGVGb250U2NhbGVyX2dldEdseXBoT3V0bGluZU5hdGl2ZSgKICAgICAgSk5JRW52ICplbnYsIGpvYmplY3Qgc2NhbGVyLCBqb2JqZWN0IGZvbnQyRCwgamxvbmcgcFNjYWxlckNvbnRleHQsCiAgICAgIGpsb25nIHBTY2FsZXIsIGppbnQgZ2x5cGhDb2RlLCBqZmxvYXQgeHBvcywgamZsb2F0IHlwb3MpIHsKCiAgICBGVFNjYWxlckNvbnRleHQgKmNvbnRleHQgPQogICAgICAgICAoRlRTY2FsZXJDb250ZXh0KikgamxvbmdfdG9fcHRyKHBTY2FsZXJDb250ZXh0KTsKICAgIEZUU2NhbGVySW5mbyogc2NhbGVySW5mbyA9IChGVFNjYWxlckluZm8gKikgamxvbmdfdG9fcHRyKHBTY2FsZXIpOwoKICAgIGpvYmplY3QgZ3AgPSBnZXRHbHlwaEdlbmVyYWxQYXRoKGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQyRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlwb3MpOwogICAgaWYgKGdwID09IE5VTEwpIHsgLyogY2FuIGJlIGxlZ2FsICovCiAgICAgICAgZ3AgPSAoKmVudiktPk5ld09iamVjdChlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLmdwQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLmdwQ3RyRW1wdHkpOwogICAgfQogICAgcmV0dXJuIGdwOwp9CgovKgogKiBDbGFzczogICAgIHN1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcgogKiBNZXRob2Q6ICAgIGdldEdseXBoT3V0bGluZUJvdW5kc05hdGl2ZQogKiBTaWduYXR1cmU6IChMc3VuL2ZvbnQvRm9udDJEO0pJKUxqYXZhL2F3dC9nZW9tL1JlY3RhbmdsZTJEL0Zsb2F0OwogKi8KSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTApKYXZhX3N1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcl9nZXRHbHlwaE91dGxpbmVCb3VuZHNOYXRpdmUoCiAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3Qgc2NhbGVyLCBqb2JqZWN0IGZvbnQyRCwKICAgICAgICBqbG9uZyBwU2NhbGVyQ29udGV4dCwgamxvbmcgcFNjYWxlciwgamludCBnbHlwaENvZGUpIHsKCiAgICBGVF9PdXRsaW5lICpvdXRsaW5lOwogICAgRlRfQkJveCBiYm94OwogICAgaW50IGVycm9yOwogICAgam9iamVjdCBib3VuZHM7CgogICAgRlRTY2FsZXJDb250ZXh0ICpjb250ZXh0ID0KICAgICAgICAgKEZUU2NhbGVyQ29udGV4dCopIGpsb25nX3RvX3B0cihwU2NhbGVyQ29udGV4dCk7CiAgICBGVFNjYWxlckluZm8qIHNjYWxlckluZm8gPSAoRlRTY2FsZXJJbmZvICopIGpsb25nX3RvX3B0cihwU2NhbGVyKTsKCiAgICBvdXRsaW5lID0gZ2V0RlRPdXRsaW5lKGVudiwgZm9udDJELCBjb250ZXh0LCBzY2FsZXJJbmZvLCBnbHlwaENvZGUsIDAsIDApOwogICAgaWYgKG91dGxpbmUgPT0gTlVMTCB8fCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwKSB7CiAgICAgICAgLyogaXQgaXMgbGVnYWwgY2FzZSwgZS5nLiBpbnZpc2libGUgZ2x5cGggKi8KICAgICAgICBib3VuZHMgPSAoKmVudiktPk5ld09iamVjdChlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMucmVjdDJERmxvYXRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuRm9udElEcy5yZWN0MkRGbG9hdEN0cik7CiAgICAgICAgcmV0dXJuIGJvdW5kczsKICAgIH0KCiAgICBlcnJvciA9IEZUX091dGxpbmVfR2V0X0JCb3gob3V0bGluZSwgJmJib3gpOwoKICAgIC8vY29udmVydCBiYm94CiAgICBpZiAoZXJyb3IgfHwgYmJveC54TWluID49IGJib3gueE1heCB8fCBiYm94LnlNaW4gPj0gYmJveC55TWF4KSB7CiAgICAgICAgYm91bmRzID0gKCplbnYpLT5OZXdPYmplY3QoZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMucmVjdDJERmxvYXRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLnJlY3QyREZsb2F0Q3RyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYm91bmRzID0gKCplbnYpLT5OZXdPYmplY3QoZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMucmVjdDJERmxvYXRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLnJlY3QyREZsb2F0Q3RyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMjZEb3Q2VG9GbG9hdChiYm94LnhNaW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYyNkRvdDZUb0Zsb2F0KC1iYm94LnlNYXgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYyNkRvdDZUb0Zsb2F0KGJib3gueE1heC1iYm94LnhNaW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYyNkRvdDZUb0Zsb2F0KGJib3gueU1heC1iYm94LnlNaW4pKTsKICAgIH0KCiAgICByZXR1cm4gYm91bmRzOwp9CgovKgogKiBDbGFzczogICAgIHN1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcgogKiBNZXRob2Q6ICAgIGdldEdseXBoVmVjdG9yT3V0bGluZU5hdGl2ZQogKiBTaWduYXR1cmU6IChMc3VuL2ZvbnQvRm9udDJEO0pbSUlGRilMamF2YS9hd3QvZ2VvbS9HZW5lcmFsUGF0aDsKICovCkpOSUVYUE9SVCBqb2JqZWN0CkpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0R2x5cGhWZWN0b3JPdXRsaW5lTmF0aXZlKAogICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHNjYWxlciwgam9iamVjdCBmb250MkQsCiAgICAgICAgamxvbmcgcFNjYWxlckNvbnRleHQsIGpsb25nIHBTY2FsZXIsCiAgICAgICAgamludEFycmF5IGdseXBoQXJyYXksIGppbnQgbnVtR2x5cGhzLCBqZmxvYXQgeHBvcywgamZsb2F0IHlwb3MpIHsKCiAgICBGVF9PdXRsaW5lKiBvdXRsaW5lOwogICAgam9iamVjdCBncCA9IE5VTEw7CiAgICBqYnl0ZUFycmF5IHR5cGVzOwogICAgamZsb2F0QXJyYXkgY29vcmRzOwogICAgR1BEYXRhIGdwZGF0YTsKICAgIGludCBpOwogICAgamludCAqZ2x5cGhzOwoKICAgIEZUU2NhbGVyQ29udGV4dCAqY29udGV4dCA9CiAgICAgICAgIChGVFNjYWxlckNvbnRleHQqKSBqbG9uZ190b19wdHIocFNjYWxlckNvbnRleHQpOwogICAgRlRTY2FsZXJJbmZvICpzY2FsZXJJbmZvID0KICAgICAgICAgICAgIChGVFNjYWxlckluZm8qKSBqbG9uZ190b19wdHIocFNjYWxlcik7CgogICAgZ2x5cGhzID0gKGppbnQqKSBtYWxsb2MobnVtR2x5cGhzKnNpemVvZihqaW50KSk7CiAgICBpZiAoZ2x5cGhzID09IE5VTEwpIHsKICAgICAgICBncCA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgc3VuRm9udElEcy5ncENsYXNzLCBzdW5Gb250SURzLmdwQ3RyRW1wdHkpOwogICAgICAgIGlmICghaXNOdWxsU2NhbGVyQ29udGV4dChjb250ZXh0KSAmJiBzY2FsZXJJbmZvICE9IE5VTEwpIHsKICAgICAgICAgICAgaW52YWxpZGF0ZUphdmFTY2FsZXIoZW52LCBzY2FsZXIsIHNjYWxlckluZm8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZ3A7CiAgICB9CgogICAgKCplbnYpLT5HZXRJbnRBcnJheVJlZ2lvbihlbnYsIGdseXBoQXJyYXksIDAsIG51bUdseXBocywgZ2x5cGhzKTsKCiAgICBmb3IgKGk9MDsgaTxudW1HbHlwaHM7aSsrKSB7CiAgICAgICAgaWYgKGdseXBoc1tpXSA+PSBJTlZJU0lCTEVfR0xZUEhTKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBvdXRsaW5lID0gZ2V0RlRPdXRsaW5lKGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQyRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvcywgeXBvcyk7CgogICAgICAgIGlmIChvdXRsaW5lID09IE5VTEwgfHwgb3V0bGluZS0+bl9wb2ludHMgPT0gMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGdwZGF0YS5wb2ludFR5cGVzICA9IE5VTEw7CiAgICAgICAgZ3BkYXRhLnBvaW50Q29vcmRzID0gTlVMTDsKICAgICAgICBpZiAoIWFsbG9jYXRlU3BhY2VGb3JHUCgmZ3BkYXRhLCBvdXRsaW5lLT5uX3BvaW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGFkZFRvR1AoJmdwZGF0YSwgb3V0bGluZSk7CiAgICB9CiAgICBmcmVlKGdseXBocyk7CgogICAgaWYgKGdwZGF0YS5udW1Db29yZHMgIT0gMCkgewogICAgICB0eXBlcyA9ICgqZW52KS0+TmV3Qnl0ZUFycmF5KGVudiwgZ3BkYXRhLm51bVR5cGVzKTsKICAgICAgY29vcmRzID0gKCplbnYpLT5OZXdGbG9hdEFycmF5KGVudiwgZ3BkYXRhLm51bUNvb3Jkcyk7CgogICAgICBpZiAodHlwZXMgJiYgY29vcmRzKSB7CiAgICAgICAgKCplbnYpLT5TZXRCeXRlQXJyYXlSZWdpb24oZW52LCB0eXBlcywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGRhdGEubnVtVHlwZXMsIGdwZGF0YS5wb2ludFR5cGVzKTsKICAgICAgICAoKmVudiktPlNldEZsb2F0QXJyYXlSZWdpb24oZW52LCBjb29yZHMsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZGF0YS5udW1Db29yZHMsIGdwZGF0YS5wb2ludENvb3Jkcyk7CgogICAgICAgIGdwPSgqZW52KS0+TmV3T2JqZWN0KGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW5Gb250SURzLmdwQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuRm9udElEcy5ncEN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGRhdGEud3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BkYXRhLm51bVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGRhdGEubnVtQ29vcmRzKTsKICAgICAgICByZXR1cm4gZ3A7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAoKmVudiktPk5ld09iamVjdChlbnYsIHN1bkZvbnRJRHMuZ3BDbGFzcywgc3VuRm9udElEcy5ncEN0ckVtcHR5KTsKfQoKSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKSmF2YV9zdW5fZm9udF9GcmVldHlwZUZvbnRTY2FsZXJfZ2V0VW5pdHNQZXJFTU5hdGl2ZSgKICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCBzY2FsZXIsIGpsb25nIHBTY2FsZXIpIHsKCiAgICBGVFNjYWxlckluZm8gKnMgPSAoRlRTY2FsZXJJbmZvKiApIGpsb25nX3RvX3B0cihwU2NhbGVyKTsKCiAgICAvKiBGcmVldHlwZSBkb2Mgc2F5czoKICAgICBUaGUgbnVtYmVyIG9mIGZvbnQgdW5pdHMgcGVyIEVNIHNxdWFyZSBmb3IgdGhpcyBmYWNlLgogICAgIFRoaXMgaXMgdHlwaWNhbGx5IDIwNDggZm9yIFRydWVUeXBlIGZvbnRzLCBhbmQgMTAwMCBmb3IgVHlwZSAxIGZvbnRzLgogICAgIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuCiAgICAgSG93ZXZlciwgbGF5b3V0IGVuZ2luZSBtaWdodCBiZSBub3QgdGVzdGVkIHdpdGggYW55dGhpbmcgYnV0IDIwNDguCgogICAgIE5COiB0ZXN0IGl0ISAqLwogICAgaWYgKHMgIT0gTlVMTCkgewogICAgICAgIHJldHVybiBzLT5mYWNlLT51bml0c19wZXJfRU07CiAgICB9CiAgICByZXR1cm4gMjA0ODsKfQoKLyogVGhpcyBuYXRpdmUgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgT3BlblR5cGUgbGF5b3V0IGVuZ2luZS4gKi8KSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTApKYXZhX3N1bl9mb250X0ZyZWV0eXBlRm9udFNjYWxlcl9nZXRHbHlwaFBvaW50TmF0aXZlKAogICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHNjYWxlciwgam9iamVjdCBmb250MkQsIGpsb25nIHBTY2FsZXJDb250ZXh0LAogICAgICAgIGpsb25nIHBTY2FsZXIsIGppbnQgZ2x5cGhDb2RlLCBqaW50IHBvaW50TnVtYmVyKSB7CgogICAgRlRfT3V0bGluZSogb3V0bGluZTsKICAgIGpvYmplY3QgcG9pbnQgPSBOVUxMOwogICAgamZsb2F0IHg9MCwgeT0wOwogICAgRlRTY2FsZXJDb250ZXh0ICpjb250ZXh0ID0KICAgICAgICAgKEZUU2NhbGVyQ29udGV4dCopIGpsb25nX3RvX3B0cihwU2NhbGVyQ29udGV4dCk7CiAgICBGVFNjYWxlckluZm8gKnNjYWxlckluZm8gPSAoRlRTY2FsZXJJbmZvKikgamxvbmdfdG9fcHRyKHBTY2FsZXIpOwoKICAgIG91dGxpbmUgPSBnZXRGVE91dGxpbmUoZW52LCBmb250MkQsIGNvbnRleHQsIHNjYWxlckluZm8sIGdseXBoQ29kZSwgMCwgMCk7CgogICAgaWYgKG91dGxpbmUgIT0gTlVMTCAmJiBvdXRsaW5lLT5uX3BvaW50cyA+IHBvaW50TnVtYmVyKSB7CiAgICAgICAgeCA9ICBGMjZEb3Q2VG9GbG9hdChvdXRsaW5lLT5wb2ludHNbcG9pbnROdW1iZXJdLngpOwogICAgICAgIHkgPSAtRjI2RG90NlRvRmxvYXQob3V0bGluZS0+cG9pbnRzW3BvaW50TnVtYmVyXS55KTsKICAgIH0KCiAgICByZXR1cm4gKCplbnYpLT5OZXdPYmplY3QoZW52LCBzdW5Gb250SURzLnB0MkRGbG9hdENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bkZvbnRJRHMucHQyREZsb2F0Q3RyLCB4LCB5KTsKfQo=