LyoKICogTWVudSBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IDE5OTMgTWFydGluIEF5b3R0ZQogKiBDb3B5cmlnaHQgMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKICogQ29weXJpZ2h0IDE5OTcgTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAyMDA1IE1heGltZSBCZWxsZW5n6QogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgovKgogKiBOb3RlOiB0aGUgc3R5bGUgTUZfTU9VU0VTRUxFQ1QgaXMgdXNlZCB0byBtYXJrIHBvcHVwIGl0ZW1zIHRoYXQKICogaGF2ZSBiZWVuIHNlbGVjdGVkLCBpLmUuIHRoZWlyIHBvcHVwIG1lbnUgaXMgY3VycmVudGx5IGRpc3BsYXllZC4KICogVGhpcyBpcyBwcm9iYWJseSBub3QgdGhlIG1lYW5pbmcgdGhpcyBzdHlsZSBoYXMgaW4gTVMtV2luZG93cy4KICoKICogVE9ETzoKICogICAgaW1wbGVtZW50cyBzdHlsZXMgOgogKiAgICAgICAgLSBNTlNfQVVUT0RJU01JU1MKICogICAgICAgIC0gTU5TX0RSQUdEUk9QCiAqICAgICAgICAtIE1OU19NT0RFTEVTUwogKiAgICAgICAgLSBNTlNfTk9DSEVDSwogKiAgICAgICAgLSBNTlNfTk9USUZZQllQT1MKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbmUvd2luYmFzZTE2LmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid293bnQzMi5oIgojaW5jbHVkZSAid2luZS9zZXJ2ZXIuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJjb250cm9scy5oIgojaW5jbHVkZSAidXNlcl9wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChtZW51KTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoYWNjZWwpOwoKLyogaW50ZXJuYWwgcG9wdXAgbWVudSB3aW5kb3cgbWVzc2FnZXMgKi8KCiNkZWZpbmUgTU1fU0VUTUVOVUhBTkRMRQkoV01fVVNFUiArIDApCiNkZWZpbmUgTU1fR0VUTUVOVUhBTkRMRQkoV01fVVNFUiArIDEpCgovKiBNZW51IGl0ZW0gc3RydWN0dXJlICovCnR5cGVkZWYgc3RydWN0IHsKICAgIC8qIC0tLS0tLS0tLS0tIE1FTlVJVEVNSU5GTyBTdHVmZiAtLS0tLS0tLS0tLSAqLwogICAgVUlOVCBmVHlwZTsJCQkvKiBJdGVtIHR5cGUuICovCiAgICBVSU5UIGZTdGF0ZTsJCS8qIEl0ZW0gc3RhdGUuICAqLwogICAgVUlOVF9QVFIgd0lEOwkJLyogSXRlbSBpZC4gICovCiAgICBITUVOVSBoU3ViTWVudTsJCS8qIFBvcC11cCBtZW51LiAgKi8KICAgIEhCSVRNQVAgaENoZWNrQml0OwkJLyogQml0bWFwIHdoZW4gY2hlY2tlZC4gICovCiAgICBIQklUTUFQIGhVbkNoZWNrQml0OwkvKiBCaXRtYXAgd2hlbiB1bmNoZWNrZWQuICAqLwogICAgTFBXU1RSIHRleHQ7CQkJLyogSXRlbSB0ZXh0IG9yIGJpdG1hcCBoYW5kbGUuICAqLwogICAgRFdPUkQgZHdJdGVtRGF0YTsJCS8qIEFwcGxpY2F0aW9uIGRlZmluZWQuICAqLwogICAgRFdPUkQgZHdUeXBlRGF0YTsJCS8qIGRlcGVuZHMgb24gZk1hc2sgKi8KICAgIEhCSVRNQVAgaGJtcEl0ZW07CQkvKiBiaXRtYXAgaW4gd2luOTggc3R5bGUgbWVudXMgKi8KICAgIC8qIC0tLS0tLS0tLS0tIFdpbmUgc3R1ZmYgLS0tLS0tLS0tLS0gKi8KICAgIFJFQ1QgICAgICByZWN0OwkJLyogSXRlbSBhcmVhIChyZWxhdGl2ZSB0byBtZW51IHdpbmRvdykgKi8KICAgIFVJTlQgICAgICB4VGFiOwkJLyogWCBwb3NpdGlvbiBvZiB0ZXh0IGFmdGVyIFRhYiAqLwp9IE1FTlVJVEVNOwoKLyogUG9wdXAgbWVudSBzdHJ1Y3R1cmUgKi8KdHlwZWRlZiBzdHJ1Y3QgewogICAgV09SRCAgICAgICAgd0ZsYWdzOyAgICAgICAvKiBNZW51IGZsYWdzIChNRl9QT1BVUCwgTUZfU1lTTUVOVSkgKi8KICAgIFdPUkQgICAgICAgIHdNYWdpYzsgICAgICAgLyogTWFnaWMgbnVtYmVyICovCiAgICBXT1JECVdpZHRoOyAgICAgICAgLyogV2lkdGggb2YgdGhlIHdob2xlIG1lbnUgKi8KICAgIFdPUkQJSGVpZ2h0OyAgICAgICAvKiBIZWlnaHQgb2YgdGhlIHdob2xlIG1lbnUgKi8KICAgIFVJTlQgICAgICAgIG5JdGVtczsgICAgICAgLyogTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBtZW51ICovCiAgICBIV05EICAgICAgICBoV25kOyAgICAgICAgIC8qIFdpbmRvdyBjb250YWluaW5nIHRoZSBtZW51ICovCiAgICBNRU5VSVRFTSAgICAqaXRlbXM7ICAgICAgIC8qIEFycmF5IG9mIG1lbnUgaXRlbXMgKi8KICAgIFVJTlQgICAgICAgIEZvY3VzZWRJdGVtOyAgLyogQ3VycmVudGx5IGZvY3VzZWQgaXRlbSAqLwogICAgSFdORAlod25kT3duZXI7ICAgIC8qIHdpbmRvdyByZWNlaXZpbmcgdGhlIG1lc3NhZ2VzIGZvciBvd25lcmRyYXcgKi8KICAgIEJPT0wgICAgICAgIGJUaW1lVG9IaWRlOyAgLyogUmVxdWVzdCBoaWRpbmcgd2hlbiByZWNlaXZpbmcgYSBzZWNvbmQgY2xpY2sgaW4gdGhlIHRvcC1sZXZlbCBtZW51IGl0ZW0gKi8KICAgIC8qIC0tLS0tLS0tLS0tLSBNRU5VSU5GTyBtZW1iZXJzIC0tLS0tLSAqLwogICAgRFdPUkQJZHdTdHlsZTsJLyogRXh0ZW5kZWQgbWVubnUgc3R5bGUgKi8KICAgIFVJTlQJY3lNYXg7CQkvKiBtYXggaGlnaHQgb2YgdGhlIHdob2xlIG1lbnUsIDAgaXMgc2NyZWVuIGhpZ2h0ICovCiAgICBIQlJVU0gJaGJyQmFjazsJLyogYnJ1c2ggZm9yIG1lbnUgYmFja2dyb3VuZCAqLwogICAgRFdPUkQJZHdDb250ZXh0SGVscElEOwogICAgRFdPUkQJZHdNZW51RGF0YTsJLyogYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSAqLwogICAgSE1FTlUgICAgICAgaFN5c01lbnVPd25lcjsgIC8qIEhhbmRsZSB0byB0aGUgZHVtbXkgc3lzIG1lbnUgaG9sZGVyICovCiAgICBTSVpFICAgICAgICBtYXhCbXBTaXplOyAgICAgLyogTWF4aW11bSBzaXplIG9mIHRoZSBiaXRtYXAgaXRlbXMgaW4gTUlJTV9CSVRNQVAgc3RhdGUgKi8KfSBQT1BVUE1FTlUsICpMUFBPUFVQTUVOVTsKCi8qIGludGVybmFsIGZsYWdzIGZvciBtZW51IHRyYWNraW5nICovCgojZGVmaW5lIFRGX0VORE1FTlUgICAgICAgICAgICAgIDB4MDAwMQojZGVmaW5lIFRGX1NVU1BFTkRQT1BVUCAgICAgICAgIDB4MDAwMgojZGVmaW5lIFRGX1NLSVBSRU1PVkUJCTB4MDAwNAoKdHlwZWRlZiBzdHJ1Y3QKewogICAgVUlOVAl0cmFja0ZsYWdzOwogICAgSE1FTlUJaEN1cnJlbnRNZW51OyAvKiBjdXJyZW50IHN1Ym1lbnUgKGNhbiBiZSBlcXVhbCB0byBoVG9wTWVudSkqLwogICAgSE1FTlUJaFRvcE1lbnU7ICAgICAvKiBpbml0aWFsIG1lbnUgKi8KICAgIEhXTkQJaE93bmVyV25kOyAgICAvKiB3aGVyZSBub3RpZmljYXRpb25zIGFyZSBzZW50ICovCiAgICBQT0lOVAlwdDsKfSBNVFJBQ0tFUjsKCiNkZWZpbmUgTUVOVV9NQUdJQyAgIDB4NTU0ZCAgLyogJ01VJyAqLwoKI2RlZmluZSBJVEVNX1BSRVYJCS0xCiNkZWZpbmUgSVRFTV9ORVhUCQkgMQoKICAvKiBJbnRlcm5hbCBNRU5VX1RyYWNrTWVudSgpIGZsYWdzICovCiNkZWZpbmUgVFBNX0lOVEVSTkFMCQkweEYwMDAwMDAwCiNkZWZpbmUgVFBNX0VOVEVSSURMRUVYCSAJMHg4MDAwMDAwMAkJLyogc2V0IG93bmVyIHdpbmRvdyBmb3IgV01fRU5URVJJRExFICovCiNkZWZpbmUgVFBNX0JVVFRPTkRPV04JCTB4NDAwMDAwMDAJCS8qIG1lbnUgd2FzIGNsaWNrZWQgYmVmb3JlIHRyYWNraW5nICovCiNkZWZpbmUgVFBNX1BPUFVQTUVOVSAgICAgICAgICAgMHgyMDAwMDAwMCAgICAgICAgICAgICAgLyogbWVudSBpcyBhIHBvcHVwIG1lbnUgKi8KCiAgLyogcG9wdXAgbWVudSBzaGFkZSB0aGlja25lc3MgKi8KI2RlZmluZSBQT1BVUF9YU0hBREUJCTQKI2RlZmluZSBQT1BVUF9ZU0hBREUJCTQKCiAgLyogU3BhY2UgYmV0d2VlbiAyIG1lbnUgYmFyIGl0ZW1zICovCiNkZWZpbmUgTUVOVV9CQVJfSVRFTVNfU1BBQ0UgMTIKCiAgLyogTWluaW11bSB3aWR0aCBvZiBhIHRhYiBjaGFyYWN0ZXIgKi8KI2RlZmluZSBNRU5VX1RBQl9TUEFDRSA4CgogIC8qIEhlaWdodCBvZiBhIHNlcGFyYXRvciBpdGVtICovCiNkZWZpbmUgU0VQQVJBVE9SX0hFSUdIVCA1CgogIC8qIFNwYWNlIGJldHdlZW4gMiBjb2x1bW5zICovCiNkZWZpbmUgTUVOVV9DT0xfU1BBQ0UgNAoKICAvKiAob3RoZXIgbWVudS0+Rm9jdXNlZEl0ZW0gdmFsdWVzIGdpdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmb2N1c2VkIGl0ZW0pICovCiNkZWZpbmUgTk9fU0VMRUNURURfSVRFTSAgMHhmZmZmCgojZGVmaW5lIE1FTlVfSVRFTV9UWVBFKGZsYWdzKSBcCiAgKChmbGFncykgJiAoTUZfU1RSSU5HIHwgTUZfQklUTUFQIHwgTUZfT1dORVJEUkFXIHwgTUZfU0VQQVJBVE9SKSkKCiNkZWZpbmUgSVNfU1RSSU5HX0lURU0oZmxhZ3MpIChNRU5VX0lURU1fVFlQRSAoKGZsYWdzKSkgPT0gTUZfU1RSSU5HKQojZGVmaW5lIElTX0JJVE1BUF9JVEVNKGZsYWdzKSAoTUVOVV9JVEVNX1RZUEUgKChmbGFncykpID09IE1GX0JJVE1BUCkKI2RlZmluZSBJU19NQUdJQ19JVEVNKHRleHQpICAgKExPV09SRCgoaW50KXRleHQpPDEyKQoKI2RlZmluZSBJU19TWVNURU1fTUVOVShtZW51KSAgXAoJKCEoKG1lbnUpLT53RmxhZ3MgJiBNRl9QT1BVUCkgJiYgKChtZW51KS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkpCgojZGVmaW5lIFRZUEVfTUFTSyAoTUZUX1NUUklORyB8IE1GVF9CSVRNQVAgfCBNRlRfT1dORVJEUkFXIHwgTUZUX1NFUEFSQVRPUiB8IFwKCQkgICBNRlRfTUVOVUJBUkJSRUFLIHwgTUZUX01FTlVCUkVBSyB8IE1GVF9SQURJT0NIRUNLIHwgXAoJCSAgIE1GVF9SSUdIVE9SREVSIHwgTUZUX1JJR0hUSlVTVElGWSB8IFwKCQkgICBNRl9QT1BVUCB8IE1GX1NZU01FTlUgfCBNRl9IRUxQKQojZGVmaW5lIFNUQVRFX01BU0sgKH5UWVBFX01BU0spCgojZGVmaW5lIFdJTl9BTExPV0VEX01FTlUoc3R5bGUpICgoc3R5bGUgJiAoV1NfQ0hJTEQgfCBXU19QT1BVUCkpICE9IFdTX0NISUxEKQoKICAvKiBEaW1lbnNpb24gb2YgdGhlIG1lbnUgYml0bWFwcyAqLwpzdGF0aWMgV09SRCBhcnJvd19iaXRtYXBfd2lkdGggPSAwLCBhcnJvd19iaXRtYXBfaGVpZ2h0ID0gMDsKCnN0YXRpYyBIQklUTUFQIGhTdGRNbkFycm93ID0gMDsKc3RhdGljIEhCSVRNQVAgaEJtcFN5c01lbnUgPSAwOwoKc3RhdGljIEhCUlVTSAloU2hhZGVCcnVzaCA9IDA7CnN0YXRpYyBIRk9OVAloTWVudUZvbnQgPSAwOwpzdGF0aWMgSEZPTlQJaE1lbnVGb250Qm9sZCA9IDA7CnN0YXRpYyBTSVpFICAgICBtZW51Y2hhcnNpemU7CnN0YXRpYyBVSU5UICAgICBPRGl0ZW1oZWlnaHQ7IC8qIGRlZmF1bHQgb3duZXIgZHJhd24gaXRlbSBoZWlnaHQgKi8gICAgICAKCnN0YXRpYyBITUVOVSBNRU5VX0RlZlN5c1BvcHVwID0gMDsgIC8qIERlZmF1bHQgc3lzdGVtIG1lbnUgcG9wdXAgKi8KCi8qIFVzZSBnbG9iYWwgcG9wdXAgd2luZG93IGJlY2F1c2UgdGhlcmUncyBubyB3YXkgMiBtZW51cyBjYW4KICogYmUgdHJhY2tlZCBhdCB0aGUgc2FtZSB0aW1lLiAgKi8Kc3RhdGljIEhXTkQgdG9wX3BvcHVwOwoKICAvKiBGbGFnIHNldCBieSBFbmRNZW51KCkgdG8gZm9yY2UgYW4gZXhpdCBmcm9tIG1lbnUgdHJhY2tpbmcgKi8Kc3RhdGljIEJPT0wgZkVuZE1lbnUgPSBGQUxTRTsKCnN0YXRpYyBMUkVTVUxUIFdJTkFQSSBQb3B1cE1lbnVXbmRQcm9jKCBIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApOwoKRFdPUkQgV0lOQVBJIERyYXdNZW51QmFyVGVtcChIV05EIGh3bmQsIEhEQyBoREMsIExQUkVDVCBscHJlY3QsIEhNRU5VIGhNZW51LCBIRk9OVCBoRm9udCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG1lbnUgY2xhc3MgZGVzY3JpcHRvcgogKi8KY29uc3Qgc3RydWN0IGJ1aWx0aW5fY2xhc3NfZGVzY3IgTUVOVV9idWlsdGluX2NsYXNzID0KewogICAgUE9QVVBNRU5VX0NMQVNTX0FUT01BLCAgICAgICAgIC8qIG5hbWUgKi8KICAgIENTX0RST1BTSEFET1cgfCBDU19TQVZFQklUUyB8IENTX0RCTENMS1MsICAvKiBzdHlsZSAqLwogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2NBICh3aW5wcm9jIGlzIFVuaWNvZGUgb25seSkgKi8KICAgIFBvcHVwTWVudVduZFByb2MsICAgICAgICAgICAgICAvKiBwcm9jVyAqLwogICAgc2l6ZW9mKEhNRU5VKSwgICAgICAgICAgICAgICAgIC8qIGV4dHJhICovCiAgICBJRENfQVJST1csICAgICAgICAgICAgICAgICAgICAgLyogY3Vyc29yICovCiAgICAoSEJSVVNIKShDT0xPUl9NRU5VKzEpICAgICAgICAgLyogYnJ1c2ggKi8KfTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGRlYnVnX3ByaW50X21lbnVpdGVtCiAqCiAqIFByaW50IGEgbWVudWl0ZW0gaW4gcmVhZGFibGUgZm9ybS4KICovCgojZGVmaW5lIGRlYnVnX3ByaW50X21lbnVpdGVtKHByZSwgbXAsIHBvc3QpIFwKICBpZighVFJBQ0VfT04obWVudSkpIDsgZWxzZSBkb19kZWJ1Z19wcmludF9tZW51aXRlbShwcmUsIG1wLCBwb3N0KQoKI2RlZmluZSBNRU5VT1VUKHRleHQpIFwKICBEUFJJTlRGKCIlcyVzIiwgKGNvdW50KysgPyAiLCIgOiAiIiksICh0ZXh0KSkKCiNkZWZpbmUgTUVOVUZMQUcoYml0LHRleHQpIFwKICBkbyB7IFwKICAgIGlmIChmbGFncyAmIChiaXQpKSB7IGZsYWdzICY9IH4oYml0KTsgTUVOVU9VVCAoKHRleHQpKTsgfSBcCiAgfSB3aGlsZSAoMCkKCnN0YXRpYyB2b2lkIGRvX2RlYnVnX3ByaW50X21lbnVpdGVtKGNvbnN0IGNoYXIgKnByZWZpeCwgTUVOVUlURU0gKiBtcCwKCQkJCSAgICBjb25zdCBjaGFyICpwb3N0Zml4KQp7CiAgICBUUkFDRSgiJXMgIiwgcHJlZml4KTsKICAgIGlmIChtcCkgewoJVUlOVCBmbGFncyA9IG1wLT5mVHlwZTsKCWludCB0eXBlID0gTUVOVV9JVEVNX1RZUEUoZmxhZ3MpOwoJRFBSSU5URiggInsgSUQ9MHgleCIsIG1wLT53SUQpOwoJaWYgKGZsYWdzICYgTUZfUE9QVVApCgkgICAgRFBSSU5URiggIiwgU3ViPSVwIiwgbXAtPmhTdWJNZW51KTsKCWlmIChmbGFncykgewoJICAgIGludCBjb3VudCA9IDA7CgkgICAgRFBSSU5URiggIiwgVHlwZT0iKTsKCSAgICBpZiAodHlwZSA9PSBNRlRfU1RSSU5HKQoJCS8qIE5vdGhpbmcgKi8gOwoJICAgIGVsc2UgaWYgKHR5cGUgPT0gTUZUX1NFUEFSQVRPUikKCQlNRU5VT1VUKCJzZXAiKTsKCSAgICBlbHNlIGlmICh0eXBlID09IE1GVF9PV05FUkRSQVcpCgkJTUVOVU9VVCgib3duIik7CgkgICAgZWxzZSBpZiAodHlwZSA9PSBNRlRfQklUTUFQKQoJCU1FTlVPVVQoImJpdCIpOwoJICAgIGVsc2UKCQlNRU5VT1VUKCI/Pz8iKTsKCSAgICBmbGFncyAtPSB0eXBlOwoKCSAgICBNRU5VRkxBRyhNRl9QT1BVUCwgInBvcCIpOwoJICAgIE1FTlVGTEFHKE1GVF9NRU5VQkFSQlJFQUssICJiYXJicmsiKTsKCSAgICBNRU5VRkxBRyhNRlRfTUVOVUJSRUFLLCAiYnJrIik7CgkgICAgTUVOVUZMQUcoTUZUX1JBRElPQ0hFQ0ssICJyYWRpbyIpOwoJICAgIE1FTlVGTEFHKE1GVF9SSUdIVE9SREVSLCAicm9yZGVyIik7CgkgICAgTUVOVUZMQUcoTUZfU1lTTUVOVSwgInN5cyIpOwoJICAgIE1FTlVGTEFHKE1GVF9SSUdIVEpVU1RJRlksICJyaWdodCIpOwkvKiBzYW1lIGFzIE1GX0hFTFAgKi8KCgkgICAgaWYgKGZsYWdzKQoJCURQUklOVEYoICIrMHgleCIsIGZsYWdzKTsKCX0KCWZsYWdzID0gbXAtPmZTdGF0ZTsKCWlmIChmbGFncykgewoJICAgIGludCBjb3VudCA9IDA7CgkgICAgRFBSSU5URiggIiwgU3RhdGU9Iik7CgkgICAgTUVOVUZMQUcoTUZTX0dSQVlFRCwgImdyZXkiKTsKCSAgICBNRU5VRkxBRyhNRlNfREVGQVVMVCwgImRlZmF1bHQiKTsKCSAgICBNRU5VRkxBRyhNRlNfRElTQUJMRUQsICJkaXMiKTsKCSAgICBNRU5VRkxBRyhNRlNfQ0hFQ0tFRCwgImNoZWNrIik7CgkgICAgTUVOVUZMQUcoTUZTX0hJTElURSwgImhpIik7CgkgICAgTUVOVUZMQUcoTUZfVVNFQ0hFQ0tCSVRNQVBTLCAidXNlYml0Iik7CgkgICAgTUVOVUZMQUcoTUZfTU9VU0VTRUxFQ1QsICJtb3VzZSIpOwoJICAgIGlmIChmbGFncykKCQlEUFJJTlRGKCAiKzB4JXgiLCBmbGFncyk7Cgl9CglpZiAobXAtPmhDaGVja0JpdCkKCSAgICBEUFJJTlRGKCAiLCBDaGs9JXAiLCBtcC0+aENoZWNrQml0KTsKCWlmIChtcC0+aFVuQ2hlY2tCaXQpCgkgICAgRFBSSU5URiggIiwgVW5jPSVwIiwgbXAtPmhVbkNoZWNrQml0KTsKCglpZiAodHlwZSA9PSBNRlRfU1RSSU5HKSB7CgkgICAgaWYgKG1wLT50ZXh0KQoJCURQUklOVEYoICIsIFRleHQ9JXMiLCBkZWJ1Z3N0cl93KG1wLT50ZXh0KSk7CgkgICAgZWxzZQoJCURQUklOVEYoICIsIFRleHQ9TnVsbCIpOwoJfSBlbHNlIGlmIChtcC0+dGV4dCA9PSBOVUxMKQoJICAgIC8qIE5vdGhpbmcgKi8gOwoJZWxzZQoJICAgIERQUklOVEYoICIsIFRleHQ9JXAiLCBtcC0+dGV4dCk7CglpZiAobXAtPmR3SXRlbURhdGEpCgkgICAgRFBSSU5URiggIiwgSXRlbURhdGE9MHglMDhseCIsIG1wLT5kd0l0ZW1EYXRhKTsKCURQUklOVEYoICIgfSIpOwogICAgfSBlbHNlIHsKCURQUklOVEYoICJOVUxMIik7CiAgICB9CgogICAgRFBSSU5URigiICVzXG4iLCBwb3N0Zml4KTsKfQoKI3VuZGVmIE1FTlVPVVQKI3VuZGVmIE1FTlVGTEFHCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0dldE1lbnUKICoKICogVmFsaWRhdGUgdGhlIGdpdmVuIG1lbnUgaGFuZGxlIGFuZCByZXR1cm5zIHRoZSBtZW51IHN0cnVjdHVyZSBwb2ludGVyLgogKi8Kc3RhdGljIFBPUFVQTUVOVSAqTUVOVV9HZXRNZW51KEhNRU5VIGhNZW51KQp7CiAgICBQT1BVUE1FTlUgKm1lbnUgPSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwogICAgaWYgKCFtZW51IHx8IG1lbnUtPndNYWdpYyAhPSBNRU5VX01BR0lDKQogICAgewogICAgICAgIFdBUk4oImludmFsaWQgbWVudSBoYW5kbGU9JXAsIHB0cj0lcCwgbWFnaWM9JXhcbiIsIGhNZW51LCBtZW51LCBtZW51PyBtZW51LT53TWFnaWM6MCk7CiAgICAgICAgbWVudSA9IE5VTEw7CiAgICB9CiAgICByZXR1cm4gbWVudTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBnZXRfd2luX3N5c19tZW51CiAqCiAqIEdldCB0aGUgc3lzdGVtIG1lbnUgb2YgYSB3aW5kb3cKICovCnN0YXRpYyBITUVOVSBnZXRfd2luX3N5c19tZW51KCBIV05EIGh3bmQgKQp7CiAgICBITUVOVSByZXQgPSAwOwogICAgV05EICp3aW4gPSBXSU5fR2V0UHRyKCBod25kICk7CiAgICBpZiAod2luICYmIHdpbiAhPSBXTkRfT1RIRVJfUFJPQ0VTUyAmJiB3aW4gIT0gV05EX0RFU0tUT1ApCiAgICB7CiAgICAgICAgcmV0ID0gd2luLT5oU3lzTWVudTsKICAgICAgICBXSU5fUmVsZWFzZVB0ciggd2luICk7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfQ29weVN5c1BvcHVwCiAqCiAqIFJldHVybiB0aGUgZGVmYXVsdCBzeXN0ZW0gbWVudS4KICovCnN0YXRpYyBITUVOVSBNRU5VX0NvcHlTeXNQb3B1cCh2b2lkKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgc3lzbWVudVdbXSA9IHsnUycsJ1knLCdTJywnTScsJ0UnLCdOJywnVScsMH07CiAgICBITUVOVSBoTWVudSA9IExvYWRNZW51Vyh1c2VyMzJfbW9kdWxlLCBzeXNtZW51Vyk7CgogICAgaWYoIGhNZW51ICkgewogICAgICAgIFBPUFVQTUVOVSogbWVudSA9IE1FTlVfR2V0TWVudShoTWVudSk7CiAgICAgICAgbWVudS0+d0ZsYWdzIHw9IE1GX1NZU01FTlUgfCBNRl9QT1BVUDsKCVNldE1lbnVEZWZhdWx0SXRlbShoTWVudSwgU0NfQ0xPU0UsIEZBTFNFKTsKICAgIH0KICAgIGVsc2UKCUVSUigiVW5hYmxlIHRvIGxvYWQgZGVmYXVsdCBzeXN0ZW0gbWVudVxuIiApOwoKICAgIFRSQUNFKCJyZXR1cm5pbmcgJXAuXG4iLCBoTWVudSApOwoKICAgIHJldHVybiBoTWVudTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0dldFN5c01lbnUKICoKICogQ3JlYXRlIGEgY29weSBvZiB0aGUgc3lzdGVtIG1lbnUuIFN5c3RlbSBtZW51IGluIFdpbmRvd3MgaXMKICogYSBzcGVjaWFsIG1lbnUgYmFyIHdpdGggdGhlIHNpbmdsZSBlbnRyeSAtIHN5c3RlbSBtZW51IHBvcHVwLgogKiBUaGlzIHBvcHVwIGlzIHByZXNlbnRlZCB0byB0aGUgb3V0c2lkZSB3b3JsZCBhcyBhICJzeXN0ZW0gbWVudSIuCiAqIEhvd2V2ZXIsIHRoZSByZWFsIHN5c3RlbSBtZW51IGhhbmRsZSBpcyBzb21ldGltZXMgc2VlbiBpbiB0aGUKICogV01fTUVOVVNFTEVDVCBwYXJhbWV0ZXJzIChhbmQgV29yZCA2IGxpa2VzIGl0IHRoaXMgd2F5KS4KICovCkhNRU5VIE1FTlVfR2V0U3lzTWVudSggSFdORCBoV25kLCBITUVOVSBoUG9wdXBNZW51ICkKewogICAgSE1FTlUgaE1lbnU7CgogICAgVFJBQ0UoImxvYWRpbmcgc3lzdGVtIG1lbnUsIGhXbmQgJXAsIGhQb3B1cE1lbnUgJXBcbiIsIGhXbmQsIGhQb3B1cE1lbnUpOwogICAgaWYgKChoTWVudSA9IENyZWF0ZU1lbnUoKSkpCiAgICB7CglQT1BVUE1FTlUgKm1lbnUgPSBNRU5VX0dldE1lbnUoaE1lbnUpOwoJbWVudS0+d0ZsYWdzID0gTUZfU1lTTUVOVTsKCW1lbnUtPmhXbmQgPSBXSU5fR2V0RnVsbEhhbmRsZSggaFduZCApOwoJVFJBQ0UoImhXbmQgJXAgKGhNZW51ICVwKVxuIiwgbWVudS0+aFduZCwgaE1lbnUpOwoKCWlmIChoUG9wdXBNZW51ID09IChITUVOVSkoLTEpKQoJICAgIGhQb3B1cE1lbnUgPSBNRU5VX0NvcHlTeXNQb3B1cCgpOwoJZWxzZSBpZiggIWhQb3B1cE1lbnUgKSBoUG9wdXBNZW51ID0gTUVOVV9EZWZTeXNQb3B1cDsKCglpZiAoaFBvcHVwTWVudSkKCXsKICAgICAgICAgICAgaWYgKEdldENsYXNzTG9uZ1coaFduZCwgR0NMX1NUWUxFKSAmIENTX05PQ0xPU0UpCiAgICAgICAgICAgICAgICBEZWxldGVNZW51KGhQb3B1cE1lbnUsIFNDX0NMT1NFLCBNRl9CWUNPTU1BTkQpOwoKCSAgICBJbnNlcnRNZW51VyggaE1lbnUsIC0xLCBNRl9TWVNNRU5VIHwgTUZfUE9QVVAgfCBNRl9CWVBPU0lUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlRfUFRSKWhQb3B1cE1lbnUsIE5VTEwgKTsKCiAgICAgICAgICAgIG1lbnUtPml0ZW1zWzBdLmZUeXBlID0gTUZfU1lTTUVOVSB8IE1GX1BPUFVQOwogICAgICAgICAgICBtZW51LT5pdGVtc1swXS5mU3RhdGUgPSAwOwogICAgICAgICAgICBpZiAoKG1lbnUgPSBNRU5VX0dldE1lbnUoaFBvcHVwTWVudSkpKSBtZW51LT53RmxhZ3MgfD0gTUZfU1lTTUVOVTsKCgkgICAgVFJBQ0UoImhNZW51PSVwIChoUG9wdXAgJXApXG4iLCBoTWVudSwgaFBvcHVwTWVudSApOwoJICAgIHJldHVybiBoTWVudTsKCX0KCURlc3Ryb3lNZW51KCBoTWVudSApOwogICAgfQogICAgRVJSKCJmYWlsZWQgdG8gbG9hZCBzeXN0ZW0gbWVudSFcbiIpOwogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfSW5pdAogKgogKiBNZW51cyBpbml0aWFsaXNhdGlvbi4KICovCkJPT0wgTUVOVV9Jbml0KHZvaWQpCnsKICAgIEhCSVRNQVAgaEJpdG1hcDsKICAgIE5PTkNMSUVOVE1FVFJJQ1NXIG5jbTsKCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzaGFkZV9iaXRzWzE2XSA9IHsgMHg1NSwgMCwgMHhBQSwgMCwKCQkJCQkgICAgMHg1NSwgMCwgMHhBQSwgMCwKCQkJCQkgICAgMHg1NSwgMCwgMHhBQSwgMCwKCQkJCQkgICAgMHg1NSwgMCwgMHhBQSwgMCB9OwoKICAgIC8qIExvYWQgbWVudSBiaXRtYXBzICovCiAgICBoU3RkTW5BcnJvdyA9IExvYWRCaXRtYXBXKDAsIE1BS0VJTlRSRVNPVVJDRVcoT0JNX01OQVJST1cpKTsKICAgIC8qIExvYWQgc3lzdGVtIGJ1dHRvbnMgYml0bWFwcyAqLwogICAgaEJtcFN5c01lbnUgPSBMb2FkQml0bWFwVygwLCBNQUtFSU5UUkVTT1VSQ0VXKE9CTV9DTE9TRSkpOwoKICAgIGlmIChoU3RkTW5BcnJvdykKICAgIHsKCUJJVE1BUCBibTsKCUdldE9iamVjdFcoIGhTdGRNbkFycm93LCBzaXplb2YoYm0pLCAmYm0gKTsKCWFycm93X2JpdG1hcF93aWR0aCA9IGJtLmJtV2lkdGg7CglhcnJvd19iaXRtYXBfaGVpZ2h0ID0gYm0uYm1IZWlnaHQ7CiAgICB9IGVsc2UKCXJldHVybiBGQUxTRTsKCiAgICBpZiAoISAoaEJpdG1hcCA9IENyZWF0ZUJpdG1hcCggOCwgOCwgMSwgMSwgc2hhZGVfYml0cykpKQoJcmV0dXJuIEZBTFNFOwoKICAgIGlmKCEoaFNoYWRlQnJ1c2ggPSBDcmVhdGVQYXR0ZXJuQnJ1c2goIGhCaXRtYXAgKSkpCglyZXR1cm4gRkFMU0U7CgogICAgRGVsZXRlT2JqZWN0KCBoQml0bWFwICk7CiAgICBpZiAoIShNRU5VX0RlZlN5c1BvcHVwID0gTUVOVV9Db3B5U3lzUG9wdXAoKSkpCglyZXR1cm4gRkFMU0U7CgogICAgbmNtLmNiU2l6ZSA9IHNpemVvZihOT05DTElFTlRNRVRSSUNTVyk7CiAgICBpZiAoIShTeXN0ZW1QYXJhbWV0ZXJzSW5mb1coU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MsIHNpemVvZihOT05DTElFTlRNRVRSSUNTVyksICZuY20sIDApKSkKCXJldHVybiBGQUxTRTsKCiAgICBpZiAoIShoTWVudUZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RXKCAmbmNtLmxmTWVudUZvbnQgKSkpCglyZXR1cm4gRkFMU0U7CgogICAgbmNtLmxmTWVudUZvbnQubGZXZWlnaHQgKz0gMzAwOwogICAgaWYgKCBuY20ubGZNZW51Rm9udC5sZldlaWdodCA+IDEwMDApCgluY20ubGZNZW51Rm9udC5sZldlaWdodCA9IDEwMDA7CgogICAgaWYgKCEoaE1lbnVGb250Qm9sZCA9IENyZWF0ZUZvbnRJbmRpcmVjdFcoICZuY20ubGZNZW51Rm9udCApKSkKCXJldHVybiBGQUxTRTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0luaXRTeXNNZW51UG9wdXAKICoKICogR3JleSB0aGUgYXBwcm9wcmlhdGUgaXRlbXMgaW4gU3lzdGVtIG1lbnUuCiAqLwpzdGF0aWMgdm9pZCBNRU5VX0luaXRTeXNNZW51UG9wdXAoIEhNRU5VIGhtZW51LCBEV09SRCBzdHlsZSwgRFdPUkQgY2xzU3R5bGUgKQp7CiAgICBCT09MIGdyYXk7CgogICAgZ3JheSA9ICEoc3R5bGUgJiBXU19USElDS0ZSQU1FKSB8fCAoc3R5bGUgJiAoV1NfTUFYSU1JWkUgfCBXU19NSU5JTUlaRSkpOwogICAgRW5hYmxlTWVudUl0ZW0oIGhtZW51LCBTQ19TSVpFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CiAgICBncmF5ID0gKChzdHlsZSAmIFdTX01BWElNSVpFKSAhPSAwKTsKICAgIEVuYWJsZU1lbnVJdGVtKCBobWVudSwgU0NfTU9WRSwgKGdyYXkgPyBNRl9HUkFZRUQgOiBNRl9FTkFCTEVEKSApOwogICAgZ3JheSA9ICEoc3R5bGUgJiBXU19NSU5JTUlaRUJPWCkgfHwgKHN0eWxlICYgV1NfTUlOSU1JWkUpOwogICAgRW5hYmxlTWVudUl0ZW0oIGhtZW51LCBTQ19NSU5JTUlaRSwgKGdyYXkgPyBNRl9HUkFZRUQgOiBNRl9FTkFCTEVEKSApOwogICAgZ3JheSA9ICEoc3R5bGUgJiBXU19NQVhJTUlaRUJPWCkgfHwgKHN0eWxlICYgV1NfTUFYSU1JWkUpOwogICAgRW5hYmxlTWVudUl0ZW0oIGhtZW51LCBTQ19NQVhJTUlaRSwgKGdyYXkgPyBNRl9HUkFZRUQgOiBNRl9FTkFCTEVEKSApOwogICAgZ3JheSA9ICEoc3R5bGUgJiAoV1NfTUFYSU1JWkUgfCBXU19NSU5JTUlaRSkpOwogICAgRW5hYmxlTWVudUl0ZW0oIGhtZW51LCBTQ19SRVNUT1JFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CiAgICBncmF5ID0gKGNsc1N0eWxlICYgQ1NfTk9DTE9TRSkgIT0gMDsKCiAgICAvKiBUaGUgbWVudSBpdGVtIG11c3Qga2VlcCBpdHMgc3RhdGUgaWYgaXQncyBkaXNhYmxlZCAqLwogICAgaWYoZ3JheSkKCUVuYWJsZU1lbnVJdGVtKCBobWVudSwgU0NfQ0xPU0UsIE1GX0dSQVlFRCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgVUlOVCAgTUVOVV9HZXRTdGFydE9mTmV4dENvbHVtbigKICogICAgIEhNRU5VICBoTWVudSApCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBVSU5UICBNRU5VX0dldFN0YXJ0T2ZOZXh0Q29sdW1uKAogICAgSE1FTlUgIGhNZW51ICkKewogICAgUE9QVVBNRU5VICptZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KTsKICAgIFVJTlQgaTsKCiAgICBpZighbWVudSkKCXJldHVybiBOT19TRUxFQ1RFRF9JVEVNOwoKICAgIGkgPSBtZW51LT5Gb2N1c2VkSXRlbSArIDE7CiAgICBpZiggaSA9PSBOT19TRUxFQ1RFRF9JVEVNICkKCXJldHVybiBpOwoKICAgIGZvciggOyBpIDwgbWVudS0+bkl0ZW1zOyArK2kgKSB7CglpZiAobWVudS0+aXRlbXNbaV0uZlR5cGUgJiBNRl9NRU5VQkFSQlJFQUspCgkgICAgcmV0dXJuIGk7CiAgICB9CgogICAgcmV0dXJuIE5PX1NFTEVDVEVEX0lURU07Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgVUlOVCAgTUVOVV9HZXRTdGFydE9mUHJldkNvbHVtbigKICogICAgIEhNRU5VICBoTWVudSApCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBVSU5UICBNRU5VX0dldFN0YXJ0T2ZQcmV2Q29sdW1uKAogICAgSE1FTlUgIGhNZW51ICkKewogICAgUE9QVVBNRU5VICptZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KTsKICAgIFVJTlQgIGk7CgogICAgaWYoICFtZW51ICkKCXJldHVybiBOT19TRUxFQ1RFRF9JVEVNOwoKICAgIGlmKCBtZW51LT5Gb2N1c2VkSXRlbSA9PSAwIHx8IG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0gKQoJcmV0dXJuIE5PX1NFTEVDVEVEX0lURU07CgogICAgLyogRmluZCB0aGUgc3RhcnQgb2YgdGhlIGNvbHVtbiAqLwoKICAgIGZvcihpID0gbWVudS0+Rm9jdXNlZEl0ZW07IGkgIT0gMCAmJgoJICEobWVudS0+aXRlbXNbaV0uZlR5cGUgJiBNRl9NRU5VQkFSQlJFQUspOwoJLS1pKTsgLyogZW1wdHkgKi8KCiAgICBpZihpID09IDApCglyZXR1cm4gTk9fU0VMRUNURURfSVRFTTsKCiAgICBmb3IoLS1pOyBpICE9IDA7IC0taSkgewoJaWYgKG1lbnUtPml0ZW1zW2ldLmZUeXBlICYgTUZfTUVOVUJBUkJSRUFLKQoJICAgIGJyZWFrOwogICAgfQoKICAgIFRSQUNFKCJyZXQgJWQuXG4iLCBpICk7CgogICAgcmV0dXJuIGk7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0ZpbmRJdGVtCiAqCiAqIEZpbmQgYSBtZW51IGl0ZW0uIFJldHVybiBhIHBvaW50ZXIgb24gdGhlIGl0ZW0sIGFuZCBtb2RpZmllcyAqaG1lbnUKICogaW4gY2FzZSB0aGUgaXRlbSB3YXMgaW4gYSBzdWItbWVudS4KICovCnN0YXRpYyBNRU5VSVRFTSAqTUVOVV9GaW5kSXRlbSggSE1FTlUgKmhtZW51LCBVSU5UICpuUG9zLCBVSU5UIHdGbGFncyApCnsKICAgIFBPUFVQTUVOVSAqbWVudTsKICAgIFVJTlQgaTsKCiAgICBpZiAoKCpobWVudSA9PSAoSE1FTlUpMHhmZmZmKSB8fCAoIShtZW51ID0gTUVOVV9HZXRNZW51KCpobWVudSkpKSkgcmV0dXJuIE5VTEw7CiAgICBpZiAod0ZsYWdzICYgTUZfQllQT1NJVElPTikKICAgIHsKCWlmICgqblBvcyA+PSBtZW51LT5uSXRlbXMpIHJldHVybiBOVUxMOwoJcmV0dXJuICZtZW51LT5pdGVtc1sqblBvc107CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTUVOVUlURU0gKml0ZW0gPSBtZW51LT5pdGVtczsKCWZvciAoaSA9IDA7IGkgPCBtZW51LT5uSXRlbXM7IGkrKywgaXRlbSsrKQoJewoJICAgIGlmIChpdGVtLT53SUQgPT0gKm5Qb3MpCgkgICAgewoJCSpuUG9zID0gaTsKCQlyZXR1cm4gaXRlbTsKCSAgICB9CgkgICAgZWxzZSBpZiAoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkKCSAgICB7CgkJSE1FTlUgaHN1Ym1lbnUgPSBpdGVtLT5oU3ViTWVudTsKCQlNRU5VSVRFTSAqc3ViaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoc3VibWVudSwgblBvcywgd0ZsYWdzICk7CgkJaWYgKHN1Yml0ZW0pCgkJewoJCSAgICAqaG1lbnUgPSBoc3VibWVudTsKCQkgICAgcmV0dXJuIHN1Yml0ZW07CgkJfQoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfRmluZFN1Yk1lbnUKICoKICogRmluZCBhIFN1YiBtZW51LiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBzdWJtZW51LCBhbmQgbW9kaWZpZXMKICogKmhtZW51IGluIGNhc2UgaXQgaXMgZm91bmQgaW4gYW5vdGhlciBzdWItbWVudS4KICogSWYgdGhlIHN1Ym1lbnUgY2Fubm90IGJlIGZvdW5kLCBOT19TRUxFQ1RFRF9JVEVNIGlzIHJldHVybmVkLgogKi8KVUlOVCBNRU5VX0ZpbmRTdWJNZW51KCBITUVOVSAqaG1lbnUsIEhNRU5VIGhTdWJUYXJnZXQgKQp7CiAgICBQT1BVUE1FTlUgKm1lbnU7CiAgICBVSU5UIGk7CiAgICBNRU5VSVRFTSAqaXRlbTsKICAgIGlmICgoKCpobWVudSk9PShITUVOVSkweGZmZmYpIHx8CiAgICAgICAgICAgICghKG1lbnUgPSBNRU5VX0dldE1lbnUoKmhtZW51KSkpKQogICAgICAgIHJldHVybiBOT19TRUxFQ1RFRF9JVEVNOwogICAgaXRlbSA9IG1lbnUtPml0ZW1zOwogICAgZm9yIChpID0gMDsgaSA8IG1lbnUtPm5JdGVtczsgaSsrLCBpdGVtKyspIHsKICAgICAgICBpZighKGl0ZW0tPmZUeXBlICYgTUZfUE9QVVApKSBjb250aW51ZTsKICAgICAgICBpZiAoaXRlbS0+aFN1Yk1lbnUgPT0gaFN1YlRhcmdldCkgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgICAgZWxzZSAgewogICAgICAgICAgICBITUVOVSBoc3VibWVudSA9IGl0ZW0tPmhTdWJNZW51OwogICAgICAgICAgICBVSU5UIHBvcyA9IE1FTlVfRmluZFN1Yk1lbnUoICZoc3VibWVudSwgaFN1YlRhcmdldCApOwogICAgICAgICAgICBpZiAocG9zICE9IE5PX1NFTEVDVEVEX0lURU0pIHsKICAgICAgICAgICAgICAgICpobWVudSA9IGhzdWJtZW51OwogICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOT19TRUxFQ1RFRF9JVEVNOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfRnJlZUl0ZW1EYXRhCiAqLwpzdGF0aWMgdm9pZCBNRU5VX0ZyZWVJdGVtRGF0YSggTUVOVUlURU0qIGl0ZW0gKQp7CiAgICAvKiBkZWxldGUgdGV4dCAqLwogICAgaWYgKElTX1NUUklOR19JVEVNKGl0ZW0tPmZUeXBlKSAmJiBpdGVtLT50ZXh0KQogICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBpdGVtLT50ZXh0ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9GaW5kSXRlbUJ5Q29vcmRzCiAqCiAqIEZpbmQgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyAoc2NyZWVuIGNvb3JkcykuIERvZXMKICogbm90IHdvcmsgZm9yIGNoaWxkIHdpbmRvd3MgYW5kIHRoZXJlZm9yZSBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IKICogYW4gYXJiaXRyYXJ5IHN5c3RlbSBtZW51LgogKi8Kc3RhdGljIE1FTlVJVEVNICpNRU5VX0ZpbmRJdGVtQnlDb29yZHMoIGNvbnN0IFBPUFVQTUVOVSAqbWVudSwKCQkJCQlQT0lOVCBwdCwgVUlOVCAqcG9zICkKewogICAgTUVOVUlURU0gKml0ZW07CiAgICBVSU5UIGk7CiAgICBSRUNUIHdyZWN0OwoKICAgIGlmICghR2V0V2luZG93UmVjdChtZW51LT5oV25kLCZ3cmVjdCkpIHJldHVybiBOVUxMOwogICAgcHQueCAtPSB3cmVjdC5sZWZ0O3B0LnkgLT0gd3JlY3QudG9wOwogICAgaXRlbSA9IG1lbnUtPml0ZW1zOwogICAgZm9yIChpID0gMDsgaSA8IG1lbnUtPm5JdGVtczsgaSsrLCBpdGVtKyspCiAgICB7CglpZiAoKHB0LnggPj0gaXRlbS0+cmVjdC5sZWZ0KSAmJiAocHQueCA8IGl0ZW0tPnJlY3QucmlnaHQpICYmCgkgICAgKHB0LnkgPj0gaXRlbS0+cmVjdC50b3ApICYmIChwdC55IDwgaXRlbS0+cmVjdC5ib3R0b20pKQoJewoJICAgIGlmIChwb3MpICpwb3MgPSBpOwoJICAgIHJldHVybiBpdGVtOwoJfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfRmluZEl0ZW1CeUtleQogKgogKiBGaW5kIHRoZSBtZW51IGl0ZW0gc2VsZWN0ZWQgYnkgYSBrZXkgcHJlc3MuCiAqIFJldHVybiBpdGVtIGlkLCAtMSBpZiBub25lLCAtMiBpZiB3ZSBzaG91bGQgY2xvc2UgdGhlIG1lbnUuCiAqLwpzdGF0aWMgVUlOVCBNRU5VX0ZpbmRJdGVtQnlLZXkoIEhXTkQgaHduZE93bmVyLCBITUVOVSBobWVudSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQ0hBUiBrZXksIEJPT0wgZm9yY2VNZW51Q2hhciApCnsKICAgIFRSQUNFKCJcdGxvb2tpbmcgZm9yICclYycgKDB4JTAyeCkgaW4gWyVwXVxuIiwgKGNoYXIpa2V5LCBrZXksIGhtZW51ICk7CgogICAgaWYgKCFJc01lbnUoIGhtZW51ICkpIGhtZW51ID0gR2V0U3ViTWVudSggZ2V0X3dpbl9zeXNfbWVudShod25kT3duZXIpLCAwKTsKCiAgICBpZiAoaG1lbnUpCiAgICB7CglQT1BVUE1FTlUgKm1lbnUgPSBNRU5VX0dldE1lbnUoIGhtZW51ICk7CglNRU5VSVRFTSAqaXRlbSA9IG1lbnUtPml0ZW1zOwoJTFJFU1VMVCBtZW51Y2hhcjsKCglpZiggIWZvcmNlTWVudUNoYXIgKQoJewoJICAgICBVSU5UIGk7CgoJICAgICBmb3IgKGkgPSAwOyBpIDwgbWVudS0+bkl0ZW1zOyBpKyssIGl0ZW0rKykKCSAgICAgewoJCWlmIChJU19TVFJJTkdfSVRFTShpdGVtLT5mVHlwZSkgJiYgaXRlbS0+dGV4dCkKCQl7CgkJICAgIFdDSEFSICpwID0gaXRlbS0+dGV4dCAtIDI7CgkJICAgIGRvCgkJICAgIHsKCQkgICAgCXAgPSBzdHJjaHJXIChwICsgMiwgJyYnKTsKCQkgICAgfQoJCSAgICB3aGlsZSAocCAhPSBOVUxMICYmIHAgWzFdID09ICcmJyk7CgkJICAgIGlmIChwICYmICh0b3VwcGVyVyhwWzFdKSA9PSB0b3VwcGVyVyhrZXkpKSkgcmV0dXJuIGk7CgkJfQoJICAgICB9Cgl9CgltZW51Y2hhciA9IFNlbmRNZXNzYWdlVyggaHduZE93bmVyLCBXTV9NRU5VQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRVdQQVJBTSgga2V5LCBtZW51LT53RmxhZ3MgKSwgKExQQVJBTSlobWVudSApOwoJaWYgKEhJV09SRChtZW51Y2hhcikgPT0gMikgcmV0dXJuIExPV09SRChtZW51Y2hhcik7CglpZiAoSElXT1JEKG1lbnVjaGFyKSA9PSAxKSByZXR1cm4gKFVJTlQpKC0yKTsKICAgIH0KICAgIHJldHVybiAoVUlOVCkoLTEpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0dldEJpdG1hcEl0ZW1TaXplCiAqCiAqIEdldCB0aGUgc2l6ZSBvZiBhIGJpdG1hcCBpdGVtLgogKi8Kc3RhdGljIHZvaWQgTUVOVV9HZXRCaXRtYXBJdGVtU2l6ZSggVUlOVCBpZCwgRFdPUkQgZGF0YSwgU0laRSAqc2l6ZSApCnsKICAgIEJJVE1BUCBibTsKICAgIEhCSVRNQVAgYm1wID0gKEhCSVRNQVApaWQ7CgogICAgc2l6ZS0+Y3ggPSBzaXplLT5jeSA9IDA7CgogICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgYSBtYWdpYyBtZW51IGl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaXRlbSAqLwogICAgaWYgKGlkICYmIElTX01BR0lDX0lURU0oIGlkICkpCiAgICB7CiAgICAgICAgc3dpdGNoKExPV09SRChpZCkpCiAgICAgICAgewogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9TWVNURU06CiAgICAgICAgICAgIGlmIChkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibXAgPSAoSEJJVE1BUClkYXRhOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgICAgY2FzZSAoSU5UX1BUUilIQk1NRU5VX01CQVJfUkVTVE9SRToKICAgICAgICBjYXNlIChJTlRfUFRSKUhCTU1FTlVfTUJBUl9NSU5JTUlaRToKICAgICAgICBjYXNlIChJTlRfUFRSKUhCTU1FTlVfTUJBUl9NSU5JTUlaRV9EOgogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9NQkFSX0NMT1NFOgogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9NQkFSX0NMT1NFX0Q6CiAgICAgICAgICAgIHNpemUtPmN4ID0gR2V0U3lzdGVtTWV0cmljcyggU01fQ1lNRU5VICkgLSA0OwogICAgICAgICAgICBzaXplLT5jeSA9IHNpemUtPmN4OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSAoSU5UX1BUUilIQk1NRU5VX0NBTExCQUNLOgogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9QT1BVUF9DTE9TRToKICAgICAgICBjYXNlIChJTlRfUFRSKUhCTU1FTlVfUE9QVVBfUkVTVE9SRToKICAgICAgICBjYXNlIChJTlRfUFRSKUhCTU1FTlVfUE9QVVBfTUFYSU1JWkU6CiAgICAgICAgY2FzZSAoSU5UX1BUUilIQk1NRU5VX1BPUFVQX01JTklNSVpFOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJNYWdpYyAweCUwOHggbm90IGltcGxlbWVudGVkXG4iLCBpZCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoR2V0T2JqZWN0VyhibXAsIHNpemVvZihibSksICZibSApKQogICAgewogICAgICAgIHNpemUtPmN4ID0gYm0uYm1XaWR0aDsKICAgICAgICBzaXplLT5jeSA9IGJtLmJtSGVpZ2h0OwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfRHJhd0JpdG1hcEl0ZW0KICoKICogRHJhdyBhIGJpdG1hcCBpdGVtLgogKiBkcmF3aGJtYml0bWFwIDogVHJ1ZSB0byBkcmF3IHRoZSBoYm1iaXRtYXAoTUlJTV9CSVRNQVApL0ZhbHNlIHRvIGRyYXcgdGhlIE1GX0JJVE1BUAogKi8Kc3RhdGljIHZvaWQgTUVOVV9EcmF3Qml0bWFwSXRlbSggSERDIGhkYywgTUVOVUlURU0gKmxwaXRlbSwgY29uc3QgUkVDVCAqcmVjdCwgQk9PTCBtZW51QmFyLCBCT09MIGRyYXdoYm1iaXRtYXAgKQp7CiAgICBCSVRNQVAgYm07CiAgICBEV09SRCByb3A7CiAgICBIREMgaGRjTWVtOwogICAgSEJJVE1BUCBibXAgPSAoSEJJVE1BUClscGl0ZW0tPnRleHQ7CiAgICBpbnQgdyA9IHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdDsKICAgIGludCBoID0gcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wOwogICAgaW50IGJtcF94b2Zmc2V0ID0gMDsKICAgIGludCBsZWZ0LCB0b3A7CiAgICBIQklUTUFQIGhibVRvRHJhdyA9IChkcmF3aGJtYml0bWFwKT9scGl0ZW0tPmhibXBJdGVtOihIQklUTUFQKWxwaXRlbS0+dGV4dDsgICAgCgogICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBtYWdpYyBtZW51IGl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaXRlbSAqLwogICAgaWYgKGhibVRvRHJhdyAmJiBJU19NQUdJQ19JVEVNKGhibVRvRHJhdykpCiAgICB7CiAgICAgICAgVUlOVCBmbGFncyA9IDA7CiAgICAgICAgUkVDVCByOwoKCXN3aXRjaChMT1dPUkQoaGJtVG9EcmF3KSkKICAgICAgICB7CiAgICAgICAgY2FzZSAoSU5UX1BUUilIQk1NRU5VX1NZU1RFTToKICAgICAgICAgICAgaWYgKGxwaXRlbS0+ZHdJdGVtRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYm1wID0gKEhCSVRNQVApbHBpdGVtLT5kd0l0ZW1EYXRhOwogICAgICAgICAgICAgICAgaWYgKCFHZXRPYmplY3RXKCBibXAsIHNpemVvZihibSksICZibSApKSByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibXAgPSBoQm1wU3lzTWVudTsKICAgICAgICAgICAgICAgIGlmICghR2V0T2JqZWN0VyggYm1wLCBzaXplb2YoYm0pLCAmYm0gKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgLyogb25seSB1c2UgcmlnaHQgaGFsZiBvZiB0aGUgYml0bWFwICovCiAgICAgICAgICAgICAgICBibXBfeG9mZnNldCA9IGJtLmJtV2lkdGggLyAyOwogICAgICAgICAgICAgICAgYm0uYm1XaWR0aCAtPSBibXBfeG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnb3RvIGdvdF9iaXRtYXA7CiAgICAgICAgY2FzZSAoSU5UX1BUUilIQk1NRU5VX01CQVJfUkVTVE9SRToKICAgICAgICAgICAgZmxhZ3MgPSBERkNTX0NBUFRJT05SRVNUT1JFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIChJTlRfUFRSKUhCTU1FTlVfTUJBUl9NSU5JTUlaRToKICAgICAgICAgICAgZmxhZ3MgPSBERkNTX0NBUFRJT05NSU47CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9NQkFSX01JTklNSVpFX0Q6CiAgICAgICAgICAgIGZsYWdzID0gREZDU19DQVBUSU9OTUlOIHwgREZDU19JTkFDVElWRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAoSU5UX1BUUilIQk1NRU5VX01CQVJfQ0xPU0U6CiAgICAgICAgICAgIGZsYWdzID0gREZDU19DQVBUSU9OQ0xPU0U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9NQkFSX0NMT1NFX0Q6CiAgICAgICAgICAgIGZsYWdzID0gREZDU19DQVBUSU9OQ0xPU0UgfCBERkNTX0lOQUNUSVZFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIChJTlRfUFRSKUhCTU1FTlVfQ0FMTEJBQ0s6CiAgICAgICAgY2FzZSAoSU5UX1BUUilIQk1NRU5VX1BPUFVQX0NMT1NFOgogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9QT1BVUF9SRVNUT1JFOgogICAgICAgIGNhc2UgKElOVF9QVFIpSEJNTUVOVV9QT1BVUF9NQVhJTUlaRToKICAgICAgICBjYXNlIChJTlRfUFRSKUhCTU1FTlVfUE9QVVBfTUlOSU1JWkU6CiAgICAgICAgZGVmYXVsdDoKCSAgICBGSVhNRSgiTWFnaWMgMHglMDh4IG5vdCBpbXBsZW1lbnRlZFxuIiwgTE9XT1JEKGhibVRvRHJhdykpOyAKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByID0gKnJlY3Q7CiAgICAgICAgSW5mbGF0ZVJlY3QoICZyLCAtMSwgLTEgKTsKICAgICAgICBpZiAobHBpdGVtLT5mU3RhdGUgJiBNRl9ISUxJVEUpIGZsYWdzIHw9IERGQ1NfUFVTSEVEOwogICAgICAgIERyYXdGcmFtZUNvbnRyb2woIGhkYywgJnIsIERGQ19DQVBUSU9OLCBmbGFncyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIWJtcCB8fCAhR2V0T2JqZWN0VyggYm1wLCBzaXplb2YoYm0pLCAmYm0gKSkgcmV0dXJuOwoKIGdvdF9iaXRtYXA6CiAgICBoZGNNZW0gPSBDcmVhdGVDb21wYXRpYmxlREMoIGhkYyApOwogICAgU2VsZWN0T2JqZWN0KCBoZGNNZW0sIGJtcCApOwoKICAgIC8qIGhhbmRsZSBmb250c2l6ZSA+IGJpdG1hcF9oZWlnaHQgKi8KICAgIHRvcCA9IChoPmJtLmJtSGVpZ2h0KSA/IHJlY3QtPnRvcCsoaC1ibS5ibUhlaWdodCkvMiA6IHJlY3QtPnRvcDsKICAgIGxlZnQ9cmVjdC0+bGVmdDsKICAgIHJvcD0oKGxwaXRlbS0+ZlN0YXRlICYgTUZfSElMSVRFKSAmJiAhSVNfTUFHSUNfSVRFTShoYm1Ub0RyYXcpKSA/IE5PVFNSQ0NPUFkgOiBTUkNDT1BZOwogICAgaWYgKChscGl0ZW0tPmZTdGF0ZSAmIE1GX0hJTElURSkgJiYgSVNfQklUTUFQX0lURU0obHBpdGVtLT5mVHlwZSkpCiAgICAgICAgU2V0QmtDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVCkpOwogICAgQml0Qmx0KCBoZGMsIGxlZnQsIHRvcCwgdywgaCwgaGRjTWVtLCBibXBfeG9mZnNldCwgMCwgcm9wICk7CiAgICBEZWxldGVEQyggaGRjTWVtICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfQ2FsY0l0ZW1TaXplCiAqCiAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVudSBpdGVtIGFuZCBzdG9yZSBpdCBpbiBscGl0ZW0tPnJlY3QuCiAqLwpzdGF0aWMgdm9pZCBNRU5VX0NhbGNJdGVtU2l6ZSggSERDIGhkYywgTUVOVUlURU0gKmxwaXRlbSwgSFdORCBod25kT3duZXIsCgkJCSAgICAgICBJTlQgb3JnWCwgSU5UIG9yZ1ksIEJPT0wgbWVudUJhciwgUE9QVVBNRU5VKiBscHBvcCApCnsKICAgIFdDSEFSICpwOwogICAgVUlOVCBjaGVja19iaXRtYXBfd2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKCBTTV9DWE1FTlVDSEVDSyApOwoKICAgIFRSQUNFKCJkYz0lcCBvd25lcj0lcCAoJWQsJWQpXG4iLCBoZGMsIGh3bmRPd25lciwgb3JnWCwgb3JnWSk7CiAgICBkZWJ1Z19wcmludF9tZW51aXRlbSgiTUVOVV9DYWxjSXRlbVNpemU6IG1lbnVpdGVtOiIsIGxwaXRlbSwKCQkJIChtZW51QmFyID8gIiAoTWVudUJhcikiIDogIiIpKTsKCiAgICBTZXRSZWN0KCAmbHBpdGVtLT5yZWN0LCBvcmdYLCBvcmdZLCBvcmdYLCBvcmdZICk7CgogICAgaWYgKGxwaXRlbS0+ZlR5cGUgJiBNRl9PV05FUkRSQVcpCiAgICB7CiAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QgbWlzOwogICAgICAgIC8qIG5vdCBkb25lIGluIE1lbnVfSW5pdDogR2V0RGlhbG9nQmFzZVVuaXRzKCkgYnJlYWtzIHRoZXJlICovCiAgICAgICAgaWYoICFtZW51Y2hhcnNpemUuY3ggKSB7CiAgICAgICAgICAgIERJQUxPR19HZXRDaGFyU2l6ZSggaGRjLCBoTWVudUZvbnQsICZtZW51Y2hhcnNpemUgKTsKICAgICAgICAgICAgLyogV2luOTUvOTgvTUUgd2lsbCB1c2UgbWVudWNoYXJzaXplLmN5IGhlcmUuIFRlc3RpbmcgaXMgcG9zc2libGUKICAgICAgICAgICAgICogYnV0IGl0IGlzIHVubGlrZWx5IGFuIGFwcGxpY2F0aW9uIHdpbGwgZGVwZW5kIG9uIHRoYXQgKi8KICAgICAgICAgICAgT0RpdGVtaGVpZ2h0ID0gSElXT1JEKCBHZXREaWFsb2dCYXNlVW5pdHMoKSk7CiAgICAgICAgfQogICAgICAgIG1pcy5DdGxUeXBlICAgID0gT0RUX01FTlU7CiAgICAgICAgbWlzLkN0bElEICAgICAgPSAwOwogICAgICAgIG1pcy5pdGVtSUQgICAgID0gbHBpdGVtLT53SUQ7CiAgICAgICAgbWlzLml0ZW1EYXRhICAgPSAoRFdPUkQpbHBpdGVtLT5kd0l0ZW1EYXRhOwogICAgICAgIG1pcy5pdGVtSGVpZ2h0ID0gT0RpdGVtaGVpZ2h0OwogICAgICAgIG1pcy5pdGVtV2lkdGggID0gMDsKICAgICAgICBTZW5kTWVzc2FnZVcoIGh3bmRPd25lciwgV01fTUVBU1VSRUlURU0sIDAsIChMUEFSQU0pJm1pcyApOwogICAgICAgIC8qIFRlc3RzIHJldmVhbCB0aGF0IFdpbmRvd3MgKCBXaW45NSB0aHJ1IFdpblhQKSBhZGRzIHR3aWNlIHRoZSBhdmVyYWdlCiAgICAgICAgICogd2lkdGggb2YgYSBtZW51Zm9udCBjaGFyYWN0ZXIgdG8gdGhlIHdpZHRoIG9mIGFuIG93bmVyLWRyYXduIG1lbnUuIAogICAgICAgICAqLwogICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCArPSBtaXMuaXRlbVdpZHRoICsgMiAqIG1lbnVjaGFyc2l6ZS5jeDsKICAgICAgICBpZiAobWVudUJhcikgewogICAgICAgICAgICAvKiB1bmRlciBhdCBsZWFzdCB3aW45NSB5b3Ugc2VlbSB0byBiZSBnaXZlbiBhIHN0YW5kYXJkCiAgICAgICAgICAgICAgIGhlaWdodCBmb3IgdGhlIG1lbnUgYW5kIHRoZSBoZWlnaHQgdmFsdWUgaXMgaWdub3JlZCAqLwogICAgICAgICAgICBscGl0ZW0tPnJlY3QuYm90dG9tICs9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lNRU5VU0laRSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIGxwaXRlbS0+cmVjdC5ib3R0b20gKz0gbWlzLml0ZW1IZWlnaHQ7CgogICAgICAgIFRSQUNFKCJpZD0lMDR4IHNpemU9JWxkeCVsZFxuIiwKICAgICAgICAgICAgICAgIGxwaXRlbS0+d0lELCBscGl0ZW0tPnJlY3QucmlnaHQtbHBpdGVtLT5yZWN0LmxlZnQsCiAgICAgICAgICAgICAgICBscGl0ZW0tPnJlY3QuYm90dG9tLWxwaXRlbS0+cmVjdC50b3ApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAobHBpdGVtLT5mVHlwZSAmIE1GX1NFUEFSQVRPUikKICAgIHsKCWxwaXRlbS0+cmVjdC5ib3R0b20gKz0gU0VQQVJBVE9SX0hFSUdIVDsKCXJldHVybjsKICAgIH0KCiAgICBpZiAoIW1lbnVCYXIpCiAgICB7CgkvKiBOZXcgc3R5bGUgTUlJTV9CSVRNQVAgKi8KCWlmIChscGl0ZW0tPmhibXBJdGVtKSAKCXsKCSAgICBpZiAobHBpdGVtLT5oYm1wSXRlbSA9PSBIQk1NRU5VX0NBTExCQUNLKQoJICAgIHsKCQlNRUFTVVJFSVRFTVNUUlVDVCBtZWFzSXRlbTsKCQltZWFzSXRlbS5DdGxUeXBlID0gT0RUX01FTlU7CgkJbWVhc0l0ZW0uQ3RsSUQgPSAwOwoJCW1lYXNJdGVtLml0ZW1JRCA9IGxwaXRlbS0+d0lEOwoJCW1lYXNJdGVtLml0ZW1XaWR0aCA9IGxwaXRlbS0+cmVjdC5yaWdodCAtIGxwaXRlbS0+cmVjdC5sZWZ0OwoJCW1lYXNJdGVtLml0ZW1IZWlnaHQgPSBscGl0ZW0tPnJlY3QuYm90dG9tIC0gbHBpdGVtLT5yZWN0LnRvcDsKCQltZWFzSXRlbS5pdGVtRGF0YSA9IGxwaXRlbS0+ZHdJdGVtRGF0YTsKCQkKCQlTZW5kTWVzc2FnZVcoIGh3bmRPd25lciwgV01fTUVBU1VSRUlURU0sIGxwaXRlbS0+d0lELCAoTFBBUkFNKSZtZWFzSXRlbSk7CgkgICAgCgkJLyogS2VlcCB0aGUgc2l6ZSBvZiB0aGUgYml0bWFwIGluIGNhbGxiYWNrIG1vZGUgdG8gYmUgYWJsZSB0byBkcmF3IGl0IGNvcnJlY3RseSAqLwoJCWxwcG9wLT5tYXhCbXBTaXplLmN4ID0gbWF4KGxwcG9wLT5tYXhCbXBTaXplLmN4LCBtZWFzSXRlbS5pdGVtV2lkdGggLSAobHBpdGVtLT5yZWN0LnJpZ2h0IC0gbHBpdGVtLT5yZWN0LmxlZnQpKTsKCQlscHBvcC0+bWF4Qm1wU2l6ZS5jeSA9IG1heChscHBvcC0+bWF4Qm1wU2l6ZS5jeSwgbWVhc0l0ZW0uaXRlbUhlaWdodCAtIChscGl0ZW0tPnJlY3QuYm90dG9tIC0gbHBpdGVtLT5yZWN0LnRvcCkpOwoJCWxwaXRlbS0+cmVjdC5yaWdodCA9IGxwaXRlbS0+cmVjdC5sZWZ0ICsgbWVhc0l0ZW0uaXRlbVdpZHRoOwoJICAgIH0gZWxzZSB7CgkJU0laRSBzaXplOwoJCU1FTlVfR2V0Qml0bWFwSXRlbVNpemUoKFVJTlQpbHBpdGVtLT5oYm1wSXRlbSwgbHBpdGVtLT5kd0l0ZW1EYXRhLCAmc2l6ZSk7CgkJbHBwb3AtPm1heEJtcFNpemUuY3ggPSBtYXgobHBwb3AtPm1heEJtcFNpemUuY3gsIHNpemUuY3gpOwoJCWxwcG9wLT5tYXhCbXBTaXplLmN5ID0gbWF4KGxwcG9wLT5tYXhCbXBTaXplLmN5LCBzaXplLmN5KTsKCQlscGl0ZW0tPnJlY3QucmlnaHQgICs9IHNpemUuY3g7CgkJbHBpdGVtLT5yZWN0LmJvdHRvbSArPSBzaXplLmN5OwoJICAgIH0KCSAgICBpZiAobHBwb3AtPmR3U3R5bGUgJiBNTlNfQ0hFQ0tPUkJNUCkgCgkJbHBpdGVtLT5yZWN0LnJpZ2h0ICs9IGNoZWNrX2JpdG1hcF93aWR0aDsKCSAgICBlbHNlCgkJbHBpdGVtLT5yZWN0LnJpZ2h0ICs9IDIgKiBjaGVja19iaXRtYXBfd2lkdGg7Cgl9IGVsc2UKCSAgICBscGl0ZW0tPnJlY3QucmlnaHQgKz0gMiAqIGNoZWNrX2JpdG1hcF93aWR0aDsKCWlmIChscGl0ZW0tPmZUeXBlICYgTUZfUE9QVVApCgkgICAgbHBpdGVtLT5yZWN0LnJpZ2h0ICs9IGFycm93X2JpdG1hcF93aWR0aDsKICAgIH0KCiAgICBpZiAoSVNfQklUTUFQX0lURU0obHBpdGVtLT5mVHlwZSkpCiAgICB7CiAgICAgICAgU0laRSBzaXplOwoKICAgICAgICBNRU5VX0dldEJpdG1hcEl0ZW1TaXplKCAoaW50KWxwaXRlbS0+dGV4dCwgbHBpdGVtLT5kd0l0ZW1EYXRhLCAmc2l6ZSApOwogICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCAgKz0gc2l6ZS5jeDsKICAgICAgICBscGl0ZW0tPnJlY3QuYm90dG9tICs9IHNpemUuY3k7CiAgICAgICAgLyogTGVhdmUgc3BhY2UgZm9yIHRoZSBzdW5rZW4gYm9yZGVyICovCiAgICAgICAgbHBpdGVtLT5yZWN0LnJpZ2h0ICArPSAyOwogICAgICAgIGxwaXRlbS0+cmVjdC5ib3R0b20gKz0gMjsKICAgIH0KCgogICAgLyogaXQgbXVzdCBiZSBhIHRleHQgaXRlbSAtIHVubGVzcyBpdCdzIHRoZSBzeXN0ZW0gbWVudSAqLwogICAgaWYgKCEobHBpdGVtLT5mVHlwZSAmIE1GX1NZU01FTlUpICYmIElTX1NUUklOR19JVEVNKCBscGl0ZW0tPmZUeXBlICkpCiAgICB7ICAgU0laRSBzaXplOwoKCUdldFRleHRFeHRlbnRQb2ludDMyVyhoZGMsIGxwaXRlbS0+dGV4dCwgIHN0cmxlblcobHBpdGVtLT50ZXh0KSwgJnNpemUpOwoKCWxwaXRlbS0+cmVjdC5yaWdodCAgKz0gc2l6ZS5jeDsKCWxwaXRlbS0+cmVjdC5ib3R0b20gKz0gbWF4KG1heChzaXplLmN5LCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZTUVOVSktMSksIGxwcG9wLT5tYXhCbXBTaXplLmN5KTsKCWxwaXRlbS0+eFRhYiA9IDA7CgoJaWYgKG1lbnVCYXIpCgl7CgkgICAgIGxwaXRlbS0+cmVjdC5yaWdodCArPSBNRU5VX0JBUl9JVEVNU19TUEFDRTsKCX0KCWVsc2UgaWYgKChwID0gc3RyY2hyVyggbHBpdGVtLT50ZXh0LCAnXHQnICkpICE9IE5VTEwpCgl7CgkgICAgLyogSXRlbSBjb250YWlucyBhIHRhYiAob25seSBtZWFuaW5nZnVsIGluIHBvcHVwIG1lbnVzKSAqLwoJICAgIEdldFRleHRFeHRlbnRQb2ludDMyVyhoZGMsIGxwaXRlbS0+dGV4dCwgKGludCkocCAtIGxwaXRlbS0+dGV4dCkgLCAmc2l6ZSk7CgkgICAgbHBpdGVtLT54VGFiID0gY2hlY2tfYml0bWFwX3dpZHRoICsgTUVOVV9UQUJfU1BBQ0UgKyBzaXplLmN4OwoJICAgIGxwaXRlbS0+cmVjdC5yaWdodCArPSBNRU5VX1RBQl9TUEFDRTsKCX0KCWVsc2UKCXsKCSAgICBpZiAoc3RyY2hyVyggbHBpdGVtLT50ZXh0LCAnXGInICkpCgkgICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCArPSBNRU5VX1RBQl9TUEFDRTsKCSAgICBscGl0ZW0tPnhUYWIgPSBscGl0ZW0tPnJlY3QucmlnaHQgLSBjaGVja19iaXRtYXBfd2lkdGgKCSAgICAgICAgICAgICAgICAgICAtIGFycm93X2JpdG1hcF93aWR0aDsKCX0KICAgIH0KICAgIFRSQUNFKCIoJWxkLCVsZCktKCVsZCwlbGQpXG4iLCBscGl0ZW0tPnJlY3QubGVmdCwgbHBpdGVtLT5yZWN0LnRvcCwgbHBpdGVtLT5yZWN0LnJpZ2h0LCBscGl0ZW0tPnJlY3QuYm90dG9tKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9Qb3B1cE1lbnVDYWxjU2l6ZQogKgogKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBwb3B1cCBtZW51LgogKi8Kc3RhdGljIHZvaWQgTUVOVV9Qb3B1cE1lbnVDYWxjU2l6ZSggTFBQT1BVUE1FTlUgbHBwb3AsIEhXTkQgaHduZE93bmVyICkKewogICAgTUVOVUlURU0gKmxwaXRlbTsKICAgIEhEQyBoZGM7CiAgICBpbnQgc3RhcnQsIGk7CiAgICBpbnQgb3JnWCwgb3JnWSwgbWF4WCwgbWF4VGFiLCBtYXhUYWJXaWR0aDsKCiAgICBscHBvcC0+V2lkdGggPSBscHBvcC0+SGVpZ2h0ID0gMDsKICAgIGlmIChscHBvcC0+bkl0ZW1zID09IDApIHJldHVybjsKICAgIGhkYyA9IEdldERDKCAwICk7CgogICAgU2VsZWN0T2JqZWN0KCBoZGMsIGhNZW51Rm9udCk7CgogICAgc3RhcnQgPSAwOwogICAgbWF4WCA9IDIgKyAxOwoKICAgIGxwcG9wLT5tYXhCbXBTaXplLmN4ID0gMDsKICAgIGxwcG9wLT5tYXhCbXBTaXplLmN5ID0gMDsKCiAgICB3aGlsZSAoc3RhcnQgPCBscHBvcC0+bkl0ZW1zKQogICAgewoJbHBpdGVtID0gJmxwcG9wLT5pdGVtc1tzdGFydF07CglvcmdYID0gbWF4WDsKICAgICAgICBpZiggbHBpdGVtLT5mVHlwZSAmIE1GX01FTlVCUkVBSykKICAgICAgICAgICAgb3JnWCArPSBNRU5VX0NPTF9TUEFDRTsgCglvcmdZID0gMzsKCgltYXhUYWIgPSBtYXhUYWJXaWR0aCA9IDA7CgkgIC8qIFBhcnNlIGl0ZW1zIHVudGlsIGNvbHVtbiBicmVhayBvciBlbmQgb2YgbWVudSAqLwoJZm9yIChpID0gc3RhcnQ7IGkgPCBscHBvcC0+bkl0ZW1zOyBpKyssIGxwaXRlbSsrKQoJewoJICAgIGlmICgoaSAhPSBzdGFydCkgJiYKCQkobHBpdGVtLT5mVHlwZSAmIChNRl9NRU5VQlJFQUsgfCBNRl9NRU5VQkFSQlJFQUspKSkgYnJlYWs7CgoJICAgIE1FTlVfQ2FsY0l0ZW1TaXplKCBoZGMsIGxwaXRlbSwgaHduZE93bmVyLCBvcmdYLCBvcmdZLCBGQUxTRSwgbHBwb3AgKTsKCgkgICAgaWYgKGxwaXRlbS0+ZlR5cGUgJiBNRl9NRU5VQkFSQlJFQUspIG9yZ1grKzsKCSAgICBtYXhYID0gbWF4KCBtYXhYLCBscGl0ZW0tPnJlY3QucmlnaHQgKTsKCSAgICBvcmdZID0gbHBpdGVtLT5yZWN0LmJvdHRvbTsKCSAgICBpZiAoSVNfU1RSSU5HX0lURU0obHBpdGVtLT5mVHlwZSkgJiYgbHBpdGVtLT54VGFiKQoJICAgIHsKCQltYXhUYWIgPSBtYXgoIG1heFRhYiwgbHBpdGVtLT54VGFiICk7CgkJbWF4VGFiV2lkdGggPSBtYXgobWF4VGFiV2lkdGgsbHBpdGVtLT5yZWN0LnJpZ2h0LWxwaXRlbS0+eFRhYik7CgkgICAgfQoJfQoKCSAgLyogRmluaXNoIHRoZSBjb2x1bW4gKHNldCBhbGwgaXRlbXMgdG8gdGhlIGxhcmdlc3Qgd2lkdGggZm91bmQpICovCgltYXhYID0gbWF4KCBtYXhYLCBtYXhUYWIgKyBtYXhUYWJXaWR0aCApOwoJZm9yIChscGl0ZW0gPSAmbHBwb3AtPml0ZW1zW3N0YXJ0XTsgc3RhcnQgPCBpOyBzdGFydCsrLCBscGl0ZW0rKykKCXsKCSAgICBscGl0ZW0tPnJlY3QucmlnaHQgPSBtYXhYOwoJICAgIGlmIChJU19TVFJJTkdfSVRFTShscGl0ZW0tPmZUeXBlKSAmJiBscGl0ZW0tPnhUYWIpCgkJbHBpdGVtLT54VGFiID0gbWF4VGFiOwoKCX0KCWxwcG9wLT5IZWlnaHQgPSBtYXgoIGxwcG9wLT5IZWlnaHQsIG9yZ1kgKTsKICAgIH0KCiAgICBscHBvcC0+V2lkdGggID0gbWF4WDsKCiAgICAvKiBzcGFjZSBmb3IgM2QgYm9yZGVyICovCiAgICBscHBvcC0+SGVpZ2h0ICs9IDI7CiAgICBscHBvcC0+V2lkdGggKz0gMjsKCiAgICBSZWxlYXNlREMoIDAsIGhkYyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX01lbnVCYXJDYWxjU2l6ZQogKgogKiBGSVhNRTogV29yZCA2IGltcGxlbWVudHMgaXRzIG93biBNREkgYW5kIGl0cyBvd24gJ2Nsb3NlIHdpbmRvdycgYml0bWFwCiAqIGhlaWdodCBpcyBvZmYgYnkgMSBwaXhlbCB3aGljaCBjYXVzZXMgbGVuZ3RoeSB3aW5kb3cgcmVsb2NhdGlvbnMgd2hlbgogKiBhY3RpdmUgZG9jdW1lbnQgd2luZG93IGlzIG1heGltaXplZC9yZXN0b3JlZC4KICoKICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBtZW51IGJhci4KICovCnN0YXRpYyB2b2lkIE1FTlVfTWVudUJhckNhbGNTaXplKCBIREMgaGRjLCBMUFJFQ1QgbHByZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQT1BVUE1FTlUgbHBwb3AsIEhXTkQgaHduZE93bmVyICkKewogICAgTUVOVUlURU0gKmxwaXRlbTsKICAgIGludCBzdGFydCwgaSwgb3JnWCwgb3JnWSwgbWF4WSwgaGVscFBvczsKCiAgICBpZiAoKGxwcmVjdCA9PSBOVUxMKSB8fCAobHBwb3AgPT0gTlVMTCkpIHJldHVybjsKICAgIGlmIChscHBvcC0+bkl0ZW1zID09IDApIHJldHVybjsKICAgIFRSQUNFKCJsZWZ0PSVsZCB0b3A9JWxkIHJpZ2h0PSVsZCBib3R0b209JWxkXG4iLAogICAgICAgICAgbHByZWN0LT5sZWZ0LCBscHJlY3QtPnRvcCwgbHByZWN0LT5yaWdodCwgbHByZWN0LT5ib3R0b20pOwogICAgbHBwb3AtPldpZHRoICA9IGxwcmVjdC0+cmlnaHQgLSBscHJlY3QtPmxlZnQ7CiAgICBscHBvcC0+SGVpZ2h0ID0gMDsKICAgIG1heFkgPSBscHJlY3QtPnRvcCsxOwogICAgc3RhcnQgPSAwOwogICAgaGVscFBvcyA9IC0xOwogICAgbHBwb3AtPm1heEJtcFNpemUuY3ggPSAwOwogICAgbHBwb3AtPm1heEJtcFNpemUuY3kgPSAwOwogICAgd2hpbGUgKHN0YXJ0IDwgbHBwb3AtPm5JdGVtcykKICAgIHsKCWxwaXRlbSA9ICZscHBvcC0+aXRlbXNbc3RhcnRdOwoJb3JnWCA9IGxwcmVjdC0+bGVmdDsKCW9yZ1kgPSBtYXhZOwoKCSAgLyogUGFyc2UgaXRlbXMgdW50aWwgbGluZSBicmVhayBvciBlbmQgb2YgbWVudSAqLwoJZm9yIChpID0gc3RhcnQ7IGkgPCBscHBvcC0+bkl0ZW1zOyBpKyssIGxwaXRlbSsrKQoJewoJICAgIGlmICgoaGVscFBvcyA9PSAtMSkgJiYgKGxwaXRlbS0+ZlR5cGUgJiBNRl9SSUdIVEpVU1RJRlkpKSBoZWxwUG9zID0gaTsKCSAgICBpZiAoKGkgIT0gc3RhcnQpICYmCgkJKGxwaXRlbS0+ZlR5cGUgJiAoTUZfTUVOVUJSRUFLIHwgTUZfTUVOVUJBUkJSRUFLKSkpIGJyZWFrOwoKCSAgICBUUkFDRSgiY2FsbGluZyBNRU5VX0NhbGNJdGVtU2l6ZSBvcmc9KCVkLCAlZClcbiIsCgkJCSBvcmdYLCBvcmdZICk7CgkgICAgZGVidWdfcHJpbnRfbWVudWl0ZW0gKCIgIGl0ZW06ICIsIGxwaXRlbSwgIiIpOwoJICAgIE1FTlVfQ2FsY0l0ZW1TaXplKCBoZGMsIGxwaXRlbSwgaHduZE93bmVyLCBvcmdYLCBvcmdZLCBUUlVFLCBscHBvcCApOwoKCSAgICBpZiAobHBpdGVtLT5yZWN0LnJpZ2h0ID4gbHByZWN0LT5yaWdodCkKCSAgICB7CgkJaWYgKGkgIT0gc3RhcnQpIGJyZWFrOwoJCWVsc2UgbHBpdGVtLT5yZWN0LnJpZ2h0ID0gbHByZWN0LT5yaWdodDsKCSAgICB9CgkgICAgbWF4WSA9IG1heCggbWF4WSwgbHBpdGVtLT5yZWN0LmJvdHRvbSApOwoJICAgIG9yZ1ggPSBscGl0ZW0tPnJlY3QucmlnaHQ7Cgl9CgoJICAvKiBGaW5pc2ggdGhlIGxpbmUgKHNldCBhbGwgaXRlbXMgdG8gdGhlIGxhcmdlc3QgaGVpZ2h0IGZvdW5kKSAqLwoJd2hpbGUgKHN0YXJ0IDwgaSkgbHBwb3AtPml0ZW1zW3N0YXJ0KytdLnJlY3QuYm90dG9tID0gbWF4WTsKICAgIH0KCiAgICBscHJlY3QtPmJvdHRvbSA9IG1heFk7CiAgICBscHBvcC0+SGVpZ2h0ID0gbHByZWN0LT5ib3R0b20gLSBscHJlY3QtPnRvcDsKCiAgICAvKiBGbHVzaCByaWdodCBhbGwgaXRlbXMgYmV0d2VlbiB0aGUgTUZfUklHSFRKVVNUSUZZIGFuZCAqLwogICAgLyogdGhlIGxhc3QgaXRlbSAoaWYgc2V2ZXJhbCBsaW5lcywgb25seSBtb3ZlIHRoZSBsYXN0IGxpbmUpICovCiAgICBscGl0ZW0gPSAmbHBwb3AtPml0ZW1zW2xwcG9wLT5uSXRlbXMtMV07CiAgICBvcmdZID0gbHBpdGVtLT5yZWN0LnRvcDsKICAgIG9yZ1ggPSBscHJlY3QtPnJpZ2h0OwogICAgZm9yIChpID0gbHBwb3AtPm5JdGVtcyAtIDE7IGkgPj0gaGVscFBvczsgaS0tLCBscGl0ZW0tLSkgewogICAgICAgIGlmICggKGhlbHBQb3M9PS0xKSB8fCAoaGVscFBvcz5pKSApCiAgICAgICAgICAgIGJyZWFrOwkJCQkvKiBkb25lICovCiAgICAgICAgaWYgKGxwaXRlbS0+cmVjdC50b3AgIT0gb3JnWSkgYnJlYWs7CS8qIE90aGVyIGxpbmUgKi8KICAgICAgICBpZiAobHBpdGVtLT5yZWN0LnJpZ2h0ID49IG9yZ1gpIGJyZWFrOwkvKiBUb28gZmFyIHJpZ2h0IGFscmVhZHkgKi8KICAgICAgICBscGl0ZW0tPnJlY3QubGVmdCArPSBvcmdYIC0gbHBpdGVtLT5yZWN0LnJpZ2h0OwogICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCA9IG9yZ1g7CiAgICAgICAgb3JnWCA9IGxwaXRlbS0+cmVjdC5sZWZ0OwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfRHJhd01lbnVJdGVtCiAqCiAqIERyYXcgYSBzaW5nbGUgbWVudSBpdGVtLgogKi8Kc3RhdGljIHZvaWQgTUVOVV9EcmF3TWVudUl0ZW0oIEhXTkQgaHduZCwgSE1FTlUgaG1lbnUsIEhXTkQgaHduZE93bmVyLCBIREMgaGRjLCBNRU5VSVRFTSAqbHBpdGVtLAoJCQkgICAgICAgVUlOVCBoZWlnaHQsIEJPT0wgbWVudUJhciwgVUlOVCBvZGFjdGlvbiApCnsKICAgIFJFQ1QgcmVjdDsKCiAgICBkZWJ1Z19wcmludF9tZW51aXRlbSgiTUVOVV9EcmF3TWVudUl0ZW06ICIsIGxwaXRlbSwgIiIpOwoKICAgIGlmIChscGl0ZW0tPmZUeXBlICYgTUZfU1lTTUVOVSkKICAgIHsKCWlmKCAhSXNJY29uaWMoaHduZCkgKQoJICAgIE5DX0RyYXdTeXNCdXR0b24oIGh3bmQsIGhkYywgbHBpdGVtLT5mU3RhdGUgJiAoTUZfSElMSVRFIHwgTUZfTU9VU0VTRUxFQ1QpICk7CglyZXR1cm47CiAgICB9CgogICAgICAvKiBTZXR1cCBjb2xvcnMgKi8KCiAgICBpZiAobHBpdGVtLT5mU3RhdGUgJiBNRl9ISUxJVEUpCiAgICB7CiAgICAgICAgaWYobWVudUJhcikgewoJICAgIFNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX01FTlVURVhUKSk7CiAgICAgICAgICAgIFNldEJrQ29sb3IoaGRjLCBHZXRTeXNDb2xvcihDT0xPUl9NRU5VKSk7Cgl9IGVsc2UgewoJICAgIGlmKGxwaXRlbS0+ZlN0YXRlICYgTUZfR1JBWUVEKQoJCVNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0dSQVlURVhUKSk7CgkgICAgZWxzZQoJCVNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVFRFWFQpKTsKICAgICAgICAgICAgU2V0QmtDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVCkpOwoJfQogICAgfQogICAgZWxzZQogICAgewoJaWYgKGxwaXRlbS0+ZlN0YXRlICYgTUZfR1JBWUVEKQoJICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvciggQ09MT1JfR1JBWVRFWFQgKSApOwoJZWxzZQoJICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvciggQ09MT1JfTUVOVVRFWFQgKSApOwoJU2V0QmtDb2xvciggaGRjLCBHZXRTeXNDb2xvciggQ09MT1JfTUVOVSApICk7CiAgICB9CgogICAgaWYgKGxwaXRlbS0+ZlR5cGUgJiBNRl9PV05FUkRSQVcpCiAgICB7CiAgICAgICAgLyoKICAgICAgICAqKiBFeHBlcmltZW50YXRpb24gdW5kZXIgV2luZG93cyByZXZlYWxzIHRoYXQgYW4gb3duZXItZHJhd24KICAgICAgICAqKiBtZW51IGlzIGdpdmVuIHRoZSByZWN0YW5nbGUgd2hpY2ggaW5jbHVkZXMgdGhlIHNwYWNlIGl0IHJlcXVlc3RlZAogICAgICAgICoqIGluIGl0cyByZXNwb25zZSB0byBXTV9NRUFTVVJFSVRFTSBfcGx1c18gd2lkdGggZm9yIGEgY2hlY2ttYXJrCiAgICAgICAgKiogYW5kIGEgcG9wdXAtbWVudSBhcnJvdy4gIFRoaXMgaXMgdGhlIHZhbHVlIG9mIGxwaXRlbS0+cmVjdC4KICAgICAgICAqKiBXaW5kb3dzIHdpbGwgbGVhdmUgYWxsIGRyYXdpbmcgdG8gdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdCBmb3IKICAgICAgICAqKiB0aGUgcG9wdXAtbWVudSBhcnJvdy4gIFdpbmRvd3MgYWx3YXlzIGRyYXdzIHRoYXQgaXRzZWxmLCBhZnRlcgogICAgICAgICoqIHRoZSBtZW51IG93bmVyIGhhcyBmaW5pc2hlZCBkcmF3aW5nLgogICAgICAgICovCiAgICAgICAgRFJBV0lURU1TVFJVQ1QgZGlzOwoKICAgICAgICBkaXMuQ3RsVHlwZSAgID0gT0RUX01FTlU7CglkaXMuQ3RsSUQgICAgID0gMDsKICAgICAgICBkaXMuaXRlbUlEICAgID0gbHBpdGVtLT53SUQ7CiAgICAgICAgZGlzLml0ZW1EYXRhICA9IChEV09SRClscGl0ZW0tPmR3SXRlbURhdGE7CiAgICAgICAgZGlzLml0ZW1TdGF0ZSA9IDA7CiAgICAgICAgaWYgKGxwaXRlbS0+ZlN0YXRlICYgTUZfQ0hFQ0tFRCkgZGlzLml0ZW1TdGF0ZSB8PSBPRFNfQ0hFQ0tFRDsKICAgICAgICBpZiAobHBpdGVtLT5mU3RhdGUgJiBNRl9HUkFZRUQpICBkaXMuaXRlbVN0YXRlIHw9IE9EU19HUkFZRUR8T0RTX0RJU0FCTEVEOwogICAgICAgIGlmIChscGl0ZW0tPmZTdGF0ZSAmIE1GX0hJTElURSkgIGRpcy5pdGVtU3RhdGUgfD0gT0RTX1NFTEVDVEVEOwogICAgICAgIGRpcy5pdGVtQWN0aW9uID0gb2RhY3Rpb247IC8qIE9EQV9EUkFXRU5USVJFIHwgT0RBX1NFTEVDVCB8IE9EQV9GT0NVUzsgKi8KICAgICAgICBkaXMuaHduZEl0ZW0gICA9IChIV05EKWhtZW51OwogICAgICAgIGRpcy5oREMgICAgICAgID0gaGRjOwogICAgICAgIGRpcy5yY0l0ZW0gICAgID0gbHBpdGVtLT5yZWN0OwogICAgICAgIFRSQUNFKCJPd25lcmRyYXc6IG93bmVyPSVwIGl0ZW1JRD0lZCwgaXRlbVN0YXRlPSVkLCBpdGVtQWN0aW9uPSVkLCAiCgkgICAgICAiaHduZEl0ZW09JXAsIGhkYz0lcCwgcmNJdGVtPXslbGQsJWxkLCVsZCwlbGR9XG4iLCBod25kT3duZXIsCgkgICAgICBkaXMuaXRlbUlELCBkaXMuaXRlbVN0YXRlLCBkaXMuaXRlbUFjdGlvbiwgZGlzLmh3bmRJdGVtLAoJICAgICAgZGlzLmhEQywgZGlzLnJjSXRlbS5sZWZ0LCBkaXMucmNJdGVtLnRvcCwgZGlzLnJjSXRlbS5yaWdodCwKCSAgICAgIGRpcy5yY0l0ZW0uYm90dG9tKTsKICAgICAgICBTZW5kTWVzc2FnZVcoIGh3bmRPd25lciwgV01fRFJBV0lURU0sIDAsIChMUEFSQU0pJmRpcyApOwogICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBkcmF3IHBvcHVwLW1lbnUgYXJyb3cgKi8KICAgIH0KCiAgICBUUkFDRSgicmVjdD17JWxkLCVsZCwlbGQsJWxkfVxuIiwgbHBpdGVtLT5yZWN0LmxlZnQsIGxwaXRlbS0+cmVjdC50b3AsCgkJCQkJbHBpdGVtLT5yZWN0LnJpZ2h0LGxwaXRlbS0+cmVjdC5ib3R0b20pOwoKICAgIGlmIChtZW51QmFyICYmIChscGl0ZW0tPmZUeXBlICYgTUZfU0VQQVJBVE9SKSkgcmV0dXJuOwoKICAgIHJlY3QgPSBscGl0ZW0tPnJlY3Q7CgogICAgaWYgKCEobHBpdGVtLT5mVHlwZSAmIE1GX09XTkVSRFJBVykpCiAgICB7CglpZiAobHBpdGVtLT5mU3RhdGUgJiBNRl9ISUxJVEUpCgl7CgkgICAgIGlmKG1lbnVCYXIpCgkJRHJhd0VkZ2UoaGRjLCAmcmVjdCwgQkRSX1NVTktFTk9VVEVSLCBCRl9SRUNUKTsKCSAgICAgZWxzZQoJCUZpbGxSZWN0KGhkYywgJnJlY3QsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfSElHSExJR0hUKSk7Cgl9CiAgICAgICAgZWxzZQoJICAgIEZpbGxSZWN0KCBoZGMsICZyZWN0LCBHZXRTeXNDb2xvckJydXNoKENPTE9SX01FTlUpICk7CiAgICB9CgogICAgU2V0QmtNb2RlKCBoZGMsIFRSQU5TUEFSRU5UICk7CgogICAgaWYgKCEobHBpdGVtLT5mVHlwZSAmIE1GX09XTkVSRFJBVykpCiAgICB7CiAgICAgICAgLyogdmVydGljYWwgc2VwYXJhdG9yICovCiAgICAgICAgaWYgKCFtZW51QmFyICYmIChscGl0ZW0tPmZUeXBlICYgTUZfTUVOVUJBUkJSRUFLKSkKICAgICAgICB7CgkgICAgUkVDVCByYyA9IHJlY3Q7CgkgICAgcmMudG9wID0gMzsKCSAgICByYy5ib3R0b20gPSBoZWlnaHQgLSAzOwoJICAgIERyYXdFZGdlIChoZGMsICZyYywgRURHRV9FVENIRUQsIEJGX0xFRlQpOwogICAgICAgIH0KCiAgICAgICAgLyogaG9yaXpvbnRhbCBzZXBhcmF0b3IgKi8KICAgICAgICBpZiAobHBpdGVtLT5mVHlwZSAmIE1GX1NFUEFSQVRPUikKICAgICAgICB7CgkgICAgUkVDVCByYyA9IHJlY3Q7CgkgICAgcmMubGVmdCsrOwoJICAgIHJjLnJpZ2h0LS07CgkgICAgcmMudG9wICs9IFNFUEFSQVRPUl9IRUlHSFQgLyAyOwoJICAgIERyYXdFZGdlIChoZGMsICZyYywgRURHRV9FVENIRUQsIEJGX1RPUCk7CgkgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCgkvKiBoZWxwZXIgbGluZXMgZm9yIGRlYnVnZ2luZyAqLwovKglGcmFtZVJlY3QoaGRjLCAmcmVjdCwgR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKCVNlbGVjdE9iamVjdCggaGRjLCBTWVNDT0xPUl9HZXRQZW4oQ09MT1JfV0lORE9XRlJBTUUpICk7CglNb3ZlVG9FeCggaGRjLCByZWN0LmxlZnQsIChyZWN0LnRvcCArIHJlY3QuYm90dG9tKS8yLCBOVUxMICk7CglMaW5lVG8oIGhkYywgcmVjdC5yaWdodCwgKHJlY3QudG9wICsgcmVjdC5ib3R0b20pLzIgKTsKKi8KCiAgICBpZiAoIW1lbnVCYXIpCiAgICB7CiAgICAgICAgSEJJVE1BUCBibTsKICAgICAgICBJTlQgeSA9IHJlY3QudG9wICsgcmVjdC5ib3R0b207CiAgICAgICAgVUlOVCBjaGVja19iaXRtYXBfd2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKCBTTV9DWE1FTlVDSEVDSyApOwogICAgICAgIFVJTlQgY2hlY2tfYml0bWFwX2hlaWdodCA9IEdldFN5c3RlbU1ldHJpY3MoIFNNX0NZTUVOVUNIRUNLICk7CgogICAgICAgIGlmICghKGxwaXRlbS0+ZlR5cGUgJiBNRl9PV05FUkRSQVcpKQogICAgICAgIHsKICAgICAgICAgICAgLyogTmV3IHN0eWxlIE1JSU1fQklUTUFQICovCiAgICAgICAgICAgIGlmIChscGl0ZW0tPmhibXBJdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQT1BVUE1FTlUgKm1lbnUgPSBNRU5VX0dldE1lbnUoaG1lbnUpOwogICAgICAgICAgICAgICAgSEJJVE1BUCBoYm0gPSBscGl0ZW0tPmhibXBJdGVtOwoKICAgICAgICAgICAgICAgIGlmIChoYm0gPT0gSEJNTUVOVV9DQUxMQkFDSykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBEUkFXSVRFTVNUUlVDVCBkcmF3SXRlbTsKICAgICAgICAgICAgICAgICAgICBkcmF3SXRlbS5DdGxUeXBlID0gT0RUX01FTlU7CiAgICAgICAgICAgICAgICAgICAgZHJhd0l0ZW0uQ3RsSUQgPSAwOwogICAgICAgICAgICAgICAgICAgIGRyYXdJdGVtLml0ZW1JRCA9IGxwaXRlbS0+d0lEOwogICAgICAgICAgICAgICAgICAgIGRyYXdJdGVtLml0ZW1BY3Rpb24gPSBvZGFjdGlvbjsKICAgICAgICAgICAgICAgICAgICBkcmF3SXRlbS5pdGVtU3RhdGUgfD0gKGxwaXRlbS0+ZlN0YXRlICYgTUZfQ0hFQ0tFRCk/T0RTX0NIRUNLRUQ6MDsKICAgICAgICAgICAgICAgICAgICBkcmF3SXRlbS5pdGVtU3RhdGUgfD0gKGxwaXRlbS0+ZlN0YXRlICYgTUZfREVGQVVMVCk/T0RTX0RFRkFVTFQ6MDsKICAgICAgICAgICAgICAgICAgICBkcmF3SXRlbS5pdGVtU3RhdGUgfD0gKGxwaXRlbS0+ZlN0YXRlICYgTUZfRElTQUJMRUQpP09EU19ESVNBQkxFRDowOwogICAgICAgICAgICAgICAgICAgIGRyYXdJdGVtLml0ZW1TdGF0ZSB8PSAobHBpdGVtLT5mU3RhdGUgJiBNRl9HUkFZRUQpP09EU19HUkFZRUR8T0RTX0RJU0FCTEVEOjA7CiAgICAgICAgICAgICAgICAgICAgZHJhd0l0ZW0uaXRlbVN0YXRlIHw9IChscGl0ZW0tPmZTdGF0ZSAmIE1GX0hJTElURSk/T0RTX1NFTEVDVEVEOjA7CiAgICAgICAgICAgICAgICAgICAgZHJhd0l0ZW0uaHduZEl0ZW0gPSAoSFdORClobWVudTsKICAgICAgICAgICAgICAgICAgICBkcmF3SXRlbS5oREMgPSBoZGM7CiAgICAgICAgICAgICAgICAgICAgZHJhd0l0ZW0ucmNJdGVtID0gbHBpdGVtLT5yZWN0OwogICAgICAgICAgICAgICAgICAgIGRyYXdJdGVtLml0ZW1EYXRhID0gbHBpdGVtLT5kd0l0ZW1EYXRhOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIShscGl0ZW0tPmZTdGF0ZSAmIE1GX0NIRUNLRUQpKQogICAgICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZVcoIGh3bmRPd25lciwgV01fRFJBV0lURU0sIDAsIChMUEFSQU0pJmRyYXdJdGVtKTsKCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIE1FTlVfRHJhd0JpdG1hcEl0ZW0oaGRjLCBscGl0ZW0sICZyZWN0LCBGQUxTRSwgVFJVRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobWVudS0+ZHdTdHlsZSAmIE1OU19DSEVDS09SQk1QKQogICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCArPSBtZW51LT5tYXhCbXBTaXplLmN4IC0gY2hlY2tfYml0bWFwX3dpZHRoOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCArPSBtZW51LT5tYXhCbXBTaXplLmN4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIERyYXcgdGhlIGNoZWNrIG1hcmsKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRklYTUU6CiAgICAgICAgICAgICAqIEN1c3RvbSBjaGVja21hcmsgYml0bWFwcyBhcmUgbW9ub2Nocm9tZSBidXQgbm90IGFsd2F5cyAxYnBwLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYm0gPSAobHBpdGVtLT5mU3RhdGUgJiBNRl9DSEVDS0VEKSA/IGxwaXRlbS0+aENoZWNrQml0IDogbHBpdGVtLT5oVW5DaGVja0JpdDsKICAgICAgICAgICAgaWYgKGJtKSAgLyogd2UgaGF2ZSBhIGN1c3RvbSBiaXRtYXAgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSERDIGhkY01lbSA9IENyZWF0ZUNvbXBhdGlibGVEQyggaGRjICk7CiAgICAgICAgICAgICAgICBTZWxlY3RPYmplY3QoIGhkY01lbSwgYm0gKTsKICAgICAgICAgICAgICAgIEJpdEJsdCggaGRjLCByZWN0LmxlZnQsICh5IC0gY2hlY2tfYml0bWFwX2hlaWdodCkgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICBjaGVja19iaXRtYXBfd2lkdGgsIGNoZWNrX2JpdG1hcF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGhkY01lbSwgMCwgMCwgU1JDQ09QWSApOwogICAgICAgICAgICAgICAgRGVsZXRlREMoIGhkY01lbSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGxwaXRlbS0+ZlN0YXRlICYgTUZfQ0hFQ0tFRCkgIC8qIHN0YW5kYXJkIGJpdG1hcHMgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUkVDVCByOwogICAgICAgICAgICAgICAgSEJJVE1BUCBibSA9IENyZWF0ZUJpdG1hcCggY2hlY2tfYml0bWFwX3dpZHRoLCBjaGVja19iaXRtYXBfaGVpZ2h0LCAxLCAxLCBOVUxMICk7CiAgICAgICAgICAgICAgICBIREMgaGRjTWVtID0gQ3JlYXRlQ29tcGF0aWJsZURDKCBoZGMgKTsKICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdCggaGRjTWVtLCBibSApOwogICAgICAgICAgICAgICAgU2V0UmVjdCggJnIsIDAsIDAsIGNoZWNrX2JpdG1hcF93aWR0aCwgY2hlY2tfYml0bWFwX2hlaWdodCApOwogICAgICAgICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbCggaGRjTWVtLCAmciwgREZDX01FTlUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHBpdGVtLT5mVHlwZSAmIE1GVF9SQURJT0NIRUNLKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERkNTX01FTlVCVUxMRVQgOiBERkNTX01FTlVDSEVDSyApOwogICAgICAgICAgICAgICAgQml0Qmx0KCBoZGMsIHJlY3QubGVmdCwgKHkgLSByLmJvdHRvbSkgLyAyLCByLnJpZ2h0LCByLmJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgaGRjTWVtLCAwLCAwLCBTUkNDT1BZICk7CiAgICAgICAgICAgICAgICBEZWxldGVEQyggaGRjTWVtICk7CiAgICAgICAgICAgICAgICBEZWxldGVPYmplY3QoIGJtICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoJICAvKiBEcmF3IHRoZSBwb3B1cC1tZW51IGFycm93ICovCglpZiAobHBpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKQoJewoJICAgIEhEQyBoZGNNZW0gPSBDcmVhdGVDb21wYXRpYmxlREMoIGhkYyApOwoJICAgIEhCSVRNQVAgaE9yaWdCaXRtYXA7CgoJICAgIGhPcmlnQml0bWFwID0gU2VsZWN0T2JqZWN0KCBoZGNNZW0sIGhTdGRNbkFycm93ICk7CgkgICAgQml0Qmx0KCBoZGMsIHJlY3QucmlnaHQgLSBhcnJvd19iaXRtYXBfd2lkdGggLSAxLAoJCSAgICAgICh5IC0gYXJyb3dfYml0bWFwX2hlaWdodCkgLyAyLAoJCSAgICAgIGFycm93X2JpdG1hcF93aWR0aCwgYXJyb3dfYml0bWFwX2hlaWdodCwKCQkgICAgICBoZGNNZW0sIDAsIDAsIFNSQ0NPUFkgKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KCBoZGNNZW0sIGhPcmlnQml0bWFwICk7CgkgICAgRGVsZXRlREMoIGhkY01lbSApOwoJfQoKCXJlY3QubGVmdCArPSBjaGVja19iaXRtYXBfd2lkdGg7CglyZWN0LnJpZ2h0IC09IGFycm93X2JpdG1hcF93aWR0aDsKICAgIH0KCiAgICAvKiBEb25lIGZvciBvd25lci1kcmF3biAqLwogICAgaWYgKGxwaXRlbS0+ZlR5cGUgJiBNRl9PV05FUkRSQVcpCiAgICAgICAgcmV0dXJuOwoKICAgIC8qIERyYXcgdGhlIGl0ZW0gdGV4dCBvciBiaXRtYXAgKi8KICAgIGlmIChJU19CSVRNQVBfSVRFTShscGl0ZW0tPmZUeXBlKSkKICAgIHsKCU1FTlVfRHJhd0JpdG1hcEl0ZW0oIGhkYywgbHBpdGVtLCAmcmVjdCwgbWVudUJhciwgRkFMU0UpOwoJcmV0dXJuOwogICAgfQogICAgLyogTm8gYml0bWFwIC0gcHJvY2VzcyB0ZXh0IGlmIHByZXNlbnQgKi8KICAgIGVsc2UgaWYgKElTX1NUUklOR19JVEVNKGxwaXRlbS0+ZlR5cGUpKQogICAgewoJcmVnaXN0ZXIgaW50IGk7CglIRk9OVCBoZm9udE9sZCA9IDA7CgoJVUlOVCB1Rm9ybWF0ID0gKG1lbnVCYXIpID8KCQkJRFRfQ0VOVEVSIHwgRFRfVkNFTlRFUiB8IERUX1NJTkdMRUxJTkUgOgoJCQlEVF9MRUZUIHwgRFRfVkNFTlRFUiB8IERUX1NJTkdMRUxJTkU7CgoJaWYgKCBscGl0ZW0tPmZTdGF0ZSAmIE1GU19ERUZBVUxUICkKCXsKCSAgICAgaGZvbnRPbGQgPSBTZWxlY3RPYmplY3QoIGhkYywgaE1lbnVGb250Qm9sZCk7Cgl9CgoJaWYgKG1lbnVCYXIpCgl7CgkgICAgcmVjdC5sZWZ0ICs9IE1FTlVfQkFSX0lURU1TX1NQQUNFIC8gMjsKCSAgICByZWN0LnJpZ2h0IC09IE1FTlVfQkFSX0lURU1TX1NQQUNFIC8gMjsKCX0KCglmb3IgKGkgPSAwOyBscGl0ZW0tPnRleHRbaV07IGkrKykKCSAgICBpZiAoKGxwaXRlbS0+dGV4dFtpXSA9PSAnXHQnKSB8fCAobHBpdGVtLT50ZXh0W2ldID09ICdcYicpKQoJICAgICAgICBicmVhazsKCglpZihscGl0ZW0tPmZTdGF0ZSAmIE1GX0dSQVlFRCkKCXsKCSAgICBpZiAoIShscGl0ZW0tPmZTdGF0ZSAmIE1GX0hJTElURSkgKQoJICAgIHsKCQkrK3JlY3QubGVmdDsgKytyZWN0LnRvcDsgKytyZWN0LnJpZ2h0OyArK3JlY3QuYm90dG9tOwoJCVNldFRleHRDb2xvcihoZGMsIFJHQigweGZmLCAweGZmLCAweGZmKSk7CgkJRHJhd1RleHRXKCBoZGMsIGxwaXRlbS0+dGV4dCwgaSwgJnJlY3QsIHVGb3JtYXQgKTsKCQktLXJlY3QubGVmdDsgLS1yZWN0LnRvcDsgLS1yZWN0LnJpZ2h0OyAtLXJlY3QuYm90dG9tOwoJICAgIH0KCSAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMHg4MCwgMHg4MCwgMHg4MCkpOwoJfQoKCURyYXdUZXh0VyggaGRjLCBscGl0ZW0tPnRleHQsIGksICZyZWN0LCB1Rm9ybWF0KTsKCgkvKiBwYWludCB0aGUgc2hvcnRjdXQgdGV4dCAqLwoJaWYgKCFtZW51QmFyICYmIGxwaXRlbS0+dGV4dFtpXSkgIC8qIFRoZXJlJ3MgYSB0YWIgb3IgZmx1c2gtcmlnaHQgY2hhciAqLwoJewoJICAgIGlmIChscGl0ZW0tPnRleHRbaV0gPT0gJ1x0JykKCSAgICB7CgkJcmVjdC5sZWZ0ID0gbHBpdGVtLT54VGFiOwoJCXVGb3JtYXQgPSBEVF9MRUZUIHwgRFRfVkNFTlRFUiB8IERUX1NJTkdMRUxJTkU7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJdUZvcm1hdCA9IERUX1JJR0hUIHwgRFRfVkNFTlRFUiB8IERUX1NJTkdMRUxJTkU7CgkgICAgfQoKCSAgICBpZihscGl0ZW0tPmZTdGF0ZSAmIE1GX0dSQVlFRCkKCSAgICB7CgkJaWYgKCEobHBpdGVtLT5mU3RhdGUgJiBNRl9ISUxJVEUpICkKCQl7CgkJICAgICsrcmVjdC5sZWZ0OyArK3JlY3QudG9wOyArK3JlY3QucmlnaHQ7ICsrcmVjdC5ib3R0b207CgkJICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigweGZmLCAweGZmLCAweGZmKSk7CgkJICAgIERyYXdUZXh0VyggaGRjLCBscGl0ZW0tPnRleHQgKyBpICsgMSwgLTEsICZyZWN0LCB1Rm9ybWF0ICk7CgkJICAgIC0tcmVjdC5sZWZ0OyAtLXJlY3QudG9wOyAtLXJlY3QucmlnaHQ7IC0tcmVjdC5ib3R0b207CgkJfQoJCVNldFRleHRDb2xvcihoZGMsIFJHQigweDgwLCAweDgwLCAweDgwKSk7CgkgICAgfQoJICAgIERyYXdUZXh0VyggaGRjLCBscGl0ZW0tPnRleHQgKyBpICsgMSwgLTEsICZyZWN0LCB1Rm9ybWF0ICk7Cgl9CgoJaWYgKGhmb250T2xkKQoJICAgIFNlbGVjdE9iamVjdCAoaGRjLCBoZm9udE9sZCk7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfRHJhd1BvcHVwTWVudQogKgogKiBQYWludCBhIHBvcHVwIG1lbnUuCiAqLwpzdGF0aWMgdm9pZCBNRU5VX0RyYXdQb3B1cE1lbnUoIEhXTkQgaHduZCwgSERDIGhkYywgSE1FTlUgaG1lbnUgKQp7CiAgICBIQlJVU0ggaFByZXZCcnVzaCA9IDA7CiAgICBSRUNUIHJlY3Q7CgogICAgVFJBQ0UoInduZD0lcCBkYz0lcCBtZW51PSVwXG4iLCBod25kLCBoZGMsIGhtZW51KTsKCiAgICBHZXRDbGllbnRSZWN0KCBod25kLCAmcmVjdCApOwoKICAgIGlmKChoUHJldkJydXNoID0gU2VsZWN0T2JqZWN0KCBoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfTUVOVSkgKSkKICAgICAgICAmJiAoU2VsZWN0T2JqZWN0KCBoZGMsIGhNZW51Rm9udCkpKQogICAgewoJSFBFTiBoUHJldlBlbjsKCglSZWN0YW5nbGUoIGhkYywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20gKTsKCgloUHJldlBlbiA9IFNlbGVjdE9iamVjdCggaGRjLCBHZXRTdG9ja09iamVjdCggTlVMTF9QRU4gKSApOwoJaWYoIGhQcmV2UGVuICkKCXsKCSAgICBQT1BVUE1FTlUgKm1lbnU7CgoJICAgIERyYXdFZGdlIChoZGMsICZyZWN0LCBFREdFX1JBSVNFRCwgQkZfUkVDVCk7CgoJICAgIC8qIGRyYXcgbWVudSBpdGVtcyAqLwoKCSAgICBtZW51ID0gTUVOVV9HZXRNZW51KCBobWVudSApOwoJICAgIGlmIChtZW51ICYmIG1lbnUtPm5JdGVtcykKCSAgICB7CgkJTUVOVUlURU0gKml0ZW07CgkJVUlOVCB1OwoKCQlmb3IgKHUgPSBtZW51LT5uSXRlbXMsIGl0ZW0gPSBtZW51LT5pdGVtczsgdSA+IDA7IHUtLSwgaXRlbSsrKQoJCSAgICBNRU5VX0RyYXdNZW51SXRlbSggaHduZCwgaG1lbnUsIG1lbnUtPmh3bmRPd25lciwgaGRjLCBpdGVtLAoJCQkJICAgICAgIG1lbnUtPkhlaWdodCwgRkFMU0UsIE9EQV9EUkFXRU5USVJFICk7CgoJICAgIH0KCX0gZWxzZQoJewoJICAgIFNlbGVjdE9iamVjdCggaGRjLCBoUHJldkJydXNoICk7Cgl9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9EcmF3TWVudUJhcgogKgogKiBQYWludCBhIG1lbnUgYmFyLiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIG1lbnUgYmFyLgogKiBjYWxsZWQgZnJvbSBbd2luZG93cy9ub25jbGllbnQuY10KICovClVJTlQgTUVOVV9EcmF3TWVudUJhciggSERDIGhEQywgTFBSRUNUIGxwcmVjdCwgSFdORCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBzdXBwcmVzc19kcmF3KQp7CiAgICBMUFBPUFVQTUVOVSBscHBvcDsKICAgIEhGT05UIGhmb250T2xkID0gMDsKICAgIEhNRU5VIGhNZW51ID0gR2V0TWVudShod25kKTsKCiAgICBscHBvcCA9IE1FTlVfR2V0TWVudSggaE1lbnUgKTsKICAgIGlmIChscHBvcCA9PSBOVUxMIHx8IGxwcmVjdCA9PSBOVUxMKQogICAgewogICAgICAgIHJldHVybiBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZTUVOVSk7CiAgICB9CgogICAgaWYgKHN1cHByZXNzX2RyYXcpCiAgICB7CgloZm9udE9sZCA9IFNlbGVjdE9iamVjdCggaERDLCBoTWVudUZvbnQpOwoKCWlmIChscHBvcC0+SGVpZ2h0ID09IDApCgkJTUVOVV9NZW51QmFyQ2FsY1NpemUoaERDLCBscHJlY3QsIGxwcG9wLCBod25kKTsKCglscHJlY3QtPmJvdHRvbSA9IGxwcmVjdC0+dG9wICsgbHBwb3AtPkhlaWdodDsKCiAgICAgICAgaWYgKGhmb250T2xkKSBTZWxlY3RPYmplY3QoIGhEQywgaGZvbnRPbGQpOwoJcmV0dXJuIGxwcG9wLT5IZWlnaHQ7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIERyYXdNZW51QmFyVGVtcChod25kLCBoREMsIGxwcmVjdCwgaE1lbnUsIE5VTEwpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX1Nob3dQb3B1cAogKgogKiBEaXNwbGF5IGEgcG9wdXAgbWVudS4KICovCnN0YXRpYyBCT09MIE1FTlVfU2hvd1BvcHVwKCBIV05EIGh3bmRPd25lciwgSE1FTlUgaG1lbnUsIFVJTlQgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB4LCBJTlQgeSwgSU5UIHhhbmNob3IsIElOVCB5YW5jaG9yICkKewogICAgUE9QVVBNRU5VICptZW51OwogICAgVUlOVCB3aWR0aCwgaGVpZ2h0OwoKICAgIFRSQUNFKCJvd25lcj0lcCBobWVudT0lcCBpZD0weCUwNHggeD0weCUwNHggeT0weCUwNHggeGE9MHglMDR4IHlhPTB4JTA0eFxuIiwKICAgICAgICAgIGh3bmRPd25lciwgaG1lbnUsIGlkLCB4LCB5LCB4YW5jaG9yLCB5YW5jaG9yKTsKCiAgICBpZiAoIShtZW51ID0gTUVOVV9HZXRNZW51KCBobWVudSApKSkgcmV0dXJuIEZBTFNFOwogICAgaWYgKG1lbnUtPkZvY3VzZWRJdGVtICE9IE5PX1NFTEVDVEVEX0lURU0pCiAgICB7CgltZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV0uZlN0YXRlICY9IH4oTUZfSElMSVRFfE1GX01PVVNFU0VMRUNUKTsKCW1lbnUtPkZvY3VzZWRJdGVtID0gTk9fU0VMRUNURURfSVRFTTsKICAgIH0KCiAgICAvKiBzdG9yZSB0aGUgb3duZXIgZm9yIERyYXdJdGVtICovCiAgICBtZW51LT5od25kT3duZXIgPSBod25kT3duZXI7CgogICAgTUVOVV9Qb3B1cE1lbnVDYWxjU2l6ZSggbWVudSwgaHduZE93bmVyICk7CgogICAgLyogYWRqdXN0IHBvcHVwIG1lbnUgcG9zIHNvIHRoYXQgaXQgZml0cyB3aXRoaW4gdGhlIGRlc2t0b3AgKi8KCiAgICB3aWR0aCA9IG1lbnUtPldpZHRoICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWEJPUkRFUik7CiAgICBoZWlnaHQgPSBtZW51LT5IZWlnaHQgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKTsKCiAgICBpZiggeCArIHdpZHRoID4gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiApKQogICAgewogICAgICAgIGlmKCB4YW5jaG9yICkKICAgICAgICAgICAgeCAtPSB3aWR0aCAtIHhhbmNob3I7CiAgICAgICAgaWYoIHggKyB3aWR0aCA+IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pKQogICAgICAgICAgICB4ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikgLSB3aWR0aDsKICAgIH0KICAgIGlmKCB4IDwgMCApIHggPSAwOwoKICAgIGlmKCB5ICsgaGVpZ2h0ID4gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiApKQogICAgewogICAgICAgIGlmKCB5YW5jaG9yICkKICAgICAgICAgICAgeSAtPSBoZWlnaHQgKyB5YW5jaG9yOwogICAgICAgIGlmKCB5ICsgaGVpZ2h0ID4gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiApKQogICAgICAgICAgICB5ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikgLSBoZWlnaHQ7CiAgICB9CiAgICBpZiggeSA8IDAgKSB5ID0gMDsKCiAgICAvKiBOT1RFOiBJbiBXaW5kb3dzLCB0b3AgbWVudSBwb3B1cCBpcyBub3Qgb3duZWQuICovCiAgICBtZW51LT5oV25kID0gQ3JlYXRlV2luZG93RXhXKCAwLCBQT1BVUE1FTlVfQ0xBU1NfQVRPTVcsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfUE9QVVAsIHgsIHksIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZE93bmVyLCAwLCAoSElOU1RBTkNFKUdldFdpbmRvd0xvbmdQdHJXKGh3bmRPd25lciwgR1dMUF9ISU5TVEFOQ0UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpaG1lbnUgKTsKICAgIGlmKCAhbWVudS0+aFduZCApIHJldHVybiBGQUxTRTsKICAgIGlmICghdG9wX3BvcHVwKSB0b3BfcG9wdXAgPSBtZW51LT5oV25kOwoKICAgIC8qIERpc3BsYXkgdGhlIHdpbmRvdyAqLwoKICAgIFNldFdpbmRvd1BvcyggbWVudS0+aFduZCwgSFdORF9UT1AsIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgIFNXUF9TSE9XV0lORE9XIHwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfTk9BQ1RJVkFURSApOwogICAgVXBkYXRlV2luZG93KCBtZW51LT5oV25kICk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9TZWxlY3RJdGVtCiAqLwpzdGF0aWMgdm9pZCBNRU5VX1NlbGVjdEl0ZW0oIEhXTkQgaHduZE93bmVyLCBITUVOVSBobWVudSwgVUlOVCB3SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBzZW5kTWVudVNlbGVjdCwgSE1FTlUgdG9wbWVudSApCnsKICAgIExQUE9QVVBNRU5VIGxwcG9wOwogICAgSERDIGhkYzsKCiAgICBUUkFDRSgib3duZXI9JXAgbWVudT0lcCBpbmRleD0weCUwNHggc2VsZWN0PTB4JTA0eFxuIiwgaHduZE93bmVyLCBobWVudSwgd0luZGV4LCBzZW5kTWVudVNlbGVjdCk7CgogICAgbHBwb3AgPSBNRU5VX0dldE1lbnUoIGhtZW51ICk7CiAgICBpZiAoKCFscHBvcCkgfHwgKCFscHBvcC0+bkl0ZW1zKSB8fCAoIWxwcG9wLT5oV25kKSkgcmV0dXJuOwoKICAgIGlmIChscHBvcC0+Rm9jdXNlZEl0ZW0gPT0gd0luZGV4KSByZXR1cm47CiAgICBpZiAobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSBoZGMgPSBHZXREQyggbHBwb3AtPmhXbmQgKTsKICAgIGVsc2UgaGRjID0gR2V0RENFeCggbHBwb3AtPmhXbmQsIDAsIERDWF9DQUNIRSB8IERDWF9XSU5ET1cpOwogICAgaWYgKCF0b3BfcG9wdXApIHRvcF9wb3B1cCA9IGxwcG9wLT5oV25kOwoKICAgIFNlbGVjdE9iamVjdCggaGRjLCBoTWVudUZvbnQpOwoKICAgICAgLyogQ2xlYXIgcHJldmlvdXMgaGlnaGxpZ2h0ZWQgaXRlbSAqLwogICAgaWYgKGxwcG9wLT5Gb2N1c2VkSXRlbSAhPSBOT19TRUxFQ1RFRF9JVEVNKQogICAgewoJbHBwb3AtPml0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uZlN0YXRlICY9IH4oTUZfSElMSVRFfE1GX01PVVNFU0VMRUNUKTsKCU1FTlVfRHJhd01lbnVJdGVtKGxwcG9wLT5oV25kLCBobWVudSwgaHduZE93bmVyLCBoZGMsJmxwcG9wLT5pdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxwcG9wLT5IZWlnaHQsICEobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSwKCQkJICBPREFfU0VMRUNUICk7CiAgICB9CgogICAgICAvKiBIaWdobGlnaHQgbmV3IGl0ZW0gKGlmIGFueSkgKi8KICAgIGxwcG9wLT5Gb2N1c2VkSXRlbSA9IHdJbmRleDsKICAgIGlmIChscHBvcC0+Rm9jdXNlZEl0ZW0gIT0gTk9fU0VMRUNURURfSVRFTSkKICAgIHsKICAgICAgICBpZighKGxwcG9wLT5pdGVtc1t3SW5kZXhdLmZUeXBlICYgTUZfU0VQQVJBVE9SKSkgewogICAgICAgICAgICBscHBvcC0+aXRlbXNbd0luZGV4XS5mU3RhdGUgfD0gTUZfSElMSVRFOwogICAgICAgICAgICBNRU5VX0RyYXdNZW51SXRlbSggbHBwb3AtPmhXbmQsIGhtZW51LCBod25kT3duZXIsIGhkYywKICAgICAgICAgICAgICAgICAgICAmbHBwb3AtPml0ZW1zW3dJbmRleF0sIGxwcG9wLT5IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIShscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApLCBPREFfU0VMRUNUICk7CiAgICAgICAgfQogICAgICAgIGlmIChzZW5kTWVudVNlbGVjdCkKICAgICAgICB7CiAgICAgICAgICAgIE1FTlVJVEVNICppcCA9ICZscHBvcC0+aXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXTsKCSAgICBTZW5kTWVzc2FnZVcoIGh3bmRPd25lciwgV01fTUVOVVNFTEVDVCwKICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoaXAtPmZUeXBlICYgTUZfUE9QVVAgPyB3SW5kZXg6IGlwLT53SUQsCiAgICAgICAgICAgICAgICAgICAgIGlwLT5mVHlwZSB8IGlwLT5mU3RhdGUgfAogICAgICAgICAgICAgICAgICAgICAobHBwb3AtPndGbGFncyAmIE1GX1NZU01FTlUpKSwgKExQQVJBTSlobWVudSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoc2VuZE1lbnVTZWxlY3QpIHsKICAgICAgICBpZih0b3BtZW51KXsKICAgICAgICAgICAgaW50IHBvczsKICAgICAgICAgICAgaWYoKHBvcz1NRU5VX0ZpbmRTdWJNZW51KCZ0b3BtZW51LCBobWVudSkpIT1OT19TRUxFQ1RFRF9JVEVNKXsKICAgICAgICAgICAgICAgIFBPUFVQTUVOVSAqcHRtID0gTUVOVV9HZXRNZW51KCB0b3BtZW51ICk7CiAgICAgICAgICAgICAgICBNRU5VSVRFTSAqaXAgPSAmcHRtLT5pdGVtc1twb3NdOwogICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2VXKCBod25kT3duZXIsIFdNX01FTlVTRUxFQ1QsIE1BS0VMT05HKHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgIGlwLT5mVHlwZSB8IGlwLT5mU3RhdGUgfAogICAgICAgICAgICAgICAgICAgICAgICAgKHB0bS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkpLCAoTFBBUkFNKXRvcG1lbnUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgUmVsZWFzZURDKCBscHBvcC0+aFduZCwgaGRjICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfTW92ZVNlbGVjdGlvbgogKgogKiBNb3ZlcyBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBhY2NvcmRpbmcgdG8gdGhlIG9mZnNldCBwYXJhbWV0ZXIuCiAqIElmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiB0aGVuIGl0IHNob3VsZCBzZWxlY3QgdGhlIGxhc3QgaXRlbSBpZgogKiBvZmZzZXQgaXMgSVRFTV9QUkVWIG9yIHRoZSBmaXJzdCBpdGVtIGlmIG9mZnNldCBpcyBJVEVNX05FWFQuCiAqLwpzdGF0aWMgdm9pZCBNRU5VX01vdmVTZWxlY3Rpb24oIEhXTkQgaHduZE93bmVyLCBITUVOVSBobWVudSwgSU5UIG9mZnNldCApCnsKICAgIElOVCBpOwogICAgUE9QVVBNRU5VICptZW51OwoKICAgIFRSQUNFKCJod25kPSVwIGhtZW51PSVwIG9mZj0weCUwNHhcbiIsIGh3bmRPd25lciwgaG1lbnUsIG9mZnNldCk7CgogICAgbWVudSA9IE1FTlVfR2V0TWVudSggaG1lbnUgKTsKICAgIGlmICgoIW1lbnUpIHx8ICghbWVudS0+aXRlbXMpKSByZXR1cm47CgogICAgaWYgKCBtZW51LT5Gb2N1c2VkSXRlbSAhPSBOT19TRUxFQ1RFRF9JVEVNICkKICAgIHsKCWlmKCBtZW51LT5uSXRlbXMgPT0gMSApIHJldHVybjsgZWxzZQoJZm9yIChpID0gbWVudS0+Rm9jdXNlZEl0ZW0gKyBvZmZzZXQgOyBpID49IDAgJiYgaSA8IG1lbnUtPm5JdGVtcwoJCQkJCSAgICA7IGkgKz0gb2Zmc2V0KQoJICAgIGlmICghKG1lbnUtPml0ZW1zW2ldLmZUeXBlICYgTUZfU0VQQVJBVE9SKSkKCSAgICB7CgkJTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBpLCBUUlVFLCAwICk7CgkJcmV0dXJuOwoJICAgIH0KICAgIH0KCiAgICBmb3IgKCBpID0gKG9mZnNldCA+IDApID8gMCA6IG1lbnUtPm5JdGVtcyAtIDE7CgkJICBpID49IDAgJiYgaSA8IG1lbnUtPm5JdGVtcyA7IGkgKz0gb2Zmc2V0KQoJaWYgKCEobWVudS0+aXRlbXNbaV0uZlR5cGUgJiBNRl9TRVBBUkFUT1IpKQoJewoJICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgaSwgVFJVRSwgMCApOwoJICAgIHJldHVybjsKCX0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgTUVOVV9TZXRJdGVtRGF0YQogKgogKiBTZXQgYW4gaXRlbSdzIGZsYWdzLCBpZCBhbmQgdGV4dCBwdHIuIENhbGxlZCBieSBJbnNlcnRNZW51KCkgYW5kCiAqIE1vZGlmeU1lbnUoKS4KICovCnN0YXRpYyBCT09MIE1FTlVfU2V0SXRlbURhdGEoIE1FTlVJVEVNICppdGVtLCBVSU5UIGZsYWdzLCBVSU5UX1BUUiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHN0ciApCnsKICAgIExQV1NUUiBwcmV2VGV4dCA9IElTX1NUUklOR19JVEVNKGl0ZW0tPmZUeXBlKSA/IGl0ZW0tPnRleHQgOiBOVUxMOwoKICAgIGRlYnVnX3ByaW50X21lbnVpdGVtKCJNRU5VX1NldEl0ZW1EYXRhIGZyb206ICIsIGl0ZW0sICIiKTsKICAgIFRSQUNFKCJmbGFncz0leCBzdHI9JXBcbiIsIGZsYWdzLCBzdHIpOwoKICAgIGlmIChJU19TVFJJTkdfSVRFTShmbGFncykpCiAgICB7CiAgICAgICAgaWYgKCFzdHIpCiAgICAgICAgewogICAgICAgICAgICBmbGFncyB8PSBNRl9TRVBBUkFUT1I7CiAgICAgICAgICAgIGl0ZW0tPnRleHQgPSBOVUxMOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBMUFdTVFIgdGV4dDsKICAgICAgICAgICAgLyogSXRlbSBiZWdpbm5pbmcgd2l0aCBhIGJhY2tzcGFjZSBpcyBhIGhlbHAgaXRlbSAqLwogICAgICAgICAgICBpZiAoKnN0ciA9PSAnXGInKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmbGFncyB8PSBNRl9IRUxQOwogICAgICAgICAgICAgICAgc3RyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEodGV4dCA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKHN0cmxlblcoc3RyKSsxKSAqIHNpemVvZihXQ0hBUikgKSkpCiAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgIHN0cmNweVcoIHRleHQsIHN0ciApOwogICAgICAgICAgICBpdGVtLT50ZXh0ID0gdGV4dDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChJU19CSVRNQVBfSVRFTShmbGFncykpCiAgICAgICAgaXRlbS0+dGV4dCA9IChMUFdTVFIpSEJJVE1BUF8zMihMT1dPUkQoc3RyKSk7CiAgICBlbHNlIGl0ZW0tPnRleHQgPSBOVUxMOwoKICAgIGlmIChmbGFncyAmIE1GX09XTkVSRFJBVykKICAgICAgICBpdGVtLT5kd0l0ZW1EYXRhID0gKERXT1JEKXN0cjsKICAgIGVsc2UKICAgICAgICBpdGVtLT5kd0l0ZW1EYXRhID0gMDsKCiAgICBpZiAoKGl0ZW0tPmZUeXBlICYgTUZfUE9QVVApICYmIChmbGFncyAmIE1GX1BPUFVQKSAmJiAoaXRlbS0+aFN1Yk1lbnUgIT0gKEhNRU5VKWlkKSApCglEZXN0cm95TWVudSggaXRlbS0+aFN1Yk1lbnUgKTsgICAvKiBNb2RpZnlNZW51KCkgc3BlYyAqLwoKICAgIGlmIChmbGFncyAmIE1GX1BPUFVQKQogICAgewoJUE9QVVBNRU5VICptZW51ID0gTUVOVV9HZXRNZW51KChITUVOVSlpZCk7CiAgICAgICAgaWYgKG1lbnUpIG1lbnUtPndGbGFncyB8PSBNRl9QT1BVUDsKCWVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGl0ZW0tPndJRCA9IDA7CiAgICAgICAgICAgIGl0ZW0tPmhTdWJNZW51ID0gMDsKICAgICAgICAgICAgaXRlbS0+ZlR5cGUgPSAwOwogICAgICAgICAgICBpdGVtLT5mU3RhdGUgPSAwOwoJICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICB9CgogICAgaXRlbS0+d0lEID0gaWQ7CiAgICBpZiAoZmxhZ3MgJiBNRl9QT1BVUCkgaXRlbS0+aFN1Yk1lbnUgPSAoSE1FTlUpaWQ7CgogICAgaWYgKChpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKSAmJiAhKGZsYWdzICYgTUZfUE9QVVApICkKICAgICAgZmxhZ3MgfD0gTUZfUE9QVVA7IC8qIGtlZXAgcG9wdXAgKi8KCiAgICBpdGVtLT5mVHlwZSA9IGZsYWdzICYgVFlQRV9NQVNLOwogICAgaXRlbS0+ZlN0YXRlID0gKGZsYWdzICYgU1RBVEVfTUFTSykgJgogICAgICAgIH4oTUZfSElMSVRFIHwgTUZfTU9VU0VTRUxFQ1QgfCBNRl9CWVBPU0lUSU9OKTsKCgogICAgLyogRG9uJ3QgY2FsbCBTZXRSZWN0RW1wdHkgaGVyZSEgKi8KCgogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHByZXZUZXh0ICk7CgogICAgZGVidWdfcHJpbnRfbWVudWl0ZW0oIk1FTlVfU2V0SXRlbURhdGEgdG8gIDogIiwgaXRlbSwgIiIpOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIE1FTlVfSW5zZXJ0SXRlbQogKgogKiBJbnNlcnQgKGFsbG9jYXRlKSBhIG5ldyBpdGVtIGludG8gYSBtZW51LgogKi8Kc3RhdGljIE1FTlVJVEVNICpNRU5VX0luc2VydEl0ZW0oIEhNRU5VIGhNZW51LCBVSU5UIHBvcywgVUlOVCBmbGFncyApCnsKICAgIE1FTlVJVEVNICpuZXdJdGVtczsKICAgIFBPUFVQTUVOVSAqbWVudTsKCiAgICBpZiAoIShtZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogRmluZCB3aGVyZSB0byBpbnNlcnQgbmV3IGl0ZW0gKi8KCiAgICBpZiAoZmxhZ3MgJiBNRl9CWVBPU0lUSU9OKSB7CiAgICAgICAgaWYgKHBvcyA+IG1lbnUtPm5JdGVtcykKICAgICAgICAgICAgcG9zID0gbWVudS0+bkl0ZW1zOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoIU1FTlVfRmluZEl0ZW0oICZoTWVudSwgJnBvcywgZmxhZ3MgKSkKICAgICAgICAgICAgcG9zID0gbWVudS0+bkl0ZW1zOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoIShtZW51ID0gTUVOVV9HZXRNZW51KCBoTWVudSApKSkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDcmVhdGUgbmV3IGl0ZW1zIGFycmF5ICovCgogICAgbmV3SXRlbXMgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihNRU5VSVRFTSkgKiAobWVudS0+bkl0ZW1zKzEpICk7CiAgICBpZiAoIW5ld0l0ZW1zKQogICAgewogICAgICAgIFdBUk4oImFsbG9jYXRpb24gZmFpbGVkXG4iICk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAobWVudS0+bkl0ZW1zID4gMCkKICAgIHsKCSAgLyogQ29weSB0aGUgb2xkIGFycmF5IGludG8gdGhlIG5ldyBvbmUgKi8KCWlmIChwb3MgPiAwKSBtZW1jcHkoIG5ld0l0ZW1zLCBtZW51LT5pdGVtcywgcG9zICogc2l6ZW9mKE1FTlVJVEVNKSApOwoJaWYgKHBvcyA8IG1lbnUtPm5JdGVtcykgbWVtY3B5KCAmbmV3SXRlbXNbcG9zKzFdLCAmbWVudS0+aXRlbXNbcG9zXSwKCQkJCQkobWVudS0+bkl0ZW1zLXBvcykqc2l6ZW9mKE1FTlVJVEVNKSApOwogICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW51LT5pdGVtcyApOwogICAgfQogICAgbWVudS0+aXRlbXMgPSBuZXdJdGVtczsKICAgIG1lbnUtPm5JdGVtcysrOwogICAgbWVtc2V0KCAmbmV3SXRlbXNbcG9zXSwgMCwgc2l6ZW9mKCpuZXdJdGVtcykgKTsKICAgIG1lbnUtPkhlaWdodCA9IDA7IC8qIGZvcmNlIHNpemUgcmVjYWxjdWxhdGUgKi8KICAgIHJldHVybiAmbmV3SXRlbXNbcG9zXTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgTUVOVV9QYXJzZVJlc291cmNlCiAqCiAqIFBhcnNlIGEgc3RhbmRhcmQgbWVudSByZXNvdXJjZSBhbmQgYWRkIGl0ZW1zIHRvIHRoZSBtZW51LgogKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHJlc291cmNlLgogKgogKiBOT1RFOiBmbGFncyBpcyBlcXVpdmFsZW50IHRvIHRoZSBtdE9wdGlvbiBmaWVsZAogKi8Kc3RhdGljIExQQ1NUUiBNRU5VX1BhcnNlUmVzb3VyY2UoIExQQ1NUUiByZXMsIEhNRU5VIGhNZW51LCBCT09MIHVuaWNvZGUgKQp7CiAgICBXT1JEIGZsYWdzLCBpZCA9IDA7CiAgICBMUENTVFIgc3RyOwoKICAgIGRvCiAgICB7CiAgICAgICAgZmxhZ3MgPSBHRVRfV09SRChyZXMpOwogICAgICAgIHJlcyArPSBzaXplb2YoV09SRCk7CiAgICAgICAgaWYgKCEoZmxhZ3MgJiBNRl9QT1BVUCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IEdFVF9XT1JEKHJlcyk7CiAgICAgICAgICAgIHJlcyArPSBzaXplb2YoV09SRCk7CiAgICAgICAgfQogICAgICAgIHN0ciA9IHJlczsKICAgICAgICBpZiAoIXVuaWNvZGUpIHJlcyArPSBzdHJsZW4oc3RyKSArIDE7CiAgICAgICAgZWxzZSByZXMgKz0gKHN0cmxlblcoKExQQ1dTVFIpc3RyKSArIDEpICogc2l6ZW9mKFdDSEFSKTsKICAgICAgICBpZiAoZmxhZ3MgJiBNRl9QT1BVUCkKICAgICAgICB7CiAgICAgICAgICAgIEhNRU5VIGhTdWJNZW51ID0gQ3JlYXRlUG9wdXBNZW51KCk7CiAgICAgICAgICAgIGlmICghaFN1Yk1lbnUpIHJldHVybiBOVUxMOwogICAgICAgICAgICBpZiAoIShyZXMgPSBNRU5VX1BhcnNlUmVzb3VyY2UoIHJlcywgaFN1Yk1lbnUsIHVuaWNvZGUgKSkpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgaWYgKCF1bmljb2RlKSBBcHBlbmRNZW51QSggaE1lbnUsIGZsYWdzLCAoVUlOVCloU3ViTWVudSwgc3RyICk7CiAgICAgICAgICAgIGVsc2UgQXBwZW5kTWVudVcoIGhNZW51LCBmbGFncywgKFVJTlQpaFN1Yk1lbnUsIChMUENXU1RSKXN0ciApOwogICAgICAgIH0KICAgICAgICBlbHNlICAvKiBOb3QgYSBwb3B1cCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF1bmljb2RlKSBBcHBlbmRNZW51QSggaE1lbnUsIGZsYWdzLCBpZCwgKnN0ciA/IHN0ciA6IE5VTEwgKTsKICAgICAgICAgICAgZWxzZSBBcHBlbmRNZW51VyggaE1lbnUsIGZsYWdzLCBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKExQQ1dTVFIpc3RyID8gKExQQ1dTVFIpc3RyIDogTlVMTCApOwogICAgICAgIH0KICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBNRl9FTkQpKTsKICAgIHJldHVybiByZXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIE1FTlVFWF9QYXJzZVJlc291cmNlCiAqCiAqIFBhcnNlIGFuIGV4dGVuZGVkIG1lbnUgcmVzb3VyY2UgYW5kIGFkZCBpdGVtcyB0byB0aGUgbWVudS4KICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSByZXNvdXJjZS4KICovCnN0YXRpYyBMUENTVFIgTUVOVUVYX1BhcnNlUmVzb3VyY2UoIExQQ1NUUiByZXMsIEhNRU5VIGhNZW51KQp7CiAgICBXT1JEIHJlc2luZm87CiAgICBkbyB7CglNRU5VSVRFTUlORk9XIG1paTsKCgltaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7CgltaWkuZk1hc2sgPSBNSUlNX1NUQVRFIHwgTUlJTV9JRCB8IE1JSU1fVFlQRTsKCW1paS5mVHlwZSA9IEdFVF9EV09SRChyZXMpOwogICAgICAgIHJlcyArPSBzaXplb2YoRFdPUkQpOwoJbWlpLmZTdGF0ZSA9IEdFVF9EV09SRChyZXMpOwogICAgICAgIHJlcyArPSBzaXplb2YoRFdPUkQpOwoJbWlpLndJRCA9IEdFVF9EV09SRChyZXMpOwogICAgICAgIHJlcyArPSBzaXplb2YoRFdPUkQpOwoJcmVzaW5mbyA9IEdFVF9XT1JEKHJlcyk7IC8qIEZJWE1FOiBmb3IgMTYtYml0IGFwcHMgdGhpcyBpcyBhIGJ5dGUuICAqLwogICAgICAgIHJlcyArPSBzaXplb2YoV09SRCk7CgkvKiBBbGlnbiB0aGUgdGV4dCBvbiBhIHdvcmQgYm91bmRhcnkuICAqLwoJcmVzICs9ICh+KChpbnQpcmVzIC0gMSkpICYgMTsKCW1paS5kd1R5cGVEYXRhID0gKExQV1NUUikgcmVzOwoJcmVzICs9ICgxICsgc3RybGVuVyhtaWkuZHdUeXBlRGF0YSkpICogc2l6ZW9mKFdDSEFSKTsKCS8qIEFsaWduIHRoZSBmb2xsb3dpbmcgZmllbGRzIG9uIGEgZHdvcmQgYm91bmRhcnkuICAqLwoJcmVzICs9ICh+KChpbnQpcmVzIC0gMSkpICYgMzsKCiAgICAgICAgVFJBQ0UoIk1lbnUgaXRlbTogWyUwOHgsJTA4eCwlMDR4LCUwNHgsJXNdXG4iLAogICAgICAgICAgICAgIG1paS5mVHlwZSwgbWlpLmZTdGF0ZSwgbWlpLndJRCwgcmVzaW5mbywgZGVidWdzdHJfdyhtaWkuZHdUeXBlRGF0YSkpOwoKCWlmIChyZXNpbmZvICYgMSkgewkvKiBQb3AtdXA/ICovCgkgICAgLyogRFdPUkQgaGVscGlkID0gR0VUX0RXT1JEKHJlcyk7IEZJWE1FOiB1c2UgdGhpcy4gICovCgkgICAgcmVzICs9IHNpemVvZihEV09SRCk7CgkgICAgbWlpLmhTdWJNZW51ID0gQ3JlYXRlUG9wdXBNZW51KCk7CgkgICAgaWYgKCFtaWkuaFN1Yk1lbnUpCgkJcmV0dXJuIE5VTEw7CgkgICAgaWYgKCEocmVzID0gTUVOVUVYX1BhcnNlUmVzb3VyY2UocmVzLCBtaWkuaFN1Yk1lbnUpKSkgewoJCURlc3Ryb3lNZW51KG1paS5oU3ViTWVudSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKCSAgICB9CgkgICAgbWlpLmZNYXNrIHw9IE1JSU1fU1VCTUVOVTsKCSAgICBtaWkuZlR5cGUgfD0gTUZfUE9QVVA7CiAgICAgICAgfQoJZWxzZSBpZighKm1paS5kd1R5cGVEYXRhICYmICEobWlpLmZUeXBlICYgTUZfU0VQQVJBVE9SKSkKCXsKCSAgICBXQVJOKCJDb252ZXJ0aW5nIE5VTEwgbWVudSBpdGVtICUwNHgsIHR5cGUgJTA0eCB0byBTRVBBUkFUT1JcbiIsCgkJbWlpLndJRCwgbWlpLmZUeXBlKTsKCSAgICBtaWkuZlR5cGUgfD0gTUZfU0VQQVJBVE9SOwoJfQoJSW5zZXJ0TWVudUl0ZW1XKGhNZW51LCAtMSwgTUZfQllQT1NJVElPTiwgJm1paSk7CiAgICB9IHdoaWxlICghKHJlc2luZm8gJiBNRl9FTkQpKTsKICAgIHJldHVybiByZXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfR2V0U3ViUG9wdXAKICoKICogUmV0dXJuIHRoZSBoYW5kbGUgb2YgdGhlIHNlbGVjdGVkIHN1Yi1wb3B1cCBtZW51IChpZiBhbnkpLgogKi8Kc3RhdGljIEhNRU5VIE1FTlVfR2V0U3ViUG9wdXAoIEhNRU5VIGhtZW51ICkKewogICAgUE9QVVBNRU5VICptZW51OwogICAgTUVOVUlURU0gKml0ZW07CgogICAgbWVudSA9IE1FTlVfR2V0TWVudSggaG1lbnUgKTsKCiAgICBpZiAoKCFtZW51KSB8fCAobWVudS0+Rm9jdXNlZEl0ZW0gPT0gTk9fU0VMRUNURURfSVRFTSkpIHJldHVybiAwOwoKICAgIGl0ZW0gPSAmbWVudS0+aXRlbXNbbWVudS0+Rm9jdXNlZEl0ZW1dOwogICAgaWYgKChpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKSAmJiAoaXRlbS0+ZlN0YXRlICYgTUZfTU9VU0VTRUxFQ1QpKQogICAgICAgIHJldHVybiBpdGVtLT5oU3ViTWVudTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0hpZGVTdWJQb3B1cHMKICoKICogSGlkZSB0aGUgc3ViLXBvcHVwIG1lbnVzIG9mIHRoaXMgbWVudS4KICovCnN0YXRpYyB2b2lkIE1FTlVfSGlkZVN1YlBvcHVwcyggSFdORCBod25kT3duZXIsIEhNRU5VIGhtZW51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgc2VuZE1lbnVTZWxlY3QgKQp7CiAgICBQT1BVUE1FTlUgKm1lbnUgPSBNRU5VX0dldE1lbnUoIGhtZW51ICk7CgogICAgVFJBQ0UoIm93bmVyPSVwIGhtZW51PSVwIDB4JTA0eFxuIiwgaHduZE93bmVyLCBobWVudSwgc2VuZE1lbnVTZWxlY3QpOwoKICAgIGlmIChtZW51ICYmIHRvcF9wb3B1cCkKICAgIHsKCUhNRU5VIGhzdWJtZW51OwoJUE9QVVBNRU5VICpzdWJtZW51OwoJTUVOVUlURU0gKml0ZW07CgoJaWYgKG1lbnUtPkZvY3VzZWRJdGVtICE9IE5PX1NFTEVDVEVEX0lURU0pCgl7CgkgICAgaXRlbSA9ICZtZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV07CgkgICAgaWYgKCEoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgfHwKCQkhKGl0ZW0tPmZTdGF0ZSAmIE1GX01PVVNFU0VMRUNUKSkgcmV0dXJuOwoJICAgIGl0ZW0tPmZTdGF0ZSAmPSB+TUZfTU9VU0VTRUxFQ1Q7CgkgICAgaHN1Ym1lbnUgPSBpdGVtLT5oU3ViTWVudTsKCX0gZWxzZSByZXR1cm47CgoJc3VibWVudSA9IE1FTlVfR2V0TWVudSggaHN1Ym1lbnUgKTsKCU1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBoc3VibWVudSwgRkFMU0UgKTsKCU1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBoc3VibWVudSwgTk9fU0VMRUNURURfSVRFTSwgc2VuZE1lbnVTZWxlY3QsIDAgKTsKICAgICAgICBEZXN0cm95V2luZG93KCBzdWJtZW51LT5oV25kICk7CiAgICAgICAgc3VibWVudS0+aFduZCA9IDA7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfU2hvd1N1YlBvcHVwCiAqCiAqIERpc3BsYXkgdGhlIHN1Yi1tZW51IG9mIHRoZSBzZWxlY3RlZCBpdGVtIG9mIHRoaXMgbWVudS4KICogUmV0dXJuIHRoZSBoYW5kbGUgb2YgdGhlIHN1Ym1lbnUsIG9yIGhtZW51IGlmIG5vIHN1Ym1lbnUgdG8gZGlzcGxheS4KICovCnN0YXRpYyBITUVOVSBNRU5VX1Nob3dTdWJQb3B1cCggSFdORCBod25kT3duZXIsIEhNRU5VIGhtZW51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBzZWxlY3RGaXJzdCwgVUlOVCB3RmxhZ3MgKQp7CiAgICBSRUNUIHJlY3Q7CiAgICBQT1BVUE1FTlUgKm1lbnU7CiAgICBNRU5VSVRFTSAqaXRlbTsKICAgIEhEQyBoZGM7CgogICAgVFJBQ0UoIm93bmVyPSVwIGhtZW51PSVwIDB4JTA0eFxuIiwgaHduZE93bmVyLCBobWVudSwgc2VsZWN0Rmlyc3QpOwoKICAgIGlmICghKG1lbnUgPSBNRU5VX0dldE1lbnUoIGhtZW51ICkpKSByZXR1cm4gaG1lbnU7CgogICAgaWYgKG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0pIHJldHVybiBobWVudTsKCiAgICBpdGVtID0gJm1lbnUtPml0ZW1zW21lbnUtPkZvY3VzZWRJdGVtXTsKICAgIGlmICghKGl0ZW0tPmZUeXBlICYgTUZfUE9QVVApIHx8IChpdGVtLT5mU3RhdGUgJiAoTUZfR1JBWUVEIHwgTUZfRElTQUJMRUQpKSkKICAgICAgICByZXR1cm4gaG1lbnU7CgogICAgLyogbWVzc2FnZSBtdXN0IGJlIHNlbnQgYmVmb3JlIHVzaW5nIGl0ZW0sCiAgICAgICBiZWNhdXNlIG5lYXJseSBldmVyeXRoaW5nIG1heSBiZSBjaGFuZ2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiAhICovCgogICAgLyogU2VuZCBXTV9JTklUTUVOVVBPUFVQIG1lc3NhZ2Ugb25seSBpZiBUUE1fTk9OT1RJRlkgZmxhZyBpcyBub3Qgc3BlY2lmaWVkICovCiAgICBpZiAoISh3RmxhZ3MgJiBUUE1fTk9OT1RJRlkpKQogICAgICAgU2VuZE1lc3NhZ2VXKCBod25kT3duZXIsIFdNX0lOSVRNRU5VUE9QVVAsIChXUEFSQU0paXRlbS0+aFN1Yk1lbnUsCiAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBtZW51LT5Gb2N1c2VkSXRlbSwgSVNfU1lTVEVNX01FTlUobWVudSkgKSk7CgogICAgaXRlbSA9ICZtZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV07CiAgICByZWN0ID0gaXRlbS0+cmVjdDsKCiAgICAvKiBjb3JyZWN0IGl0ZW0gaWYgbW9kaWZpZWQgYXMgYSByZWFjdGlvbiB0byBXTV9JTklUTUVOVVBPUFVQIG1lc3NhZ2UgKi8KICAgIGlmICghKGl0ZW0tPmZTdGF0ZSAmIE1GX0hJTElURSkpCiAgICB7CiAgICAgICAgaWYgKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSBoZGMgPSBHZXREQyggbWVudS0+aFduZCApOwogICAgICAgIGVsc2UgaGRjID0gR2V0RENFeCggbWVudS0+aFduZCwgMCwgRENYX0NBQ0hFIHwgRENYX1dJTkRPVyk7CgogICAgICAgIFNlbGVjdE9iamVjdCggaGRjLCBoTWVudUZvbnQpOwoKICAgICAgICBpdGVtLT5mU3RhdGUgfD0gTUZfSElMSVRFOwogICAgICAgIE1FTlVfRHJhd01lbnVJdGVtKCBtZW51LT5oV25kLCBobWVudSwgaHduZE93bmVyLCBoZGMsIGl0ZW0sIG1lbnUtPkhlaWdodCwgIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCksIE9EQV9EUkFXRU5USVJFICk7CglSZWxlYXNlREMoIG1lbnUtPmhXbmQsIGhkYyApOwogICAgfQogICAgaWYgKCFpdGVtLT5yZWN0LnRvcCAmJiAhaXRlbS0+cmVjdC5sZWZ0ICYmICFpdGVtLT5yZWN0LmJvdHRvbSAmJiAhaXRlbS0+cmVjdC5yaWdodCkKICAgICAgaXRlbS0+cmVjdCA9IHJlY3Q7CgogICAgaXRlbS0+ZlN0YXRlIHw9IE1GX01PVVNFU0VMRUNUOwoKICAgIGlmIChJU19TWVNURU1fTUVOVShtZW51KSkKICAgIHsKCU1FTlVfSW5pdFN5c01lbnVQb3B1cChpdGVtLT5oU3ViTWVudSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93TG9uZ1coIG1lbnUtPmhXbmQsIEdXTF9TVFlMRSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDbGFzc0xvbmdXKCBtZW51LT5oV25kLCBHQ0xfU1RZTEUpKTsKCglOQ19HZXRTeXNQb3B1cFBvcyggbWVudS0+aFduZCwgJnJlY3QgKTsKCXJlY3QudG9wID0gcmVjdC5ib3R0b207CglyZWN0LnJpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpOwogICAgICAgIHJlY3QuYm90dG9tID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNJWkUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIEdldFdpbmRvd1JlY3QoIG1lbnUtPmhXbmQsICZyZWN0ICk7CglpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApCgl7CgkgICAgcmVjdC5sZWZ0ICs9IGl0ZW0tPnJlY3QucmlnaHQgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYQk9SREVSKTsKCSAgICByZWN0LnRvcCArPSBpdGVtLT5yZWN0LnRvcDsKCSAgICByZWN0LnJpZ2h0ID0gaXRlbS0+cmVjdC5sZWZ0IC0gaXRlbS0+cmVjdC5yaWdodCArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hCT1JERVIpOwoJICAgIHJlY3QuYm90dG9tID0gaXRlbS0+cmVjdC50b3AgLSBpdGVtLT5yZWN0LmJvdHRvbTsKCX0KCWVsc2UKCXsKCSAgICByZWN0LmxlZnQgKz0gaXRlbS0+cmVjdC5sZWZ0OwoJICAgIHJlY3QudG9wICs9IGl0ZW0tPnJlY3QuYm90dG9tOwoJICAgIHJlY3QucmlnaHQgPSBpdGVtLT5yZWN0LnJpZ2h0IC0gaXRlbS0+cmVjdC5sZWZ0OwoJICAgIHJlY3QuYm90dG9tID0gaXRlbS0+cmVjdC5ib3R0b20gLSBpdGVtLT5yZWN0LnRvcDsKCX0KICAgIH0KCiAgICBNRU5VX1Nob3dQb3B1cCggaHduZE93bmVyLCBpdGVtLT5oU3ViTWVudSwgbWVudS0+Rm9jdXNlZEl0ZW0sCgkJICAgIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tICk7CiAgICBpZiAoc2VsZWN0Rmlyc3QpCiAgICAgICAgTUVOVV9Nb3ZlU2VsZWN0aW9uKCBod25kT3duZXIsIGl0ZW0tPmhTdWJNZW51LCBJVEVNX05FWFQgKTsKICAgIHJldHVybiBpdGVtLT5oU3ViTWVudTsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIE1FTlVfSXNNZW51QWN0aXZlCiAqLwpIV05EIE1FTlVfSXNNZW51QWN0aXZlKHZvaWQpCnsKICAgIHJldHVybiB0b3BfcG9wdXA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9QdE1lbnUKICoKICogV2Fsa3MgbWVudSBjaGFpbiB0cnlpbmcgdG8gZmluZCBhIG1lbnUgcHQgbWFwcyB0by4KICovCnN0YXRpYyBITUVOVSBNRU5VX1B0TWVudSggSE1FTlUgaE1lbnUsIFBPSU5UIHB0ICkKewogICBQT1BVUE1FTlUgKm1lbnUgPSBNRU5VX0dldE1lbnUoIGhNZW51ICk7CiAgIFVJTlQgaXRlbSA9IG1lbnUtPkZvY3VzZWRJdGVtOwogICBITUVOVSByZXQ7CgogICAvKiB0cnkgc3VicG9wdXAgZmlyc3QgKGlmIGFueSkgKi8KICAgcmV0ID0gKGl0ZW0gIT0gTk9fU0VMRUNURURfSVRFTSAmJgogICAgICAgICAgKG1lbnUtPml0ZW1zW2l0ZW1dLmZUeXBlICYgTUZfUE9QVVApICYmCiAgICAgICAgICAobWVudS0+aXRlbXNbaXRlbV0uZlN0YXRlICYgTUZfTU9VU0VTRUxFQ1QpKQogICAgICAgID8gTUVOVV9QdE1lbnUobWVudS0+aXRlbXNbaXRlbV0uaFN1Yk1lbnUsIHB0KSA6IDA7CgogICBpZiAoIXJldCkgIC8qIGNoZWNrIHRoZSBjdXJyZW50IHdpbmRvdyAoYXZvaWRpbmcgV01fSElUVEVTVCkgKi8KICAgewogICAgICAgSU5UIGh0ID0gTkNfSGFuZGxlTkNIaXRUZXN0KCBtZW51LT5oV25kLCBwdCApOwogICAgICAgaWYoIG1lbnUtPndGbGFncyAmIE1GX1BPUFVQICkKICAgICAgIHsKICAgICAgICAgICBpZiAoaHQgIT0gSFROT1dIRVJFICYmIGh0ICE9IEhURVJST1IpIHJldCA9IGhNZW51OwogICAgICAgfQogICAgICAgZWxzZSBpZiAoaHQgPT0gSFRTWVNNRU5VKQogICAgICAgICAgIHJldCA9IGdldF93aW5fc3lzX21lbnUoIG1lbnUtPmhXbmQgKTsKICAgICAgIGVsc2UgaWYgKGh0ID09IEhUTUVOVSkKICAgICAgICAgICByZXQgPSBHZXRNZW51KCBtZW51LT5oV25kICk7CiAgIH0KICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0V4ZWNGb2N1c2VkSXRlbQogKgogKiBFeGVjdXRlIGEgbWVudSBpdGVtIChmb3IgaW5zdGFuY2Ugd2hlbiB1c2VyIHByZXNzZWQgRW50ZXIpLgogKiBSZXR1cm4gdGhlIHdJRCBvZiB0aGUgZXhlY3V0ZWQgaXRlbS4gT3RoZXJ3aXNlLCAtMSBpbmRpY2F0aW5nCiAqIHRoYXQgbm8gbWVudSBpdGVtIHdhcyBleGVjdXRlZDsKICogSGF2ZSB0byByZWNlaXZlIHRoZSBmbGFncyBmb3IgdGhlIFRyYWNrUG9wdXBNZW51IG9wdGlvbnMgdG8gYXZvaWQKICogc2VuZGluZyB1bndhbnRlZCBtZXNzYWdlLgogKgogKi8Kc3RhdGljIElOVCBNRU5VX0V4ZWNGb2N1c2VkSXRlbSggTVRSQUNLRVIqIHBtdCwgSE1FTlUgaE1lbnUsIFVJTlQgd0ZsYWdzICkKewogICAgTUVOVUlURU0gKml0ZW07CiAgICBQT1BVUE1FTlUgKm1lbnUgPSBNRU5VX0dldE1lbnUoIGhNZW51ICk7CgogICAgVFJBQ0UoIiVwIGhtZW51PSVwXG4iLCBwbXQsIGhNZW51KTsKCiAgICBpZiAoIW1lbnUgfHwgIW1lbnUtPm5JdGVtcyB8fAoJKG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0pKSByZXR1cm4gLTE7CgogICAgaXRlbSA9ICZtZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV07CgogICAgVFJBQ0UoIiVwICUwOHggJXBcbiIsIGhNZW51LCBpdGVtLT53SUQsIGl0ZW0tPmhTdWJNZW51KTsKCiAgICBpZiAoIShpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKSkKICAgIHsKCWlmICghKGl0ZW0tPmZTdGF0ZSAmIChNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCkpICYmICEoaXRlbS0+ZlR5cGUgJiBNRl9TRVBBUkFUT1IpKQoJewoJICAgIC8qIElmIFRQTV9SRVRVUk5DTUQgaXMgc2V0IHlvdSByZXR1cm4gdGhlIGlkLCBidXQKCSAgICAgICBkbyBub3Qgc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG93bmVyICovCgkgICAgaWYoISh3RmxhZ3MgJiBUUE1fUkVUVVJOQ01EKSkKCSAgICB7CgkJaWYoIG1lbnUtPndGbGFncyAmIE1GX1NZU01FTlUgKQoJCSAgICBQb3N0TWVzc2FnZVcoIHBtdC0+aE93bmVyV25kLCBXTV9TWVNDT01NQU5ELCBpdGVtLT53SUQsCgkJCQkgIE1BS0VMUEFSQU0oKElOVDE2KXBtdC0+cHQueCwgKElOVDE2KXBtdC0+cHQueSkgKTsKCQllbHNlCgkJICAgIFBvc3RNZXNzYWdlVyggcG10LT5oT3duZXJXbmQsIFdNX0NPTU1BTkQsIGl0ZW0tPndJRCwgMCApOwoJICAgIH0KCSAgICByZXR1cm4gaXRlbS0+d0lEOwoJfQogICAgfQogICAgZWxzZQoJcG10LT5oQ3VycmVudE1lbnUgPSBNRU5VX1Nob3dTdWJQb3B1cChwbXQtPmhPd25lclduZCwgaE1lbnUsIFRSVUUsIHdGbGFncyk7CgogICAgcmV0dXJuIC0xOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfU3dpdGNoVHJhY2tpbmcKICoKICogSGVscGVyIGZ1bmN0aW9uIGZvciBtZW51IG5hdmlnYXRpb24gcm91dGluZXMuCiAqLwpzdGF0aWMgdm9pZCBNRU5VX1N3aXRjaFRyYWNraW5nKCBNVFJBQ0tFUiogcG10LCBITUVOVSBoUHRNZW51LCBVSU5UIGlkICkKewogICAgUE9QVVBNRU5VICpwdG1lbnUgPSBNRU5VX0dldE1lbnUoIGhQdE1lbnUgKTsKICAgIFBPUFVQTUVOVSAqdG9wbWVudSA9IE1FTlVfR2V0TWVudSggcG10LT5oVG9wTWVudSApOwoKICAgIFRSQUNFKCIlcCBobWVudT0lcCAweCUwNHhcbiIsIHBtdCwgaFB0TWVudSwgaWQpOwoKICAgIGlmKCBwbXQtPmhUb3BNZW51ICE9IGhQdE1lbnUgJiYKCSEoKHB0bWVudS0+d0ZsYWdzIHwgdG9wbWVudS0+d0ZsYWdzKSAmIE1GX1BPUFVQKSApCiAgICB7CgkvKiBib3RoIGFyZSB0b3AgbGV2ZWwgbWVudXMgKHN5c3RlbSBhbmQgbWVudS1iYXIpICovCglNRU5VX0hpZGVTdWJQb3B1cHMoIHBtdC0+aE93bmVyV25kLCBwbXQtPmhUb3BNZW51LCBGQUxTRSApOwoJTUVOVV9TZWxlY3RJdGVtKCBwbXQtPmhPd25lclduZCwgcG10LT5oVG9wTWVudSwgTk9fU0VMRUNURURfSVRFTSwgRkFMU0UsIDAgKTsKICAgICAgICBwbXQtPmhUb3BNZW51ID0gaFB0TWVudTsKICAgIH0KICAgIGVsc2UgTUVOVV9IaWRlU3ViUG9wdXBzKCBwbXQtPmhPd25lclduZCwgaFB0TWVudSwgRkFMU0UgKTsKICAgIE1FTlVfU2VsZWN0SXRlbSggcG10LT5oT3duZXJXbmQsIGhQdE1lbnUsIGlkLCBUUlVFLCAwICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfQnV0dG9uRG93bgogKgogKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogKi8Kc3RhdGljIEJPT0wgTUVOVV9CdXR0b25Eb3duKCBNVFJBQ0tFUiogcG10LCBITUVOVSBoUHRNZW51LCBVSU5UIHdGbGFncyApCnsKICAgIFRSQUNFKCIlcCBoUHRNZW51PSVwXG4iLCBwbXQsIGhQdE1lbnUpOwoKICAgIGlmIChoUHRNZW51KQogICAgewoJVUlOVCBpZCA9IDA7CglQT1BVUE1FTlUgKnB0bWVudSA9IE1FTlVfR2V0TWVudSggaFB0TWVudSApOwoJTUVOVUlURU0gKml0ZW07CgoJaWYoIElTX1NZU1RFTV9NRU5VKHB0bWVudSkgKQoJICAgIGl0ZW0gPSBwdG1lbnUtPml0ZW1zOwoJZWxzZQoJICAgIGl0ZW0gPSBNRU5VX0ZpbmRJdGVtQnlDb29yZHMoIHB0bWVudSwgcG10LT5wdCwgJmlkICk7CgoJaWYoIGl0ZW0gKQoJewoJICAgIGlmKCBwdG1lbnUtPkZvY3VzZWRJdGVtICE9IGlkICkKCQlNRU5VX1N3aXRjaFRyYWNraW5nKCBwbXQsIGhQdE1lbnUsIGlkICk7CgoJICAgIC8qIElmIHRoZSBwb3B1cCBtZW51IGlzIG5vdCBhbHJlYWR5ICJwb3BwZWQiICovCgkgICAgaWYoIShpdGVtLT5mU3RhdGUgJiBNRl9NT1VTRVNFTEVDVCApKQoJICAgIHsKCQlwbXQtPmhDdXJyZW50TWVudSA9IE1FTlVfU2hvd1N1YlBvcHVwKCBwbXQtPmhPd25lclduZCwgaFB0TWVudSwgRkFMU0UsIHdGbGFncyApOwoJICAgIH0KCgkgICAgcmV0dXJuIFRSVUU7Cgl9CgkvKiBFbHNlIHRoZSBjbGljayB3YXMgb24gdGhlIG1lbnUgYmFyLCBmaW5pc2ggdGhlIHRyYWNraW5nICovCiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9CdXR0b25VcAogKgogKiBSZXR1cm4gdGhlIHZhbHVlIG9mIE1FTlVfRXhlY0ZvY3VzZWRJdGVtIGlmCiAqIHRoZSBzZWxlY3RlZCBpdGVtIHdhcyBub3QgYSBwb3B1cC4gRWxzZSBvcGVuIHRoZSBwb3B1cC4KICogQSAtMSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoYXQgd2UgZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogKgogKi8Kc3RhdGljIElOVCBNRU5VX0J1dHRvblVwKCBNVFJBQ0tFUiogcG10LCBITUVOVSBoUHRNZW51LCBVSU5UIHdGbGFncykKewogICAgVFJBQ0UoIiVwIGhtZW51PSVwXG4iLCBwbXQsIGhQdE1lbnUpOwoKICAgIGlmIChoUHRNZW51KQogICAgewoJVUlOVCBpZCA9IDA7CglQT1BVUE1FTlUgKnB0bWVudSA9IE1FTlVfR2V0TWVudSggaFB0TWVudSApOwoJTUVOVUlURU0gKml0ZW07CgogICAgICAgIGlmKCBJU19TWVNURU1fTUVOVShwdG1lbnUpICkKICAgICAgICAgICAgaXRlbSA9IHB0bWVudS0+aXRlbXM7CiAgICAgICAgZWxzZQogICAgICAgICAgICBpdGVtID0gTUVOVV9GaW5kSXRlbUJ5Q29vcmRzKCBwdG1lbnUsIHBtdC0+cHQsICZpZCApOwoKCWlmKCBpdGVtICYmIChwdG1lbnUtPkZvY3VzZWRJdGVtID09IGlkICkpCgl7CgkgICAgaWYoICEoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgKQoJCXJldHVybiBNRU5VX0V4ZWNGb2N1c2VkSXRlbSggcG10LCBoUHRNZW51LCB3RmxhZ3MpOwoKCSAgICAvKiBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIHRoZSB0b3AtbGV2ZWwgbWVudSAgICAgICAgICAgICovCgkgICAgLyogYW5kIHRoaXMgaXMgYSBjbGljayBvbiBhbiBhbHJlYWR5ICJwb3BwZWQiIGl0ZW06ICAgICAqLwoJICAgIC8qIFN0b3AgdGhlIG1lbnUgdHJhY2tpbmcgYW5kIGNsb3NlIHRoZSBvcGVuZWQgc3VibWVudXMgKi8KCSAgICBpZigocG10LT5oVG9wTWVudSA9PSBoUHRNZW51KSAmJiBwdG1lbnUtPmJUaW1lVG9IaWRlKQoJCXJldHVybiAwOwoJfQoJcHRtZW51LT5iVGltZVRvSGlkZSA9IFRSVUU7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfTW91c2VNb3ZlCiAqCiAqIFJldHVybiBUUlVFIGlmIHdlIGNhbiBnbyBvbiB3aXRoIG1lbnUgdHJhY2tpbmcuCiAqLwpzdGF0aWMgQk9PTCBNRU5VX01vdXNlTW92ZSggTVRSQUNLRVIqIHBtdCwgSE1FTlUgaFB0TWVudSwgVUlOVCB3RmxhZ3MgKQp7CiAgICBVSU5UIGlkID0gTk9fU0VMRUNURURfSVRFTTsKICAgIFBPUFVQTUVOVSAqcHRtZW51ID0gTlVMTDsKCiAgICBpZiggaFB0TWVudSApCiAgICB7CglwdG1lbnUgPSBNRU5VX0dldE1lbnUoIGhQdE1lbnUgKTsKICAgICAgICBpZiggSVNfU1lTVEVNX01FTlUocHRtZW51KSApCgkgICAgaWQgPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgTUVOVV9GaW5kSXRlbUJ5Q29vcmRzKCBwdG1lbnUsIHBtdC0+cHQsICZpZCApOwogICAgfQoKICAgIGlmKCBpZCA9PSBOT19TRUxFQ1RFRF9JVEVNICkKICAgIHsKCU1FTlVfU2VsZWN0SXRlbSggcG10LT5oT3duZXJXbmQsIHBtdC0+aEN1cnJlbnRNZW51LAoJCQkgTk9fU0VMRUNURURfSVRFTSwgVFJVRSwgcG10LT5oVG9wTWVudSk7CgogICAgfQogICAgZWxzZSBpZiggcHRtZW51LT5Gb2N1c2VkSXRlbSAhPSBpZCApCiAgICB7CgkgICAgTUVOVV9Td2l0Y2hUcmFja2luZyggcG10LCBoUHRNZW51LCBpZCApOwoJICAgIHBtdC0+aEN1cnJlbnRNZW51ID0gTUVOVV9TaG93U3ViUG9wdXAocG10LT5oT3duZXJXbmQsIGhQdE1lbnUsIEZBTFNFLCB3RmxhZ3MpOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfU2V0Q2FwdHVyZQogKi8Kc3RhdGljIHZvaWQgTUVOVV9TZXRDYXB0dXJlKCBIV05EIGh3bmQgKQp7CiAgICBIV05EIHByZXZpb3VzID0gMDsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfY2FwdHVyZV93aW5kb3cgKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlID0gaHduZDsKICAgICAgICByZXEtPmZsYWdzICA9IENBUFRVUkVfTUVOVTsKICAgICAgICBpZiAoIXdpbmVfc2VydmVyX2NhbGxfZXJyKCByZXEgKSkKICAgICAgICB7CiAgICAgICAgICAgIHByZXZpb3VzID0gcmVwbHktPnByZXZpb3VzOwogICAgICAgICAgICBod25kID0gcmVwbHktPmZ1bGxfaGFuZGxlOwogICAgICAgIH0KICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwoKICAgIGlmIChwcmV2aW91cyAmJiBwcmV2aW91cyAhPSBod25kKQogICAgICAgIFNlbmRNZXNzYWdlVyggcHJldmlvdXMsIFdNX0NBUFRVUkVDSEFOR0VELCAwLCAoTFBBUkFNKWh3bmQgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9Eb05leHRNZW51CiAqCiAqIE5PVEU6IFdNX05FWFRNRU5VIGRvY3VtZW50ZWQgaW4gV2luMzIgaXMgYSBiaXQgZGlmZmVyZW50LgogKi8Kc3RhdGljIExSRVNVTFQgTUVOVV9Eb05leHRNZW51KCBNVFJBQ0tFUiogcG10LCBVSU5UIHZrICkKewogICAgUE9QVVBNRU5VICptZW51ID0gTUVOVV9HZXRNZW51KCBwbXQtPmhUb3BNZW51ICk7CgogICAgaWYoICh2ayA9PSBWS19MRUZUICYmICBtZW51LT5Gb2N1c2VkSXRlbSA9PSAwICkgfHwKICAgICAgICAodmsgPT0gVktfUklHSFQgJiYgbWVudS0+Rm9jdXNlZEl0ZW0gPT0gbWVudS0+bkl0ZW1zIC0gMSkpCiAgICB7CiAgICAgICAgTURJTkVYVE1FTlUgbmV4dF9tZW51OwoJSE1FTlUgaE5ld01lbnU7CglIV05EICBoTmV3V25kOwoJVUlOVCAgaWQgPSAwOwoKICAgICAgICBuZXh0X21lbnUuaG1lbnVJbiA9IChJU19TWVNURU1fTUVOVShtZW51KSkgPyBHZXRTdWJNZW51KHBtdC0+aFRvcE1lbnUsMCkgOiBwbXQtPmhUb3BNZW51OwogICAgICAgIG5leHRfbWVudS5obWVudU5leHQgPSAwOwogICAgICAgIG5leHRfbWVudS5od25kTmV4dCA9IDA7CiAgICAgICAgU2VuZE1lc3NhZ2VXKCBwbXQtPmhPd25lclduZCwgV01fTkVYVE1FTlUsIHZrLCAoTFBBUkFNKSZuZXh0X21lbnUgKTsKCiAgICAgICAgVFJBQ0UoIiVwIFslcF0gLT4gJXAgWyVwXVxuIiwKICAgICAgICAgICAgICBwbXQtPmhDdXJyZW50TWVudSwgcG10LT5oT3duZXJXbmQsIG5leHRfbWVudS5obWVudU5leHQsIG5leHRfbWVudS5od25kTmV4dCApOwoKCWlmICghbmV4dF9tZW51LmhtZW51TmV4dCB8fCAhbmV4dF9tZW51Lmh3bmROZXh0KQoJewogICAgICAgICAgICBEV09SRCBzdHlsZSA9IEdldFdpbmRvd0xvbmdXKCBwbXQtPmhPd25lclduZCwgR1dMX1NUWUxFICk7CgkgICAgaE5ld1duZCA9IHBtdC0+aE93bmVyV25kOwoJICAgIGlmKCBJU19TWVNURU1fTUVOVShtZW51KSApCgkgICAgewoJCS8qIHN3aXRjaCB0byB0aGUgbWVudSBiYXIgKi8KCiAgICAgICAgICAgICAgICBpZihzdHlsZSAmIFdTX0NISUxEIHx8ICEoaE5ld01lbnUgPSBHZXRNZW51KGhOZXdXbmQpKSkgcmV0dXJuIEZBTFNFOwoKCSAgICAgICAgaWYoIHZrID09IFZLX0xFRlQgKQoJICAgICAgICB7CgkJICAgIG1lbnUgPSBNRU5VX0dldE1lbnUoIGhOZXdNZW51ICk7CgkJICAgIGlkID0gbWVudS0+bkl0ZW1zIC0gMTsKCSAgICAgICAgfQoJICAgIH0KCSAgICBlbHNlIGlmIChzdHlsZSAmIFdTX1NZU01FTlUgKQoJICAgIHsKCQkvKiBzd2l0Y2ggdG8gdGhlIHN5c3RlbSBtZW51ICovCgkgICAgICAgIGhOZXdNZW51ID0gZ2V0X3dpbl9zeXNfbWVudSggaE5ld1duZCApOwoJICAgIH0KICAgICAgICAgICAgZWxzZSByZXR1cm4gRkFMU0U7Cgl9CgllbHNlICAgIC8qIGFwcGxpY2F0aW9uIHJldHVybmVkIGEgbmV3IG1lbnUgdG8gc3dpdGNoIHRvICovCgl7CiAgICAgICAgICAgIGhOZXdNZW51ID0gbmV4dF9tZW51LmhtZW51TmV4dDsKICAgICAgICAgICAgaE5ld1duZCA9IFdJTl9HZXRGdWxsSGFuZGxlKCBuZXh0X21lbnUuaHduZE5leHQgKTsKCgkgICAgaWYoIElzTWVudShoTmV3TWVudSkgJiYgSXNXaW5kb3coaE5ld1duZCkgKQoJICAgIHsKICAgICAgICAgICAgICAgIERXT1JEIHN0eWxlID0gR2V0V2luZG93TG9uZ1coIGhOZXdXbmQsIEdXTF9TVFlMRSApOwoKCQlpZiAoc3R5bGUgJiBXU19TWVNNRU5VICYmCgkJICAgIEdldFN1Yk1lbnUoZ2V0X3dpbl9zeXNfbWVudShoTmV3V25kKSwgMCkgPT0gaE5ld01lbnUgKQoJCXsKCSAgICAgICAgICAgIC8qIGdldCB0aGUgcmVhbCBzeXN0ZW0gbWVudSAqLwoJCSAgICBoTmV3TWVudSA9ICBnZXRfd2luX3N5c19tZW51KGhOZXdXbmQpOwoJCX0KCSAgICAgICAgZWxzZSBpZiAoc3R5bGUgJiBXU19DSElMRCB8fCBHZXRNZW51KGhOZXdXbmQpICE9IGhOZXdNZW51ICkKCQl7CgkJICAgIC8qIEZJWE1FOiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmU7CgkJICAgICAqIHBlcmhhcHMgdHJ5IHRvIHRyYWNrIGhOZXdNZW51IGFzIGEgcG9wdXA/ICovCgoJCSAgICBUUkFDRSgiIC0tIGdvdCBjb25mdXNlZC5cbiIpOwoJCSAgICByZXR1cm4gRkFMU0U7CgkJfQoJICAgIH0KCSAgICBlbHNlIHJldHVybiBGQUxTRTsKCX0KCglpZiggaE5ld01lbnUgIT0gcG10LT5oVG9wTWVudSApCgl7CgkgICAgTUVOVV9TZWxlY3RJdGVtKCBwbXQtPmhPd25lclduZCwgcG10LT5oVG9wTWVudSwgTk9fU0VMRUNURURfSVRFTSwKICAgICAgICAgICAgICAgICAgICBGQUxTRSwgMCApOwoJICAgIGlmKCBwbXQtPmhDdXJyZW50TWVudSAhPSBwbXQtPmhUb3BNZW51ICkKCQlNRU5VX0hpZGVTdWJQb3B1cHMoIHBtdC0+aE93bmVyV25kLCBwbXQtPmhUb3BNZW51LCBGQUxTRSApOwoJfQoKCWlmKCBoTmV3V25kICE9IHBtdC0+aE93bmVyV25kICkKCXsKCSAgICBwbXQtPmhPd25lclduZCA9IGhOZXdXbmQ7CgkgICAgTUVOVV9TZXRDYXB0dXJlKCBwbXQtPmhPd25lclduZCApOwoJfQoKCXBtdC0+aFRvcE1lbnUgPSBwbXQtPmhDdXJyZW50TWVudSA9IGhOZXdNZW51OyAvKiBhbGwgc3VicG9wdXBzIGFyZSBoaWRkZW4gKi8KCU1FTlVfU2VsZWN0SXRlbSggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIGlkLCBUUlVFLCAwICk7CgoJcmV0dXJuIFRSVUU7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9TdXNwZW5kUG9wdXAKICoKICogVGhlIGlkZWEgaXMgbm90IHRvIHNob3cgdGhlIHBvcHVwIGlmIHRoZSBuZXh0IGlucHV0IG1lc3NhZ2UgaXMKICogZ29pbmcgdG8gaGlkZSBpdCBhbnl3YXkuCiAqLwpzdGF0aWMgQk9PTCBNRU5VX1N1c3BlbmRQb3B1cCggTVRSQUNLRVIqIHBtdCwgVUlOVDE2IHVNc2cgKQp7CiAgICBNU0cgbXNnOwoKICAgIG1zZy5od25kID0gcG10LT5oT3duZXJXbmQ7CgogICAgUGVla01lc3NhZ2VXKCAmbXNnLCAwLCAwLCAwLCBQTV9OT1lJRUxEIHwgUE1fUkVNT1ZFKTsKICAgIHBtdC0+dHJhY2tGbGFncyB8PSBURl9TS0lQUkVNT1ZFOwoKICAgIHN3aXRjaCggdU1zZyApCiAgICB7CgljYXNlIFdNX0tFWURPV046CgkgICAgIFBlZWtNZXNzYWdlVyggJm1zZywgMCwgMCwgMCwgUE1fTk9ZSUVMRCB8IFBNX05PUkVNT1ZFKTsKCSAgICAgaWYoIG1zZy5tZXNzYWdlID09IFdNX0tFWVVQIHx8IG1zZy5tZXNzYWdlID09IFdNX1BBSU5UICkKCSAgICAgewoJCSBQZWVrTWVzc2FnZVcoICZtc2csIDAsIDAsIDAsIFBNX05PWUlFTEQgfCBQTV9SRU1PVkUpOwoJICAgICAgICAgUGVla01lc3NhZ2VXKCAmbXNnLCAwLCAwLCAwLCBQTV9OT1lJRUxEIHwgUE1fTk9SRU1PVkUpOwoJICAgICAgICAgaWYoIG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04gJiYKCQkgICAgKG1zZy53UGFyYW0gPT0gVktfTEVGVCB8fCBtc2cud1BhcmFtID09IFZLX1JJR0hUKSkKCSAgICAgICAgIHsKCQkgICAgIHBtdC0+dHJhY2tGbGFncyB8PSBURl9TVVNQRU5EUE9QVVA7CgkJICAgICByZXR1cm4gVFJVRTsKCSAgICAgICAgIH0KCSAgICAgfQoJICAgICBicmVhazsKICAgIH0KCiAgICAvKiBmYWlsdXJlcyBnbyB0aHJvdWdoIHRoaXMgKi8KICAgIHBtdC0+dHJhY2tGbGFncyAmPSB+VEZfU1VTUEVORFBPUFVQOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfS2V5RXNjYXBlCiAqCiAqIEhhbmRsZSBhIFZLX0VTQ0FQRSBrZXkgZXZlbnQgaW4gYSBtZW51LgogKi8Kc3RhdGljIEJPT0wgTUVOVV9LZXlFc2NhcGUoTVRSQUNLRVIqIHBtdCwgVUlOVCB3RmxhZ3MpCnsKICAgIEJPT0wgYkVuZE1lbnUgPSBUUlVFOwoKICAgIGlmIChwbXQtPmhDdXJyZW50TWVudSAhPSBwbXQtPmhUb3BNZW51KQogICAgewogICAgICAgIFBPUFVQTUVOVSAqbWVudSA9IE1FTlVfR2V0TWVudShwbXQtPmhDdXJyZW50TWVudSk7CgogICAgICAgIGlmIChtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkKICAgICAgICB7CiAgICAgICAgICAgIEhNRU5VIGhtZW51dG1wLCBobWVudXByZXY7CgogICAgICAgICAgICBobWVudXByZXYgPSBobWVudXRtcCA9IHBtdC0+aFRvcE1lbnU7CgogICAgICAgICAgICAvKiBjbG9zZSB0b3Btb3N0IHBvcHVwICovCiAgICAgICAgICAgIHdoaWxlIChobWVudXRtcCAhPSBwbXQtPmhDdXJyZW50TWVudSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaG1lbnVwcmV2ID0gaG1lbnV0bXA7CiAgICAgICAgICAgICAgICBobWVudXRtcCA9IE1FTlVfR2V0U3ViUG9wdXAoIGhtZW51cHJldiApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIHBtdC0+aE93bmVyV25kLCBobWVudXByZXYsIFRSVUUgKTsKICAgICAgICAgICAgcG10LT5oQ3VycmVudE1lbnUgPSBobWVudXByZXY7CiAgICAgICAgICAgIGJFbmRNZW51ID0gRkFMU0U7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBiRW5kTWVudTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0tleUxlZnQKICoKICogSGFuZGxlIGEgVktfTEVGVCBrZXkgZXZlbnQgaW4gYSBtZW51LgogKi8Kc3RhdGljIHZvaWQgTUVOVV9LZXlMZWZ0KCBNVFJBQ0tFUiogcG10LCBVSU5UIHdGbGFncyApCnsKICAgIFBPUFVQTUVOVSAqbWVudTsKICAgIEhNRU5VIGhtZW51dG1wLCBobWVudXByZXY7CiAgICBVSU5UICBwcmV2Y29sOwoKICAgIGhtZW51cHJldiA9IGhtZW51dG1wID0gcG10LT5oVG9wTWVudTsKICAgIG1lbnUgPSBNRU5VX0dldE1lbnUoIGhtZW51dG1wICk7CgogICAgLyogVHJ5IHRvIG1vdmUgMSBjb2x1bW4gbGVmdCAoaWYgcG9zc2libGUpICovCiAgICBpZiggKHByZXZjb2wgPSBNRU5VX0dldFN0YXJ0T2ZQcmV2Q29sdW1uKCBwbXQtPmhDdXJyZW50TWVudSApKSAhPQoJTk9fU0VMRUNURURfSVRFTSApIHsKCglNRU5VX1NlbGVjdEl0ZW0oIHBtdC0+aE93bmVyV25kLCBwbXQtPmhDdXJyZW50TWVudSwKCQkJIHByZXZjb2wsIFRSVUUsIDAgKTsKCXJldHVybjsKICAgIH0KCiAgICAvKiBjbG9zZSB0b3Btb3N0IHBvcHVwICovCiAgICB3aGlsZSAoaG1lbnV0bXAgIT0gcG10LT5oQ3VycmVudE1lbnUpCiAgICB7CglobWVudXByZXYgPSBobWVudXRtcDsKCWhtZW51dG1wID0gTUVOVV9HZXRTdWJQb3B1cCggaG1lbnVwcmV2ICk7CiAgICB9CgogICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBwbXQtPmhPd25lclduZCwgaG1lbnVwcmV2LCBUUlVFICk7CiAgICBwbXQtPmhDdXJyZW50TWVudSA9IGhtZW51cHJldjsKCiAgICBpZiAoIChobWVudXByZXYgPT0gcG10LT5oVG9wTWVudSkgJiYgIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgKQogICAgewoJLyogbW92ZSBtZW51IGJhciBzZWxlY3Rpb24gaWYgbm8gbW9yZSBwb3B1cHMgYXJlIGxlZnQgKi8KCglpZiggIU1FTlVfRG9OZXh0TWVudSggcG10LCBWS19MRUZUKSApCgkgICAgIE1FTlVfTW92ZVNlbGVjdGlvbiggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIElURU1fUFJFViApOwoKCWlmICggaG1lbnVwcmV2ICE9IGhtZW51dG1wIHx8IHBtdC0+dHJhY2tGbGFncyAmIFRGX1NVU1BFTkRQT1BVUCApCgl7CgkgICAvKiBBIHN1YmxldmVsIG1lbnUgd2FzIGRpc3BsYXllZCAtIGRpc3BsYXkgdGhlIG5leHQgb25lCgkgICAgKiB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciBkaXNwbGFjZW1lbnQgY29taW5nIHVwICovCgoJICAgIGlmKCAhTUVOVV9TdXNwZW5kUG9wdXAoIHBtdCwgV01fS0VZRE9XTiApICkKCQlwbXQtPmhDdXJyZW50TWVudSA9IE1FTlVfU2hvd1N1YlBvcHVwKHBtdC0+aE93bmVyV25kLAoJCQkJCQlwbXQtPmhUb3BNZW51LCBUUlVFLCB3RmxhZ3MpOwoJfQogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBNRU5VX0tleVJpZ2h0CiAqCiAqIEhhbmRsZSBhIFZLX1JJR0hUIGtleSBldmVudCBpbiBhIG1lbnUuCiAqLwpzdGF0aWMgdm9pZCBNRU5VX0tleVJpZ2h0KCBNVFJBQ0tFUiogcG10LCBVSU5UIHdGbGFncyApCnsKICAgIEhNRU5VIGhtZW51dG1wOwogICAgUE9QVVBNRU5VICptZW51ID0gTUVOVV9HZXRNZW51KCBwbXQtPmhUb3BNZW51ICk7CiAgICBVSU5UICBuZXh0Y29sOwoKICAgIFRSQUNFKCJNRU5VX0tleVJpZ2h0IGNhbGxlZCwgY3VyICVwICglcyksIHRvcCAlcCAoJXMpLlxuIiwKICAgICAgICAgIHBtdC0+aEN1cnJlbnRNZW51LAogICAgICAgICAgZGVidWdzdHJfdygoTUVOVV9HZXRNZW51KHBtdC0+aEN1cnJlbnRNZW51KSktPml0ZW1zWzBdLnRleHQpLAogICAgICAgICAgcG10LT5oVG9wTWVudSwgZGVidWdzdHJfdyhtZW51LT5pdGVtc1swXS50ZXh0KSApOwoKICAgIGlmICggKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSB8fCAocG10LT5oQ3VycmVudE1lbnUgIT0gcG10LT5oVG9wTWVudSkpCiAgICB7CgkvKiBJZiBhbHJlYWR5IGRpc3BsYXlpbmcgYSBwb3B1cCwgdHJ5IHRvIGRpc3BsYXkgc3ViLXBvcHVwICovCgoJaG1lbnV0bXAgPSBwbXQtPmhDdXJyZW50TWVudTsKCXBtdC0+aEN1cnJlbnRNZW51ID0gTUVOVV9TaG93U3ViUG9wdXAocG10LT5oT3duZXJXbmQsIGhtZW51dG1wLCBUUlVFLCB3RmxhZ3MpOwoKCS8qIGlmIHN1YnBvcHVwIHdhcyBkaXNwbGF5ZWQgdGhlbiB3ZSBhcmUgZG9uZSAqLwoJaWYgKGhtZW51dG1wICE9IHBtdC0+aEN1cnJlbnRNZW51KSByZXR1cm47CiAgICB9CgogICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW5vdGhlciBjb2x1bW4gKi8KICAgIGlmKCAobmV4dGNvbCA9IE1FTlVfR2V0U3RhcnRPZk5leHRDb2x1bW4oIHBtdC0+aEN1cnJlbnRNZW51ICkpICE9CglOT19TRUxFQ1RFRF9JVEVNICkgewoJVFJBQ0UoIkdvaW5nIHRvICVkLlxuIiwgbmV4dGNvbCApOwoJTUVOVV9TZWxlY3RJdGVtKCBwbXQtPmhPd25lclduZCwgcG10LT5oQ3VycmVudE1lbnUsCgkJCSBuZXh0Y29sLCBUUlVFLCAwICk7CglyZXR1cm47CiAgICB9CgogICAgaWYgKCEobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApKQkvKiBtZW51IGJhciB0cmFja2luZyAqLwogICAgewoJaWYoIHBtdC0+aEN1cnJlbnRNZW51ICE9IHBtdC0+aFRvcE1lbnUgKQoJewoJICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIEZBTFNFICk7CgkgICAgaG1lbnV0bXAgPSBwbXQtPmhDdXJyZW50TWVudSA9IHBtdC0+aFRvcE1lbnU7Cgl9IGVsc2UgaG1lbnV0bXAgPSAwOwoKCS8qIHRyeSB0byBtb3ZlIHRvIHRoZSBuZXh0IGl0ZW0gKi8KCWlmKCAhTUVOVV9Eb05leHRNZW51KCBwbXQsIFZLX1JJR0hUKSApCgkgICAgIE1FTlVfTW92ZVNlbGVjdGlvbiggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIElURU1fTkVYVCApOwoKCWlmKCBobWVudXRtcCB8fCBwbXQtPnRyYWNrRmxhZ3MgJiBURl9TVVNQRU5EUE9QVVAgKQoJICAgIGlmKCAhTUVOVV9TdXNwZW5kUG9wdXAocG10LCBXTV9LRVlET1dOKSApCgkJcG10LT5oQ3VycmVudE1lbnUgPSBNRU5VX1Nob3dTdWJQb3B1cChwbXQtPmhPd25lclduZCwKCQkJCQkJICAgICAgIHBtdC0+aFRvcE1lbnUsIFRSVUUsIHdGbGFncyk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTUVOVV9UcmFja01lbnUKICoKICogTWVudSB0cmFja2luZyBjb2RlLgogKi8Kc3RhdGljIEJPT0wgTUVOVV9UcmFja01lbnUoIEhNRU5VIGhtZW51LCBVSU5UIHdGbGFncywgSU5UIHgsIElOVCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORCBod25kLCBjb25zdCBSRUNUICpscHJlY3QgKQp7CiAgICBNU0cgbXNnOwogICAgUE9QVVBNRU5VICptZW51OwogICAgQk9PTCBmUmVtb3ZlOwogICAgSU5UIGV4ZWN1dGVkTWVudUlkID0gLTE7CiAgICBNVFJBQ0tFUiBtdDsKICAgIEJPT0wgZW50ZXJJZGxlU2VudCA9IEZBTFNFOwoKICAgIG10LnRyYWNrRmxhZ3MgPSAwOwogICAgbXQuaEN1cnJlbnRNZW51ID0gaG1lbnU7CiAgICBtdC5oVG9wTWVudSA9IGhtZW51OwogICAgbXQuaE93bmVyV25kID0gV0lOX0dldEZ1bGxIYW5kbGUoIGh3bmQgKTsKICAgIG10LnB0LnggPSB4OwogICAgbXQucHQueSA9IHk7CgogICAgVFJBQ0UoImhtZW51PSVwIGZsYWdzPTB4JTA4eCAoJWQsJWQpIGh3bmQ9JXAgKCVsZCwlbGQpLSglbGQsJWxkKVxuIiwKICAgICAgICAgIGhtZW51LCB3RmxhZ3MsIHgsIHksIGh3bmQsIChscHJlY3QpID8gbHByZWN0LT5sZWZ0IDogMCwgKGxwcmVjdCkgPyBscHJlY3QtPnRvcCA6IDAsCiAgICAgICAgICAobHByZWN0KSA/IGxwcmVjdC0+cmlnaHQgOiAwLCAgKGxwcmVjdCkgPyBscHJlY3QtPmJvdHRvbSA6IDApOwoKICAgIGZFbmRNZW51ID0gRkFMU0U7CiAgICBpZiAoIShtZW51ID0gTUVOVV9HZXRNZW51KCBobWVudSApKSkKICAgIHsKICAgICAgICBXQVJOKCJJbnZhbGlkIG1lbnUgaGFuZGxlICVwXG4iLCBobWVudSk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfTUVOVV9IQU5ETEUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAod0ZsYWdzICYgVFBNX0JVVFRPTkRPV04pCiAgICB7CgkvKiBHZXQgdGhlIHJlc3VsdCBpbiBvcmRlciB0byBzdGFydCB0aGUgdHJhY2tpbmcgb3Igbm90ICovCglmUmVtb3ZlID0gTUVOVV9CdXR0b25Eb3duKCAmbXQsIGhtZW51LCB3RmxhZ3MgKTsKCWZFbmRNZW51ID0gIWZSZW1vdmU7CiAgICB9CgogICAgaWYgKHdGbGFncyAmIFRGX0VORE1FTlUpIGZFbmRNZW51ID0gVFJVRTsKCiAgICBNRU5VX1NldENhcHR1cmUoIG10LmhPd25lclduZCApOwoKICAgIHdoaWxlICghZkVuZE1lbnUpCiAgICB7CgltZW51ID0gTUVOVV9HZXRNZW51KCBtdC5oQ3VycmVudE1lbnUgKTsKCWlmICghbWVudSkgLyogc29tZXRpbWVzIGhhcHBlbnMgaWYgSSBkbyBhIHdpbmRvdyBtYW5hZ2VyIGNsb3NlICovCgkgICAgYnJlYWs7CgoJLyogd2UgaGF2ZSB0byBrZWVwIHRoZSBtZXNzYWdlIGluIHRoZSBxdWV1ZSB1bnRpbCBpdCdzCgkgKiBjbGVhciB0aGF0IG1lbnUgbG9vcCBpcyBub3Qgb3ZlciB5ZXQuICovCgogICAgICAgIGZvciAoOzspCiAgICAgICAgewogICAgICAgICAgICBpZiAoUGVla01lc3NhZ2VXKCAmbXNnLCAwLCAwLCAwLCBQTV9OT1JFTU9WRSApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUNhbGxNc2dGaWx0ZXJXKCAmbXNnLCBNU0dGX01FTlUgKSkgYnJlYWs7CiAgICAgICAgICAgICAgICAvKiByZW1vdmUgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUgKi8KICAgICAgICAgICAgICAgIFBlZWtNZXNzYWdlVyggJm1zZywgMCwgbXNnLm1lc3NhZ2UsIG1zZy5tZXNzYWdlLCBQTV9SRU1PVkUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghZW50ZXJJZGxlU2VudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIV05EIHdpbiA9ICh3RmxhZ3MgJiBUUE1fRU5URVJJRExFRVggJiYgbWVudS0+d0ZsYWdzICYgTUZfUE9QVVApID8gbWVudS0+aFduZCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZW50ZXJJZGxlU2VudCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2VXKCBtdC5oT3duZXJXbmQsIFdNX0VOVEVSSURMRSwgTVNHRl9NRU5VLCAoTFBBUkFNKXdpbiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgV2FpdE1lc3NhZ2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgkvKiBjaGVjayBpZiBFbmRNZW51KCkgdHJpZWQgdG8gY2FuY2VsIHVzLCBieSBwb3N0aW5nIHRoaXMgbWVzc2FnZSAqLwogICAgICAgIGlmKG1zZy5tZXNzYWdlID09IFdNX0NBTkNFTE1PREUpCgl7CgkgICAgLyogd2UgYXJlIG5vdyBvdXQgb2YgdGhlIGxvb3AgKi8KICAgIAkgICAgZkVuZE1lbnUgPSBUUlVFOwoKCSAgICAvKiByZW1vdmUgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUgKi8KCSAgICBQZWVrTWVzc2FnZVcoICZtc2csIDAsIG1zZy5tZXNzYWdlLCBtc2cubWVzc2FnZSwgUE1fUkVNT1ZFICk7CgoJICAgIC8qIGJyZWFrIG91dCBvZiBpbnRlcm5hbCBsb29wLCBhbGEgRVNDQVBFICovCgkgICAgYnJlYWs7Cgl9CgogICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoICZtc2cgKTsKICAgICAgICBtdC5wdCA9IG1zZy5wdDsKCglpZiAoIChtc2cuaHduZD09bWVudS0+aFduZCkgfHwgKG1zZy5tZXNzYWdlIT1XTV9USU1FUikgKQoJICBlbnRlcklkbGVTZW50PUZBTFNFOwoKICAgICAgICBmUmVtb3ZlID0gRkFMU0U7CglpZiAoKG1zZy5tZXNzYWdlID49IFdNX01PVVNFRklSU1QpICYmIChtc2cubWVzc2FnZSA8PSBXTV9NT1VTRUxBU1QpKQoJewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBVc2UgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGluIGxQYXJhbSBpbnN0ZWFkIG9mIHRob3NlIGluIHRoZSBNU0cKICAgICAgICAgICAgICogc3RydWN0IHRvIHByb3Blcmx5IGhhbmRsZSBzeW50aGV0aWMgbWVzc2FnZXMuIFRoZXkgYXJlIGFscmVhZHkKICAgICAgICAgICAgICogaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbXQucHQueCA9IChzaG9ydClMT1dPUkQobXNnLmxQYXJhbSk7CiAgICAgICAgICAgIG10LnB0LnkgPSAoc2hvcnQpSElXT1JEKG1zZy5sUGFyYW0pOwoKCSAgICAvKiBGaW5kIGEgbWVudSBmb3IgdGhpcyBtb3VzZSBldmVudCAqLwoJICAgIGhtZW51ID0gTUVOVV9QdE1lbnUoIG10LmhUb3BNZW51LCBtdC5wdCApOwoKCSAgICBzd2l0Y2gobXNnLm1lc3NhZ2UpCgkgICAgewoJCS8qIG5vIFdNX05DLi4uIG1lc3NhZ2VzIGluIGNhcHR1cmVkIHN0YXRlICovCgoJCWNhc2UgV01fUkJVVFRPTkRCTENMSzoKCQljYXNlIFdNX1JCVVRUT05ET1dOOgoJCSAgICBpZiAoISh3RmxhZ3MgJiBUUE1fUklHSFRCVVRUT04pKSBicmVhazsKCQkgICAgLyogZmFsbCB0aHJvdWdoICovCgkJY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgoJCWNhc2UgV01fTEJVVFRPTkRPV046CgkJICAgIC8qIElmIHRoZSBtZXNzYWdlIGJlbG9uZ3MgdG8gdGhlIG1lbnUsIHJlbW92ZXMgaXQgZnJvbSB0aGUgcXVldWUgKi8KCQkgICAgLyogRWxzZSwgZW5kIG1lbnUgdHJhY2tpbmcgKi8KCQkgICAgZlJlbW92ZSA9IE1FTlVfQnV0dG9uRG93biggJm10LCBobWVudSwgd0ZsYWdzICk7CgkJICAgIGZFbmRNZW51ID0gIWZSZW1vdmU7CgkJICAgIGJyZWFrOwoKCQljYXNlIFdNX1JCVVRUT05VUDoKCQkgICAgaWYgKCEod0ZsYWdzICYgVFBNX1JJR0hUQlVUVE9OKSkgYnJlYWs7CgkJICAgIC8qIGZhbGwgdGhyb3VnaCAqLwoJCWNhc2UgV01fTEJVVFRPTlVQOgoJCSAgICAvKiBDaGVjayBpZiBhIG1lbnUgd2FzIHNlbGVjdGVkIGJ5IHRoZSBtb3VzZSAqLwoJCSAgICBpZiAoaG1lbnUpCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRNZW51SWQgPSBNRU5VX0J1dHRvblVwKCAmbXQsIGhtZW51LCB3RmxhZ3MpOwoKCQkJLyogRW5kIHRoZSBsb29wIGlmIGV4ZWN1dGVkTWVudUlkIGlzIGFuIGl0ZW0gSUQgKi8KCQkJLyogb3IgaWYgdGhlIGpvYiB3YXMgZG9uZSAoZXhlY3V0ZWRNZW51SWQgPSAwKS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgZkVuZE1lbnUgPSBmUmVtb3ZlID0gKGV4ZWN1dGVkTWVudUlkICE9IC0xKTsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIC8qIE5vIG1lbnUgd2FzIHNlbGVjdGVkIGJ5IHRoZSBtb3VzZSAqLwogICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkIGJ5IFRyYWNrUG9wdXBNZW51LCBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIG1lbnUgdHJhY2tpbmcuIElmIG5vdCwgc3RvcCBpdCAqLwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZkVuZE1lbnUgPSAoKHdGbGFncyAmIFRQTV9QT1BVUE1FTlUpID8gRkFMU0UgOiBUUlVFKTsKCgkJICAgIGJyZWFrOwoKCQljYXNlIFdNX01PVVNFTU9WRToKICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc2VsZWN0ZWQgbWVudSBpdGVtIG11c3QgYmUgY2hhbmdlZCBldmVyeSB0aW1lICovCgkJICAgICAvKiB0aGUgbW91c2UgbW92ZXMuICovCgogICAgICAgICAgICAgICAgICAgIGlmIChobWVudSkKCQkJZkVuZE1lbnUgfD0gIU1FTlVfTW91c2VNb3ZlKCAmbXQsIGhtZW51LCB3RmxhZ3MgKTsKCgkgICAgfSAvKiBzd2l0Y2gobXNnLm1lc3NhZ2UpIC0gbW91c2UgKi8KCX0KCWVsc2UgaWYgKChtc2cubWVzc2FnZSA+PSBXTV9LRVlGSVJTVCkgJiYgKG1zZy5tZXNzYWdlIDw9IFdNX0tFWUxBU1QpKQoJewogICAgICAgICAgICBmUmVtb3ZlID0gVFJVRTsgIC8qIEtleWJvYXJkIG1lc3NhZ2VzIGFyZSBhbHdheXMgcmVtb3ZlZCAqLwoJICAgIHN3aXRjaChtc2cubWVzc2FnZSkKCSAgICB7CgkgICAgY2FzZSBXTV9LRVlET1dOOgoJICAgIGNhc2UgV01fU1lTS0VZRE9XTjoKCQlzd2l0Y2gobXNnLndQYXJhbSkKCQl7CgkJY2FzZSBWS19NRU5VOgoJCSAgICBmRW5kTWVudSA9IFRSVUU7CgkJICAgIGJyZWFrOwoKCQljYXNlIFZLX0hPTUU6CgkJY2FzZSBWS19FTkQ6CgkJICAgIE1FTlVfU2VsZWN0SXRlbSggbXQuaE93bmVyV25kLCBtdC5oQ3VycmVudE1lbnUsCgkJCQkgICAgIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFLCAwICk7CgkJLyogZmFsbCB0aHJvdWdoICovCgkJY2FzZSBWS19VUDoKCQkgICAgTUVOVV9Nb3ZlU2VsZWN0aW9uKCBtdC5oT3duZXJXbmQsIG10LmhDdXJyZW50TWVudSwKCQkJCSAgICAgICAobXNnLndQYXJhbSA9PSBWS19IT01FKT8gSVRFTV9ORVhUIDogSVRFTV9QUkVWICk7CgkJICAgIGJyZWFrOwoKCQljYXNlIFZLX0RPV046IC8qIElmIG9uIG1lbnUgYmFyLCBwdWxsLWRvd24gdGhlIG1lbnUgKi8KCgkJICAgIG1lbnUgPSBNRU5VX0dldE1lbnUoIG10LmhDdXJyZW50TWVudSApOwoJCSAgICBpZiAoIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkpCgkJCW10LmhDdXJyZW50TWVudSA9IE1FTlVfU2hvd1N1YlBvcHVwKG10LmhPd25lclduZCwgbXQuaFRvcE1lbnUsIFRSVUUsIHdGbGFncyk7CgkJICAgIGVsc2UgICAgICAvKiBvdGhlcndpc2UgdHJ5IHRvIG1vdmUgc2VsZWN0aW9uICovCgkJCU1FTlVfTW92ZVNlbGVjdGlvbiggbXQuaE93bmVyV25kLCBtdC5oQ3VycmVudE1lbnUsIElURU1fTkVYVCApOwoJCSAgICBicmVhazsKCgkJY2FzZSBWS19MRUZUOgoJCSAgICBNRU5VX0tleUxlZnQoICZtdCwgd0ZsYWdzICk7CgkJICAgIGJyZWFrOwoKCQljYXNlIFZLX1JJR0hUOgoJCSAgICBNRU5VX0tleVJpZ2h0KCAmbXQsIHdGbGFncyApOwoJCSAgICBicmVhazsKCgkJY2FzZSBWS19FU0NBUEU6CiAgICAgICAgICAgICAgICAgICAgZkVuZE1lbnUgPSBNRU5VX0tleUVzY2FwZSgmbXQsIHdGbGFncyk7CgkJICAgIGJyZWFrOwoKCQljYXNlIFZLX0YxOgoJCSAgICB7CgkJCUhFTFBJTkZPIGhpOwoJCQloaS5jYlNpemUgPSBzaXplb2YoSEVMUElORk8pOwoJCQloaS5pQ29udGV4dFR5cGUgPSBIRUxQSU5GT19NRU5VSVRFTTsKCQkJaWYgKG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0pCgkJCSAgICBoaS5pQ3RybElkID0gMDsKCQkgICAgICAgIGVsc2UKCQkJICAgIGhpLmlDdHJsSWQgPSBtZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV0ud0lEOwoJCQloaS5oSXRlbUhhbmRsZSA9IGhtZW51OwoJCQloaS5kd0NvbnRleHRJZCA9IG1lbnUtPmR3Q29udGV4dEhlbHBJRDsKCQkJaGkuTW91c2VQb3MgPSBtc2cucHQ7CgkJCVNlbmRNZXNzYWdlVyhod25kLCBXTV9IRUxQLCAwLCAoTFBBUkFNKSZoaSk7CgkJCWJyZWFrOwoJCSAgICB9CgoJCWRlZmF1bHQ6CgkJICAgIGJyZWFrOwoJCX0KCQlicmVhazsgIC8qIFdNX0tFWURPV04gKi8KCgkgICAgY2FzZSBXTV9DSEFSOgoJICAgIGNhc2UgV01fU1lTQ0hBUjoKCQl7CgkJICAgIFVJTlQJcG9zOwoKCQkgICAgaWYgKG1zZy53UGFyYW0gPT0gJ1xyJyB8fCBtc2cud1BhcmFtID09ICcgJykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZE1lbnVJZCA9IE1FTlVfRXhlY0ZvY3VzZWRJdGVtKCZtdCxtdC5oQ3VycmVudE1lbnUsIHdGbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZFbmRNZW51ID0gKGV4ZWN1dGVkTWVudUlkICE9IC0xKTsKCgkJCWJyZWFrOwoJCSAgICB9CgoJCSAgICAgIC8qIEhhY2sgdG8gYXZvaWQgY29udHJvbCBjaGFycy4gKi8KCQkgICAgICAvKiBXZSB3aWxsIGZpbmQgYSBiZXR0ZXIgd2F5IHJlYWwgc29vbi4uLiAqLwoJCSAgICBpZiAobXNnLndQYXJhbSA8IDMyKSBicmVhazsKCgkJICAgIHBvcyA9IE1FTlVfRmluZEl0ZW1CeUtleSggbXQuaE93bmVyV25kLCBtdC5oQ3VycmVudE1lbnUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1dPUkQobXNnLndQYXJhbSksIEZBTFNFICk7CgkJICAgIGlmIChwb3MgPT0gKFVJTlQpLTIpIGZFbmRNZW51ID0gVFJVRTsKCQkgICAgZWxzZSBpZiAocG9zID09IChVSU5UKS0xKSBNZXNzYWdlQmVlcCgwKTsKCQkgICAgZWxzZQoJCSAgICB7CgkJCU1FTlVfU2VsZWN0SXRlbSggbXQuaE93bmVyV25kLCBtdC5oQ3VycmVudE1lbnUsIHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCAwICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkTWVudUlkID0gTUVOVV9FeGVjRm9jdXNlZEl0ZW0oJm10LG10LmhDdXJyZW50TWVudSwgd0ZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZkVuZE1lbnUgPSAoZXhlY3V0ZWRNZW51SWQgIT0gLTEpOwoJCSAgICB9CgkJfQoJCWJyZWFrOwoJICAgIH0gIC8qIHN3aXRjaChtc2cubWVzc2FnZSkgLSBrYmQgKi8KCX0KCWVsc2UKCXsKCSAgICBQZWVrTWVzc2FnZVcoICZtc2csIDAsIG1zZy5tZXNzYWdlLCBtc2cubWVzc2FnZSwgUE1fUkVNT1ZFICk7CgkgICAgRGlzcGF0Y2hNZXNzYWdlVyggJm1zZyApOwoJICAgIGNvbnRpbnVlOwoJfQoKCWlmICghZkVuZE1lbnUpIGZSZW1vdmUgPSBUUlVFOwoKCS8qIGZpbmFsbHkgcmVtb3ZlIG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUgKi8KCiAgICAgICAgaWYgKGZSZW1vdmUgJiYgIShtdC50cmFja0ZsYWdzICYgVEZfU0tJUFJFTU9WRSkgKQoJICAgIFBlZWtNZXNzYWdlVyggJm1zZywgMCwgbXNnLm1lc3NhZ2UsIG1zZy5tZXNzYWdlLCBQTV9SRU1PVkUgKTsKCWVsc2UgbXQudHJhY2tGbGFncyAmPSB+VEZfU0tJUFJFTU9WRTsKICAgIH0KCiAgICBNRU5VX1NldENhcHR1cmUoMCk7ICAvKiByZWxlYXNlIHRoZSBjYXB0dXJlICovCgogICAgLyogSWYgZHJvcGRvd24gaXMgc3RpbGwgcGFpbnRlZCBhbmQgdGhlIGNsb3NlIGJveCBpcyBjbGlja2VkIG9uCiAgICAgICB0aGVuIHRoZSBtZW51IHdpbGwgYmUgZGVzdHJveWVkIGFzIHBhcnQgb2YgdGhlIERpc3BhdGNoTWVzc2FnZSBhYm92ZS4KICAgICAgIFRoaXMgd2lsbCB0aGVuIGludmFsaWRhdGUgdGhlIG1lbnUgaGFuZGxlIGluIG10LmhUb3BNZW51LiBXZSBzaG91bGQKICAgICAgIGNoZWNrIGZvciB0aGlzIGZpcnN0LiAgKi8KICAgIGlmKCBJc01lbnUoIG10LmhUb3BNZW51ICkgKQogICAgewoJbWVudSA9IE1FTlVfR2V0TWVudSggbXQuaFRvcE1lbnUgKTsKCiAgICAgICAgaWYoIElzV2luZG93KCBtdC5oT3duZXJXbmQgKSApCiAgICAgICAgewoJICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggbXQuaE93bmVyV25kLCBtdC5oVG9wTWVudSwgRkFMU0UgKTsKCgkgICAgaWYgKG1lbnUgJiYgKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSkKCSAgICB7CiAgICAgICAgICAgICAgICBEZXN0cm95V2luZG93KCBtZW51LT5oV25kICk7CiAgICAgICAgICAgICAgICBtZW51LT5oV25kID0gMDsKCSAgICB9CgkgICAgTUVOVV9TZWxlY3RJdGVtKCBtdC5oT3duZXJXbmQsIG10LmhUb3BNZW51LCBOT19TRUxFQ1RFRF9JVEVNLCBGQUxTRSwgMCApOwoJICAgIFNlbmRNZXNzYWdlVyggbXQuaE93bmVyV25kLCBXTV9NRU5VU0VMRUNULCBNQUtFTE9ORygwLDB4ZmZmZiksIDAgKTsKICAgICAgICB9CgogICAgICAgIC8qIFJlc2V0IHRoZSB2YXJpYWJsZSBmb3IgaGlkaW5nIG1lbnUgKi8KICAgICAgICBpZiggbWVudSApIG1lbnUtPmJUaW1lVG9IaWRlID0gRkFMU0U7CiAgICB9CgogICAgLyogVGhlIHJldHVybiB2YWx1ZSBpcyBvbmx5IHVzZWQgYnkgVHJhY2tQb3B1cE1lbnUgKi8KICAgIGlmICghKHdGbGFncyAmIFRQTV9SRVRVUk5DTUQpKSByZXR1cm4gVFJVRTsKICAgIGlmIChleGVjdXRlZE1lbnVJZCA9PSAtMSkgZXhlY3V0ZWRNZW51SWQgPSAwOwogICAgcmV0dXJuIGV4ZWN1dGVkTWVudUlkOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfSW5pdFRyYWNraW5nCiAqLwpzdGF0aWMgQk9PTCBNRU5VX0luaXRUcmFja2luZyhIV05EIGhXbmQsIEhNRU5VIGhNZW51LCBCT09MIGJQb3B1cCwgVUlOVCB3RmxhZ3MpCnsKICAgIFBPUFVQTUVOVSAqbWVudTsKICAgIAogICAgVFJBQ0UoImh3bmQ9JXAgaG1lbnU9JXBcbiIsIGhXbmQsIGhNZW51KTsKCiAgICBIaWRlQ2FyZXQoMCk7CgogICAgLyogU2VuZCBXTV9FTlRFUk1FTlVMT09QIGFuZCBXTV9JTklUTUVOVSBtZXNzYWdlIG9ubHkgaWYgVFBNX05PTk9USUZZIGZsYWcgaXMgbm90IHNwZWNpZmllZCAqLwogICAgaWYgKCEod0ZsYWdzICYgVFBNX05PTk9USUZZKSkKICAgICAgIFNlbmRNZXNzYWdlVyggaFduZCwgV01fRU5URVJNRU5VTE9PUCwgYlBvcHVwLCAwICk7CgogICAgU2VuZE1lc3NhZ2VXKCBoV25kLCBXTV9TRVRDVVJTT1IsIChXUEFSQU0paFduZCwgSFRDQVBUSU9OICk7CgogICAgaWYgKCEod0ZsYWdzICYgVFBNX05PTk9USUZZKSkKICAgIHsKICAgICAgIFNlbmRNZXNzYWdlVyggaFduZCwgV01fSU5JVE1FTlUsIChXUEFSQU0paE1lbnUsIDAgKTsKICAgICAgIC8qIElmIGFuIGFwcCBjaGFuZ2VkL3JlY3JlYXRlZCBtZW51IGJhciBlbnRyaWVzIGluIFdNX0lOSVRNRU5VCiAgICAgICAgKiBtZW51IHNpemVzIHdpbGwgYmUgcmVjYWxjdWxhdGVkIG9uY2UgdGhlIG1lbnUgY3JlYXRlZC9zaG93bi4KICAgICAgICAqLwogICAgfQogICAgCiAgICAvKiBUaGlzIG1ha2VzIHRoZSBtZW51cyBvZiBhcHBsaWNhdGlvbnMgYnVpbHQgd2l0aCBEZWxwaGkgd29yay4KICAgICAqIEl0IGFsc28gZW5hYmxlcyBtZW51cyB0byBiZSBkaXNwbGF5ZWQgaW4gbW9yZSB0aGFuIG9uZSB3aW5kb3csCiAgICAgKiBidXQgdGhlcmUgYXJlIHNvbWUgYnVncyBsZWZ0IHRoYXQgbmVlZCB0byBiZSBmaXhlZCBpbiB0aGlzIGNhc2UuCiAgICAgKi8KICAgIGlmICgobWVudSA9IE1FTlVfR2V0TWVudSggaE1lbnUgKSkpIG1lbnUtPmhXbmQgPSBoV25kOwogICAgCiAgICByZXR1cm4gVFJVRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfRXhpdFRyYWNraW5nCiAqLwpzdGF0aWMgQk9PTCBNRU5VX0V4aXRUcmFja2luZyhIV05EIGhXbmQpCnsKICAgIFRSQUNFKCJod25kPSVwXG4iLCBoV25kKTsKCiAgICBTZW5kTWVzc2FnZVcoIGhXbmQsIFdNX0VYSVRNRU5VTE9PUCwgMCwgMCApOwogICAgU2hvd0NhcmV0KDApOwogICAgdG9wX3BvcHVwID0gMDsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfVHJhY2tNb3VzZU1lbnVCYXIKICoKICogTWVudS1iYXIgdHJhY2tpbmcgdXBvbiBhIG1vdXNlIGV2ZW50LiBDYWxsZWQgZnJvbSBOQ19IYW5kbGVTeXNDb21tYW5kKCkuCiAqLwp2b2lkIE1FTlVfVHJhY2tNb3VzZU1lbnVCYXIoIEhXTkQgaFduZCwgSU5UIGh0LCBQT0lOVCBwdCApCnsKICAgIEhNRU5VIGhNZW51ID0gKGh0ID09IEhUU1lTTUVOVSkgPyBnZXRfd2luX3N5c19tZW51KCBoV25kICkgOiBHZXRNZW51KCBoV25kICk7CiAgICBVSU5UIHdGbGFncyA9IFRQTV9FTlRFUklETEVFWCB8IFRQTV9CVVRUT05ET1dOIHwgVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OOwoKICAgIFRSQUNFKCJ3bmQ9JXAgaHQ9MHglMDR4ICglbGQsJWxkKVxuIiwgaFduZCwgaHQsIHB0LngsIHB0LnkpOwoKICAgIGlmIChJc01lbnUoaE1lbnUpKQogICAgewoJTUVOVV9Jbml0VHJhY2tpbmcoIGhXbmQsIGhNZW51LCBGQUxTRSwgd0ZsYWdzICk7CglNRU5VX1RyYWNrTWVudSggaE1lbnUsIHdGbGFncywgcHQueCwgcHQueSwgaFduZCwgTlVMTCApOwoJTUVOVV9FeGl0VHJhY2tpbmcoaFduZCk7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfVHJhY2tLYmRNZW51QmFyCiAqCiAqIE1lbnUtYmFyIHRyYWNraW5nIHVwb24gYSBrZXlib2FyZCBldmVudC4gQ2FsbGVkIGZyb20gTkNfSGFuZGxlU3lzQ29tbWFuZCgpLgogKi8Kdm9pZCBNRU5VX1RyYWNrS2JkTWVudUJhciggSFdORCBod25kLCBVSU5UIHdQYXJhbSwgV0NIQVIgd0NoYXIpCnsKICAgIFVJTlQgdUl0ZW0gPSBOT19TRUxFQ1RFRF9JVEVNOwogICAgSE1FTlUgaFRyYWNrTWVudTsKICAgIFVJTlQgd0ZsYWdzID0gVFBNX0VOVEVSSURMRUVYIHwgVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OOwoKICAgIFRSQUNFKCJod25kICVwIHdQYXJhbSAweCUwNHggd0NoYXIgMHglMDR4XG4iLCBod25kLCB3UGFyYW0sIHdDaGFyKTsKCiAgICAvKiBmaW5kIHdpbmRvdyB0aGF0IGhhcyBhIG1lbnUgKi8KCiAgICB3aGlsZSAoIVdJTl9BTExPV0VEX01FTlUoR2V0V2luZG93TG9uZ1coIGh3bmQsIEdXTF9TVFlMRSApKSkKICAgICAgICBpZiAoIShod25kID0gR2V0QW5jZXN0b3IoIGh3bmQsIEdBX1BBUkVOVCApKSkgcmV0dXJuOwoKICAgIC8qIGNoZWNrIGlmIHdlIGhhdmUgdG8gdHJhY2sgYSBzeXN0ZW0gbWVudSAqLwoKICAgIGhUcmFja01lbnUgPSBHZXRNZW51KCBod25kICk7CiAgICBpZiAoIWhUcmFja01lbnUgfHwgSXNJY29uaWMoaHduZCkgfHwgd0NoYXIgPT0gJyAnICkKICAgIHsKICAgICAgICBpZiAoIShHZXRXaW5kb3dMb25nVyggaHduZCwgR1dMX1NUWUxFICkgJiBXU19TWVNNRU5VKSkgcmV0dXJuOwogICAgICAgIGhUcmFja01lbnUgPSBnZXRfd2luX3N5c19tZW51KCBod25kICk7CiAgICAgICAgdUl0ZW0gPSAwOwogICAgICAgIHdQYXJhbSB8PSBIVFNZU01FTlU7IC8qIHByZXZlbnQgaXRlbSBsb29rdXAgKi8KICAgIH0KCiAgICBpZiAoIUlzTWVudSggaFRyYWNrTWVudSApKSByZXR1cm47CgogICAgTUVOVV9Jbml0VHJhY2tpbmcoIGh3bmQsIGhUcmFja01lbnUsIEZBTFNFLCB3RmxhZ3MgKTsKCiAgICBpZiggd0NoYXIgJiYgd0NoYXIgIT0gJyAnICkKICAgIHsKICAgICAgICB1SXRlbSA9IE1FTlVfRmluZEl0ZW1CeUtleSggaHduZCwgaFRyYWNrTWVudSwgd0NoYXIsICh3UGFyYW0gJiBIVFNZU01FTlUpICk7CiAgICAgICAgaWYgKCB1SXRlbSA+PSAoVUlOVCkoLTIpICkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCB1SXRlbSA9PSAoVUlOVCkoLTEpICkgTWVzc2FnZUJlZXAoMCk7CiAgICAgICAgICAgIC8qIHNjaGVkdWxlIGVuZCBvZiBtZW51IHRyYWNraW5nICovCiAgICAgICAgICAgIHdGbGFncyB8PSBURl9FTkRNRU5VOwogICAgICAgICAgICBnb3RvIHRyYWNrX21lbnU7CiAgICAgICAgfQogICAgfQoKICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaFRyYWNrTWVudSwgdUl0ZW0sIFRSVUUsIDAgKTsKCiAgICBpZiAod1BhcmFtICYgSFRTWVNNRU5VKQogICAgewogICAgICAgIC8qIHByZXZlbnQgc3lzbWVudSBhY3RpdmF0aW9uIGZvciBtYW5hZ2VkIHdpbmRvd3Mgb24gQWx0IGRvd24vdXAgKi8KICAgICAgICBpZiAoR2V0UHJvcEEoIGh3bmQsICJfX3dpbmVfeDExX21hbmFnZWQiICkpCiAgICAgICAgICAgIHdGbGFncyB8PSBURl9FTkRNRU5VOyAvKiBzY2hlZHVsZSBlbmQgb2YgbWVudSB0cmFja2luZyAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKCB1SXRlbSA9PSBOT19TRUxFQ1RFRF9JVEVNICkKICAgICAgICAgICAgTUVOVV9Nb3ZlU2VsZWN0aW9uKCBod25kLCBoVHJhY2tNZW51LCBJVEVNX05FWFQgKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFBvc3RNZXNzYWdlVyggaHduZCwgV01fS0VZRE9XTiwgVktfRE9XTiwgMEwgKTsKICAgIH0KCnRyYWNrX21lbnU6CiAgICBNRU5VX1RyYWNrTWVudSggaFRyYWNrTWVudSwgd0ZsYWdzLCAwLCAwLCBod25kLCBOVUxMICk7CiAgICBNRU5VX0V4aXRUcmFja2luZyggaHduZCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRyYWNrUG9wdXBNZW51ICAgKFVTRVIzMi5AKQogKgogKiBMaWtlIHRoZSB3aW4zMiBBUEksIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIGNvbW1hbmQgSUQgb25seSBpZiB0aGUKICogZmxhZyBUUE1fUkVUVVJOQ01EIGlzIG9uLgogKgogKi8KQk9PTCBXSU5BUEkgVHJhY2tQb3B1cE1lbnUoIEhNRU5VIGhNZW51LCBVSU5UIHdGbGFncywgSU5UIHgsIElOVCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblJlc2VydmVkLCBIV05EIGhXbmQsIGNvbnN0IFJFQ1QgKmxwUmVjdCApCnsKICAgIEJPT0wgcmV0ID0gRkFMU0U7CgogICAgTUVOVV9Jbml0VHJhY2tpbmcoaFduZCwgaE1lbnUsIFRSVUUsIHdGbGFncyk7CgogICAgLyogU2VuZCBXTV9JTklUTUVOVVBPUFVQIG1lc3NhZ2Ugb25seSBpZiBUUE1fTk9OT1RJRlkgZmxhZyBpcyBub3Qgc3BlY2lmaWVkICovCiAgICBpZiAoISh3RmxhZ3MgJiBUUE1fTk9OT1RJRlkpKQogICAgICAgIFNlbmRNZXNzYWdlVyggaFduZCwgV01fSU5JVE1FTlVQT1BVUCwgKFdQQVJBTSloTWVudSwgMCk7CgogICAgaWYgKE1FTlVfU2hvd1BvcHVwKCBoV25kLCBoTWVudSwgMCwgeCwgeSwgMCwgMCApKQogICAgICAgIHJldCA9IE1FTlVfVHJhY2tNZW51KCBoTWVudSwgd0ZsYWdzIHwgVFBNX1BPUFVQTUVOVSwgMCwgMCwgaFduZCwgbHBSZWN0ICk7CiAgICBNRU5VX0V4aXRUcmFja2luZyhoV25kKTsKCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVHJhY2tQb3B1cE1lbnVFeCAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIFRyYWNrUG9wdXBNZW51RXgoIEhNRU5VIGhNZW51LCBVSU5UIHdGbGFncywgSU5UIHgsIElOVCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQgaFduZCwgTFBUUE1QQVJBTVMgbHBUcG0gKQp7CiAgICBGSVhNRSgibm90IGZ1bGx5IGltcGxlbWVudGVkXG4iICk7CiAgICByZXR1cm4gVHJhY2tQb3B1cE1lbnUoIGhNZW51LCB3RmxhZ3MsIHgsIHksIDAsIGhXbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUcG0gPyAmbHBUcG0tPnJjRXhjbHVkZSA6IE5VTEwgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBQb3B1cE1lbnVXbmRQcm9jCiAqCiAqIE5PVEU6IFdpbmRvd3MgaGFzIHRvdGFsbHkgZGlmZmVyZW50IChhbmQgdW5kb2N1bWVudGVkKSBwb3B1cCB3bmRwcm9jLgogKi8Kc3RhdGljIExSRVNVTFQgV0lOQVBJIFBvcHVwTWVudVduZFByb2MoIEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKewogICAgVFJBQ0UoImh3bmQ9JXAgbXNnPTB4JTA0eCB3cD0weCUwNHggbHA9MHglMDhseFxuIiwgaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwoKICAgIHN3aXRjaChtZXNzYWdlKQogICAgewogICAgY2FzZSBXTV9DUkVBVEU6Cgl7CgkgICAgQ1JFQVRFU1RSVUNUVyAqY3MgPSAoQ1JFQVRFU1RSVUNUVyopbFBhcmFtOwoJICAgIFNldFdpbmRvd0xvbmdXKCBod25kLCAwLCAoTE9ORyljcy0+bHBDcmVhdGVQYXJhbXMgKTsKICAgICAgICAgICAgcmV0dXJuIDA7Cgl9CgogICAgY2FzZSBXTV9NT1VTRUFDVElWQVRFOiAgLyogV2UgZG9uJ3Qgd2FudCB0byBiZSBhY3RpdmF0ZWQgKi8KICAgICAgICByZXR1cm4gTUFfTk9BQ1RJVkFURTsKCiAgICBjYXNlIFdNX1BBSU5UOgoJewoJICAgIFBBSU5UU1RSVUNUIHBzOwoJICAgIEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOwoJICAgIE1FTlVfRHJhd1BvcHVwTWVudSggaHduZCwgcHMuaGRjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChITUVOVSlHZXRXaW5kb3dMb25nVyggaHduZCwgMCApICk7CgkgICAgRW5kUGFpbnQoIGh3bmQsICZwcyApOwogICAgICAgICAgICByZXR1cm4gMDsKCX0KICAgIGNhc2UgV01fRVJBU0VCS0dORDoKICAgICAgICByZXR1cm4gMTsKCiAgICBjYXNlIFdNX0RFU1RST1k6CiAgICAgICAgLyogemVybyBvdXQgZ2xvYmFsIHBvaW50ZXIgaW4gY2FzZSByZXNpZGVudCBwb3B1cCB3aW5kb3cgd2FzIGRlc3Ryb3llZC4gKi8KICAgICAgICBpZiAoaHduZCA9PSB0b3BfcG9wdXApIHRvcF9wb3B1cCA9IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBXTV9TSE9XV0lORE9XOgoKCWlmKCB3UGFyYW0gKQoJewogICAgICAgICAgICBpZiAoIUdldFdpbmRvd0xvbmdXKCBod25kLCAwICkpIEVSUigibm8gbWVudSB0byBkaXNwbGF5XG4iKTsKCX0KCWVsc2UKICAgICAgICAgICAgU2V0V2luZG93TG9uZ1coIGh3bmQsIDAsIDAgKTsKCWJyZWFrOwoKICAgIGNhc2UgTU1fU0VUTUVOVUhBTkRMRToKICAgICAgICBTZXRXaW5kb3dMb25nVyggaHduZCwgMCwgd1BhcmFtICk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBNTV9HRVRNRU5VSEFORExFOgogICAgICAgIHJldHVybiBHZXRXaW5kb3dMb25nVyggaHduZCwgMCApOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2NXKCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE1FTlVfR2V0TWVudUJhckhlaWdodAogKgogKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBtZW51IGJhciBoZWlnaHQuIFVzZWQgYnkgTkNfSGFuZGxlTkNDYWxjU2l6ZSgpLgogKi8KVUlOVCBNRU5VX0dldE1lbnVCYXJIZWlnaHQoIEhXTkQgaHduZCwgVUlOVCBtZW51YmFyV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBvcmdYLCBJTlQgb3JnWSApCnsKICAgIEhEQyBoZGM7CiAgICBSRUNUIHJlY3RCYXI7CiAgICBMUFBPUFVQTUVOVSBscHBvcDsKCiAgICBUUkFDRSgiSFdORCAlcCwgd2lkdGggJWQsIGF0ICglZCwgJWQpLlxuIiwgaHduZCwgbWVudWJhcldpZHRoLCBvcmdYLCBvcmdZICk7CgogICAgaWYgKCEobHBwb3AgPSBNRU5VX0dldE1lbnUoIEdldE1lbnUoaHduZCkgKSkpIHJldHVybiAwOwoKICAgIGhkYyA9IEdldERDRXgoIGh3bmQsIDAsIERDWF9DQUNIRSB8IERDWF9XSU5ET1cgKTsKICAgIFNlbGVjdE9iamVjdCggaGRjLCBoTWVudUZvbnQpOwogICAgU2V0UmVjdCgmcmVjdEJhciwgb3JnWCwgb3JnWSwgb3JnWCttZW51YmFyV2lkdGgsIG9yZ1krR2V0U3lzdGVtTWV0cmljcyhTTV9DWU1FTlUpKTsKICAgIE1FTlVfTWVudUJhckNhbGNTaXplKCBoZGMsICZyZWN0QmFyLCBscHBvcCwgaHduZCApOwogICAgUmVsZWFzZURDKCBod25kLCBoZGMgKTsKICAgIHJldHVybiBscHBvcC0+SGVpZ2h0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBDaGFuZ2VNZW51QSAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBDaGFuZ2VNZW51QSggSE1FTlUgaE1lbnUsIFVJTlQgcG9zLCBMUENTVFIgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGlkLCBVSU5UIGZsYWdzICkKewogICAgVFJBQ0UoIm1lbnU9JXAgcG9zPSVkIGRhdGE9JXAgaWQ9JTA4eCBmbGFncz0lMDh4XG4iLCBoTWVudSwgcG9zLCBkYXRhLCBpZCwgZmxhZ3MgKTsKICAgIGlmIChmbGFncyAmIE1GX0FQUEVORCkgcmV0dXJuIEFwcGVuZE1lbnVBKCBoTWVudSwgZmxhZ3MgJiB+TUZfQVBQRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRhdGEgKTsKICAgIGlmIChmbGFncyAmIE1GX0RFTEVURSkgcmV0dXJuIERlbGV0ZU1lbnUoaE1lbnUsIHBvcywgZmxhZ3MgJiB+TUZfREVMRVRFKTsKICAgIGlmIChmbGFncyAmIE1GX0NIQU5HRSkgcmV0dXJuIE1vZGlmeU1lbnVBKGhNZW51LCBwb3MsIGZsYWdzICYgfk1GX0NIQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRhdGEgKTsKICAgIGlmIChmbGFncyAmIE1GX1JFTU9WRSkgcmV0dXJuIFJlbW92ZU1lbnUoIGhNZW51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBNRl9CWVBPU0lUSU9OID8gcG9zIDogaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIH5NRl9SRU1PVkUgKTsKICAgIC8qIERlZmF1bHQ6IE1GX0lOU0VSVCAqLwogICAgcmV0dXJuIEluc2VydE1lbnVBKCBoTWVudSwgcG9zLCBmbGFncywgaWQsIGRhdGEgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQ2hhbmdlTWVudVcgICAgKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgQ2hhbmdlTWVudVcoIEhNRU5VIGhNZW51LCBVSU5UIHBvcywgTFBDV1NUUiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgaWQsIFVJTlQgZmxhZ3MgKQp7CiAgICBUUkFDRSgibWVudT0lcCBwb3M9JWQgZGF0YT0lcCBpZD0lMDh4IGZsYWdzPSUwOHhcbiIsIGhNZW51LCBwb3MsIGRhdGEsIGlkLCBmbGFncyApOwogICAgaWYgKGZsYWdzICYgTUZfQVBQRU5EKSByZXR1cm4gQXBwZW5kTWVudVcoIGhNZW51LCBmbGFncyAmIH5NRl9BUFBFTkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgZGF0YSApOwogICAgaWYgKGZsYWdzICYgTUZfREVMRVRFKSByZXR1cm4gRGVsZXRlTWVudShoTWVudSwgcG9zLCBmbGFncyAmIH5NRl9ERUxFVEUpOwogICAgaWYgKGZsYWdzICYgTUZfQ0hBTkdFKSByZXR1cm4gTW9kaWZ5TWVudVcoaE1lbnUsIHBvcywgZmxhZ3MgJiB+TUZfQ0hBTkdFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgZGF0YSApOwogICAgaWYgKGZsYWdzICYgTUZfUkVNT1ZFKSByZXR1cm4gUmVtb3ZlTWVudSggaE1lbnUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIE1GX0JZUE9TSVRJT04gPyBwb3MgOiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgfk1GX1JFTU9WRSApOwogICAgLyogRGVmYXVsdDogTUZfSU5TRVJUICovCiAgICByZXR1cm4gSW5zZXJ0TWVudVcoIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwgZGF0YSApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBDaGVja01lbnVJdGVtICAgIChVU0VSMzIuQCkKICovCkRXT1JEIFdJTkFQSSBDaGVja01lbnVJdGVtKCBITUVOVSBoTWVudSwgVUlOVCBpZCwgVUlOVCBmbGFncyApCnsKICAgIE1FTlVJVEVNICppdGVtOwogICAgRFdPUkQgcmV0OwoKICAgIFRSQUNFKCJtZW51PSVwIGlkPSUwNHggZmxhZ3M9JTA0eFxuIiwgaE1lbnUsIGlkLCBmbGFncyApOwogICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJmlkLCBmbGFncyApKSkgcmV0dXJuIC0xOwogICAgcmV0ID0gaXRlbS0+ZlN0YXRlICYgTUZfQ0hFQ0tFRDsKICAgIGlmIChmbGFncyAmIE1GX0NIRUNLRUQpIGl0ZW0tPmZTdGF0ZSB8PSBNRl9DSEVDS0VEOwogICAgZWxzZSBpdGVtLT5mU3RhdGUgJj0gfk1GX0NIRUNLRUQ7CiAgICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBFbmFibGVNZW51SXRlbSAgICAoVVNFUjMyLkApCiAqLwpVSU5UIFdJTkFQSSBFbmFibGVNZW51SXRlbSggSE1FTlUgaE1lbnUsIFVJTlQgd0l0ZW1JRCwgVUlOVCB3RmxhZ3MgKQp7CiAgICBVSU5UICAgIG9sZGZsYWdzOwogICAgTUVOVUlURU0gKml0ZW07CiAgICBQT1BVUE1FTlUgKm1lbnU7CgogICAgVFJBQ0UoIiglcCwgJTA0eCwgJTA0eCkgIVxuIiwgaE1lbnUsIHdJdGVtSUQsIHdGbGFncyk7CgogICAgLyogR2V0IHRoZSBQb3B1cG1lbnUgdG8gYWNjZXNzIHRoZSBvd25lciBtZW51ICovCiAgICBpZiAoIShtZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KSkpCglyZXR1cm4gKFVJTlQpLTE7CgogICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdGbGFncyApKSkKCXJldHVybiAoVUlOVCktMTsKCiAgICBvbGRmbGFncyA9IGl0ZW0tPmZTdGF0ZSAmIChNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCk7CiAgICBpdGVtLT5mU3RhdGUgXj0gKG9sZGZsYWdzIF4gd0ZsYWdzKSAmIChNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCk7CgogICAgLyogSWYgdGhlIGNsb3NlIGl0ZW0gaW4gdGhlIHN5c3RlbSBtZW51IGNoYW5nZSB1cGRhdGUgdGhlIGNsb3NlIGJ1dHRvbiAqLwogICAgaWYoKGl0ZW0tPndJRCA9PSBTQ19DTE9TRSkgJiYgKG9sZGZsYWdzICE9IHdGbGFncykpCiAgICB7CglpZiAobWVudS0+aFN5c01lbnVPd25lciAhPSAwKQoJewogICAgICAgICAgICBSRUNUIHJjOwoJICAgIFBPUFVQTUVOVSogcGFyZW50TWVudTsKCgkgICAgLyogR2V0IHRoZSBwYXJlbnQgbWVudSB0byBhY2Nlc3MqLwoJICAgIGlmICghKHBhcmVudE1lbnUgPSBNRU5VX0dldE1lbnUobWVudS0+aFN5c01lbnVPd25lcikpKQoJCXJldHVybiAoVUlOVCktMTsKCiAgICAgICAgICAgIC8qIFJlZnJlc2ggdGhlIGZyYW1lIHRvIHJlZmxlY3QgdGhlIGNoYW5nZSAqLwogICAgICAgICAgICBHZXRXaW5kb3dSZWN0KHBhcmVudE1lbnUtPmhXbmQsICZyYyk7CiAgICAgICAgICAgIE1hcFdpbmRvd1BvaW50cygwLCBwYXJlbnRNZW51LT5oV25kLCAoUE9JTlQgKikmcmMsIDIpOwogICAgICAgICAgICByYy5ib3R0b20gPSAwOwogICAgICAgICAgICBSZWRyYXdXaW5kb3cocGFyZW50TWVudS0+aFduZCwgJnJjLCAwLCBSRFdfRlJBTUUgfCBSRFdfSU5WQUxJREFURSB8IFJEV19OT0NISUxEUkVOKTsKCX0KICAgIH0KCiAgICByZXR1cm4gb2xkZmxhZ3M7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldE1lbnVTdHJpbmdBICAgIChVU0VSMzIuQCkKICovCklOVCBXSU5BUEkgR2V0TWVudVN0cmluZ0EoCglITUVOVSBoTWVudSwJLyogW2luXSBtZW51aGFuZGxlICovCglVSU5UIHdJdGVtSUQsCS8qIFtpbl0gbWVudSBpdGVtIChkZXAuIG9uIHdGbGFncykgKi8KCUxQU1RSIHN0ciwJLyogW291dF0gb3V0YnVmZmVyLiBJZiBOVUxMLCBmdW5jIHJldHVybnMgZW50cnkgbGVuZ3RoKi8KCUlOVCBuTWF4U2l6LAkvKiBbaW5dIGxlbmd0aCBvZiBidWZmZXIuIGlmIDAsIGZ1bmMgcmV0dXJucyBlbnRyeSBsZW4qLwoJVUlOVCB3RmxhZ3MJLyogW2luXSBNRl8gZmxhZ3MgKi8KKSB7CiAgICBNRU5VSVRFTSAqaXRlbTsKCiAgICBUUkFDRSgibWVudT0lcCBpdGVtPSUwNHggcHRyPSVwIGxlbj0lZCBmbGFncz0lMDR4XG4iLCBoTWVudSwgd0l0ZW1JRCwgc3RyLCBuTWF4U2l6LCB3RmxhZ3MgKTsKICAgIGlmIChzdHIgJiYgbk1heFNpeikgc3RyWzBdID0gJ1wwJzsKICAgIGlmICghKGl0ZW0gPSBNRU5VX0ZpbmRJdGVtKCAmaE1lbnUsICZ3SXRlbUlELCB3RmxhZ3MgKSkpIHJldHVybiAwOwogICAgaWYgKCFJU19TVFJJTkdfSVRFTShpdGVtLT5mVHlwZSkpIHJldHVybiAwOwogICAgaWYgKCFzdHIgfHwgIW5NYXhTaXopIHJldHVybiBzdHJsZW5XKGl0ZW0tPnRleHQpOwogICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9BQ1AsIDAsIGl0ZW0tPnRleHQsIC0xLCBzdHIsIG5NYXhTaXosIE5VTEwsIE5VTEwgKSkKICAgICAgICBzdHJbbk1heFNpei0xXSA9IDA7CiAgICBUUkFDRSgicmV0dXJuaW5nICclcydcbiIsIHN0ciApOwogICAgcmV0dXJuIHN0cmxlbihzdHIpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRNZW51U3RyaW5nVyAgICAoVVNFUjMyLkApCiAqLwpJTlQgV0lOQVBJIEdldE1lbnVTdHJpbmdXKCBITUVOVSBoTWVudSwgVUlOVCB3SXRlbUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIHN0ciwgSU5UIG5NYXhTaXosIFVJTlQgd0ZsYWdzICkKewogICAgTUVOVUlURU0gKml0ZW07CgogICAgVFJBQ0UoIm1lbnU9JXAgaXRlbT0lMDR4IHB0cj0lcCBsZW49JWQgZmxhZ3M9JTA0eFxuIiwgaE1lbnUsIHdJdGVtSUQsIHN0ciwgbk1heFNpeiwgd0ZsYWdzICk7CiAgICBpZiAoc3RyICYmIG5NYXhTaXopIHN0clswXSA9ICdcMCc7CiAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpKSByZXR1cm4gMDsKICAgIGlmICghSVNfU1RSSU5HX0lURU0oaXRlbS0+ZlR5cGUpKSByZXR1cm4gMDsKICAgIGlmICghc3RyIHx8ICFuTWF4U2l6KSByZXR1cm4gc3RybGVuVyhpdGVtLT50ZXh0KTsKICAgIGxzdHJjcHluVyggc3RyLCBpdGVtLT50ZXh0LCBuTWF4U2l6ICk7CiAgICByZXR1cm4gc3RybGVuVyhzdHIpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBIaWxpdGVNZW51SXRlbSAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBIaWxpdGVNZW51SXRlbSggSFdORCBoV25kLCBITUVOVSBoTWVudSwgVUlOVCB3SXRlbUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgd0hpbGl0ZSApCnsKICAgIExQUE9QVVBNRU5VIG1lbnU7CiAgICBUUkFDRSgiKCVwLCAlcCwgJTA0eCwgJTA0eCk7XG4iLCBoV25kLCBoTWVudSwgd0l0ZW1JRCwgd0hpbGl0ZSk7CiAgICBpZiAoIU1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdIaWxpdGUgKSkgcmV0dXJuIEZBTFNFOwogICAgaWYgKCEobWVudSA9IE1FTlVfR2V0TWVudShoTWVudSkpKSByZXR1cm4gRkFMU0U7CiAgICBpZiAobWVudS0+Rm9jdXNlZEl0ZW0gPT0gd0l0ZW1JRCkgcmV0dXJuIFRSVUU7CiAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGhXbmQsIGhNZW51LCBGQUxTRSApOwogICAgTUVOVV9TZWxlY3RJdGVtKCBoV25kLCBoTWVudSwgd0l0ZW1JRCwgVFJVRSwgMCApOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldE1lbnVTdGF0ZSAgICAoVVNFUjMyLkApCiAqLwpVSU5UIFdJTkFQSSBHZXRNZW51U3RhdGUoIEhNRU5VIGhNZW51LCBVSU5UIHdJdGVtSUQsIFVJTlQgd0ZsYWdzICkKewogICAgTUVOVUlURU0gKml0ZW07CiAgICBUUkFDRSgiKG1lbnU9JXAsIGlkPSUwNHgsIGZsYWdzPSUwNHgpO1xuIiwgaE1lbnUsIHdJdGVtSUQsIHdGbGFncyk7CiAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpKSByZXR1cm4gLTE7CiAgICBkZWJ1Z19wcmludF9tZW51aXRlbSAoIiAgaXRlbTogIiwgaXRlbSwgIiIpOwogICAgaWYgKGl0ZW0tPmZUeXBlICYgTUZfUE9QVVApCiAgICB7CglQT1BVUE1FTlUgKm1lbnUgPSBNRU5VX0dldE1lbnUoIGl0ZW0tPmhTdWJNZW51ICk7CglpZiAoIW1lbnUpIHJldHVybiAtMTsKCWVsc2UgcmV0dXJuIChtZW51LT5uSXRlbXMgPDwgOCkgfCAoKGl0ZW0tPmZTdGF0ZXxpdGVtLT5mVHlwZSkgJiAweGZmKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIFdlIHVzZWQgdG8gKGZyb20gd2F5IGJhY2sgdGhlbikgbWFzayB0aGUgcmVzdWx0IHRvIDB4ZmYuICAqLwoJLyogSSBkb24ndCBrbm93IHdoeSBhbmQgaXQgc2VlbXMgd3JvbmcgYXMgdGhlIGRvY3VtZW50ZWQgKi8KCS8qIHJldHVybiBmbGFnIE1GX1NFUEFSQVRPUiBpcyBvdXRzaWRlIHRoYXQgbWFzay4gICovCglyZXR1cm4gKGl0ZW0tPmZUeXBlIHwgaXRlbS0+ZlN0YXRlKTsKICAgIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0TWVudUl0ZW1Db3VudCAgICAoVVNFUjMyLkApCiAqLwpJTlQgV0lOQVBJIEdldE1lbnVJdGVtQ291bnQoIEhNRU5VIGhNZW51ICkKewogICAgTFBQT1BVUE1FTlUJbWVudSA9IE1FTlVfR2V0TWVudShoTWVudSk7CiAgICBpZiAoIW1lbnUpIHJldHVybiAtMTsKICAgIFRSQUNFKCIoJXApIHJldHVybmluZyAlZFxuIiwgaE1lbnUsIG1lbnUtPm5JdGVtcyApOwogICAgcmV0dXJuIG1lbnUtPm5JdGVtczsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0TWVudUl0ZW1JRCAgICAoVVNFUjMyLkApCiAqLwpVSU5UIFdJTkFQSSBHZXRNZW51SXRlbUlEKCBITUVOVSBoTWVudSwgSU5UIG5Qb3MgKQp7CiAgICBNRU5VSVRFTSAqIGxwbWk7CgogICAgaWYgKCEobHBtaSA9IE1FTlVfRmluZEl0ZW0oJmhNZW51LCZuUG9zLE1GX0JZUE9TSVRJT04pKSkgcmV0dXJuIC0xOwogICAgaWYgKGxwbWktPmZUeXBlICYgTUZfUE9QVVApIHJldHVybiAtMTsKICAgIHJldHVybiBscG1pLT53SUQ7Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJbnNlcnRNZW51VyAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBJbnNlcnRNZW51VyggSE1FTlUgaE1lbnUsIFVJTlQgcG9zLCBVSU5UIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9QVFIgaWQsIExQQ1dTVFIgc3RyICkKewogICAgTUVOVUlURU0gKml0ZW07CgogICAgaWYgKElTX1NUUklOR19JVEVNKGZsYWdzKSAmJiBzdHIpCiAgICAgICAgVFJBQ0UoImhNZW51ICVwLCBwb3MgJWQsIGZsYWdzICUwOHgsIGlkICUwNHgsIHN0ciAlc1xuIiwKICAgICAgICAgICAgICBoTWVudSwgcG9zLCBmbGFncywgaWQsIGRlYnVnc3RyX3coc3RyKSApOwogICAgZWxzZSBUUkFDRSgiaE1lbnUgJXAsIHBvcyAlZCwgZmxhZ3MgJTA4eCwgaWQgJTA0eCwgc3RyICUwOGx4IChub3QgYSBzdHJpbmcpXG4iLAogICAgICAgICAgICAgICBoTWVudSwgcG9zLCBmbGFncywgaWQsIChEV09SRClzdHIgKTsKCiAgICBpZiAoIShpdGVtID0gTUVOVV9JbnNlcnRJdGVtKCBoTWVudSwgcG9zLCBmbGFncyApKSkgcmV0dXJuIEZBTFNFOwoKICAgIGlmICghKE1FTlVfU2V0SXRlbURhdGEoIGl0ZW0sIGZsYWdzLCBpZCwgc3RyICkpKQogICAgewogICAgICAgIFJlbW92ZU1lbnUoIGhNZW51LCBwb3MsIGZsYWdzICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGlmIChmbGFncyAmIE1GX1BPUFVQKSAgLyogU2V0IHRoZSBNRl9QT1BVUCBmbGFnIG9uIHRoZSBwb3B1cC1tZW51ICovCgkoTUVOVV9HZXRNZW51KChITUVOVSlpZCkpLT53RmxhZ3MgfD0gTUZfUE9QVVA7CgogICAgaXRlbS0+aENoZWNrQml0ID0gaXRlbS0+aFVuQ2hlY2tCaXQgPSAwOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEluc2VydE1lbnVBICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIEluc2VydE1lbnVBKCBITUVOVSBoTWVudSwgVUlOVCBwb3MsIFVJTlQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX1BUUiBpZCwgTFBDU1RSIHN0ciApCnsKICAgIEJPT0wgcmV0ID0gRkFMU0U7CgogICAgaWYgKElTX1NUUklOR19JVEVNKGZsYWdzKSAmJiBzdHIpCiAgICB7CiAgICAgICAgSU5UIGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgc3RyLCAtMSwgTlVMTCwgMCApOwogICAgICAgIExQV1NUUiBuZXdzdHIgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbiAqIHNpemVvZihXQ0hBUikgKTsKICAgICAgICBpZiAobmV3c3RyKQogICAgICAgIHsKICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCBzdHIsIC0xLCBuZXdzdHIsIGxlbiApOwogICAgICAgICAgICByZXQgPSBJbnNlcnRNZW51VyggaE1lbnUsIHBvcywgZmxhZ3MsIGlkLCBuZXdzdHIgKTsKICAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld3N0ciApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZWxzZSByZXR1cm4gSW5zZXJ0TWVudVcoIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwgKExQQ1dTVFIpc3RyICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEFwcGVuZE1lbnVBICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIEFwcGVuZE1lbnVBKCBITUVOVSBoTWVudSwgVUlOVCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRfUFRSIGlkLCBMUENTVFIgZGF0YSApCnsKICAgIHJldHVybiBJbnNlcnRNZW51QSggaE1lbnUsIC0xLCBmbGFncyB8IE1GX0JZUE9TSVRJT04sIGlkLCBkYXRhICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEFwcGVuZE1lbnVXICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIEFwcGVuZE1lbnVXKCBITUVOVSBoTWVudSwgVUlOVCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRfUFRSIGlkLCBMUENXU1RSIGRhdGEgKQp7CiAgICByZXR1cm4gSW5zZXJ0TWVudVcoIGhNZW51LCAtMSwgZmxhZ3MgfCBNRl9CWVBPU0lUSU9OLCBpZCwgZGF0YSApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBSZW1vdmVNZW51ICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIFJlbW92ZU1lbnUoIEhNRU5VIGhNZW51LCBVSU5UIG5Qb3MsIFVJTlQgd0ZsYWdzICkKewogICAgTFBQT1BVUE1FTlUJbWVudTsKICAgIE1FTlVJVEVNICppdGVtOwoKICAgIFRSQUNFKCIobWVudT0lcCBwb3M9JTA0eCBmbGFncz0lMDR4KVxuIixoTWVudSwgblBvcywgd0ZsYWdzKTsKICAgIGlmICghKGl0ZW0gPSBNRU5VX0ZpbmRJdGVtKCAmaE1lbnUsICZuUG9zLCB3RmxhZ3MgKSkpIHJldHVybiBGQUxTRTsKICAgIGlmICghKG1lbnUgPSBNRU5VX0dldE1lbnUoaE1lbnUpKSkgcmV0dXJuIEZBTFNFOwoKICAgICAgLyogUmVtb3ZlIGl0ZW0gKi8KCiAgICBNRU5VX0ZyZWVJdGVtRGF0YSggaXRlbSApOwoKICAgIGlmICgtLW1lbnUtPm5JdGVtcyA9PSAwKQogICAgewogICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW51LT5pdGVtcyApOwogICAgICAgIG1lbnUtPml0ZW1zID0gTlVMTDsKICAgIH0KICAgIGVsc2UKICAgIHsKCXdoaWxlKG5Qb3MgPCBtZW51LT5uSXRlbXMpCgl7CgkgICAgKml0ZW0gPSAqKGl0ZW0rMSk7CgkgICAgaXRlbSsrOwoJICAgIG5Qb3MrKzsKCX0KICAgICAgICBtZW51LT5pdGVtcyA9IEhlYXBSZUFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW51LT5pdGVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LT5uSXRlbXMgKiBzaXplb2YoTUVOVUlURU0pICk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgRGVsZXRlTWVudSAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBEZWxldGVNZW51KCBITUVOVSBoTWVudSwgVUlOVCBuUG9zLCBVSU5UIHdGbGFncyApCnsKICAgIE1FTlVJVEVNICppdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICk7CiAgICBpZiAoIWl0ZW0pIHJldHVybiBGQUxTRTsKICAgIGlmIChpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKSBEZXN0cm95TWVudSggaXRlbS0+aFN1Yk1lbnUgKTsKICAgICAgLyogblBvcyBpcyBub3cgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtICovCiAgICBSZW1vdmVNZW51KCBoTWVudSwgblBvcywgd0ZsYWdzIHwgTUZfQllQT1NJVElPTiApOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIE1vZGlmeU1lbnVXICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIE1vZGlmeU1lbnVXKCBITUVOVSBoTWVudSwgVUlOVCBwb3MsIFVJTlQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX1BUUiBpZCwgTFBDV1NUUiBzdHIgKQp7CiAgICBNRU5VSVRFTSAqaXRlbTsKCiAgICBpZiAoSVNfU1RSSU5HX0lURU0oZmxhZ3MpKQogICAgewogICAgICAgIFRSQUNFKCIlcCAlZCAlMDR4ICUwNHggJXNcbiIsIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwgZGVidWdzdHJfdyhzdHIpICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgVFJBQ0UoIiVwICVkICUwNHggJTA0eCAlMDhseFxuIiwgaE1lbnUsIHBvcywgZmxhZ3MsIGlkLCAoRFdPUkQpc3RyICk7CiAgICB9CgogICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJnBvcywgZmxhZ3MgKSkpIHJldHVybiBGQUxTRTsKICAgIE1FTlVfR2V0TWVudShoTWVudSktPkhlaWdodCA9IDA7IC8qIGZvcmNlIHNpemUgcmVjYWxjdWxhdGUgKi8KICAgIHJldHVybiBNRU5VX1NldEl0ZW1EYXRhKCBpdGVtLCBmbGFncywgaWQsIHN0ciApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBNb2RpZnlNZW51QSAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBNb2RpZnlNZW51QSggSE1FTlUgaE1lbnUsIFVJTlQgcG9zLCBVSU5UIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9QVFIgaWQsIExQQ1NUUiBzdHIgKQp7CiAgICBCT09MIHJldCA9IEZBTFNFOwoKICAgIGlmIChJU19TVFJJTkdfSVRFTShmbGFncykgJiYgc3RyKQogICAgewogICAgICAgIElOVCBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHN0ciwgLTEsIE5VTEwsIDAgKTsKICAgICAgICBMUFdTVFIgbmV3c3RyID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpICk7CiAgICAgICAgaWYgKG5ld3N0cikKICAgICAgICB7CiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgc3RyLCAtMSwgbmV3c3RyLCBsZW4gKTsKICAgICAgICAgICAgcmV0ID0gTW9kaWZ5TWVudVcoIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwgbmV3c3RyICk7CiAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdzdHIgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGVsc2UgcmV0dXJuIE1vZGlmeU1lbnVXKCBoTWVudSwgcG9zLCBmbGFncywgaWQsIChMUENXU1RSKXN0ciApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBDcmVhdGVQb3B1cE1lbnUgICAgKFVTRVIzMi5AKQogKi8KSE1FTlUgV0lOQVBJIENyZWF0ZVBvcHVwTWVudSh2b2lkKQp7CiAgICBITUVOVSBobWVudTsKICAgIFBPUFVQTUVOVSAqbWVudTsKCiAgICBpZiAoIShobWVudSA9IENyZWF0ZU1lbnUoKSkpIHJldHVybiAwOwogICAgbWVudSA9IE1FTlVfR2V0TWVudSggaG1lbnUgKTsKICAgIG1lbnUtPndGbGFncyB8PSBNRl9QT1BVUDsKICAgIG1lbnUtPmJUaW1lVG9IaWRlID0gRkFMU0U7CiAgICByZXR1cm4gaG1lbnU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zICAgIChVU0VSLjQxNykKICogICAgICAgICBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucyAgICAoVVNFUjMyLkApCiAqLwpEV09SRCBXSU5BUEkgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnModm9pZCkKewogICAgcmV0dXJuIE1BS0VMT05HKCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYTUVOVUNIRUNLKSwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWU1FTlVDSEVDSykgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgU2V0TWVudUl0ZW1CaXRtYXBzICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIFNldE1lbnVJdGVtQml0bWFwcyggSE1FTlUgaE1lbnUsIFVJTlQgblBvcywgVUlOVCB3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCSVRNQVAgaE5ld1VuQ2hlY2ssIEhCSVRNQVAgaE5ld0NoZWNrKQp7CiAgICBNRU5VSVRFTSAqaXRlbTsKICAgIFRSQUNFKCIoJXAsICUwNHgsICUwNHgsICVwLCAlcClcbiIsCiAgICAgICAgICBoTWVudSwgblBvcywgd0ZsYWdzLCBoTmV3Q2hlY2ssIGhOZXdVbkNoZWNrKTsKICAgIGlmICghKGl0ZW0gPSBNRU5VX0ZpbmRJdGVtKCAmaE1lbnUsICZuUG9zLCB3RmxhZ3MgKSkpIHJldHVybiBGQUxTRTsKCiAgICBpZiAoIWhOZXdDaGVjayAmJiAhaE5ld1VuQ2hlY2spCiAgICB7CglpdGVtLT5mU3RhdGUgJj0gfk1GX1VTRUNIRUNLQklUTUFQUzsKICAgIH0KICAgIGVsc2UgIC8qIEluc3RhbGwgbmV3IGJpdG1hcHMgKi8KICAgIHsKCWl0ZW0tPmhDaGVja0JpdCA9IGhOZXdDaGVjazsKCWl0ZW0tPmhVbkNoZWNrQml0ID0gaE5ld1VuQ2hlY2s7CglpdGVtLT5mU3RhdGUgfD0gTUZfVVNFQ0hFQ0tCSVRNQVBTOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIENyZWF0ZU1lbnUgICAgKFVTRVIzMi5AKQogKi8KSE1FTlUgV0lOQVBJIENyZWF0ZU1lbnUodm9pZCkKewogICAgSE1FTlUgaE1lbnU7CiAgICBMUFBPUFVQTUVOVSBtZW51OwogICAgaWYgKCEoaE1lbnUgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihQT1BVUE1FTlUpICkpKSByZXR1cm4gMDsKICAgIG1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSk7CgogICAgWmVyb01lbW9yeShtZW51LCBzaXplb2YoUE9QVVBNRU5VKSk7CiAgICBtZW51LT53TWFnaWMgPSBNRU5VX01BR0lDOwogICAgbWVudS0+Rm9jdXNlZEl0ZW0gPSBOT19TRUxFQ1RFRF9JVEVNOwogICAgbWVudS0+YlRpbWVUb0hpZGUgPSBGQUxTRTsKCiAgICBUUkFDRSgicmV0dXJuICVwXG4iLCBoTWVudSApOwoKICAgIHJldHVybiBoTWVudTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgRGVzdHJveU1lbnUgICAgKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgRGVzdHJveU1lbnUoIEhNRU5VIGhNZW51ICkKewogICAgVFJBQ0UoIiglcClcbiIsIGhNZW51KTsKCiAgICAvKiBTaWxlbnRseSBpZ25vcmUgYXR0ZW1wdHMgdG8gZGVzdHJveSBkZWZhdWx0IHN5c3RlbSBwb3B1cCAqLwoKICAgIGlmIChoTWVudSAmJiBoTWVudSAhPSBNRU5VX0RlZlN5c1BvcHVwKQogICAgewogICAgICAgIExQUE9QVVBNRU5VIGxwcG9wID0gTUVOVV9HZXRNZW51KGhNZW51KTsKCiAgICAgICAgaWYgKCFscHBvcCkgcmV0dXJuIEZBTFNFOwoKICAgICAgICBscHBvcC0+d01hZ2ljID0gMDsgIC8qIE1hcmsgaXQgYXMgZGVzdHJveWVkICovCgogICAgICAgIC8qIERlc3Ryb3lNZW51IHNob3VsZCBub3QgZGVzdHJveSBzeXN0ZW0gbWVudSBwb3B1cCBvd25lciAqLwogICAgICAgIGlmICgobHBwb3AtPndGbGFncyAmIChNRl9QT1BVUCB8IE1GX1NZU01FTlUpKSA9PSBNRl9QT1BVUCAmJiBscHBvcC0+aFduZCkKICAgICAgICB7CiAgICAgICAgICAgIERlc3Ryb3lXaW5kb3coIGxwcG9wLT5oV25kICk7CiAgICAgICAgICAgIGxwcG9wLT5oV25kID0gMDsKICAgICAgICB9CgogICAgICAgIGlmIChscHBvcC0+aXRlbXMpIC8qIHJlY3Vyc2l2ZWx5IGRlc3Ryb3kgc3VibWVudXMgKi8KICAgICAgICB7CiAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICBNRU5VSVRFTSAqaXRlbSA9IGxwcG9wLT5pdGVtczsKICAgICAgICAgICAgZm9yIChpID0gbHBwb3AtPm5JdGVtczsgaSA+IDA7IGktLSwgaXRlbSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgRGVzdHJveU1lbnUoaXRlbS0+aFN1Yk1lbnUpOwogICAgICAgICAgICAgICAgTUVOVV9GcmVlSXRlbURhdGEoIGl0ZW0gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBwb3AtPml0ZW1zICk7CiAgICAgICAgfQogICAgICAgIFVTRVJfSEVBUF9GUkVFKCBoTWVudSApOwogICAgfQogICAgcmV0dXJuIChoTWVudSAhPSBNRU5VX0RlZlN5c1BvcHVwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtTWVudSAgICAoVVNFUjMyLkApCiAqLwpITUVOVSBXSU5BUEkgR2V0U3lzdGVtTWVudSggSFdORCBoV25kLCBCT09MIGJSZXZlcnQgKQp7CiAgICBXTkQgKnduZFB0ciA9IFdJTl9HZXRQdHIoIGhXbmQgKTsKICAgIEhNRU5VIHJldHZhbHVlID0gMDsKCiAgICBpZiAod25kUHRyID09IFdORF9ERVNLVE9QKSByZXR1cm4gMDsKICAgIGlmICh3bmRQdHIgPT0gV05EX09USEVSX1BST0NFU1MpCiAgICB7CiAgICAgICAgaWYgKElzV2luZG93KCBoV25kICkpIEZJWE1FKCAibm90IHN1cHBvcnRlZCBvbiBvdGhlciBwcm9jZXNzIHdpbmRvdyAlcFxuIiwgaFduZCApOwogICAgfQogICAgZWxzZSBpZiAod25kUHRyKQogICAgewoJaWYoIHduZFB0ci0+aFN5c01lbnUgKQoJewoJICAgIGlmKCBiUmV2ZXJ0ICkKCSAgICB7CgkJRGVzdHJveU1lbnUod25kUHRyLT5oU3lzTWVudSk7CgkJd25kUHRyLT5oU3lzTWVudSA9IDA7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJUE9QVVBNRU5VICptZW51ID0gTUVOVV9HZXRNZW51KCB3bmRQdHItPmhTeXNNZW51ICk7CgkJaWYoIG1lbnUgKQogICAgICAgICAgICAgICAgewoJCSAgIGlmKCBtZW51LT5uSXRlbXMgPiAwICYmIG1lbnUtPml0ZW1zWzBdLmhTdWJNZW51ID09IE1FTlVfRGVmU3lzUG9wdXAgKQoJCSAgICAgIG1lbnUtPml0ZW1zWzBdLmhTdWJNZW51ID0gTUVOVV9Db3B5U3lzUG9wdXAoKTsKCQl9CgkJZWxzZQoJCXsKCQkgICBXQVJOKCJDdXJyZW50IHN5cy1tZW51ICglcCkgb2Ygd25kICVwIGlzIGJyb2tlblxuIiwKCQkJd25kUHRyLT5oU3lzTWVudSwgaFduZCk7CgkJICAgd25kUHRyLT5oU3lzTWVudSA9IDA7CgkJfQoJICAgIH0KCX0KCglpZighd25kUHRyLT5oU3lzTWVudSAmJiAod25kUHRyLT5kd1N0eWxlICYgV1NfU1lTTUVOVSkgKQoJICAgIHduZFB0ci0+aFN5c01lbnUgPSBNRU5VX0dldFN5c01lbnUoIGhXbmQsIChITUVOVSkoLTEpICk7CgoJaWYoIHduZFB0ci0+aFN5c01lbnUgKQogICAgICAgIHsKCSAgICBQT1BVUE1FTlUgKm1lbnU7CgkgICAgcmV0dmFsdWUgPSBHZXRTdWJNZW51KHduZFB0ci0+aFN5c01lbnUsIDApOwoKCSAgICAvKiBTdG9yZSB0aGUgZHVtbXkgc3lzbWVudSBoYW5kbGUgdG8gZmFjaWxpdGF0ZSB0aGUgcmVmcmVzaCAqLwoJICAgIC8qIG9mIHRoZSBjbG9zZSBidXR0b24gaWYgdGhlIFNDX0NMT1NFIGl0ZW0gY2hhbmdlICovCgkgICAgbWVudSA9IE1FTlVfR2V0TWVudShyZXR2YWx1ZSk7CgkgICAgaWYgKCBtZW51ICkKCSAgICAgICBtZW51LT5oU3lzTWVudU93bmVyID0gd25kUHRyLT5oU3lzTWVudTsKICAgICAgICB9CiAgICAgICAgV0lOX1JlbGVhc2VQdHIoIHduZFB0ciApOwogICAgfQogICAgcmV0dXJuIGJSZXZlcnQgPyAwIDogcmV0dmFsdWU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIFNldFN5c3RlbU1lbnUgICAgKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgU2V0U3lzdGVtTWVudSggSFdORCBod25kLCBITUVOVSBoTWVudSApCnsKICAgIFdORCAqd25kUHRyID0gV0lOX0dldFB0ciggaHduZCApOwoKICAgIGlmICh3bmRQdHIgJiYgd25kUHRyICE9IFdORF9PVEhFUl9QUk9DRVNTICYmIHduZFB0ciAhPSBXTkRfREVTS1RPUCkKICAgIHsKCWlmICh3bmRQdHItPmhTeXNNZW51KSBEZXN0cm95TWVudSggd25kUHRyLT5oU3lzTWVudSApOwoJd25kUHRyLT5oU3lzTWVudSA9IE1FTlVfR2V0U3lzTWVudSggaHduZCwgaE1lbnUgKTsKICAgICAgICBXSU5fUmVsZWFzZVB0ciggd25kUHRyICk7CglyZXR1cm4gVFJVRTsKICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0TWVudSAgICAoVVNFUjMyLkApCiAqLwpITUVOVSBXSU5BUEkgR2V0TWVudSggSFdORCBoV25kICkKewogICAgSE1FTlUgcmV0dmFsdWUgPSAoSE1FTlUpR2V0V2luZG93TG9uZ1B0clcoIGhXbmQsIEdXTFBfSUQgKTsKICAgIFRSQUNFKCJmb3IgJXAgcmV0dXJuaW5nICVwXG4iLCBoV25kLCByZXR2YWx1ZSk7CiAgICByZXR1cm4gcmV0dmFsdWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0TWVudUJhckluZm8gICAgKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgR2V0TWVudUJhckluZm8oIEhXTkQgaHduZCwgTE9ORyBpZE9iamVjdCwgTE9ORyBpZEl0ZW0sIFBNRU5VQkFSSU5GTyBwbWJpICkKewogICAgRklYTUUoICIoJXAsMHglMDhseCwweCUwOGx4LCVwKVxuIiwgaHduZCwgaWRPYmplY3QsIGlkSXRlbSwgcG1iaSApOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIE1FTlVfU2V0TWVudQogKgogKiBIZWxwZXIgZm9yIFNldE1lbnUuIEFsc28gY2FsbGVkIGJ5IFdJTl9DcmVhdGVXaW5kb3dFeCB0byBhdm9pZCB0aGUKICogU2V0V2luZG93UG9zIGNhbGwgdGhhdCB3b3VsZCByZXN1bHQgaWYgU2V0TWVudSB3ZXJlIGNhbGxlZCBkaXJlY3RseS4KICovCkJPT0wgTUVOVV9TZXRNZW51KCBIV05EIGhXbmQsIEhNRU5VIGhNZW51ICkKewogICAgVFJBQ0UoIiglcCwgJXApO1xuIiwgaFduZCwgaE1lbnUpOwoKICAgIGlmIChoTWVudSAmJiAhSXNNZW51KGhNZW51KSkKICAgIHsKICAgICAgICBXQVJOKCJoTWVudSAlcCBpcyBub3QgYSBtZW51IGhhbmRsZVxuIiwgaE1lbnUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmICghV0lOX0FMTE9XRURfTUVOVShHZXRXaW5kb3dMb25nVyggaFduZCwgR1dMX1NUWUxFICkpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBoV25kID0gV0lOX0dldEZ1bGxIYW5kbGUoIGhXbmQgKTsKICAgIGlmIChHZXRDYXB0dXJlKCkgPT0gaFduZCkgTUVOVV9TZXRDYXB0dXJlKDApOyAgLyogcmVsZWFzZSB0aGUgY2FwdHVyZSAqLwoKICAgIGlmIChoTWVudSAhPSAwKQogICAgewogICAgICAgIExQUE9QVVBNRU5VIGxwbWVudTsKCiAgICAgICAgaWYgKCEobHBtZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KSkpIHJldHVybiBGQUxTRTsKCiAgICAgICAgbHBtZW51LT5oV25kID0gaFduZDsKICAgICAgICBscG1lbnUtPkhlaWdodCA9IDA7ICAvKiBNYWtlIHN1cmUgd2UgcmVjYWxjdWxhdGUgdGhlIHNpemUgKi8KICAgIH0KICAgIFNldFdpbmRvd0xvbmdQdHJXKCBoV25kLCBHV0xQX0lELCAoTE9OR19QVFIpaE1lbnUgKTsKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBTZXRNZW51ICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIFNldE1lbnUoIEhXTkQgaFduZCwgSE1FTlUgaE1lbnUgKQp7ICAgCiAgICBpZighTUVOVV9TZXRNZW51KGhXbmQsIGhNZW51KSkKICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgIFNldFdpbmRvd1BvcyggaFduZCwgMCwgMCwgMCwgMCwgMCwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfAogICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTdWJNZW51ICAgIChVU0VSMzIuQCkKICovCkhNRU5VIFdJTkFQSSBHZXRTdWJNZW51KCBITUVOVSBoTWVudSwgSU5UIG5Qb3MgKQp7CiAgICBNRU5VSVRFTSAqIGxwbWk7CgogICAgaWYgKCEobHBtaSA9IE1FTlVfRmluZEl0ZW0oJmhNZW51LCZuUG9zLE1GX0JZUE9TSVRJT04pKSkgcmV0dXJuIDA7CiAgICBpZiAoIShscG1pLT5mVHlwZSAmIE1GX1BPUFVQKSkgcmV0dXJuIDA7CiAgICByZXR1cm4gbHBtaS0+aFN1Yk1lbnU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIERyYXdNZW51QmFyICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIERyYXdNZW51QmFyKCBIV05EIGhXbmQgKQp7CiAgICBMUFBPUFVQTUVOVSBscHBvcDsKICAgIEhNRU5VIGhNZW51ID0gR2V0TWVudShoV25kKTsKCiAgICBpZiAoIVdJTl9BTExPV0VEX01FTlUoR2V0V2luZG93TG9uZ1coIGhXbmQsIEdXTF9TVFlMRSApKSkKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICBpZiAoIWhNZW51IHx8ICEobHBwb3AgPSBNRU5VX0dldE1lbnUoIGhNZW51ICkpKSByZXR1cm4gRkFMU0U7CgogICAgbHBwb3AtPkhlaWdodCA9IDA7IC8qIE1ha2Ugc3VyZSB3ZSBjYWxsIE1FTlVfTWVudUJhckNhbGNTaXplICovCiAgICBscHBvcC0+aHduZE93bmVyID0gaFduZDsKICAgIFNldFdpbmRvd1BvcyggaFduZCwgMCwgMCwgMCwgMCwgMCwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfAogICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERyYXdNZW51QmFyVGVtcCAgIChVU0VSMzIuQCkKICoKICogVU5ET0NVTUVOVEVEICEhCiAqCiAqIGNhbGxlZCBieSBXOThTRSBkZXNrLmNwbCBDb250cm9sIFBhbmVsIEFwcGxldAogKgogKiBOb3QgMTAwJSBzdXJlIGFib3V0IHRoZSBwYXJhbSBuYW1lcywgYnV0IGNsb3NlLgogKi8KRFdPUkQgV0lOQVBJIERyYXdNZW51QmFyVGVtcChIV05EIGh3bmQsIEhEQyBoREMsIExQUkVDVCBscHJlY3QsIEhNRU5VIGhNZW51LCBIRk9OVCBoRm9udCkKewogICAgTFBQT1BVUE1FTlUgbHBwb3A7CiAgICBVSU5UIGkscmV0dmFsdWU7CiAgICBIRk9OVCBoZm9udE9sZCA9IDA7CgogICAgaWYgKCFoTWVudSkKICAgICAgICBoTWVudSA9IEdldE1lbnUoaHduZCk7CgogICAgaWYgKCFoRm9udCkKICAgICAgICBoRm9udCA9IGhNZW51Rm9udDsKCiAgICBscHBvcCA9IE1FTlVfR2V0TWVudSggaE1lbnUgKTsKICAgIGlmIChscHBvcCA9PSBOVUxMIHx8IGxwcmVjdCA9PSBOVUxMKQogICAgewogICAgICAgIHJldHZhbHVlID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWU1FTlUpOwogICAgICAgIGdvdG8gRU5EOwogICAgfQoKICAgIFRSQUNFKCIoJXAsICVwLCAlcCwgJXAsICVwKVxuIiwgaHduZCwgaERDLCBscHJlY3QsIGhNZW51LCBoRm9udCk7CgogICAgaGZvbnRPbGQgPSBTZWxlY3RPYmplY3QoIGhEQywgaEZvbnQpOwoKICAgIGlmIChscHBvcC0+SGVpZ2h0ID09IDApCiAgICAgICAgTUVOVV9NZW51QmFyQ2FsY1NpemUoaERDLCBscHJlY3QsIGxwcG9wLCBod25kKTsKCiAgICBscHJlY3QtPmJvdHRvbSA9IGxwcmVjdC0+dG9wICsgbHBwb3AtPkhlaWdodDsKCiAgICBGaWxsUmVjdChoREMsIGxwcmVjdCwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9NRU5VKSApOwoKICAgIFNlbGVjdE9iamVjdCggaERDLCBTWVNDT0xPUl9HZXRQZW4oQ09MT1JfM0RGQUNFKSk7CiAgICBNb3ZlVG9FeCggaERDLCBscHJlY3QtPmxlZnQsIGxwcmVjdC0+Ym90dG9tLCBOVUxMICk7CiAgICBMaW5lVG8oIGhEQywgbHByZWN0LT5yaWdodCwgbHByZWN0LT5ib3R0b20gKTsKCiAgICBpZiAobHBwb3AtPm5JdGVtcyA9PSAwKQogICAgewogICAgICAgIHJldHZhbHVlID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWU1FTlUpOwogICAgICAgIGdvdG8gRU5EOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBscHBvcC0+bkl0ZW1zOyBpKyspCiAgICB7CiAgICAgICAgTUVOVV9EcmF3TWVudUl0ZW0oIGh3bmQsIGhNZW51LCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoREMsICZscHBvcC0+aXRlbXNbaV0sIGxwcG9wLT5IZWlnaHQsIFRSVUUsIE9EQV9EUkFXRU5USVJFICk7CiAgICB9CiAgICByZXR2YWx1ZSA9IGxwcG9wLT5IZWlnaHQ7CgpFTkQ6CiAgICBpZiAoaGZvbnRPbGQpIFNlbGVjdE9iamVjdCAoaERDLCBoZm9udE9sZCk7CiAgICByZXR1cm4gcmV0dmFsdWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgRW5kTWVudSAgIChVU0VSLjE4NykKICogICAgICAgICAgIEVuZE1lbnUgICAoVVNFUjMyLkApCiAqLwp2b2lkIFdJTkFQSSBFbmRNZW51KHZvaWQpCnsKICAgIC8qIGlmIHdlIGFyZSBpbiB0aGUgbWVudSBjb2RlLCBhbmQgaXQgaXMgYWN0aXZlICovCiAgICBpZiAoIWZFbmRNZW51ICYmIHRvcF9wb3B1cCkKICAgIHsKCS8qIHRlcm1pbmF0ZSB0aGUgbWVudSBoYW5kbGluZyBjb2RlICovCiAgICAgICAgZkVuZE1lbnUgPSBUUlVFOwoKCS8qIG5lZWRzIHRvIGJlIHBvc3RlZCB0byB3YWtldXAgdGhlIGludGVybmFsIG1lbnUgaGFuZGxlciAqLwoJLyogd2hpY2ggd2lsbCBub3cgdGVybWluYXRlIHRoZSBtZW51LCBpbiB0aGUgZXZlbnQgdGhhdCAqLwoJLyogdGhlIG1haW4gd2luZG93IHdhcyBtaW5pbWl6ZWQsIG9yIGxvc3QgZm9jdXMsIHNvIHdlICovCgkvKiBkb24ndCBlbmQgdXAgd2l0aCBhbiBvcnBoYW5lZCBtZW51ICovCiAgICAgICAgUG9zdE1lc3NhZ2VXKCB0b3BfcG9wdXAsIFdNX0NBTkNFTE1PREUsIDAsIDApOwogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBMb29rdXBNZW51SGFuZGxlICAgKFVTRVIuMjE3KQogKi8KSE1FTlUxNiBXSU5BUEkgTG9va3VwTWVudUhhbmRsZTE2KCBITUVOVTE2IGhtZW51LCBJTlQxNiBpZCApCnsKICAgIEhNRU5VIGhtZW51MzIgPSBITUVOVV8zMihobWVudSk7CiAgICBVSU5UIGlkMzIgPSBpZDsKICAgIGlmICghTUVOVV9GaW5kSXRlbSggJmhtZW51MzIsICZpZDMyLCBNRl9CWUNPTU1BTkQgKSkgcmV0dXJuIDA7CiAgICBlbHNlIHJldHVybiBITUVOVV8xNihobWVudTMyKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCSAgICBMb2FkTWVudSAgICAoVVNFUi4xNTApCiAqLwpITUVOVTE2IFdJTkFQSSBMb2FkTWVudTE2KCBISU5TVEFOQ0UxNiBpbnN0YW5jZSwgTFBDU1RSIG5hbWUgKQp7CiAgICBIUlNSQzE2IGhSc3JjOwogICAgSEdMT0JBTDE2IGhhbmRsZTsKICAgIEhNRU5VMTYgaE1lbnU7CgogICAgaWYgKEhJV09SRChuYW1lKSAmJiBuYW1lWzBdID09ICcjJykgbmFtZSA9IChMUENTVFIpYXRvaSggbmFtZSArIDEgKTsKICAgIGlmICghbmFtZSkgcmV0dXJuIDA7CgogICAgaW5zdGFuY2UgPSBHZXRFeGVQdHIoIGluc3RhbmNlICk7CiAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZTE2KCBpbnN0YW5jZSwgbmFtZSwgKExQU1RSKVJUX01FTlUgKSkpIHJldHVybiAwOwogICAgaWYgKCEoaGFuZGxlID0gTG9hZFJlc291cmNlMTYoIGluc3RhbmNlLCBoUnNyYyApKSkgcmV0dXJuIDA7CiAgICBoTWVudSA9IExvYWRNZW51SW5kaXJlY3QxNihMb2NrUmVzb3VyY2UxNihoYW5kbGUpKTsKICAgIEZyZWVSZXNvdXJjZTE2KCBoYW5kbGUgKTsKICAgIHJldHVybiBoTWVudTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgTG9hZE1lbnVBICAgKFVTRVIzMi5AKQogKi8KSE1FTlUgV0lOQVBJIExvYWRNZW51QSggSElOU1RBTkNFIGluc3RhbmNlLCBMUENTVFIgbmFtZSApCnsKICAgIEhSU1JDIGhyc3JjID0gRmluZFJlc291cmNlQSggaW5zdGFuY2UsIG5hbWUsIChMUFNUUilSVF9NRU5VICk7CiAgICBpZiAoIWhyc3JjKSByZXR1cm4gMDsKICAgIHJldHVybiBMb2FkTWVudUluZGlyZWN0QSggKExQQ1ZPSUQpTG9hZFJlc291cmNlKCBpbnN0YW5jZSwgaHJzcmMgKSk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgIExvYWRNZW51VyAgIChVU0VSMzIuQCkKICovCkhNRU5VIFdJTkFQSSBMb2FkTWVudVcoIEhJTlNUQU5DRSBpbnN0YW5jZSwgTFBDV1NUUiBuYW1lICkKewogICAgSFJTUkMgaHJzcmMgPSBGaW5kUmVzb3VyY2VXKCBpbnN0YW5jZSwgbmFtZSwgKExQV1NUUilSVF9NRU5VICk7CiAgICBpZiAoIWhyc3JjKSByZXR1cm4gMDsKICAgIHJldHVybiBMb2FkTWVudUluZGlyZWN0VyggKExQQ1ZPSUQpTG9hZFJlc291cmNlKCBpbnN0YW5jZSwgaHJzcmMgKSk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkgICAgTG9hZE1lbnVJbmRpcmVjdCAgICAoVVNFUi4yMjApCiAqLwpITUVOVTE2IFdJTkFQSSBMb2FkTWVudUluZGlyZWN0MTYoIExQQ1ZPSUQgdGVtcGxhdGUgKQp7CiAgICBITUVOVSBoTWVudTsKICAgIFdPUkQgdmVyc2lvbiwgb2Zmc2V0OwogICAgTFBDU1RSIHAgPSAoTFBDU1RSKXRlbXBsYXRlOwoKICAgIFRSQUNFKCIoJXApXG4iLCB0ZW1wbGF0ZSApOwogICAgdmVyc2lvbiA9IEdFVF9XT1JEKHApOwogICAgcCArPSBzaXplb2YoV09SRCk7CiAgICBpZiAodmVyc2lvbikKICAgIHsKICAgICAgICBXQVJOKCJ2ZXJzaW9uIG11c3QgYmUgMCBmb3IgV2luMTZcbiIgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIG9mZnNldCA9IEdFVF9XT1JEKHApOwogICAgcCArPSBzaXplb2YoV09SRCkgKyBvZmZzZXQ7CiAgICBpZiAoIShoTWVudSA9IENyZWF0ZU1lbnUoKSkpIHJldHVybiAwOwogICAgaWYgKCFNRU5VX1BhcnNlUmVzb3VyY2UoIHAsIGhNZW51LCBGQUxTRSApKQogICAgewogICAgICAgIERlc3Ryb3lNZW51KCBoTWVudSApOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIEhNRU5VXzE2KGhNZW51KTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCSAgICBMb2FkTWVudUluZGlyZWN0VyAgICAoVVNFUjMyLkApCiAqLwpITUVOVSBXSU5BUEkgTG9hZE1lbnVJbmRpcmVjdFcoIExQQ1ZPSUQgdGVtcGxhdGUgKQp7CiAgICBITUVOVSBoTWVudTsKICAgIFdPUkQgdmVyc2lvbiwgb2Zmc2V0OwogICAgTFBDU1RSIHAgPSAoTFBDU1RSKXRlbXBsYXRlOwoKICAgIHZlcnNpb24gPSBHRVRfV09SRChwKTsKICAgIHAgKz0gc2l6ZW9mKFdPUkQpOwogICAgVFJBQ0UoIiVwLCB2ZXIgJWRcbiIsIHRlbXBsYXRlLCB2ZXJzaW9uICk7CiAgICBzd2l0Y2ggKHZlcnNpb24pCiAgICB7CiAgICAgIGNhc2UgMDogLyogc3RhbmRhcmQgZm9ybWF0IGlzIHZlcnNpb24gb2YgMCAqLwoJb2Zmc2V0ID0gR0VUX1dPUkQocCk7CglwICs9IHNpemVvZihXT1JEKSArIG9mZnNldDsKCWlmICghKGhNZW51ID0gQ3JlYXRlTWVudSgpKSkgcmV0dXJuIDA7CglpZiAoIU1FTlVfUGFyc2VSZXNvdXJjZSggcCwgaE1lbnUsIFRSVUUgKSkKCSAgewoJICAgIERlc3Ryb3lNZW51KCBoTWVudSApOwoJICAgIHJldHVybiAwOwoJICB9CglyZXR1cm4gaE1lbnU7CiAgICAgIGNhc2UgMTogLyogZXh0ZW5kZWQgZm9ybWF0IGlzIHZlcnNpb24gb2YgMSAqLwoJb2Zmc2V0ID0gR0VUX1dPUkQocCk7CglwICs9IHNpemVvZihXT1JEKSArIG9mZnNldDsKCWlmICghKGhNZW51ID0gQ3JlYXRlTWVudSgpKSkgcmV0dXJuIDA7CglpZiAoIU1FTlVFWF9QYXJzZVJlc291cmNlKCBwLCBoTWVudSkpCgkgIHsKCSAgICBEZXN0cm95TWVudSggaE1lbnUgKTsKCSAgICByZXR1cm4gMDsKCSAgfQoJcmV0dXJuIGhNZW51OwogICAgICBkZWZhdWx0OgogICAgICAgIEVSUigidmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLlxuIiwgdmVyc2lvbik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkgICAgTG9hZE1lbnVJbmRpcmVjdEEgICAgKFVTRVIzMi5AKQogKi8KSE1FTlUgV0lOQVBJIExvYWRNZW51SW5kaXJlY3RBKCBMUENWT0lEIHRlbXBsYXRlICkKewogICAgcmV0dXJuIExvYWRNZW51SW5kaXJlY3RXKCB0ZW1wbGF0ZSApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzTWVudSAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBJc01lbnUoSE1FTlUgaG1lbnUpCnsKICAgIExQUE9QVVBNRU5VIG1lbnUgPSBNRU5VX0dldE1lbnUoaG1lbnUpOwogICAgcmV0dXJuIG1lbnUgIT0gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldE1lbnVJdGVtSW5mb19jb21tb24KICovCgpzdGF0aWMgQk9PTCBHZXRNZW51SXRlbUluZm9fY29tbW9uICggSE1FTlUgaG1lbnUsIFVJTlQgaXRlbSwgQk9PTCBieXBvcywKCQkJCQlMUE1FTlVJVEVNSU5GT1cgbHBtaWksIEJPT0wgdW5pY29kZSkKewogICAgTUVOVUlURU0gKm1lbnUgPSBNRU5VX0ZpbmRJdGVtICgmaG1lbnUsICZpdGVtLCBieXBvcz8gTUZfQllQT1NJVElPTiA6IDApOwoKICAgIGRlYnVnX3ByaW50X21lbnVpdGVtKCJHZXRNZW51SXRlbUluZm9fY29tbW9uOiAiLCBtZW51LCAiIik7CgogICAgaWYgKCFtZW51KQoJcmV0dXJuIEZBTFNFOwoKICAgIGlmIChscG1paS0+Zk1hc2sgJiBNSUlNX1RZUEUpIHsKCWxwbWlpLT5mVHlwZSA9IG1lbnUtPmZUeXBlOwoJc3dpdGNoIChNRU5VX0lURU1fVFlQRShtZW51LT5mVHlwZSkpIHsKCWNhc2UgTUZfU1RSSU5HOgogICAgICAgICAgICBicmVhazsgIC8qIHdpbGwgYmUgZG9uZSBiZWxvdyAqLwoJY2FzZSBNRl9PV05FUkRSQVc6CgljYXNlIE1GX0JJVE1BUDoKCSAgICBscG1paS0+ZHdUeXBlRGF0YSA9IG1lbnUtPnRleHQ7CgkgICAgLyogZmFsbCB0aHJvdWdoICovCglkZWZhdWx0OgoJICAgIGxwbWlpLT5jY2ggPSAwOwoJfQogICAgfQoKICAgIC8qIGNvcHkgdGhlIHRleHQgc3RyaW5nICovCiAgICBpZiAoKGxwbWlpLT5mTWFzayAmIChNSUlNX1RZUEV8TUlJTV9TVFJJTkcpKSAmJgogICAgICAgICAoTUVOVV9JVEVNX1RZUEUobWVudS0+ZlR5cGUpID09IE1GX1NUUklORykgJiYgbWVudS0+dGV4dCkKICAgIHsKICAgICAgICBpbnQgbGVuOwogICAgICAgIGlmICh1bmljb2RlKQogICAgICAgIHsKICAgICAgICAgICAgbGVuID0gc3RybGVuVyhtZW51LT50ZXh0KTsKICAgICAgICAgICAgaWYobHBtaWktPmR3VHlwZURhdGEgJiYgbHBtaWktPmNjaCkKICAgICAgICAgICAgICAgIGxzdHJjcHluVyhscG1paS0+ZHdUeXBlRGF0YSwgbWVudS0+dGV4dCwgbHBtaWktPmNjaCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX0FDUCwgMCwgbWVudS0+dGV4dCwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwgKTsKICAgICAgICAgICAgaWYobHBtaWktPmR3VHlwZURhdGEgJiYgbHBtaWktPmNjaCkKICAgICAgICAgICAgICAgIGlmICghV2lkZUNoYXJUb011bHRpQnl0ZSggQ1BfQUNQLCAwLCBtZW51LT50ZXh0LCAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQU1RSKWxwbWlpLT5kd1R5cGVEYXRhLCBscG1paS0+Y2NoLCBOVUxMLCBOVUxMICkpCiAgICAgICAgICAgICAgICAgICAgKChMUFNUUilscG1paS0+ZHdUeXBlRGF0YSlbbHBtaWktPmNjaC0xXSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIGlmIHdlJ3ZlIGNvcGllZCBhIHN1YnN0cmluZyB3ZSByZXR1cm4gaXRzIGxlbmd0aCAqLwogICAgICAgIGlmKGxwbWlpLT5kd1R5cGVEYXRhICYmIGxwbWlpLT5jY2gpCiAgICAgICAgewogICAgICAgICAgICBpZiAobHBtaWktPmNjaCA8PSBsZW4pIGxwbWlpLT5jY2gtLTsKICAgICAgICB9CiAgICAgICAgZWxzZSAvKiByZXR1cm4gbGVuZ3RoIG9mIHN0cmluZyAqLwogICAgICAgICAgICBscG1paS0+Y2NoID0gbGVuOwogICAgfQoKICAgIGlmIChscG1paS0+Zk1hc2sgJiBNSUlNX0ZUWVBFKQoJbHBtaWktPmZUeXBlID0gbWVudS0+ZlR5cGU7CgogICAgaWYgKGxwbWlpLT5mTWFzayAmIE1JSU1fQklUTUFQKQoJbHBtaWktPmhibXBJdGVtID0gbWVudS0+aGJtcEl0ZW07CgogICAgaWYgKGxwbWlpLT5mTWFzayAmIE1JSU1fU1RBVEUpCglscG1paS0+ZlN0YXRlID0gbWVudS0+ZlN0YXRlOwoKICAgIGlmIChscG1paS0+Zk1hc2sgJiBNSUlNX0lEKQoJbHBtaWktPndJRCA9IG1lbnUtPndJRDsKCiAgICBpZiAobHBtaWktPmZNYXNrICYgTUlJTV9TVUJNRU5VKQoJbHBtaWktPmhTdWJNZW51ID0gbWVudS0+aFN1Yk1lbnU7CgogICAgaWYgKGxwbWlpLT5mTWFzayAmIE1JSU1fQ0hFQ0tNQVJLUykgewoJbHBtaWktPmhibXBDaGVja2VkID0gbWVudS0+aENoZWNrQml0OwoJbHBtaWktPmhibXBVbmNoZWNrZWQgPSBtZW51LT5oVW5DaGVja0JpdDsKICAgIH0KICAgIGlmIChscG1paS0+Zk1hc2sgJiBNSUlNX0RBVEEpCglscG1paS0+ZHdJdGVtRGF0YSA9IG1lbnUtPmR3SXRlbURhdGE7CgogIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TWVudUl0ZW1JbmZvQSAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBHZXRNZW51SXRlbUluZm9BKCBITUVOVSBobWVudSwgVUlOVCBpdGVtLCBCT09MIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNRU5VSVRFTUlORk9BIGxwbWlpKQp7CiAgICByZXR1cm4gR2V0TWVudUl0ZW1JbmZvX2NvbW1vbiAoaG1lbnUsIGl0ZW0sIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBNRU5VSVRFTUlORk9XKWxwbWlpLCBGQUxTRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRNZW51SXRlbUluZm9XICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIEdldE1lbnVJdGVtSW5mb1coIEhNRU5VIGhtZW51LCBVSU5UIGl0ZW0sIEJPT0wgYnlwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE1FTlVJVEVNSU5GT1cgbHBtaWkpCnsKICAgIHJldHVybiBHZXRNZW51SXRlbUluZm9fY29tbW9uIChobWVudSwgaXRlbSwgYnlwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscG1paSwgVFJVRSk7Cn0KCgovKiBzZXQgYSBtZW51IGl0ZW0gdGV4dCBmcm9tIGEgQVNDSUkgb3IgVW5pY29kZSBzdHJpbmcgKi8KaW5saW5lIHN0YXRpYyB2b2lkIHNldF9tZW51X2l0ZW1fdGV4dCggTUVOVUlURU0gKm1lbnUsIExQQ1dTVFIgdGV4dCwgQk9PTCB1bmljb2RlICkKewogICAgaWYgKCF0ZXh0KQogICAgewogICAgICAgIG1lbnUtPnRleHQgPSBOVUxMOwogICAgICAgIG1lbnUtPmZUeXBlIHw9IE1GX1NFUEFSQVRPUjsKICAgIH0KICAgIGVsc2UgaWYgKHVuaWNvZGUpCiAgICB7CiAgICAgICAgaWYgKChtZW51LT50ZXh0ID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoc3RybGVuVyh0ZXh0KSsxKSAqIHNpemVvZihXQ0hBUikgKSkpCiAgICAgICAgICAgIHN0cmNweVcoIG1lbnUtPnRleHQsIHRleHQgKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBMUENTVFIgc3RyID0gKExQQ1NUUil0ZXh0OwogICAgICAgIGludCBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHN0ciwgLTEsIE5VTEwsIDAgKTsKICAgICAgICBpZiAoKG1lbnUtPnRleHQgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbiAqIHNpemVvZihXQ0hBUikgKSkpCiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgc3RyLCAtMSwgbWVudS0+dGV4dCwgbGVuICk7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0TWVudUl0ZW1JbmZvX2NvbW1vbgogKi8KCnN0YXRpYyBCT09MIFNldE1lbnVJdGVtSW5mb19jb21tb24oTUVOVUlURU0gKiBtZW51LAoJCQkJICAgICAgIGNvbnN0IE1FTlVJVEVNSU5GT1cgKmxwbWlpLAoJCQkJICAgICAgIEJPT0wgdW5pY29kZSkKewogICAgaWYgKCFtZW51KSByZXR1cm4gRkFMU0U7CgogICAgZGVidWdfcHJpbnRfbWVudWl0ZW0oIk1FTlVfU2V0SXRlbUluZm9fY29tbW9uIGZyb206ICIsIG1lbnUsICIiKTsKCiAgICBpZiAobHBtaWktPmZNYXNrICYgTUlJTV9UWVBFICkgewoJLyogR2V0IHJpZCBvZiBvbGQgc3RyaW5nLiAqLwoJaWYgKElTX1NUUklOR19JVEVNKG1lbnUtPmZUeXBlKSAmJiBtZW51LT50ZXh0KSB7CgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbWVudS0+dGV4dCk7CgkgICAgbWVudS0+dGV4dCA9IE5VTEw7Cgl9CgoJLyogbWFrZSBvbmx5IE1FTlVfSVRFTV9UWVBFIGJpdHMgaW4gbWVudS0+ZlR5cGUgZXF1YWwgbHBtaWktPmZUeXBlICovCgltZW51LT5mVHlwZSAmPSB+TUVOVV9JVEVNX1RZUEUobWVudS0+ZlR5cGUpOwoJbWVudS0+ZlR5cGUgfD0gTUVOVV9JVEVNX1RZUEUobHBtaWktPmZUeXBlKTsKCgltZW51LT50ZXh0ID0gbHBtaWktPmR3VHlwZURhdGE7CgogICAgICAgaWYgKElTX1NUUklOR19JVEVNKG1lbnUtPmZUeXBlKSkKICAgICAgICAgICBzZXRfbWVudV9pdGVtX3RleHQoIG1lbnUsIGxwbWlpLT5kd1R5cGVEYXRhLCB1bmljb2RlICk7CiAgICB9CgogICAgaWYgKGxwbWlpLT5mTWFzayAmIE1JSU1fRlRZUEUgKSB7CgkvKiBmcmVlIHRoZSBzdHJpbmcgd2hlbiB0aGUgdHlwZSBpcyBjaGFuZ2luZyAqLwoJaWYgKCAoIUlTX1NUUklOR19JVEVNKGxwbWlpLT5mVHlwZSkpICYmIElTX1NUUklOR19JVEVNKG1lbnUtPmZUeXBlKSAmJiBtZW51LT50ZXh0KSB7CgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbWVudS0+dGV4dCk7CgkgICAgbWVudS0+dGV4dCA9IE5VTEw7Cgl9CgltZW51LT5mVHlwZSAmPSB+TUVOVV9JVEVNX1RZUEUobWVudS0+ZlR5cGUpOwoJbWVudS0+ZlR5cGUgfD0gTUVOVV9JVEVNX1RZUEUobHBtaWktPmZUeXBlKTsKICAgICAgICBpZiAoIElTX1NUUklOR19JVEVNKG1lbnUtPmZUeXBlKSAmJiAhbWVudS0+dGV4dCApCiAgICAgICAgICAgIG1lbnUtPmZUeXBlIHw9IE1GX1NFUEFSQVRPUjsKICAgIH0KCiAgICBpZiAobHBtaWktPmZNYXNrICYgTUlJTV9TVFJJTkcgKSB7CglpZiAoSVNfU1RSSU5HX0lURU0obWVudS0+ZlR5cGUpKSB7CiAgICAgICAgICAgIC8qIGZyZWUgdGhlIHN0cmluZyB3aGVuIHVzZWQgKi8KICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbWVudS0+dGV4dCk7CiAgICAgICAgICAgIHNldF9tZW51X2l0ZW1fdGV4dCggbWVudSwgbHBtaWktPmR3VHlwZURhdGEsIHVuaWNvZGUgKTsKCX0KICAgIH0KCiAgICBpZiAobHBtaWktPmZNYXNrICYgTUlJTV9TVEFURSkKICAgIHsKCS8qIEZJWE1FOiBNRlNfREVGQVVMVCBkbyB3ZSBoYXZlIHRvIHJlc2V0IHRoZSBvdGhlciBtZW51IGl0ZW1zPyAqLwoJbWVudS0+ZlN0YXRlID0gbHBtaWktPmZTdGF0ZTsKICAgIH0KCiAgICBpZiAobHBtaWktPmZNYXNrICYgTUlJTV9JRCkKCW1lbnUtPndJRCA9IGxwbWlpLT53SUQ7CgogICAgaWYgKGxwbWlpLT5mTWFzayAmIE1JSU1fU1VCTUVOVSkgewoJbWVudS0+aFN1Yk1lbnUgPSBscG1paS0+aFN1Yk1lbnU7CglpZiAobWVudS0+aFN1Yk1lbnUpIHsKCSAgICBQT1BVUE1FTlUgKnN1Yk1lbnUgPSBNRU5VX0dldE1lbnUobWVudS0+aFN1Yk1lbnUpOwoJICAgIGlmIChzdWJNZW51KSB7CgkJc3ViTWVudS0+d0ZsYWdzIHw9IE1GX1BPUFVQOwoJCW1lbnUtPmZUeXBlIHw9IE1GX1BPUFVQOwoJICAgIH0KCSAgICBlbHNlCgkJLyogRklYTUU6IFJldHVybiBhbiBlcnJvciA/ICovCgkJbWVudS0+ZlR5cGUgJj0gfk1GX1BPUFVQOwoJfQoJZWxzZQoJICAgIG1lbnUtPmZUeXBlICY9IH5NRl9QT1BVUDsKICAgIH0KCiAgICBpZiAobHBtaWktPmZNYXNrICYgTUlJTV9DSEVDS01BUktTKQogICAgewogICAgICAgIGlmIChscG1paS0+ZlR5cGUgJiBNRlRfUkFESU9DSEVDSykKICAgICAgICAgICAgbWVudS0+ZlR5cGUgfD0gTUZUX1JBRElPQ0hFQ0s7CgoJbWVudS0+aENoZWNrQml0ID0gbHBtaWktPmhibXBDaGVja2VkOwoJbWVudS0+aFVuQ2hlY2tCaXQgPSBscG1paS0+aGJtcFVuY2hlY2tlZDsKICAgIH0KICAgIGlmIChscG1paS0+Zk1hc2sgJiBNSUlNX0RBVEEpCgltZW51LT5kd0l0ZW1EYXRhID0gbHBtaWktPmR3SXRlbURhdGE7CgogICAgaWYgKGxwbWlpLT5mTWFzayAmIE1JSU1fQklUTUFQKQoJbWVudS0+aGJtcEl0ZW0gPSBscG1paS0+aGJtcEl0ZW07CgogICAgZGVidWdfcHJpbnRfbWVudWl0ZW0oIlNldE1lbnVJdGVtSW5mb19jb21tb24gdG8gOiAiLCBtZW51LCAiIik7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldE1lbnVJdGVtSW5mb0EgICAgKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgU2V0TWVudUl0ZW1JbmZvQShITUVOVSBobWVudSwgVUlOVCBpdGVtLCBCT09MIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRU5VSVRFTUlORk9BICpscG1paSkKewogICAgcmV0dXJuIFNldE1lbnVJdGVtSW5mb19jb21tb24oTUVOVV9GaW5kSXRlbSgmaG1lbnUsICZpdGVtLCBieXBvcz8gTUZfQllQT1NJVElPTiA6IDApLAoJCQkJICAgIChjb25zdCBNRU5VSVRFTUlORk9XICopbHBtaWksIEZBTFNFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldE1lbnVJdGVtSW5mb1cgICAgKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgU2V0TWVudUl0ZW1JbmZvVyhITUVOVSBobWVudSwgVUlOVCBpdGVtLCBCT09MIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRU5VSVRFTUlORk9XICpscG1paSkKewogICAgcmV0dXJuIFNldE1lbnVJdGVtSW5mb19jb21tb24oTUVOVV9GaW5kSXRlbSgmaG1lbnUsICZpdGVtLCBieXBvcz8gTUZfQllQT1NJVElPTiA6IDApLAoJCQkJICAgIGxwbWlpLCBUUlVFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldE1lbnVEZWZhdWx0SXRlbSAgICAoVVNFUjMyLkApCiAqCiAqLwpCT09MIFdJTkFQSSBTZXRNZW51RGVmYXVsdEl0ZW0oSE1FTlUgaG1lbnUsIFVJTlQgdUl0ZW0sIFVJTlQgYnlwb3MpCnsKCVVJTlQgaTsKCVBPUFVQTUVOVSAqbWVudTsKCU1FTlVJVEVNICppdGVtOwoKCVRSQUNFKCIoJXAsJWQsJWQpXG4iLCBobWVudSwgdUl0ZW0sIGJ5cG9zKTsKCglpZiAoIShtZW51ID0gTUVOVV9HZXRNZW51KGhtZW51KSkpIHJldHVybiBGQUxTRTsKCgkvKiByZXNldCBhbGwgZGVmYXVsdC1pdGVtIGZsYWdzICovCglpdGVtID0gbWVudS0+aXRlbXM7Cglmb3IgKGkgPSAwOyBpIDwgbWVudS0+bkl0ZW1zOyBpKyssIGl0ZW0rKykKCXsKCSAgICBpdGVtLT5mU3RhdGUgJj0gfk1GU19ERUZBVUxUOwoJfQoKCS8qIG5vIGRlZmF1bHQgaXRlbSAqLwoJaWYgKCAtMSA9PSB1SXRlbSkKCXsKCSAgICByZXR1cm4gVFJVRTsKCX0KCglpdGVtID0gbWVudS0+aXRlbXM7CglpZiAoIGJ5cG9zICkKCXsKCSAgICBpZiAoIHVJdGVtID49IG1lbnUtPm5JdGVtcyApIHJldHVybiBGQUxTRTsKCSAgICBpdGVtW3VJdGVtXS5mU3RhdGUgfD0gTUZTX0RFRkFVTFQ7CgkgICAgcmV0dXJuIFRSVUU7Cgl9CgllbHNlCgl7CgkgICAgZm9yIChpID0gMDsgaSA8IG1lbnUtPm5JdGVtczsgaSsrLCBpdGVtKyspCgkgICAgewoJCWlmIChpdGVtLT53SUQgPT0gdUl0ZW0pCgkJewoJCSAgICAgaXRlbS0+ZlN0YXRlIHw9IE1GU19ERUZBVUxUOwoJCSAgICAgcmV0dXJuIFRSVUU7CgkJfQoJICAgIH0KCgl9CglyZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRNZW51RGVmYXVsdEl0ZW0gICAgKFVTRVIzMi5AKQogKi8KVUlOVCBXSU5BUEkgR2V0TWVudURlZmF1bHRJdGVtKEhNRU5VIGhtZW51LCBVSU5UIGJ5cG9zLCBVSU5UIGZsYWdzKQp7CglQT1BVUE1FTlUgKm1lbnU7CglNRU5VSVRFTSAqIGl0ZW07CglVSU5UIGkgPSAwOwoKCVRSQUNFKCIoJXAsJWQsJWQpXG4iLCBobWVudSwgYnlwb3MsIGZsYWdzKTsKCglpZiAoIShtZW51ID0gTUVOVV9HZXRNZW51KGhtZW51KSkpIHJldHVybiAtMTsKCgkvKiBmaW5kIGRlZmF1bHQgaXRlbSAqLwoJaXRlbSA9IG1lbnUtPml0ZW1zOwoKCS8qIGVtcHR5IG1lbnUgKi8KCWlmICghIGl0ZW0pIHJldHVybiAtMTsKCgl3aGlsZSAoICEoIGl0ZW0tPmZTdGF0ZSAmIE1GU19ERUZBVUxUICkgKQoJewoJICAgIGkrKzsgaXRlbSsrOwoJICAgIGlmICAoaSA+PSBtZW51LT5uSXRlbXMgKSByZXR1cm4gLTE7Cgl9CgoJLyogZGVmYXVsdDogZG9uJ3QgcmV0dXJuIGRpc2FibGVkIGl0ZW1zICovCglpZiAoICghKEdNRElfVVNFRElTQUJMRUQgJiBmbGFncykpICYmIChpdGVtLT5mU3RhdGUgJiBNRlNfRElTQUJMRUQgKSkgcmV0dXJuIC0xOwoKCS8qIHNlYXJjaCByZWt1cnNpdiB3aGVuIG5lZWRlZCAqLwoJaWYgKCAoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgJiYgIChmbGFncyAmIEdNRElfR09JTlRPUE9QVVBTKSApCgl7CgkgICAgVUlOVCByZXQ7CgkgICAgcmV0ID0gR2V0TWVudURlZmF1bHRJdGVtKCBpdGVtLT5oU3ViTWVudSwgYnlwb3MsIGZsYWdzICk7CgkgICAgaWYgKCAtMSAhPSByZXQgKSByZXR1cm4gcmV0OwoKCSAgICAvKiB3aGVuIGl0ZW0gbm90IGZvdW5kIGluIHN1Ym1lbnUsIHJldHVybiB0aGUgcG9wdXAgaXRlbSAqLwoJfQoJcmV0dXJuICggYnlwb3MgKSA/IGkgOiBpdGVtLT53SUQ7Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUluc2VydE1lbnVJdGVtQSAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBJbnNlcnRNZW51SXRlbUEoSE1FTlUgaE1lbnUsIFVJTlQgdUl0ZW0sIEJPT0wgYnlwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUVOVUlURU1JTkZPQSAqbHBtaWkpCnsKICAgIE1FTlVJVEVNICppdGVtID0gTUVOVV9JbnNlcnRJdGVtKGhNZW51LCB1SXRlbSwgYnlwb3MgPyBNRl9CWVBPU0lUSU9OIDogMCApOwogICAgcmV0dXJuIFNldE1lbnVJdGVtSW5mb19jb21tb24oaXRlbSwgKGNvbnN0IE1FTlVJVEVNSU5GT1cgKilscG1paSwgRkFMU0UpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUluc2VydE1lbnVJdGVtVyAgICAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBJbnNlcnRNZW51SXRlbVcoSE1FTlUgaE1lbnUsIFVJTlQgdUl0ZW0sIEJPT0wgYnlwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUVOVUlURU1JTkZPVyAqbHBtaWkpCnsKICAgIE1FTlVJVEVNICppdGVtID0gTUVOVV9JbnNlcnRJdGVtKGhNZW51LCB1SXRlbSwgYnlwb3MgPyBNRl9CWVBPU0lUSU9OIDogMCApOwogICAgcmV0dXJuIFNldE1lbnVJdGVtSW5mb19jb21tb24oaXRlbSwgbHBtaWksIFRSVUUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ2hlY2tNZW51UmFkaW9JdGVtICAgIChVU0VSMzIuQCkKICovCgpCT09MIFdJTkFQSSBDaGVja01lbnVSYWRpb0l0ZW0oSE1FTlUgaE1lbnUsCgkJCQkgICBVSU5UIGZpcnN0LCBVSU5UIGxhc3QsIFVJTlQgY2hlY2ssCgkJCQkgICBVSU5UIGJ5cG9zKQp7CiAgICAgTUVOVUlURU0gKm1pZmlyc3QsICptaWxhc3QsICptaWNoZWNrOwogICAgIEhNRU5VIG1maXJzdCA9IGhNZW51LCBtbGFzdCA9IGhNZW51LCBtY2hlY2sgPSBoTWVudTsKCiAgICAgVFJBQ0UoIiVwOiAlZC0lZCwgY2hlY2sgJWQsIGJ5cG9zPSVkXG4iLCBoTWVudSwgZmlyc3QsIGxhc3QsIGNoZWNrLCBieXBvcyk7CgogICAgIG1pZmlyc3QgPSBNRU5VX0ZpbmRJdGVtICgmbWZpcnN0LCAmZmlyc3QsIGJ5cG9zKTsKICAgICBtaWxhc3QgPSBNRU5VX0ZpbmRJdGVtICgmbWxhc3QsICZsYXN0LCBieXBvcyk7CiAgICAgbWljaGVjayA9IE1FTlVfRmluZEl0ZW0gKCZtY2hlY2ssICZjaGVjaywgYnlwb3MpOwoKICAgICBpZiAobWlmaXJzdCA9PSBOVUxMIHx8IG1pbGFzdCA9PSBOVUxMIHx8IG1pY2hlY2sgPT0gTlVMTCB8fAoJIG1pZmlyc3QgPiBtaWxhc3QgfHwgbWZpcnN0ICE9IG1sYXN0IHx8IG1maXJzdCAhPSBtY2hlY2sgfHwKCSBtaWNoZWNrID4gbWlsYXN0IHx8IG1pY2hlY2sgPCBtaWZpcnN0KQoJICByZXR1cm4gRkFMU0U7CgogICAgIHdoaWxlIChtaWZpcnN0IDw9IG1pbGFzdCkKICAgICB7CgkgIGlmIChtaWZpcnN0ID09IG1pY2hlY2spCgkgIHsKCSAgICAgICBtaWZpcnN0LT5mVHlwZSB8PSBNRlRfUkFESU9DSEVDSzsKCSAgICAgICBtaWZpcnN0LT5mU3RhdGUgfD0gTUZTX0NIRUNLRUQ7CgkgIH0gZWxzZSB7CgkgICAgICAgbWlmaXJzdC0+ZlR5cGUgJj0gfk1GVF9SQURJT0NIRUNLOwoJICAgICAgIG1pZmlyc3QtPmZTdGF0ZSAmPSB+TUZTX0NIRUNLRUQ7CgkgIH0KCSAgbWlmaXJzdCsrOwogICAgIH0KCiAgICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TWVudUl0ZW1SZWN0ICAgIChVU0VSMzIuQCkKICoKICogICAgICBBVFRFTlRJT046IEhlcmUsIHRoZSByZXR1cm5lZCB2YWx1ZXMgaW4gcmVjdCBhcmUgdGhlIHNjcmVlbgogKiAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGl0ZW0ganVzdCBsaWtlIGlmIHRoZSBtZW51IHdhcwogKiAgICAgICAgICAgICAgICAgYWx3YXlzIG9uIHRoZSB1cHBlciBsZWZ0IHNpZGUgb2YgdGhlIGFwcGxpY2F0aW9uLgogKgogKi8KQk9PTCBXSU5BUEkgR2V0TWVudUl0ZW1SZWN0IChIV05EIGh3bmQsIEhNRU5VIGhNZW51LCBVSU5UIHVJdGVtLAoJCQkJIExQUkVDVCByZWN0KQp7CiAgICAgUE9QVVBNRU5VICppdGVtTWVudTsKICAgICBNRU5VSVRFTSAqaXRlbTsKICAgICBIV05EIHJlZmVyZW5jZUh3bmQ7CgogICAgIFRSQUNFKCIoJXAsJXAsJWQsJXApXG4iLCBod25kLCBoTWVudSwgdUl0ZW0sIHJlY3QpOwoKICAgICBpdGVtID0gTUVOVV9GaW5kSXRlbSAoJmhNZW51LCAmdUl0ZW0sIE1GX0JZUE9TSVRJT04pOwogICAgIHJlZmVyZW5jZUh3bmQgPSBod25kOwoKICAgICBpZighaHduZCkKICAgICB7CgkgaXRlbU1lbnUgPSBNRU5VX0dldE1lbnUoaE1lbnUpOwoJIGlmIChpdGVtTWVudSA9PSBOVUxMKQoJICAgICByZXR1cm4gRkFMU0U7CgoJIGlmKGl0ZW1NZW51LT5oV25kID09IDApCgkgICAgIHJldHVybiBGQUxTRTsKCSByZWZlcmVuY2VId25kID0gaXRlbU1lbnUtPmhXbmQ7CiAgICAgfQoKICAgICBpZiAoKHJlY3QgPT0gTlVMTCkgfHwgKGl0ZW0gPT0gTlVMTCkpCgkgcmV0dXJuIEZBTFNFOwoKICAgICAqcmVjdCA9IGl0ZW0tPnJlY3Q7CgogICAgIE1hcFdpbmRvd1BvaW50cyhyZWZlcmVuY2VId25kLCAwLCAoTFBQT0lOVClyZWN0LCAyKTsKCiAgICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0TWVudUluZm8gICAgKFVTRVIzMi5AKQogKgogKiBGSVhNRQogKglNSU1fQVBQTFlUT1NVQk1FTlVTCiAqCWFjdHVhbGx5IHVzZSB0aGUgaXRlbXMgdG8gZHJhdyB0aGUgbWVudQogKi8KQk9PTCBXSU5BUEkgU2V0TWVudUluZm8gKEhNRU5VIGhNZW51LCBMUENNRU5VSU5GTyBscG1pKQp7CiAgICBQT1BVUE1FTlUgKm1lbnU7CgogICAgVFJBQ0UoIiglcCAlcClcbiIsIGhNZW51LCBscG1pKTsKCiAgICBpZiAobHBtaSAmJiAobHBtaS0+Y2JTaXplPT1zaXplb2YoTUVOVUlORk8pKSAmJiAobWVudSA9IE1FTlVfR2V0TWVudShoTWVudSkpKQogICAgewoKCWlmIChscG1pLT5mTWFzayAmIE1JTV9CQUNLR1JPVU5EKQoJICAgIG1lbnUtPmhickJhY2sgPSBscG1pLT5oYnJCYWNrOwoKCWlmIChscG1pLT5mTWFzayAmIE1JTV9IRUxQSUQpCgkgICAgbWVudS0+ZHdDb250ZXh0SGVscElEID0gbHBtaS0+ZHdDb250ZXh0SGVscElEOwoKCWlmIChscG1pLT5mTWFzayAmIE1JTV9NQVhIRUlHSFQpCgkgICAgbWVudS0+Y3lNYXggPSBscG1pLT5jeU1heDsKCglpZiAobHBtaS0+Zk1hc2sgJiBNSU1fTUVOVURBVEEpCgkgICAgbWVudS0+ZHdNZW51RGF0YSA9IGxwbWktPmR3TWVudURhdGE7CgoJaWYgKGxwbWktPmZNYXNrICYgTUlNX1NUWUxFKQoJewoJICAgIG1lbnUtPmR3U3R5bGUgPSBscG1pLT5kd1N0eWxlOwoJICAgIGlmIChtZW51LT5kd1N0eWxlICYgTU5TX0FVVE9ESVNNSVNTKSBGSVhNRSgiTU5TX0FVVE9ESVNNSVNTIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgIGlmIChtZW51LT5kd1N0eWxlICYgTU5TX0RSQUdEUk9QKSBGSVhNRSgiTU5TX0RSQUdEUk9QIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgIGlmIChtZW51LT5kd1N0eWxlICYgTU5TX01PREVMRVNTKSBGSVhNRSgiTU5TX01PREVMRVNTIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgIGlmIChtZW51LT5kd1N0eWxlICYgTU5TX05PQ0hFQ0spIEZJWE1FKCJNTlNfTk9DSEVDSyB1bmltcGxlbWVudGVkXG4iKTsKCSAgICBpZiAobWVudS0+ZHdTdHlsZSAmIE1OU19OT1RJRllCWVBPUykgRklYTUUoIk1OU19OT1RJRllCWVBPUyB1bmltcGxlbWVudGVkXG4iKTsKCX0KCglyZXR1cm4gVFJVRTsKICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldE1lbnVJbmZvICAgIChVU0VSMzIuQCkKICoKICogIE5PVEVTCiAqCXdpbjk4L05UNS4wCiAqCiAqLwpCT09MIFdJTkFQSSBHZXRNZW51SW5mbyAoSE1FTlUgaE1lbnUsIExQTUVOVUlORk8gbHBtaSkKeyAgIFBPUFVQTUVOVSAqbWVudTsKCiAgICBUUkFDRSgiKCVwICVwKVxuIiwgaE1lbnUsIGxwbWkpOwoKICAgIGlmIChscG1pICYmIChtZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KSkpCiAgICB7CgoJaWYgKGxwbWktPmZNYXNrICYgTUlNX0JBQ0tHUk9VTkQpCgkgICAgbHBtaS0+aGJyQmFjayA9IG1lbnUtPmhickJhY2s7CgoJaWYgKGxwbWktPmZNYXNrICYgTUlNX0hFTFBJRCkKCSAgICBscG1pLT5kd0NvbnRleHRIZWxwSUQgPSBtZW51LT5kd0NvbnRleHRIZWxwSUQ7CgoJaWYgKGxwbWktPmZNYXNrICYgTUlNX01BWEhFSUdIVCkKCSAgICBscG1pLT5jeU1heCA9IG1lbnUtPmN5TWF4OwoKCWlmIChscG1pLT5mTWFzayAmIE1JTV9NRU5VREFUQSkKCSAgICBscG1pLT5kd01lbnVEYXRhID0gbWVudS0+ZHdNZW51RGF0YTsKCglpZiAobHBtaS0+Zk1hc2sgJiBNSU1fU1RZTEUpCgkgICAgbHBtaS0+ZHdTdHlsZSA9IG1lbnUtPmR3U3R5bGU7CgoJcmV0dXJuIFRSVUU7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIFNldE1lbnVDb250ZXh0SGVscElkICAgIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIFNldE1lbnVDb250ZXh0SGVscElkKCBITUVOVSBoTWVudSwgRFdPUkQgZHdDb250ZXh0SGVscElEKQp7CiAgICBMUFBPUFVQTUVOVSBtZW51OwoKICAgIFRSQUNFKCIoJXAgMHglMDhseClcbiIsIGhNZW51LCBkd0NvbnRleHRIZWxwSUQpOwoKICAgIGlmICgobWVudSA9IE1FTlVfR2V0TWVudShoTWVudSkpKQogICAgewoJbWVudS0+ZHdDb250ZXh0SGVscElEID0gZHdDb250ZXh0SGVscElEOwoJcmV0dXJuIFRSVUU7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldE1lbnVDb250ZXh0SGVscElkICAgIChVU0VSMzIuQCkKICovCkRXT1JEIFdJTkFQSSBHZXRNZW51Q29udGV4dEhlbHBJZCggSE1FTlUgaE1lbnUgKQp7CiAgICBMUFBPUFVQTUVOVSBtZW51OwoKICAgIFRSQUNFKCIoJXApXG4iLCBoTWVudSk7CgogICAgaWYgKChtZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KSkpCiAgICB7CglyZXR1cm4gbWVudS0+ZHdDb250ZXh0SGVscElEOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgTWVudUl0ZW1Gcm9tUG9pbnQgICAgKFVTRVIzMi5AKQogKi8KSU5UIFdJTkFQSSBNZW51SXRlbUZyb21Qb2ludChIV05EIGhXbmQsIEhNRU5VIGhNZW51LCBQT0lOVCBwdFNjcmVlbikKewogICAgUE9QVVBNRU5VICptZW51ID0gTUVOVV9HZXRNZW51KGhNZW51KTsKICAgIFVJTlQgcG9zOwoKICAgIC8qRklYTUU6IERvIHdlIGhhdmUgdG8gaGFuZGxlIGhXbmQgaGVyZT8gKi8KICAgIGlmICghbWVudSkgcmV0dXJuIC0xOwogICAgaWYgKCFNRU5VX0ZpbmRJdGVtQnlDb29yZHMobWVudSwgcHRTY3JlZW4sICZwb3MpKSByZXR1cm4gLTE7CiAgICByZXR1cm4gcG9zOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHRyYW5zbGF0ZV9hY2NlbGVyYXRvcgogKi8Kc3RhdGljIEJPT0wgdHJhbnNsYXRlX2FjY2VsZXJhdG9yKCBIV05EIGhXbmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWVRFIGZWaXJ0LCBXT1JEIGtleSwgV09SRCBjbWQgKQp7CiAgICBJTlQgbWFzayA9IDA7CiAgICBVSU5UIG1lc2cgPSAwOwoKICAgIGlmICh3UGFyYW0gIT0ga2V5KSByZXR1cm4gRkFMU0U7CgogICAgaWYgKEdldEtleVN0YXRlKFZLX0NPTlRST0wpICYgMHg4MDAwKSBtYXNrIHw9IEZDT05UUk9MOwogICAgaWYgKEdldEtleVN0YXRlKFZLX01FTlUpICYgMHg4MDAwKSBtYXNrIHw9IEZBTFQ7CiAgICBpZiAoR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwKSBtYXNrIHw9IEZTSElGVDsKCiAgICBpZiAobWVzc2FnZSA9PSBXTV9DSEFSIHx8IG1lc3NhZ2UgPT0gV01fU1lTQ0hBUikKICAgIHsKICAgICAgICBpZiAoICEoZlZpcnQgJiBGVklSVEtFWSkgJiYgKG1hc2sgJiBGQUxUKSA9PSAoZlZpcnQgJiBGQUxUKSApCiAgICAgICAgewogICAgICAgICAgICBUUkFDRV8oYWNjZWwpKCJmb3VuZCBhY2NlbCBmb3IgV01fQ0hBUjogKCclYycpXG4iLCB3UGFyYW0gJiAweGZmKTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYoZlZpcnQgJiBGVklSVEtFWSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFXyhhY2NlbCkoImZvdW5kIGFjY2VsIGZvciB2aXJ0X2tleSAlMDR4IChzY2FuICUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHdQYXJhbSwgMHhmZiAmIEhJV09SRChsUGFyYW0pKTsKCiAgICAgICAgICAgIGlmKG1hc2sgPT0gKGZWaXJ0ICYgKEZTSElGVCB8IEZDT05UUk9MIHwgRkFMVCkpKSBnb3RvIGZvdW5kOwogICAgICAgICAgICBUUkFDRV8oYWNjZWwpKCIsIGJ1dCBpbmNvcnJlY3QgU0hJRlQvQ1RSTC9BTFQtc3RhdGVcbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoIShsUGFyYW0gJiAweDAxMDAwMDAwKSkgIC8qIG5vIHNwZWNpYWxfa2V5ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgoZlZpcnQgJiBGQUxUKSAmJiAobFBhcmFtICYgMHgyMDAwMDAwMCkpCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXl4gQUxUIHByZXNzZWQgKi8KICAgICAgICAgICAgICAgICAgICBUUkFDRV8oYWNjZWwpKCJmb3VuZCBhY2NlbCBmb3IgQWx0LSVjXG4iLCB3UGFyYW0gJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIEZBTFNFOwoKIGZvdW5kOgogICAgaWYgKG1lc3NhZ2UgPT0gV01fS0VZVVAgfHwgbWVzc2FnZSA9PSBXTV9TWVNLRVlVUCkKICAgICAgICBtZXNnID0gMTsKICAgIGVsc2UKICAgIHsKICAgICAgICBITUVOVSBoTWVudSwgaFN1Yk1lbnUsIGhTeXNNZW51OwogICAgICAgIFVJTlQgdVN5c1N0YXQgPSAoVUlOVCktMSwgdVN0YXQgPSAoVUlOVCktMSwgblBvczsKCiAgICAgICAgaE1lbnUgPSAoR2V0V2luZG93TG9uZ1coIGhXbmQsIEdXTF9TVFlMRSApICYgV1NfQ0hJTEQpID8gMCA6IEdldE1lbnUoaFduZCk7CiAgICAgICAgaFN5c01lbnUgPSBnZXRfd2luX3N5c19tZW51KCBoV25kICk7CgogICAgICAgIC8qIGZpbmQgbWVudSBpdGVtIGFuZCBhc2sgYXBwbGljYXRpb24gdG8gaW5pdGlhbGl6ZSBpdCAqLwogICAgICAgIC8qIDEuIGluIHRoZSBzeXN0ZW0gbWVudSAqLwogICAgICAgIGhTdWJNZW51ID0gaFN5c01lbnU7CiAgICAgICAgblBvcyA9IGNtZDsKICAgICAgICBpZihNRU5VX0ZpbmRJdGVtKCZoU3ViTWVudSwgJm5Qb3MsIE1GX0JZQ09NTUFORCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoR2V0Q2FwdHVyZSgpKQogICAgICAgICAgICAgICAgbWVzZyA9IDI7CiAgICAgICAgICAgIGlmICghSXNXaW5kb3dFbmFibGVkKGhXbmQpKQogICAgICAgICAgICAgICAgbWVzZyA9IDM7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2VXKGhXbmQsIFdNX0lOSVRNRU5VLCAoV1BBUkFNKWhTeXNNZW51LCAwTCk7CiAgICAgICAgICAgICAgICBpZihoU3ViTWVudSAhPSBoU3lzTWVudSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuUG9zID0gTUVOVV9GaW5kU3ViTWVudSgmaFN5c01lbnUsIGhTdWJNZW51KTsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oYWNjZWwpKCJoU3lzTWVudSA9ICVwLCBoU3ViTWVudSA9ICVwLCBuUG9zID0gJWRcbiIsIGhTeXNNZW51LCBoU3ViTWVudSwgblBvcyk7CiAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2VXKGhXbmQsIFdNX0lOSVRNRU5VUE9QVVAsIChXUEFSQU0paFN1Yk1lbnUsIE1BS0VMUEFSQU0oblBvcywgVFJVRSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdVN5c1N0YXQgPSBHZXRNZW51U3RhdGUoR2V0U3ViTWVudShoU3lzTWVudSwgMCksIGNtZCwgTUZfQllDT01NQU5EKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIC8qIDIuIGluIHRoZSB3aW5kb3cncyBtZW51ICovCiAgICAgICAgewogICAgICAgICAgICBoU3ViTWVudSA9IGhNZW51OwogICAgICAgICAgICBuUG9zID0gY21kOwogICAgICAgICAgICBpZihNRU5VX0ZpbmRJdGVtKCZoU3ViTWVudSwgJm5Qb3MsIE1GX0JZQ09NTUFORCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChHZXRDYXB0dXJlKCkpCiAgICAgICAgICAgICAgICAgICAgbWVzZyA9IDI7CiAgICAgICAgICAgICAgICBpZiAoIUlzV2luZG93RW5hYmxlZChoV25kKSkKICAgICAgICAgICAgICAgICAgICBtZXNnID0gMzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZVcoaFduZCwgV01fSU5JVE1FTlUsIChXUEFSQU0paE1lbnUsIDBMKTsKICAgICAgICAgICAgICAgICAgICBpZihoU3ViTWVudSAhPSBoTWVudSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5Qb3MgPSBNRU5VX0ZpbmRTdWJNZW51KCZoTWVudSwgaFN1Yk1lbnUpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oYWNjZWwpKCJoTWVudSA9ICVwLCBoU3ViTWVudSA9ICVwLCBuUG9zID0gJWRcbiIsIGhNZW51LCBoU3ViTWVudSwgblBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlVyhoV25kLCBXTV9JTklUTUVOVVBPUFVQLCAoV1BBUkFNKWhTdWJNZW51LCBNQUtFTFBBUkFNKG5Qb3MsIEZBTFNFKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVTdGF0ID0gR2V0TWVudVN0YXRlKGhNZW51LCBjbWQsIE1GX0JZQ09NTUFORCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChtZXNnID09IDApCiAgICAgICAgewogICAgICAgICAgICBpZiAodVN5c1N0YXQgIT0gKFVJTlQpLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1U3lzU3RhdCAmIChNRl9ESVNBQkxFRHxNRl9HUkFZRUQpKQogICAgICAgICAgICAgICAgICAgIG1lc2c9NDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBtZXNnPVdNX1NZU0NPTU1BTkQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodVN0YXQgIT0gKFVJTlQpLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKElzSWNvbmljKGhXbmQpKQogICAgICAgICAgICAgICAgICAgICAgICBtZXNnPTU7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVTdGF0ICYgKE1GX0RJU0FCTEVEfE1GX0dSQVlFRCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNnPTY7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc2c9V01fQ09NTUFORDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgbWVzZz1XTV9DT01NQU5EOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmKCBtZXNnPT1XTV9DT01NQU5EICkKICAgIHsKICAgICAgICBUUkFDRV8oYWNjZWwpKCIsIHNlbmRpbmcgV01fQ09NTUFORCwgd1BhcmFtPSUweFxuIiwgMHgxMDAwMCB8IGNtZCk7CiAgICAgICAgU2VuZE1lc3NhZ2VXKGhXbmQsIG1lc2csIDB4MTAwMDAgfCBjbWQsIDBMKTsKICAgIH0KICAgIGVsc2UgaWYoIG1lc2c9PVdNX1NZU0NPTU1BTkQgKQogICAgewogICAgICAgIFRSQUNFXyhhY2NlbCkoIiwgc2VuZGluZyBXTV9TWVNDT01NQU5ELCB3UGFyYW09JTB4XG4iLCBjbWQpOwogICAgICAgIFNlbmRNZXNzYWdlVyhoV25kLCBtZXNnLCBjbWQsIDB4MDAwMTAwMDBMKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiAgc29tZSByZWFzb25zIGZvciBOT1Qgc2VuZGluZyB0aGUgV01fe1NZU31DT01NQU5EIG1lc3NhZ2U6CiAgICAgICAgICogICAjMDogdW5rbm93biAocGxlYXNlIHJlcG9ydCEpCiAgICAgICAgICogICAjMTogZm9yIFdNX0tFWVVQLFdNX1NZU0tFWVVQCiAgICAgICAgICogICAjMjogbW91c2UgaXMgY2FwdHVyZWQKICAgICAgICAgKiAgICMzOiB3aW5kb3cgaXMgZGlzYWJsZWQKICAgICAgICAgKiAgICM0OiBpdCdzIGEgZGlzYWJsZWQgc3lzdGVtIG1lbnUgb3B0aW9uCiAgICAgICAgICogICAjNTogaXQncyBhIG1lbnUgb3B0aW9uLCBidXQgd2luZG93IGlzIGljb25pYwogICAgICAgICAqICAgIzY6IGl0J3MgYSBtZW51IG9wdGlvbiwgYnV0IGRpc2FibGVkCiAgICAgICAgICovCiAgICAgICAgVFJBQ0VfKGFjY2VsKSgiLCBidXQgd29uJ3Qgc2VuZCBXTV97U1lTfUNPTU1BTkQsIHJlYXNvbiBpcyAjJWRcbiIsbWVzZyk7CiAgICAgICAgaWYobWVzZz09MCkKICAgICAgICAgICAgRVJSXyhhY2NlbCkoIiB1bmtub3duIHJlYXNvbiAtIHBsZWFzZSByZXBvcnQhXG4iKTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFRyYW5zbGF0ZUFjY2VsZXJhdG9yICAgICAgKFVTRVIzMi5AKQogKiAgICAgIFRyYW5zbGF0ZUFjY2VsZXJhdG9yQSAgICAgKFVTRVIzMi5AKQogKi8KSU5UIFdJTkFQSSBUcmFuc2xhdGVBY2NlbGVyYXRvckEoIEhXTkQgaFduZCwgSEFDQ0VMIGhBY2NlbCwgTFBNU0cgbXNnICkKewogICAgLyogWUVTLCBBY2NlbDE2ISAqLwogICAgTFBBQ0NFTDE2IGxwQWNjZWxUYmw7CiAgICBpbnQgaTsKICAgIFdQQVJBTSB3UGFyYW07CgogICAgaWYgKCFoV25kIHx8ICFtc2cpIHJldHVybiAwOwoKICAgIGlmICghaEFjY2VsIHx8ICEobHBBY2NlbFRibCA9IChMUEFDQ0VMMTYpIExvY2tSZXNvdXJjZTE2KEhBQ0NFTF8xNihoQWNjZWwpKSkpCiAgICB7CiAgICAgICAgV0FSTl8oYWNjZWwpKCJpbnZhbGlkIGFjY2VsIGhhbmRsZT0lcFxuIiwgaEFjY2VsKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICB3UGFyYW0gPSBtc2ctPndQYXJhbTsKCiAgICBzd2l0Y2ggKG1zZy0+bWVzc2FnZSkKICAgIHsKICAgIGNhc2UgV01fS0VZRE9XTjoKICAgIGNhc2UgV01fU1lTS0VZRE9XTjoKICAgICAgICBicmVhazsKCiAgICBjYXNlIFdNX0NIQVI6CiAgICBjYXNlIFdNX1NZU0NIQVI6CiAgICAgICAgewogICAgICAgICAgICBjaGFyIGNoID0gTE9XT1JEKHdQYXJhbSk7CiAgICAgICAgICAgIFdDSEFSIHdjaDsKICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsICZjaCwgMSwgJndjaCwgMSk7CiAgICAgICAgICAgIHdQYXJhbSA9IE1BS0VXUEFSQU0od2NoLCBISVdPUkQod1BhcmFtKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgVFJBQ0VfKGFjY2VsKSgiaEFjY2VsICVwLCBoV25kICVwLCBtc2ctPmh3bmQgJXAsIG1zZy0+bWVzc2FnZSAlMDR4LCB3UGFyYW0gJTA4eCwgbFBhcmFtICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICBoQWNjZWwsaFduZCxtc2ctPmh3bmQsbXNnLT5tZXNzYWdlLG1zZy0+d1BhcmFtLG1zZy0+bFBhcmFtKTsKICAgIGkgPSAwOwogICAgZG8KICAgIHsKICAgICAgICBpZiAodHJhbnNsYXRlX2FjY2VsZXJhdG9yKCBoV25kLCBtc2ctPm1lc3NhZ2UsIHdQYXJhbSwgbXNnLT5sUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBBY2NlbFRibFtpXS5mVmlydCwgbHBBY2NlbFRibFtpXS5rZXksIGxwQWNjZWxUYmxbaV0uY21kKSkKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICB9IHdoaWxlICgobHBBY2NlbFRibFtpKytdLmZWaXJ0ICYgMHg4MCkgPT0gMCk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgVHJhbnNsYXRlQWNjZWxlcmF0b3JXICAgICAoVVNFUjMyLkApCiAqLwpJTlQgV0lOQVBJIFRyYW5zbGF0ZUFjY2VsZXJhdG9yVyggSFdORCBoV25kLCBIQUNDRUwgaEFjY2VsLCBMUE1TRyBtc2cgKQp7CiAgICAvKiBZRVMsIEFjY2VsMTYhICovCiAgICBMUEFDQ0VMMTYgbHBBY2NlbFRibDsKICAgIGludCBpOwoKICAgIGlmICghaFduZCB8fCAhbXNnKSByZXR1cm4gMDsKCiAgICBpZiAoIWhBY2NlbCB8fCAhKGxwQWNjZWxUYmwgPSAoTFBBQ0NFTDE2KSBMb2NrUmVzb3VyY2UxNihIQUNDRUxfMTYoaEFjY2VsKSkpKQogICAgewogICAgICAgIFdBUk5fKGFjY2VsKSgiaW52YWxpZCBhY2NlbCBoYW5kbGU9JXBcbiIsIGhBY2NlbCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgc3dpdGNoIChtc2ctPm1lc3NhZ2UpCiAgICB7CiAgICBjYXNlIFdNX0tFWURPV046CiAgICBjYXNlIFdNX1NZU0tFWURPV046CiAgICBjYXNlIFdNX0NIQVI6CiAgICBjYXNlIFdNX1NZU0NIQVI6CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBUUkFDRV8oYWNjZWwpKCJoQWNjZWwgJXAsIGhXbmQgJXAsIG1zZy0+aHduZCAlcCwgbXNnLT5tZXNzYWdlICUwNHgsIHdQYXJhbSAlMDh4LCBsUGFyYW0gJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgIGhBY2NlbCxoV25kLG1zZy0+aHduZCxtc2ctPm1lc3NhZ2UsbXNnLT53UGFyYW0sbXNnLT5sUGFyYW0pOwogICAgaSA9IDA7CiAgICBkbwogICAgewogICAgICAgIGlmICh0cmFuc2xhdGVfYWNjZWxlcmF0b3IoIGhXbmQsIG1zZy0+bWVzc2FnZSwgbXNnLT53UGFyYW0sIG1zZy0+bFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQWNjZWxUYmxbaV0uZlZpcnQsIGxwQWNjZWxUYmxbaV0ua2V5LCBscEFjY2VsVGJsW2ldLmNtZCkpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgfSB3aGlsZSAoKGxwQWNjZWxUYmxbaSsrXS5mVmlydCAmIDB4ODApID09IDApOwoKICAgIHJldHVybiAwOwp9Cg==