ZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZSBiL3NyYy9NYWtlZmlsZQppbmRleCA5YjIxYTJlLi41ZTQzZWU5IDEwMDY0NAotLS0gYS9zcmMvTWFrZWZpbGUKKysrIGIvc3JjL01ha2VmaWxlCkBAIC0xMDg5LDkgKzEwODksMTEgQEAKIEdUS19URVNUVEFSR0VUICA9IGd1aQogCiAjIyMgTW90aWYgR1VJCi1NT1RJRl9TUkMJPSBndWkuYyBndWlfbW90aWYuYyBndWlfeDExLmMgcHR5LmMgZ3VpX2JldmFsLmMKK01PVElGX1NSQwk9IGd1aS5jIGd1aV9tb3RpZi5jIGd1aV94MTEuYyBwdHkuYyBndWlfYmV2YWwuYyBcCisJCSAgCWd1aV94bWRsZy5jCiBNT1RJRl9PQkoJPSBvYmplY3RzL2d1aS5vIG9iamVjdHMvZ3VpX21vdGlmLm8gb2JqZWN0cy9ndWlfeDExLm8gXAotCQkJb2JqZWN0cy9wdHkubyBvYmplY3RzL2d1aV9iZXZhbC5vCisJCQlvYmplY3RzL3B0eS5vIG9iamVjdHMvZ3VpX2JldmFsLm8gXAorCQkJb2JqZWN0cy9ndWlfeG1kbGcubwogTU9USUZfREVGUwk9IC1ERkVBVF9HVUlfTU9USUYgJChOQVJST1dfUFJPVE8pCiBNT1RJRl9JUEFUSAk9ICQoR1VJX0lOQ19MT0MpCiBNT1RJRl9MSUJTX0RJUgk9ICQoR1VJX0xJQl9MT0MpCkBAIC0xMjAzLDggKzEyMDUsOCBAQAogQ0FSQk9OR1VJX1RFU1RBUkcgPSBWSU1QUk9HPS4uLyQoQ0FSQk9OR1VJX0JVTkRMRSkvQ29udGVudHMvTWFjT1MvJChWSU1UQVJHRVQpCiAKICMgQWxsIEdVSSBmaWxlcwotQUxMX0dVSV9TUkMgID0gZ3VpLmMgZ3VpX2d0ay5jIGd1aV9ndGtfZi5jIGd1aV9tb3RpZi5jIGd1aV9hdGhlbmEuYyBndWlfZ3RrX3gxMS5jIGd1aV94MTEuYyBndWlfYXRfc2IuYyBndWlfYXRfZnMuYyBwdHkuYyBndWlfa2RlLmNjIGd1aV9rZGVfd2lkLmNjIGd1aV9rZGVfeDExLmNjIGd1aV9rZGVfd2lkX21vYy5jYwotQUxMX0dVSV9QUk8gID0gZ3VpLnBybyBndWlfZ3RrLnBybyBndWlfbW90aWYucHJvIGd1aV9hdGhlbmEucHJvIGd1aV9ndGtfeDExLnBybyBndWlfeDExLnBybyBndWlfdzE2LnBybyBndWlfdzMyLnBybyBndWlfYW1pZ2EucHJvIGd1aV9waG90b24ucHJvCitBTExfR1VJX1NSQyAgPSBndWkuYyBndWlfZ3RrLmMgZ3VpX2d0a19mLmMgZ3VpX21vdGlmLmMgZ3VpX3htZGxnLmMgZ3VpX2F0aGVuYS5jIGd1aV9ndGtfeDExLmMgZ3VpX3gxMS5jIGd1aV9hdF9zYi5jIGd1aV9hdF9mcy5jIHB0eS5jIGd1aV9rZGUuY2MgZ3VpX2tkZV93aWQuY2MgZ3VpX2tkZV94MTEuY2MgZ3VpX2tkZV93aWRfbW9jLmNjCitBTExfR1VJX1BSTyAgPSBndWkucHJvIGd1aV9ndGsucHJvIGd1aV9tb3RpZi5wcm8gZ3VpX3htZGxnLnBybyBndWlfYXRoZW5hLnBybyBndWlfZ3RrX3gxMS5wcm8gZ3VpX3gxMS5wcm8gZ3VpX3cxNi5wcm8gZ3VpX3czMi5wcm8gZ3VpX2FtaWdhLnBybyBndWlfcGhvdG9uLnBybwogCiAjIH19fQogCkBAIC0yMTk0LDYgKzIxOTYsOSBAQAogb2JqZWN0cy9ndWlfbW90aWYubzogZ3VpX21vdGlmLmMKIAkkKENDQykgLW8gJEAgZ3VpX21vdGlmLmMKIAorb2JqZWN0cy9ndWlfeG1kbGcubzogZ3VpX3htZGxnLmMKKwkkKENDQykgLW8gJEAgZ3VpX3htZGxnLmMKKwogb2JqZWN0cy9ndWlfeDExLm86IGd1aV94MTEuYwogCSQoQ0NDKSAtbyAkQCBndWlfeDExLmMKIApkaWZmIC0tZ2l0IGEvc3JjL2d1aV9hbWlnYS5jIGIvc3JjL2d1aV9hbWlnYS5jCmluZGV4IDljZTQ0ZWQuLjBiNzYyNDUgMTAwNjQ0Ci0tLSBhL3NyYy9ndWlfYW1pZ2EuYworKysgYi9zcmMvZ3VpX2FtaWdhLmMKQEAgLTEyMzgsNiArMTIzOCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKIC8qCiAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgZm9udCAiZm9udCIgaW4gYWxsb2NhdGVkIG1lbW9yeS4KICAqIFdlIGFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgZm9udC4KQEAgLTEyNDcsNiArMTI0OCw3IEBACiB7CiAgICAgcmV0dXJuIHZpbV9zdHJzYXZlKChjaGFyX3UgKikiZGVmYXVsdCIpOwogfQorI2VuZGlmCiAKICAgICB2b2lkCiBndWlfbWNoX3NldF9mb250KEd1aUZvbnQgZm9udCkKZGlmZiAtLWdpdCBhL3NyYy9ndWlfYmVvcy5jYyBiL3NyYy9ndWlfYmVvcy5jYwppbmRleCAzMmU0ZGIwLi4zMTUxMzY1IDEwMDY0NAotLS0gYS9zcmMvZ3VpX2Jlb3MuY2MKKysrIGIvc3JjL2d1aV9iZW9zLmNjCkBAIC0yMzk2LDYgKzIzOTYsNyBAQAogICAgIHJldHVybiAoR3VpRm9udClmb250OwogfQogCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCiAvKgogICogUmV0dXJuIHRoZSBuYW1lIG9mIGZvbnQgImZvbnQiIGluIGFsbG9jYXRlZCBtZW1vcnkuCiAgKi8KQEAgLTI0MDQsNiArMjQwNSw3IEBACiB7CiAgICAgcmV0dXJuIHZpbV9zdHJzYXZlKCgoVmltRm9udCAqKWZvbnQpLT5uYW1lKTsKIH0KKyNlbmRpZgogCiAvKgogICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9udC4KZGlmZiAtLWdpdCBhL3NyYy9ndWlfa2RlX3gxMS5jYyBiL3NyYy9ndWlfa2RlX3gxMS5jYwppbmRleCA4OTU2MjY0Li5jODg3M2VjIDEwMDY0NAotLS0gYS9zcmMvZ3VpX2tkZV94MTEuY2MKKysrIGIvc3JjL2d1aV9rZGVfeDExLmNjCkBAIC03MDAsNiArNzAwLDcgQEAKICAgICByZXR1cm4gKEd1aUZvbnQpIG15Rm9udDsKIH0vL319fQogCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCiAvKgogICogUmV0dXJuIHRoZSBuYW1lIG9mIGZvbnQgImZvbnQiIGluIGFsbG9jYXRlZCBtZW1vcnkuCiAgKiBEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGFjdHVhbCBuYW1lLCB0aHVzIHVzZSB0aGUgcHJvdmlkZWQgbmFtZS4KQEAgLTcxMSw2ICs3MTIsNyBAQAogCXJldHVybiBOVUxMOwogICAgIHJldHVybiB2aW1fc3Ryc2F2ZShuYW1lKTsKIH0vL319fQorI2VuZGlmCiAKIC8qCiAgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBmb250LgpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9tYWMuYyBiL3NyYy9ndWlfbWFjLmMKaW5kZXggZjVlMjlhYi4uM2I3MzMzOSAxMDA2NDQKLS0tIGEvc3JjL2d1aV9tYWMuYworKysgYi9zcmMvZ3VpX21hYy5jCkBAIC0zNTY5LDYgKzM1NjksNyBAQAogICAgIHJldHVybiBmb250OwogfQogCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCiAvKgogICogUmV0dXJuIHRoZSBuYW1lIG9mIGZvbnQgImZvbnQiIGluIGFsbG9jYXRlZCBtZW1vcnkuCiAgKiBEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGFjdHVhbCBuYW1lLCB0aHVzIHVzZSB0aGUgcHJvdmlkZWQgbmFtZS4KQEAgLTM1ODIsNiArMzU4Myw3IEBACiAJcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIHZpbV9zdHJzYXZlKG5hbWUpOwogfQorI2VuZGlmCiAKIC8qCiAgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBmb250LgpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9tb3RpZi5jIGIvc3JjL2d1aV9tb3RpZi5jCmluZGV4IDRmZTI2ZWMuLmQzNDVhZjUgMTAwNjQ0Ci0tLSBhL3NyYy9ndWlfbW90aWYuYworKysgYi9zcmMvZ3VpX21vdGlmLmMKQEAgLTkzLDkgKzkzLDYgQEAKIAogc3RhdGljIHZvaWQgZ3VpX21vdGlmX21lbnVfY29sb3JzIF9fQVJHUygoV2lkZ2V0IGlkKSk7CiBzdGF0aWMgdm9pZCBndWlfbW90aWZfc2Nyb2xsX2NvbG9ycyBfX0FSR1MoKFdpZGdldCBpZCkpOwotI2lmZGVmIEZFQVRfTUVOVQotc3RhdGljIHZvaWQgZ3VpX21vdGlmX21lbnVfZm9udGxpc3QgX19BUkdTKChXaWRnZXQgaWQpKTsKLSNlbmRpZgogCiAjaWYgKFhtVmVyc2lvbiA+PSAxMDAyKQogIyBkZWZpbmUgU1RSSU5HX1RBRyAgWG1GT05UTElTVF9ERUZBVUxUX1RBRwpAQCAtMTI1LDE3ICsxMjIsMTIyIEBACiAgICAgZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCB2YWx1ZSwgZHJhZ2dpbmcpOwogfQogCi0KIC8qCiAgKiBFbmQgb2YgY2FsbC1iYWNrIHJvdXRpbmVzCiAgKi8KIAorI2lmbmRlZiBMRVNTVElGX1ZFUlNJT04KKy8qCisgKiBJbXBsZW1lbnQgdGhyZWUgZGltZW5zaW9uYWwgc2hhZGluZyBvZiBpbnNlbnNpdGl2ZSBsYWJlbHMuCisgKiBCeSBNYXJ0aW4gRGFsZWNraS4KKyAqLworCisjaW5jbHVkZSA8WG0vWG1QLmg+CisjaW5jbHVkZSA8WG0vTGFiZWxQLmg+CisKK3N0YXRpYyBYdEV4cG9zZVByb2Mgb2xkX2xhYmVsX2V4cG9zZSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGxhYmVsX2V4cG9zZSBfX0FSR1MoKFdpZGdldCBfdywgWEV2ZW50ICpfZXZlbnQsIFJlZ2lvbiBfcmVnaW9uKSk7CisKKyAgICBzdGF0aWMgdm9pZAorbGFiZWxfZXhwb3NlKF93LCBfZXZlbnQsIF9yZWdpb24pCisgICAgV2lkZ2V0CV93OworICAgIFhFdmVudAkqX2V2ZW50OworICAgIFJlZ2lvbglfcmVnaW9uOworeworICAgIEdDCQkgICAgaW5zZW5zaXRpdmVHQzsKKyAgICBYbUxhYmVsV2lkZ2V0ICAgbHcgPSAoWG1MYWJlbFdpZGdldClfdzsKKyAgICB1bnNpZ25lZCBjaGFyICAgbGFiZWxfdHlwZSA9IFhtU1RSSU5HOworCisgICAgWHRWYUdldFZhbHVlcyhfdywgWG1ObGFiZWxUeXBlLCAmbGFiZWxfdHlwZSwgKFh0UG9pbnRlcikwKTsKKworICAgIGlmIChYdElzU2Vuc2l0aXZlKF93KSB8fCBsYWJlbF90eXBlICE9IFhtU1RSSU5HKQorCSgqb2xkX2xhYmVsX2V4cG9zZSkoX3csIF9ldmVudCwgX3JlZ2lvbik7CisgICAgZWxzZQorICAgIHsKKwlYR0NWYWx1ZXMgICB2YWx1ZXM7CisJWHRHQ01hc2sgICAgbWFzazsKKwlYdEdDTWFzayAgICBkeW5hbWljOworCVhGb250U3RydWN0ICpmczsKKworCV9YbUZvbnRMaXN0R2V0RGVmYXVsdEZvbnQobHctPmxhYmVsLmZvbnQsICZmcyk7CisKKwkvKiBGSVhNRTogd2Ugc2hvdWxkIGJlIGRvaW5nIHRoZSB3aG9sZSBkcmF3aW5nIG91cnNlbGYgaGVyZS4gKi8KKwlpbnNlbnNpdGl2ZUdDID0gbHctPmxhYmVsLmluc2Vuc2l0aXZlX0dDOworCisJbWFzayA9IEdDRm9yZWdyb3VuZCB8IEdDQmFja2dyb3VuZCB8IEdDR3JhcGhpY3NFeHBvc3VyZXM7CisJZHluYW1pYyA9IEdDQ2xpcE1hc2sgfCBHQ0NsaXBYT3JpZ2luIHwgR0NDbGlwWU9yaWdpbjsKKwl2YWx1ZXMuZ3JhcGhpY3NfZXhwb3N1cmVzID0gRmFsc2U7CisKKwlpZiAoZnMgIT0gMCkKKwl7CisJICAgIG1hc2sgfD0gR0NGb250OworCSAgICB2YWx1ZXMuZm9udCA9IGZzLT5maWQ7CisJfQorCisJaWYgKGx3LT5wcmltaXRpdmUudG9wX3NoYWRvd19waXhtYXAgIT0gTm9uZQorCQkmJiBsdy0+cHJpbWl0aXZlLnRvcF9zaGFkb3dfcGl4bWFwICE9IFhtVU5TUEVDSUZJRURfUElYTUFQKQorCXsKKwkgICAgbWFzayB8PSBHQ0ZpbGxTdHlsZSB8IEdDVGlsZTsKKwkgICAgdmFsdWVzLmZpbGxfc3R5bGUgPSBGaWxsVGlsZWQ7CisJICAgIHZhbHVlcy50aWxlID0gbHctPnByaW1pdGl2ZS50b3Bfc2hhZG93X3BpeG1hcDsKKwl9CisKKwlsdy0+bGFiZWwuVGV4dFJlY3QueCArPSAxOworCWx3LT5sYWJlbC5UZXh0UmVjdC55ICs9IDE7CisJaWYgKGx3LT5sYWJlbC5fYWNjX3RleHQgIT0gMCkKKwl7CisJICAgIGx3LT5sYWJlbC5hY2NfVGV4dFJlY3QueCArPSAxOworCSAgICBsdy0+bGFiZWwuYWNjX1RleHRSZWN0LnkgKz0gMTsKKwl9CisKKwl2YWx1ZXMuZm9yZWdyb3VuZCA9IGx3LT5wcmltaXRpdmUudG9wX3NoYWRvd19jb2xvcjsKKwl2YWx1ZXMuYmFja2dyb3VuZCA9IGx3LT5jb3JlLmJhY2tncm91bmRfcGl4ZWw7CisKKwlsdy0+bGFiZWwuaW5zZW5zaXRpdmVfR0MgPQorCQkgICAgICBYdEFsbG9jYXRlR0MoKFdpZGdldCkgbHcsIDAsIG1hc2ssICZ2YWx1ZXMsIGR5bmFtaWMsIDApOworCSgqb2xkX2xhYmVsX2V4cG9zZSkoX3csIF9ldmVudCwgX3JlZ2lvbik7CisJWHRSZWxlYXNlR0MoX3csIGx3LT5sYWJlbC5pbnNlbnNpdGl2ZV9HQyk7CisKKwlsdy0+bGFiZWwuVGV4dFJlY3QueCAtPSAxOworCWx3LT5sYWJlbC5UZXh0UmVjdC55IC09IDE7CisJaWYgKGx3LT5sYWJlbC5fYWNjX3RleHQgIT0gMCkKKwl7CisJICAgIGx3LT5sYWJlbC5hY2NfVGV4dFJlY3QueCAtPSAxOworCSAgICBsdy0+bGFiZWwuYWNjX1RleHRSZWN0LnkgLT0gMTsKKwl9CisKKwl2YWx1ZXMuZm9yZWdyb3VuZCA9IGx3LT5wcmltaXRpdmUuYm90dG9tX3NoYWRvd19jb2xvcjsKKwl2YWx1ZXMuYmFja2dyb3VuZCA9IGx3LT5jb3JlLmJhY2tncm91bmRfcGl4ZWw7CisKKwlsdy0+bGFiZWwuaW5zZW5zaXRpdmVfR0MgPQorCQkgICAgICBYdEFsbG9jYXRlR0MoKFdpZGdldCkgbHcsIDAsIG1hc2ssICZ2YWx1ZXMsIGR5bmFtaWMsIDApOworCSgqb2xkX2xhYmVsX2V4cG9zZSkoX3csIF9ldmVudCwgX3JlZ2lvbik7CisJWHRSZWxlYXNlR0MoX3csIGx3LT5sYWJlbC5pbnNlbnNpdGl2ZV9HQyk7CisKKwlsdy0+bGFiZWwuaW5zZW5zaXRpdmVfR0MgPSBpbnNlbnNpdGl2ZUdDOworICAgIH0KK30KKyNlbmRpZgorCisKIC8qCiAgKiBDcmVhdGUgYWxsIHRoZSBtb3RpZiB3aWRnZXRzIG5lY2Vzc2FyeS4KICAqLwogICAgIHZvaWQKIGd1aV94MTFfY3JlYXRlX3dpZGdldHMoKQogeworI2lmbmRlZiBMRVNTVElGX1ZFUlNJT04KKyAgICAvKgorICAgICAqIEluc3RhbGwgdGhlIDNEIHNoYWRlIGVmZmVjdCBkcmF3aW5nIHJvdXRpbmVzLgorICAgICAqLworICAgIGlmIChvbGRfbGFiZWxfZXhwb3NlID09IE5VTEwpCisgICAgeworCW9sZF9sYWJlbF9leHBvc2UgPSB4bUxhYmVsV2lkZ2V0Q2xhc3MtPmNvcmVfY2xhc3MuZXhwb3NlOworCXhtTGFiZWxXaWRnZXRDbGFzcy0+Y29yZV9jbGFzcy5leHBvc2UgPSBsYWJlbF9leHBvc2U7CisgICAgfQorI2VuZGlmCisKICAgICAvKgogICAgICAqIFN0YXJ0IG91dCBieSBhZGRpbmcgdGhlIGNvbmZpZ3VyZWQgYm9yZGVyIHdpZHRoIGludG8gdGhlIGJvcmRlciBvZmZzZXQKICAgICAgKi8KQEAgLTMyOSw5ICs0MzEsNyBAQAogICogTWFuYWdlIGRpYWxvZyBjZW50ZXJlZCBvbiBwb2ludGVyLiBUaGlzIGNvdWxkIGJlIHVzZWQgYnkgdGhlIEF0aGVuYSBjb2RlIGFzCiAgKiB3ZWxsLgogICovCi1zdGF0aWMgdm9pZCBtYW5hZ2VfY2VudGVyZWQgX19BUkdTKChXaWRnZXQgZGlhbG9nX2NoaWxkKSk7Ci0KLXN0YXRpYyB2b2lkCisgICAgdm9pZAogbWFuYWdlX2NlbnRlcmVkKGRpYWxvZ19jaGlsZCkKICAgICBXaWRnZXQgZGlhbG9nX2NoaWxkOwogewpAQCAtODU1LDE2ICs5NTUsMTUgQEAKIAkgICAgeG1zID0gWG1TdHJpbmdDcmVhdGUoKGNoYXIgKiltZW51LT5kbmFtZSwgU1RSSU5HX1RBRyk7CiAJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsU3RyaW5nLCB4bXMpOyBuKys7CiAKLSNpZm5kZWYgRkVBVF9TVU5fV09SS1NIT1AKLQogCSAgICAvKiBXaXRob3V0IHNoYWRvd3Mgb25lIGNhbid0IHNlbnNlIHdoYXRldmVyIHRoZSBidXR0b24gaGFzIGJlZW4KIAkgICAgICogcHJlc3NlZCBvciBub3QhIEhvd2V2ZXIgd2Ugd2FuJ3QgdG8gc2F2ZSBhIGJpdCBvZiBzcGFjZS4uLgorCSAgICAgKiBOZWVkIHRoZSBoaWdobGlnaHRUaGlja25lc3MgdG8gc2VlIHRoZSBmb2N1cy4KIAkgICAgICovCi0JICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmhpZ2hsaWdodFRoaWNrbmVzcywgMCk7IG4rKzsKKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OaGlnaGxpZ2h0VGhpY2tuZXNzLCAxKTsgbisrOwogCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5oaWdobGlnaHRPbkVudGVyLCBUcnVlKTsgbisrOwogCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5tYXJnaW5XaWR0aCwgMCk7IG4rKzsKIAkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1ObWFyZ2luSGVpZ2h0LCAwKTsgbisrOwotI2VuZGlmCisKIAkgICAgaWYgKG1lbnUtPmltYWdlID09IDApCiAJICAgIHsKIAkJWHRTZXRBcmcoYXJnc1tuXSwgWG1ObGFiZWxUeXBlLCBYbVNUUklORyk7IG4rKzsKQEAgLTEzODQsNyArMTQ4Myw2IEBACiAgICAgaW50CQluOwogCiAgICAgbiA9IDA7Ci0gICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1Oc2hhZG93VGhpY2tuZXNzLCAxKTsgbisrOwogICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTm1pbmltdW0sIDApOyBuKys7CiAgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1Ob3JpZW50YXRpb24sCiAJICAgIChvcmllbnQgPT0gU0JBUl9WRVJUKSA/IFhtVkVSVElDQUwgOiBYbUhPUklaT05UQUwpOyBuKys7CkBAIC0xNDg0LDYgKzE1ODIsMjE5IEBACiAgICAgcmV0dXJuKFh0V2luZG93KHRleHRBcmVhKSk7CiB9CiAKKy8qCisgKiBMb29rIGZvciBhIHdpZGdldCBpbiB0aGUgd2lkZ2V0IHRyZWUgdywgd2l0aCBhIG1uZW1vbmljIG1hdGNoaW5nIGtleWNvZGUuCisgKiBXaGVuIG9uZSBpcyBmb3VuZCwgc2ltdWxhdGUgYSBidXR0b24gcHJlc3Mgb24gdGhhdCB3aWRnZXQgYW5kIGdpdmUgaXQgdGhlCisgKiBrZXlib2FyZCBmb2N1cy4gIElmIHRoZSBtbmVtb25pYyBpcyBvbiBhIGxhYmVsLCBsb29rIGluIHRoZSB1c2VyRGF0YSBmaWVsZAorICogb2YgdGhlIGxhYmVsIHRvIHNlZSBpZiBpdCBwb2ludHMgdG8gYW5vdGhlciB3aWRnZXQsIGFuZCBnaXZlIHRoYXQgdGhlIGZvY3VzLgorICovCisgICAgc3RhdGljIHZvaWQKK2RvX21uZW1vbmljKFdpZGdldCB3LCB1bnNpZ25lZCBpbnQga2V5Y29kZSkKK3sKKyAgICBXaWRnZXRMaXN0CSAgICBjaGlsZHJlbjsKKyAgICBpbnQJCSAgICBudW1DaGlsZHJlbiwgaTsKKyAgICBCb29sZWFuCSAgICBpc01lbnU7CisgICAgS2V5U3ltCSAgICBtbmVtb25pYyA9ICdcMCc7CisgICAgY2hhcgkgICAgbW5lU3RyaW5nWzJdOworICAgIFdpZGdldAkgICAgdXNlckRhdGE7CisgICAgdW5zaWduZWQgY2hhciAgIHJvd0NvbFR5cGU7CisKKyAgICBpZiAoWHRJc0NvbXBvc2l0ZSh3KSkKKyAgICB7CisJaWYgKFh0Q2xhc3ModykgPT0geG1Sb3dDb2x1bW5XaWRnZXRDbGFzcykKKwl7CisJICAgIFh0VmFHZXRWYWx1ZXModywgWG1Ocm93Q29sdW1uVHlwZSwgJnJvd0NvbFR5cGUsIDApOworCSAgICBpc01lbnUgPSAocm93Q29sVHlwZSAhPSAodW5zaWduZWQgY2hhcilYbVdPUktfQVJFQSk7CisJfQorCWVsc2UKKwkgICAgaXNNZW51ID0gRmFsc2U7CisJaWYgKCFpc01lbnUpCisJeworCSAgICBYdFZhR2V0VmFsdWVzKHcsIFhtTmNoaWxkcmVuLCAmY2hpbGRyZW4sIFhtTm51bUNoaWxkcmVuLAorCQkJICAmbnVtQ2hpbGRyZW4sIDApOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykKKwkJZG9fbW5lbW9uaWMoY2hpbGRyZW5baV0sIGtleWNvZGUpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlYdFZhR2V0VmFsdWVzKHcsIFhtTm1uZW1vbmljLCAmbW5lbW9uaWMsIDApOworCWlmIChtbmVtb25pYyAhPSAnXDAnKQorCXsKKwkgICAgbW5lU3RyaW5nWzBdID0gbW5lbW9uaWM7CisJICAgIG1uZVN0cmluZ1sxXSA9ICdcMCc7CisJICAgIGlmIChYS2V5c3ltVG9LZXljb2RlKFh0RGlzcGxheShYdFBhcmVudCh3KSksCisJCQkJICAgICAgIFhTdHJpbmdUb0tleXN5bShtbmVTdHJpbmcpKSA9PSBrZXljb2RlKQorCSAgICB7CisJCWlmIChYdENsYXNzKHcpID09IHhtTGFiZWxXaWRnZXRDbGFzcworCQkJfHwgWHRDbGFzcyh3KSA9PSB4bUxhYmVsR2FkZ2V0Q2xhc3MpCisJCXsKKwkJICAgIFh0VmFHZXRWYWx1ZXModywgWG1OdXNlckRhdGEsICZ1c2VyRGF0YSwgMCk7CisJCSAgICBpZiAodXNlckRhdGEgIT0gTlVMTCAmJiBYdElzV2lkZ2V0KHVzZXJEYXRhKSkKKwkJCVhtUHJvY2Vzc1RyYXZlcnNhbCh1c2VyRGF0YSwgWG1UUkFWRVJTRV9DVVJSRU5UKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIFhLZXlQcmVzc2VkRXZlbnQga2V5RXZlbnQ7CisKKwkJICAgIFhtUHJvY2Vzc1RyYXZlcnNhbCh3LCBYbVRSQVZFUlNFX0NVUlJFTlQpOworCisJCSAgICBtZW1zZXQoKGNoYXIgKikgJmtleUV2ZW50LCAwLCBzaXplb2YoWEtleVByZXNzZWRFdmVudCkpOworCQkgICAga2V5RXZlbnQudHlwZSA9IEtleVByZXNzOworCQkgICAga2V5RXZlbnQuc2VyaWFsID0gMTsKKwkJICAgIGtleUV2ZW50LnNlbmRfZXZlbnQgPSBUcnVlOworCQkgICAga2V5RXZlbnQuZGlzcGxheSA9IFh0RGlzcGxheSh3KTsKKwkJICAgIGtleUV2ZW50LndpbmRvdyA9IFh0V2luZG93KHcpOworCQkgICAgWHRDYWxsQWN0aW9uUHJvYyh3LCAiQWN0aXZhdGUiLCAoWEV2ZW50ICopICYga2V5RXZlbnQsCisJCQkJCQkJCSAgICAgTlVMTCwgMCk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qCisgKiBDYWxsYmFjayByb3V0aW5lIGZvciBkaWFsb2cgbW5lbW9uaWMgcHJvY2Vzc2luZy4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK21uZW1vbmljX2V2ZW50KFdpZGdldCB3LCBYdFBvaW50ZXIgY2FsbF9kYXRhLCBYS2V5RXZlbnQgKmV2ZW50KQoreworICAgIGRvX21uZW1vbmljKHcsIGV2ZW50LT5rZXljb2RlKTsKK30KKworCisvKgorICogU2VhcmNoIHRoZSB3aWRnZXQgdHJlZSB1bmRlciB3IGZvciB3aWRnZXRzIHdpdGggbW5lbW9uaWNzLiAgV2hlbiBmb3VuZCwgYWRkCisgKiBhIHBhc3NpdmUgZ3JhYiB0byB0aGUgZGlhbG9nIHdpZGdldCBmb3IgdGhlIG1uZW1vbmljIGNoYXJhY3RlciwgdGh1cworICogZGlyZWN0aW5nIG1uZW1vbmljIGV2ZW50cyB0byB0aGUgZGlhbG9nIHdpZGdldC4KKyAqLworICAgIHN0YXRpYyB2b2lkCithZGRfbW5lbW9uaWNfZ3JhYnMoV2lkZ2V0IGRpYWxvZywgV2lkZ2V0IHcpCit7CisgICAgY2hhcgkgICAgbW5lU3RyaW5nWzJdOworICAgIFdpZGdldExpc3QJICAgIGNoaWxkcmVuOworICAgIGludAkJICAgIG51bUNoaWxkcmVuLCBpOworICAgIEJvb2xlYW4JICAgIGlzTWVudTsKKyAgICBLZXlTeW0JICAgIG1uZW1vbmljID0gJ1wwJzsKKyAgICB1bnNpZ25lZCBjaGFyICAgcm93Q29sVHlwZTsKKworICAgIGlmIChYdElzQ29tcG9zaXRlKHcpKQorICAgIHsKKwlpZiAoWHRDbGFzcyh3KSA9PSB4bVJvd0NvbHVtbldpZGdldENsYXNzKQorCXsKKwkgICAgWHRWYUdldFZhbHVlcyh3LCBYbU5yb3dDb2x1bW5UeXBlLCAmcm93Q29sVHlwZSwgMCk7CisJICAgIGlzTWVudSA9IChyb3dDb2xUeXBlICE9ICh1bnNpZ25lZCBjaGFyKVhtV09SS19BUkVBKTsKKwl9CisJZWxzZQorCSAgICBpc01lbnUgPSBGYWxzZTsKKwlpZiAoIWlzTWVudSkKKwl7CisJICAgIFh0VmFHZXRWYWx1ZXModywgWG1OY2hpbGRyZW4sICZjaGlsZHJlbiwgWG1ObnVtQ2hpbGRyZW4sCisJCQkJCQkJICAgICAmbnVtQ2hpbGRyZW4sIDApOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykKKwkJYWRkX21uZW1vbmljX2dyYWJzKGRpYWxvZywgY2hpbGRyZW5baV0pOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlYdFZhR2V0VmFsdWVzKHcsIFhtTm1uZW1vbmljLCAmbW5lbW9uaWMsIDApOworCWlmIChtbmVtb25pYyAhPSAnXDAnKQorCXsKKwkgICAgbW5lU3RyaW5nWzBdID0gbW5lbW9uaWM7CisJICAgIG1uZVN0cmluZ1sxXSA9ICdcMCc7CisJICAgIFh0R3JhYktleShkaWFsb2csIFhLZXlzeW1Ub0tleWNvZGUoWHREaXNwbGF5KGRpYWxvZyksCisJCQkJCQkgIFhTdHJpbmdUb0tleXN5bShtbmVTdHJpbmcpKSwKKwkJICAgIE1vZDFNYXNrLCBUcnVlLCBHcmFiTW9kZUFzeW5jLCBHcmFiTW9kZUFzeW5jKTsKKwl9CisgICAgfQorfQorCisvKgorICogQWRkIGEgaGFuZGxlciBmb3IgbW5lbW9uaWNzIGluIGEgZGlhbG9nLiAgTW90aWYgaXRzZWxmIG9ubHkgaGFuZGxlcworICogbW5lbW9uaWNzIGluIG1lbnVzLiBNbmVtb25pY3MgYWRkZWQgb3IgY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwgd2lsbCBiZQorICogaWdub3JlZC4KKyAqCisgKiBUbyBhZGQgYSBtbmVtb25pYyB0byBhIHRleHQgZmllbGQgb3IgbGlzdCwgc2V0IHRoZSBYbU5tbmVtb25pYyByZXNvdXJjZSBvbgorICogdGhlIGFwcHJvcHJpYXRlIGxhYmVsIGFuZCBzZXQgdGhlIFhtTnVzZXJEYXRhIHJlc291cmNlIG9mIHRoZSBsYWJlbCB0byB0aGUKKyAqIHdpZGdldCB0byBnZXQgdGhlIGZvY3VzIHdoZW4gdGhlIG1uZW1vbmljIGlzIHR5cGVkLgorICovCisgICAgc3RhdGljIHZvaWQKK2FjdGl2YXRlX2RpYWxvZ19tbmVtb25pY3MoV2lkZ2V0IGRpYWxvZykKK3sKKyAgICBpZiAoIWRpYWxvZykKKwlyZXR1cm47CisKKyAgICBYdEFkZEV2ZW50SGFuZGxlcihkaWFsb2csIEtleVByZXNzTWFzaywgRmFsc2UsCisJCQkgICAoWHRFdmVudEhhbmRsZXIpIG1uZW1vbmljX2V2ZW50LCAoWHRQb2ludGVyKSBOVUxMKTsKKyAgICBhZGRfbW5lbW9uaWNfZ3JhYnMoZGlhbG9nLCBkaWFsb2cpOworfQorCisvKgorICogUmVtb3ZlcyB0aGUgZXZlbnQgaGFuZGxlciBhbmQga2V5LWdyYWJzIGZvciBkaWFsb2cgbW5lbW9uaWMgaGFuZGxpbmcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3VwcHJlc3NfZGlhbG9nX21uZW1vbmljcyhXaWRnZXQgZGlhbG9nKQoreworICAgIGlmICghZGlhbG9nKQorCXJldHVybjsKKworICAgIFh0VW5ncmFiS2V5KGRpYWxvZywgQW55S2V5LCBNb2QxTWFzayk7CisgICAgWHRSZW1vdmVFdmVudEhhbmRsZXIoZGlhbG9nLCBLZXlQcmVzc01hc2ssIEZhbHNlLAorCQkJICAgKFh0RXZlbnRIYW5kbGVyKSBtbmVtb25pY19ldmVudCwgKFh0UG9pbnRlcikgTlVMTCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQlJPV1NFKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykKK3N0YXRpYyB2b2lkIHNldF9mb250bGlzdCBfX0FSR1MoKFdpZGdldCB3ZykpOworCisvKgorICogVXNlIHRoZSAnZ3VpZm9udCcgb3IgJ2d1aWZvbnRzZXQnIGFzIGEgZm9udGxpc3QgZm9yIGEgZGlhbG9nIHdpZGdldC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzZXRfZm9udGxpc3QoaWQpCisgICAgV2lkZ2V0IGlkOworeworICAgIFhtRm9udExpc3QgZmw7CisKKyNpZmRlZiBGT05UU0VUX0FMV0FZUworICAgIGlmIChndWkuZm9udHNldCAhPSBOT0ZPTlRTRVQpIHsKKwlmbCA9IGd1aV9tb3RpZl9mb250c2V0MmZvbnRsaXN0KChYRm9udFNldCAqKSZndWkuZm9udHNldCk7CisJaWYgKGZsICE9IE5VTEwpCisJeworCSAgICBpZiAoWHRJc01hbmFnZWQoaWQpKQorCSAgICB7CisJCVh0VW5tYW5hZ2VDaGlsZChpZCk7CisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJCS8qIFdlIHNob3VsZCBmb3JjZSB0aGUgd2lkZ2V0IHRvIHJlY2FsY3VsYXRlIGl0J3MKKwkJICogZ2VvbWV0cnkgbm93LiAqLworCQlYdE1hbmFnZUNoaWxkKGlkKTsKKwkgICAgfQorCSAgICBlbHNlCisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJICAgIFhtRm9udExpc3RGcmVlKGZsKTsKKwl9CisgICAgfQorI2Vsc2UKKyAgICBpZiAoZ3VpLm5vcm1fZm9udCAhPSBOT0ZPTlQpIHsKKwlmbCA9IGd1aV9tb3RpZl9jcmVhdGVfZm9udGxpc3QoKFhGb250U3RydWN0ICopZ3VpLm5vcm1fZm9udCk7CisJaWYgKGZsICE9IE5VTEwpCisJeworCSAgICBpZiAoWHRJc01hbmFnZWQoaWQpKQorCSAgICB7CisJCVh0VW5tYW5hZ2VDaGlsZChpZCk7CisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJCS8qIFdlIHNob3VsZCBmb3JjZSB0aGUgd2lkZ2V0IHRvIHJlY2FsY3VsYXRlIGl0J3MKKwkJICogZ2VvbWV0cnkgbm93LiAqLworCQlYdE1hbmFnZUNoaWxkKGlkKTsKKwkgICAgfQorCSAgICBlbHNlCisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJICAgIFhtRm9udExpc3RGcmVlKGZsKTsKKwl9CisgICAgfQorI2VuZGlmCit9CisjZW5kaWYKIAogI2lmIGRlZmluZWQoRkVBVF9CUk9XU0UpIHx8IGRlZmluZWQoUFJPVE8pCiAKQEAgLTE1MTcsMjkgKzE4MjgsNjcgQEAKICAqIC0gZXF1YWxpemUgdGhlIG1lc3NhZ2VzIGJldHdlZW4gZGlmZmVyZW50IEdVSSBpbXBsZW1lbnRhdGlvbnMgYXMgZmFyIGFzCiAgKiBwb3NzaWJsZS4KICAqLwotc3RhdGljIHZvaWQgc2V0X3ByZWRlZmluZWRfbGFiZWwgX19BUkdTKChXaWRnZXQgcGFyZW50LCBTdHJpbmcgbmFtZSwgY2hhciAqIG5ld19sYWJlbCkpOworc3RhdGljIHZvaWQgc2V0X3ByZWRlZmluZWRfbGFiZWwgX19BUkdTKChXaWRnZXQgcGFyZW50LCBTdHJpbmcgbmFtZSwgY2hhciAqbmV3X2xhYmVsKSk7CiAKIHN0YXRpYyB2b2lkCiBzZXRfcHJlZGVmaW5lZF9sYWJlbChwYXJlbnQsIG5hbWUsIG5ld19sYWJlbCkKLSAgICBXaWRnZXQgcGFyZW50OwotICAgIFN0cmluZyBuYW1lOwotICAgIGNoYXIgKiBuZXdfbGFiZWw7CisgICAgV2lkZ2V0ICBwYXJlbnQ7CisgICAgU3RyaW5nICBuYW1lOworICAgIGNoYXIgICAgKm5ld19sYWJlbDsKIHsKLSAgICBYbVN0cmluZyBzdHI7Ci0gICAgV2lkZ2V0IHc7CisgICAgWG1TdHJpbmcJc3RyOworICAgIFdpZGdldAl3OworICAgIGNoYXJfdQkqcCwgKm5leHQ7CisgICAgS2V5U3ltCW1uZW1vbmljID0gTlVMOwogCiAgICAgdyA9IFh0TmFtZVRvV2lkZ2V0KHBhcmVudCwgbmFtZSk7CiAKICAgICBpZiAoIXcpCiAJcmV0dXJuOwogCi0gICAgc3RyID0gWG1TdHJpbmdDcmVhdGUobmV3X2xhYmVsLCBTVFJJTkdfVEFHKTsKLQotICAgIGlmIChzdHIpCisgICAgcCA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKiluZXdfbGFiZWwpOworICAgIGlmIChwID09IE5VTEwpCisJcmV0dXJuOworICAgIGZvciAobmV4dCA9IHA7ICpuZXh0OyArK25leHQpCiAgICAgewotCVh0VmFTZXRWYWx1ZXModywgWG1ObGFiZWxTdHJpbmcsIHN0ciwgTlVMTCk7CisJaWYgKCpuZXh0ID09IERMR19IT1RLRVlfQ0hBUikKKwl7CisJICAgIGludCBsZW4gPSBTVFJMRU4obmV4dCk7CisKKwkgICAgaWYgKGxlbiA+IDApCisJICAgIHsKKwkJbWNoX21lbW1vdmUobmV4dCwgbmV4dCArIDEsIGxlbik7CisJCW1uZW1vbmljID0gbmV4dFswXTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZSgoY2hhciAqKXAsIFNUUklOR19UQUcpOworICAgIHZpbV9mcmVlKHApOworCisgICAgaWYgKHN0ciAhPSBOVUxMKQorICAgIHsKKwlYdFZhU2V0VmFsdWVzKHcsCisJCVhtTmxhYmVsU3RyaW5nLCBzdHIsCisJCVhtTm1uZW1vbmljLCBtbmVtb25pYywKKwkJTlVMTCk7CiAJWG1TdHJpbmdGcmVlKHN0cik7CiAgICAgfQorICAgIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KHcpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3ByZWRlZmluZWRfZm9udGxpc3QocGFyZW50LCBuYW1lKQorICAgIFdpZGdldCBwYXJlbnQ7CisgICAgU3RyaW5nIG5hbWU7Cit7CisgICAgV2lkZ2V0IHc7CisgICAgdyA9IFh0TmFtZVRvV2lkZ2V0KHBhcmVudCwgbmFtZSk7CisKKyAgICBpZiAoIXcpCisJcmV0dXJuOworCisgICAgc2V0X2ZvbnRsaXN0KHcpOwogfQogCiAvKgpAQCAtMTU2MSw3ICsxOTEwLDEyIEBACiAgICAgY2hhcl91CSpwYXR0ZXJuOwogICAgIGNoYXJfdQkqdG9mcmVlID0gTlVMTDsKIAotICAgIGRpYWxvZ193Z3QgPSBYbUNyZWF0ZUZpbGVTZWxlY3Rpb25EaWFsb2codmltU2hlbGwsIChjaGFyICopdGl0bGUsIE5VTEwsIDApOworICAgIC8qIFRoZXJlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZXNvdXJjZSBuYW1lIGFuZCB2YWx1ZSwgVGhlcmVmb3JlLCB3ZQorICAgICAqIGF2b2lkIHRvIChhYi0pdXNlIHRoZSAobWF5YmUgaW50ZXJuYXRpb25hbGl6ZWQhKSBkaWFsb2cgdGl0bGUgYXMgYQorICAgICAqIGRpYWxvZyBuYW1lLgorICAgICAqLworCisgICAgZGlhbG9nX3dndCA9IFhtQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZyh2aW1TaGVsbCwgImJyb3dzZURpYWxvZyIsIE5VTEwsIDApOwogCiAgICAgaWYgKGluaXRkaXIgPT0gTlVMTCB8fCAqaW5pdGRpciA9PSBOVUwpCiAgICAgewpAQCAtMTYxNCwxNSArMTk2OCwyMSBAQAogCSAgICBYbU5kaWFsb2dUaXRsZSwgWG1SU3RyaW5nLCAoY2hhciAqKXRpdGxlLCBTVFJMRU4odGl0bGUpICsgMSwKIAlOVUxMKTsKIAotICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJBcHBseSIsIF8oIkZpbHRlciIpKTsKLSAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiQ2FuY2VsIiwgXygiQ2FuY2VsIikpOworICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJBcHBseSIsIF8oIiZGaWx0ZXIiKSk7CisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkNhbmNlbCIsIF8oIiZDYW5jZWwiKSk7CiAgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkRpciIsIF8oIkRpcmVjdG9yaWVzIikpOwogICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJGaWx0ZXJMYWJlbCIsIF8oIkZpbHRlciIpKTsKLSAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiSGVscCIsIF8oIkhlbHAiKSk7CisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkhlbHAiLCBfKCImSGVscCIpKTsKICAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiSXRlbXMiLCBfKCJGaWxlcyIpKTsKLSAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiT0siLCBfKCJPSyIpKTsKKyAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiT0siLCBfKCImT0siKSk7CiAgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIlNlbGVjdGlvbiIsIF8oIlNlbGVjdGlvbiIpKTsKIAorICAgIC8qIFRoaXMgaXMgdG8gc2F2ZSB1cyBmcm9tIHNpbGx5IGV4dGVybmFsIHNldHRpbmdzIHVzaW5nIG5vdCBmaXhlZCB3aXRoCisgICAgICogZm9udHMgZm9yIGZpbGUgc2VsZWN0aW9uLgorICAgICAqLworICAgIHNldF9wcmVkZWZpbmVkX2ZvbnRsaXN0KGRpYWxvZ193Z3QsICJEaXJMaXN0U1cuRGlyTGlzdCIpOworICAgIHNldF9wcmVkZWZpbmVkX2ZvbnRsaXN0KGRpYWxvZ193Z3QsICJJdGVtc0xpc3RTVy5JdGVtc0xpc3QiKTsKKwogICAgIGd1aV9tb3RpZl9tZW51X2NvbG9ycyhkaWFsb2dfd2d0KTsKICAgICBpZiAoZ3VpLnNjcm9sbF9iZ19waXhlbCAhPSBJTlZBTENPTE9SKQogCVh0VmFTZXRWYWx1ZXMoZGlhbG9nX3dndCwgWG1OdHJvdWdoQ29sb3IsIGd1aS5zY3JvbGxfYmdfcGl4ZWwsIE5VTEwpOwpAQCAtMTYzNCw2ICsxOTk0LDcgQEAKIAkJCQkJKHVuc2lnbmVkIGNoYXIpWG1ESUFMT0dfSEVMUF9CVVRUT04pKTsKIAogICAgIG1hbmFnZV9jZW50ZXJlZChkaWFsb2dfd2d0KTsKKyAgICBhY3RpdmF0ZV9kaWFsb2dfbW5lbW9uaWNzKGRpYWxvZ193Z3QpOwogCiAgICAgLyogc2l0IGluIGEgbG9vcCB1bnRpbCB0aGUgZGlhbG9nIGJveCBoYXMgZ29uZSBhd2F5ICovCiAgICAgZG8KQEAgLTE2NDIsNiArMjAwMyw3IEBACiAJICAgIChYdElucHV0TWFzaylYdElNQWxsKTsKICAgICB9IHdoaWxlIChYdElzTWFuYWdlZChkaWFsb2dfd2d0KSk7CiAKKyAgICBzdXBwcmVzc19kaWFsb2dfbW5lbW9uaWNzKGRpYWxvZ193Z3QpOwogICAgIFh0RGVzdHJveVdpZGdldChkaWFsb2dfd2d0KTsKICAgICB2aW1fZnJlZSh0b2ZyZWUpOwogCkBAIC0xNzQ2LDMxICsyMTA4LDYgQEAKICAgICBkaWFsb2dTdGF0dXMgPSAoaW50KShsb25nKWNsaWVudF9kYXRhICsgMTsKIH0KIAotc3RhdGljIHZvaWQgZ3VpX21vdGlmX3NldF9mb250bGlzdCBfX0FSR1MoKFdpZGdldCB3ZykpOwotCi0vKgotICogVXNlIHRoZSAnZ3VpZm9udCcgb3IgJ2d1aWZvbnRzZXQnIGFzIGEgZm9udGxpc3QgZm9yIGEgZGlhbG9nIHdpZGdldC4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1ndWlfbW90aWZfc2V0X2ZvbnRsaXN0KHdnKQotICAgIFdpZGdldCB3ZzsKLXsKLSAgICBYbUZvbnRMaXN0IGZsOwotCi0gICAgZmwgPQotI2lmZGVmIEZFQVRfWEZPTlRTRVQKLQkgICAgZ3VpLmZvbnRzZXQgIT0gTk9GT05UU0VUID8KLQkJICAgIGd1aV9tb3RpZl9mb250c2V0MmZvbnRsaXN0KChYRm9udFNldCAqKSZndWkuZm9udHNldCkKLQkJCQkgICAgIDoKLSNlbmRpZgotCQkgICAgZ3VpX21vdGlmX2NyZWF0ZV9mb250bGlzdCgoWEZvbnRTdHJ1Y3QgKilndWkubm9ybV9mb250KTsKLSAgICBpZiAoZmwgIT0gTlVMTCkKLSAgICB7Ci0JWHRWYVNldFZhbHVlcyh3ZywgWG1OZm9udExpc3QsIGZsLCBOVUxMKTsKLQlYbUZvbnRMaXN0RnJlZShmbCk7Ci0gICAgfQotfQotCiAjaWZkZWYgSEFWRV9YUE0KIAogc3RhdGljIFdpZGdldCBjcmVhdGVfcGl4bWFwX2xhYmVsKFdpZGdldCBwYXJlbnQsIFN0cmluZyBuYW1lLCBjaGFyICoqZGF0YSwgQXJnTGlzdCBhcmdzLCBDYXJkaW5hbCBhcmcpOwpAQCAtMTg1Myw2ICsyMTkwLDcgQEAKICAgICBYdEFwcENvbnRleHQJYXBwOwogICAgIFhtU3RyaW5nCQlsYWJlbDsKICAgICBpbnQJCQlidXRjb3VudDsKKyAgICBXaWRnZXQJCXc7CiAgICAgV2lkZ2V0CQlkaWFsb2dmb3JtID0gTlVMTDsKICAgICBXaWRnZXQJCWZvcm0gPSBOVUxMOwogICAgIFdpZGdldAkJZGlhbG9ndGV4dGZpZWxkID0gTlVMTDsKQEAgLTE5MTMsMTAgKzIyNTEsMjAgQEAKICAgICBwID0gYnV0czsKICAgICBmb3IgKGJ1dGNvdW50ID0gMDsgKnA7ICsrYnV0Y291bnQpCiAgICAgeworCUtleVN5bSBtbmVtb25pYyA9IE5VTDsKKwogCWZvciAobmV4dCA9IHA7ICpuZXh0OyArK25leHQpCiAJewogCSAgICBpZiAoKm5leHQgPT0gRExHX0hPVEtFWV9DSEFSKQotCQltY2hfbWVtbW92ZShuZXh0LCBuZXh0ICsgMSwgU1RSTEVOKG5leHQpKTsKKwkgICAgeworCQlpbnQgbGVuID0gU1RSTEVOKG5leHQpOworCisJCWlmIChsZW4gPiAwKQorCQl7CisJCSAgICBtY2hfbWVtbW92ZShuZXh0LCBuZXh0ICsgMSwgbGVuKTsKKwkJICAgIG1uZW1vbmljID0gbmV4dFswXTsKKwkJfQorCSAgICB9CiAJICAgIGlmICgqbmV4dCA9PSBETEdfQlVUVE9OX1NFUCkKIAkgICAgewogCQkqbmV4dCsrID0gTlVMOwpAQCAtMTkzMCwxMiArMjI3OCwxNCBAQAogCWJ1dHRvbnNbYnV0Y291bnRdID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImJ1dHRvbiIsCiAJCXhtUHVzaEJ1dHRvbldpZGdldENsYXNzLCBkaWFsb2dmb3JtLAogCQlYbU5sYWJlbFN0cmluZywgbGFiZWwsCisJCVhtTm1uZW1vbmljLCBtbmVtb25pYywKIAkJWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJWG1OYm90dG9tT2Zmc2V0LCA0LAogCQlYbU5zaG93QXNEZWZhdWx0LCBidXRjb3VudCA9PSBkZmx0YnV0dG9uIC0gMSwKIAkJWG1OZGVmYXVsdEJ1dHRvblNoYWRvd1RoaWNrbmVzcywgMSwKIAkJTlVMTCk7CiAJWG1TdHJpbmdGcmVlKGxhYmVsKTsKKwlndWlfbW90aWZfbWVudV9mb250bGlzdChidXR0b25zW2J1dGNvdW50XSk7CiAKIAkvKiBMYXlvdXQgcHJvcGVybHkuICovCiAKQEAgLTIwNDEsNyArMjM5MSw3IEBACiAJCSAgICBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCQkgICAgTlVMTCk7CiAKLQlndWlfbW90aWZfc2V0X2ZvbnRsaXN0KGRpYWxvZ3RleHRmaWVsZCk7CisJc2V0X2ZvbnRsaXN0KGRpYWxvZ3RleHRmaWVsZCk7CiAJWG1UZXh0RmllbGRTZXRTdHJpbmcoZGlhbG9ndGV4dGZpZWxkLCAoY2hhciAqKXRleHRmaWVsZCk7CiAJWHRNYW5hZ2VDaGlsZChkaWFsb2d0ZXh0ZmllbGQpOwogCVh0QWRkRXZlbnRIYW5kbGVyKGRpYWxvZ3RleHRmaWVsZCwgS2V5UHJlc3NNYXNrLCBGYWxzZSwKQEAgLTIwOTMsMTMgKzI0NDMsMTkgQEAKICAgICBYdE1hbmFnZUNoaWxkKGRpYWxvZ3BpeG1hcCk7CiAjZW5kaWYKIAotICAgIC8qIENyZWF0ZSB0aGUgZGlhbG9nIG1lc3NhZ2UuICovCi0gICAgbGFiZWwgPSBYbVN0cmluZ0x0b1JDcmVhdGUoKGNoYXIgKiltZXNzYWdlLCBTVFJJTkdfVEFHKTsKKyAgICAvKiBDcmVhdGUgdGhlIGRpYWxvZyBtZXNzYWdlLgorICAgICAqIFNpbmNlIExlc3NUaWYgaXMgYXBwYXJlbnRseSBoYXZpbmcgcHJvYmxlbXMgd2l0aCB0aGUgY3JlYXRpb24gb2YKKyAgICAgKiBwcm9wZXJseSBsb2NhbGl6ZWQgc3RyaW5nLCB3ZSB1c2UgTHRvUiBoZXJlLiBUaGUgc3ltcHRvbSBpcyB0aGF0IHRoZQorICAgICAqIHN0cmluZyBzaWxsIG5vdCBzaG93IHByb3Blcmx5IGluIG11bHRpcGxlIGxpbmVzIGFzIGl0IGRvZXMgaW4gbmF0aXZlCisgICAgICogTW90aWYuCisgICAgICovCisgICAgbGFiZWwgPSBYbVN0cmluZ0NyZWF0ZUx0b1IoKGNoYXIgKiltZXNzYWdlLCBTVFJJTkdfVEFHKTsKICAgICBpZiAobGFiZWwgPT0gTlVMTCkKIAlyZXR1cm4gLTE7Ci0gICAgKHZvaWQpWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZ01lc3NhZ2UiLAorICAgIHcgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGlhbG9nTWVzc2FnZSIsCiAJCQkJeG1MYWJlbEdhZGdldENsYXNzLCBmb3JtLAogCQkJCVhtTmxhYmVsU3RyaW5nLCBsYWJlbCwKKwkJCQlYbU5hbGlnbm1lbnQsIFhtQUxJR05NRU5UX0JFR0lOTklORywKIAkJCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCQkJCVhtTnRvcE9mZnNldCwgOCwKICNpZmRlZiBIQVZFX1hQTQpAQCAtMjExNSw2ICsyNDcxLDcgQEAKIAkJCQlYbU5ib3R0b21PZmZzZXQsIDgsCiAJCQkJTlVMTCk7CiAgICAgWG1TdHJpbmdGcmVlKGxhYmVsKTsKKyAgICBzZXRfZm9udGxpc3Qodyk7CiAKICAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCiAgICAgewpAQCAtMjE0OSw2ICsyNTA2LDcgQEAKIAkJCQkJCQkJCU5VTEwpOwogCiAgICAgbWFuYWdlX2NlbnRlcmVkKGRpYWxvZ2Zvcm0pOworICAgIGFjdGl2YXRlX2RpYWxvZ19tbmVtb25pY3MoZGlhbG9nZm9ybSk7CiAKICAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwgJiYgKnRleHRmaWVsZCAhPSBOVUwpCiAgICAgewpAQCAtMjE4NSw2ICsyNTQzLDcgQEAKIAl9CiAgICAgfQogCisgICAgc3VwcHJlc3NfZGlhbG9nX21uZW1vbmljcyhkaWFsb2dmb3JtKTsKICAgICBYdERlc3Ryb3lXaWRnZXQoZGlhbG9nZm9ybSk7CiAKICAgICByZXR1cm4gZGlhbG9nU3RhdHVzOwpAQCAtMjI0Niw4ICsyNjA1LDExIEBACiAgICAgWG1TdHJpbmcJeG1zOwogCiAgICAgeG1zID0gWG1TdHJpbmdDcmVhdGUoKGNoYXIgKilzLCBTVFJJTkdfVEFHKTsKLSAgICBYdFZhU2V0VmFsdWVzKGZvb3RlciwgWG1ObGFiZWxTdHJpbmcsIHhtcywgTlVMTCk7Ci0gICAgWG1TdHJpbmdGcmVlKHhtcyk7CisgICAgaWYgKHhtcyAhPSBOVUxMKQorICAgIHsKKwlYdFZhU2V0VmFsdWVzKGZvb3RlciwgWG1ObGFiZWxTdHJpbmcsIHhtcywgTlVMTCk7CisJWG1TdHJpbmdGcmVlKHhtcyk7CisgICAgfQogfQogCiAjZW5kaWYKQEAgLTI1MjIsMTQgKzI4ODQsMTUgQEAKIAlYdFZhU2V0VmFsdWVzKGlkLCBYbU5mb3JlZ3JvdW5kLCBndWkuc2Nyb2xsX2ZnX3BpeGVsLCBOVUxMKTsKIH0KIAotI2lmZGVmIEZFQVRfTUVOVQogLyoKICAqIFNldCB0aGUgZm9udGxpc3QgZm9yIFdpZGdldCAiaWQiIHRvIHVzZSBndWkubWVudV9mb250c2V0IG9yIGd1aS5tZW51X2ZvbnQuCiAgKi8KLSAgICBzdGF0aWMgdm9pZAorLypBUkdTVVNFRCovCisgICAgdm9pZAogZ3VpX21vdGlmX21lbnVfZm9udGxpc3QoaWQpCiAgICAgV2lkZ2V0ICBpZDsKIHsKKyNpZmRlZiBGRUFUX01FTlUKICNpZmRlZiBGT05UU0VUX0FMV0FZUwogICAgIGlmIChndWkubWVudV9mb250c2V0ICE9IE5PRk9OVFNFVCkKICAgICB7CkBAIC0yNTczLDkgKzI5MzYsOSBAQAogCX0KICAgICB9CiAjZW5kaWYKKyNlbmRpZgogfQogCi0jZW5kaWYKIAogLyoKICAqIFdlIGRvbid0IGNyZWF0ZSBpdCB0d2ljZSBmb3IgdGhlIHNha2Ugb2Ygc3BlZWQuCkBAIC0yNjE3LDggKzI5ODAsMTAgQEAKIHsKICAgICBTaGFyZWRGaW5kUmVwbGFjZSAqY2QgPSAoU2hhcmVkRmluZFJlcGxhY2UgKiljbGllbnRfZGF0YTsKIAotICAgIGlmIChjZCAhPSBOVUxMKQorICAgIGlmIChjZCAhPSBOVUxMKSB7CisgICAgICAgLyogc3VwcHJlc3NfZGlhbG9nX21uZW1vbmljcyhjZC0+ZGlhbG9nKTsgKi8KIAljZC0+ZGlhbG9nID0gKFdpZGdldCkwOworICAgIH0KIH0KIAogLypBUkdTVVNFRCovCkBAIC0yNzE5LDYgKzMwODQsNDggQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCitzZXRfbGFiZWwodywgbGFiZWwpCisgICAgV2lkZ2V0IHc7CisgICAgY2hhcl91ICpsYWJlbDsKK3sKKyAgICBYbVN0cmluZwlzdHI7CisgICAgY2hhcl91CSpwLCAqbmV4dDsKKyAgICBLZXlTeW0JbW5lbW9uaWMgPSBOVUw7CisKKyAgICBpZiAoIXcpCisJcmV0dXJuOworCisgICAgcCA9IHZpbV9zdHJzYXZlKGxhYmVsKTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybjsKKyAgICBmb3IgKG5leHQgPSBwOyAqbmV4dDsgKytuZXh0KQorICAgIHsKKwlpZiAoKm5leHQgPT0gRExHX0hPVEtFWV9DSEFSKQorCXsKKwkgICAgaW50IGxlbiA9IFNUUkxFTihuZXh0KTsKKworCSAgICBpZiAobGVuID4gMCkKKwkgICAgeworCQltY2hfbWVtbW92ZShuZXh0LCBuZXh0ICsgMSwgbGVuKTsKKwkJbW5lbW9uaWMgPSBuZXh0WzBdOworCSAgICB9CisJfQorICAgIH0KKworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKChjaGFyICopcCk7CisgICAgdmltX2ZyZWUocCk7CisgICAgaWYgKHN0cikKKyAgICB7CisJWHRWYVNldFZhbHVlcyh3LAorCQlYbU5sYWJlbFN0cmluZywgc3RyLAorCQlYbU5tbmVtb25pYywgbW5lbW9uaWMsCisJCU5VTEwpOworCVhtU3RyaW5nRnJlZShzdHIpOworICAgIH0KKyAgICBndWlfbW90aWZfbWVudV9mb250bGlzdCh3KTsKK30KKworICAgIHN0YXRpYyB2b2lkCiBmaW5kX3JlcGxhY2VfZGlhbG9nX2NyZWF0ZShhcmcsIGRvX3JlcGxhY2UpCiAgICAgY2hhcl91CSphcmc7CiAgICAgaW50CQlkb19yZXBsYWNlOwpAQCAtMjc0Niw2ICszMTUzLDggQEAKICAgICAvKiBJZiB0aGUgZGlhbG9nIGFscmVhZHkgZXhpc3RzLCBqdXN0IHJhaXNlIGl0LiAqLwogICAgIGlmIChmcmRwLT5kaWFsb2cpCiAgICAgeworCWd1aV9tb3RpZl9zeW5jaF9mb250cygpOworCiAJLyogSWYgdGhlIHdpbmRvdyBpcyBhbHJlYWR5IHVwLCBqdXN0IHBvcCBpdCB0byB0aGUgdG9wICovCiAJaWYgKFh0SXNNYW5hZ2VkKGZyZHAtPmRpYWxvZykpCiAJICAgIFhNYXBSYWlzZWQoWHREaXNwbGF5KGZyZHAtPmRpYWxvZyksCkBAIC0yNzg5LDE2ICszMTk4LDE0IEBACiAJICAgIFhtTmJvdHRvbU9mZnNldCwgNCwKIAkgICAgTlVMTCk7CiAKLSAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJGaW5kIE5leHQiKSk7CiAgICAgZnJkcC0+ZmluZCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJmaW5kQnV0dG9uIiwKIAkgICAgeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MsIGJ1dHRvbl9mb3JtLAotCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAogCSAgICBYbU5zZW5zaXRpdmUsIFRydWUsCiAJICAgIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJICAgIFhtTmxlZnRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCSAgICBYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJICAgIE5VTEwpOwotICAgIFhtU3RyaW5nRnJlZShzdHIpOworICAgIHNldF9sYWJlbChmcmRwLT5maW5kLCBfKCJGaW5kICZOZXh0IikpOwogCiAgICAgWHRBZGRDYWxsYmFjayhmcmRwLT5maW5kLCBYbU5hY3RpdmF0ZUNhbGxiYWNrLAogCSAgICBmaW5kX3JlcGxhY2VfY2FsbGJhY2ssCkBAIC0yODA2LDU3ICszMjEzLDUwIEBACiAKICAgICBpZiAoZG9fcmVwbGFjZSkKICAgICB7Ci0Jc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiUmVwbGFjZSIpKTsKIAlmcmRwLT5yZXBsYWNlID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInJlcGxhY2VCdXR0b24iLAogCQl4bVB1c2hCdXR0b25XaWRnZXRDbGFzcywgYnV0dG9uX2Zvcm0sCi0JCVhtTmxhYmVsU3RyaW5nLCBzdHIsCiAJCVhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKIAkJWG1OdG9wV2lkZ2V0LCBmcmRwLT5maW5kLAogCQlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCQlOVUxMKTsKLQlYbVN0cmluZ0ZyZWUoc3RyKTsKKwlzZXRfbGFiZWwoZnJkcC0+cmVwbGFjZSwgXygiJlJlcGxhY2UiKSk7CiAJWHRBZGRDYWxsYmFjayhmcmRwLT5yZXBsYWNlLCBYbU5hY3RpdmF0ZUNhbGxiYWNrLAogCQlmaW5kX3JlcGxhY2VfY2FsbGJhY2ssIChYdFBvaW50ZXIpRlJEX1JFUExBQ0UpOwogCi0Jc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiUmVwbGFjZSBBbGwiKSk7CiAJZnJkcC0+YWxsID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInJlcGxhY2VBbGxCdXR0b24iLAogCQl4bVB1c2hCdXR0b25XaWRnZXRDbGFzcywgYnV0dG9uX2Zvcm0sCi0JCVhtTmxhYmVsU3RyaW5nLCBzdHIsCiAJCVhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKIAkJWG1OdG9wV2lkZ2V0LCBmcmRwLT5yZXBsYWNlLAogCQlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCQlOVUxMKTsKLQlYbVN0cmluZ0ZyZWUoc3RyKTsKKwlzZXRfbGFiZWwoZnJkcC0+YWxsLCBfKCJSZXBsYWNlICZBbGwiKSk7CiAJWHRBZGRDYWxsYmFjayhmcmRwLT5hbGwsIFhtTmFjdGl2YXRlQ2FsbGJhY2ssCiAJCWZpbmRfcmVwbGFjZV9jYWxsYmFjaywgKFh0UG9pbnRlcilGUkRfUkVQTEFDRUFMTCk7CiAKLQlzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJVbmRvIikpOwogCWZyZHAtPnVuZG8gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgidW5kb0J1dHRvbiIsCiAJCXhtUHVzaEJ1dHRvbldpZGdldENsYXNzLCBidXR0b25fZm9ybSwKLQkJWG1ObGFiZWxTdHJpbmcsIHN0ciwKIAkJWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAogCQlYbU50b3BXaWRnZXQsIGZyZHAtPmFsbCwKIAkJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCiAJCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJTlVMTCk7Ci0JWG1TdHJpbmdGcmVlKHN0cik7CisJc2V0X2xhYmVsKGZyZHAtPnVuZG8sIF8oIiZVbmRvIikpOwogCVh0QWRkQ2FsbGJhY2soZnJkcC0+dW5kbywgWG1OYWN0aXZhdGVDYWxsYmFjaywKIAkJZmluZF9yZXBsYWNlX2NhbGxiYWNrLCAoWHRQb2ludGVyKUZSRF9VTkRPKTsKICAgICB9CiAKLSAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJDYW5jZWwiKSk7CiAgICAgZnJkcC0+Y2FuY2VsID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImNsb3NlQnV0dG9uIiwKIAkgICAgeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MsIGJ1dHRvbl9mb3JtLAotCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAogCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkgICAgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCSAgICBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAogCSAgICBOVUxMKTsKLSAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKyAgICBzZXRfbGFiZWwoZnJkcC0+Y2FuY2VsLCBfKCImQ2FuY2VsIikpOwogICAgIFh0QWRkQ2FsbGJhY2soZnJkcC0+Y2FuY2VsLCBYbU5hY3RpdmF0ZUNhbGxiYWNrLAogCSAgICBmaW5kX3JlcGxhY2VfZGlzbWlzc19jYWxsYmFjaywgZnJkcCk7CisgICAgZ3VpX21vdGlmX21lbnVfZm9udGxpc3QoZnJkcC0+Y2FuY2VsKTsKIAogICAgIFh0TWFuYWdlQ2hpbGQoYnV0dG9uX2Zvcm0pOwogCkBAIC0yODk0LDYgKzMyOTQsNyBAQAogCQlYbU50b3BPZmZzZXQsIDQsCiAJCU5VTEwpOwogCVhtU3RyaW5nRnJlZShzdHIpOworCWd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KGxhYmVsX3doYXQpOwogCiAJZnJkcC0+d2hhdCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJ3aGF0VGV4dCIsCiAJCXhtVGV4dEZpZWxkV2lkZ2V0Q2xhc3MsIGlucHV0X2Zvcm0sCkBAIC0yOTI4LDYgKzMzMjksNyBAQAogCQkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKIAkJICAgIE5VTEwpOwogCSAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKwkgICAgZ3VpX21vdGlmX21lbnVfZm9udGxpc3QobGFiZWxfd2l0aCk7CiAKIAkgICAgLyoKIAkgICAgICogTWFrZSB0aGUgZW50cnkgYWN0aXZhdGlvbiBvbmx5IGNoYW5nZSB0aGUgaW5wdXQgZm9jdXMgb250byB0aGUKQEAgLTI5NzUsNiArMzM3Nyw3IEBACiAKICAgICB7CiAJV2lkZ2V0IHJhZGlvX2JveDsKKwlXaWRnZXQgdzsKIAogCWZyYW1lID0gWHRWYUNyZWF0ZVdpZGdldCgiZGlyZWN0aW9uRnJhbWUiLAogCQl4bUZyYW1lV2lkZ2V0Q2xhc3MsIGZyZHAtPmRpYWxvZywKQEAgLTI5ODgsMTMgKzMzOTEsMTQgQEAKIAkJTlVMTCk7CiAKIAlzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJEaXJlY3Rpb24iKSk7Ci0JKHZvaWQpWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpcmVjdGlvbkZyYW1lTGFiZWwiLAorCXcgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZGlyZWN0aW9uRnJhbWVMYWJlbCIsCiAJCXhtTGFiZWxHYWRnZXRDbGFzcywgZnJhbWUsCiAJCVhtTmxhYmVsU3RyaW5nLCBzdHIsCiAJCVhtTmNoaWxkSG9yaXpvbnRhbEFsaWdubWVudCwgWG1BTElHTk1FTlRfQkVHSU5OSU5HLAogCQlYbU5jaGlsZFR5cGUsIFhtRlJBTUVfVElUTEVfQ0hJTEQsCiAJCU5VTEwpOwogCVhtU3RyaW5nRnJlZShzdHIpOworCWd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KHcpOwogCiAJcmFkaW9fYm94ID0gWG1DcmVhdGVSYWRpb0JveChmcmFtZSwgInJhZGlvQm94IiwKIAkJKEFyZ0xpc3QpTlVMTCwgMCk7CkBAIC0zMDA2LDYgKzM0MTAsNyBAQAogCQlYbU5zZXQsIEZhbHNlLAogCQlOVUxMKTsKIAlYbVN0cmluZ0ZyZWUoc3RyKTsKKwlndWlfbW90aWZfbWVudV9mb250bGlzdChmcmRwLT51cCk7CiAKIAlzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJEb3duIikpOwogCWZyZHAtPmRvd24gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZG93blJhZGlvQnV0dG9uIiwKQEAgLTMwMTQsNiArMzQxOSw3IEBACiAJCVhtTnNldCwgVHJ1ZSwKIAkJTlVMTCk7CiAJWG1TdHJpbmdGcmVlKHN0cik7CisJZ3VpX21vdGlmX21lbnVfZm9udGxpc3QoZnJkcC0+ZG93bik7CiAKIAlYdE1hbmFnZUNoaWxkKHJhZGlvX2JveCk7CiAJWHRNYW5hZ2VDaGlsZChmcmFtZSk7CkBAIC0zMDU3LDYgKzM0NjMsOCBAQAogCSAgICBYbU5zZXQsIG1jYXNlLAogCSAgICBOVUxMKTsKICAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKyAgICBndWlfbW90aWZfbWVudV9mb250bGlzdChmcmRwLT53d29yZCk7CisgICAgZ3VpX21vdGlmX21lbnVfZm9udGxpc3QoZnJkcC0+bWNhc2UpOwogCiAgICAgWHRNYW5hZ2VDaGlsZCh0b2dnbGVfZm9ybSk7CiAKQEAgLTMwNjQsNyArMzQ3MiwxMCBAQAogCVhtVGV4dEZpZWxkU2V0U3RyaW5nKGZyZHAtPndoYXQsIChjaGFyICopZW50cnlfdGV4dCk7CiAgICAgdmltX2ZyZWUoZW50cnlfdGV4dCk7CiAKLSAgICBYdE1hbmFnZUNoaWxkKGZyZHAtPmRpYWxvZyk7CisgICAgZ3VpX21vdGlmX3N5bmNoX2ZvbnRzKCk7CisKKyAgICBtYW5hZ2VfY2VudGVyZWQoZnJkcC0+ZGlhbG9nKTsKKyAgICBhY3RpdmF0ZV9kaWFsb2dfbW5lbW9uaWNzKGZyZHAtPmRpYWxvZyk7CiAgICAgWG1Qcm9jZXNzVHJhdmVyc2FsKGZyZHAtPndoYXQsIFhtVFJBVkVSU0VfQ1VSUkVOVCk7CiB9CiAKQEAgLTMwODgsMyArMzQ5OSw0MCBAQAogCiAgICAgZmluZF9yZXBsYWNlX2RpYWxvZ19jcmVhdGUoZWFwLT5hcmcsIFRSVUUpOwogfQorCisvKgorICogU3luY2hyb25pemUgYWxsIGd1aSBlbGVtZW50cywgd2hpY2ggYXJlIGRlcGVuZGFudCB1cG9uIHRoZQorICogbWFpbiB0ZXh0IGZvbnQgdXNlZC4gVGhvc2UgYXJlIGluIGVzcC4gdGhlIGZpbmQvcmVwbGFjZSBkaWFsb2dzLgorICogSWYgeW91IGRvbid0IHVuZGVyc3RhbmQgd2h5IHRoaXMgc2hvdWxkIGJlIG5lZWRlZCwgcGxlYXNlIHRyeSB0bworICogc2VhcmNoIGZvciAicGnqtuYiIGluIGlzbzg4NTktMi4KKyAqLworICAgIHZvaWQKK2d1aV9tb3RpZl9zeW5jaF9mb250cyh2b2lkKQoreworICAgIFNoYXJlZEZpbmRSZXBsYWNlICpmcmRwOworICAgIGludAkJICAgIGRvX3JlcGxhY2U7CisgICAgWEZvbnRTdHJ1Y3QJICAgICpmb250OworICAgIFhtRm9udExpc3QJICAgIGZvbnRfbGlzdDsKKworICAgIC8qIEZJWE1FOiBVbmxlc3Mgd2UgZmluZCBvdXQgaG93IHRvIGNyZWF0ZSBhIFhtRm9udExpc3QgZnJvbSBhIFhGb250U2V0LAorICAgICAqIHdlIGp1c3QgZ2l2ZSB1cCBoZXJlIG9uIGZvbnQgc3luY2hyb25pemF0aW9uLiAqLworICAgIGZvbnQgPSAoWEZvbnRTdHJ1Y3QgKilndWkubm9ybV9mb250OworICAgIGlmIChmb250ID09IE5VTEwpCisJcmV0dXJuOworCisgICAgZm9udF9saXN0ID0gZ3VpX21vdGlmX2NyZWF0ZV9mb250bGlzdChmb250KTsKKworICAgIC8qIE9LIHRoaXMgbG9vcCBpcyBhIGJpdCB0cmlja3kuLi4gKi8KKyAgICBmb3IgKGRvX3JlcGxhY2UgPSAwOyBkb19yZXBsYWNlIDw9IDE7ICsrZG9fcmVwbGFjZSkKKyAgICB7CisJZnJkcCA9IChkb19yZXBsYWNlKSA/ICgmcmVwbF93aWRnZXRzKSA6ICgmZmluZF93aWRnZXRzKTsKKwlpZiAoZnJkcC0+ZGlhbG9nKQorCXsKKwkgICAgWHRWYVNldFZhbHVlcyhmcmRwLT53aGF0LCBYbU5mb250TGlzdCwgZm9udF9saXN0LCBOVUxMKTsKKwkgICAgaWYgKGRvX3JlcGxhY2UpCisJCVh0VmFTZXRWYWx1ZXMoZnJkcC0+d2l0aCwgWG1OZm9udExpc3QsIGZvbnRfbGlzdCwgTlVMTCk7CisJfQorICAgIH0KKworICAgIFhtRm9udExpc3RGcmVlKGZvbnRfbGlzdCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ3VpX3Bob3Rvbi5jIGIvc3JjL2d1aV9waG90b24uYwppbmRleCBiN2M5MmRmLi45MjIzYTQwIDEwMDY0NAotLS0gYS9zcmMvZ3VpX3Bob3Rvbi5jCisrKyBiL3NyYy9ndWlfcGhvdG9uLmMKQEAgLTMwNDcsNiArMzA0Nyw3IEBACiAgICAgcmV0dXJuKCBGQUlMICk7CiB9CiAKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKIC8qCiAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgZm9udCAiZm9udCIgaW4gYWxsb2NhdGVkIG1lbW9yeS4KICAqIERvbid0IGtub3cgaG93IHRvIGdldCB0aGUgYWN0dWFsIG5hbWUsIHRodXMgdXNlIHRoZSBwcm92aWRlZCBuYW1lLgpAQCAtMzA2MCw2ICszMDYxLDcgQEAKIAlyZXR1cm4gTlVMTDsKICAgICByZXR1cm4gdmltX3N0cnNhdmUobmFtZSk7CiB9CisjZW5kaWYKIAogICAgIHZvaWQKIGd1aV9tY2hfc2V0X2ZvbnQoR3VpRm9udCBmb250KQpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9yaXNjb3MuYyBiL3NyYy9ndWlfcmlzY29zLmMKaW5kZXggN2M5NTU1ZS4uZjk3ODRhMiAxMDA2NDQKLS0tIGEvc3JjL2d1aV9yaXNjb3MuYworKysgYi9zcmMvZ3VpX3Jpc2Nvcy5jCkBAIC0xMDUyLDYgKzEwNTIsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKIC8qCiAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgZm9udCAiZm9udCIgaW4gYWxsb2NhdGVkIG1lbW9yeS4KICAqIERvbid0IGtub3cgaG93IHRvIGdldCB0aGUgYWN0dWFsIG5hbWUsIHRodXMgdXNlIHRoZSBwcm92aWRlZCBuYW1lLgpAQCAtMTA2NSw2ICsxMDY2LDcgQEAKIAlyZXR1cm4gTlVMTDsKICAgICByZXR1cm4gdmltX3N0cnNhdmUobmFtZSk7CiB9CisjZW5kaWYKIAogLyoKICAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvbnQuCmRpZmYgLS1naXQgYS9zcmMvZ3VpX3c0OC5jIGIvc3JjL2d1aV93NDguYwppbmRleCBiMzk0OGNlLi43N2NjMjRkIDEwMDY0NAotLS0gYS9zcmMvZ3VpX3c0OC5jCisrKyBiL3NyYy9ndWlfdzQ4LmMKQEAgLTEyNDksNiArMTI0OSw3IEBACiAgICAgcmV0dXJuIGZvbnQ7CiB9CiAKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKIC8qCiAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgZm9udCAiZm9udCIgaW4gYWxsb2NhdGVkIG1lbW9yeS4KICAqIERvbid0IGtub3cgaG93IHRvIGdldCB0aGUgYWN0dWFsIG5hbWUsIHRodXMgdXNlIHRoZSBwcm92aWRlZCBuYW1lLgpAQCAtMTI2Miw2ICsxMjYzLDcgQEAKIAlyZXR1cm4gTlVMTDsKICAgICByZXR1cm4gdmltX3N0cnNhdmUobmFtZSk7CiB9CisjZW5kaWYKIAogICAgIHZvaWQKIGd1aV9tY2hfZnJlZV9mb250KEd1aUZvbnQgZm9udCkKZGlmZiAtLWdpdCBhL3NyYy9ndWlfeG1kbGcuYyBiL3NyYy9ndWlfeG1kbGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjFiZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV94bWRsZy5jCkBAIC0wLDAgKzEsMTI4NyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJCUdVSS9Nb3RpZiBzdXBwb3J0IGJ5IFJvYmVydCBXZWJiCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiAoQykgMjAwMSBieSBNYXJjaW4gRGFsZWNraSA8ZGFsZWNraUBldmlzaW9uLmFnPgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGRpYWxvZ3VlIGZ1bmN0aW9ucyBmb3IgdGhlIE1vdGlmIEdVSSB2YXJpYW50LgorICovCisKKyNpbmNsdWRlIDxYbS9Gb3JtLmg+CisjaW5jbHVkZSA8WG0vUHVzaEJHLmg+CisjaW5jbHVkZSA8WG0vVGV4dC5oPgorI2luY2x1ZGUgPFhtL1RleHRGLmg+CisjaW5jbHVkZSA8WG0vTGFiZWwuaD4KKyNpbmNsdWRlIDxYbS9GcmFtZS5oPgorI2luY2x1ZGUgPFhtL0xhYmVsRy5oPgorI2luY2x1ZGUgPFhtL1RvZ2dsZUJHLmg+CisjaW5jbHVkZSA8WG0vU2VwYXJhdG9HLmg+CisjaW5jbHVkZSA8WG0vRGlhbG9nUy5oPgorI2luY2x1ZGUgPFhtL0xpc3QuaD4KKyNpbmNsdWRlIDxYbS9Sb3dDb2x1bW4uaD4KKyNpbmNsdWRlIDxYbS9BdG9tTWdyLmg+CisjaW5jbHVkZSA8WG0vUHJvdG9jb2xzLmg+CisKKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisjaW5jbHVkZSA8WDExL1hhdG9tLmg+CisjaW5jbHVkZSA8WDExL1N0cmluZ0RlZnMuaD4KKyNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CisKKyNpbmNsdWRlICJ2aW0uaCIKKworZXh0ZXJuIFdpZGdldCB2aW1TaGVsbDsKKworI2lmZGVmIEZFQVRfTUVOVQorIyBkZWZpbmUgYXBwbHlfZm9udGxpc3QodykgZ3VpX21vdGlmX21lbnVfZm9udGxpc3QodykKKyNlbHNlCisjIGRlZmluZSBhcHBseV9mb250bGlzdCh3KQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGb250IHNlbGVjdGlvbiBkaWFsb2d1ZSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitzdGF0aWMgY2hhciB3aWxkWzNdID0gIioiOworCisvKgorICogRklYTUU6IFRoaXMgaXMgYSBnZW5lcmljIGZ1bmN0aW9uLCB3aGljaCBzaG91bGQgYmUgdXNlZCB0aHJvdWdob3V0IHRoZSB3aG9sZQorICogYXBwbGljYXRpb24uCisgKgorICogQWRkIGNsb3NlX2NhbGxiYWNrLCB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgY2xvc2UgZnJvbQorICogdGhlIHdpbmRvdyBtZW51LiAgVGhlIGNsb3NlIG1lbnUgaXRlbSB1c3VhbGx5IGFjdGl2YXRlcyBmLmtpbGwgd2hpY2ggc2VuZHMgYQorICogV01fREVMRVRFX1dJTkRPVyBwcm90b2NvbCByZXF1ZXN0IGZvciB0aGUgd2luZG93LgorICovCisKKyAgICBzdGF0aWMgdm9pZAorYWRkX2NhbmNlbF9hY3Rpb24oV2lkZ2V0IHNoZWxsLCBYdENhbGxiYWNrUHJvYyBjbG9zZV9jYWxsYmFjaywgdm9pZCAqYXJnKQoreworICAgIHN0YXRpYyBBdG9tIHdtcF9hdG9tID0gMDsKKyAgICBzdGF0aWMgQXRvbSBkd19hdG9tID0gMDsKKyAgICBEaXNwbGF5ICpkaXNwbGF5ID0gWHREaXNwbGF5KHNoZWxsKTsKKworICAgIC8qIGRlYWN0aXZhdGUgdGhlIGJ1aWx0LWluIGRlbGV0ZSByZXNwb25zZSBvZiBraWxsaW5nIHRoZSBhcHBsaWNhdGlvbiAqLworICAgIFh0VmFTZXRWYWx1ZXMoc2hlbGwsIFhtTmRlbGV0ZVJlc3BvbnNlLCBYbURPX05PVEhJTkcsIDApOworCisgICAgLyogYWRkIGEgZGVsZXRlIHdpbmRvdyBwcm90b2NvbCBjYWxsYmFjayBpbnN0ZWFkICovCisgICAgaWYgKCFkd19hdG9tKQorICAgIHsKKwl3bXBfYXRvbSA9IFhtSW50ZXJuQXRvbShkaXNwbGF5LCAiV01fUFJPVE9DT0xTIiwgVHJ1ZSk7CisJZHdfYXRvbSA9IFhtSW50ZXJuQXRvbShkaXNwbGF5LCAiV01fREVMRVRFX1dJTkRPVyIsIFRydWUpOworICAgIH0KKyAgICBYbUFkZFByb3RvY29sQ2FsbGJhY2soc2hlbGwsIHdtcF9hdG9tLCBkd19hdG9tLCBjbG9zZV9jYWxsYmFjaywgYXJnKTsKK30KKworI2RlZmluZSBNQVhfRk9OVFMJCQk2NTUzNQorI2RlZmluZSBNQVhfRk9OVF9OQU1FX0xFTgkJMjU2CisjZGVmaW5lIE1BWF9FTlRSSUVTX0lOX0xJU1QJCTUwMDAKKyNkZWZpbmUgTUFYX0RJU1BMQVlfU0laRQkJMTUwCisjZGVmaW5lIFRFTVBfQlVGX1NJWkUJCQkyNTYKKworZW51bSBMaXN0U3BlY2lmaWVyCit7CisgICAgRU5DT0RJTkcsCisgICAgTkFNRSwKKyAgICBTVFlMRSwKKyAgICBTSVpFLAorICAgIE5PTkUKK307CisKK3R5cGVkZWYgc3RydWN0IF9TaGFyZWRGb250U2VsRGF0YQoreworICAgIFdpZGdldAlkaWFsb2c7CisgICAgV2lkZ2V0CW9rOworICAgIFdpZGdldAljYW5jZWw7CisgICAgV2lkZ2V0CWVuY29kaW5nX3B1bGxkb3duOworICAgIFdpZGdldAllbmNvZGluZ19tZW51OworICAgIFdpZGdldAlsaXN0W05PTkVdOworICAgIFdpZGdldAluYW1lOworICAgIFdpZGdldAlzYW1wbGU7CisgICAgY2hhcgkqKm5hbWVzOwkvKiBmb250IG5hbWUgYXJyYXkgb2YgYXJyYXlzICovCisgICAgaW50CQludW07CQkvKiBudW1iZXIgb2YgZm9udCBuYW1lcyAqLworICAgIFN0cmluZwlzZWxbTk9ORV07CS8qIHNlbGVjdGlvbiBjYXRlZ29yeSAqLworICAgIEJvb2xlYW4JaW5fcGl4ZWxzOwkvKiB0b2dnbGUgc3RhdGUgLSBzaXplIGluIHBpeGVscyAgKi8KKyAgICBjaGFyCSpmb250X25hbWU7CS8qIGN1cnJlbnQgZm9udCBuYW1lICovCisgICAgWEZvbnRTdHJ1Y3QJKm9sZDsJCS8qIGZvbnQgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNhbXBsZSBkaXNwbGF5ICovCisgICAgWG1Gb250TGlzdAlvbGRfbGlzdDsJLyogZm9udCBkYXRhIHN0cnVjdHVyZSBmb3Igc2FtcGxlIGRpc3BsYXkgKi8KKyAgICBCb29sZWFuCWV4aXQ7CQkvKiB1c2VkIGZvciBwcm9ncmFtIGV4aXQgY29udHJvbCAqLworfSBTaGFyZWRGb250U2VsRGF0YTsKKworLyoKKyAqIENoZWNraW5nIGFjY2VzcyB0byB0aGUgZm9udCBuYW1lIGFycmF5IGZvciB2YWxpZGl0eS4KKyAqLworICAgIHN0YXRpYyBjaGFyICoKK2ZuKFNoYXJlZEZvbnRTZWxEYXRhICpkYXRhLCBpbnQgaSkKK3sKKyAgICAvKiBBc3NlcnRpb24gY2hlY2tzOiAqLworICAgIGlmIChkYXRhLT5udW0gPCAwKQorCWFib3J0KCk7CisgICAgaWYgKGkgPj0gZGF0YS0+bnVtKQorCWkgPSBkYXRhLT5udW0gLSAxOworICAgIGlmIChpIDwgMCkKKwlpID0gMDsKKworICAgIHJldHVybiBkYXRhLT5uYW1lc1tpXTsKK30KKworLyoKKyAqIEdldCBhIHNwZWNpZmljIHN1YnN0cmluZyBmcm9tIGEgZm9udCBuYW1lLgorICovCisgICAgc3RhdGljIHZvaWQKK2dldF9wYXJ0KGNoYXIgKmluLCBpbnQgcG9zLCBjaGFyICpvdXQpCit7CisgICAgaW50CWk7CisgICAgaW50IGo7CisKKyAgICAqb3V0ID0gJ1wwJzsKKworICAgIGZvciAoaSA9IDA7IChwb3MgPiAwKSAmJiAoaW5baV0gIT0gJ1wwJyk7ICsraSkKKwlpZiAoaW5baV0gPT0gJy0nKQorCSAgICBwb3MtLTsKKworICAgIGlmIChpbltpXSA9PSAnXDAnKQorCXJldHVybjsKKworICAgIGZvciAoaiA9IDA7IChpbltpXSAhPSAnLScpICYmIChpbltpXSAhPSAnXDAnKTsgKytpLCArK2opCisJb3V0W2pdID0gaW5baV07CisgICAgb3V0W2pdID0gJ1wwJzsKK30KKworLyoKKyAqIEdpdmVuIGEgZm9udCBuYW1lIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGFydCB1c2VkIGluIHRoZSBmaXJzdAorICogc2Nyb2xsIGxpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbmFtZV9wYXJ0KGNoYXIgKmZvbnQsIGNoYXIgKmJ1ZikKK3sKKyAgICBjaGFyICAgIGJ1ZjJbVEVNUF9CVUZfU0laRV07CisgICAgY2hhciAgICBidWYzW1RFTVBfQlVGX1NJWkVdOworCisgICAgZ2V0X3BhcnQoZm9udCwgMiwgYnVmMik7CisgICAgZ2V0X3BhcnQoZm9udCwgMSwgYnVmMyk7CisKKyAgICBpZiAoc3RybGVuKGJ1ZjMpKQorCXNwcmludGYoYnVmLCAiJXMgKCVzKSIsIGJ1ZjIsIGJ1ZjMpOworICAgIGVsc2UKKwlzcHJpbnRmKGJ1ZiwgIiVzIiwgYnVmMik7Cit9CisKKy8qCisgKiBHaXZlbiBhIGZvbnQgbmFtZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBhcnQgdXNlZCBpbiB0aGUgc2Vjb25kIHNjcm9sbCBsaXN0LgorICovCisgICAgc3RhdGljIHZvaWQKK3N0eWxlX3BhcnQoY2hhciAqZm9udCwgY2hhciAqYnVmKQoreworICAgIGNoYXIgICAgYnVmMltURU1QX0JVRl9TSVpFXTsKKyAgICBjaGFyICAgIGJ1ZjNbVEVNUF9CVUZfU0laRV07CisKKyAgICBnZXRfcGFydChmb250LCAzLCBidWYzKTsKKyAgICBnZXRfcGFydChmb250LCA1LCBidWYyKTsKKworICAgIGlmICghc3RyY21wKGJ1ZjIsICJub3JtYWwiKSAmJiAhc3RyY21wKGJ1ZjIsICJOb3JtYWwiKQorCQkJCQkJICAgJiYgIXN0cmNtcChidWYyLCAiTk9STUFMIikpCisJc3ByaW50ZihidWYsICIlcyAlcyIsIGJ1ZjMsIGJ1ZjIpOworICAgIGVsc2UKKwlzdHJjcHkoYnVmLCBidWYzKTsKKworICAgIGdldF9wYXJ0KGZvbnQsIDYsIGJ1ZjIpOworCisgICAgaWYgKGJ1ZjJbMF0gIT0gJ1wwJykKKwlzcHJpbnRmKGJ1ZjMsICIlcyAlcyIsIGJ1ZiwgYnVmMik7CisgICAgZWxzZQorCXN0cmNweShidWYzLCBidWYpOworCisgICAgZ2V0X3BhcnQoZm9udCwgNCwgYnVmMik7CisKKyAgICBpZiAoIXN0cmNtcChidWYyLCAibyIpIHx8ICFzdHJjbXAoYnVmMiwgIk8iKSkKKwlzcHJpbnRmKGJ1ZiwgIiVzIG9ibGlxdWUiLCBidWYzKTsKKyAgICBlbHNlIGlmICghc3RyY21wKGJ1ZjIsICJpIikgfHwgIXN0cmNtcChidWYyLCAiSSIpKQorCXNwcmludGYoYnVmLCAiJXMgaXRhbGljIiwgYnVmMyk7CisKKyAgICBpZiAoIXN0cmNtcChidWYsICIgIikpCisJc3RyY3B5KGJ1ZiwgIi0iKTsKK30KKworLyoKKyAqIEdpdmVuIGEgZm9udCBuYW1lIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGFydCB1c2VkIGluIHRoZSB0aGlyZAorICogc2Nyb2xsIGxpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2l6ZV9wYXJ0KGNoYXIgKmZvbnQsIGNoYXIgKmJ1ZiwgaW50IGluUGl4ZWxzKQoreworICAgIGludAkgICAgc2l6ZTsKKyAgICBmbG9hdCAgIHRlbXA7CisKKyAgICAqYnVmID0gJ1wwJzsKKworICAgIGlmIChpblBpeGVscykKKyAgICB7CisJZ2V0X3BhcnQoZm9udCwgNywgYnVmKTsKKwlpZiAoc3RybGVuKGJ1ZikgPiAwKQorCXsKKwkgICAgc2l6ZSA9IGF0b2koYnVmKTsKKwkgICAgc3ByaW50ZihidWYsICIlM2QiLCBzaXplKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZ2V0X3BhcnQoZm9udCwgOCwgYnVmKTsKKwlpZiAoc3RybGVuKGJ1ZikgPiAwKQorCXsKKwkgICAgc2l6ZSA9IGF0b2koYnVmKTsKKwkgICAgdGVtcCA9IChmbG9hdClzaXplIC8gMTAuMDsKKwkgICAgc2l6ZSA9IHRlbXA7CisJICAgIGlmIChidWZbc3RybGVuKGJ1ZikgLSAxXSA9PSAnMCcpCisJCXNwcmludGYoYnVmLCAiJTNkIiwgc2l6ZSk7CisJICAgIGVsc2UKKwkJc3ByaW50ZihidWYsICIlNC4xZiIsIHRlbXApOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBHaXZlbiBhIGZvbnQgbmFtZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBhcnQgdXNlZCBpbiB0aGUgY2hvaWNlIG1lbnUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZW5jb2RpbmdfcGFydChjaGFyICpmb250LCBjaGFyICpidWYpCit7CisgICAgY2hhciAgICBidWYxW1RFTVBfQlVGX1NJWkVdOworICAgIGNoYXIgICAgYnVmMltURU1QX0JVRl9TSVpFXTsKKworICAgICpidWYgPSAnXDAnOworCisgICAgZ2V0X3BhcnQoZm9udCwgMTMsIGJ1ZjEpOworICAgIGdldF9wYXJ0KGZvbnQsIDE0LCBidWYyKTsKKworICAgIGlmIChzdHJsZW4oYnVmMSkgPiAwICYmIHN0cmxlbihidWYyKSkKKwlzcHJpbnRmKGJ1ZiwgIiVzLSVzIiwgYnVmMSwgYnVmMik7CisgICAgaWYgKCFzdHJjbXAoYnVmLCAiICIpKQorCXN0cmNweShidWYsICItIik7Cit9CisKKy8qCisgKiBJbnNlcnRzIGEgc3RyaW5nIGludG8gY29ycmVjdCBzb3J0ZWQgcG9zaXRpb24gaW4gYSBsaXN0LgorICovCisgICAgc3RhdGljIHZvaWQKK2FkZF90b19saXN0KGNoYXIgKipidWYsIGNoYXIgKml0ZW0sIGludCAqY291bnQpCit7CisgICAgaW50CWk7CisgICAgaW50IGo7CisKKyAgICBpZiAoKmNvdW50ID09IE1BWF9FTlRSSUVTX0lOX0xJU1QpCisJcmV0dXJuOworCisgICAgLyogYXZvaWQgZHVwbGljYXRpb24gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyArK2kpCisgICAgeworCWlmICghc3RyY21wKGJ1ZltpXSwgaXRlbSkpCisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBmaW5kIG9yZGVyIHBsYWNlLCBidXQgbWFrZSBzdXJlIHRoYXQgd2lsZCBjYXJkIGNvbWVzIGZpcnN0ICovCisgICAgaWYgKCFzdHJjbXAoaXRlbSwgd2lsZCkpCisJaSA9IDA7CisgICAgZWxzZQorCWZvciAoaSA9IDA7IGkgPCAqY291bnQ7ICsraSkKKwkgICAgaWYgKHN0cmNtcChidWZbaV0sIGl0ZW0pID4gMCAmJiBzdHJjbXAoYnVmW2ldLCB3aWxkKSkKKwkJYnJlYWs7CisKKyAgICAvKiBub3cgaW5zZXJ0IHRoZSBpdGVtICovCisgICAgZm9yIChqID0gKmNvdW50OyBqID4gaTsgLS1qKQorCWJ1ZltqXSA9IGJ1ZltqLTFdOworICAgIGJ1ZltpXSA9IFh0TmV3U3RyaW5nKGl0ZW0pOworCisgICAgKysoKmNvdW50KTsKK30KKworLyoKKyAqIFRydWUgaWYgdGhlIGZvbnQgbWF0Y2hlcyBzb21lIGZpZWxkLgorICovCisgICAgc3RhdGljIEJvb2xlYW4KK21hdGNoKFNoYXJlZEZvbnRTZWxEYXRhICpkYXRhLCBlbnVtIExpc3RTcGVjaWZpZXIgbCwgaW50IGkpCit7CisgICAgY2hhciBidWZbVEVNUF9CVUZfU0laRV07CisKKyAgICAvKiBBbiBlbXB0eSBzZWxlY3Rpb24gb3IgYSB3aWxkIGNhcmQgbWF0Y2hlcyBhbnl0aGluZy4KKyAgICAgKi8KKyAgICBpZiAoIWRhdGEtPnNlbFtsXSB8fCAhc3RyY21wKGRhdGEtPnNlbFtsXSwgd2lsZCkpCisJcmV0dXJuIFRydWU7CisKKyAgICAvKiBjaHVuayBvdXQgdGhlIGRlc2lyZWQgcGFydC4uLiAqLworICAgIHN3aXRjaCAobCkKKyAgICB7CisJY2FzZSBFTkNPRElORzoKKwkgICAgZW5jb2RpbmdfcGFydChmbihkYXRhLCBpKSwgYnVmKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE5BTUU6CisJICAgIG5hbWVfcGFydChmbihkYXRhLCBpKSwgYnVmKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNUWUxFOgorCSAgICBzdHlsZV9wYXJ0KGZuKGRhdGEsIGkpLCBidWYpOworCSAgICBicmVhazsKKworCWNhc2UgU0laRToKKwkgICAgc2l6ZV9wYXJ0KGZuKGRhdGEsIGkpLCBidWYsIGRhdGEtPmluX3BpeGVscyk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIDsKKyAgICB9CisKKyAgICAvKiAuLi5hbmQgY2hldyBpdCBub3cgKi8KKworICAgIHJldHVybiAhc3RyY21wKGJ1ZiwgZGF0YS0+c2VsW2xdKTsKK30KKworICAgIHN0YXRpYyBCb29sZWFuCitwcm9wb3J0aW9uYWwoY2hhciAqZm9udCkKK3sKKyAgICBjaGFyIGJ1ZltURU1QX0JVRl9TSVpFXTsKKworICAgIGdldF9wYXJ0KGZvbnQsIDExLCBidWYpOworCisgICAgcmV0dXJuICFzdHJjbXAoYnVmLCAicCIpIHx8ICFzdHJjbXAoYnVmLCAiUCIpOworfQorCisKK3N0YXRpYyB2b2lkIGVuY29kaW5nX2NhbGxiYWNrKFdpZGdldCB3LCBTaGFyZWRGb250U2VsRGF0YSAqZGF0YSwKKwkJCQkJCQkgICAgIFh0UG9pbnRlciBkdW1teSk7CisKKy8qCisgKiBQYXJzZSB0aHJvdWdoIHRoZSBmb250bGlzdCBkYXRhIGFuZCBzZXQgdXAgdGhlIHRocmVlIHNjcm9sbCBsaXN0cy4gIFRoZSBmaXgKKyAqIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBleGNsdWRlIGEgbGlzdCBmcm9tIGFueSBjaGFuZ2VzLiAgVGhpcyBpcyB1c2VkIGZvcgorICogdXBkYXRlcyBhZnRlciBzZWxlY3Rpb25zIGNhdXNlZCBieSB0aGUgdXNlcnMgYWN0aW9ucy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmaWxsX2xpc3RzKGVudW0gTGlzdFNwZWNpZmllciBmaXgsIFNoYXJlZEZvbnRTZWxEYXRhICpkYXRhKQoreworICAgIGNoYXIJKmxpc3RbTk9ORV1bTUFYX0VOVFJJRVNfSU5fTElTVF07CisgICAgaW50CQljb3VudFtOT05FXTsKKyAgICBjaGFyCWJ1ZltURU1QX0JVRl9TSVpFXTsKKyAgICBYbVN0cmluZwlpdGVtc1tNQVhfRU5UUklFU19JTl9MSVNUXTsKKyAgICBpbnQJCWk7CisgICAgaW50CQlpbmRleDsKKworICAgIGZvciAoaW5kZXggPSAoaW50KUVOQ09ESU5HOyBpbmRleCA8IChpbnQpTk9ORTsgKytpbmRleCkKKwljb3VudFtpbmRleF0gPSAwOworCisgICAgLyogRmlyc3Qgd2UgaW5zZXJ0IHRoZSB3aWxkIGNoYXIgaW50byBldmVyeSBzaW5nbGUgbGlzdC4gKi8KKyAgICBpZiAoZml4ICE9IEVOQ09ESU5HKQorCWFkZF90b19saXN0KGxpc3RbRU5DT0RJTkddLCB3aWxkLCAmY291bnRbRU5DT0RJTkddKTsKKyAgICBpZiAoZml4ICE9IE5BTUUpCisJYWRkX3RvX2xpc3QobGlzdFtOQU1FXSwgd2lsZCwgJmNvdW50W05BTUVdKTsKKyAgICBpZiAoZml4ICE9IFNUWUxFKQorCWFkZF90b19saXN0KGxpc3RbU1RZTEVdLCB3aWxkLCAmY291bnRbU1RZTEVdKTsKKyAgICBpZiAoZml4ICE9IFNJWkUpCisJYWRkX3RvX2xpc3QobGlzdFtTSVpFXSwgd2lsZCwgJmNvdW50W1NJWkVdKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW0gJiYgaSA8IE1BWF9FTlRSSUVTX0lOX0xJU1Q7IGkrKykKKyAgICB7CisJaWYgKHByb3BvcnRpb25hbChmbihkYXRhLCBpKSkpCisJICAgIGNvbnRpbnVlOworCisJaWYgKGZpeCAhPSBFTkNPRElORworCQkmJiBtYXRjaChkYXRhLCBOQU1FLCBpKQorCQkmJiBtYXRjaChkYXRhLCBTVFlMRSwgaSkKKwkJJiYgbWF0Y2goZGF0YSwgU0laRSwgaSkpCisJeworCSAgICBlbmNvZGluZ19wYXJ0KGZuKGRhdGEsIGkpLCBidWYpOworCSAgICBhZGRfdG9fbGlzdChsaXN0W0VOQ09ESU5HXSwgYnVmLCAmY291bnRbRU5DT0RJTkddKTsKKwl9CisKKwlpZiAoZml4ICE9IE5BTUUKKwkJJiYgbWF0Y2goZGF0YSwgRU5DT0RJTkcsIGkpCisJCSYmIG1hdGNoKGRhdGEsIFNUWUxFLCBpKQorCQkmJiBtYXRjaChkYXRhLCBTSVpFLCBpKSkKKwl7CisJICAgIG5hbWVfcGFydChmbihkYXRhLCBpKSwgYnVmKTsKKwkgICAgYWRkX3RvX2xpc3QobGlzdFtOQU1FXSwgYnVmLCAmY291bnRbTkFNRV0pOworCX0KKworCWlmIChmaXggIT0gU1RZTEUKKwkJJiYgbWF0Y2goZGF0YSwgRU5DT0RJTkcsIGkpCisJCSYmIG1hdGNoKGRhdGEsIE5BTUUsIGkpCisJCSYmIG1hdGNoKGRhdGEsIFNJWkUsIGkpKQorCXsKKwkgICAgc3R5bGVfcGFydChmbihkYXRhLCBpKSwgYnVmKTsKKwkgICAgYWRkX3RvX2xpc3QobGlzdFtTVFlMRV0sIGJ1ZiwgJmNvdW50W1NUWUxFXSk7CisJfQorCisJaWYgKGZpeCAhPSBTSVpFCisJCSYmIG1hdGNoKGRhdGEsIEVOQ09ESU5HLCBpKQorCQkmJiBtYXRjaChkYXRhLCBOQU1FLCBpKQorCQkmJiBtYXRjaChkYXRhLCBTVFlMRSwgaSkpCisJeworCSAgICBzaXplX3BhcnQoZm4oZGF0YSwgaSksIGJ1ZiwgZGF0YS0+aW5fcGl4ZWxzKTsKKwkgICAgYWRkX3RvX2xpc3QobGlzdFtTSVpFXSwgYnVmLCAmY291bnRbU0laRV0pOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEFuZCBub3cgZG8gdGhlIHByZXNlbGVjdGlvbiBpbiBhbGwgbGlzdHMgd2hlcmUgdGhlcmUgd2FzIG9uZToKKyAgICAgKi8KKworICAgIGlmIChmaXggIT0gRU5DT0RJTkcpCisgICAgeworCUNhcmRpbmFsIG5faXRlbXM7CisJV2lkZ2V0TGlzdCBjaGlsZHJlbjsKKwlXaWRnZXQgc2VsZWN0ZWRfYnV0dG9uID0gMDsKKworCS8qIEdldCBhbmQgdXBkYXRlIHRoZSBjdXJyZW50IGJ1dHRvbiBsaXN0LiAgKi8KKwlYdFZhR2V0VmFsdWVzKGRhdGEtPmVuY29kaW5nX3B1bGxkb3duLAorCQlYbU5jaGlsZHJlbiwgJmNoaWxkcmVuLAorCQlYbU5udW1DaGlsZHJlbiwgJm5faXRlbXMsCisJCU5VTEwpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50W0VOQ09ESU5HXTsgKytpKQorCXsKKwkgICAgV2lkZ2V0IGJ1dHRvbjsKKworCSAgICBpdGVtc1tpXSA9IFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKGxpc3RbRU5DT0RJTkddW2ldKTsKKworCSAgICBpZiAoaSA8IG5faXRlbXMpCisJICAgIHsKKwkJLyogcmVjeWNsZSBvbGQgYnV0dG9uICovCisJCVh0VmFTZXRWYWx1ZXMoY2hpbGRyZW5baV0sCisJCQlYbU5sYWJlbFN0cmluZywgaXRlbXNbaV0sCisJCQlYbU51c2VyRGF0YSwgaSwKKwkJCU5VTEwpOworCQlidXR0b24gPSBjaGlsZHJlbltpXTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogY3JlYXRlIGEgbmV3IGJ1dHRvbiAqLworCQlidXR0b24gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiYnV0dG9uIiwKKwkJCXhtUHVzaEJ1dHRvbkdhZGdldENsYXNzLAorCQkJZGF0YS0+ZW5jb2RpbmdfcHVsbGRvd24sCisJCQlYbU5sYWJlbFN0cmluZywgaXRlbXNbaV0sCisJCQlYbU51c2VyRGF0YSwgaSwKKwkJCU5VTEwpOworCQlYdEFkZENhbGxiYWNrKGJ1dHRvbiwgWG1OYWN0aXZhdGVDYWxsYmFjaywKKwkJCShYdENhbGxiYWNrUHJvYykgZW5jb2RpbmdfY2FsbGJhY2ssIChYdFBvaW50ZXIpIGRhdGEpOworCQlYdE1hbmFnZUNoaWxkKGJ1dHRvbik7CisJICAgIH0KKworCSAgICBpZiAoZGF0YS0+c2VsW0VOQ09ESU5HXSkKKwkgICAgeworCQlpZiAoIXN0cmNtcChkYXRhLT5zZWxbRU5DT0RJTkddLCBsaXN0W0VOQ09ESU5HXVtpXSkpCisJCSAgICBzZWxlY3RlZF9idXR0b24gPSBidXR0b247CisJICAgIH0KKwkgICAgWHRGcmVlKGxpc3RbRU5DT0RJTkddW2ldKTsKKwl9CisKKwkvKiBEZXN0cm95IGFsbCB0aGUgb3V0c3RhbmRpZyBtZW51IGl0ZW1zLgorCSAqLworCWZvciAoaSA9IGNvdW50W0VOQ09ESU5HXTsgaSA8IG5faXRlbXM7ICsraSkKKwl7CisJICAgIFh0VW5tYW5hZ2VDaGlsZChjaGlsZHJlbltpXSk7CisJICAgIFh0RGVzdHJveVdpZGdldChjaGlsZHJlbltpXSk7CisJfQorCisJLyogUHJlc2VydmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZpc3VhbGx5LgorCSAqLworCWlmIChzZWxlY3RlZF9idXR0b24pCisJeworCSAgICBYdFZhU2V0VmFsdWVzKGRhdGEtPmVuY29kaW5nX21lbnUsCisJCSAgICBYbU5tZW51SGlzdG9yeSwgc2VsZWN0ZWRfYnV0dG9uLAorCQkgICAgTlVMTCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50W0VOQ09ESU5HXTsgKytpKQorCSAgICBYbVN0cmluZ0ZyZWUoaXRlbXNbaV0pOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IGxvb3AgdHJvdWdoIHRoZSByZW1haW5pbmcgbGlzdHMgYW5kIHNldCB0aGVtIHVwLgorICAgICAqLworICAgIGZvciAoaW5kZXggPSAoaW50KU5BTUU7IGluZGV4IDwgKGludClOT05FOyArK2luZGV4KQorICAgIHsKKwlXaWRnZXQgdzsKKworCWlmIChmaXggPT0gKGVudW0gTGlzdFNwZWNpZmllcilpbmRleCkKKwkgICAgY29udGludWU7CisKKwlzd2l0Y2ggKChlbnVtIExpc3RTcGVjaWZpZXIpaW5kZXgpCisJeworCSAgICBjYXNlIE5BTUU6CisJCXcgPSBkYXRhLT5saXN0W05BTUVdOworCQlicmVhazsKKwkgICAgY2FzZSBTVFlMRToKKwkJdyA9IGRhdGEtPmxpc3RbU1RZTEVdOworCQlicmVhazsKKwkgICAgY2FzZSBTSVpFOgorCQl3ID0gZGF0YS0+bGlzdFtTSVpFXTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXcgPSAoV2lkZ2V0KTA7CS8qIGZvciBsaW50ICovCisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50W2luZGV4XTsgKytpKQorCXsKKwkgICAgaXRlbXNbaV0gPSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZChsaXN0W2luZGV4XVtpXSk7CisJICAgIFh0RnJlZShsaXN0W2luZGV4XVtpXSk7CisJfQorCVhtTGlzdERlbGV0ZUFsbEl0ZW1zKHcpOworCVhtTGlzdEFkZEl0ZW1zKHcsIGl0ZW1zLCBjb3VudFtpbmRleF0sIDEpOworCWlmIChkYXRhLT5zZWxbaW5kZXhdKQorCXsKKwkgICAgWG1TdHJpbmdGcmVlKGl0ZW1zWzBdKTsKKwkgICAgaXRlbXNbMF0gPSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZChkYXRhLT5zZWxbaW5kZXhdKTsKKwkgICAgWG1MaXN0U2VsZWN0SXRlbSh3LCBpdGVtc1swXSwgRmFsc2UpOworCSAgICBYbUxpc3RTZXRCb3R0b21JdGVtKHcsIGl0ZW1zWzBdKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGNvdW50W2luZGV4XTsgKytpKQorCSAgICBYbVN0cmluZ0ZyZWUoaXRlbXNbaV0pOworICAgIH0KK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3N0b2dnbGVfY2FsbGJhY2soV2lkZ2V0IHcsCisJU2hhcmVkRm9udFNlbERhdGEgKmRhdGEsCisJWG1Ub2dnbGVCdXR0b25DYWxsYmFja1N0cnVjdCAqY2FsbF9kYXRhKQoreworICAgIGludAkJaSwgZG9fc2VsOworICAgIGNoYXIJbmV3U2l6ZVsxMF07CisgICAgWG1TdHJpbmcJc3RyOworCisgICAgaWYgKGNhbGxfZGF0YS0+cmVhc29uICE9IChpbnQpWG1DUl9WQUxVRV9DSEFOR0VEKQorCXJldHVybjsKKworICAgIGRvX3NlbCA9IChkYXRhLT5zZWxbU0laRV0gIT0gTlVMTCkgJiYgc3RyY21wKGRhdGEtPnNlbFtTSVpFXSwgd2lsZCk7CisKKyAgICBmb3IgKGkgPSAwOyBkb19zZWwgJiYgKGkgPCBkYXRhLT5udW0pOyBpKyspCisJaWYgKG1hdGNoKGRhdGEsIEVOQ09ESU5HLCBpKQorCQkmJiBtYXRjaChkYXRhLCBOQU1FLCBpKQorCQkmJiBtYXRjaChkYXRhLCBTVFlMRSwgaSkKKwkJJiYgbWF0Y2goZGF0YSwgU0laRSwgaSkpCisJeworCSAgICBzaXplX3BhcnQoZm4oZGF0YSwgaSksIG5ld1NpemUsICFkYXRhLT5pbl9waXhlbHMpOworCSAgICBicmVhazsKKwl9CisKKyAgICBkYXRhLT5pbl9waXhlbHMgPSAhZGF0YS0+aW5fcGl4ZWxzOworCisgICAgaWYgKGRhdGEtPnNlbFtTSVpFXSkKKwlYdEZyZWUoZGF0YS0+c2VsW1NJWkVdKTsKKyAgICBkYXRhLT5zZWxbU0laRV0gPSBOVUxMOworICAgIGZpbGxfbGlzdHMoTk9ORSwgZGF0YSk7CisKKyAgICBpZiAoZG9fc2VsKQorICAgIHsKKwlzdHIgPSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZChuZXdTaXplKTsKKwlYbUxpc3RTZWxlY3RJdGVtKGRhdGEtPmxpc3RbU0laRV0sIHN0ciwgVHJ1ZSk7CisJWG1MaXN0U2V0Qm90dG9tSXRlbShkYXRhLT5saXN0W1NJWkVdLCBzdHIpOworCVhtU3RyaW5nRnJlZShzdHIpOworICAgIH0KK30KKworLyoKKyAqIFNob3cgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmb250IGluIHRoZSBzYW1wbGUgdGV4dCBsYWJlbC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkaXNwbGF5X3NhbXBsZShTaGFyZWRGb250U2VsRGF0YSAqZGF0YSkKK3sKKyAgICBBcmcJCSAgICBhcmdzWzJdOworICAgIGludAkJICAgIG47CisgICAgWEZvbnRTdHJ1Y3QJKiAgIGZvbnQ7CisgICAgWG1Gb250TGlzdAkgICAgZm9udF9saXN0OworICAgIERpc3BsYXkgKgkgICAgZGlzcGxheTsKKyAgICBYbVN0cmluZwkgICAgc3RyOworCisgICAgZGlzcGxheSA9IFh0RGlzcGxheShkYXRhLT5kaWFsb2cpOworICAgIGZvbnQgPSBYTG9hZFF1ZXJ5Rm9udChkaXNwbGF5LCBkYXRhLT5mb250X25hbWUpOworICAgIGZvbnRfbGlzdCA9IGd1aV9tb3RpZl9jcmVhdGVfZm9udGxpc3QoZm9udCk7CisKKyAgICBuID0gMDsKKyAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZCgiQWFCYlp6WXkgMDEyMzQ1Njc4OSIpOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsU3RyaW5nLCBzdHIpOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OZm9udExpc3QsIGZvbnRfbGlzdCk7IG4rKzsKKworICAgIFh0U2V0VmFsdWVzKGRhdGEtPnNhbXBsZSwgYXJncywgbik7CisgICAgWG1TdHJpbmdGcmVlKHN0cik7CisKKyAgICBpZiAoZGF0YS0+b2xkKQorICAgIHsKKwlYRnJlZUZvbnQoZGlzcGxheSwgZGF0YS0+b2xkKTsKKwlYbUZvbnRMaXN0RnJlZShkYXRhLT5vbGRfbGlzdCk7CisgICAgfQorICAgIGRhdGEtPm9sZCA9IGZvbnQ7CisgICAgZGF0YS0+b2xkX2xpc3QgPSBmb250X2xpc3Q7Cit9CisKKworICAgIHN0YXRpYyBCb29sZWFuCitkb19jaG9pY2UoV2lkZ2V0IHcsCisJU2hhcmVkRm9udFNlbERhdGEgKmRhdGEsCisJWG1MaXN0Q2FsbGJhY2tTdHJ1Y3QgKmNhbGxfZGF0YSwKKwllbnVtIExpc3RTcGVjaWZpZXIgd2hpY2gpCit7CisgICAgY2hhciAqc2VsOworCisgICAgWG1TdHJpbmdHZXRMdG9SKGNhbGxfZGF0YS0+aXRlbSwgWG1TVFJJTkdfREVGQVVMVF9DSEFSU0VULCAmc2VsKTsKKworICAgIGlmICghZGF0YS0+c2VsW3doaWNoXSkKKwlkYXRhLT5zZWxbd2hpY2hdID0gWHROZXdTdHJpbmcoc2VsKTsKKyAgICBlbHNlCisgICAgeworCVh0RnJlZShkYXRhLT5zZWxbd2hpY2hdKTsKKwlpZiAoIXN0cmNtcChkYXRhLT5zZWxbd2hpY2hdLCBzZWwpKQorCXsKKwkgICAgLyogdW5zZWxlY3RpbmcgY3VycmVudCBzZWxlY3Rpb24gKi8KKwkgICAgZGF0YS0+c2VsW3doaWNoXSA9IE5VTEw7CisJICAgIGlmICh3KQorCQlYbUxpc3REZXNlbGVjdEl0ZW0odywgY2FsbF9kYXRhLT5pdGVtKTsKKwl9CisJZWxzZQorCSAgICBkYXRhLT5zZWxbd2hpY2hdID0gWHROZXdTdHJpbmcoc2VsKTsKKyAgICB9CisgICAgWHRGcmVlKHNlbCk7CisKKyAgICBmaWxsX2xpc3RzKHdoaWNoLCBkYXRhKTsKKworICAgIC8qIElmIHRoZXJlIGlzIGEgZm9udCBzZWxlY3Rpb24sIHdlIGRpc3BsYXkgaXQuICovCisgICAgaWYgKGRhdGEtPnNlbFtFTkNPRElOR10KKwkgICAgJiYgZGF0YS0+c2VsW05BTUVdCisJICAgICYmIGRhdGEtPnNlbFtTVFlMRV0KKwkgICAgJiYgZGF0YS0+c2VsW1NJWkVdCisJICAgICYmIHN0cmNtcChkYXRhLT5zZWxbRU5DT0RJTkddLCB3aWxkKQorCSAgICAmJiBzdHJjbXAoZGF0YS0+c2VsW05BTUVdLCB3aWxkKQorCSAgICAmJiBzdHJjbXAoZGF0YS0+c2VsW1NUWUxFXSwgd2lsZCkKKwkgICAgJiYgc3RyY21wKGRhdGEtPnNlbFtTSVpFXSwgd2lsZCkpCisgICAgeworCWludCBpOworCisJaWYgKGRhdGEtPmZvbnRfbmFtZSkKKwkgICAgWHRGcmVlKGRhdGEtPmZvbnRfbmFtZSk7CisJZGF0YS0+Zm9udF9uYW1lID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW07IGkrKykKKwl7CisJICAgIGlmIChtYXRjaChkYXRhLCBFTkNPRElORywgaSkKKwkJICAgICYmIG1hdGNoKGRhdGEsIE5BTUUsIGkpCisJCSAgICAmJiBtYXRjaChkYXRhLCBTVFlMRSwgaSkKKwkJICAgICYmIG1hdGNoKGRhdGEsIFNJWkUsIGkpKQorCSAgICB7CisJCWRhdGEtPmZvbnRfbmFtZSA9IFh0TmV3U3RyaW5nKGZuKGRhdGEsIGkpKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwlpZiAoZGF0YS0+Zm9udF9uYW1lKQorCXsKKwkgICAgWG1UZXh0U2V0U3RyaW5nKGRhdGEtPm5hbWUsIGRhdGEtPmZvbnRfbmFtZSk7CisJICAgIGRpc3BsYXlfc2FtcGxlKGRhdGEpOworCX0KKwllbHNlCisJICAgIGRvX2RpYWxvZyhWSU1fRVJST1IsCisJCSAgICAoY2hhcl91ICopXygiRXJyb3IiKSwKKwkJICAgIChjaGFyX3UgKilfKCJJbnZhbGlkIGZvbnQgc3BlY2lmaWNhdGlvbiIpLAorCQkgICAgKGNoYXJfdSAqKV8oIiZEaXNtaXNzIiksIDEsIE5VTEwpOworCisJcmV0dXJuIFRydWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaW50CSAgICBuOworCVhtU3RyaW5nICAgIHN0cjsKKwlBcmcJICAgIGFyZ3NbNF07CisJY2hhcgkgICAgKm1zZyA9IF8oIm5vIHNwZWNpZmljIG1hdGNoIik7CisKKwluID0gMDsKKwlzdHIgPSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZChtc2cpOworCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsU3RyaW5nLCBzdHIpOyArK247CisJWHRTZXRWYWx1ZXMoZGF0YS0+c2FtcGxlLCBhcmdzLCBuKTsKKwlhcHBseV9mb250bGlzdChkYXRhLT5zYW1wbGUpOworCVhtVGV4dFNldFN0cmluZyhkYXRhLT5uYW1lLCBtc2cpOworCVhtU3RyaW5nRnJlZShzdHIpOworCisJcmV0dXJuIEZhbHNlOworICAgIH0KK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2VuY29kaW5nX2NhbGxiYWNrKFdpZGdldCB3LAorCVNoYXJlZEZvbnRTZWxEYXRhICpkYXRhLAorCVh0UG9pbnRlciBkdW1teSkKK3sKKyAgICBYbVN0cmluZyBzdHI7CisgICAgWG1MaXN0Q2FsbGJhY2tTdHJ1Y3QgZmFrZV9kYXRhOworCisgICAgWHRWYUdldFZhbHVlcyh3LCBYbU5sYWJlbFN0cmluZywgJnN0ciwgTlVMTCk7CisKKyAgICBpZiAoIXN0cikKKwlyZXR1cm47CisKKyAgICBmYWtlX2RhdGEuaXRlbSA9IHN0cjsKKworICAgIGRvX2Nob2ljZSgwLCBkYXRhLCAmZmFrZV9kYXRhLCBFTkNPRElORyk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbmFtZV9jYWxsYmFjayhXaWRnZXQgdywKKwlTaGFyZWRGb250U2VsRGF0YSAqZGF0YSwKKwlYbUxpc3RDYWxsYmFja1N0cnVjdCAqY2FsbF9kYXRhKQoreworICAgIGRvX2Nob2ljZSh3LCBkYXRhLCBjYWxsX2RhdGEsIE5BTUUpOworfQorCisgICAgc3RhdGljIHZvaWQKK3N0eWxlX2NhbGxiYWNrKFdpZGdldCB3LAorCVNoYXJlZEZvbnRTZWxEYXRhICpkYXRhLAorCVhtTGlzdENhbGxiYWNrU3RydWN0ICpjYWxsX2RhdGEpCit7CisgICAgZG9fY2hvaWNlKHcsIGRhdGEsIGNhbGxfZGF0YSwgU1RZTEUpOworfQorCisgICAgc3RhdGljIHZvaWQKK3NpemVfY2FsbGJhY2soV2lkZ2V0IHcsCisJU2hhcmVkRm9udFNlbERhdGEgKmRhdGEsCisJWG1MaXN0Q2FsbGJhY2tTdHJ1Y3QgKmNhbGxfZGF0YSkKK3sKKyAgICBkb19jaG9pY2UodywgZGF0YSwgY2FsbF9kYXRhLCBTSVpFKTsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2NhbmNlbF9jYWxsYmFjayhXaWRnZXQgdywKKwlTaGFyZWRGb250U2VsRGF0YSAqZGF0YSwKKwlYbUxpc3RDYWxsYmFja1N0cnVjdCAqY2FsbF9kYXRhKQoreworICAgIGlmIChkYXRhLT5zZWxbRU5DT0RJTkddKQorICAgIHsKKwlYdEZyZWUoZGF0YS0+c2VsW0VOQ09ESU5HXSk7CisJZGF0YS0+c2VsW0VOQ09ESU5HXSA9IE5VTEw7CisgICAgfQorICAgIGlmIChkYXRhLT5zZWxbTkFNRV0pCisgICAgeworCVh0RnJlZShkYXRhLT5zZWxbTkFNRV0pOworCWRhdGEtPnNlbFtOQU1FXSA9IE5VTEw7CisgICAgfQorICAgIGlmIChkYXRhLT5zZWxbU1RZTEVdKQorICAgIHsKKwlYdEZyZWUoZGF0YS0+c2VsW1NUWUxFXSk7CisJZGF0YS0+c2VsW1NUWUxFXSA9IE5VTEw7CisgICAgfQorICAgIGlmIChkYXRhLT5zZWxbU0laRV0pCisgICAgeworCVh0RnJlZShkYXRhLT5zZWxbU0laRV0pOworCWRhdGEtPnNlbFtTSVpFXSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGRhdGEtPmZvbnRfbmFtZSkKKwlYdEZyZWUoZGF0YS0+Zm9udF9uYW1lKTsKKyAgICBkYXRhLT5mb250X25hbWUgPSBOVUxMOworCisgICAgZGF0YS0+bnVtID0gMDsKKyAgICBYRnJlZUZvbnROYW1lcyhkYXRhLT5uYW1lcyk7CisgICAgZGF0YS0+bmFtZXMgPSBOVUxMOworICAgIGRhdGEtPmV4aXQgPSBUcnVlOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorb2tfY2FsbGJhY2soV2lkZ2V0IHcsCisJU2hhcmVkRm9udFNlbERhdGEgKmRhdGEsCisJWG1QdXNoQnV0dG9uQ2FsbGJhY2tTdHJ1Y3QgKmNhbGxfZGF0YSkKK3sKKyAgICBjaGFyICAgICpwYXR0ZXJuOworICAgIGNoYXIgICAgKipuYW1lOworICAgIGludAkgICAgaTsKKworICAgIHBhdHRlcm4gPSBYbVRleHRHZXRTdHJpbmcoZGF0YS0+bmFtZSk7CisgICAgbmFtZSAgICA9IFhMaXN0Rm9udHMoWHREaXNwbGF5KGRhdGEtPmRpYWxvZyksIHBhdHRlcm4sIDEsICZpKTsKKyAgICBYdEZyZWUocGF0dGVybik7CisKKyAgICBpZiAoaSAhPSAxKQorICAgIHsKKwlkb19kaWFsb2coVklNX0VSUk9SLAorCQkoY2hhcl91ICopXygiRXJyb3IiKSwKKwkJKGNoYXJfdSAqKV8oIkludmFsaWQgZm9udCBzcGVjaWZpY2F0aW9uIiksCisJCShjaGFyX3UgKilfKCImRGlzbWlzcyIpLCAxLCBOVUxMKTsKKwlYRnJlZUZvbnROYW1lcyhuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoZGF0YS0+Zm9udF9uYW1lKQorCSAgICBYdEZyZWUoZGF0YS0+Zm9udF9uYW1lKTsKKwlkYXRhLT5mb250X25hbWUgPSBYdE5ld1N0cmluZyhuYW1lWzBdKTsKKworCWlmIChkYXRhLT5zZWxbRU5DT0RJTkddKQorCXsKKwkgICAgWHRGcmVlKGRhdGEtPnNlbFtFTkNPRElOR10pOworCSAgICBkYXRhLT5zZWxbRU5DT0RJTkddID0gTlVMTDsKKwl9CisJaWYgKGRhdGEtPnNlbFtOQU1FXSkKKwl7CisJICAgIFh0RnJlZShkYXRhLT5zZWxbTkFNRV0pOworCSAgICBkYXRhLT5zZWxbTkFNRV0gPSBOVUxMOworCX0KKwlpZiAoZGF0YS0+c2VsW1NUWUxFXSkKKwl7CisJICAgIFh0RnJlZShkYXRhLT5zZWxbU1RZTEVdKTsKKwkgICAgZGF0YS0+c2VsW1NUWUxFXSA9IE5VTEw7CisJfQorCWlmIChkYXRhLT5zZWxbU0laRV0pCisJeworCSAgICBYdEZyZWUoZGF0YS0+c2VsW1NJWkVdKTsKKwkgICAgZGF0YS0+c2VsW1NJWkVdID0gTlVMTDsKKwl9CisKKwlYRnJlZUZvbnROYW1lcyhuYW1lKTsKKworCWRhdGEtPm51bSA9IDA7CisJWEZyZWVGb250TmFtZXMoZGF0YS0+bmFtZXMpOworCWRhdGEtPm5hbWVzID0gTlVMTDsKKwlkYXRhLT5leGl0ID0gVHJ1ZTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gYW4gQVNDSUkgY2hhcmFjdGVyIHN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZQorICogc2VsZWN0ZWQgZm9udCAoaW4gWCBmb3JtYXQgZm9yIG5hbWluZyBmb250cyk7IGl0IGlzIHRoZSB1c2VycyByZXNwb25zaWJpbGl0eQorICogdG8gZnJlZSB0aGUgc3BhY2UgYWxsb2NhdGVkIHRvIHRoaXMgc3RyaW5nLgorICovCisgICAgY2hhcl91ICoKK2d1aV94bV9zZWxlY3RfZm9udChjaGFyX3UgKmN1cnJlbnQpCit7CisgICAgc3RhdGljIFNoYXJlZEZvbnRTZWxEYXRhCV9kYXRhOworCisgICAgV2lkZ2V0CQlwYXJlbnQ7CisgICAgV2lkZ2V0CQlmb3JtOworICAgIFdpZGdldAkJc2VwYXJhdG9yOworICAgIFdpZGdldAkJc3ViX2Zvcm07CisgICAgV2lkZ2V0CQlzaXplX3RvZ2dsZTsKKyAgICBXaWRnZXQJCW5hbWU7CisgICAgV2lkZ2V0CQlkaXNwX2ZyYW1lOworICAgIFdpZGdldAkJZnJhbWU7CisgICAgQXJnCQkJYXJnc1s2NF07CisgICAgaW50CQkJbjsKKyAgICBYbVN0cmluZwkJc3RyOworICAgIGNoYXIJCWJpZ19mb250W01BWF9GT05UX05BTUVfTEVOXTsKKyAgICBTaGFyZWRGb250U2VsRGF0YQkqZGF0YTsKKworICAgIGRhdGEgPSAmX2RhdGE7CisKKyAgICBwYXJlbnQgPSB2aW1TaGVsbDsKKyAgICBkYXRhLT5uYW1lcyA9IFhMaXN0Rm9udHMoWHREaXNwbGF5KHBhcmVudCksICItKi0qLSotKi0qLSotKi0qLSotKi0qLSotKi0qIiwKKwkJCQkJCSAgICAgICBNQVhfRk9OVFMsICZkYXRhLT5udW0pOworCisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBuYW1lIG9mIHRoZSBiaWdnZXN0IGZvbnQgbGVzcyB0aGFuIHRoZSBnaXZlbiBsaW1pdAorICAgICAqIE1BWF9ESVNQTEFZX1NJWkUgdXNlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgaGVpZ2h0IG9mIHRoZSBkaXNwbGF5CisgICAgICogd2lkZ2V0LgorICAgICAqLworCisgICAgeworCWludAlpOworCWludAltYXg7CisJaW50CWluZGV4ID0gMDsKKwlpbnQJc2l6ZTsKKwljaGFyCXN0clsxMjhdOworCisJZm9yIChpID0gMCwgbWF4ID0gMDsgaSA8IGRhdGEtPm51bTsgaSsrKQorCXsKKwkgICAgZ2V0X3BhcnQoZm4oZGF0YSwgaSksIDcsIHN0cik7CisJICAgIHNpemUgPSBhdG9pKHN0cik7CisJICAgIGlmICgoc2l6ZSA+IG1heCkgJiYgKHNpemUgPCBNQVhfRElTUExBWV9TSVpFKSkKKwkgICAgeworCQlpbmRleCA9IGk7CisJCW1heCA9IHNpemU7CisJICAgIH0KKwl9CisJc3RyY3B5KGJpZ19mb250LCBmbihkYXRhLCBpbmRleCkpOworICAgIH0KKyAgICBkYXRhLT5vbGQgPSBYTG9hZFF1ZXJ5Rm9udChYdERpc3BsYXkocGFyZW50KSwgYmlnX2ZvbnQpOworICAgIGRhdGEtPm9sZF9saXN0ID0gZ3VpX21vdGlmX2NyZWF0ZV9mb250bGlzdChkYXRhLT5vbGQpOworCisgICAgLyogU2V0IHRoZSB0aXRsZSBvZiB0aGUgRGlhbG9nIHdpbmRvdy4gKi8KKyAgICBkYXRhLT5kaWFsb2cgPSBYbUNyZWF0ZURpYWxvZ1NoZWxsKHBhcmVudCwgImZvbnRTZWxlY3RvciIsIE5VTEwsIDApOworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKF8oIlZpbSAtIEZvbnQgU2VsZWN0b3IiKSk7CisKKyAgICAvKiBDcmVhdGUgZm9ybSBwb3B1cCBkaWFsb2cgd2lkZ2V0LiAqLworICAgIGZvcm0gPSBYdFZhQ3JlYXRlV2lkZ2V0KCJmb3JtIiwKKwkgICAgeG1Gb3JtV2lkZ2V0Q2xhc3MsIGRhdGEtPmRpYWxvZywKKwkgICAgWG1OZGlhbG9nVGl0bGUsIHN0ciwKKwkgICAgWG1OYXV0b1VubWFuYWdlLCBGYWxzZSwKKwkgICAgWG1OZGlhbG9nU3R5bGUsIFhtRElBTE9HX0ZVTExfQVBQTElDQVRJT05fTU9EQUwsCisJICAgIE5VTEwpOworICAgIFhtU3RyaW5nRnJlZShzdHIpOworCisgICAgc3ViX2Zvcm0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic3ViRm9ybSIsCisJICAgIHhtRm9ybVdpZGdldENsYXNzLCBmb3JtLAorCSAgICBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU5ib3R0b21PZmZzZXQsIDQsCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OcmlnaHRPZmZzZXQsIDQsCisJICAgIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnRvcE9mZnNldCwgNCwKKwkgICAgWG1Ob3JpZW50YXRpb24sIFhtVkVSVElDQUwsCisJICAgIE5VTEwpOworCisgICAgZGF0YS0+b2sgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChfKCJPSyIpLAorCSAgICB4bVB1c2hCdXR0b25HYWRnZXRDbGFzcywgc3ViX2Zvcm0sCisJICAgIFhtTmxlZnRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnRvcE9mZnNldCwgNCwKKwkgICAgTlVMTCk7CisgICAgYXBwbHlfZm9udGxpc3QoZGF0YS0+b2spOworCisgICAgZGF0YS0+Y2FuY2VsID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoXygiQ2FuY2VsIiksCisJICAgIHhtUHVzaEJ1dHRvbkdhZGdldENsYXNzLCBzdWJfZm9ybSwKKwkgICAgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCSAgICBYbU50b3BXaWRnZXQsIGRhdGEtPm9rLAorCSAgICBYbU50b3BPZmZzZXQsIDQsCisJICAgIFhtTnNob3dBc0RlZmF1bHQsIFRydWUsCisJICAgIE5VTEwpOworICAgIGFwcGx5X2ZvbnRsaXN0KGRhdGEtPmNhbmNlbCk7CisKKyAgICAvKiBDcmVhdGUgdGhlIHNlcGFyYXRvciBmb3IgYmVhdXR5LiAqLworICAgIG4gPSAwOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTm9yaWVudGF0aW9uLCBYbVZFUlRJQ0FMKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0pOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSk7IG4rKzsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCk7IG4rKzsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5yaWdodFdpZGdldCwgc3ViX2Zvcm0pOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRPZmZzZXQsIDQpOyBuKys7CisgICAgc2VwYXJhdG9yID0gWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXQoZm9ybSwgInNlcGFyYXRvciIsIGFyZ3MsIG4pOworICAgIFh0TWFuYWdlQ2hpbGQoc2VwYXJhdG9yKTsKKworICAgIC8qIENyZWF0ZSBmb250IG5hbWUgdGV4dCB3aWRnZXQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGxhYmVsLiAqLworICAgIGRhdGEtPm5hbWUgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZm9udE5hbWUiLAorCSAgICB4bVRleHRXaWRnZXRDbGFzcywgZm9ybSwKKwkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OYm90dG9tT2Zmc2V0LCA0LAorCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1ObGVmdE9mZnNldCwgNCwKKwkgICAgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJICAgIFhtTnJpZ2h0V2lkZ2V0LCBzZXBhcmF0b3IsCisJICAgIFhtTnJpZ2h0T2Zmc2V0LCA0LAorCSAgICBYbU5lZGl0YWJsZSwgRmFsc2UsCisJICAgIFhtTmVkaXRNb2RlLCBYbVNJTkdMRV9MSU5FX0VESVQsCisJICAgIFhtTm1heExlbmd0aCwgTUFYX0ZPTlRfTkFNRV9MRU4sCisJICAgIFhtTmNvbHVtbnMsIDYwLAorCSAgICBOVUxMKTsKKworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKF8oIk5hbWU6IikpOworICAgIG5hbWUgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiZm9udE5hbWVMYWJlbCIsCisJICAgIHhtTGFiZWxHYWRnZXRDbGFzcywgZm9ybSwKKwkgICAgWG1ObGFiZWxTdHJpbmcsIHN0ciwKKwkgICAgWG1OdXNlckRhdGEsIGRhdGEtPm5hbWUsCisJICAgIFhtTmxlZnRBdHRhY2htZW50LCBYbUFUVEFDSF9PUFBPU0lURV9XSURHRVQsCisJICAgIFhtTmxlZnRXaWRnZXQsIGRhdGEtPm5hbWUsCisJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkgICAgWG1OYm90dG9tV2lkZ2V0LCBkYXRhLT5uYW1lLAorCSAgICBYbU50b3BPZmZzZXQsIDEsCisJICAgIE5VTEwpOworICAgIFhtU3RyaW5nRnJlZShzdHIpOworICAgIGFwcGx5X2ZvbnRsaXN0KG5hbWUpOworCisgICAgLyogY3JlYXRlIHNhbXBsZSBkaXNwbGF5IGxhYmVsIHdpZGdldCAqLworICAgIGRpc3BfZnJhbWUgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic2FtcGxlRnJhbWUiLAorCSAgICB4bUZyYW1lV2lkZ2V0Q2xhc3MsIGZvcm0sCisJICAgIFhtTnNoYWRvd1R5cGUsIFhtU0hBRE9XX0VUQ0hFRF9JTiwKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTmxlZnRPZmZzZXQsIDQsCisJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkgICAgWG1OYm90dG9tV2lkZ2V0LCBuYW1lLAorCSAgICBYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkgICAgWG1OcmlnaHRXaWRnZXQsIHNlcGFyYXRvciwKKwkgICAgWG1OcmlnaHRPZmZzZXQsIDQsCisJICAgIFhtTmFsaWdubWVudCwgWG1BTElHTk1FTlRfQkVHSU5OSU5HLAorCSAgICBOVUxMKTsKKworICAgIGRhdGEtPnNhbXBsZSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJzYW1wbGVMYWJlbCIsCisJICAgIHhtTGFiZWxXaWRnZXRDbGFzcywgZGlzcF9mcmFtZSwKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OYWxpZ25tZW50LCBYbUFMSUdOTUVOVF9CRUdJTk5JTkcsCisJICAgIFhtTnJlY29tcHV0ZVNpemUsIEZhbHNlLAorCSAgICBYbU5mb250TGlzdCwgZGF0YS0+b2xkX2xpc3QsCisJICAgIE5VTEwpOworCisgICAgLyogY3JlYXRlIHRvZ2dsZSBidXR0b24gKi8KKyAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZChfKCJTaG93IHNpemUgaW4gUG9pbnRzIikpOworICAgIHNpemVfdG9nZ2xlID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInNpemVUb2dnbGUiLAorCSAgICB4bVRvZ2dsZUJ1dHRvbkdhZGdldENsYXNzLCBmb3JtLAorCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAorCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1ObGVmdE9mZnNldCwgNCwKKwkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCSAgICBYbU5ib3R0b21XaWRnZXQsIGRpc3BfZnJhbWUsCisJICAgIFhtTmJvdHRvbU9mZnNldCwgNCwKKwkgICAgTlVMTCk7CisgICAgWG1TdHJpbmdGcmVlKHN0cik7CisgICAgYXBwbHlfZm9udGxpc3Qoc2l6ZV90b2dnbGUpOworICAgIFh0TWFuYWdlQ2hpbGQoc2l6ZV90b2dnbGUpOworCisgICAgLyogRW5jb2RpbmcgcHVsbGRvd24gbWVudS4KKyAgICAgKi8KKworICAgIGRhdGEtPmVuY29kaW5nX3B1bGxkb3duID0gWG1DcmVhdGVQdWxsZG93bk1lbnUoZm9ybSwKKwkJCQkJCSAiZW5jb2RpbmdQdWxsZG93biIsIE5VTEwsIDApOworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKF8oIkVuY29kaW5nOiIpKTsKKyAgICBuID0gMDsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5zdWJNZW51SWQsIGRhdGEtPmVuY29kaW5nX3B1bGxkb3duKTsgKytuOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsU3RyaW5nLCBzdHIpOyArK247CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0pOyArK247CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1ObGVmdE9mZnNldCwgNCk7ICsrbjsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQpOyArK247CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OYm90dG9tV2lkZ2V0LCBzaXplX3RvZ2dsZSk7ICsrbjsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5ib3R0b21PZmZzZXQsIDQpOyArK247CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQpOyArK247CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRXaWRnZXQsIHNlcGFyYXRvcik7ICsrbjsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5yaWdodE9mZnNldCwgNCk7ICsrbjsKKyAgICBkYXRhLT5lbmNvZGluZ19tZW51ID0gWG1DcmVhdGVPcHRpb25NZW51KGZvcm0sICJlbmNvZGluZ01lbnUiLCBhcmdzLCBuKTsKKyAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKyAgICBYbUFkZFRhYkdyb3VwKGRhdGEtPmVuY29kaW5nX21lbnUpOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgc2Nyb2xsIGxpc3Qgd2lkZ2V0cyBpbiBhIHNlcGFyYXRlIHN1YmZvcm0gdXNlZCB0byBtYW5hZ2UgdGhlCisgICAgICogZGlmZmVyZW50IHNpemVzIG9mIHRoZSBsaXN0cy4KKyAgICAgKi8KKworICAgIHN1Yl9mb3JtID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInN1YkZvcm0iLAorCSAgICB4bUZvcm1XaWRnZXRDbGFzcywgZm9ybSwKKwkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCSAgICBYbU5ib3R0b21XaWRnZXQsIGRhdGEtPmVuY29kaW5nX21lbnUsCisJICAgIFhtTmJvdHRvbU9mZnNldCwgNCwKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTmxlZnRPZmZzZXQsIDQsCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCSAgICBYbU5yaWdodFdpZGdldCwgc2VwYXJhdG9yLAorCSAgICBYbU5yaWdodE9mZnNldCwgNCwKKwkgICAgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OdG9wT2Zmc2V0LCAyLAorCSAgICBYbU5vcmllbnRhdGlvbiwgWG1WRVJUSUNBTCwKKwkgICAgTlVMTCk7CisKKyAgICAvKiBmb250IGxpc3QgKi8KKyAgICBmcmFtZSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJmcmFtZSIsIHhtRnJhbWVXaWRnZXRDbGFzcywgc3ViX2Zvcm0sCisJICAgIFhtTnNoYWRvd1RoaWNrbmVzcywgMCwKKwkgICAgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfUE9TSVRJT04sCisJICAgIFhtTnJpZ2h0UG9zaXRpb24sIDUwLAorCSAgICBOVUxMKTsKKworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKF8oIkZvbnQ6IikpOworICAgIG5hbWUgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgibmFtZUxpc3RMYWJlbCIsIHhtTGFiZWxHYWRnZXRDbGFzcywgZnJhbWUsCisJICAgIFhtTmNoaWxkVHlwZSwgWG1GUkFNRV9USVRMRV9DSElMRCwKKwkgICAgWG1OY2hpbGRWZXJ0aWNhbEFsaWdubWVudCwgWG1BTElHTk1FTlRfQ0VOVEVSLAorCSAgICBYbU5jaGlsZEhvcml6b250YWxBbGlnbm1lbnQsIFhtQUxJR05NRU5UX0JFR0lOTklORywKKwkgICAgWG1ObGFiZWxTdHJpbmcsIHN0ciwKKwkgICAgTlVMTCk7CisgICAgWG1TdHJpbmdGcmVlKHN0cik7CisgICAgYXBwbHlfZm9udGxpc3QobmFtZSk7CisKKyAgICBuID0gMDsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU52aXNpYmxlSXRlbUNvdW50LCA4KTsgKytuOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnJlc2l6YWJsZSwgVHJ1ZSk7ICsrbjsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5saXN0U2l6ZVBvbGljeSwgWG1DT05TVEFOVCk7ICsrbjsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU52aXN1YWxQb2xpY3ksIFhtVkFSSUFCTEUpOyArK247CisjaWZkZWYgTEVTU1RJRl9WRVJTSU9OCisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1Oc2Nyb2xsQmFyRGlzcGxheVBvbGljeSwgWG1TVEFUSUMpOyArK247CisjZW5kaWYKKyAgICBkYXRhLT5saXN0W05BTUVdID0gWG1DcmVhdGVTY3JvbGxlZExpc3QoZnJhbWUsICJmb250TGlzdCIsIGFyZ3MsIG4pOworICAgIFh0VmFTZXRWYWx1ZXMobmFtZSwgWG1OdXNlckRhdGEsIGRhdGEtPmxpc3RbTkFNRV0sIE5VTEwpOworCisgICAgLyogc3R5bGUgbGlzdCAqLworICAgIGZyYW1lID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImZyYW1lIiwgeG1GcmFtZVdpZGdldENsYXNzLCBzdWJfZm9ybSwKKwkgICAgWG1Oc2hhZG93VGhpY2tuZXNzLCAwLAorCSAgICBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfUE9TSVRJT04sCisJICAgIFhtTmxlZnRQb3NpdGlvbiwgNTAsCisJICAgIFhtTmxlZnRPZmZzZXQsIDQsCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfUE9TSVRJT04sCisJICAgIFhtTnJpZ2h0UG9zaXRpb24sIDgwLAorCSAgICBOVUxMKTsKKworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKF8oIlN0eWxlOiIpKTsKKyAgICBuYW1lID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInN0eWxlTGlzdExhYmVsIiwgeG1MYWJlbFdpZGdldENsYXNzLCBmcmFtZSwKKwkgICAgWG1OY2hpbGRUeXBlLCBYbUZSQU1FX1RJVExFX0NISUxELAorCSAgICBYbU5jaGlsZFZlcnRpY2FsQWxpZ25tZW50LCBYbUFMSUdOTUVOVF9DRU5URVIsCisJICAgIFhtTmNoaWxkSG9yaXpvbnRhbEFsaWdubWVudCwgWG1BTElHTk1FTlRfQkVHSU5OSU5HLAorCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAorCSAgICBOVUxMKTsKKyAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKyAgICBhcHBseV9mb250bGlzdChuYW1lKTsKKworICAgIG4gPSAwOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnZpc2libGVJdGVtQ291bnQsIDgpOyArK247CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmVzaXphYmxlLCBUcnVlKTsgKytuOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxpc3RTaXplUG9saWN5LCBYbUNPTlNUQU5UKTsgKytuOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnZpc3VhbFBvbGljeSwgWG1WQVJJQUJMRSk7ICsrbjsKKyNpZmRlZiBMRVNTVElGX1ZFUlNJT04KKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5zY3JvbGxCYXJEaXNwbGF5UG9saWN5LCBYbVNUQVRJQyk7ICsrbjsKKyNlbmRpZgorICAgIGRhdGEtPmxpc3RbU1RZTEVdID0gWG1DcmVhdGVTY3JvbGxlZExpc3QoZnJhbWUsICJzdHlsZUxpc3QiLCBhcmdzLCBuKTsKKyAgICBYdFZhU2V0VmFsdWVzKG5hbWUsIFhtTnVzZXJEYXRhLCBkYXRhLT5saXN0W1NUWUxFXSwgTlVMTCk7CisKKyAgICAvKiBzaXplIGxpc3QgKi8KKyAgICBmcmFtZSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJmcmFtZSIsIHhtRnJhbWVXaWRnZXRDbGFzcywgc3ViX2Zvcm0sCisJICAgIFhtTnNoYWRvd1RoaWNrbmVzcywgMCwKKwkgICAgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX1BPU0lUSU9OLAorCSAgICBYbU5sZWZ0UG9zaXRpb24sIDgwLAorCSAgICBYbU5sZWZ0T2Zmc2V0LCA0LAorCSAgICBYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIE5VTEwpOworCisgICAgc3RyID0gWG1TdHJpbmdDcmVhdGVMb2NhbGl6ZWQoXygiU2l6ZToiKSk7CisgICAgbmFtZSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJzaXplTGlzdExhYmVsIiwgeG1MYWJlbEdhZGdldENsYXNzLCBmcmFtZSwKKwkgICAgWG1OY2hpbGRUeXBlLCBYbUZSQU1FX1RJVExFX0NISUxELAorCSAgICBYbU5jaGlsZFZlcnRpY2FsQWxpZ25tZW50LCBYbUFMSUdOTUVOVF9DRU5URVIsCisJICAgIFhtTmNoaWxkSG9yaXpvbnRhbEFsaWdubWVudCwgWG1BTElHTk1FTlRfQkVHSU5OSU5HLAorCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAorCSAgICBOVUxMKTsKKyAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKyAgICBhcHBseV9mb250bGlzdChuYW1lKTsKKworICAgIG4gPSAwOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnZpc2libGVJdGVtQ291bnQsIDgpOyArK247CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmVzaXphYmxlLCBUcnVlKTsgKytuOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxpc3RTaXplUG9saWN5LCBYbUNPTlNUQU5UKTsgKytuOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnZpc3VhbFBvbGljeSwgWG1WQVJJQUJMRSk7ICsrbjsKKyNpZmRlZiBMRVNTVElGX1ZFUlNJT04KKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5zY3JvbGxCYXJEaXNwbGF5UG9saWN5LCBYbVNUQVRJQyk7ICsrbjsKKyNlbmRpZgorICAgIGRhdGEtPmxpc3RbU0laRV0gPSBYbUNyZWF0ZVNjcm9sbGVkTGlzdChmcmFtZSwgInNpemVMaXN0IiwgYXJncywgbik7CisgICAgWHRWYVNldFZhbHVlcyhuYW1lLCBYbU51c2VyRGF0YSwgZGF0YS0+bGlzdFtTSVpFXSwgTlVMTCk7CisKKyAgICAvKiB1cGRhdGUgZm9ybSB3aWRnZXRzIGNhbmNlbCBidXR0b24gKi8KKyAgICBYdFZhU2V0VmFsdWVzKGZvcm0sIFhtTmNhbmNlbEJ1dHRvbiwgZGF0YS0+Y2FuY2VsLCBOVUxMKTsKKworICAgIFh0QWRkQ2FsbGJhY2soc2l6ZV90b2dnbGUsIFhtTnZhbHVlQ2hhbmdlZENhbGxiYWNrLAorCSAgICAoWHRDYWxsYmFja1Byb2Mpc3RvZ2dsZV9jYWxsYmFjaywgKFh0UG9pbnRlcilkYXRhKTsKKyAgICBYdEFkZENhbGxiYWNrKGRhdGEtPmxpc3RbTkFNRV0sIFhtTmJyb3dzZVNlbGVjdGlvbkNhbGxiYWNrLAorCSAgICAoWHRDYWxsYmFja1Byb2MpbmFtZV9jYWxsYmFjaywgKFh0UG9pbnRlcilkYXRhKTsKKyAgICBYdEFkZENhbGxiYWNrKGRhdGEtPmxpc3RbU1RZTEVdLCBYbU5icm93c2VTZWxlY3Rpb25DYWxsYmFjaywKKwkgICAgKFh0Q2FsbGJhY2tQcm9jKXN0eWxlX2NhbGxiYWNrLCAoWHRQb2ludGVyKWRhdGEpOworICAgIFh0QWRkQ2FsbGJhY2soZGF0YS0+bGlzdFtTSVpFXSwgWG1OYnJvd3NlU2VsZWN0aW9uQ2FsbGJhY2ssCisJICAgIChYdENhbGxiYWNrUHJvYylzaXplX2NhbGxiYWNrLCAoWHRQb2ludGVyKWRhdGEpOworICAgIFh0QWRkQ2FsbGJhY2soZGF0YS0+b2ssIFhtTmFjdGl2YXRlQ2FsbGJhY2ssCisJICAgIChYdENhbGxiYWNrUHJvYylva19jYWxsYmFjaywgKFh0UG9pbnRlcilkYXRhKTsKKyAgICBYdEFkZENhbGxiYWNrKGRhdGEtPmNhbmNlbCwgWG1OYWN0aXZhdGVDYWxsYmFjaywKKwkgICAgKFh0Q2FsbGJhY2tQcm9jKWNhbmNlbF9jYWxsYmFjaywgKFh0UG9pbnRlcilkYXRhKTsKKworICAgIFhtUHJvY2Vzc1RyYXZlcnNhbChkYXRhLT5saXN0W05BTUVdLCBYbVRSQVZFUlNFX0NVUlJFTlQpOworCisgICAgLyogc2V0dXAgdGFiZ3JvdXBzICovCisKKyAgICBYbUFkZFRhYkdyb3VwKGRhdGEtPmxpc3RbTkFNRV0pOworICAgIFhtQWRkVGFiR3JvdXAoZGF0YS0+bGlzdFtTVFlMRV0pOworICAgIFhtQWRkVGFiR3JvdXAoZGF0YS0+bGlzdFtTSVpFXSk7CisgICAgWG1BZGRUYWJHcm91cChzaXplX3RvZ2dsZSk7CisgICAgWG1BZGRUYWJHcm91cChkYXRhLT5uYW1lKTsKKyAgICBYbUFkZFRhYkdyb3VwKGRhdGEtPm9rKTsKKyAgICBYbUFkZFRhYkdyb3VwKGRhdGEtPmNhbmNlbCk7CisKKyAgICBhZGRfY2FuY2VsX2FjdGlvbihkYXRhLT5kaWFsb2csIChYdENhbGxiYWNrUHJvYyljYW5jZWxfY2FsbGJhY2ssIGRhdGEpOworCisgICAgLyogUHJlc2V0IHNlbGVjdGlvbiBkYXRhLiAqLworCisgICAgZGF0YS0+ZXhpdCA9IEZhbHNlOworICAgIGRhdGEtPmluX3BpeGVscz0gVHJ1ZTsKKyAgICBkYXRhLT5zZWxbRU5DT0RJTkddID0gTlVMTDsKKyAgICBkYXRhLT5zZWxbTkFNRV0gPSBOVUxMOworICAgIGRhdGEtPnNlbFtTVFlMRV0gPSBOVUxMOworICAgIGRhdGEtPnNlbFtTSVpFXSA9IE5VTEw7CisgICAgZGF0YS0+Zm9udF9uYW1lID0gTlVMTDsKKworICAgIC8qIHNldCB1cCBjdXJyZW50IGZvbnQgcGFyYW1ldGVycyAqLworICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnRbMF0gIT0gJ1wwJykKKyAgICB7CisJaW50CSAgICBpOworCWNoYXIJICAgICoqbmFtZXM7CisKKwluYW1lcyA9IFhMaXN0Rm9udHMoWHREaXNwbGF5KGZvcm0pLCAoY2hhciAqKSBjdXJyZW50LCAxLCAmaSk7CisKKwlpZiAoaSAhPSAwKQorCXsKKwkgICAgY2hhciBuYW1lW1RFTVBfQlVGX1NJWkVdOworCSAgICBjaGFyIHN0eWxlW1RFTVBfQlVGX1NJWkVdOworCSAgICBjaGFyIHNpemVbVEVNUF9CVUZfU0laRV07CisJICAgIGNoYXIgZW5jb2RpbmdbVEVNUF9CVUZfU0laRV07CisJICAgIGNoYXIgKmZvdW5kOworCisJICAgIGZvdW5kID0gbmFtZXNbMF07CisKKwkgICAgbmFtZV9wYXJ0KGZvdW5kLCBuYW1lKTsKKwkgICAgc3R5bGVfcGFydChmb3VuZCwgc3R5bGUpOworCSAgICBzaXplX3BhcnQoZm91bmQsIHNpemUsIGRhdGEtPmluX3BpeGVscyk7CisJICAgIGVuY29kaW5nX3BhcnQoZm91bmQsIGVuY29kaW5nKTsKKworCSAgICBpZiAoc3RybGVuKG5hbWUpID4gMAorCQkgICAgJiYgc3RybGVuKHN0eWxlKSA+IDAKKwkJICAgICYmIHN0cmxlbihzaXplKSA+IDAKKwkJICAgICYmIHN0cmxlbihlbmNvZGluZykgPiAwKQorCSAgICB7CisJCWRhdGEtPnNlbFtOQU1FXSA9IFh0TmV3U3RyaW5nKG5hbWUpOworCQlkYXRhLT5zZWxbU1RZTEVdID0gWHROZXdTdHJpbmcoc3R5bGUpOworCQlkYXRhLT5zZWxbU0laRV0gPSBYdE5ld1N0cmluZyhzaXplKTsKKwkJZGF0YS0+c2VsW0VOQ09ESU5HXSA9IFh0TmV3U3RyaW5nKGVuY29kaW5nKTsKKwkJZGF0YS0+Zm9udF9uYW1lID0gWHROZXdTdHJpbmcobmFtZXNbMF0pOworCQlkaXNwbGF5X3NhbXBsZShkYXRhKTsKKwkJWG1UZXh0U2V0U3RyaW5nKGRhdGEtPm5hbWUsIGRhdGEtPmZvbnRfbmFtZSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIFdlIGNhbid0IHByZXNldCBhIHN5bWJvbGljIG5hbWUsIHdoaWNoIGlzbid0IGEgZnVsbCBmb250CisJCSAqIGRlc2NyaXB0aW9uLiBUaGVyZWZvcmUgd2UganVzdCBiZWhhdmUgdGhlIHNhbWUgd2F5IGFzIGlmIHRoZQorCQkgKiB1c2VyIGRpZG4ndCBoYXZlIHNlbGVjdGVkIGFueXRoaW5nIHRodXMgZmFyLgorCQkgKgorCQkgKiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGtub3duIHdheSB0byBleHBhbmQgYW4gYWJicmV2aWF0ZWQKKwkJICogZm9udCBuYW1lLgorCQkgKi8KKworCQlkYXRhLT5mb250X25hbWUgPSBOVUxMOworCSAgICB9CisJfQorCVhGcmVlRm9udE5hbWVzKG5hbWVzKTsKKyAgICB9CisKKyAgICBmaWxsX2xpc3RzKE5PTkUsIGRhdGEpOworCisgICAgLyogVW5mb3J0dW5hdGVseSBMZXNzVGlmIGRvZXNuJ3QgYWxpZ24gdGhlIGxpc3Qgd2lkZ2V0J3MgcHJvcGVybHkuICBJIGRvbid0CisgICAgICogaGF2ZSBjdXJyZW50bHkgYW55IGlkZWEgaG93IHRvIGZpeCB0aGlzIHByb2JsZW0uCisgICAgICovCisgICAgWHRNYW5hZ2VDaGlsZChkYXRhLT5saXN0W05BTUVdKTsKKyAgICBYdE1hbmFnZUNoaWxkKGRhdGEtPmxpc3RbU1RZTEVdKTsKKyAgICBYdE1hbmFnZUNoaWxkKGRhdGEtPmxpc3RbU0laRV0pOworICAgIFh0TWFuYWdlQ2hpbGQoZGF0YS0+ZW5jb2RpbmdfbWVudSk7CisgICAgbWFuYWdlX2NlbnRlcmVkKGZvcm0pOworCisgICAgLyogbW9kYWwgZXZlbnQgbG9vcCAqLworICAgIHdoaWxlICghZGF0YS0+ZXhpdCkKKwlYdEFwcFByb2Nlc3NFdmVudChYdFdpZGdldFRvQXBwbGljYXRpb25Db250ZXh0KGRhdGEtPmRpYWxvZyksCisJCQkJCQkJKFh0SW5wdXRNYXNrKVh0SU1BbGwpOworCisgICAgWHREZXN0cm95V2lkZ2V0KGRhdGEtPmRpYWxvZyk7CisKKyAgICBpZiAoZGF0YS0+b2xkKQorICAgIHsKKwlYRnJlZUZvbnQoWHREaXNwbGF5KGRhdGEtPmRpYWxvZyksICBkYXRhLT5vbGQpOworCVhtRm9udExpc3RGcmVlKGRhdGEtPm9sZF9saXN0KTsKKyAgICB9CisKKyAgICBndWlfbW90aWZfc3luY2hfZm9udHMoKTsKKworICAgIHJldHVybiAoY2hhcl91ICopIGRhdGEtPmZvbnRfbmFtZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9taXNjMi5jIGIvc3JjL21pc2MyLmMKaW5kZXggMzBlMWExZi4uZGIwOTFiNSAxMDA2NDQKLS0tIGEvc3JjL21pc2MyLmMKKysrIGIvc3JjL21pc2MyLmMKQEAgLTEwNyw5ICsxMDcsOSBAQAogCiAgICAgaWYgKHdjb2wgPT0gTUFYQ09MIHx8IHJjID09IEZBSUwpCiAJY3Vyd2luLT53X3ZhbGlkICY9IH5WQUxJRF9WSVJUQ09MOwotICAgIGVsc2UKKyAgICBlbHNlIGlmICgqbWxfZ2V0X2N1cnNvcigpICE9IFRBQikKICAgICB7Ci0JLyogVmlydGNvbCBpcyB2YWxpZCAqLworCS8qIFZpcnRjb2wgaXMgdmFsaWQgd2hlbiBub3Qgb24gYSBUQUIgKi8KIAljdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVklSVENPTDsKIAljdXJ3aW4tPndfdmlydGNvbCA9IHdjb2w7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvLmggYi9zcmMvcHJvdG8uaAppbmRleCA0YzUyZDRiLi43N2VhODI2IDEwMDY0NAotLS0gYS9zcmMvcHJvdG8uaAorKysgYi9zcmMvcHJvdG8uaApAQCAtMTk0LDYgKzE5NCw3IEBACiAjICBlbmRpZgogIyAgaWZkZWYgRkVBVF9HVUlfTU9USUYKICMgICBpbmNsdWRlICJndWlfbW90aWYucHJvIgorIyAgIGluY2x1ZGUgImd1aV94bWRsZy5wcm8iCiAjICBlbmRpZgogIyAgaWZkZWYgRkVBVF9HVUlfQVRIRU5BCiAjICAgaW5jbHVkZSAiZ3VpX2F0aGVuYS5wcm8iCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZ3VpX3htZGxnLnBybyBiL3NyYy9wcm90by9ndWlfeG1kbGcucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODhjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZ3VpX3htZGxnLnBybwpAQCAtMCwwICsxLDMgQEAKKy8qIGd1aV94bWRsZy5jICovCitjaGFyX3UgKmd1aV94bV9zZWxlY3RfZm9udCBfX0FSR1MoKGNoYXJfdSAqY3VycmVudCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvd29ya3Nob3AuYyBiL3NyYy93b3Jrc2hvcC5jCmluZGV4IDEwZjRlYTcuLmE4MDU3NWYgMTAwNjQ0Ci0tLSBhL3NyYy93b3Jrc2hvcC5jCisrKyBiL3NyYy93b3Jrc2hvcC5jCkBAIC0xNSwxMCArMTUsMTAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2lmZGVmIEhBVkVfTElCR0VOX0gKICMgaW5jbHVkZSA8bGliZ2VuLmg+Cg==