LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2ludC5oLHYgMS4yNCAyMDAyLzA4LzIyIDA3OjM2OjQ0IGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAwIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GQ0lOVF9IXwojZGVmaW5lIF9GQ0lOVF9IXwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgojaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3ByaXZhdGUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3ltYm9saWMgewogICAgY29uc3QgY2hhcgkqbmFtZTsKICAgIGludAkJdmFsdWU7Cn0gRmNTeW1ib2xpYzsKCiNpZm5kZWYgRkNfQ09ORklHX1BBVEgKI2RlZmluZSBGQ19DT05GSUdfUEFUSCAiZm9udHMuY29uZiIKI2VuZGlmCgojZGVmaW5lIEZDX0ZPTlRfRklMRV9JTlZBTElECSgoRmNDaGFyOCAqKSAiLiIpCiNkZWZpbmUgRkNfRk9OVF9GSUxFX0RJUgkoKEZjQ2hhcjggKikgIi5kaXIiKQoKI2RlZmluZSBGQ19EQkdfTUFUQ0gJMQojZGVmaW5lIEZDX0RCR19NQVRDSFYJMgojZGVmaW5lIEZDX0RCR19FRElUCTQKI2RlZmluZSBGQ19EQkdfRk9OVFNFVAk4CiNkZWZpbmUgRkNfREJHX0NBQ0hFCTE2CiNkZWZpbmUgRkNfREJHX0NBQ0hFVgkzMgojZGVmaW5lIEZDX0RCR19QQVJTRQk2NAojZGVmaW5lIEZDX0RCR19TQ0FOCTEyOAojZGVmaW5lIEZDX0RCR19TQ0FOVgkyNTYKI2RlZmluZSBGQ19EQkdfTUVNT1JZCTUxMgoKI2RlZmluZSBGQ19NRU1fQ0hBUlNFVAkgICAgMAojZGVmaW5lIEZDX01FTV9DSEFSTEVBRgkgICAgMQojZGVmaW5lIEZDX01FTV9GT05UU0VUCSAgICAyCiNkZWZpbmUgRkNfTUVNX0ZPTlRQVFIJICAgIDMKI2RlZmluZSBGQ19NRU1fT0JKRUNUU0VUICAgIDQKI2RlZmluZSBGQ19NRU1fT0JKRUNUUFRSICAgIDUKI2RlZmluZSBGQ19NRU1fTUFUUklYCSAgICA2CiNkZWZpbmUgRkNfTUVNX1BBVFRFUk4JICAgIDcKI2RlZmluZSBGQ19NRU1fUEFURUxUCSAgICA4CiNkZWZpbmUgRkNfTUVNX1ZBTExJU1QJICAgIDkKI2RlZmluZSBGQ19NRU1fU1VCU1RBVEUJICAgIDEwCiNkZWZpbmUgRkNfTUVNX1NUUklORwkgICAgMTEKI2RlZmluZSBGQ19NRU1fTElTVEJVQ0sJICAgIDEyCiNkZWZpbmUgRkNfTUVNX1NUUlNFVAkgICAgMTMKI2RlZmluZSBGQ19NRU1fU1RSTElTVAkgICAgMTQKI2RlZmluZSBGQ19NRU1fQ09ORklHCSAgICAxNQojZGVmaW5lIEZDX01FTV9MQU5HU0VUCSAgICAxNgoKI2RlZmluZSBGQ19NRU1fTlVNCSAgICAxNwoKdHlwZWRlZiBlbnVtIF9GY1ZhbHVlQmluZGluZyB7CiAgICBGY1ZhbHVlQmluZGluZ1dlYWssIEZjVmFsdWVCaW5kaW5nU3Ryb25nCn0gRmNWYWx1ZUJpbmRpbmc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNWYWx1ZUxpc3QgewogICAgc3RydWN0IF9GY1ZhbHVlTGlzdCAgICAqbmV4dDsKICAgIEZjVmFsdWUJCSAgICB2YWx1ZTsKICAgIEZjVmFsdWVCaW5kaW5nCSAgICBiaW5kaW5nOwp9IEZjVmFsdWVMaXN0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjUGF0dGVybkVsdCB7CiAgICBjb25zdCBjaGFyCSAgICAqb2JqZWN0OwogICAgRmNWYWx1ZUxpc3QJICAgICp2YWx1ZXM7Cn0gRmNQYXR0ZXJuRWx0OwoKCnN0cnVjdCBfRmNQYXR0ZXJuIHsKICAgIGludAkJICAgIG51bTsKICAgIGludAkJICAgIHNpemU7CiAgICBGY1BhdHRlcm5FbHQgICAgKmVsdHM7CiAgICBpbnQJCSAgICByZWY7Cn07Cgp0eXBlZGVmIGVudW0gX0ZjT3AgewogICAgRmNPcEludGVnZXIsIEZjT3BEb3VibGUsIEZjT3BTdHJpbmcsIEZjT3BNYXRyaXgsIEZjT3BCb29sLCBGY09wQ2hhclNldCwgCiAgICBGY09wTmlsLAogICAgRmNPcEZpZWxkLCBGY09wQ29uc3QsCiAgICBGY09wQXNzaWduLCBGY09wQXNzaWduUmVwbGFjZSwgCiAgICBGY09wUHJlcGVuZEZpcnN0LCBGY09wUHJlcGVuZCwgRmNPcEFwcGVuZCwgRmNPcEFwcGVuZExhc3QsCiAgICBGY09wUXVlc3QsCiAgICBGY09wT3IsIEZjT3BBbmQsIEZjT3BFcXVhbCwgRmNPcE5vdEVxdWFsLCBGY09wQ29udGFpbnMsIEZjT3BOb3RDb250YWlucywKICAgIEZjT3BMZXNzLCBGY09wTGVzc0VxdWFsLCBGY09wTW9yZSwgRmNPcE1vcmVFcXVhbCwKICAgIEZjT3BQbHVzLCBGY09wTWludXMsIEZjT3BUaW1lcywgRmNPcERpdmlkZSwKICAgIEZjT3BOb3QsIEZjT3BDb21tYSwgRmNPcEludmFsaWQKfSBGY09wOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRXhwciB7CiAgICBGY09wICAgb3A7CiAgICB1bmlvbiB7CglpbnQJICAgIGl2YWw7Cglkb3VibGUJICAgIGR2YWw7CglGY0NoYXI4CSAgICAqc3ZhbDsKCUZjTWF0cml4ICAgICptdmFsOwoJRmNCb29sCSAgICBidmFsOwoJRmNDaGFyU2V0ICAgKmN2YWw7CgljaGFyCSAgICAqZmllbGQ7CglGY0NoYXI4CSAgICAqY29uc3RhbnQ7CglzdHJ1Y3QgewoJICAgIHN0cnVjdCBfRmNFeHByICpsZWZ0LCAqcmlnaHQ7Cgl9IHRyZWU7CiAgICB9IHU7Cn0gRmNFeHByOwoKdHlwZWRlZiBlbnVtIF9GY1F1YWwgewogICAgRmNRdWFsQW55LCBGY1F1YWxBbGwsIEZjUXVhbEZpcnN0LCBGY1F1YWxOb3RGaXJzdAp9IEZjUXVhbDsKCiNkZWZpbmUgRmNNYXRjaERlZmF1bHQJKChGY01hdGNoS2luZCkgLTEpCgp0eXBlZGVmIHN0cnVjdCBfRmNUZXN0IHsKICAgIHN0cnVjdCBfRmNUZXN0CSpuZXh0OwogICAgRmNNYXRjaEtpbmQJCWtpbmQ7CiAgICBGY1F1YWwJCXF1YWw7CiAgICBjb25zdCBjaGFyCQkqZmllbGQ7CiAgICBGY09wCQlvcDsKICAgIEZjRXhwcgkJKmV4cHI7Cn0gRmNUZXN0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRWRpdCB7CiAgICBzdHJ1Y3QgX0ZjRWRpdCAqbmV4dDsKICAgIGNvbnN0IGNoYXIJICAgICpmaWVsZDsKICAgIEZjT3AJICAgIG9wOwogICAgRmNFeHByCSAgICAqZXhwcjsKICAgIEZjVmFsdWVCaW5kaW5nICBiaW5kaW5nOwp9IEZjRWRpdDsKCnR5cGVkZWYgc3RydWN0IF9GY1N1YnN0IHsKICAgIHN0cnVjdCBfRmNTdWJzdAkqbmV4dDsKICAgIEZjVGVzdAkJKnRlc3Q7CiAgICBGY0VkaXQJCSplZGl0Owp9IEZjU3Vic3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTGVhZiB7CiAgICBGY0NoYXIzMgltYXBbMjU2LzMyXTsKfSBGY0NoYXJMZWFmOwoKI2RlZmluZSBGQ19SRUZfQ09OU1RBTlQJICAgIC0xCgpzdHJ1Y3QgX0ZjQ2hhclNldCB7CiAgICBpbnQJCSAgICByZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwogICAgaW50CQkgICAgbnVtOwkvKiBzaXplIG9mIGxlYXZlcyBhbmQgbnVtYmVycyBhcnJheXMgKi8KICAgIEZjQ2hhckxlYWYJICAgICoqbGVhdmVzOwogICAgRmNDaGFyMTYJICAgICpudW1iZXJzOwp9OwoKc3RydWN0IF9GY1N0clNldCB7CiAgICBpbnQJCSAgICByZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwogICAgaW50CQkgICAgbnVtOwogICAgaW50CQkgICAgc2l6ZTsKICAgIEZjQ2hhcjgJICAgICoqc3RyczsKfTsKCnN0cnVjdCBfRmNTdHJMaXN0IHsKICAgIEZjU3RyU2V0CSAgICAqc2V0OwogICAgaW50CQkgICAgbjsKfTsKCnR5cGVkZWYgc3RydWN0IF9GY1N0ckJ1ZiB7CiAgICBGY0NoYXI4ICpidWY7CiAgICBGY0Jvb2wgIGFsbG9jYXRlZDsKICAgIEZjQm9vbCAgZmFpbGVkOwogICAgaW50CSAgICBsZW47CiAgICBpbnQJICAgIHNpemU7Cn0gRmNTdHJCdWY7CgovKgogKiBUaGUgcGVyLXVzZXIgfi8uZm9udHMuY2FjaGUgZmlsZSBpcyBsb2FkZWQgaW50bwogKiB0aGlzIGRhdGEgc3RydWN0dXJlLiAgRWFjaCBkaXJlY3RvcnkgZ2V0cyBhIHN1YnN0cnVjdHVyZQogKiB3aGljaCBpcyB2YWxpZGF0ZWQgYnkgY29tcGFyaW5nIHRoZSBkaXJlY3RvcnkgdGltZXN0YW1wIHdpdGgKICogdGhhdCBzYXZlZCBpbiB0aGUgY2FjaGUuICBXaGVuIHZhbGlkLCB0aGUgZW50aXJlIGRpcmVjdG9yeSBjYWNoZQogKiBjYW4gYmUgaW1tZWRpYXRlbHkgbG9hZGVkIHdpdGhvdXQgcmVhZGluZyB0aGUgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlLAogKiB0aGUgZmlsZXMgYXJlIGNoZWNrZWQgaW5kaXZpZHVhbGx5OyB1cGRhdGVkIGZpbGVzIGFyZSBsb2FkZWQgaW50byB0aGUKICogY2FjaGUgd2hpY2ggaXMgdGhlbiByZXdyaXR0ZW4gdG8gdGhlIHVzZXJzIGhvbWUgZGlyZWN0b3J5CiAqLwoKI2RlZmluZSBGQ19HTE9CQUxfQ0FDSEVfRElSX0hBU0hfU0laRQkgICAgMzcKI2RlZmluZSBGQ19HTE9CQUxfQ0FDSEVfRklMRV9IQVNIX1NJWkUJICAgIDY3Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZUluZm8gewogICAgdW5zaWduZWQgaW50CQloYXNoOwogICAgRmNDaGFyOAkJCSpmaWxlOwogICAgdGltZV90CQkJdGltZTsKICAgIEZjQm9vbAkJCXJlZmVyZW5jZWQ7Cn0gRmNHbG9iYWxDYWNoZUluZm87Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZUZpbGUgewogICAgc3RydWN0IF9GY0dsb2JhbENhY2hlRmlsZQkqbmV4dDsKICAgIEZjR2xvYmFsQ2FjaGVJbmZvCQlpbmZvOwogICAgaW50CQkJCWlkOwogICAgRmNDaGFyOAkJCSpuYW1lOwp9IEZjR2xvYmFsQ2FjaGVGaWxlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVTdWJkaXIgewogICAgc3RydWN0IF9GY0dsb2JhbENhY2hlU3ViZGlyCSpuZXh0OwogICAgRmNDaGFyOAkJCSpmaWxlOwp9IEZjR2xvYmFsQ2FjaGVTdWJkaXI7Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZURpciB7CiAgICBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVEaXIJKm5leHQ7CiAgICBGY0dsb2JhbENhY2hlSW5mbyAgICAJaW5mbzsKICAgIGludAkJCQlsZW47CiAgICBGY0dsb2JhbENhY2hlRmlsZQkJKmVudHNbRkNfR0xPQkFMX0NBQ0hFX0ZJTEVfSEFTSF9TSVpFXTsKICAgIEZjR2xvYmFsQ2FjaGVTdWJkaXIJCSpzdWJkaXJzOwp9IEZjR2xvYmFsQ2FjaGVEaXI7Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZSB7CiAgICBGY0dsb2JhbENhY2hlRGlyCQkqZW50c1tGQ19HTE9CQUxfQ0FDSEVfRElSX0hBU0hfU0laRV07CiAgICBGY0Jvb2wJCQl1cGRhdGVkOwogICAgRmNCb29sCQkJYnJva2VuOwogICAgaW50CQkJCWVudHJpZXM7CiAgICBpbnQJCQkJcmVmZXJlbmNlZDsKfSBGY0dsb2JhbENhY2hlOwoKc3RydWN0IF9GY0F0b21pYyB7CiAgICBGY0NoYXI4CSpmaWxlOwkJLyogb3JpZ2luYWwgZmlsZSBuYW1lICovCiAgICBGY0NoYXI4CSpuZXc7CQkvKiB0ZW1wIGZpbGUgbmFtZSAtLSB3cml0ZSBkYXRhIGhlcmUgKi8KICAgIEZjQ2hhcjgJKmxjazsJCS8qIGxvY2tmaWxlIG5hbWUgKHVzZWQgZm9yIGxvY2tpbmcpICovCiAgICBGY0NoYXI4CSp0bXA7CQkvKiB0bXBmaWxlIG5hbWUgKHVzZWQgZm9yIGxvY2tpbmcpICovCn07CgpzdHJ1Y3QgX0ZjQmxhbmtzIHsKICAgIGludAkJbmJsYW5rOwogICAgaW50CQlzYmxhbms7CiAgICBGY0NoYXIzMgkqYmxhbmtzOwp9OwoKc3RydWN0IF9GY0NvbmZpZyB7CiAgICAvKgogICAgICogRmlsZSBuYW1lcyBsb2FkZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiAtLSBzYXZlZCBoZXJlIGFzIHRoZQogICAgICogY2FjaGUgZmlsZSBtdXN0IGJlIGNvbnN1bHRlZCBiZWZvcmUgdGhlIGRpcmVjdG9yaWVzIGFyZSBzY2FubmVkLAogICAgICogYW5kIHRob3NlIGRpcmVjdGl2ZXMgbWF5IG9jY3VyIGluIGFueSBvcmRlcgogICAgICovCiAgICBGY1N0clNldAkqY29uZmlnRGlyczsJICAgIC8qIGRpcmVjdG9yaWVzIHRvIHNjYW4gZm9yIGZvbnRzICovCiAgICBGY0NoYXI4CSpjYWNoZTsJCSAgICAvKiBuYW1lIG9mIHBlci11c2VyIGNhY2hlIGZpbGUgKi8KICAgIC8qCiAgICAgKiBTZXQgb2YgYWxsb3dlZCBibGFuayBjaGFycyAtLSB1c2VkIHRvCiAgICAgKiB0cmltIGZvbnRzIG9mIGJvZ3VzIGdseXBocwogICAgICovCiAgICBGY0JsYW5rcwkqYmxhbmtzOwogICAgLyoKICAgICAqIExpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBmb250cywKICAgICAqIGJ1aWx0IGJ5IHJlY3Vyc2l2ZWx5IHNjYW5uaW5nIHRoZSBzZXQgCiAgICAgKiBvZiBjb25maWd1cmVkIGRpcmVjdG9yaWVzCiAgICAgKi8KICAgIEZjU3RyU2V0CSpmb250RGlyczsKICAgIC8qCiAgICAgKiBOYW1lcyBvZiBhbGwgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdXNlZAogICAgICogdG8gY3JlYXRlIHRoaXMgY29uZmlndXJhdGlvbgogICAgICovCiAgICBGY1N0clNldAkqY29uZmlnRmlsZXM7CSAgICAvKiBjb25maWcgZmlsZXMgbG9hZGVkICovCiAgICAvKgogICAgICogU3Vic3RpdHV0aW9uIGluc3RydWN0aW9ucyBmb3IgcGF0dGVybnMgYW5kIGZvbnRzOwogICAgICogbWF4T2JqZWN0cyBpcyB1c2VkIHRvIGFsbG9jYXRlIGFwcHJvcHJpYXRlIGludGVybWVkaWF0ZSBzdG9yYWdlCiAgICAgKiB3aGlsZSBwZXJmb3JtaW5nIGEgd2hvbGUgc2V0IG9mIHN1YnN0aXR1dGlvbnMKICAgICAqLwogICAgRmNTdWJzdAkqc3Vic3RQYXR0ZXJuOwkgICAgLyogc3Vic3RpdHV0aW9ucyBmb3IgcGF0dGVybnMgKi8KICAgIEZjU3Vic3QJKnN1YnN0Rm9udDsJICAgIC8qIHN1YnN0aXR1dGlvbnMgZm9yIGZvbnRzICovCiAgICBpbnQJCW1heE9iamVjdHM7CSAgICAvKiBtYXhpbXVtIG51bWJlciBvZiB0ZXN0cyBpbiBhbGwgc3Vic3RzICovCiAgICAvKgogICAgICogVGhlIHNldCBvZiBmb250cyBsb2FkZWQgZnJvbSB0aGUgbGlzdGVkIGRpcmVjdG9yaWVzOyB0aGUKICAgICAqIG9yZGVyIHdpdGhpbiB0aGUgc2V0IGRvZXMgbm90IGRldGVybWluZSB0aGUgZm9udCBzZWxlY3Rpb24sCiAgICAgKiBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgaWRlbnRpY2FsIG1hdGNoZXMgaW4gd2hpY2ggY2FzZSBlYXJsaWVyIGZvbnRzCiAgICAgKiBtYXRjaCBwcmVmZXJyZW50aWFsbHkKICAgICAqLwogICAgRmNGb250U2V0CSpmb250c1tGY1NldEFwcGxpY2F0aW9uICsgMV07CiAgICAvKgogICAgICogRm9udGNvbmZpZyBjYW4gcGVyaW9kaWNhbGx5IHJlc2NhbiB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24KICAgICAqIGFuZCBmb250IGRpcmVjdG9yaWVzLiAgVGhpcyByZXNjYW5uaW5nIG9jY3VycyB3aGVuIGZvbnQKICAgICAqIGxpc3RpbmcgcmVxdWVzdHMgYXJlIG1hZGUsIGJ1dCBubyBtb3JlIG9mdGVuIHRoYW4gcmVzY2FuSW50ZXJ2YWwKICAgICAqIHNlY29uZHMgYXBhcnQuCiAgICAgKi8KICAgIHRpbWVfdAlyZXNjYW5UaW1lOwkgICAgLyogbGFzdCB0aW1lIGluZm9ybWF0aW9uIHdhcyBzY2FubmVkICovCiAgICBpbnQJCXJlc2NhbkludGVydmFsOwkgICAgLyogaW50ZXJ2YWwgYmV0d2VlbiBzY2FucyAqLwp9OwogCmV4dGVybiBGY0NvbmZpZwkqX2ZjQ29uZmlnOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhck1hcCBGY0NoYXJNYXA7CgovKiBmY2JsYW5rcy5jICovCgovKiBmY2NhY2hlLmMgKi8KCkZjR2xvYmFsQ2FjaGUgKgpGY0dsb2JhbENhY2hlQ3JlYXRlICh2b2lkKTsKCnZvaWQKRmNHbG9iYWxDYWNoZURlc3Ryb3kgKEZjR2xvYmFsQ2FjaGUgKmNhY2hlKTsKCkZjQm9vbApGY0dsb2JhbENhY2hlQ2hlY2tUaW1lIChGY0dsb2JhbENhY2hlSW5mbyAqaW5mbyk7Cgp2b2lkCkZjR2xvYmFsQ2FjaGVSZWZlcmVuY2VkIChGY0dsb2JhbENhY2hlCSAgICAqY2FjaGUsCgkJCSBGY0dsb2JhbENhY2hlSW5mbyAgKmluZm8pOwoKRmNHbG9iYWxDYWNoZURpciAqCkZjR2xvYmFsQ2FjaGVEaXJHZXQgKEZjR2xvYmFsQ2FjaGUgICpjYWNoZSwKCQkgICAgIGNvbnN0IEZjQ2hhcjggICpkaXIsCgkJICAgICBpbnQJICAgIGxlbiwKCQkgICAgIEZjQm9vbAkgICAgY3JlYXRlX21pc3NpbmcpOwoKRmNCb29sCkZjR2xvYmFsQ2FjaGVTY2FuRGlyIChGY0ZvbnRTZXQJCSpzZXQsCgkJICAgICAgRmNTdHJTZXQJCSpkaXJzLAoJCSAgICAgIEZjR2xvYmFsQ2FjaGUJKmNhY2hlLAoJCSAgICAgIGNvbnN0IEZjQ2hhcjgJKmRpcik7CgpGY0dsb2JhbENhY2hlRmlsZSAqCkZjR2xvYmFsQ2FjaGVGaWxlR2V0IChGY0dsb2JhbENhY2hlICpjYWNoZSwKCQkgICAgICBjb25zdCBGY0NoYXI4ICpmaWxlLAoJCSAgICAgIGludAkgICAgaWQsCgkJICAgICAgaW50CSAgICAqY291bnQpOwoKCnZvaWQKRmNHbG9iYWxDYWNoZUxvYWQgKEZjR2xvYmFsQ2FjaGUgICAgKmNhY2hlLAoJCSAgIGNvbnN0IEZjQ2hhcjggICAgKmNhY2hlX2ZpbGUpOwoKRmNCb29sCkZjR2xvYmFsQ2FjaGVVcGRhdGUgKEZjR2xvYmFsQ2FjaGUgICpjYWNoZSwKCQkgICAgIGNvbnN0IEZjQ2hhcjggICpmaWxlLAoJCSAgICAgaW50CSAgICBpZCwKCQkgICAgIGNvbnN0IEZjQ2hhcjggICpuYW1lKTsKCkZjQm9vbApGY0dsb2JhbENhY2hlU2F2ZSAoRmNHbG9iYWxDYWNoZSAgICAqY2FjaGUsCgkJICAgY29uc3QgRmNDaGFyOCAgICAqY2FjaGVfZmlsZSk7CgpGY0Jvb2wKRmNEaXJDYWNoZVJlYWREaXIgKEZjRm9udFNldCAqc2V0LCBGY1N0clNldCAqZGlycywgY29uc3QgRmNDaGFyOCAqZGlyKTsKCkZjQm9vbApGY0RpckNhY2hlV3JpdGVEaXIgKEZjRm9udFNldCAqc2V0LCBGY1N0clNldCAqZGlycywgY29uc3QgRmNDaGFyOCAqZGlyKTsKICAgIAovKiBmY2NmZy5jICovCgpGY0Jvb2wKRmNDb25maWdBZGRDb25maWdEaXIgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJCSAgICAgIGNvbnN0IEZjQ2hhcjggKmQpOwoKRmNCb29sCkZjQ29uZmlnQWRkRm9udERpciAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgIGNvbnN0IEZjQ2hhcjggICAqZCk7CgpGY0Jvb2wKRmNDb25maWdBZGREaXIgKEZjQ29uZmlnCSpjb25maWcsCgkJY29uc3QgRmNDaGFyOAkqZCk7CgpGY0Jvb2wKRmNDb25maWdBZGRDb25maWdGaWxlIChGY0NvbmZpZwkJKmNvbmZpZywKCQkgICAgICAgY29uc3QgRmNDaGFyOAkqZik7CgpGY0Jvb2wKRmNDb25maWdTZXRDYWNoZSAoRmNDb25maWcJKmNvbmZpZywKCQkgIGNvbnN0IEZjQ2hhcjgJKmMpOwoKRmNCb29sCkZjQ29uZmlnQWRkQmxhbmsgKEZjQ29uZmlnCSpjb25maWcsCgkJICBGY0NoYXIzMiAgICAJYmxhbmspOwoKRmNCb29sCkZjQ29uZmlnQWRkRWRpdCAoRmNDb25maWcJKmNvbmZpZywKCQkgRmNUZXN0CQkqdGVzdCwKCQkgRmNFZGl0CQkqZWRpdCwKCQkgRmNNYXRjaEtpbmQJa2luZCk7Cgp2b2lkCkZjQ29uZmlnU2V0Rm9udHMgKEZjQ29uZmlnCSpjb25maWcsCgkJICBGY0ZvbnRTZXQJKmZvbnRzLAoJCSAgRmNTZXROYW1lCXNldCk7CgpGY0Jvb2wKRmNDb25maWdDb21wYXJlVmFsdWUgKGNvbnN0IEZjVmFsdWUgbSwKCQkgICAgICBGY09wCSAgICBvcCwKCQkgICAgICBjb25zdCBGY1ZhbHVlIHYpOwoKLyogZmNjaGFyc2V0LmMgKi8KRmNDaGFyU2V0ICoKRmNDaGFyU2V0RnJlZXplIChGY0NoYXJTZXQgKmNzKTsKCkZjQm9vbApGY05hbWVVbnBhcnNlQ2hhclNldCAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyU2V0ICpjKTsKCkZjQ2hhclNldCAqCkZjTmFtZVBhcnNlQ2hhclNldCAoRmNDaGFyOCAqc3RyaW5nKTsKCkZjQ2hhcjMyCkZjRnJlZVR5cGVVY3M0VG9Qcml2YXRlIChGY0NoYXIzMiB1Y3M0LCBjb25zdCBGY0NoYXJNYXAgKm1hcCk7CgpGY0NoYXIzMgpGY0ZyZWVUeXBlUHJpdmF0ZVRvVWNzNCAoRmNDaGFyMzIgcHJpdmF0ZSwgY29uc3QgRmNDaGFyTWFwICptYXApOwoKY29uc3QgRmNDaGFyTWFwICoKRmNGcmVlVHlwZUdldFByaXZhdGVNYXAgKEZUX0VuY29kaW5nIGVuY29kaW5nKTsKICAgIAovKiBmY2RiZy5jICovCnZvaWQKRmNWYWx1ZUxpc3RQcmludCAoY29uc3QgRmNWYWx1ZUxpc3QgKmwpOwoKdm9pZApGY09wUHJpbnQgKEZjT3Agb3ApOwoKdm9pZApGY1Rlc3RQcmludCAoY29uc3QgRmNUZXN0ICp0ZXN0KTsKCnZvaWQKRmNFeHByUHJpbnQgKGNvbnN0IEZjRXhwciAqZXhwcik7Cgp2b2lkCkZjRWRpdFByaW50IChjb25zdCBGY0VkaXQgKmVkaXQpOwoKdm9pZApGY1N1YnN0UHJpbnQgKGNvbnN0IEZjU3Vic3QgKnN1YnN0KTsKCmludApGY0RlYnVnICh2b2lkKTsKCi8qIGZjZGlyLmMgKi8KCi8qIGZjZm9udC5jICovCmludApGY0ZvbnREZWJ1ZyAodm9pZCk7CiAgICAKLyogZmNmcmVldHlwZS5jICovCkZjQm9vbApGY0ZyZWVUeXBlSXNFeGNsdXNpdmVMYW5nIChjb25zdCBGY0NoYXI4ICAqbGFuZyk7CgpGY0Jvb2wKRmNGcmVlVHlwZUhhc0xhbmcgKEZjUGF0dGVybiAqcGF0dGVybiwgY29uc3QgRmNDaGFyOCAqbGFuZyk7CgovKiBmY2ZzLmMgKi8KLyogZmNncmFtLnkgKi8KaW50CkZjQ29uZmlncGFyc2UgKHZvaWQpOwoKaW50CkZjQ29uZmlnd3JhcCAodm9pZCk7CiAgICAKdm9pZApGY0NvbmZpZ2Vycm9yIChjaGFyICpmbXQsIC4uLik7CiAgICAKY2hhciAqCkZjQ29uZmlnU2F2ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCk7CgpGY1Rlc3QgKgpGY1Rlc3RDcmVhdGUgKEZjTWF0Y2hLaW5kICAga2luZCwKCSAgICAgIEZjUXVhbAkgICAgcXVhbCwKCSAgICAgIGNvbnN0IEZjQ2hhcjggKmZpZWxkLAoJICAgICAgRmNPcAkgICAgY29tcGFyZSwKCSAgICAgIEZjRXhwcgkgICAgKmV4cHIpOwoKdm9pZApGY1Rlc3REZXN0cm95IChGY1Rlc3QgKnRlc3QpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlSW50ZWdlciAoaW50IGkpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlRG91YmxlIChkb3VibGUgZCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVTdHJpbmcgKGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlTWF0cml4IChjb25zdCBGY01hdHJpeCAqbSk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVCb29sIChGY0Jvb2wgYik7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVOaWwgKHZvaWQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUNvbnN0IChjb25zdCBGY0NoYXI4ICpjb25zdGFudCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVPcCAoRmNFeHByICpsZWZ0LCBGY09wIG9wLCBGY0V4cHIgKnJpZ2h0KTsKCnZvaWQKRmNFeHByRGVzdHJveSAoRmNFeHByICplKTsKCkZjRWRpdCAqCkZjRWRpdENyZWF0ZSAoY29uc3QgY2hhciAqZmllbGQsIEZjT3Agb3AsIEZjRXhwciAqZXhwciwgRmNWYWx1ZUJpbmRpbmcgYmluZGluZyk7Cgp2b2lkCkZjRWRpdERlc3Ryb3kgKEZjRWRpdCAqZSk7CgovKiBmY2luaXQuYyAqLwoKdm9pZApGY01lbVJlcG9ydCAodm9pZCk7Cgp2b2lkCkZjTWVtQWxsb2MgKGludCBraW5kLCBpbnQgc2l6ZSk7Cgp2b2lkCkZjTWVtRnJlZSAoaW50IGtpbmQsIGludCBzaXplKTsKCi8qIGZjbGFuZy5jICovCkZjTGFuZ1NldCAqCkZjRnJlZVR5cGVMYW5nU2V0IChjb25zdCBGY0NoYXJTZXQgICpjaGFyc2V0LCAKCQkgICBjb25zdCBGY0NoYXI4ICAgICpleGNsdXNpdmVMYW5nKTsKCkZjTGFuZ1Jlc3VsdApGY0xhbmdDb21wYXJlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwogICAgCmNvbnN0IEZjQ2hhclNldCAqCkZjQ2hhclNldEZvckxhbmcgKGNvbnN0IEZjQ2hhcjggKmxhbmcpOwoKRmNMYW5nU2V0ICoKRmNMYW5nU2V0UHJvbW90ZSAoY29uc3QgRmNDaGFyOCAqbGFuZyk7CgpGY0xhbmdTZXQgKgpGY05hbWVQYXJzZUxhbmdTZXQgKGNvbnN0IEZjQ2hhcjggKnN0cmluZyk7CgpGY0Jvb2wKRmNOYW1lVW5wYXJzZUxhbmdTZXQgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjTGFuZ1NldCAqbHMpOwoKLyogZmNsaXN0LmMgKi8KCi8qIGZjbWF0Y2guYyAqLwoKLyogZmNuYW1lLmMgKi8KCkZjQm9vbApGY05hbWVCb29sIChGY0NoYXI4ICp2LCBGY0Jvb2wgKnJlc3VsdCk7CgovKiBmY3BhdC5jICovCnZvaWQKRmNWYWx1ZUxpc3REZXN0cm95IChGY1ZhbHVlTGlzdCAqbCk7CiAgICAKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuRmluZEVsdCAoY29uc3QgRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpOwoKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuSW5zZXJ0RWx0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkV2l0aEJpbmRpbmcgIChGY1BhdHRlcm4JICAgICpwLAoJCQkgIGNvbnN0IGNoYXIJICAgICpvYmplY3QsCgkJCSAgRmNWYWx1ZQkgICAgdmFsdWUsCgkJCSAgRmNWYWx1ZUJpbmRpbmcgICAgYmluZGluZywKCQkJICBGY0Jvb2wJICAgIGFwcGVuZCk7CgpGY1BhdHRlcm4gKgpGY1BhdHRlcm5GcmVlemUgKEZjUGF0dGVybiAqcCk7CgovKiBmY3JlbmRlci5jICovCgovKiBmY21hdHJpeC5jICovCgpleHRlcm4gY29uc3QgRmNNYXRyaXggICAgRmNJZGVudGl0eU1hdHJpeDsKCnZvaWQKRmNNYXRyaXhGcmVlIChGY01hdHJpeCAqbWF0KTsKCi8qIGZjc3RyLmMgKi8KRmNDaGFyOCAqCkZjU3RyUGx1cyAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKICAgIAp2b2lkCkZjU3RyRnJlZSAoRmNDaGFyOCAqcyk7Cgp2b2lkCkZjU3RyQnVmSW5pdCAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyOCAqaW5pdCwgaW50IHNpemUpOwoKdm9pZApGY1N0ckJ1ZkRlc3Ryb3kgKEZjU3RyQnVmICpidWYpOwoKRmNDaGFyOCAqCkZjU3RyQnVmRG9uZSAoRmNTdHJCdWYgKmJ1Zik7CgpGY0Jvb2wKRmNTdHJCdWZDaGFyIChGY1N0ckJ1ZiAqYnVmLCBGY0NoYXI4IGMpOwoKRmNCb29sCkZjU3RyQnVmU3RyaW5nIChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1N0ckJ1ZkRhdGEgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhcjggKnMsIGludCBsZW4pOwoKaW50CkZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCiNlbmRpZiAvKiBfRkNfSU5UX0hfICovCg==