From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============9130494692261863830==" MIME-Version: 1.0 From: rajyalakshmi bommaraju Subject: Patch for merging voice call history plugin implementation Date: Mon, 17 May 2010 23:54:53 +0000 Message-ID: <4BF1D591.4070308@intel.com> List-Id: To: ofono@ofono.org --===============9130494692261863830== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi, I have implemented voice call history plugin using memory mapped file , = the implementation tested on meego images right now as an external = plugin to ofono. I am submitting the code here so that it works as = builtin plugin for ofono in future. Please review the patch and let = me know if your decision. Thanks Raji Bommaraju --===============9130494692261863830== Content-Type: text/x-patch MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Merging-callhistory-plugin-implementation.patch" PkZyb20gZGY4ZTIwNDIxYmVhZTlkMGU5ODhmNTA2Yzc1MGI1MzUxNDY2ODA2ZiBNb24gU2VwIDE3 IDAwOjAwOjAwIDIwMDEKRnJvbTogUmFqaSBCb21tYXJhanUgPFJhanlhbGFrc2htaSBCb21tYXJh anU+CkRhdGU6IE1vbiwgMTcgTWF5IDIwMTAgMTE6MDg6NTggLTA3MDAKU3ViamVjdDogW1BBVENI XSBNZXJnaW5nIGNhbGxoaXN0b3J5IHBsdWdpbiBpbXBsZW1lbnRhdGlvbgoKLS0tCiBNYWtlZmls ZS5hbSAgICAgICAgICAgfCAgICAzICsKIHBsdWdpbnMvY2FsbGhpc3RvcnkuYyB8ICA1NzkgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMiBmaWxlcyBj aGFuZ2VkLCA1ODIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEw MDY0NCBwbHVnaW5zL2NhbGxoaXN0b3J5LmMKCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01h a2VmaWxlLmFtCmluZGV4IDdmZDg2MmYuLjcxZDI0NDAgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmFt CisrKyBiL01ha2VmaWxlLmFtCkBAIC0yMzksNiArMjM5LDkgQEAgYnVpbHRpbl9zb3VyY2VzICs9 IHBsdWdpbnMvcGFsbXByZS5jCiBidWlsdGluX21vZHVsZXMgKz0gc3RlCiBidWlsdGluX3NvdXJj ZXMgKz0gcGx1Z2lucy9zdGUuYwogCitidWlsdGluX21vZHVsZXMgKz0gY2FsbGhpc3RvcnkgCiti dWlsdGluX3NvdXJjZXMgKz0gcGx1Z2lucy9jYWxsaGlzdG9yeS5jCisKIGVuZGlmCiAKIGlmIE1B SU5UQUlORVJfTU9ERQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9jYWxsaGlzdG9yeS5jIGIvcGx1Z2lu cy9jYWxsaGlzdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkY2Uz YzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL2NhbGxoaXN0b3J5LmMKQEAgLTAsMCArMSw1 NzkgQEAKKy8qCisgKgorICogb0Zvbm8gLSBPcGVuIFNvdXJjZSBUZWxlcGhvbnkKKyAqCisgKiBD b3B5cmlnaHQgKEMpIDIwMDgtMjAxMCAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK KyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90 LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy YW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgor ICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRp ZgorCisjZGVmaW5lIE9GT05PX0FQSV9TVUJKRUNUX1RPX0NIQU5HRQorI2luY2x1ZGUgPHN0cmlu Zy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8 c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVk ZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgor I2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHN5 cy9tbWFuLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNp bmNsdWRlIDxvZm9uby9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWdsaWIuaD4KKyNpbmNs dWRlIDxvZm9uby90eXBlcy5oPgorI2luY2x1ZGUgPG9mb25vL3BsdWdpbi5oPgorI2luY2x1ZGUg PG9mb25vL2xvZy5oPgorI2luY2x1ZGUgPG9mb25vL2hpc3RvcnkuaD4KKyNpbmNsdWRlICJnZGJ1 cy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorCisjZGVmaW5lIEhJU1RPUllfRklMRV9QQVRIICIv dmFyL2NhY2hlL2NhbGxoaXN0b3J5LyIKKyNkZWZpbmUgSElTVE9SWV9GSUxFIEhJU1RPUllfRklM RV9QQVRIInZvaWNlY2FsbGhpc3RvcnlkYXRhIgorI2RlZmluZSBPRk9OT19NQU5BR0VSX1BBVEgg Ii8iCisjZGVmaW5lIFBIT05FX05VTUJFUl9TSVpFIDY0CisjZGVmaW5lIFJFQ09SRF9TSVpFIDgw CisjZGVmaW5lIEhFQURFUl9TSVpFIDE2IAorCisjaWZkZWYgTlVNX1ZDQUxMX0hJU1RPUllfRU5U UklFUworI2RlZmluZSBNQVhfSVRFTVMgTlVNX1ZDQUxMX0hJU1RPUllfRU5UUklFUworI2Vsc2UK KyNkZWZpbmUgTUFYX0lURU1TIDUwCisjZW5kaWYKKworI2RlZmluZSBUT1RBTF9TSVpFIChNQVhf SVRFTVMgKiBSRUNPUkRfU0laRSArIEhFQURFUl9TSVpFKQorCitlbnVtIFZPSUNFX0NBTExfVFlQ RSB7CisJT1VUR09JTkcgPSAwLAorCUlOQ09NSU5HLAorCU1JU1NFRAorfTsKKwordHlwZWRlZiBz dHJ1Y3QgX0ZJTEVIRUFERVIgeworCWludCBoZWFkOworCWludCB0YWlsOworCWludCB1bnJlYWQ7 CisJdW5zaWduZWQgaW50IGxhc3RpZDsgCit9IEhpc3RvcnlGaWxlSGVhZGVyOworCit0eXBlZGVm IHN0cnVjdCBfVk9JQ0VISVNUT1JZIHsKKwlpbnQgaWQ7CisJY2hhciBsaW5laWRbUEhPTkVfTlVN QkVSX1NJWkVdOworCXNob3J0IGludCBjYWxsdHlwZTsKKwl0aW1lX3Qgc3RhcnR0aW1lOworCXRp bWVfdCBlbmR0aW1lOworfSBWb2ljZUhpc3Rvcnk7CisKKy8vIEdsb2JhbCBTaGFyZWQgZGF0YQor dHlwZWRlZiBzdHJ1Y3QgX1NIQVJFRAoreworCUhpc3RvcnlGaWxlSGVhZGVyIGhlYWRlcjsKKwl2 b2lkICpkYXRhTWFwOworCXNlbV90IG11dGV4OworCWludCB0ZW1wX3VucmVhZDsKKwlpbnQgdGVt cF90YWlsOworfSBTaGFyZWREYXRhOworCitzdGF0aWMgU2hhcmVkRGF0YSAqc2hhcmVkX2RhdGEg PSBOVUxMOworCisKK3N0YXRpYyB2b2lkIGNhbGxoaXN0b3J5X2VtaXRfdm9pY2VfaGlzdG9yeV9j aGFuZ2VkKGludCApOworCitzdGF0aWMgaW50IGNhbGxfaGlzdG9yeV9wcm9iZShzdHJ1Y3Qgb2Zv bm9faGlzdG9yeV9jb250ZXh0ICpjb250ZXh0KQoreworCURCRygiSGlzdG9yeSBQcm9iZSBmb3Ig bW9kZW06ICVwIiwgY29udGV4dC0+bW9kZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBjYWxsX2hpc3RvcnlfcmVtb3ZlKHN0cnVjdCBvZm9ub19oaXN0b3J5X2NvbnRleHQgKmNvbnRl eHQpCit7CisJREJHKCJFeGFtcGxlIEhpc3RvcnkgUmVtb3ZlIGZvciBtb2RlbTogJXAiLCBjb250 ZXh0LT5tb2RlbSk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFuX3VwKCkKK3sKKwlnX3JldHVybl9p Zl9mYWlsKHNoYXJlZF9kYXRhIT0gTlVMTCk7CisKKwlzZW1fd2FpdCgmKHNoYXJlZF9kYXRhLT5t dXRleCkpOworCS8vIHVubWFwCisJbXVubWFwKHNoYXJlZF9kYXRhLT5kYXRhTWFwLFRPVEFMX1NJ WkUpOworCXNlbV9wb3N0KCYoc2hhcmVkX2RhdGEtPm11dGV4KSk7CisKKwkvLyByZW1vdmUgc2Vt YXBob3JlCisJaWYgKHNlbV9kZXN0cm95KCYoc2hhcmVkX2RhdGEtPm11dGV4KSkgPCAwKQorCQlw ZXJyb3IoInNlbV9kZXN0cm95IGZhaWxlZCIpOworCisJZ19mcmVlKHNoYXJlZF9kYXRhKTsKK30K KworCitzdGF0aWMgaW50IGluaXRfc2VtKCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWUgPSAxOwor CWdfcmV0dXJuX3ZhbF9pZl9mYWlsKHNoYXJlZF9kYXRhIT0gTlVMTCwtMSk7CisKKwlpZiAoc2Vt X2luaXQoJihzaGFyZWRfZGF0YS0+bXV0ZXgpLCBUUlVFLCB2YWx1ZSkgPCAwKXsKKwkJcGVycm9y KCJzZW1faW5pdCBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBpbml0X2hlYWRlcih2b2lkICpkYXRhUHRyKQoreworCWludCB1bnJlYWQgPSAw OworCisJZ19yZXR1cm5fdmFsX2lmX2ZhaWwoKHNoYXJlZF9kYXRhIT1OVUxMKSwgLTEpOworCWdf cmV0dXJuX3ZhbF9pZl9mYWlsKChkYXRhUHRyIT1OVUxMKSwgLTEpOworCXVucmVhZCA9IChzaGFy ZWRfZGF0YS0+aGVhZGVyKS51bnJlYWQ7CisKKwlzZW1fd2FpdCgmKHNoYXJlZF9kYXRhLT5tdXRl eCkpOworCW1lbWNweSgmKHNoYXJlZF9kYXRhLT5oZWFkZXIpLCAoSGlzdG9yeUZpbGVIZWFkZXIg KikoZGF0YVB0ciksCisJCQkJCQkJSEVBREVSX1NJWkUpOworCisJb2Zvbm9fZGVidWcoIlVucmVh ZDogJWQsIEhlYWRlcjogJWQsIFRhaWw6ICVkLCBzZXJpYWxubzogJWRcbiIsCisJCQkJCXVucmVh ZCwKKwkJCQkJKHNoYXJlZF9kYXRhLT5oZWFkZXIpLmhlYWQsCisJCQkJCShzaGFyZWRfZGF0YS0+ aGVhZGVyKS50YWlsLAorCQkJCQkoc2hhcmVkX2RhdGEtPmhlYWRlcikubGFzdGlkKTsKKwlzZW1f cG9zdCgmKHNoYXJlZF9kYXRhLT5tdXRleCkpOworCWlmICh1bnJlYWQgPiAwKXsKKwkJY2FsbGhp c3RvcnlfZW1pdF92b2ljZV9oaXN0b3J5X2NoYW5nZWQodW5yZWFkKTsKKwl9CisJcmV0dXJuIDA7 Cit9CisKKy8qKgorICogQ3JlYXRlcyBmaWxlICAiY2FsbGhpc3RvcnkiCisgKi8KK3N0YXRpYyBn Ym9vbGVhbiBpbml0X2ZpbGUoKQoreworCWludCBoaXN0b3J5RmlsZTsKKwlzdHJ1Y3Qgc3RhdCBz dGF0YnVmOworCURJUiAqZGlycHRyOworCWNoYXIgKmZpbGwgPSBOVUxMOworCisJZ19yZXR1cm5f dmFsX2lmX2ZhaWwoKHNoYXJlZF9kYXRhIT1OVUxMKSwgRkFMU0UpOworCisJaWYgKCEoZGlycHRy ID0gb3BlbmRpcihISVNUT1JZX0ZJTEVfUEFUSCkpICl7CisJCW9mb25vX2RlYnVnKCIlczogZG9l c250IGV4aXN0IixISVNUT1JZX0ZJTEVfUEFUSCk7CisJCWlmIChta2RpcihISVNUT1JZX0ZJTEVf UEFUSCwKKwkJCQlTX0lSV1hVfFNfSVJHUlB8U19JWEdSUHxTX0lST1RIfFNfSVhPVEgpIDwgMCl7 CisJCQlwZXJyb3IoIkVycm9yIGNyZWF0aW5nIGNhbGxoaXN0b3J5IGRpciIpOworCQkJcmV0dXJu IEZBTFNFOworCQl9CisJfQorCisJaWYgKChoaXN0b3J5RmlsZSA9IG9wZW4oIEhJU1RPUllfRklM RSwKKwkJCQlPX1JEV1J8T19DUkVBVHxPX0FQUEVORCwKKwkJCQlTX0lSV1hVKSkKKwkJCQk8IDAp eworCQlwZXJyb3IoIk9wZW4gZmlsZSBmYWlsZWQiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwor CWlmIChzdGF0KCBISVNUT1JZX0ZJTEUsJnN0YXRidWYpIDwgLTEpeworCQlwZXJyb3IoInN0YXQg ZmFpbGVkIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJb2Zvbm9fZGVidWcoInN0YXQgZmlsZTog JWQiLChpbnQpIChzdGF0YnVmLnN0X3NpemUpKTsKKworCWlmIChzdGF0YnVmLnN0X3NpemUgPT0g MCl7CisJCWludCBieXRlc3dyaXR0ZW4gPSAwOworCQkvL3dyaXRlIGhlYWRlciB0byB0aGUgZmls ZQorCQkoc2hhcmVkX2RhdGEtPmhlYWRlcikuaGVhZD1IRUFERVJfU0laRTsKKwkJKHNoYXJlZF9k YXRhLT5oZWFkZXIpLnRhaWw9KHNoYXJlZF9kYXRhLT5oZWFkZXIpLmhlYWQ7CisJCShzaGFyZWRf ZGF0YS0+aGVhZGVyKS51bnJlYWQ9MDsKKwkJb2Zvbm9fZGVidWcoInNldHRpbmcgaGVhZDogJWQs dGFpbDogJWQsdW5yZWFkOiAlZCIsCisJCQkJCQkoc2hhcmVkX2RhdGEtPmhlYWRlcikuaGVhZCwK KwkJCQkJCShzaGFyZWRfZGF0YS0+aGVhZGVyKS50YWlsLAorCQkJCQkJKHNoYXJlZF9kYXRhLT5o ZWFkZXIpLnVucmVhZCk7CisKKwkJLy8gIGZpbGwgdGhlIGZpbGUgd2l0aCB6ZXJvcworCQlvZm9u b19kZWJ1ZygiVHJ5aW5nIHRvIGFsbG9jYXRlICVkIHNpemUiLFRPVEFMX1NJWkUpOworCQlmaWxs ID0gKGNoYXIgKikgZ190cnlfbWFsbG9jMChUT1RBTF9TSVpFKTsKKyAgICAgICAgIAlpZiAoIWZp bGwgKXsKKyAgICAgICAgICAgICAJCW9mb25vX2RlYnVnKCJFcnJvciBhbGxvY2F0aW5nIGluaXQg bWVtb3J5Iik7CisgICAgICAgICAgICAgCQlyZXR1cm4gRkFMU0U7CisJCX0KKyAgICAgICAgCisJ CS8vIFByZWRlZmluZSBmaWxlIHNpemUgYW5kIGZpbGwgd2l0aCBzb21lIGRhdGEKKwkJYnplcm8o ZmlsbCxUT1RBTF9TSVpFKTsKKwkJbWVtY3B5KGZpbGwsJihzaGFyZWRfZGF0YS0+aGVhZGVyKSwg SEVBREVSX1NJWkUpOworCisJCWlmICgoYnl0ZXN3cml0dGVuID0gd3JpdGUgKGhpc3RvcnlGaWxl LGZpbGwsIFRPVEFMX1NJWkUpKSA8MCl7CisJCQlvZm9ub19kZWJ1ZygiRXJyb3Igd3JpdGluZyB0 byBmaWxlIik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJZ19mcmVlKGZpbGwpOworCisJCXN0 YXRidWYuc3Rfc2l6ZSA9IFRPVEFMX1NJWkU7CisJCW9mb25vX2RlYnVnKCJIaXN0b3J5IGZpbGUg JWQgc2l6ZSBjcmVhdGVkIFxuIixieXRlc3dyaXR0ZW4pOworCX0KKwkvLyBjcmVhdGUgc2VtYXBo b3JlCisJaWYgKGluaXRfc2VtKCkgPCAwKQorCQlyZXR1cm4gRkFMU0U7IAorCisJc2VtX3dhaXQo JihzaGFyZWRfZGF0YS0+bXV0ZXgpKTsKKwlzaGFyZWRfZGF0YS0+ZGF0YU1hcCA9IG1tYXAoKCBj YWRkcl90KU5VTEwsCisJCQkJc3RhdGJ1Zi5zdF9zaXplLAorCQkJCVBST1RfUkVBRHxQUk9UX1dS SVRFfFBST1RfRVhFQywKKwkJCQlNQVBfU0hBUkVELAorCQkJCWhpc3RvcnlGaWxlLAorCQkJCTAp OworCXNlbV9wb3N0KCYoc2hhcmVkX2RhdGEtPm11dGV4KSk7CisJaWYgKHNoYXJlZF9kYXRhLT5k YXRhTWFwID09ICh2b2lkICopKC0xKSl7CisJCXBlcnJvcigibW1hcCBmYWxpZWQiKTsKKwkJcmV0 dXJuIEZBTFNFOworCX0KKworCWNsb3NlKGhpc3RvcnlGaWxlKTsKKworCWluaXRfaGVhZGVyKHNo YXJlZF9kYXRhLT5kYXRhTWFwKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBz eW5jX21lbV9maWxlKFZvaWNlSGlzdG9yeSAqdmNhbGwpeworCXZvaWQgKndyaXRlTWFwID0gTlVM TDsKKwlpbnQgdW5yZWFkID0gMDsKKworCWdfcmV0dXJuX2lmX2ZhaWwodmNhbGwgIT0gTlVMTCk7 CisJZ19yZXR1cm5faWZfZmFpbChzaGFyZWRfZGF0YSAhPSBOVUxMKTsKKwlnX3JldHVybl9pZl9m YWlsKHNoYXJlZF9kYXRhLT5kYXRhTWFwICE9IE5VTEwpOworCisJc2VtX3dhaXQoJihzaGFyZWRf ZGF0YS0+bXV0ZXgpKTsKKworCXdyaXRlTWFwID0gc2hhcmVkX2RhdGEtPmRhdGFNYXA7CisJd3Jp dGVNYXAgPSB3cml0ZU1hcCArIChzaGFyZWRfZGF0YS0+aGVhZGVyKS5oZWFkOyAKKwl2Y2FsbC0+ aWQgPSAoc2hhcmVkX2RhdGEtPmhlYWRlcikubGFzdGlkOworCShzaGFyZWRfZGF0YS0+aGVhZGVy KS5sYXN0aWQrKzsKKwltZW1jcHkod3JpdGVNYXAsIHZjYWxsLCBSRUNPUkRfU0laRSk7CisKKwkv LyB1cGRhdGUgaGVhZGVyCisJKChzaGFyZWRfZGF0YS0+aGVhZGVyKS51bnJlYWQpKys7CisJKHNo YXJlZF9kYXRhLT5oZWFkZXIpLmhlYWQgKz0gUkVDT1JEX1NJWkU7CisJaWYgKChzaGFyZWRfZGF0 YS0+aGVhZGVyKS5sYXN0aWQgPj0gVUlOVF9NQVgpCisJCShzaGFyZWRfZGF0YS0+aGVhZGVyKS5s YXN0aWQgPSAwOworCisJdW5yZWFkID0gKHNoYXJlZF9kYXRhLT5oZWFkZXIpLnVucmVhZDsKKwkK KwkvL2hlYWRlciByZWFjaGVzIGVuZCBvZiBmaWxlCisJaWYgKChzaGFyZWRfZGF0YS0+aGVhZGVy KS5oZWFkID49IFRPVEFMX1NJWkUpeworCQkvL3Jlc2V0IGhlYWQgYmFjayB0byBmcm9udAorCQko c2hhcmVkX2RhdGEtPmhlYWRlcikuaGVhZCA9IEhFQURFUl9TSVpFOworCisgICAgICAgIAlvZm9u b19kZWJ1ZygiSGVhZGVyID0gJWQsIFRhaWw9JWQiLAorCQkJCShzaGFyZWRfZGF0YS0+aGVhZGVy KS5oZWFkLAorCQkJCShzaGFyZWRfZGF0YS0+aGVhZGVyKS50YWlsKTsKKworICAgICAgICAJaWYg KHVucmVhZCA+PSBNQVhfSVRFTVMpCisgICAgICAgICAgIAkJb2Zvbm9fZXJyb3IoIk5vIG9uZSBy ZWFkaW5nIGhpc3RvcnkgZGF0YSIpOworICAgIAl9CisKKwltZW1jcHkoc2hhcmVkX2RhdGEtPmRh dGFNYXAsJihzaGFyZWRfZGF0YS0+aGVhZGVyKSxIRUFERVJfU0laRSk7CisJbXN5bmMoc2hhcmVk X2RhdGEtPmRhdGFNYXAsIFRPVEFMX1NJWkUsIE1TX0FTWU5DKTsKKworCXNlbV9wb3N0KCYoc2hh cmVkX2RhdGEtPm11dGV4KSk7CisKKwlpZiAodW5yZWFkID4gMCkKKwkJY2FsbGhpc3RvcnlfZW1p dF92b2ljZV9oaXN0b3J5X2NoYW5nZWQodW5yZWFkKTsKKyAgICAJCit9CisKKy8qKgorICogY2Fs bF9oaXN0b3J5X2NhbGxfZW5kZWQ6CisgKiBvZm9ubyBjYWxscyB0aGlzIG1ldGhvZCB3aXRoIHRo ZSBjYWxsIGluZm9ybWF0aW9uCisgKi8KKyAKK3N0YXRpYyB2b2lkIGNhbGxfaGlzdG9yeV9jYWxs X2VuZGVkKHN0cnVjdCBvZm9ub19oaXN0b3J5X2NvbnRleHQgKmNvbnRleHQsCisJCQkJY29uc3Qg c3RydWN0IG9mb25vX2NhbGwgKmNhbGwsCisJCQkJdGltZV90IHN0YXJ0LAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB0aW1lX3QgZW5kKQoreworCWNvbnN0IGNoYXIgKmZyb20gPSAi VW5rbm93biI7CisJc3RydWN0IHRtIHRtc3RhcnQsIHRtZW5kOworCWNoYXIgc3R0aW1lWzEyOF0s IGVuZHRpbWVbMTI4XTsKKwlpbnQgZnJvbWxlbiA9IDA7CisJVm9pY2VIaXN0b3J5IHZjYWxsOwor CisJb2Zvbm9fZGVidWcoIkNhbGwgRW5kZWQgb24gbW9kZW06ICVwIiwgY29udGV4dC0+bW9kZW0p OworCisJaWYgKGNhbGwtPnR5cGUgIT0gMCkKKwkJcmV0dXJuOworCW9mb25vX2RlYnVnKCJWb2lj ZSBDYWxsLCAlcyIsCisJCWNhbGwtPmRpcmVjdGlvbiA/ICJJbmNvbWluZyIgOiAiT3V0Z29pbmci KTsKKworCWlmIChjYWxsLT5kaXJlY3Rpb24pCisJCXZjYWxsLmNhbGx0eXBlID0gSU5DT01JTkc7 CisJZWxzZQorCQl2Y2FsbC5jYWxsdHlwZSA9IE9VVEdPSU5HOworCisJaWYgKGNhbGwtPmNsaXBf dmFsaWRpdHkgPT0gMCkKKwkJZnJvbSA9IHBob25lX251bWJlcl90b19zdHJpbmcoJmNhbGwtPnBo b25lX251bWJlcik7CisJZnJvbWxlbiA9IHN0cmxlbihmcm9tKTsKKwlzdHJjcHkodmNhbGwubGlu ZWlkLCBmcm9tKTsKKwl2Y2FsbC5saW5laWRbZnJvbWxlbl0gPSAnXDAnOworCisJdmNhbGwuc3Rh cnR0aW1lID0gc3RhcnQ7CisJZ210aW1lX3IoJnN0YXJ0LCAmdG1zdGFydCk7CisJc3RyZnRpbWUo c3R0aW1lLCAxMjcsICIlYSwgJWQgJWIgJVkgJUg6JU06JVMgJXoiLCAmdG1zdGFydCk7CisJc3R0 aW1lWzEyN10gPSAnXDAnOworCisJb2Zvbm9fZGVidWcoIlN0YXJ0VGltZTogJXMiLHN0dGltZSk7 CisKKwl2Y2FsbC5lbmR0aW1lID0gZW5kOworCWdtdGltZV9yKCZlbmQsICZ0bWVuZCk7CisJc3Ry ZnRpbWUoZW5kdGltZSwgMTI3LCAiJWEsICVkICViICVZICVIOiVNOiVTICV6IiwgJnRtZW5kKTsK KwllbmR0aW1lWzEyN10gPSAnXDAnOworCW9mb25vX2RlYnVnKCJFbmRUaW1lOiAlcyIsZW5kdGlt ZSk7CisKKwlzeW5jX21lbV9maWxlKCZ2Y2FsbCk7Cit9CisKKy8qKgorICogY2FsbF9oaXN0b3J5 X2NhbGxfbWlzc2VkOgorICogb2Zvbm8gY2FsbHMgdGhpcyBtZXRob2Qgd2l0aCB0aGUgY2FsbCBp bmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBjYWxsX2hpc3RvcnlfY2FsbF9taXNzZWQoc3Ry dWN0IG9mb25vX2hpc3RvcnlfY29udGV4dCAqY29udGV4dCwKKwkJCQkJY29uc3Qgc3RydWN0IG9m b25vX2NhbGwgKmNhbGwsCisJCQkJCXRpbWVfdCB3aGVuKQoreworCWNvbnN0IGNoYXIgKmZyb20g PSAiVW5rbm93biI7CisJc3RydWN0IHRtIG10aW1lOworCWNoYXIgc3R0aW1lWzEyOF07CisJVm9p Y2VIaXN0b3J5IHZjYWxsOworCWludCBmcm9tbGVuID0gMDsKKworCW9mb25vX2RlYnVnKCJDYWxs IE1pc3NlZCBvbiBtb2RlbTogJXAiLCBjb250ZXh0LT5tb2RlbSk7CisKKwlpZiAoY2FsbC0+dHlw ZSAhPSAwKQorCQlyZXR1cm47CisKKwlvZm9ub19kZWJ1ZygiVm9pY2UgQ2FsbCwgTWlzc2VkIik7 CisJb2Zvbm9fZGVidWcoIlZvaWNlIENhbGwsICVzIiwKKwkJY2FsbC0+ZGlyZWN0aW9uID8gIklu Y29taW5nIiA6ICJPdXRnb2luZyIpOworCisJdmNhbGwuY2FsbHR5cGUgPSBNSVNTRUQ7CisKKwlp ZiAoY2FsbC0+Y2xpcF92YWxpZGl0eSA9PSAwKQorCQlmcm9tID0gcGhvbmVfbnVtYmVyX3RvX3N0 cmluZygmY2FsbC0+cGhvbmVfbnVtYmVyKTsKKworCWZyb21sZW4gPSBzdHJsZW4oZnJvbSk7CisJ c3RybmNweSh2Y2FsbC5saW5laWQsIGZyb20gLGZyb21sZW4pOworCXZjYWxsLmxpbmVpZFtmcm9t bGVuXSA9ICdcMCc7CisKKwl2Y2FsbC5zdGFydHRpbWUgPSB3aGVuOworCisJZ210aW1lX3IoJndo ZW4sICZtdGltZSk7CisJb2Zvbm9fZGVidWcoIkZyb206ICVzIiwgdmNhbGwubGluZWlkKTsKKwlz dHJmdGltZShzdHRpbWUsIDEyNywgIiVhLCAlZCAlYiAlWSAlSDolTTolUyAleiIsICZtdGltZSk7 CisJc3R0aW1lWzEyN10gPSAnXDAnOworCW9mb25vX2RlYnVnKCJNaXNzZWQgVGltZTogJXMiLCBz dHRpbWUpOworICAgICAgICAKKwl2Y2FsbC5lbmR0aW1lID0gd2hlbjsKKworCXN5bmNfbWVtX2Zp bGUoJnZjYWxsKTsKK30KKworCisvKiBTdGFydCBvZiBEQnVzIHN0dWZmICovCisvKiAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCisgKiBFeHBvc2UgYW4gaW50ZXJmYWNlLCBwcm9wZXJ0aWVzIGFuZCBzaWduYWxz IGZvciBxdWVyeWluZyBzdG9yYWdlIGJhY2tlbmQKKyAqICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVm aW5lIE9GT05PX0NBTExfSElTVE9SWV9JTlRFUkZBQ0UgT0ZPTk9fU0VSVklDRSIuQ2FsbEhpc3Rv cnkiCisKK3N0YXRpYyB2b2lkIGNhbGxoaXN0b3J5X2VtaXRfdm9pY2VfaGlzdG9yeV9jaGFuZ2Vk KGludCB1c2VyZGF0YSkKK3sKKwlpbnQgKnZhbGludCA9ICZ1c2VyZGF0YTsKKwlEQnVzQ29ubmVj dGlvbiAqY29ubiA9IG9mb25vX2RidXNfZ2V0X2Nvbm5lY3Rpb24oKTsKKwlnX2RidXNfZW1pdF9z aWduYWwoY29ubiwKKwkJT0ZPTk9fTUFOQUdFUl9QQVRILAorCQlPRk9OT19DQUxMX0hJU1RPUllf SU5URVJGQUNFLAorCQkiVm9pY2VIaXN0b3J5Q2hhbmdlZCIsCisJCURCVVNfVFlQRV9VSU5UMzIs CisJCXZhbGludCwKKwkJREJVU19UWVBFX0lOVkFMSUQpOworfQorCitzdGF0aWMgREJ1c01lc3Nh Z2UgKmNhbGxfaGlzdG9yeV9zZXRfdm9pY2VfaGlzdG9yeV9yZWFkKERCdXNDb25uZWN0aW9uICpj b25uLAorCQkJCQkJCURCdXNNZXNzYWdlICptc2csCisJCQkJCQkJdm9pZCAqdXNlcmRhdGEpCit7 CisJREJ1c01lc3NhZ2UgKnJlcGx5OworCURCdXNNZXNzYWdlSXRlciBpdGVyOworCWdfcmV0dXJu X3ZhbF9pZl9mYWlsKChzaGFyZWRfZGF0YSE9TlVMTCksIE5VTEwpOworCisJb2Zvbm9fZGVidWco IlJlYWQgYWNrIHJlY2VpdmVkIik7CisKKwlyZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9k X3JldHVybihtc2cpOworCWlmICghcmVwbHkpCisJCXJldHVybiBOVUxMOworCisJZGJ1c19tZXNz YWdlX2l0ZXJfaW5pdF9hcHBlbmQocmVwbHksICZpdGVyKTsKKwlzZW1fd2FpdCgmKHNoYXJlZF9k YXRhLT5tdXRleCkpOworCXNoYXJlZF9kYXRhLT5oZWFkZXIudW5yZWFkID0gKHNoYXJlZF9kYXRh LT5oZWFkZXIpLnVucmVhZCAtCisJCQkJCXNoYXJlZF9kYXRhLT50ZW1wX3VucmVhZDsKKwlzaGFy ZWRfZGF0YS0+aGVhZGVyLnRhaWwgPSBzaGFyZWRfZGF0YS0+dGVtcF90YWlsOworIAorCS8vIHdy aXRlIHRvIGZpbGUKKwltZW1jcHkoc2hhcmVkX2RhdGEtPmRhdGFNYXAsJihzaGFyZWRfZGF0YS0+ aGVhZGVyKSxIRUFERVJfU0laRSk7CisJc2VtX3Bvc3QoJihzaGFyZWRfZGF0YS0+bXV0ZXgpKTsK Kwltc3luYyhzaGFyZWRfZGF0YS0+ZGF0YU1hcCxUT1RBTF9TSVpFLCBNU19BU1lOQyk7CisJcmV0 dXJuIHJlcGx5OworfQorCitzdGF0aWMgdm9pZCByZWFkX2RhdGEoVm9pY2VIaXN0b3J5ICpkYXRh LGludCB0ZW1wKQoreworCXZvaWQgKnJlYWRNYXAgPSBOVUxMOworCWdfcmV0dXJuX2lmX2ZhaWwo c2hhcmVkX2RhdGEgIT0gTlVMTCk7CisJZ19yZXR1cm5faWZfZmFpbChzaGFyZWRfZGF0YS0+ZGF0 YU1hcCAhPSBOVUxMKTsKKworCS8vIGxvY2sgCisJc2VtX3dhaXQoJihzaGFyZWRfZGF0YS0+bXV0 ZXgpKTsKKwlyZWFkTWFwID0gc2hhcmVkX2RhdGEtPmRhdGFNYXArdGVtcDsKKwkvLyByZWFkIGEg Y2h1bmsgaW50byAqZGF0YQorCW1lbWNweShkYXRhLCByZWFkTWFwLFJFQ09SRF9TSVpFKTsKKwlz aGFyZWRfZGF0YS0+dGVtcF91bnJlYWQrKzsKKwlzZW1fcG9zdCgmKHNoYXJlZF9kYXRhLT5tdXRl eCkpOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKmNhbGxfaGlzdG9yeV9nZXRfdm9pY2VfaGlz dG9yeShEQnVzQ29ubmVjdGlvbiAqY29ubiwKKwkJCQkJCURCdXNNZXNzYWdlICptc2csCisJCQkJ CQl2b2lkICp1c2VyZGF0YSkKK3sKKwlEQnVzTWVzc2FnZSAgICAgKnJlcGx5OworCURCdXNNZXNz YWdlSXRlciAgaXRlcjsKKwlEQnVzTWVzc2FnZUl0ZXIgIGFycmF5LHN0cnVjdF9zOworCWludCBp OworCWNoYXIgKmxpbmVpZDsKKwlWb2ljZUhpc3RvcnkgZGF0YTsKKwlpbnQgdW5yZWFkID0gMDsK KworCXJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuKG1zZyk7CisKKwlpZiAo IXJlcGx5KQorCQlyZXR1cm4gTlVMTDsKKwlnX3JldHVybl92YWxfaWZfZmFpbChzaGFyZWRfZGF0 YSE9TlVMTCxOVUxMKTsKKworCWRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kKHJlcGx5LCAm aXRlcik7CisKKwlkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigmaXRlcixEQlVTX1RZ UEVfQVJSQVksCisJCQkJCURCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisJCQkJCURC VVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HCisJCQkJCURCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5H CisJCQkJCURCVVNfVFlQRV9VSU5UMTZfQVNfU1RSSU5HCisJCQkJCURCVVNfVFlQRV9JTlQzMl9B U19TVFJJTkcKKwkJCQkJREJVU19UWVBFX0lOVDMyX0FTX1NUUklORworCQkJCQlEQlVTX1NUUlVD VF9FTkRfQ0hBUl9BU19TVFJJTkcKKwkJCQkJLCZhcnJheSk7CisKKwlzZW1fd2FpdCgmKHNoYXJl ZF9kYXRhLT5tdXRleCkpOworCXNoYXJlZF9kYXRhLT50ZW1wX3VucmVhZD0wOworCXNoYXJlZF9k YXRhLT50ZW1wX3RhaWwgPSAoc2hhcmVkX2RhdGEtPmhlYWRlcikudGFpbDsKKwl1bnJlYWQgPSAo c2hhcmVkX2RhdGEtPmhlYWRlcikudW5yZWFkOworCXNlbV9wb3N0KCYoc2hhcmVkX2RhdGEtPm11 dGV4KSk7CisKKwlmb3IgKGk9MDsgaSA8IHVucmVhZDsgaSsrKXsKKwkJcmVhZF9kYXRhKCZkYXRh LCBzaGFyZWRfZGF0YS0+dGVtcF90YWlsKTsKKwkJbGluZWlkID0gZGF0YS5saW5laWQ7CisJCWRi dXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyKCZhcnJheSwgREJVU19UWVBFX1NUUlVDVCxO VUxMLAorCQkJCQkJJnN0cnVjdF9zKTsKKwkJZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2lj KCZzdHJ1Y3RfcywgREJVU19UWVBFX1VJTlQzMiwKKwkJCQkJCSYoZGF0YS5pZCkpOworCQlkYnVz X21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMoJnN0cnVjdF9zLCBEQlVTX1RZUEVfU1RSSU5HLAor CQkJCQkJJihsaW5laWQpKTsKKwkJZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljKCZzdHJ1 Y3RfcywgREJVU19UWVBFX1VJTlQxNiwKKwkJCQkJCSYoZGF0YS5jYWxsdHlwZSkpOworCQlkYnVz X21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMoJnN0cnVjdF9zLCBEQlVTX1RZUEVfSU5UMzIsCisJ CQkJCQkmKGRhdGEuc3RhcnR0aW1lKSk7CisJCWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNp Yygmc3RydWN0X3MsIERCVVNfVFlQRV9JTlQzMiwKKwkJCQkJCSYoZGF0YS5lbmR0aW1lKSk7CisJ CWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lcigmYXJyYXksICZzdHJ1Y3Rfcyk7CisK KwkJc2hhcmVkX2RhdGEtPnRlbXBfdGFpbCA9IHNoYXJlZF9kYXRhLT50ZW1wX3RhaWwgKyBSRUNP UkRfU0laRTsKKworCQlpZiAoc2hhcmVkX2RhdGEtPnRlbXBfdGFpbCA9PSBUT1RBTF9TSVpFKXsK KwkJCW9mb25vX2RlYnVnICgiRW5kIG9mIFF1ZXVlOiAlZCIsc2hhcmVkX2RhdGEtPnRlbXBfdGFp bCk7CQkvLyByZXNldCBiYWNrIHRvIGZyb250CisJCXNoYXJlZF9kYXRhLT50ZW1wX3RhaWwgPSBI RUFERVJfU0laRTsKKwkJfQorCX0KKwlkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIo Jml0ZXIsJmFycmF5KTsKKworCXJldHVybiByZXBseTsKK30KKworc3RhdGljIEdEQnVzTWV0aG9k VGFibGUgY2FsbF9oaXN0b3J5X21ldGhvZHNbXSA9IHsKKwl7ICJHZXRWb2ljZUhpc3RvcnkiLCAi IiwgImEodXNxaWkpIiwgY2FsbF9oaXN0b3J5X2dldF92b2ljZV9oaXN0b3J5IH0sCisJeyAiU2V0 Vm9pY2VIaXN0b3J5UmVhZCIsICIiLCAiIiwgY2FsbF9oaXN0b3J5X3NldF92b2ljZV9oaXN0b3J5 X3JlYWQgfSwKKwl7IH0KK307CisKK3N0YXRpYyBHREJ1c1NpZ25hbFRhYmxlIGNhbGxfaGlzdG9y eV9zaWduYWxzW10gPSB7CisJeyAiVm9pY2VIaXN0b3J5Q2hhbmdlZCIsInUiIH0sCisJe30KK307 CisKKy8qIEVuZCBvZiBEQnVzIHN0dWZmICovCitzdGF0aWMgc3RydWN0IG9mb25vX2hpc3Rvcnlf ZHJpdmVyIGNhbGxfaGlzdG9yeV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY2FsbGhpc3RvcnkiLAor CS5wcm9iZSA9IGNhbGxfaGlzdG9yeV9wcm9iZSwKKwkucmVtb3ZlID0gY2FsbF9oaXN0b3J5X3Jl bW92ZSwKKwkuY2FsbF9lbmRlZCA9IGNhbGxfaGlzdG9yeV9jYWxsX2VuZGVkLAorCS5jYWxsX21p c3NlZCA9IGNhbGxfaGlzdG9yeV9jYWxsX21pc3NlZCwKK307CisKK3N0YXRpYyBpbnQgY2FsbF9o aXN0b3J5X2luaXQodm9pZCkKK3sKKwlEQnVzQ29ubmVjdGlvbiAqY29ubiA9IG9mb25vX2RidXNf Z2V0X2Nvbm5lY3Rpb24oKTsKKworCWlmICghc2hhcmVkX2RhdGEpCisJCWlmICghKHNoYXJlZF9k YXRhID0gZ190cnlfbmV3MChTaGFyZWREYXRhLCAxKSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwor CisJaWYgKCFnX2RidXNfcmVnaXN0ZXJfaW50ZXJmYWNlKGNvbm4sCisJCQkJCU9GT05PX01BTkFH RVJfUEFUSCwKKwkJCQkJT0ZPTk9fQ0FMTF9ISVNUT1JZX0lOVEVSRkFDRSwKKwkJCQkJY2FsbF9o aXN0b3J5X21ldGhvZHMsCisJCQkJCWNhbGxfaGlzdG9yeV9zaWduYWxzLAorCQkJCQlOVUxMLCAg ICAvKiBQcm9wZXJ0aWVzICovCisJCQkJCXNoYXJlZF9kYXRhLCAgICAvKiBVc2VyZGF0YSAgICov CisJCQkJCU5VTEwpKSAgICAvKiBEZXN0cm95IGZ1bmMgKi8KKyAgICAgICAgcmV0dXJuIC1FSU87 CisKKyAgICAJaWYgKCFpbml0X2ZpbGUoKSkKKyAgICAgICAJCXJldHVybiAtRU5PRU5UOworCisJ cmV0dXJuIG9mb25vX2hpc3RvcnlfZHJpdmVyX3JlZ2lzdGVyKCZjYWxsX2hpc3RvcnlfZHJpdmVy KTsKK30KKworc3RhdGljIHZvaWQgY2FsbF9oaXN0b3J5X2V4aXQodm9pZCkKK3sKKwljbGVhbl91 cCgpOworCW9mb25vX2hpc3RvcnlfZHJpdmVyX3VucmVnaXN0ZXIoJmNhbGxfaGlzdG9yeV9kcml2 ZXIpOworfQorCitPRk9OT19QTFVHSU5fREVGSU5FKGNhbGxoaXN0b3J5LCAiQ2FsbCBIaXN0b3J5 IFBsdWdpbiIsCisJCQlPRk9OT19WRVJTSU9OLCBPRk9OT19QTFVHSU5fUFJJT1JJVFlfREVGQVVM VCwKKwkJCWNhbGxfaGlzdG9yeV9pbml0LCBjYWxsX2hpc3RvcnlfZXhpdCkKLS0gCjEuNi42LjEK Cg== --===============9130494692261863830==--