From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id E74386FD60 for ; Thu, 23 Jan 2020 14:59:34 +0000 (UTC) From: Kunal Joshi Date: Thu, 23 Jan 2020 13:30:41 +0530 Message-Id: <1579766442-20285-4-git-send-email-kunal1.joshi@intel.com> In-Reply-To: <1579766442-20285-1-git-send-email-kunal1.joshi@intel.com> References: <1579766442-20285-1-git-send-email-kunal1.joshi@intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v4 3/4] tests/kms_color_chamelium: add subtests to validate color List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org Cc: Kunal Joshi , ville.syrjala@intel.com, petri.latvala@intel.com, daniel.vetter@intel.com List-ID: VG8gdmFsaWRhdGUgY29sb3Igc3VidGVzdHMgdXNpbmcgY2hhbWVsaXVtLCBzdWJ0ZXN0cyBtb2Rp ZmllZAp0byBkbyBmcmFtZSBkdW1wIGNvbXBhcmlzb24gaW5zdGVhZCBvZiBjcmMgY29tcGFyaXNv bi4KVGVzdHMgcmVxdWlyZSBjaGFtZWxpdW0gYW5kIHdpbGwgdmFsaWRhdGUgY29sb3IgZmVhdHVy ZXMKYXQgcGlwZSBsZXZlbC4KCih2MikKICAgICAgICBDb21wYXJpbmcgZnJhbWVkdW1wIHdpdGgg ZnJhbWVidWZmZXIgcmVmZXJlbmNlIGluc3RlYWQgb2YKICAgICAgICBjb21wYXJpbmcgdHdvIGZy YW1lZHVtcC4KKHYzKQogICAgICAgIE1vdmVkIGNvbW1vbiBmdW5jdGlvbnMgd2l0aCBrbXNfY29s b3IgdG8gbGliL2lndF9jb2xvcgoodjQpCiAgICAgICAgQWRkZWQgY2hhbmdlcyB0byBza2lwIHRo ZSB0ZXN0cyBpZiB0aGVyZSBpcyBubyBjb25uZWN0ZWQgcG9ydCB3aXRoCiAgICAgICAgY2hhbWVs aXVtLgogICAgICAgIFJlYXJyYW5nZWQgcG9zaXRpb24gb2YgdmFsaWRfb3V0cHV0LgoKU2lnbmVk LW9mZi1ieTogS3VuYWwgSm9zaGkgPGt1bmFsMS5qb3NoaUBpbnRlbC5jb20+ClNpZ25lZC1vZmYt Ynk6IFN3YXRpIFNoYXJtYSA8c3dhdGkyLnNoYXJtYUBpbnRlbC5jb20+ClN1Z2dlc3RlZC1ieTog VW1hIFNoYW5rYXIgPHVtYS5zaGFua2FyQGludGVsLmNvbT4KLS0tCiB0ZXN0cy9rbXNfY29sb3Jf Y2hhbWVsaXVtLmMgfCA3NTkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIDEgZmlsZSBjaGFuZ2VkLCA3NTkgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAw NjQ0IHRlc3RzL2ttc19jb2xvcl9jaGFtZWxpdW0uYwoKZGlmZiAtLWdpdCBhL3Rlc3RzL2ttc19j b2xvcl9jaGFtZWxpdW0uYyBiL3Rlc3RzL2ttc19jb2xvcl9jaGFtZWxpdW0uYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmI2NzMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVz dHMva21zX2NvbG9yX2NoYW1lbGl1bS5jCkBAIC0wLDAgKzEsNzU5IEBACisvKgorICogQ29weXJp Z2h0IMKpIDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVi eSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICog Y29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMg KHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVz dHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8g dXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNl LAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw ZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1 YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5 cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5l eHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJz dGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS RVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFV VEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFH RVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJB Q1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisg KiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJrbXNfY29sb3IuaCIKKwor SUdUX1RFU1RfREVTQ1JJUFRJT04oIlRlc3QgQ29sb3IgRmVhdHVyZXMgYXQgUGlwZSBsZXZlbCIp OworCisvKgorICogRHJhdyAzIGdyYWRpZW50IHJlY3RhbmdsZXMgaW4gcmVkLCBncmVlbiBhbmQg Ymx1ZSwgd2l0aCBhIG1heGVkIG91dAorICogZGVnYW1tYSBMVVQgYW5kIHZlcmlmeSB3ZSBoYXZl IHRoZSBzYW1lIGZyYW1lIGR1bXAgYXMgZHJhd2luZyBzb2xpZCBjb2xvcgorICogcmVjdGFuZ2xl cyB3aXRoIGxpbmVhciBkZWdhbW1hIExVVC4KKyAqLworc3RhdGljIHZvaWQgdGVzdF9waXBlX2Rl Z2FtbWEoZGF0YV90ICpkYXRhLAorCQkJICAgICAgaWd0X3BsYW5lX3QgKnByaW1hcnkpCit7CisJ aWd0X291dHB1dF90ICpvdXRwdXQ7CisJZ2FtbWFfbHV0X3QgKmRlZ2FtbWFfbGluZWFyLCAqZGVn YW1tYV9mdWxsOworCWdhbW1hX2x1dF90ICpnYW1tYV9saW5lYXI7CisJY29sb3JfdCByZWRfZ3Jl ZW5fYmx1ZVtdID0geworCQl7IDEuMCwgMC4wLCAwLjAgfSwKKwkJeyAwLjAsIDEuMCwgMC4wIH0s CisJCXsgMC4wLCAwLjAsIDEuMCB9CisJfTsKKworCWludCBpOworCXN0cnVjdCBjaGFtZWxpdW1f cG9ydCAqcG9ydDsKKwljaGFyICpjb25uZWN0ZWRfcG9ydHNbNF07CisKKwlmb3IgKGkgPSAwOyBp IDwgZGF0YS0+cG9ydF9jb3VudDsgaSsrKQorCQljb25uZWN0ZWRfcG9ydHNbaV0gPQorCQkJKGNo YXIgKikgY2hhbWVsaXVtX3BvcnRfZ2V0X25hbWUoZGF0YS0+cG9ydHNbaV0pOworCisJaWd0X3Jl cXVpcmUoaWd0X3BpcGVfb2JqX2hhc19wcm9wKHByaW1hcnktPnBpcGUsIElHVF9DUlRDX0RFR0FN TUFfTFVUKSk7CisJaWd0X3JlcXVpcmUoaWd0X3BpcGVfb2JqX2hhc19wcm9wKHByaW1hcnktPnBp cGUsIElHVF9DUlRDX0dBTU1BX0xVVCkpOworCisJZGVnYW1tYV9saW5lYXIgPSBnZW5lcmF0ZV90 YWJsZShkYXRhLT5kZWdhbW1hX2x1dF9zaXplLCAxLjApOworCWRlZ2FtbWFfZnVsbCA9IGdlbmVy YXRlX3RhYmxlX21heChkYXRhLT5kZWdhbW1hX2x1dF9zaXplKTsKKworCWdhbW1hX2xpbmVhciA9 IGdlbmVyYXRlX3RhYmxlKGRhdGEtPmdhbW1hX2x1dF9zaXplLCAxLjApOworCisJZm9yX2VhY2hf dmFsaWRfb3V0cHV0X29uX3BpcGUoJmRhdGEtPmRpc3BsYXksCisJCQkJICAgICAgcHJpbWFyeS0+ cGlwZS0+cGlwZSwKKwkJCQkgICAgICBvdXRwdXQpIHsKKwkJZHJtTW9kZU1vZGVJbmZvICptb2Rl OworCQlzdHJ1Y3QgaWd0X2ZiIGZiX21vZGVzZXQsIGZiLCBmYnJlZjsKKwkJc3RydWN0IGNoYW1l bGl1bV9mcmFtZV9kdW1wICpmcmFtZV9mdWxsY29sb3JzOworCQlpbnQgZmJfaWQsIGZiX21vZGVz ZXRfaWQsIGZicmVmX2lkOworCQlib29sIHZhbGlkX291dHB1dCA9IGZhbHNlOworCisJCWZvciAo aSA9IDA7IGkgPCBkYXRhLT5wb3J0X2NvdW50OyBpKyspCisJCQl2YWxpZF9vdXRwdXQgfD0KKwkJ CQkoc3RyY21wKG91dHB1dC0+bmFtZSwgY29ubmVjdGVkX3BvcnRzW2ldKSA9PSAwKTsKKwkJaWYg KCF2YWxpZF9vdXRwdXQpCisJCQljb250aW51ZTsKKwkJZWxzZQorCQkJZm9yIChpID0gMDsgaSA8 IGRhdGEtPnBvcnRfY291bnQ7IGkrKykKKwkJCQlpZiAoc3RyY21wKG91dHB1dC0+bmFtZSwKKwkJ CQkJICAgY29ubmVjdGVkX3BvcnRzW2ldKSA9PSAwKQorCQkJCQlwb3J0ID0gZGF0YS0+cG9ydHNb aV07CisKKwkJaWd0X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIHByaW1hcnktPnBpcGUtPnBpcGUp OworCQltb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQpOworCisJCS8qIENyZWF0ZSBh IGZyYW1lYnVmZmVyIGF0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQuICovCisJCWZiX2lkID0gaWd0 X2NyZWF0ZV9mYihkYXRhLT5kcm1fZmQsCisJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCisJCQkJ ICAgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJ CQkgICAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJCSAgICAgICZmYik7CisJCWln dF9hc3NlcnQoZmJfaWQpOworCisJCWZiX21vZGVzZXRfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEt PmRybV9mZCwKKwkJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCisJCQkJCSAgICAgIG1vZGUtPnZk aXNwbGF5LAorCQkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCQkgICAgICBMT0NB TF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJCQkgICAgICAmZmJfbW9kZXNldCk7CisJCWlndF9h c3NlcnQoZmJfbW9kZXNldF9pZCk7CisKKwkJZmJyZWZfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEt PmRybV9mZCwKKwkJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCisJCQkJCSAgICAgIG1vZGUtPnZk aXNwbGF5LAorCQkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCQkgICAgICBMT0NB TF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJCQkgICAgICAmZmJyZWYpOworCQlpZ3RfYXNzZXJ0 KGZicmVmX2lkKTsKKworCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYl9tb2Rlc2V0KTsK KwkJZGlzYWJsZV9jdG0ocHJpbWFyeS0+cGlwZSk7CisJCWRpc2FibGVfZGVnYW1tYShwcmltYXJ5 LT5waXBlKTsKKwkJc2V0X2dhbW1hKGRhdGEsIHByaW1hcnktPnBpcGUsIGdhbW1hX2xpbmVhcik7 CisJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7CisKKwkJLyogRHJhdyBzb2xp ZCBjb2xvcnMgd2l0aCBubyBkZWdhbW1hIHRyYW5zZm9ybWF0aW9uLiAqLworCQlwYWludF9yZWN0 YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlLCAmZmJyZWYpOworCisJCS8qIERyYXcg YSBncmFkaWVudCB3aXRoIGRlZ2FtbWEgTFVUIHRvIHJlbWFwIGFsbAorCQkgKiB2YWx1ZXMgdG8g bWF4IHJlZC9ncmVlbi9ibHVlLgorCQkgKi8KKwkJcGFpbnRfZ3JhZGllbnRfcmVjdGFuZ2xlcyhk YXRhLCBtb2RlLCByZWRfZ3JlZW5fYmx1ZSwgJmZiKTsKKwkJaWd0X3BsYW5lX3NldF9mYihwcmlt YXJ5LCAmZmIpOworCQlzZXRfZGVnYW1tYShkYXRhLCBwcmltYXJ5LT5waXBlLCBkZWdhbW1hX2Z1 bGwpOworCQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOworCQljaGFtZWxpdW1f Y2FwdHVyZShkYXRhLT5jaGFtZWxpdW0sIHBvcnQsIDAsIDAsIDAsIDAsIDEpOworCQlmcmFtZV9m dWxsY29sb3JzID0KKwkJCWNoYW1lbGl1bV9yZWFkX2NhcHR1cmVkX2ZyYW1lKGRhdGEtPmNoYW1l bGl1bSwgMCk7CisKKwkJLyogVmVyaWZ5IHRoYXQgdGhlIGZyYW1lYnVmZmVyIHJlZmVyZW5jZSBv ZiB0aGUgc29mdHdhcmUKKwkJICogY29tcHV0ZWQgb3V0cHV0IGlzIGVxdWFsIHRvIHRoZSBmcmFt ZSBkdW1wIG9mIHRoZSBkZWdhbW1hCisJCSAqIExVVCB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQuCisJ CSAqLworCQljaGFtZWxpdW1fZnJhbWVfbWF0Y2hfb3JfZHVtcChkYXRhLT5jaGFtZWxpdW0sIHBv cnQsCisJCQkJCSAgICAgIGZyYW1lX2Z1bGxjb2xvcnMsICZmYnJlZiwKKwkJCQkJICAgICAgQ0hB TUVMSVVNX0NIRUNLX0FOQUxPRyk7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCBOVUxM KTsKKwkJaWd0X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIFBJUEVfTk9ORSk7CisJfQorCisJZnJl ZV9sdXQoZGVnYW1tYV9saW5lYXIpOworCWZyZWVfbHV0KGRlZ2FtbWFfZnVsbCk7CisJZnJlZV9s dXQoZ2FtbWFfbGluZWFyKTsKK30KKworLyoKKyAqIERyYXcgMyBncmFkaWVudCByZWN0YW5nbGVz IGluIHJlZCwgZ3JlZW4gYW5kIGJsdWUsIHdpdGggYSBtYXhlZCBvdXQKKyAqIGdhbW1hIExVVCBh bmQgdmVyaWZ5IHdlIGhhdmUgdGhlIHNhbWUgZnJhbWUgZHVtcCBhcyBkcmF3aW5nIHNvbGlkCisg KiBjb2xvciByZWN0YW5nbGVzLgorICovCitzdGF0aWMgdm9pZCB0ZXN0X3BpcGVfZ2FtbWEoZGF0 YV90ICpkYXRhLAorCQkJICAgIGlndF9wbGFuZV90ICpwcmltYXJ5KQoreworCWlndF9vdXRwdXRf dCAqb3V0cHV0OworCWdhbW1hX2x1dF90ICpnYW1tYV9mdWxsOworCWNvbG9yX3QgcmVkX2dyZWVu X2JsdWVbXSA9IHsKKwkJeyAxLjAsIDAuMCwgMC4wIH0sCisJCXsgMC4wLCAxLjAsIDAuMCB9LAor CQl7IDAuMCwgMC4wLCAxLjAgfQorCX07CisKKwlpbnQgaTsKKwlzdHJ1Y3QgY2hhbWVsaXVtX3Bv cnQgKnBvcnQ7CisJY2hhciAqY29ubmVjdGVkX3BvcnRzWzRdOworCisJZm9yIChpID0gMDsgaSA8 IGRhdGEtPnBvcnRfY291bnQ7IGkrKykKKwkJY29ubmVjdGVkX3BvcnRzW2ldID0KKwkJCShjaGFy ICopIGNoYW1lbGl1bV9wb3J0X2dldF9uYW1lKGRhdGEtPnBvcnRzW2ldKTsKKworCWlndF9yZXF1 aXJlKGlndF9waXBlX29ial9oYXNfcHJvcChwcmltYXJ5LT5waXBlLCBJR1RfQ1JUQ19HQU1NQV9M VVQpKTsKKworCWdhbW1hX2Z1bGwgPSBnZW5lcmF0ZV90YWJsZV9tYXgoZGF0YS0+Z2FtbWFfbHV0 X3NpemUpOworCisJZm9yX2VhY2hfdmFsaWRfb3V0cHV0X29uX3BpcGUoJmRhdGEtPmRpc3BsYXks CisJCQkJICAgICAgcHJpbWFyeS0+cGlwZS0+cGlwZSwKKwkJCQkgICAgICBvdXRwdXQpIHsKKwkJ ZHJtTW9kZU1vZGVJbmZvICptb2RlOworCQlzdHJ1Y3QgaWd0X2ZiIGZiX21vZGVzZXQsIGZiLCBm YnJlZjsKKwkJc3RydWN0IGNoYW1lbGl1bV9mcmFtZV9kdW1wICpmcmFtZV9mdWxsY29sb3JzOwor CQlpbnQgZmJfaWQsIGZiX21vZGVzZXRfaWQsIGZicmVmX2lkOworCQlib29sIHZhbGlkX291dHB1 dCA9IGZhbHNlOworCisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5wb3J0X2NvdW50OyBpKyspCisJ CQl2YWxpZF9vdXRwdXQgfD0KKwkJCQkoc3RyY21wKG91dHB1dC0+bmFtZSwgY29ubmVjdGVkX3Bv cnRzW2ldKSA9PSAwKTsKKwkJaWYgKCF2YWxpZF9vdXRwdXQpCisJCQljb250aW51ZTsKKwkJZWxz ZQorCQkJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRfY291bnQ7IGkrKykKKwkJCQlpZiAoc3Ry Y21wKG91dHB1dC0+bmFtZSwKKwkJCQkJICAgY29ubmVjdGVkX3BvcnRzW2ldKSA9PSAwKQorCQkJ CQlwb3J0ID0gZGF0YS0+cG9ydHNbaV07CisKKwkJaWd0X291dHB1dF9zZXRfcGlwZShvdXRwdXQs IHByaW1hcnktPnBpcGUtPnBpcGUpOworCQltb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRw dXQpOworCisJCS8qIENyZWF0ZSBhIGZyYW1lYnVmZmVyIGF0IHRoZSBzaXplIG9mIHRoZSBvdXRw dXQuICovCisJCWZiX2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1fZmQsCisJCQkJICAgICAg bW9kZS0+aGRpc3BsYXksCisJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJICAgICAgRFJN X0ZPUk1BVF9YUkdCODg4OCwKKwkJCQkgICAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAor CQkJCSAgICAgICZmYik7CisJCWlndF9hc3NlcnQoZmJfaWQpOworCisJCWZiX21vZGVzZXRfaWQg PSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKKwkJCQkJICAgICAgbW9kZS0+aGRpc3BsYXks CisJCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAorCQkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4 ODg4LAorCQkJCQkgICAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJCQkgICAgICAm ZmJfbW9kZXNldCk7CisJCWlndF9hc3NlcnQoZmJfbW9kZXNldF9pZCk7CisKKwkJZmJyZWZfaWQg PSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKKwkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwK KwkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKKwkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4 LAorCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkJICAgICAgJmZicmVm KTsKKwkJaWd0X2Fzc2VydChmYnJlZl9pZCk7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5 LCAmZmJfbW9kZXNldCk7CisJCWRpc2FibGVfY3RtKHByaW1hcnktPnBpcGUpOworCQlkaXNhYmxl X2RlZ2FtbWEocHJpbWFyeS0+cGlwZSk7CisJCXNldF9nYW1tYShkYXRhLCBwcmltYXJ5LT5waXBl LCBnYW1tYV9mdWxsKTsKKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKKwor CQkvKiBEcmF3IHNvbGlkIGNvbG9ycyB3aXRoIG5vIGdhbW1hIHRyYW5zZm9ybWF0aW9uLiAqLwor CQlwYWludF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlLCAmZmJyZWYpOwor CisJCS8qIERyYXcgYSBncmFkaWVudCB3aXRoIGdhbW1hIExVVCB0byByZW1hcCBhbGwgdmFsdWVz CisJCSAqIHRvIG1heCByZWQvZ3JlZW4vYmx1ZS4KKwkJICovCisJCXBhaW50X2dyYWRpZW50X3Jl Y3RhbmdsZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVuX2JsdWUsICZmYik7CisJCWlndF9wbGFuZV9z ZXRfZmIocHJpbWFyeSwgJmZiKTsKKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5 KTsKKwkJY2hhbWVsaXVtX2NhcHR1cmUoZGF0YS0+Y2hhbWVsaXVtLCBwb3J0LCAwLCAwLCAwLCAw LCAxKTsKKwkJZnJhbWVfZnVsbGNvbG9ycyA9CisJCQljaGFtZWxpdW1fcmVhZF9jYXB0dXJlZF9m cmFtZShkYXRhLT5jaGFtZWxpdW0sIDApOworCisJCS8qIFZlcmlmeSB0aGF0IHRoZSBmcmFtZWJ1 ZmZlciByZWZlcmVuY2Ugb2YgdGhlIHNvZnR3YXJlIGNvbXB1dGVkCisJCSAqIG91dHB1dCBpcyBl cXVhbCB0byB0aGUgZnJhbWUgZHVtcCBvZiB0aGUgZGVnYW1tYSBMVVQKKwkJICogdHJhbnNmb3Jt YXRpb24gb3V0cHV0LgorCQkgKi8KKwkJY2hhbWVsaXVtX2ZyYW1lX21hdGNoX29yX2R1bXAoZGF0 YS0+Y2hhbWVsaXVtLCBwb3J0LAorCQkJCQkgICAgICBmcmFtZV9mdWxsY29sb3JzLCAmZmJyZWYs CisJCQkJCSAgICAgIENIQU1FTElVTV9DSEVDS19BTkFMT0cpOworCisJCWlndF9wbGFuZV9zZXRf ZmIocHJpbWFyeSwgTlVMTCk7CisJCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBQSVBFX05P TkUpOworCX0KKworCWZyZWVfbHV0KGdhbW1hX2Z1bGwpOworfQorCisvKgorICogRHJhdyAzIHJl Y3RhbmdsZXMgdXNpbmcgYmVmb3JlIGNvbG9ycyB3aXRoIHRoZSBjdG0gbWF0cml4IGFwcGx5IGFu ZCB2ZXJpZnkKKyAqIHRoZSBmcmFtZSBkdW1wIGlzIGVxdWFsIHRvIHVzaW5nIGFmdGVyIGNvbG9y cyB3aXRoIGFuIGlkZW50aWZ5IGN0bSBtYXRyaXguCisgKi8KK3N0YXRpYyBib29sIHRlc3RfcGlw ZV9jdG0oZGF0YV90ICpkYXRhLAorCQkJICBpZ3RfcGxhbmVfdCAqcHJpbWFyeSwKKwkJCSAgY29s b3JfdCAqYmVmb3JlLAorCQkJICBjb2xvcl90ICphZnRlciwKKwkJCSAgZG91YmxlICpjdG1fbWF0 cml4KQoreworCWdhbW1hX2x1dF90ICpkZWdhbW1hX2xpbmVhciwgKmdhbW1hX2xpbmVhcjsKKwlp Z3Rfb3V0cHV0X3QgKm91dHB1dDsKKworCWludCBpOworCWJvb2wgcmV0ID0gdHJ1ZTsKKwlzdHJ1 Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQ7CisJY2hhciAqY29ubmVjdGVkX3BvcnRzWzRdOworCisJ aWd0X3JlcXVpcmUoaWd0X3BpcGVfb2JqX2hhc19wcm9wKHByaW1hcnktPnBpcGUsIElHVF9DUlRD X0NUTSkpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRfY291bnQ7IGkrKykKKwkJY29u bmVjdGVkX3BvcnRzW2ldID0KKwkJCShjaGFyICopIGNoYW1lbGl1bV9wb3J0X2dldF9uYW1lKGRh dGEtPnBvcnRzW2ldKTsKKworCWRlZ2FtbWFfbGluZWFyID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+ ZGVnYW1tYV9sdXRfc2l6ZSwgMS4wKTsKKwlnYW1tYV9saW5lYXIgPSBnZW5lcmF0ZV90YWJsZShk YXRhLT5nYW1tYV9sdXRfc2l6ZSwgMS4wKTsKKworCWZvcl9lYWNoX3ZhbGlkX291dHB1dF9vbl9w aXBlKCZkYXRhLT5kaXNwbGF5LAorCQkJCSAgICAgIHByaW1hcnktPnBpcGUtPnBpcGUsCisJCQkJ ICAgICAgb3V0cHV0KSB7CisJCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKKwkJc3RydWN0IGlndF9m YiBmYl9tb2Rlc2V0LCBmYiwgZmJyZWY7CisJCXN0cnVjdCBjaGFtZWxpdW1fZnJhbWVfZHVtcCAq ZnJhbWVfaGFyZHdhcmU7CisJCWludCBmYl9pZCwgZmJfbW9kZXNldF9pZCwgZmJyZWZfaWQ7CisJ CWJvb2wgdmFsaWRfb3V0cHV0ID0gZmFsc2U7CisKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBv cnRfY291bnQ7IGkrKykKKwkJCXZhbGlkX291dHB1dCB8PQorCQkJCShzdHJjbXAob3V0cHV0LT5u YW1lLCBjb25uZWN0ZWRfcG9ydHNbaV0pID09IDApOworCQlpZiAoIXZhbGlkX291dHB1dCkKKwkJ CWNvbnRpbnVlOworCQllbHNlCisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydF9jb3VudDsg aSsrKQorCQkJCWlmIChzdHJjbXAob3V0cHV0LT5uYW1lLAorCQkJCQkgICBjb25uZWN0ZWRfcG9y dHNbaV0pID09IDApCisJCQkJCXBvcnQgPSBkYXRhLT5wb3J0c1tpXTsKKworCQlpZ3Rfb3V0cHV0 X3NldF9waXBlKG91dHB1dCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7CisJCW1vZGUgPSBpZ3Rfb3V0 cHV0X2dldF9tb2RlKG91dHB1dCk7CisKKwkJLyogQ3JlYXRlIGEgZnJhbWVidWZmZXIgYXQgdGhl IHNpemUgb2YgdGhlIG91dHB1dC4gKi8KKwkJZmJfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRy bV9mZCwKKwkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwKKwkJCQkgICAgICBtb2RlLT52ZGlzcGxh eSwKKwkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCSAgICAgIExPQ0FMX0RSTV9G T1JNQVRfTU9EX05PTkUsCisJCQkJICAgICAgJmZiKTsKKwkJaWd0X2Fzc2VydChmYl9pZCk7CisK KwkJZmJfbW9kZXNldF9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCQkgICAg ICBtb2RlLT5oZGlzcGxheSwKKwkJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJCSAgICAg IERSTV9GT1JNQVRfWFJHQjg4ODgsCisJCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05P TkUsCisJCQkJCSAgICAgICZmYl9tb2Rlc2V0KTsKKwkJaWd0X2Fzc2VydChmYl9tb2Rlc2V0X2lk KTsKKworCQlmYnJlZl9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAorCQkJCSAgICAg IG1vZGUtPmhkaXNwbGF5LAorCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAorCQkJCSAgICAgIERS TV9GT1JNQVRfWFJHQjg4ODgsCisJCQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwK KwkJCQkgICAgICAmZmJyZWYpOworCQlpZ3RfYXNzZXJ0KGZicmVmX2lkKTsKKworCQlpZ3RfcGxh bmVfc2V0X2ZiKHByaW1hcnksICZmYl9tb2Rlc2V0KTsKKworCQlpZiAobWVtY21wKGJlZm9yZSwg YWZ0ZXIsIHNpemVvZihjb2xvcl90KSkpIHsKKwkJCXNldF9kZWdhbW1hKGRhdGEsIHByaW1hcnkt PnBpcGUsIGRlZ2FtbWFfbGluZWFyKTsKKwkJCXNldF9nYW1tYShkYXRhLCBwcmltYXJ5LT5waXBl LCBnYW1tYV9saW5lYXIpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBEZWdhbW1hIGFuZCBH YW1tYSBmb3IgY3RtIG1heCB0ZXN0ICovCisJCQlkaXNhYmxlX2RlZ2FtbWEocHJpbWFyeS0+cGlw ZSk7CisJCQlkaXNhYmxlX2dhbW1hKHByaW1hcnktPnBpcGUpOworCQl9CisKKwkJZGlzYWJsZV9j dG0ocHJpbWFyeS0+cGlwZSk7CisJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7 CisKKwkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2RlLCBhZnRlciwgJmZicmVmKTsKKworCQkv KiBXaXRoIENUTSB0cmFuc2Zvcm1hdGlvbi4gKi8KKwkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBt b2RlLCBiZWZvcmUsICZmYik7CisJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiKTsKKwkJ c2V0X2N0bShwcmltYXJ5LT5waXBlLCBjdG1fbWF0cml4KTsKKwkJaWd0X2Rpc3BsYXlfY29tbWl0 KCZkYXRhLT5kaXNwbGF5KTsKKwkJY2hhbWVsaXVtX2NhcHR1cmUoZGF0YS0+Y2hhbWVsaXVtLCBw b3J0LCAwLCAwLCAwLCAwLCAxKTsKKwkJZnJhbWVfaGFyZHdhcmUgPQorCQkJY2hhbWVsaXVtX3Jl YWRfY2FwdHVyZWRfZnJhbWUoZGF0YS0+Y2hhbWVsaXVtLCAwKTsKKworCQkvKiBWZXJpZnkgdGhh dCB0aGUgZnJhbWVidWZmZXIgcmVmZXJlbmNlIG9mIHRoZSBzb2Z0d2FyZQorCQkgKiBjb21wdXRl ZCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlIGZyYW1lIGR1bXAgb2YgdGhlIENUTQorCQkgKiBtYXRy aXggdHJhbnNmb3JtYXRpb24gb3V0cHV0LgorCQkgKi8KKwkJcmV0ICY9IGNoYW1lbGl1bV9mcmFt ZV9tYXRjaF9vcl9kdW1wKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwKKwkJCQkJCSAgICAgZnJhbWVf aGFyZHdhcmUsCisJCQkJCQkgICAgICZmYnJlZiwKKwkJCQkJCSAgICAgQ0hBTUVMSVVNX0NIRUNL X0FOQUxPRyk7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCBOVUxMKTsKKwkJaWd0X291 dHB1dF9zZXRfcGlwZShvdXRwdXQsIFBJUEVfTk9ORSk7CisJfQorCisJZnJlZV9sdXQoZGVnYW1t YV9saW5lYXIpOworCWZyZWVfbHV0KGdhbW1hX2xpbmVhcik7CisKKwlyZXR1cm4gcmV0OworfQor CitzdGF0aWMgdm9pZCB0ZXN0X3BpcGVfbGltaXRlZF9yYW5nZV9jdG0oZGF0YV90ICpkYXRhLAor CQkJCQlpZ3RfcGxhbmVfdCAqcHJpbWFyeSkKK3sKKwlkb3VibGUgbGltaXRlZF9yZXN1bHQgPSAy MzUuMCAvIDI1NS4wOworCWNvbG9yX3QgcmVkX2dyZWVuX2JsdWVfbGltaXRlZFtdID0geworCQl7 IGxpbWl0ZWRfcmVzdWx0LCAwLjAsIDAuMCB9LAorCQl7IDAuMCwgbGltaXRlZF9yZXN1bHQsIDAu MCB9LAorCQl7IDAuMCwgMC4wLCBsaW1pdGVkX3Jlc3VsdCB9CisJfTsKKwljb2xvcl90IHJlZF9n cmVlbl9ibHVlX2Z1bGxbXSA9IHsKKwkJeyAwLjUsIDAuMCwgMC4wIH0sCisJCXsgMC4wLCAwLjUs IDAuMCB9LAorCQl7IDAuMCwgMC4wLCAwLjUgfQorCX07CisJZG91YmxlIGN0bVtdID0geyAxLjAs IDAuMCwgMC4wLAorCQkJMC4wLCAxLjAsIDAuMCwKKwkJCTAuMCwgMC4wLCAxLjAgfTsKKwlnYW1t YV9sdXRfdCAqZGVnYW1tYV9saW5lYXIsICpnYW1tYV9saW5lYXI7CisJaWd0X291dHB1dF90ICpv dXRwdXQ7CisJYm9vbCBoYXNfYnJvYWRjYXN0X3JnYl9vdXRwdXQgPSBmYWxzZTsKKworCWludCBp OworCXN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydDsKKwljaGFyICpjb25uZWN0ZWRfcG9ydHNb NF07CisKKwlkZWdhbW1hX2xpbmVhciA9IGdlbmVyYXRlX3RhYmxlKGRhdGEtPmRlZ2FtbWFfbHV0 X3NpemUsIDEuMCk7CisJZ2FtbWFfbGluZWFyID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+Z2FtbWFf bHV0X3NpemUsIDEuMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydF9jb3VudDsgaSsr KQorCQljb25uZWN0ZWRfcG9ydHNbaV0gPQorCQkJKGNoYXIgKikgY2hhbWVsaXVtX3BvcnRfZ2V0 X25hbWUoZGF0YS0+cG9ydHNbaV0pOworCisJZm9yX2VhY2hfdmFsaWRfb3V0cHV0X29uX3BpcGUo JmRhdGEtPmRpc3BsYXksCisJCQkJICAgICAgcHJpbWFyeS0+cGlwZS0+cGlwZSwKKwkJCQkgICAg ICBvdXRwdXQpIHsKKwkJZHJtTW9kZU1vZGVJbmZvICptb2RlOworCQlzdHJ1Y3QgaWd0X2ZiIGZi X21vZGVzZXQsIGZiLCBmYnJlZjsKKwkJc3RydWN0IGNoYW1lbGl1bV9mcmFtZV9kdW1wICpmcmFt ZV9saW1pdGVkOworCQlpbnQgZmJfaWQsIGZiX21vZGVzZXRfaWQsIGZicmVmX2lkOworCQlib29s IHZhbGlkX291dHB1dCA9IGZhbHNlOworCisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5wb3J0X2Nv dW50OyBpKyspCisJCQl2YWxpZF9vdXRwdXQgfD0KKwkJCQkoc3RyY21wKG91dHB1dC0+bmFtZSwg Y29ubmVjdGVkX3BvcnRzW2ldKSA9PSAwKTsKKwkJaWYgKCF2YWxpZF9vdXRwdXQpCisJCQljb250 aW51ZTsKKwkJZWxzZQorCQkJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRfY291bnQ7IGkrKykK KwkJCQlpZiAoc3RyY21wKG91dHB1dC0+bmFtZSwKKwkJCQkgICAgY29ubmVjdGVkX3BvcnRzW2ld KSA9PSAwKQorCQkJCQlwb3J0ID0gZGF0YS0+cG9ydHNbaV07CisKKwkJaWYgKCFpZ3Rfb3V0cHV0 X2hhc19wcm9wKG91dHB1dCwgSUdUX0NPTk5FQ1RPUl9CUk9BRENBU1RfUkdCKSkKKwkJCWNvbnRp bnVlOworCisJCWhhc19icm9hZGNhc3RfcmdiX291dHB1dCA9IHRydWU7CisKKwkJaWd0X291dHB1 dF9zZXRfcGlwZShvdXRwdXQsIHByaW1hcnktPnBpcGUtPnBpcGUpOworCQltb2RlID0gaWd0X291 dHB1dF9nZXRfbW9kZShvdXRwdXQpOworCisJCS8qIENyZWF0ZSBhIGZyYW1lYnVmZmVyIGF0IHRo ZSBzaXplIG9mIHRoZSBvdXRwdXQuICovCisJCWZiX2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5k cm1fZmQsCisJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCisJCQkJICAgICAgbW9kZS0+dmRpc3Bs YXksCisJCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJCQkgICAgICBMT0NBTF9EUk1f Rk9STUFUX01PRF9OT05FLAorCQkJCSAgICAgICZmYik7CisJCWlndF9hc3NlcnQoZmJfaWQpOwor CisJCWZiX21vZGVzZXRfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKKwkJCQkJICAg ICAgbW9kZS0+aGRpc3BsYXksCisJCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAorCQkJCQkgICAg ICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCQkgICAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9O T05FLAorCQkJCQkgICAgICAmZmJfbW9kZXNldCk7CisJCWlndF9hc3NlcnQoZmJfbW9kZXNldF9p ZCk7CisKKwkJZmJyZWZfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKKwkJCQkgICAg ICBtb2RlLT5oZGlzcGxheSwKKwkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKKwkJCQkgICAgICBE Uk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUs CisJCQkJICAgICAgJmZicmVmKTsKKwkJaWd0X2Fzc2VydChmYnJlZl9pZCk7CisKKwkJaWd0X3Bs YW5lX3NldF9mYihwcmltYXJ5LCAmZmJfbW9kZXNldCk7CisKKwkJc2V0X2RlZ2FtbWEoZGF0YSwg cHJpbWFyeS0+cGlwZSwgZGVnYW1tYV9saW5lYXIpOworCQlzZXRfZ2FtbWEoZGF0YSwgcHJpbWFy eS0+cGlwZSwgZ2FtbWFfbGluZWFyKTsKKwkJc2V0X2N0bShwcmltYXJ5LT5waXBlLCBjdG0pOwor CisJCWlndF9vdXRwdXRfc2V0X3Byb3BfdmFsdWUob3V0cHV0LAorCQkJCQkgIElHVF9DT05ORUNU T1JfQlJPQURDQVNUX1JHQiwKKwkJCQkJICBCUk9BRENBU1RfUkdCX0ZVTEwpOworCQlwYWludF9y ZWN0YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlX2xpbWl0ZWQsICZmYik7CisJCWln dF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiKTsKKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRh LT5kaXNwbGF5KTsKKworCQkvKiBTZXQgdGhlIG91dHB1dCBpbnRvIGxpbWl0ZWQgcmFuZ2UuICov CisJCWlndF9vdXRwdXRfc2V0X3Byb3BfdmFsdWUob3V0cHV0LAorCQkJCQkgIElHVF9DT05ORUNU T1JfQlJPQURDQVNUX1JHQiwKKwkJCQkJICBCUk9BRENBU1RfUkdCXzE2XzIzNSk7CisJCXBhaW50 X3JlY3RhbmdsZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVuX2JsdWVfZnVsbCwgJmZiKTsKKworCQkv KiBBbmQgcmVzZXQuLiAqLworCQlpZ3Rfb3V0cHV0X3NldF9wcm9wX3ZhbHVlKG91dHB1dCwKKwkJ CQkJICBJR1RfQ09OTkVDVE9SX0JST0FEQ0FTVF9SR0IsCisJCQkJCSAgQlJPQURDQVNUX1JHQl9G VUxMKTsKKwkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCBOVUxMKTsKKwkJaWd0X291dHB1dF9z ZXRfcGlwZShvdXRwdXQsIFBJUEVfTk9ORSk7CisJCWNoYW1lbGl1bV9jYXB0dXJlKGRhdGEtPmNo YW1lbGl1bSwgcG9ydCwgMCwgMCwgMCwgMCwgMSk7CisJCWZyYW1lX2xpbWl0ZWQgPQorCQkJY2hh bWVsaXVtX3JlYWRfY2FwdHVyZWRfZnJhbWUoZGF0YS0+Y2hhbWVsaXVtLCAwKTsKKworCisJCS8q IFZlcmlmeSB0aGF0IHRoZSBmcmFtZWJ1ZmZlciByZWZlcmVuY2Ugb2YgdGhlIHNvZnR3YXJlCisJ CSAqIGNvbXB1dGVkIG91dHB1dCBpcyBlcXVhbCB0byB0aGUgZnJhbWUgZHVtcCBvZiB0aGUgQ1RN CisJCSAqIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQuCisJCSAqLworCQljaGFtZWxpdW1f ZnJhbWVfbWF0Y2hfb3JfZHVtcChkYXRhLT5jaGFtZWxpdW0sIHBvcnQsCisJCQkJCSAgICAgIGZy YW1lX2xpbWl0ZWQsICZmYnJlZiwKKwkJCQkJICAgICAgQ0hBTUVMSVVNX0NIRUNLX0FOQUxPRyk7 CisKKwl9CisKKwlmcmVlX2x1dChnYW1tYV9saW5lYXIpOworCWZyZWVfbHV0KGRlZ2FtbWFfbGlu ZWFyKTsKKworCWlndF9yZXF1aXJlKGhhc19icm9hZGNhc3RfcmdiX291dHB1dCk7Cit9CisKK3N0 YXRpYyB2b2lkCitydW5fdGVzdHNfZm9yX3BpcGUoZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcCkK K3sKKwlpZ3RfcGlwZV90ICpwaXBlOworCWlndF9wbGFuZV90ICpwcmltYXJ5OworCWRvdWJsZSBk ZWx0YTsKKwlpbnQgaTsKKwljb2xvcl90IHJlZF9ncmVlbl9ibHVlW10gPSB7CisJCXsgMS4wLCAw LjAsIDAuMCB9LAorCQl7IDAuMCwgMS4wLCAwLjAgfSwKKwkJeyAwLjAsIDAuMCwgMS4wIH0KKwl9 OworCisJaWd0X2ZpeHR1cmUgeworCisJCWlndF9yZXF1aXJlKHAgPCBkYXRhLT5kaXNwbGF5Lm5f cGlwZXMpOworCisJCXBpcGUgPSAmZGF0YS0+ZGlzcGxheS5waXBlc1twXTsKKwkJaWd0X3JlcXVp cmUocGlwZS0+bl9wbGFuZXMgPj0gMCk7CisKKwkJcHJpbWFyeSA9IGlndF9waXBlX2dldF9wbGFu ZV90eXBlKHBpcGUsIERSTV9QTEFORV9UWVBFX1BSSU1BUlkpOworCisJCWlmIChpZ3RfcGlwZV9v YmpfaGFzX3Byb3AoJmRhdGEtPmRpc3BsYXkucGlwZXNbcF0sCisJCQkJCSAgSUdUX0NSVENfREVH QU1NQV9MVVRfU0laRSkpIHsKKwkJCWRhdGEtPmRlZ2FtbWFfbHV0X3NpemUgPQorCQkJCWlndF9w aXBlX29ial9nZXRfcHJvcCgmZGF0YS0+ZGlzcGxheS5waXBlc1twXSwKKwkJCQkJCUlHVF9DUlRD X0RFR0FNTUFfTFVUX1NJWkUpOworCQkJaWd0X2Fzc2VydF9sdCgwLCBkYXRhLT5kZWdhbW1hX2x1 dF9zaXplKTsKKwkJfQorCisJCWlmIChpZ3RfcGlwZV9vYmpfaGFzX3Byb3AoJmRhdGEtPmRpc3Bs YXkucGlwZXNbcF0sCisJCQkJCSAgSUdUX0NSVENfR0FNTUFfTFVUX1NJWkUpKSB7CisJCQlkYXRh LT5nYW1tYV9sdXRfc2l6ZSA9CisJCQkJaWd0X3BpcGVfb2JqX2dldF9wcm9wKCZkYXRhLT5kaXNw bGF5LnBpcGVzW3BdLAorCQkJCQkJICAgICAgSUdUX0NSVENfR0FNTUFfTFVUX1NJWkUpOworCQkJ aWd0X2Fzc2VydF9sdCgwLCBkYXRhLT5nYW1tYV9sdXRfc2l6ZSk7CisJCX0KKworCQlpZ3RfZGlz cGxheV9yZXF1aXJlX291dHB1dF9vbl9waXBlKCZkYXRhLT5kaXNwbGF5LCBwKTsKKwl9CisKKwlk YXRhLT5jb2xvcl9kZXB0aCA9IDg7CisJZGVsdGEgPSAxLjAgLyAoMSA8PCBkYXRhLT5jb2xvcl9k ZXB0aCk7CisKKwlpZ3RfZGVzY3JpYmUoIkNvbXBhcmUgYWZ0ZXIgYXBwbHlpbmcgY3RtIG1hdHJp eCAmIGlkZW50aXR5IG1hdHJpeCIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtY3RtLXJlZC10 by1ibHVlIiwga21zdGVzdF9waXBlX25hbWUocCkpIHsKKwkJY29sb3JfdCBibHVlX2dyZWVuX2Js dWVbXSA9IHsKKwkJCXsgMC4wLCAwLjAsIDEuMCB9LAorCQkJeyAwLjAsIDEuMCwgMC4wIH0sCisJ CQl7IDAuMCwgMC4wLCAxLjAgfQorCQl9OworCQlkb3VibGUgY3RtW10gPSB7IDAuMCwgMC4wLCAw LjAsCisJCQkJMC4wLCAxLjAsIDAuMCwKKwkJCQkxLjAsIDAuMCwgMS4wIH07CisJCWlndF9hc3Nl cnQodGVzdF9waXBlX2N0bShkYXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwKKwkJCQkJIGJs dWVfZ3JlZW5fYmx1ZSwgY3RtKSk7CisJfQorCisJaWd0X2Rlc2NyaWJlKCJDb21wYXJlIGFmdGVy IGFwcGx5aW5nIGN0bSBtYXRyaXggJiBpZGVudGl0eSBtYXRyaXgiKTsKKwlpZ3Rfc3VidGVzdF9m KCJwaXBlLSVzLWN0bS1ncmVlbi10by1yZWQiLCBrbXN0ZXN0X3BpcGVfbmFtZShwKSkgeworCQlj b2xvcl90IHJlZF9yZWRfYmx1ZVtdID0geworCQkJeyAxLjAsIDAuMCwgMC4wIH0sCisJCQl7IDEu MCwgMC4wLCAwLjAgfSwKKwkJCXsgMC4wLCAwLjAsIDEuMCB9CisJCX07CisJCWRvdWJsZSBjdG1b XSA9IHsgMS4wLCAxLjAsIDAuMCwKKwkJCQkwLjAsIDAuMCwgMC4wLAorCQkJCTAuMCwgMC4wLCAx LjAgfTsKKwkJaWd0X2Fzc2VydCh0ZXN0X3BpcGVfY3RtKGRhdGEsIHByaW1hcnksIHJlZF9ncmVl bl9ibHVlLAorCQkJCQkgcmVkX3JlZF9ibHVlLCBjdG0pKTsKKwl9CisKKwlpZ3RfZGVzY3JpYmUo IkNvbXBhcmUgYWZ0ZXIgYXBwbHlpbmcgY3RtIG1hdHJpeCAmIGlkZW50aXR5IG1hdHJpeCIpOwor CWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtY3RtLWJsdWUtdG8tcmVkIiwga21zdGVzdF9waXBlX25h bWUocCkpIHsKKwkJY29sb3JfdCByZWRfZ3JlZW5fcmVkW10gPSB7CisJCQl7IDEuMCwgMC4wLCAw LjAgfSwKKwkJCXsgMC4wLCAxLjAsIDAuMCB9LAorCQkJeyAxLjAsIDAuMCwgMC4wIH0KKwkJfTsK KwkJZG91YmxlIGN0bVtdID0geyAxLjAsIDAuMCwgMS4wLAorCQkJCTAuMCwgMS4wLCAwLjAsCisJ CQkJMC4wLCAwLjAsIDAuMCB9OworCQlpZ3RfYXNzZXJ0KHRlc3RfcGlwZV9jdG0oZGF0YSwgcHJp bWFyeSwgcmVkX2dyZWVuX2JsdWUsCisJCQkJCSByZWRfZ3JlZW5fcmVkLCBjdG0pKTsKKwl9CisK KwkvKiBXZSB0ZXN0cyBhIGZldyB2YWx1ZXMgYXJvdW5kIHRoZSBleHBlY3RlZCByZXN1bHQgYmVj YXVzZQorCSAqIHRoZSBpdCBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSB3ZSdyZSBkZWFsaW5nIHdp dGgsIHdlIGNhbgorCSAqIGVpdGhlciBnZXQgY2xhbXBlZCBvciByb3VuZGVkIHZhbHVlcyBhbmQg d2UgYWxzbyBuZWVkIHRvCisJICogYWNjb3VudCBmb3Igb2RkIG51bWJlciBvZiBpdGVtcyBpbiB0 aGUgTFVUcy4KKwkgKi8KKwlpZ3RfZGVzY3JpYmUoIkNvbXBhcmUgYWZ0ZXIgYXBwbHlpbmcgY3Rt IG1hdHJpeCAmIGlkZW50aXR5IG1hdHJpeCIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtY3Rt LTAtMjUiLCBrbXN0ZXN0X3BpcGVfbmFtZShwKSkgeworCQljb2xvcl90IGV4cGVjdGVkX2NvbG9y c1tdID0geworCQkJeyAwLjAsIH0sIHsgMC4wLCB9LCB7IDAuMCwgfQorCQl9OworCQlkb3VibGUg Y3RtW10gPSB7IDAuMjUsIDAuMCwgIDAuMCwKKwkJCQkgMC4wLCAgMC4yNSwgMC4wLAorCQkJCSAw LjAsICAwLjAsICAwLjI1IH07CisJCWJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisJCWZvciAoaSA9 IDA7IGkgPCA1OyBpKyspIHsKKwkJCWV4cGVjdGVkX2NvbG9yc1swXS5yID0KKwkJCQlleHBlY3Rl ZF9jb2xvcnNbMV0uZyA9CisJCQkJZXhwZWN0ZWRfY29sb3JzWzJdLmIgPQorCQkJCTAuMjUgKyBk ZWx0YSAqIChpIC0gMik7CisJCQlzdWNjZXNzIHw9IHRlc3RfcGlwZV9jdG0oZGF0YSwgcHJpbWFy eSwKKwkJCQkJCSByZWRfZ3JlZW5fYmx1ZSwKKwkJCQkJCSBleHBlY3RlZF9jb2xvcnMsIGN0bSk7 CisJCX0KKwkJaWd0X2Fzc2VydChzdWNjZXNzKTsKKwl9CisKKwlpZ3RfZGVzY3JpYmUoIkNvbXBh cmUgYWZ0ZXIgYXBwbHlpbmcgY3RtIG1hdHJpeCAmIGlkZW50aXR5IG1hdHJpeCIpOworCWlndF9z dWJ0ZXN0X2YoInBpcGUtJXMtY3RtLTAtNSIsIGttc3Rlc3RfcGlwZV9uYW1lKHApKSB7CisJCWNv bG9yX3QgZXhwZWN0ZWRfY29sb3JzW10gPSB7CisJCQl7IDAuMCwgfSwgeyAwLjAsIH0sIHsgMC4w LCB9CisJCX07CisJCWRvdWJsZSBjdG1bXSA9IHsgMC41LCAwLjAsIDAuMCwKKwkJCQkgMC4wLCAw LjUsIDAuMCwKKwkJCQkgMC4wLCAwLjAsIDAuNSB9OworCQlib29sIHN1Y2Nlc3MgPSBmYWxzZTsK KworCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCQlleHBlY3RlZF9jb2xvcnNbMF0uciA9 CisJCQkJZXhwZWN0ZWRfY29sb3JzWzFdLmcgPQorCQkJCWV4cGVjdGVkX2NvbG9yc1syXS5iID0K KwkJCQkwLjUgKyBkZWx0YSAqIChpIC0gMik7CisJCQlzdWNjZXNzIHw9IHRlc3RfcGlwZV9jdG0o ZGF0YSwgcHJpbWFyeSwKKwkJCQkJCSByZWRfZ3JlZW5fYmx1ZSwKKwkJCQkJCSBleHBlY3RlZF9j b2xvcnMsIGN0bSk7CisJCX0KKwkJaWd0X2Fzc2VydChzdWNjZXNzKTsKKwl9CisKKwlpZ3RfZGVz Y3JpYmUoIkNvbXBhcmUgYWZ0ZXIgYXBwbHlpbmcgY3RtIG1hdHJpeCAmIGlkZW50aXR5IG1hdHJp eCIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtY3RtLTAtNzUiLCBrbXN0ZXN0X3BpcGVfbmFt ZShwKSkgeworCQljb2xvcl90IGV4cGVjdGVkX2NvbG9yc1tdID0geworCQkJeyAwLjAsIH0sIHsg MC4wLCB9LCB7IDAuMCwgfQorCQl9OworCQlkb3VibGUgY3RtW10gPSB7IDAuNzUsIDAuMCwgIDAu MCwKKwkJCQkgMC4wLCAgMC43NSwgMC4wLAorCQkJCSAwLjAsICAwLjAsICAwLjc1IH07CisJCWJv b2wgc3VjY2VzcyA9IGZhbHNlOworCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWV4 cGVjdGVkX2NvbG9yc1swXS5yID0KKwkJCQlleHBlY3RlZF9jb2xvcnNbMV0uZyA9CisJCQkJZXhw ZWN0ZWRfY29sb3JzWzJdLmIgPQorCQkJCTAuNzUgKyBkZWx0YSAqIChpIC0gMyk7CisJCQlzdWNj ZXNzIHw9IHRlc3RfcGlwZV9jdG0oZGF0YSwgcHJpbWFyeSwKKwkJCQkJCSByZWRfZ3JlZW5fYmx1 ZSwKKwkJCQkJCSBleHBlY3RlZF9jb2xvcnMsIGN0bSk7CisJCX0KKwkJaWd0X2Fzc2VydChzdWNj ZXNzKTsKKwl9CisKKwlpZ3RfZGVzY3JpYmUoIkNvbXBhcmUgYWZ0ZXIgYXBwbHlpbmcgY3RtIG1h dHJpeCAmIGlkZW50aXR5IG1hdHJpeCIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtY3RtLW1h eCIsIGttc3Rlc3RfcGlwZV9uYW1lKHApKSB7CisJCWNvbG9yX3QgZnVsbF9yZ2JbXSA9IHsKKwkJ CXsgMS4wLCAwLjAsIDAuMCB9LAorCQkJeyAwLjAsIDEuMCwgMC4wIH0sCisJCQl7IDAuMCwgMC4w LCAxLjAgfQorCQl9OworCQlkb3VibGUgY3RtW10gPSB7IDEwMC4wLCAgIDAuMCwgICAwLjAsCisJ CQkJIDAuMCwgICAxMDAuMCwgICAwLjAsCisJCQkJIDAuMCwgICAgIDAuMCwgMTAwLjAgfTsKKwor CQkvKiBDaGVycnlWaWV3IGdlbmVyYXRlcyB2YWx1ZXMgb24gMTBiaXRzIHRoYXQgd2UKKwkJICog cHJvZHVjZSB3aXRoIGFuIDggYml0cyBwZXIgY29sb3IgZnJhbWVidWZmZXIuCisJCSAqLworCQlp Z3RfcmVxdWlyZSghSVNfQ0hFUlJZVklFVyhkYXRhLT5kZXZpZCkpOworCisJCWlndF9hc3NlcnQo dGVzdF9waXBlX2N0bShkYXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwKKwkJCQkJIGZ1bGxf cmdiLCBjdG0pKTsKKwl9CisKKwlpZ3RfZGVzY3JpYmUoIkNvbXBhcmUgYWZ0ZXIgYXBwbHlpbmcg Y3RtIG1hdHJpeCAmIGlkZW50aXR5IG1hdHJpeCIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMt Y3RtLW5lZ2F0aXZlIiwga21zdGVzdF9waXBlX25hbWUocCkpIHsKKwkJY29sb3JfdCBhbGxfYmxh Y2tbXSA9IHsKKwkJCXsgMC4wLCAwLjAsIDAuMCB9LAorCQkJeyAwLjAsIDAuMCwgMC4wIH0sCisJ CQl7IDAuMCwgMC4wLCAwLjAgfQorCQl9OworCQlkb3VibGUgY3RtW10gPSB7IC0xLjAsICAwLjAs ICAwLjAsCisJCQkJIDAuMCwgLTEuMCwgIDAuMCwKKwkJCQkgMC4wLCAgMC4wLCAtMS4wIH07CisJ CWlndF9hc3NlcnQodGVzdF9waXBlX2N0bShkYXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwK KwkJCQkJIGFsbF9ibGFjaywgY3RtKSk7CisJfQorCisJaWd0X2Rlc2NyaWJlKCJDb21wYXJlIGFm dGVyIGFwcGx5aW5nIGN0bSBtYXRyaXggJiBpZGVudGl0eSBtYXRyaXgiKTsKKwlpZ3Rfc3VidGVz dF9mKCJwaXBlLSVzLWN0bS1saW1pdGVkLXJhbmdlIiwga21zdGVzdF9waXBlX25hbWUocCkpCisJ CXRlc3RfcGlwZV9saW1pdGVkX3JhbmdlX2N0bShkYXRhLCBwcmltYXJ5KTsKKworCWlndF9kZXNj cmliZSgiQ29tcGFyZSBtYXhlZCBvdXQgZ2FtbWEgTFVUIGFuZCBzb2xpZCBjb2xvciBsaW5lYXIg TFVUIik7CisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy1kZWdhbW1hIiwga21zdGVzdF9waXBlX25h bWUocCkpCisJCXRlc3RfcGlwZV9kZWdhbW1hKGRhdGEsIHByaW1hcnkpOworCisJaWd0X2Rlc2Ny aWJlKCJDb21wYXJlIG1heGVkIG91dCBnYW1tYSBMVVQgYW5kIHNvbGlkIGNvbG9yIGxpbmVhciBM VVQiKTsKKwlpZ3Rfc3VidGVzdF9mKCJwaXBlLSVzLWdhbW1hIiwga21zdGVzdF9waXBlX25hbWUo cCkpCisJCXRlc3RfcGlwZV9nYW1tYShkYXRhLCBwcmltYXJ5KTsKKworCWlndF9maXh0dXJlIHsK KwkJZGlzYWJsZV9kZWdhbW1hKHByaW1hcnktPnBpcGUpOworCQlkaXNhYmxlX2dhbW1hKHByaW1h cnktPnBpcGUpOworCQlkaXNhYmxlX2N0bShwcmltYXJ5LT5waXBlKTsKKwkJaWd0X2Rpc3BsYXlf Y29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKKwl9Cit9CisKK2lndF9tYWluCit7CisJZGF0YV90IGRh dGEgPSB7fTsKKwllbnVtIHBpcGUgcGlwZTsKKworCWlndF9maXh0dXJlIHsKKwkJZGF0YS5kcm1f ZmQgPSBkcm1fb3Blbl9kcml2ZXJfbWFzdGVyKERSSVZFUl9BTlkpOworCQlpZiAoaXNfaTkxNV9k ZXZpY2UoZGF0YS5kcm1fZmQpKQorCQkJZGF0YS5kZXZpZCA9IGludGVsX2dldF9kcm1fZGV2aWQo ZGF0YS5kcm1fZmQpOworCQlkYXRhLmNoYW1lbGl1bSA9IGNoYW1lbGl1bV9pbml0KGRhdGEuZHJt X2ZkKTsKKwkJaWd0X3JlcXVpcmUoZGF0YS5jaGFtZWxpdW0pOworCisJCWRhdGEucG9ydHMgPSBj aGFtZWxpdW1fZ2V0X3BvcnRzKGRhdGEuY2hhbWVsaXVtLAorCQkJCQkJICZkYXRhLnBvcnRfY291 bnQpOworCisJCWlmICghZGF0YS5wb3J0X2NvdW50KQorCQkJaWd0X3NraXAoIk5vIHBvcnRzIGNv bm5lY3RlZFxuIik7CisKKwkJa21zdGVzdF9zZXRfdnRfZ3JhcGhpY3NfbW9kZSgpOworCQlpZ3Rf ZGlzcGxheV9yZXF1aXJlKCZkYXRhLmRpc3BsYXksIGRhdGEuZHJtX2ZkKTsKKwkJaWd0X3JlcXVp cmUoZGF0YS5kaXNwbGF5LmlzX2F0b21pYyk7CisJfQorCisJZm9yX2VhY2hfcGlwZV9zdGF0aWMo cGlwZSkKKwkJaWd0X3N1YnRlc3RfZ3JvdXAKKwkJCXJ1bl90ZXN0c19mb3JfcGlwZSgmZGF0YSwg cGlwZSk7CisJaWd0X2Rlc2NyaWJlKCJOZWdhdGl2ZSB0ZXN0IGNhc2UgZ2FtbWEgbHV0IHNpemUi KTsKKwlpZ3Rfc3VidGVzdF9mKCJwaXBlLWludmFsaWQtZ2FtbWEtbHV0LXNpemVzIikKKwkJaW52 YWxpZF9nYW1tYV9sdXRfc2l6ZXMoJmRhdGEpOworCisJaWd0X2Rlc2NyaWJlKCJOZWdhdGl2ZSB0 ZXN0IGNhc2UgZGVnYW1tYSBsdXQgc2l6ZSIpOworCWlndF9zdWJ0ZXN0X2YoInBpcGUtaW52YWxp ZC1kZWdhbW1hLWx1dC1zaXplcyIpCisJCWludmFsaWRfZGVnYW1tYV9sdXRfc2l6ZXMoJmRhdGEp OworCisJaWd0X2Rlc2NyaWJlKCJOZWdhdGl2ZSB0ZXN0IGNhc2UgY3RtIG1hdHJpeCBzaXplIik7 CisJaWd0X3N1YnRlc3RfZigicGlwZS1pbnZhbGlkLWN0bS1tYXRyaXgtc2l6ZXMiKQorCQlpbnZh bGlkX2N0bV9tYXRyaXhfc2l6ZXMoJmRhdGEpOworCisJaWd0X2ZpeHR1cmUgeworCQlpZ3RfZGlz cGxheV9maW5pKCZkYXRhLmRpc3BsYXkpOworCX0KK30KLS0gCjIuNy40CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwppZ3QtZGV2IG1haWxpbmcgbGlzdApp Z3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2lndC1kZXYK