LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9mb250Y29uZmlnL2ZvbnRjb25maWcuaCx2IDEuMzAgMjAwMi8wOS8yNiAwMDoxNzoyNyBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GT05UQ09ORklHX0hfCiNkZWZpbmUgX0ZPTlRDT05GSUdfSF8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCnR5cGVkZWYgdW5zaWduZWQgY2hhcglGY0NoYXI4Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0CUZjQ2hhcjE2Owp0eXBlZGVmIHVuc2lnbmVkIGludAlGY0NoYXIzMjsKdHlwZWRlZiBpbnQJCUZjQm9vbDsKCi8qCiAqIEN1cnJlbnQgRm9udGNvbmZpZyB2ZXJzaW9uIG51bWJlci4gIFRoaXMgc2FtZSBudW1iZXIKICogbXVzdCBhcHBlYXIgaW4gdGhlIGZvbnRjb25maWcgY29uZmlndXJlLmluIGZpbGUuIFllcywKICogaXQnYSBhIHBhaW4gdG8gc3luY2hyb25pemUgdmVyc2lvbiBudW1iZXJzIGxpa2UgdGhpcy4KICovCgojZGVmaW5lIEZDX01BSk9SCTIKI2RlZmluZSBGQ19NSU5PUgkyCiNkZWZpbmUgRkNfUkVWSVNJT04JOTAKCiNkZWZpbmUgRkNfVkVSU0lPTgkoKEZDX01BSk9SICogMTAwMDApICsgKEZDX01JTk9SICogMTAwKSArIChGQ19SRVZJU0lPTikpCgovKgogKiBDdXJyZW50IGZvbnQgY2FjaGUgZmlsZSBmb3JtYXQgdmVyc2lvbgogKiBUaGlzIGlzIGFwcGVuZGVkIHRvIHRoZSBjYWNoZSBmaWxlcyBzbyB0aGF0IG11bHRpcGxlCiAqIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IHdpbGwgcGVhY2VmdWxseSBjb2V4aXN0CiAqCiAqIENoYW5nZSB0aGlzIHZhbHVlIHdoZW5ldmVyIHRoZSBkaXNrIGZvcm1hdCBmb3IgdGhlIGNhY2hlIGZpbGUKICogY2hhbmdlcyBpbiBhbnkgbm9uLWNvbXBhdGlibGUgd2F5LiAgVHJ5IHRvIGF2b2lkIHN1Y2ggY2hhbmdlcyBhcwogKiBpdCBtZWFucyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIGZvbnQgaW5mb3JtYXRpb24uCiAqLwoKI2RlZmluZSBGQ19DQUNIRV9WRVJTSU9OICAgICIxIgoKI2RlZmluZSBGY1RydWUJCTEKI2RlZmluZSBGY0ZhbHNlCQkwCgojZGVmaW5lIEZDX0ZBTUlMWQkgICAgImZhbWlseSIJCS8qIFN0cmluZyAqLwojZGVmaW5lIEZDX1NUWUxFCSAgICAic3R5bGUiCQkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19TTEFOVAkgICAgInNsYW50IgkJLyogSW50ICovCiNkZWZpbmUgRkNfV0VJR0hUCSAgICAid2VpZ2h0IgkJLyogSW50ICovCiNkZWZpbmUgRkNfU0laRQkJICAgICJzaXplIgkJLyogRG91YmxlICovCiNkZWZpbmUgRkNfQVNQRUNUCSAgICAiYXNwZWN0IgkJLyogRG91YmxlICovCiNkZWZpbmUgRkNfUElYRUxfU0laRQkgICAgInBpeGVsc2l6ZSIJCS8qIERvdWJsZSAqLwojZGVmaW5lIEZDX1NQQUNJTkcJICAgICJzcGFjaW5nIgkJLyogSW50ICovCiNkZWZpbmUgRkNfRk9VTkRSWQkgICAgImZvdW5kcnkiCQkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19BTlRJQUxJQVMJICAgICJhbnRpYWxpYXMiCQkvKiBCb29sIChkZXBlbmRzKSAqLwojZGVmaW5lIEZDX0hJTlRJTkcJICAgICJoaW50aW5nIgkJLyogQm9vbCAodHJ1ZSkgKi8KI2RlZmluZSBGQ19WRVJUSUNBTF9MQVlPVVQgICJ2ZXJ0aWNhbGxheW91dCIJLyogQm9vbCAoZmFsc2UpICovCiNkZWZpbmUgRkNfQVVUT0hJTlQJICAgICJhdXRvaGludCIJCS8qIEJvb2wgKGZhbHNlKSAqLwojZGVmaW5lIEZDX0dMT0JBTF9BRFZBTkNFICAgImdsb2JhbGFkdmFuY2UiCS8qIEJvb2wgKHRydWUpICovCiNkZWZpbmUgRkNfV0lEVEgJICAgICJ3aWR0aCIJCS8qIEludCAqLwojZGVmaW5lIEZDX0ZJTEUJCSAgICAiZmlsZSIJCS8qIFN0cmluZyAqLwojZGVmaW5lIEZDX0lOREVYCSAgICAiaW5kZXgiCQkvKiBJbnQgKi8KI2RlZmluZSBGQ19GVF9GQUNFCSAgICAiZnRmYWNlIgkJLyogRlRfRmFjZSAqLwojZGVmaW5lIEZDX1JBU1RFUklaRVIJICAgICJyYXN0ZXJpemVyIgkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19PVVRMSU5FCSAgICAib3V0bGluZSIJCS8qIEJvb2wgKi8KI2RlZmluZSBGQ19TQ0FMQUJMRQkgICAgInNjYWxhYmxlIgkJLyogQm9vbCAqLwojZGVmaW5lIEZDX1NDQUxFCSAgICAic2NhbGUiCQkvKiBkb3VibGUgKi8KI2RlZmluZSBGQ19EUEkJCSAgICAiZHBpIgkJLyogZG91YmxlICovCiNkZWZpbmUgRkNfUkdCQQkJICAgICJyZ2JhIgkJLyogSW50ICovCiNkZWZpbmUgRkNfTUlOU1BBQ0UJICAgICJtaW5zcGFjZSIJCS8qIEJvb2wgdXNlIG1pbmltdW0gbGluZSBzcGFjaW5nICovCiNkZWZpbmUgRkNfU09VUkNFCSAgICAic291cmNlIgkJLyogU3RyaW5nIChYMTEsIGZyZWV0eXBlKSAqLwojZGVmaW5lIEZDX0NIQVJTRVQJICAgICJjaGFyc2V0IgkJLyogQ2hhclNldCAqLwojZGVmaW5lIEZDX0xBTkcJCSAgICAibGFuZyIJCS8qIFN0cmluZyBSRkMgMzA2NiBsYW5ncyAqLwojZGVmaW5lIEZDX0ZPTlRWRVJTSU9OCSAgICAiZm9udHZlcnNpb24iCS8qIEludCBmcm9tICdoZWFkJyB0YWJsZSAqLwoKI2RlZmluZSBGQ19ESVJfQ0FDSEVfRklMRQkgICAgImZvbnRzLmNhY2hlLSJGQ19DQUNIRV9WRVJTSU9OCiNkZWZpbmUgRkNfVVNFUl9DQUNIRV9GSUxFCSAgICAiLmZvbnRzLmNhY2hlLSJGQ19DQUNIRV9WRVJTSU9OCgovKiBBZGp1c3Qgb3V0bGluZSByYXN0ZXJpemVyICovCiNkZWZpbmUgRkNfQ0hBUl9XSURUSAkgICAgImNoYXJ3aWR0aCIJLyogSW50ICovCiNkZWZpbmUgRkNfQ0hBUl9IRUlHSFQJICAgICJjaGFyaGVpZ2h0Ii8qIEludCAqLwojZGVmaW5lIEZDX01BVFJJWAkgICAgIm1hdHJpeCIgICAgLyogRmNNYXRyaXggKi8KCiNkZWZpbmUgRkNfV0VJR0hUX1RISU4JCSAgICAwCiNkZWZpbmUgRkNfV0VJR0hUX0VYVFJBTElHSFQJICAgIDQwCiNkZWZpbmUgRkNfV0VJR0hUX1VMVFJBTElHSFQJICAgIEZDX1dFSUdIVF9FWFRSQUxJR0hUCiNkZWZpbmUgRkNfV0VJR0hUX0xJR0hUCQkgICAgNTAKI2RlZmluZSBGQ19XRUlHSFRfQk9PSwkJICAgIDc1CiNkZWZpbmUgRkNfV0VJR0hUX1JFR1VMQVIJICAgIDgwCiNkZWZpbmUgRkNfV0VJR0hUX05PUk1BTAkgICAgRkNfV0VJR0hUX1JFR1VMQVIKI2RlZmluZSBGQ19XRUlHSFRfTUVESVVNCSAgICAxMDAKI2RlZmluZSBGQ19XRUlHSFRfREVNSUJPTEQJICAgIDE4MAojZGVmaW5lIEZDX1dFSUdIVF9TRU1JQk9MRAkgICAgRkNfV0VJR0hUX0RFTUlCT0xECiNkZWZpbmUgRkNfV0VJR0hUX0JPTEQJCSAgICAyMDAKI2RlZmluZSBGQ19XRUlHSFRfRVhUUkFCT0xECSAgICAyMDUKI2RlZmluZSBGQ19XRUlHSFRfVUxUUkFCT0xECSAgICBGQ19XRUlHSFRfRVhUUkFCT0xECiNkZWZpbmUgRkNfV0VJR0hUX0JMQUNLCQkgICAgMjEwCiNkZWZpbmUgRkNfV0VJR0hUX0hFQVZZCQkgICAgRkNfV0VJR0hUX0JMQUNLCgojZGVmaW5lIEZDX1NMQU5UX1JPTUFOCQkgICAgMAojZGVmaW5lIEZDX1NMQU5UX0lUQUxJQwkJICAgIDEwMAojZGVmaW5lIEZDX1NMQU5UX09CTElRVUUJICAgIDExMAoKI2RlZmluZSBGQ19XSURUSF9VTFRSQUNPTkRFTlNFRAkgICAgNTAKI2RlZmluZSBGQ19XSURUSF9FWFRSQUNPTkRFTlNFRAkgICAgNjMKI2RlZmluZSBGQ19XSURUSF9DT05ERU5TRUQJICAgIDc1CiNkZWZpbmUgRkNfV0lEVEhfU0VNSUNPTkRFTlNFRAkgICAgODcKI2RlZmluZSBGQ19XSURUSF9OT1JNQUwJCSAgICAxMDAKI2RlZmluZSBGQ19XSURUSF9TRU1JRVhQQU5ERUQJICAgIDExMwojZGVmaW5lIEZDX1dJRFRIX0VYUEFOREVECSAgICAxMjUKI2RlZmluZSBGQ19XSURUSF9FWFRSQUVYUEFOREVECSAgICAxNTAKI2RlZmluZSBGQ19XSURUSF9VTFRSQUVYUEFOREVECSAgICAyMDAKCiNkZWZpbmUgRkNfUFJPUE9SVElPTkFMCQkgICAgMAojZGVmaW5lIEZDX01PTk8JCQkgICAgMTAwCiNkZWZpbmUgRkNfQ0hBUkNFTEwJCSAgICAxMTAKCi8qIHN1Yi1waXhlbCBvcmRlciAqLwojZGVmaW5lIEZDX1JHQkFfVU5LTk9XTgkgICAgMAojZGVmaW5lIEZDX1JHQkFfUkdCCSAgICAxCiNkZWZpbmUgRkNfUkdCQV9CR1IJICAgIDIKI2RlZmluZSBGQ19SR0JBX1ZSR0IJICAgIDMKI2RlZmluZSBGQ19SR0JBX1ZCR1IJICAgIDQKI2RlZmluZSBGQ19SR0JBX05PTkUJICAgIDUKCnR5cGVkZWYgZW51bSBfRmNUeXBlIHsKICAgIEZjVHlwZVZvaWQsIAogICAgRmNUeXBlSW50ZWdlciwgCiAgICBGY1R5cGVEb3VibGUsIAogICAgRmNUeXBlU3RyaW5nLCAKICAgIEZjVHlwZUJvb2wsCiAgICBGY1R5cGVNYXRyaXgsCiAgICBGY1R5cGVDaGFyU2V0LAogICAgRmNUeXBlRlRGYWNlLAogICAgRmNUeXBlTGFuZ1NldAp9IEZjVHlwZTsKCnR5cGVkZWYgc3RydWN0IF9GY01hdHJpeCB7CiAgICBkb3VibGUgeHgsIHh5LCB5eCwgeXk7Cn0gRmNNYXRyaXg7CgojZGVmaW5lIEZjTWF0cml4SW5pdChtKQkoKG0pLT54eCA9IChtKS0+eXkgPSAxLCBcCgkJCSAobSktPnh5ID0gKG0pLT55eCA9IDApCgovKgogKiBBIGRhdGEgc3RydWN0dXJlIHRvIHJlcHJlc2VudCB0aGUgYXZhaWxhYmxlIGdseXBocyBpbiBhIGZvbnQuCiAqIFRoaXMgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFyc2UgYm9vbGVhbiBidHJlZS4KICovCgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyU2V0IEZjQ2hhclNldDsKCnR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGUgewogICAgY29uc3QgY2hhcgkqb2JqZWN0OwogICAgRmNUeXBlCXR5cGU7Cn0gRmNPYmplY3RUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ29uc3RhbnQgewogICAgY29uc3QgRmNDaGFyOCAgKm5hbWU7CiAgICBjb25zdCBjaGFyCSpvYmplY3Q7CiAgICBpbnQJCXZhbHVlOwp9IEZjQ29uc3RhbnQ7Cgp0eXBlZGVmIGVudW0gX0ZjUmVzdWx0IHsKICAgIEZjUmVzdWx0TWF0Y2gsIEZjUmVzdWx0Tm9NYXRjaCwgRmNSZXN1bHRUeXBlTWlzbWF0Y2gsIEZjUmVzdWx0Tm9JZAp9IEZjUmVzdWx0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjUGF0dGVybiAgIEZjUGF0dGVybjsKCnR5cGVkZWYgc3RydWN0IF9GY0xhbmdTZXQgICBGY0xhbmdTZXQ7Cgp0eXBlZGVmIHN0cnVjdCBfRmNWYWx1ZSB7CiAgICBGY1R5cGUJdHlwZTsKICAgIHVuaW9uIHsKCWNvbnN0IEZjQ2hhcjgJKnM7CglpbnQJCWk7CglGY0Jvb2wJCWI7Cglkb3VibGUJCWQ7Cgljb25zdCBGY01hdHJpeAkqbTsKCWNvbnN0IEZjQ2hhclNldAkqYzsKCXZvaWQJCSpmOwoJY29uc3QgRmNQYXR0ZXJuCSpwOwoJY29uc3QgRmNMYW5nU2V0CSpsOwogICAgfSB1Owp9IEZjVmFsdWU7Cgp0eXBlZGVmIHN0cnVjdCBfRmNGb250U2V0IHsKICAgIGludAkJbmZvbnQ7CiAgICBpbnQJCXNmb250OwogICAgRmNQYXR0ZXJuCSoqZm9udHM7Cn0gRmNGb250U2V0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjT2JqZWN0U2V0IHsKICAgIGludAkJbm9iamVjdDsKICAgIGludAkJc29iamVjdDsKICAgIGNvbnN0IGNoYXIJKipvYmplY3RzOwp9IEZjT2JqZWN0U2V0OwogICAgCnR5cGVkZWYgZW51bSBfRmNNYXRjaEtpbmQgewogICAgRmNNYXRjaFBhdHRlcm4sIEZjTWF0Y2hGb250Cn0gRmNNYXRjaEtpbmQ7Cgp0eXBlZGVmIGVudW0gX0ZjTGFuZ1Jlc3VsdCB7CiAgICBGY0xhbmdFcXVhbCwgRmNMYW5nRGlmZmVyZW50Q291bnRyeSwgRmNMYW5nRGlmZmVyZW50TGFuZwp9IEZjTGFuZ1Jlc3VsdDsKCnR5cGVkZWYgZW51bSBfRmNTZXROYW1lIHsKICAgIEZjU2V0U3lzdGVtID0gMCwKICAgIEZjU2V0QXBwbGljYXRpb24gPSAxCn0gRmNTZXROYW1lOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQXRvbWljIEZjQXRvbWljOwoKI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykgLyogZm9yIEMrKyBWMi4wICovCiNkZWZpbmUgX0ZDRlVOQ1BST1RPQkVHSU4gZXh0ZXJuICJDIiB7CS8qIGRvIG5vdCBsZWF2ZSBvcGVuIGFjcm9zcyBpbmNsdWRlcyAqLwojZGVmaW5lIF9GQ0ZVTkNQUk9UT0VORCB9CiNlbHNlCiNkZWZpbmUgX0ZDRlVOQ1BST1RPQkVHSU4KI2RlZmluZSBfRkNGVU5DUFJPVE9FTkQKI2VuZGlmCgp0eXBlZGVmIGVudW0geyBGY0VuZGlhbkJpZywgRmNFbmRpYW5MaXR0bGUgfSBGY0VuZGlhbjsKCnR5cGVkZWYgc3RydWN0IF9GY0NvbmZpZyAgICBGY0NvbmZpZzsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlCUZjRmlsZUNhY2hlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQmxhbmtzICAgIEZjQmxhbmtzOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3RyTGlzdCAgIEZjU3RyTGlzdDsKCnR5cGVkZWYgc3RydWN0IF9GY1N0clNldCAgICBGY1N0clNldDsKCl9GQ0ZVTkNQUk9UT0JFR0lOCgpGY0Jvb2wKRmNEaXJDYWNoZVZhbGlkIChjb25zdCBGY0NoYXI4ICpjYWNoZV9maWxlKTsKCi8qIGZjYmxhbmtzLmMgKi8KRmNCbGFua3MgKgpGY0JsYW5rc0NyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjQmxhbmtzRGVzdHJveSAoRmNCbGFua3MgKmIpOwoKRmNCb29sCkZjQmxhbmtzQWRkIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCk7CgpGY0Jvb2wKRmNCbGFua3NJc01lbWJlciAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpOwoKLyogZmNjZmcuYyAqLwpGY0NoYXI4ICoKRmNDb25maWdIb21lICh2b2lkKTsKCkZjQm9vbApGY0NvbmZpZ0VuYWJsZUhvbWUgKEZjQm9vbCBlbmFibGUpOwoKRmNDaGFyOCAqCkZjQ29uZmlnRmlsZW5hbWUgKGNvbnN0IEZjQ2hhcjggKnVybCk7CiAgICAKRmNDb25maWcgKgpGY0NvbmZpZ0NyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjQ29uZmlnRGVzdHJveSAoRmNDb25maWcgKmNvbmZpZyk7CgpGY0Jvb2wKRmNDb25maWdTZXRDdXJyZW50IChGY0NvbmZpZyAqY29uZmlnKTsKCkZjQ29uZmlnICoKRmNDb25maWdHZXRDdXJyZW50ICh2b2lkKTsKCkZjQm9vbApGY0NvbmZpZ1VwdG9EYXRlIChGY0NvbmZpZyAqY29uZmlnKTsKICAgIApGY0Jvb2wKRmNDb25maWdCdWlsZEZvbnRzIChGY0NvbmZpZyAqY29uZmlnKTsKCkZjU3RyTGlzdCAqCkZjQ29uZmlnR2V0Rm9udERpcnMgKEZjQ29uZmlnICAgKmNvbmZpZyk7CgpGY1N0ckxpc3QgKgpGY0NvbmZpZ0dldENvbmZpZ0RpcnMgKEZjQ29uZmlnICAgKmNvbmZpZyk7CgpGY1N0ckxpc3QgKgpGY0NvbmZpZ0dldENvbmZpZ0ZpbGVzIChGY0NvbmZpZyAgICAqY29uZmlnKTsKCkZjQ2hhcjggKgpGY0NvbmZpZ0dldENhY2hlIChGY0NvbmZpZyAgKmNvbmZpZyk7CgpGY0JsYW5rcyAqCkZjQ29uZmlnR2V0QmxhbmtzIChGY0NvbmZpZyAqY29uZmlnKTsKCmludApGY0NvbmZpZ0dldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnKTsKCkZjQm9vbApGY0NvbmZpZ1NldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnLCBpbnQgcmVzY2FuSW50ZXJ2YWwpOwoKRmNGb250U2V0ICoKRmNDb25maWdHZXRGb250cyAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjU2V0TmFtZQlzZXQpOwoKRmNCb29sCkZjQ29uZmlnQXBwRm9udEFkZEZpbGUgKEZjQ29uZmlnICAgICpjb25maWcsCgkJCWNvbnN0IEZjQ2hhcjggICpmaWxlKTsKCkZjQm9vbApGY0NvbmZpZ0FwcEZvbnRBZGREaXIgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJCSAgICAgICBjb25zdCBGY0NoYXI4ICAgKmRpcik7Cgp2b2lkCkZjQ29uZmlnQXBwRm9udENsZWFyIChGY0NvbmZpZwkgICAgKmNvbmZpZyk7CgpGY0Jvb2wKRmNDb25maWdTdWJzdGl0dXRlV2l0aFBhdCAoRmNDb25maWcJKmNvbmZpZywKCQkJICAgRmNQYXR0ZXJuCSpwLAoJCQkgICBGY1BhdHRlcm4JKnBfcGF0LAoJCQkgICBGY01hdGNoS2luZAlraW5kKTsKCkZjQm9vbApGY0NvbmZpZ1N1YnN0aXR1dGUgKEZjQ29uZmlnCSpjb25maWcsCgkJICAgIEZjUGF0dGVybgkqcCwKCQkgICAgRmNNYXRjaEtpbmQJa2luZCk7CgovKiBmY2NoYXJzZXQuYyAqLwpGY0NoYXJTZXQgKgpGY0NoYXJTZXRDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0NoYXJTZXREZXN0cm95IChGY0NoYXJTZXQgKmZjcyk7CgpGY0Jvb2wKRmNDaGFyU2V0QWRkQ2hhciAoRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpOwoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0Q29weSAoRmNDaGFyU2V0ICpzcmMpOwoKRmNCb29sCkZjQ2hhclNldEVxdWFsIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRJbnRlcnNlY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQ2hhclNldCAqCkZjQ2hhclNldFVuaW9uIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRTdWJ0cmFjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNCb29sCkZjQ2hhclNldEhhc0NoYXIgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KTsKCkZjQ2hhcjMyCkZjQ2hhclNldENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEpOwoKRmNDaGFyMzIKRmNDaGFyU2V0SW50ZXJzZWN0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQ2hhcjMyCkZjQ2hhclNldFN1YnRyYWN0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQm9vbApGY0NoYXJTZXRJc1N1YnNldCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKI2RlZmluZSBGQ19DSEFSU0VUX01BUF9TSVpFICgyNTYvMzIpCiNkZWZpbmUgRkNfQ0hBUlNFVF9ET05FCSgoRmNDaGFyMzIpIC0xKQoKRmNDaGFyMzIKRmNDaGFyU2V0Rmlyc3RQYWdlIChjb25zdCBGY0NoYXJTZXQgKmEsIAoJCSAgICBGY0NoYXIzMgkgICAgbWFwW0ZDX0NIQVJTRVRfTUFQX1NJWkVdLAoJCSAgICBGY0NoYXIzMgkgICAgKm5leHQpOwoKRmNDaGFyMzIKRmNDaGFyU2V0TmV4dFBhZ2UgKGNvbnN0IEZjQ2hhclNldCAgKmEsIAoJCSAgIEZjQ2hhcjMyCSAgICBtYXBbRkNfQ0hBUlNFVF9NQVBfU0laRV0sCgkJICAgRmNDaGFyMzIJICAgICpuZXh0KTsKCgovKiBmY2RiZy5jICovCnZvaWQKRmNWYWx1ZVByaW50IChjb25zdCBGY1ZhbHVlIHYpOwoKdm9pZApGY1BhdHRlcm5QcmludCAoY29uc3QgRmNQYXR0ZXJuICpwKTsKCnZvaWQKRmNGb250U2V0UHJpbnQgKGNvbnN0IEZjRm9udFNldCAqcyk7CgovKiBmY2RlZmF1bHQuYyAqLwp2b2lkCkZjRGVmYXVsdFN1YnN0aXR1dGUgKEZjUGF0dGVybiAqcGF0dGVybik7CgovKiBmY2Rpci5jICovCkZjQm9vbApGY0ZpbGVTY2FuIChGY0ZvbnRTZXQJICAgICpzZXQsCgkgICAgRmNTdHJTZXQJICAgICpkaXJzLAoJICAgIEZjRmlsZUNhY2hlCSAgICAqY2FjaGUsCgkgICAgRmNCbGFua3MJICAgICpibGFua3MsCgkgICAgY29uc3QgRmNDaGFyOCAgICpmaWxlLAoJICAgIEZjQm9vbAkgICAgZm9yY2UpOwoKRmNCb29sCkZjRGlyU2NhbiAoRmNGb250U2V0CSAgICAqc2V0LAoJICAgRmNTdHJTZXQJICAgICpkaXJzLAoJICAgRmNGaWxlQ2FjaGUJICAgICpjYWNoZSwKCSAgIEZjQmxhbmtzCSAgICAqYmxhbmtzLAoJICAgY29uc3QgRmNDaGFyOCAgICAqZGlyLAoJICAgRmNCb29sCSAgICBmb3JjZSk7CgpGY0Jvb2wKRmNEaXJTYXZlIChGY0ZvbnRTZXQgKnNldCwgRmNTdHJTZXQgKmRpcnMsIGNvbnN0IEZjQ2hhcjggKmRpcik7CgovKiBmY2ZyZWV0eXBlLmMgKi8KRmNQYXR0ZXJuICoKRmNGcmVlVHlwZVF1ZXJ5IChjb25zdCBGY0NoYXI4ICpmaWxlLCBpbnQgaWQsIEZjQmxhbmtzICpibGFua3MsIGludCAqY291bnQpOwoKLyogZmNmcy5jICovCgpGY0ZvbnRTZXQgKgpGY0ZvbnRTZXRDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0ZvbnRTZXREZXN0cm95IChGY0ZvbnRTZXQgKnMpOwoKRmNCb29sCkZjRm9udFNldEFkZCAoRmNGb250U2V0ICpzLCBGY1BhdHRlcm4gKmZvbnQpOwoKLyogZmNpbml0LmMgKi8KRmNDb25maWcgKgpGY0luaXRMb2FkQ29uZmlnICh2b2lkKTsKCkZjQ29uZmlnICoKRmNJbml0TG9hZENvbmZpZ0FuZEZvbnRzICh2b2lkKTsKCkZjQm9vbApGY0luaXQgKHZvaWQpOwoKaW50CkZjR2V0VmVyc2lvbiAodm9pZCk7CgpGY0Jvb2wKRmNJbml0UmVpbml0aWFsaXplICh2b2lkKTsKCkZjQm9vbApGY0luaXRCcmluZ1VwdG9EYXRlICh2b2lkKTsKCi8qIGZjbGFuZy5jICovCkZjTGFuZ1NldCAqCkZjTGFuZ1NldENyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjTGFuZ1NldERlc3Ryb3kgKEZjTGFuZ1NldCAqbHMpOwoKRmNMYW5nU2V0ICoKRmNMYW5nU2V0Q29weSAoY29uc3QgRmNMYW5nU2V0ICpscyk7CgpGY0Jvb2wKRmNMYW5nU2V0QWRkIChGY0xhbmdTZXQgKmxzLCBjb25zdCBGY0NoYXI4ICpsYW5nKTsKCkZjTGFuZ1Jlc3VsdApGY0xhbmdTZXRIYXNMYW5nIChjb25zdCBGY0xhbmdTZXQgKmxzLCBjb25zdCBGY0NoYXI4ICpsYW5nKTsKCkZjTGFuZ1Jlc3VsdApGY0xhbmdTZXRDb21wYXJlIChjb25zdCBGY0xhbmdTZXQgKmxzYSwgY29uc3QgRmNMYW5nU2V0ICpsc2IpOwoKRmNCb29sCkZjTGFuZ1NldENvbnRhaW5zIChjb25zdCBGY0xhbmdTZXQgKmxzYSwgY29uc3QgRmNMYW5nU2V0ICpsc2IpOwoKRmNCb29sCkZjTGFuZ1NldEVxdWFsIChjb25zdCBGY0xhbmdTZXQgKmxzYSwgY29uc3QgRmNMYW5nU2V0ICpsc2IpOwoKRmNDaGFyMzIKRmNMYW5nU2V0SGFzaCAoY29uc3QgRmNMYW5nU2V0ICpscyk7CgovKiBmY2xpc3QuYyAqLwpGY09iamVjdFNldCAqCkZjT2JqZWN0U2V0Q3JlYXRlICh2b2lkKTsKCkZjQm9vbApGY09iamVjdFNldEFkZCAoRmNPYmplY3RTZXQgKm9zLCBjb25zdCBjaGFyICpvYmplY3QpOwoKdm9pZApGY09iamVjdFNldERlc3Ryb3kgKEZjT2JqZWN0U2V0ICpvcyk7CgpGY09iamVjdFNldCAqCkZjT2JqZWN0U2V0VmFCdWlsZCAoY29uc3QgY2hhciAqZmlyc3QsIHZhX2xpc3QgdmEpOwoKRmNPYmplY3RTZXQgKgpGY09iamVjdFNldEJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgLi4uKTsKCkZjRm9udFNldCAqCkZjRm9udFNldExpc3QgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJICAgICAgIEZjRm9udFNldCAgICAqKnNldHMsCgkgICAgICAgaW50CSAgICBuc2V0cywKCSAgICAgICBGY1BhdHRlcm4gICAgKnAsCgkgICAgICAgRmNPYmplY3RTZXQgICpvcyk7CgpGY0ZvbnRTZXQgKgpGY0ZvbnRMaXN0IChGY0NvbmZpZwkqY29uZmlnLAoJICAgIEZjUGF0dGVybgkqcCwKCSAgICBGY09iamVjdFNldCAqb3MpOwoKLyogZmNhdG9taWMuYyAqLwoKRmNBdG9taWMgKgpGY0F0b21pY0NyZWF0ZSAoY29uc3QgRmNDaGFyOCAgICpmaWxlKTsKCkZjQm9vbApGY0F0b21pY0xvY2sgKEZjQXRvbWljICphdG9taWMpOwoKRmNDaGFyOCAqCkZjQXRvbWljTmV3RmlsZSAoRmNBdG9taWMgKmF0b21pYyk7CgpGY0NoYXI4ICoKRmNBdG9taWNPcmlnRmlsZSAoRmNBdG9taWMgKmF0b21pYyk7CgpGY0Jvb2wKRmNBdG9taWNSZXBsYWNlT3JpZyAoRmNBdG9taWMgKmF0b21pYyk7Cgp2b2lkCkZjQXRvbWljRGVsZXRlTmV3IChGY0F0b21pYyAqYXRvbWljKTsKCnZvaWQKRmNBdG9taWNVbmxvY2sgKEZjQXRvbWljICphdG9taWMpOwoKdm9pZApGY0F0b21pY0Rlc3Ryb3kgKEZjQXRvbWljICphdG9taWMpOwoKLyogZmNtYXRjaC5jICovCkZjUGF0dGVybiAqCkZjRm9udFNldE1hdGNoIChGY0NvbmZpZyAgICAqY29uZmlnLAoJCUZjRm9udFNldCAgICoqc2V0cywKCQlpbnQJICAgIG5zZXRzLAoJCUZjUGF0dGVybiAgICpwLAoJCUZjUmVzdWx0ICAgICpyZXN1bHQpOwoKRmNQYXR0ZXJuICoKRmNGb250TWF0Y2ggKEZjQ29uZmlnCSpjb25maWcsCgkgICAgIEZjUGF0dGVybgkqcCwgCgkgICAgIEZjUmVzdWx0CSpyZXN1bHQpOwoKRmNQYXR0ZXJuICoKRmNGb250UmVuZGVyUHJlcGFyZSAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgICBGY1BhdHRlcm4JICAgICpwYXQsCgkJICAgICBGY1BhdHRlcm4JICAgICpmb250KTsKCkZjRm9udFNldCAqCkZjRm9udFNldFNvcnQgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJICAgICAgIEZjRm9udFNldCAgICAqKnNldHMsCgkgICAgICAgaW50CSAgICBuc2V0cywKCSAgICAgICBGY1BhdHRlcm4gICAgKnAsCgkgICAgICAgRmNCb29sCSAgICB0cmltLAoJICAgICAgIEZjQ2hhclNldCAgICAqKmNzcCwKCSAgICAgICBGY1Jlc3VsdAkgICAgKnJlc3VsdCk7CgpGY0ZvbnRTZXQgKgpGY0ZvbnRTb3J0IChGY0NvbmZpZwkgKmNvbmZpZywKCSAgICBGY1BhdHRlcm4gICAgKnAsCgkgICAgRmNCb29sCSB0cmltLAoJICAgIEZjQ2hhclNldCAgICAqKmNzcCwKCSAgICBGY1Jlc3VsdAkgKnJlc3VsdCk7Cgp2b2lkCkZjRm9udFNldFNvcnREZXN0cm95IChGY0ZvbnRTZXQgKmZzKTsKCi8qIGZjbWF0cml4LmMgKi8KRmNNYXRyaXggKgpGY01hdHJpeENvcHkgKGNvbnN0IEZjTWF0cml4ICptYXQpOwoKRmNCb29sCkZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0Mik7Cgp2b2lkCkZjTWF0cml4TXVsdGlwbHkgKEZjTWF0cml4ICpyZXN1bHQsIGNvbnN0IEZjTWF0cml4ICphLCBjb25zdCBGY01hdHJpeCAqYik7Cgp2b2lkCkZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKTsKCnZvaWQKRmNNYXRyaXhTY2FsZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBzeCwgZG91YmxlIHN5KTsKCnZvaWQKRmNNYXRyaXhTaGVhciAoRmNNYXRyaXggKm0sIGRvdWJsZSBzaCwgZG91YmxlIHN2KTsKCi8qIGZjbmFtZS5jICovCgpGY0Jvb2wKRmNOYW1lUmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKTsKCkZjQm9vbApGY05hbWVVbnJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZSk7CiAgICAKY29uc3QgRmNPYmplY3RUeXBlICoKRmNOYW1lR2V0T2JqZWN0VHlwZSAoY29uc3QgY2hhciAqb2JqZWN0KTsKCkZjQm9vbApGY05hbWVSZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cyk7CgpGY0Jvb2wKRmNOYW1lVW5yZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cyk7CiAgICAKY29uc3QgRmNDb25zdGFudCAqCkZjTmFtZUdldENvbnN0YW50IChGY0NoYXI4ICpzdHJpbmcpOwoKRmNCb29sCkZjTmFtZUNvbnN0YW50IChGY0NoYXI4ICpzdHJpbmcsIGludCAqcmVzdWx0KTsKCkZjUGF0dGVybiAqCkZjTmFtZVBhcnNlIChjb25zdCBGY0NoYXI4ICpuYW1lKTsKCkZjQ2hhcjggKgpGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCk7CgovKiBmY3BhdC5jICovCkZjUGF0dGVybiAqCkZjUGF0dGVybkNyZWF0ZSAodm9pZCk7CgpGY1BhdHRlcm4gKgpGY1BhdHRlcm5EdXBsaWNhdGUgKGNvbnN0IEZjUGF0dGVybiAqcCk7Cgp2b2lkCkZjUGF0dGVyblJlZmVyZW5jZSAoRmNQYXR0ZXJuICpwKTsKCnZvaWQKRmNWYWx1ZURlc3Ryb3kgKEZjVmFsdWUgdik7CgpGY0Jvb2wKRmNWYWx1ZUVxdWFsIChGY1ZhbHVlIHZhLCBGY1ZhbHVlIHZiKTsKCkZjVmFsdWUKRmNWYWx1ZVNhdmUgKEZjVmFsdWUgdik7Cgp2b2lkCkZjUGF0dGVybkRlc3Ryb3kgKEZjUGF0dGVybiAqcCk7CgpGY0Jvb2wKRmNQYXR0ZXJuRXF1YWwgKGNvbnN0IEZjUGF0dGVybiAqcGEsIGNvbnN0IEZjUGF0dGVybiAqcGIpOwoKRmNCb29sCkZjUGF0dGVybkVxdWFsU3Vic2V0IChjb25zdCBGY1BhdHRlcm4gKnBhLCBjb25zdCBGY1BhdHRlcm4gKnBiLCBjb25zdCBGY09iamVjdFNldCAqb3MpOwoKRmNDaGFyMzIKRmNQYXR0ZXJuSGFzaCAoY29uc3QgRmNQYXR0ZXJuICpwKTsKCkZjQm9vbApGY1BhdHRlcm5BZGQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlLCBGY0Jvb2wgYXBwZW5kKTsKICAgIApGY0Jvb2wKRmNQYXR0ZXJuQWRkV2VhayAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjVmFsdWUgdmFsdWUsIEZjQm9vbCBhcHBlbmQpOwogICAgCkZjUmVzdWx0CkZjUGF0dGVybkdldCAoY29uc3QgRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNWYWx1ZSAqdik7CiAgICAKRmNCb29sCkZjUGF0dGVybkRlbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpOwoKRmNCb29sCkZjUGF0dGVybkFkZEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaSk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkRG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgZG91YmxlIGQpOwoKRmNCb29sCkZjUGF0dGVybkFkZFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjUGF0dGVybkFkZE1hdHJpeCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjTWF0cml4ICpzKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgRmNDaGFyU2V0ICpjKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNCb29sIGIpOwoKRmNCb29sCkZjUGF0dGVybkFkZExhbmdTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY0xhbmdTZXQgKmxzKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldEludGVnZXIgKGNvbnN0IEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgaW50ICppKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldERvdWJsZSAoY29uc3QgRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBkb3VibGUgKmQpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0U3RyaW5nIChjb25zdCBGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQ2hhcjggKiogcyk7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRNYXRyaXggKGNvbnN0IEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNNYXRyaXggKipzKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldENoYXJTZXQgKGNvbnN0IEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNDaGFyU2V0ICoqYyk7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRCb29sIChjb25zdCBGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQm9vbCAqYik7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRMYW5nU2V0IChjb25zdCBGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjTGFuZ1NldCAqKmxzKTsKCkZjUGF0dGVybiAqCkZjUGF0dGVyblZhQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgdmFfbGlzdCB2YSk7CiAgICAKRmNQYXR0ZXJuICoKRmNQYXR0ZXJuQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgLi4uKTsKCi8qIGZjc3RyLmMgKi8KCkZjQ2hhcjggKgpGY1N0ckNvcHkgKGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNDaGFyOCAqCkZjU3RyQ29weUZpbGVuYW1lIChjb25zdCBGY0NoYXI4ICpzKTsKICAgIAojZGVmaW5lIEZjSXNVcHBlcihjKQkoKCdBJyA8PSAoYykgJiYgKGMpIDw9ICdaJykpCiNkZWZpbmUgRmNJc0xvd2VyKGMpCSgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKI2RlZmluZSBGY1RvTG93ZXIoYykJKEZjSXNVcHBlcihjKSA/IChjKSAtICdBJyArICdhJyA6IChjKSkKCmludApGY1N0ckNtcElnbm9yZUNhc2UgKGNvbnN0IEZjQ2hhcjggKnMxLCBjb25zdCBGY0NoYXI4ICpzMik7CgppbnQKRmNTdHJDbXAgKGNvbnN0IEZjQ2hhcjggKnMxLCBjb25zdCBGY0NoYXI4ICpzMik7Cgpjb25zdCBGY0NoYXI4ICoKRmNTdHJTdHJJZ25vcmVDYXNlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwoKY29uc3QgRmNDaGFyOCAqCkZjU3RyU3RyIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwoKaW50CkZjVXRmOFRvVWNzNCAoY29uc3QgRmNDaGFyOCAqc3JjX29yaWcsCgkgICAgICBGY0NoYXIzMgkgICAgKmRzdCwKCSAgICAgIGludAkgICAgbGVuKTsKCkZjQm9vbApGY1V0ZjhMZW4gKGNvbnN0IEZjQ2hhcjggICAgKnN0cmluZywKCSAgIGludAkJICAgIGxlbiwKCSAgIGludAkJICAgICpuY2hhciwKCSAgIGludAkJICAgICp3Y2hhcik7CgojZGVmaW5lIEZDX1VURjhfTUFYX0xFTgk2CgppbnQKRmNVY3M0VG9VdGY4IChGY0NoYXIzMgl1Y3M0LAoJICAgICAgRmNDaGFyOAlkZXN0W0ZDX1VURjhfTUFYX0xFTl0pOwoKaW50CkZjVXRmMTZUb1VjczQgKGNvbnN0IEZjQ2hhcjgJKnNyY19vcmlnLAoJICAgICAgIEZjRW5kaWFuCQllbmRpYW4sCgkgICAgICAgRmNDaGFyMzIJCSpkc3QsCgkgICAgICAgaW50CQlsZW4pOwkgICAgLyogaW4gYnl0ZXMgKi8KCkZjQm9vbApGY1V0ZjE2TGVuIChjb25zdCBGY0NoYXI4ICAgKnN0cmluZywKCSAgICBGY0VuZGlhbgkgICAgZW5kaWFuLAoJICAgIGludAkJICAgIGxlbiwJICAgIC8qIGluIGJ5dGVzICovCgkgICAgaW50CQkgICAgKm5jaGFyLAoJICAgIGludAkJICAgICp3Y2hhcik7CgpGY0NoYXI4ICoKRmNTdHJEaXJuYW1lIChjb25zdCBGY0NoYXI4ICpmaWxlKTsKCkZjQ2hhcjggKgpGY1N0ckJhc2VuYW1lIChjb25zdCBGY0NoYXI4ICpmaWxlKTsKCkZjU3RyU2V0ICoKRmNTdHJTZXRDcmVhdGUgKHZvaWQpOwoKRmNCb29sCkZjU3RyU2V0TWVtYmVyIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1N0clNldEVxdWFsIChGY1N0clNldCAqc2EsIEZjU3RyU2V0ICpzYik7CgpGY0Jvb2wKRmNTdHJTZXRBZGQgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjU3RyU2V0QWRkRmlsZW5hbWUgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjU3RyU2V0RGVsIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKTsKCnZvaWQKRmNTdHJTZXREZXN0cm95IChGY1N0clNldCAqc2V0KTsKCkZjU3RyTGlzdCAqCkZjU3RyTGlzdENyZWF0ZSAoRmNTdHJTZXQgKnNldCk7CgpGY0NoYXI4ICoKRmNTdHJMaXN0TmV4dCAoRmNTdHJMaXN0ICpsaXN0KTsKCnZvaWQKRmNTdHJMaXN0RG9uZSAoRmNTdHJMaXN0ICpsaXN0KTsKCi8qIGZjeG1sLmMgKi8KRmNCb29sCkZjQ29uZmlnUGFyc2VBbmRMb2FkIChGY0NvbmZpZyAqY29uZmlnLCBjb25zdCBGY0NoYXI4ICpmaWxlLCBGY0Jvb2wgY29tcGxhaW4pOwoKX0ZDRlVOQ1BST1RPRU5ECgojZW5kaWYgLyogX0ZPTlRDT05GSUdfSF8gKi8K