From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-4073467-1521903747-2-6737969658568696070 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.25, RCVD_IN_DNSWL_MED -2.3, SPF_PASS -0.001, LANGUAGES en, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='140.211.166.136', Host='smtp3.osuosl.org', Country='US', FromHeader='org', MailFrom='org' X-Spam-charsets: plain='utf-8' X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: driverdev-devel-bounces@linuxdriverproject.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1521903745; b=tIeNVXJc5sdCEGOi9Sv4O9IFZQ36+Kw2RC8267PG/KRfXAN RJ2VPIZlWnDCgQYst8a4bHFl0P88D/AZn7foSnTQDpSUcO6q+7O6Cpps1eKOhmGR PgOOzm4h4q1bZQAn/07J/pCbYO0g82RkhTikNOxCJO1yip4pzGXudG/xyJMzCB7X jaVnO7y9shDiVGnHIehq3gjHASXRHzFFhON6tQSlP4FIJC+NWsRJGthm/z7lFP+S cuzCrQ1sDEnPHoJYmeDIo6vWXz+dRVWiob3dgxLwh+waTIVFrDNSsuC5IGdznY4e JDtSivc/UHYqcc3jPG3Q9gA8ZbkKhbk5ebk34kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=date:from:to:subject:message-id :in-reply-to:references:mime-version:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:cc:content-type :content-transfer-encoding:sender; s=arctest; t=1521903745; bh=t bXHLatBFO+fm23K8B56Vzf1zhb7IDzCMw4bM7iJg7k=; b=qwWDA5RF5V0jxt2Yq rRNxz0DsCxGsRvo/JVAwKKn+hFCxfMAImAUMLTnwzv1vxdzJISTsEmub8eDqWNU5 +6Hkfl6pGHVTcWgKSxwp7PFTs8BAH6GIvs2h+x0pniX6halmk9jeORTKK7I4/IUI 5z+rO7FyPQJ/EE79V9VeACHS2s3S52HpRUi7+aziJi+KezjIKKMZI2oXiYD71LrY 0Z46PJdyBRdwNZzwdRaXJR3VlWVoOv8KRFuNHTX2OtxeDso4QrlBLSwyWuFIWsev mpJQCdW2vUtWHVF42VyG7palsnfqsp/feZ8L2lGPclxorGkC09qP3cSTMGpWGc5w C0qbg== ARC-Authentication-Results: i=1; mx2.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=140.211.166.136 (smtp3.osuosl.org); spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org smtp.helo=silver.osuosl.org; x-aligned-from=fail; x-ptr=fail x-ptr-helo=silver.osuosl.org x-ptr-lookup=smtp3.osuosl.org; x-return-mx=pass smtp.domain=linuxdriverproject.org smtp.result=pass smtp_is_org_domain=yes header.domain=kernel.org header.result=pass header_is_org_domain=yes; x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128; x-vs=clean score=-100 state=0 Authentication-Results: mx2.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=140.211.166.136 (smtp3.osuosl.org); spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org smtp.helo=silver.osuosl.org; x-aligned-from=fail; x-ptr=fail x-ptr-helo=silver.osuosl.org x-ptr-lookup=smtp3.osuosl.org; x-return-mx=pass smtp.domain=linuxdriverproject.org smtp.result=pass smtp_is_org_domain=yes header.domain=kernel.org header.result=pass header_is_org_domain=yes; x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128; x-vs=clean score=-100 state=0 X-ME-VSCategory: clean X-Remote-Delivered-To: driverdev-devel@osuosl.org DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 07FFA21770 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=jic23@kernel.org Date: Sat, 24 Mar 2018 15:02:05 +0000 From: Jonathan Cameron To: John Syne Subject: Re: meter ABI: (was Re: [PATCH v2 1/3] staging:iio:meter: Replaces IIO_DEV_ATTR_CH_OFF by IIO_DEVICE_ATTR) Message-ID: <20180324150205.709aa211@archlinux> In-Reply-To: References: <3af0e5a795059a8418cf08ff29f05f8d5e00da9b.1520382753.git.rodrigosiqueiramelo@gmail.com> <20180307200730.08ed3c2f@archlinux> <20180309003733.aichruo53vqryafg@smtp.gmail.com> <20180310151045.4570e85d@archlinux> <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> <20180317203037.1093cc11@archlinux> <20180318122312.0d395367@archlinux> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-BeenThere: driverdev-devel@linuxdriverproject.org X-Mailman-Version: 2.1.24 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devel@driverdev.osuosl.org, Lars-Peter Clausen , Rodrigo Siqueira , linux-iio@vger.kernel.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Peter Meerwald-Stadler , Hartmut Knaack , daniel.baluta@nxp.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: driverdev-devel-bounces@linuxdriverproject.org Sender: "devel" X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: T24gTW9uLCAxOSBNYXIgMjAxOCAyMjo1NzoxNiAtMDcwMApKb2huIFN5bmUgPGpvaG4zOTA5QGdt YWlsLmNvbT4gd3JvdGU6Cgo+IEhpIEpvbmF0aGFuLAo+IAo+IFRoYW5rIHlvdSBmb3IgYWxsIHlv dXIgaGFyZCB3b3JrLiBZb3VyIGZlZWRiYWNrIGlzIHJlYWxseSBoZWxwZnVsLiBJ4oCZbSBzdXJw cmlzZWQgdGhhdCBubyBvbmUgZnJvbSBBbmFsb2cgRGV2aWNlIGhhcyBvZmZlcmVkIGFueSBzdWdn ZXN0aW9ucy4KPiAKClNhZGx5IHRob3NlIGFjdGl2ZSBpbiB0aGUgbWFpbmxpbmUgbGludXgga2Vy bmVsIGZyb20gQURJIGFyZSBmb2N1c2VkIGluCm90aGVyIGFyZWFzIGN1cnJlbnRseSA6KAo+IEFu eXdheSwgcGxlYXNlIHNlZSBteSBjb21tZW50cyBpbmxpbmUgYmVsb3cKPiAKPiBSZWdhcmRzLAo+ IEpvaG4KPiAKPiAKPiAKPiAKPiAKPiA+IE9uIE1hciAxOCwgMjAxOCwgYXQgNToyMyBBTSwgSm9u YXRoYW4gQ2FtZXJvbiA8amljMjNAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPiAKPiA+IE9uIFNhdCwg MTcgTWFyIDIwMTggMjM6MTE6NDUgLTA3MDAKPiA+IEpvaG4gU3luZSA8am9objM5MDlAZ21haWwu Y29tPiB3cm90ZToKPiA+ICAgCj4gPj4gSGkgSm9uYXRoYW4sICAKPiA+IEhpIEpvaG4gYW5kIEFs bCwKPiA+IAo+ID4gSSdkIGxvdmUgdG8gZ2V0IHNvbWUgYWRkaXRpb25hbCBpbnB1dCBvbiB0aGlz IGZyb20gYW55b25lIGludGVyZXN0ZWQuCj4gPiBUaGVyZSBhcmUgYSBsb3Qgb2Ygd2VpcmQgYW5k IHdvbmRlcmZ1bCBkZXJpdmVkIHF1YW50aXRpZXMgaW4gYW4gZW5lcmd5Cj4gPiBtZXRlciBhbmQg aXQgc2VlbXMgd2UgbmVlZCB0byBtYWtlIHNvbWUgZnVuZGFtZW50YWwgY2hhbmdlcyB0byBzdXBw b3J0Cj4gPiB0aGVtIC0gaW5jbHVkaW5nIHBvdGVudGlhbGx5IGEgdXNlcnNwYWNlIGJyZWFraW5n IGNoYW5nZSB0byB0aGUgZXZlbnQKPiA+IGNvZGUgZGVzY3JpcHRpb24uCj4gPiAgIAo+ID4+IAo+ ID4+IEhlcmUgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcmVnaXN0ZXJzIGZvciB0aGUgQURFNzg3 OCB3aGljaCBJIGNvcGllZCBmcm9tIHRoZSBkYXRhIHNoZWV0LiBJIGFkZGVkIGEgY29sdW1uIOKA nElJTyBBdHRyaWJ1dGXigJ0gd2hpY2ggSSBob3BlIGZvbGxvd3MgeW91ciBJSU8gQUJJLiBQbGVh c2UgbWFrZSBhbnkgY2hhbmdlcyB5b3UgZmVlbCBhcmUgaW5jb3JyZWN0LiBCVFcsIHRoZXJlIGFy ZSBzZXZlcmFsIHJlZ2lzdGVycyB0aGF0IGNhbm5vdCBiZSBnZW5lcmFsaXplZCBhbmQgYXJlIHVz ZWQgcHVyZWx5IGZvciBjaGlwIGNvbmZpZ3VyYXRpb24uIEkgdGhpbmsgd2Ugc2hvdWxkIGFkZCBh IG5ldyBuYW1pbmcgY29udmVudGlvbiwgbmFtZWx5IHtyZWdpc3Rlcn1fezxjaGlwLXJlZ2lzdGVy LW5hbWU+fS4gQWxzbywgSSBzZWUgaW4gdGhlIHN5c19idXNfaWlvIGRvYwoKCgoKPiA+PiBpbl9h Y2NlbF94X3BlYWtfcmF3Cj4gPj4gCj4gPj4gc28gc2hvdWxkbuKAmXQgdGhlIHBoYXNlIGJlIHJl cHJlc2VudGVkIGFzIGZvbGxvd3M6Cj4gPj4gCj4gPj4gaW5fY3VycmVudF9BX3NjYWxlICAKPiA+ IEknbSBzdGlsbCBjb25mdXNlZC4gIFdoYXQgZG9lcyBBIHJlcHJlc2VudCBoZXJlPyAgSSBhc3N1 bWVkIHRoYXQgd2FzIGEgd2lsZAo+ID4gY2FyZCBmb3IgdGhlIGNoYW5uZWwgbnVtYmVyIGJlZm9y ZSBidXQgY2xlYXJseSBub3QuCj4gPiAKPiA+IEFoLCB5b3UgYXJlIGxhYmVsbGluZyB0aGUgMyBz ZXBhcmF0ZSBwaGFzZXMgYXMgQSwgQiBhbmQgQy4gSG1tLgo+ID4gSSBndWVzcyB0aGV5IHNvcnQg b2YgbG9vayBsaWtlIGF4aXMsIGFuZCBzb3J0IG9mIGxpa2UgaW5kZXBlbmRlbnQgY2hhbm5lbHMu Cj4gPiBTbyBjb3VsZCBiZSBpbmRleGVkIG9yIGRvbmUgdmlhIG1vZGlmaWVycyBkZXBlbmRpbmcg b24gaG93IHlvdSBsb29rIGF0IGl0LiAgCj4gSW4gbWV0ZXJpbmcgdGVybWlub2xvZ3ksIHRoZSB0 aHJlZSBwaGFzZXMgYXJlIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIFJFRCwgR1JFRU4sIEJMVUUg b3IgUGhhc2VBLCBQaGFzZUIsIFBoYXNlQyBhbmQgTmV1dHJhbC4gQW5hbG9nIERldmljZXMgdXNl cyB0aGUgQUJDTiBub21lbmNsYXR1cmUgc28gYW55b25lIHVzaW5nIHRoaXMgZHJpdmVyIHdpbGwg cHJvYmFibHkgaGF2ZSByZWZlcmVuY2VkIHRoZSBBbmFsb2cgRGV2aWNlcyBkYXRhc2hlZXQgc28g dGhpcyB0ZXJtaW5vbG9neSBzaG91bGQgYmUgZmFtaWxpYXIuIApXaGljaCBpcyBtb3JlIGNvbW1v bmx5IHVzZWQgaW4gZ2VuZXJhbD8gIFdlIGFyZSBkZXNpZ25pbmcgd2hhdCB3ZSBob3BlCndpbGwg YmUgYSBnZW5lcmFsIGludGVyZmFjZSBhbmQgbGFzdCB0aGluZyB3ZSB3YW50IGlzIHRvIGhhdmUg ZXZlcnlvbmUKbm90IHVzaW5nIEFESSBwYXJ0cyBjb25mdXNlZCEgIFBlcnNvbmFsbHkgbm90IGFz c2lnbmluZyAnY29sb3VycycgbWFrZXMKbW9yZSBzZW5zZSB0byBtZS4KCihidHcgcGxlYXNlIHdy YXAgYW55IGxpbmVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBsb25nIHRvIGFyb3VuZCA4MCBjaGFy YWN0ZXJzKS4KCj4gPiAKPiA+IEhtbS4gV2l0aCBuZXV0cmFsIGluIHRoZXJlIGFzIHdlbGwgSSBn dWVzcyB3ZSBuZWVkIHRvIG1ha2UgdGhlbQo+ID4gbW9kaWZpZXJzIChidXQgbWlnaHQgY2hhbmdl IG15IG1pbmQgbGF0ZXIgOykKPiA+IAo+ID4gUGFydGljdWxhcmx5IGFzIHdlIGFyZSB1c2luZyB0 aGUgdGhlIG1vZGlmaWVyIGZvciBSTVMgdW5kZXIgdGhlIHByZXZpb3VzCj4gPiBwbGFuLi4uIEl0 IGFwcGVhcnMgd2Ugc2hvdWxkIHRyZWF0IHRoYXQgaW5zdGVhZCBsaWtlIHdlIGRpZCBmb3IgcGVh awo+ID4gYW5kIGRvIGl0IGFzIGFuIGFkZGl0aW9uYWwgaW5mbyBtYXNrIGVsZW1lbnQuICBUaGUg cHJvYmxlbSB3aXRoIGRvaW5nIHRoYXQKPiA+IG9uIGEgY29udGludW91cyBtZWFzdXJlbWVudCBp cyB0aGF0IHdlIGNhbid0IHRyZWF0IGl0IGFzIGEgY2hhbm5lbCB0bwo+ID4gYmUgb3V0cHV0IHRo cm91Z2ggdGhlIGJ1ZmZlcmVkIGludGVyZmFjZS4gIAo+IEnigJl2ZSBjaGFuZ2VkIHRoZSBsYXlv dXQgb2YgdGhlIHNwcmVhZHNoZWV0IHRvIGJyZWFrb3V0IHRoZSBEaXJlY3Rpb24sIFR5cGUsIElu ZGV4LCBNb2RpZmllciBhbmQgSW5mbyBNYXNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBtaXNz LXVuZGVyc3RhbmRpbmcgYW5kIHdpbGwgaGVscCBpZGVudGlmeSBhbGwgdGhlIGl0ZW1zIHdlIG5l ZWQgdG8gYWRkLgo+IAo+IFRoZSBBREU3ODc4IGNoYW5uZWxzIHRoYXQgd2lsbCB1c2UgdGhlIGJ1 ZmZlciBhcmUgSUFXViwgVkFXViwgSUJXViwgVkJXViwgSUNXViwgVkNXViwgSU5XViwgQVZBLCBC VkEsIENWQSwgQVdBVFQsIEJXQVRULCBDV0FUVCwgQVZBUiwgQlZBUiwgYW5kIENWQVIuIFNvIEkg Z3Vlc3Mgd2UgaGF2ZSB0byBhZGQgYW4gaW5kZXgKUHJvYmFibHkgYSBnb29kIGlkZWEgYW55d2F5 LCB3ZSBhcmUgc29ydCBvZiBzbG93bHkgbW92aW5nIGF3YXkKZnJvbSBpbmRleCBsZXNzIGNoYW5u ZWxzLiAgVGhlIEFCSSBhbHdheXMgYWxsb3dlZCBpbmRleCBhc3NpZ25tZW50CmFuZCBpdCBtYWtl cyBmb3IgZWFzaWVyIHVzZXJzcGFjZSBjb2RlLgoKPiAKPiBBZGRyZXNzIFJlZ2lzdGVyIAlJSU8g QXR0cmlidXRlCQkJCQkJCURpcglUeXBlCQlJbmRleCAJTW9kaWZpZXIJSW5mbyBNYXNrCVIvVwlC aXQJCUJpdCBMZW5ndGgJVHlwZQlEZWZhdWx0CURlc2NyaXB0aW9uIAo+IAkJCQkJCQkJCQkJCQkJ CQkJCQkJCQkJCQlMZW5ndGggCUR1cmluZyBDb21tCQkJVmFsdWUJCj4gMHhFNTBDCUlBV1YJaW5f Y3VycmVudDBfcGhhc2VBX2luc3RhbnRhbmVvdXMJCWluCWN1cnJlbnQJCQkwCXBoYXNlQQlpbnN0 YW50YW5lb3VzCVIJMjQJCTMyIFNFCQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhh c2UgQSBjdXJyZW50LgoKSSdtIHVuY29udmluY2VkIGJ5ICJpbnN0YW50YW5lb3VzIi4gIFRoYXQg aXMgdGhlIGRlZmF1bHQgYXNzdW1wdGlvbiB0aGF0IHlvdSBhcmUKbWVhc3VyaW5nIGN1cnJlbnQg YXQgdGhpcyBwb2ludCBpbiB0aW1lLiAgSSdtIHN0aWxsIGNvbmZ1c2VkIG9uIHdoYXQgdGhpcyBh Y3R1YWxseQppcy4gSXMgaXQgZWZmZWN0aXZlbHkgdGhlIERDIGN1cnJlbnQ/IEkuZS4gdGhlIHdh dmUgZm9ybSB2YWx1ZSBmb3IgY3VycmVudD8gCllvdSBhbnN3ZXIgdGhpcyBiZWxvdy4gIFRoZXkg YXJlIERDIG1lYXN1cmVtZW50cy4uCgpXaGljaCBhY3R1YWxseSByYWlzZXMgYSBwb2ludCBJJ2Qg Zm9yZ290dGVuLiAgV2UgaGF2ZSBhbiBleHBsaWNpdCB0eXBlIApmb3IgYWx0dm9sdGFnZSAoZGVm aW5lZCBmb3IgRERTIGRldmljZXMgYXMgdGhlIHdhdmVmb3JtIGFtcGxpdHVkZSBJSVJDKS4KV2Ug c2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGF0IGlmIHBvc3NpYmxlLgoKU28gSSB0aGluayB0 aGlzIHNob3VsZCBiZS4KaW5fY3VycmVudDBfcGhhc2VBX3JhdwpldGMKQSBjaGFubmVsIGNhbiBi ZSB1bmlxdWVseSBpZGVudGlmaWVkIHVzaW5nIGluZGV4IGFuZCBtb2RpZmllciBhcyBhcyBwYWly IChpZiB3ZSBhZGQKdGhlIG5ldyBmaWVsZCBmb3IgY29tcHV0YXRpb24gYXBwbGllZCB0aGF0IHdp bGwgYWxzbyBhbGxvdyBzZXBhcmF0ZSBpZGVudGlmaWNhdGlvbikuClNvIHRoZSBsYXRlciBjaGFu bmVscyBjYW4gYmUuCgppbl9jdXJyZW50MF9waGFzZUJfcmF3IGV0YwoKSW5kZXhlcyBjYW4gYmUg c2hhcmVkIGJ5IGRpZmZlcmVudCB0eXBlcyBhcyB3ZWxsLiAgT2Z0ZW4gZG9uZSB0byBhc3NvY2lh dGUKZGlmZmVyZW50IG1lYXN1cmVtZW50cyBvZiB0aGUgc2FtZSBzaWduYWwgKHRob3VnaCB0aGUg QUJJIGRvZXNuJ3Qgc3BlY2lmeQp0aGF0KS4KCj4gMHhFNTBECUlCV1YJaW5fY3VycmVudDFfcGhh c2VCX2luc3RhbnRhbmVvdXMJCWluCWN1cnJlbnQJCQkxCXBoYXNlQglpbnN0YW50YW5lb3VzCVIJ MjQJCTMyIFNFCQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiBjdXJyZW50 Lgo+IDB4RTUwRQlJQ1dWCWluX2N1cnJlbnQyX3BoYXNlQ19pbnN0YW50YW5lb3VzCQlpbgljdXJy ZW50CQkJMglwaGFzZUMJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0YW50 YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEMgY3VycmVudC4KPiAweEU1MEYJSU5XVglpbl9jdXJyZW50 M19waGFzZU5faW5zdGFudGFuZW91cwkJaW4JY3VycmVudAkJCTMJbmV1dHJhbAlpbnN0YW50YW5l b3VzCVIJMjQJCTMyIFNFCQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgbmV1dHJhbCBj dXJyZW50IChBREU3ODY4IGFuZCBBREU3ODc4IG9ubHkpLgppbl92b2x0YWdlMF9waGFzZUFfcmF3 Cgo+IDB4RTUxMAlWQVdWCWluX3ZvbHRhZ2U0X3BoYXNlQV9pbnN0YW50YW5lb3VzCQlpbgl2b2x0 YWdlCQkJNAlwaGFzZUEJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0YW50 YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEEgdm9sdGFnZS4KPiAweEU1MTEJVkJXVglpbl92b2x0YWdl NV9waGFzZUJfaW5zdGFudGFuZW91cwkJaW4Jdm9sdGFnZQkJCTUJcGhhc2VCCWluc3RhbnRhbmVv dXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBCIHZv bHRhZ2UuCj4gMHhFNTEyCVZDV1YJaW5fdm9sdGFnZTZfcGhhc2VDX2luc3RhbnRhbmVvdXMJCWlu CXZvbHRhZ2UJCQk2CXBoYXNlQwlpbnN0YW50YW5lb3VzCVIJMjQJCTMyIFNFCQlTCQlOL0EJCUlu c3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQyB2b2x0YWdlLgo+IDB4RTUxMwlBV0FUVAlpbl9w b3dlcjdfcGhhc2VBX2luc3RhbnRhbmVvdXMJCQlpbglwb3dlcgkJCTcJcGhhc2VBCWluc3RhbnRh bmVvdXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBB IHRvdGFsIGFjdGl2ZSBwb3dlci4KPiAweEU1MTQJQldBVFQJaW5fcG93ZXI4X3BoYXNlQl9pbnN0 YW50YW5lb3VzCQkJaW4JcG93ZXIJCQk4CXBoYXNlQglpbnN0YW50YW5lb3VzCVIJMjQJCTMyIFNF CQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiB0b3RhbCBhY3RpdmUgcG93 ZXIuCj4gMHhFNTE1CUNXQVRUCWluX3Bvd2VyOV9waGFzZUNfaW5zdGFudGFuZW91cwkJCWluCXBv d2VyCQkJOQlwaGFzZUMJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0YW50 YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEMgdG90YWwgYWN0aXZlIHBvd2VyLgppbl9wb3dlcjBfcGhh c2VDX3JhdwoKPiAweEU1MTYJQVZBUglpbl9wb3dlcnJlYWN0aXZlMTBfcGhhc2VBX2luc3RhbnRh bmVvdXMJaW4JcG93ZXJyZWFjdGl2ZQkJMTAJcGhhc2VBCWluc3RhbnRhbmVvdXMJUgkyNAkJMzIg U0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBBIHRvdGFsIHJlYWN0aXZl IHBvd2VyIChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCBvbmx5KS4KaW5fcG93ZXJyZWFj dGl2ZTBfcGhhc2VBX3JhdyBldGMKPiAweEU1MTcJQlZBUglpbl9wb3dlcnJlYWN0aXZlMTFfcGhh c2VCX2luc3RhbnRhbmVvdXMJaW4JcG93ZXJyZWFjdGl2ZQkJMTEJcGhhc2VCCWluc3RhbnRhbmVv dXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBCIHRv dGFsIHJlYWN0aXZlIHBvd2VyIChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCBvbmx5KS4K PiAweEU1MTgJQ1ZBUglpbl9wb3dlcnJlYWN0aXZlMTJfcGhhc2VDX2luc3RhbnRhbmVvdXMJaW4J cG93ZXJyZWFjdGl2ZQkJMTIJcGhhc2VDCWluc3RhbnRhbmVvdXMJUgkyNAkJMzIgU0UJCVMJCU4v QQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBDIHRvdGFsIHJlYWN0aXZlIHBvd2VyIChB REU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCBvbmx5KS4KPiAweEU1MTkJQVZBCQlpbl9wb3dl cmFwcGFyZW50MTNfcGhhc2VBX2luc3RhbnRhbmVvdXMJaW4JcG93ZXJhcHBhcmVudAkxMwlwaGFz ZUEJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0YW50YW5lb3VzIHZhbHVl IG9mIFBoYXNlIEEgYXBwYXJlbnQgcG93ZXIuCj4gMHhFNTFBCUJWQQkJaW5fcG93ZXJhcHBhcmVu dDE0X3BoYXNlQl9pbnN0YW50YW5lb3VzCWluCXBvd2VyYXBwYXJlbnQJMTQJcGhhc2VCCWluc3Rh bnRhbmVvdXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFz ZSBCIGFwcGFyZW50IHBvd2VyLgo+IDB4RTUxQglDVkEJCWluX3Bvd2VyYXBwYXRlbnQxNV9waGFz ZUNfaW5zdGFudGFuZW91cwlpbglwb3dlcmFwcGFyZW50CTE1CXBoYXNlQwlpbnN0YW50YW5lb3Vz CVIJMjQJCTMyIFNFCQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQyBhcHBh cmVudCBwb3dlci4KPiAKPiBUaGUgQURFOTAwMCBjaGFubmVscyB0aGF0IHVzZSB0aGUgYnVmZmVy IGFyZSBJQSwgVkEsIElCLCBWQiwgSUMsIFZDIGFuZCBJTgo+ID4gCj4gPiBTbyBhZ2FpbiB3ZSBo YXZlIHJ1biBvdXQgb2Ygc3BhY2UuIEl0J3MgaW5jcmVhc2luZ2x5IGxvb2tpbmcgbGlrZSB3ZSBu ZWVkCj4gPiByb29tIGZvciBhbm90aGVyIGZpZWxkIGluIHRoZSBldmVudHMgLSB0byBjbGVhbmx5 IHJlcHJlc2VudCBjb21wdXRlZCB2YWx1ZXMuCj4gPiAKPiA+IEhtbS4gV2hhdCBpcyB0aGUgY3Vy cmVudCB1c2FnZT8gLSBpdCdzIGJlZW4gYSB3aGlsZSBzbyBJIGhhZCB0byBnbwo+ID4gbG9vayBp biB0aGUgaGVhZGVyLgo+ID4gCj4gPiAwLTE1IENoYW5uZWwgKGxvdHMgb2YgY2hhbm5lbHMpCj4g PiAzMS0xNiBDaGFubmVsIDIgICgzNiBtb2RpZmllcnMgLSBsb3RzIG9mIGNoYW5uZWxzKQo+ID4g NDctMzIgQ2hhbm5lbCBUeXBlICgzMSB1c2VkIHNvIGZhciAtIHRoaXMgbG9va3MgbW9zdCBsaWtl bHkgdG8gcnVuIG91dCBvZgo+ID4gc3BhY2UgaW4gdGhlIGxvbmcgcnVuIHNvIGxlYXZlIHRoaXMg b25lIGFsb25lKS4KPiA+IDU0LTQ4IEV2ZW50IERpcmVjdGlvbiAoNCB1c2VkKQo+ID4gNTUgRGlm ZmVyZW50aWFsICAoMTogY2hhbm5lbCAyIGFzIGRpZmZlcmVudGlhbCBwYWlyIDA6IGFzIGEgbW9k aWZpZXIpCj4gPiA2My01NiBFdmVudCBUeXBlICg2IHVzZWQpCj4gPiAKPiA+IFNvIEkgdGhpbmsg d2UgY2FuIHBpbmNoIGJpdCA1MyBhcyBhbm90aGVyIGZsYWcgdG8gaW5kaWNhdGUgd2UgaGF2ZQo+ ID4gYSBjb21wdXRlZCB2YWx1ZSBvciBwb3NzaWJseSBiaXQgNjMgYXMgZXZlbnQgdHlwZXMgYXJl IGZldyBhbmQKPiA+IGZhciBiZXR3ZWVuIGFzIHdlbGwuCj4gPiAKPiA+IFByb2JhYmx5IHJlYXNv bmFibGUgdG8gYXNzdW1lIHdlIG5ldmVyIGhhdmUgMTYgYml0cyB3b3J0aAo+ID4gb2YgY2hhbm5l bHMgYW5kIGNvbXB1dGVkIGNoYW5uZWxzIGF0IHRoZSBzYW1lIHRpbWU/Cj4gPiBIZW5jZSBJIHRo aW5rIHdlIGNhbiBzdGVhbCBiaXRzIG9mZiB0aGUgdG9wIG9mIENoYW5uZWwuCj4gPiBIb3cgbWFu eSBkbyB3ZSBuZWVkPyAgTm90IHN1cmUgdW5mb3J0dW5hdGVseSBidXQgZmVlbHMgbGlrZQo+ID4g OCBzaG91bGQgYmUgcGxlbnR5LiAgCj4gV2hlbiB5b3Ugc3BlYWsgb2YgQ2hhbm5lbHMgaGVyZSwg YXJlIHlvdSByZWZlcnJpbmcgdG8gbWVhc3VyZW1lbnRzIHRoYXQgd2lsbCB1c2UgdGhlIGJ1ZmZl cj8gRXZlbiB3aGVuIGNvdW50aW5nIGFsbCB0aGUgSUlPIGF0dHJpYnV0ZXMsIHRoZSBBREU5MDAw IGhhcyA0NjIgcmVnaXN0ZXJzLCBhbmQgbm90IGFsbCBvZiB0aG9zZSB3b3VsZCBiZSBkZWZpbmVk IGFzIGF0dHJpYnV0ZXMuIEkgdGhpbmsgOCBCaXRzIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdo LgpOb3QgcXVpdGUuICBUaGlzIGlzIGFsbCBhYm91dCBhbGxvd2luZyB1cyB0byBkaWZmZXJlbnRp YXRlIGJldHdlZW4KdGhlIGFjdHVhbCBjaGFubmVscyB3aGVyZSBhIGNoYW5uZWwgaXMgYSBzaW5n bGUgbWVhc3VyZW1lbnQgdGhhdCB3ZQphcmUgaW50ZXJlc3RlZCBpbi4gClNvIHdlIGNhcmUgYWJv dXQgMjU2IG1lYXN1cmVtZW50cyB0aGF0IGFyZSBvdGhlcndpc2UgaW5kaXN0aW5ndWlzaGFibGUK dXNpbmcgY29tYmluYXRpb24gb2YgaW5kZXgsIG1vZGlmaWVyIGFuZCBvdXIgbmV3IHByb3Bvc2UK Y29tcHV0ZWR2YWx1ZSBiaXQuCgo+ID4gCj4gPiBUaGUgb3RoZXIgZWxlbWVudCBvZiB0aGlzIGlz IHdlIGFkZCBhIG5ldyBmaWVsZCB0byBpaW9fY2hhbl9zcGVjCj4gPiB0byBjb250YWluICdkZXJp dmVkX3R5cGUnIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgd2hpY2ggaGFzCj4gPiBybXMgYW5kIHN1 bSBzcXVhcmVkIGV0Yy4gT3ZlciB0aW1lIHdlIGNhbiBtb3ZlIHNvbWUgb2YgdGhvc2UKPiA+IGZy b20gdGhlIG1vZGlmaWVycyBhbmQgZnJlZSB1cCBhIGZldyBlbnRpcmVzIHRoZXJlLgo+ID4gU28g bW9kaWZpZXIgbWlnaHQgYmUgIlggYW5kIFkgYW5kIFoiIHdpdGggYSBkZXJpdmVkX3R5cGUgb2Yg Cj4gPiBzdW1fc3F1YXJlZCB0byBnaXZlIGV4aXN0aW5nIHN1bV9zcXVhcmVkX3hfeV96IGJ1dCBu bwo+ID4gcnVzaCBvbiB0aGF0Lgo+ID4gCj4gPiBBbnlob3cgc28gbm93IHdlIGhhdmUgYW4gZXh0 cmEgZWxlbWVudCB0byBwbGF5IHRoYXQgd2lsbCByZXN1bHQKPiA+IGluIGEgZGlmZmVyZW50IGNo YW5uZWwuCj4gPiAKPiA+IFdoaWxzdCBoZXJlIHdlIHNob3VsZCB0aGluayBhYm91dCBhbnkgb3Ro ZXIgbW9kcyBuZWVkZWQgdG8KPiA+IHRoYXQgZXZlbnQgc3RydWN0dXJlLiAgSXQgaXMgYSBsaXR0 bGUgdW5mb3J0dW5hdGUgdGhhdCB0aGlzCj4gPiB3aWxsIGJlIGEgYnJlYWtpbmcgY2hhbmdlIGZv ciBhbnkgb2xkIHVzZXJzcGFjZSBjb2RlIHBsYXlpbmcKPiA+IHdpdGggbmV3IGRyaXZlcnMgYnV0 IGl0IGNhbid0IGJlIGhlbHBlZCBhcyB3ZSBkaWRuJ3QgaGF2ZQo+ID4gcmVzZXJ2ZWQgdmFsdWVz IGluIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIChvb3BzKS4KPiA+IAo+ID4gQXQgc29tZXBvaW50 IHdlIG1heSBuZWVkIHRvIGFkZCB0aGUgJ3NoYXJlZCBieSBkZXJpdmVkX3ZhbHVlJwo+ID4gaW5m byBtYXNrIGJ1dCBJIHRoaW5rIHdlIGNhbiBpZ25vcmUgdGhhdCBmb3Igbm93IChzZWVtcwo+ID4g bW9kZXJhdGVseSB1bmxpa2VseSB0byBoYXZlIGFueXRoaW5nIGluIGl0ISkgIAo+ID4+IAo+ID4+ IEJ1dCBmb3Igbm93LCBJIGZvbGxvd2VkIHlvdXIgaW5zdHJ1Y3Rpb25zIGZyb20geW91ciByZXBs eS4KPiA+PiAKPiA+PiBBZnRlciBmaW5hbGl6aW5nIHRoaXMgb25lLCBJIHdpbGwgd29yayBvbiB0 aGUgQURFOTAwMCwgd2hpY2ggYXMgd2F5IG1vcmUgcmVnaXN0ZXJzIDstKQo+ID4+IAo+ID4+IE9u Y2Ugd2UgY2FuIGFncmVlIG9uIHRoZSByZWdpc3RlciBuYW1pbmcsIEkgd2lsbCB1cGRhdGUgdGhl IEFERTc4NTQgZHJpdmVyIGZvciBSb2RyaWdvLCB3aGljaCB3aWxsIGdvIGEgbG9uZyB3YXkgdG8g Z2V0dGluZyBpdCBvdXQgb2Ygc3RhZ2luZy4gIAo+ID4gSSdsbCBlZGl0IHRvIGZpdCB3aXRoIG5l dyBzY2hlbWUgYW5kIGluc2VydCBpbmRleGVzIHdoaWNoIEkgdGhpbmsgd291bGQgYmUKPiA+IHBy ZWZlcnJlZCB0aG91Z2ggb3B0aW9uYWwgdW5kZXIgdGhlIEFCSSBhcyB3ZSBvbmx5IGhhdmUgb25l IG9mIGVhY2ggdHlwZS8gIAo+ID4+IAo+ID4+IEFkZHJlc3MJUmVnaXN0ZXIJSUlPIEF0dHJpYnV0 ZQlSL1cJQml0IExlbmd0aAlCaXQgTGVuZ3RoIER1cmluZyBDb21tdW5pY2F0aW9ucwlUeXBlCURl ZmF1bHQgVmFsdWUJRGVzY3JpcHRpb24KPiA+PiAweDQzODAJQUlHQUlOCWluX2N1cnJlbnQwX3Bo YXNlQV9zY2FsZQlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEEgY3VycmVudCBnYWlu IGFkanVzdC4gIAo+ID4gQSwgQiwgQywgTiBhcmVuJ3Qgb2J2aW91cyB0byB0aGUgbGF5IHJlYWRl ciBzbyBJIHN1Z2dlc3Qgd2UgYnVybiBhIGZldyBjaGFyYWN0ZXJzIGFuZCBzdGljayBwaGFzZSBp biBmb3IgQUJDIGFuZCBqdXN0IGhhdmUgbmV1dHJhbCBmb3IKPiA+IHRoZSBuZXV0cmFsIG9uZS4g Tm90IHN1cmUgYWJvdXQgY2FwaXRhbGl6YXRpb24gb3Igbm90IHRob3VnaC4KPiA+ICAgCj4gPj4g MHg0MzgxCUFWR0FJTglpbl92b2x0YWdlMF9waGFzZUFfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkw eDAwMDAwMAlQaGFzZSBBIHZvbHRhZ2UgZ2FpbiBhZGp1c3QuCj4gPj4gMHg0MzgyCUJJR0FJTglp bl9jdXJyZW50MF9waGFzZUJfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBC IGN1cnJlbnQgZ2FpbiBhZGp1c3QuCj4gPj4gMHg0MzgzCUJWR0FJTglpbl92b2x0YWdlMF9waGFz ZUJfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBCIHZvbHRhZ2UgZ2FpbiBh ZGp1c3QuCj4gPj4gMHg0Mzg0CUNJR0FJTglpbl9jdXJyZW50MF9waGFzZUNfc2NhbGUJUi9XCTI0 CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBDIGN1cnJlbnQgZ2FpbiBhZGp1c3QuCj4gPj4gMHg0 Mzg1CUNWR0FJTglpbl92b2x0YWdlMF9waGFzZUNfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAw MDAwMAlQaGFzZSBDIHZvbHRhZ2UgZ2FpbiBhZGp1c3QuCj4gPj4gMHg0Mzg2CU5JR0FJTglpbl9j dXJyZW50MF9uZXV0cmFsX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJTmV1dHJhbCBj dXJyZW50IGdhaW4gYWRqdXN0IChBREU3ODY4IGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+IDB4NDM4 NwlBSVJNU09TCWluX2N1cnJlbnQwX3BoYXNlQV9ybXNfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJ MHgwMDAwMDAJUGhhc2UgQSBjdXJyZW50IHJtcyBvZmZzZXQuCj4gPj4gMHg0Mzg4CUFWUk1TT1MJ aW5fdm9sdGFnZTBfcGhhc2VBX3Jtc19vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQ aGFzZSBBIHZvbHRhZ2Ugcm1zIG9mZnNldC4KPiA+PiAweDQzODkJQklSTVNPUwlpbl9jdXJyZW50 MF9waGFzZUJfcm1zX29mZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEIgY3Vy cmVudCBybXMgb2Zmc2V0Lgo+ID4+IDB4NDM4QQlCVlJNU09TCWluX3ZvbHRhZ2UwX3BoYXNlQl9y bXNfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQiB2b2x0YWdlIHJtcyBv ZmZzZXQuCj4gPj4gMHg0MzhCCUNJUk1TT1MJaW5fY3VycmVudDBfcGhhc2VDX3Jtc19vZmZzZXQJ Ui9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBDIGN1cnJlbnQgcm1zIG9mZnNldC4KPiA+ PiAweDQzOEMJQ1ZSTVNPUwlpbl92b2x0YWdlMF9waGFzZUNfcm1zX29mZnNldAlSL1cJMjQJMzIg WlBTRQlTCTB4MDAwMDAwCVBoYXNlIEMgdm9sdGFnZSBybXMgb2Zmc2V0Lgo+ID4+IDB4NDM4RAlO SVJNU09TCWluX2N1cnJlbnQwX25ldXRyYWxfcm1zX29mZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4 MDAwMDAwCU5ldXRyYWwgY3VycmVudCBybXMgb2Zmc2V0IChBREU3ODY4IGFuZCBBREU3ODc4IG9u bHkpLgo+ID4+IDB4NDM4RQlBVkFHQUlOCWluX3Bvd2VyYXBwYXJlbnQwX3BoYXNlQV9zY2FsZQlS L1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEEgYXBwYXJlbnQgcG93ZXIgZ2FpbiBhZGp1 c3QuCj4gPj4gMHg0MzhGCUJWQUdBSU4JaW5fcG93ZXJhcHBhcmVudDBfcGhhc2VCX3NjYWxlCVIv VwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQiBhcHBhcmVudCBwb3dlciBnYWluIGFkanVz dC4KPiA+PiAweDQzOTAJQ1ZBR0FJTglpbl9wb3dlcmFwcGFyZW50MF9waGFzZUNfc2NhbGUJUi9X CTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBDIGFwcGFyZW50IHBvd2VyIGdhaW4gYWRqdXN0 Lgo+ID4+IDB4NDM5MQlBV0dBSU4JaW5fcG93ZXIwX3BoYXNlQV9zY2FsZQlSL1cJMjQJMzIgWlBT RQlTCTB4MDAwMDAwCVBoYXNlIEEgdG90YWwgYWN0aXZlIHBvd2VyIGdhaW4gYWRqdXN0Lgo+ID4+ IDB4NDM5MglBV0FUVE9TCWluX3Bvd2VyMF9waGFzZUFfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJ MHgwMDAwMDAJUGhhc2UgQSB0b3RhbCBhY3RpdmUgcG93ZXIgb2Zmc2V0IGFkanVzdC4KPiA+PiAw eDQzOTMJQldHQUlOCWluX3Bvd2VyMF9waGFzZUJfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAw MDAwMAlQaGFzZSBCIHRvdGFsIGFjdGl2ZSBwb3dlciBnYWluIGFkanVzdC4KPiA+PiAweDQzOTQJ QldBVFRPUwlpbl9wb3dlcjBfcGhhc2VCX29mZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAw CVBoYXNlIEIgdG90YWwgYWN0aXZlIHBvd2VyIG9mZnNldCBhZGp1c3QuCj4gPj4gMHg0Mzk1CUNX R0FJTglpbl9wb3dlcjBfUGhhc2VDX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhh c2UgQyB0b3RhbCBhY3RpdmUgcG93ZXIgZ2FpbiBhZGp1c3QuCj4gPj4gMHg0Mzk2CUNXQVRUT1MJ aW5fcG93ZXIwX3BoYXNlQ19vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBD IHRvdGFsIGFjdGl2ZSBwb3dlciBvZmZzZXQgYWRqdXN0Lgo+ID4+IDB4NDM5NwlBVkFSR0FJTglp bl9wb3dlcnJlYWN0aXZlMF9waGFzZUFfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQ aGFzZSBBIHRvdGFsIHJlYWN0aXZlIHBvd2VyIGdhaW4gYWRqdXN0IChBREU3ODU4LCBBREU3ODY4 LCBhbmQgQURFNzg3OCkuCj4gPj4gMHg0Mzk4CUFWQVJPUwlpbl9wb3dlcnJlYWN0aXZlMF9waGFz ZUFfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQSB0b3RhbCByZWFjdGl2 ZSBwb3dlciBvZmZzZXQgYWRqdXN0IChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCkuCj4g Pj4gMHg0Mzk5CUJWQVJHQUlOCWluX3Bvd2VycmVhY3RpdmUwX3BoYXNlQl9zY2FsZQlSL1cJMjQJ MzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEIgdG90YWwgcmVhY3RpdmUgcG93ZXIgZ2FpbiBhZGp1 c3QgKEFERTc4NTgsIEFERTc4NjgsIGFuZCBBREU3ODc4KS4KPiA+PiAweDQzOUEJQlZBUk9TCWlu X3Bvd2VycmVhY3RpdmUwX3BoYXNlQl9vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQ aGFzZSBCIHRvdGFsIHJlYWN0aXZlIHBvd2VyIG9mZnNldCBhZGp1c3QgKEFERTc4NTgsIEFERTc4 NjgsIGFuZCBBREU3ODc4KS4KPiA+PiAweDQzOUIJQ1ZBUkdBSU4JaW5fcG93ZXJyZWFjdGl2ZTBf cGhhc2VDX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQyB0b3RhbCByZWFj dGl2ZSBwb3dlciBnYWluIGFkanVzdCAoQURFNzg1OCwgQURFNzg2OCwgYW5kIEFERTc4NzgpLgo+ ID4+IDB4NDM5QwlDVkFST1MJaW5fcG93ZXJyZWFjdGl2ZTBfcGhhc2VDX29mZnNldAlSL1cJMjQJ MzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEMgdG90YWwgcmVhY3RpdmUgcG93ZXIgb2Zmc2V0IGFk anVzdCAoQURFNzg1OCwgQURFNzg2OCwgYW5kIEFERTc4NzgpLgo+ID4+IDB4NDM5RAlBRldHQUlO CWluX3Bvd2VyMF9waGFzZUFfZnVuZGFtZW50YWxfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAw MDAwMAlQaGFzZSBBIGZ1bmRhbWVudGFsIGFjdGl2ZSBwb3dlciBnYWluIGFkanVzdC4gTG9jYXRp b24gcmVzZXJ2ZWQgZm9yIEFERTc4NTQsIEFERTc4NTgsIGFuZCBBREU3ODY4LiAgCj4gPiBIbW0u IGZ1bmRhbWVudGFsIGlzIHRoZSBvZGRpdHkgaGVyZS4gIEkgaGVyZSBiZWNhdXNlICBpdCBpcyBz b3J0IG9mIGEgZGVyaXZlZCB2YWx1ZQo+ID4gYW5kIHNvcnQgb2YgYSBmaWx0ZXIgYXBwbGllZC4g IENhbiBpdCBiZSBzZW5zaWJsZSBjb21iaW5lZCB3aXRoIFJNUz8gcHJvYmFibHkgbm90IGJ1dAo+ ID4gaXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggcGVhayBmb3IgZXhhbXBsZSAod2hpY2ggSSdkIGFs c28gaWRlYWxseSBtb3ZlIGludG8KPiA+IHRoZSBkZXJpdmVkIHJlcHJlc2VudGF0aW9uLikuICAK PiBJbmNsdWRlcyBvbmx5IHRoZSBtZWFzdXJlbWVudCBzcGVjdHJ1bSBhdCA1MEh6IG9yIDYwSHog YW5kIGRvZXMgbm90IGluY2x1ZGUgaGFybW9uaWMuIApJIHRoaW5rIGZvciB0aGF0IHdlIG5lZWQg dG8gZGVmaW5lIGEgZGlmZmVyZW50IGluZGV4ZWQgY2hhbm5lbCBhbmQgZGVmaW5lCnRoZSBmaWx0 ZXJzIGFwcGxpZWQgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZXMgdG8gbWFrZSBpdCBhIGJhbmQgcGFz cyBhdCB0aGVzZQpmcmVxdWVuY2llcy4gIFdlIG1heSBuZWVkIHRvIGV4cGFuZCB0aGUgY3VycmVu dCBmaWx0ZXIgZGVmaW5pdGlvbnMgdG8gZG8gdGhpcwpidXQgdGhhdCBpcyBmaW5lIGlmIG5lZWRl ZC4KCgo+IAo+ID4gICAKPiA+PiAweDQzOUUJQUZXQVRUT1MJaW5fcG93ZXIwX3BoYXNlQV9mdW5k YW1lbnRhbF9vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBBIGZ1bmRhbWVu dGFsIGFjdGl2ZSBwb3dlciBvZmZzZXQgYWRqdXN0LiBMb2NhdGlvbiByZXNlcnZlZCBmb3IgQURF Nzg1NCwgQURFNzg1OCwgYW5kIEFERTc4NjguCj4gPj4gMHg0MzlGCUJGV0dBSU4JaW5fcG93ZXIw X3BoYXNlQl9mdW5kYW1lbnRhbF9zY2FsZQlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNl IEIgZnVuZGFtZW50YWwgYWN0aXZlIHBvd2VyIGdhaW4gYWRqdXN0IChBREU3ODc4IG9ubHkpLgo+ ID4+IDB4NDNBMAlCRldBVFRPUwlpbl9wb3dlcjBfcGhhc2VCX2Z1bmRhbWVudGFsX29mZnNldAlS L1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEIgZnVuZGFtZW50YWwgYWN0aXZlIHBvd2Vy IG9mZnNldCBhZGp1c3QgKEFERTc4Nzggb25seSkuCj4gPj4gMHg0M0ExCUNGV0dBSU4JaW5fcG93 ZXIwX3BoYXNlQ19mdW5kYW1lbnRhbF9zY2FsZQlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBo YXNlIEMgZnVuZGFtZW50YWwgYWN0aXZlIHBvd2VyIGdhaW4gYWRqdXN0Lgo+ID4+IDB4NDNBMglD RldBVFRPUwlpbl9wb3dlcjBfcGhhc2VDX2Z1bmRhbWVudGFsX29mZnNldAlSL1cJMjQJMzIgWlBT RQlTCTB4MDAwMDAwCVBoYXNlIEMgZnVuZGFtZW50YWwgYWN0aXZlIHBvd2VyIG9mZnNldCBhZGp1 c3QgKEFERTc4Nzggb25seSkuCj4gPj4gMHg0M0EzCUFGVkFSR0FJTglpbl9wb3dlcnJlYWN0aXZl MF9waGFzZUFfZnVuZGFtZW50YWxfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFz ZSBBIGZ1bmRhbWVudGFsIHJlYWN0aXZlIHBvd2VyIGdhaW4gYWRqdXN0IChBREU3ODc4IG9ubHkp Lgo+ID4+IDB4NDNBNAlBRlZBUk9TCWluX3Bvd2VycmVhY3RpdmUwX3BoYXNlQV9mdW5kYW1lbnRh bF9vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBBIGZ1bmRhbWVudGFsIHJl YWN0aXZlIHBvd2VyIG9mZnNldCBhZGp1c3QgKEFERTc4Nzggb25seSkuCj4gPj4gMHg0M0E1CUJG VkFSR0FJTglpbl9wb3dlcnJlYWN0aXZlMF9waGFzZUJfZnVuZGFtZW50YWxfc2NhbGUJUi9XCTI0 CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBCIGZ1bmRhbWVudGFsIHJlYWN0aXZlIHBvd2VyIGdh aW4gYWRqdXN0IChBREU3ODc4IG9ubHkpLgo+ID4+IDB4NDNBNglCRlZBUk9TCWluX3Bvd2VycmVh Y3RpdmUwX3BoYXNlQl9mdW5kYW1lbnRhbF9vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAw MAlQaGFzZSBCIGZ1bmRhbWVudGFsIHJlYWN0aXZlIHBvd2VyIG9mZnNldCBhZGp1c3QgKEFERTc4 Nzggb25seSkuCj4gPj4gMHg0M0E3CUNGVkFSR0FJTglpbl9wb3dlcnJlYWN0aXZlMF9waGFzZUNf ZnVuZGFtZW50YWxfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBDIGZ1bmRh bWVudGFsIHJlYWN0aXZlIHBvd2VyIGdhaW4gYWRqdXN0IChBREU3ODc4IG9ubHkpLgo+ID4+IDB4 NDNBOAlDRlZBUk9TCWluX3Bvd2VycmVhY3RpdmUwX3BoYXNlQ19mdW5kYW1lbnRhbF9vZmZzZXQJ Ui9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBDIGZ1bmRhbWVudGFsIHJlYWN0aXZlIHBv d2VyIG9mZnNldCBhZGp1c3QgKEFERTc4Nzggb25seSkuCj4gPj4gMHg0M0E5CVZBVEhSMQlyZWdp aXN0ZXJfVkFUSFIxCVIvVwkyNAkzMiBaUAlVCTB4MDAwMDAwCU1vc3Qgc2lnbmlmaWNhbnQgMjQg Yml0cyBvZiBWQVRIUls0NzowXSB0aHJlc2hvbGQgdXNlZCBpbiBwaGFzZSBhcHBhcmVudCBwb3dl ciBkYXRhcGF0aC4gIAo+ID4gRG8gbm90IGV4cG9zZSB0aGVzZSB0byB1c2Vyc3BhY2UuIFdoeSB3 b3VsZCBpdCBjYXJlPyAgCj4gQnJpbGxpYW50LCB5ZXMgdGhlc2Ugc2hvdWxkIGJlIG1vdmVkIHRo ZSB0aGUgRGV2aWNlVHJlZSAoRFQpCgpDb29sCgo+ID4gICAKPiA+PiAweDQzQUEJVkFUSFIwCXJl Z2lzdGVyX1ZBVEhSMAlSL1cJMjQJMzIgWlAJVQkweDAwMDAwMAlMZXNzIHNpZ25pZmljYW50IDI0 IGJpdHMgb2YgVkFUSFJbNDc6MF0gdGhyZXNob2xkIHVzZWQgaW4gcGhhc2UgYXBwYXJlbnQgcG93 ZXIgZGF0YXBhdGguCj4gPj4gMHg0M0FCCVdUSFIxCXJlZ2lzdGVyX1dUSFIxCVIvVwkyNAkzMiBa UAlVCTB4MDAwMDAwCU1vc3Qgc2lnbmlmaWNhbnQgMjQgYml0cyBvZiBXVEhSWzQ3OjBdIHRocmVz aG9sZCB1c2VkIGluIHBoYXNlIHRvdGFsL2Z1bmRhbWVudGFsIGFjdGl2ZSBwb3dlciBkYXRhcGF0 aC4KPiA+PiAweDQzQUMJV1RIUjAJcmVnaXN0ZXJfV1RIUjAJUi9XCTI0CTMyIFpQCVUJMHgwMDAw MDAJTGVzcyBzaWduaWZpY2FudCAyNCBiaXRzIG9mIFdUSFJbNDc6MF0gdGhyZXNob2xkIHVzZWQg aW4gcGhhc2UgdG90YWwvZnVuZGFtZW50YWwgYWN0aXZlIHBvd2VyIGRhdGFwYXRoLgo+ID4+IDB4 NDNBRAlWQVJUSFIxCXJlZ2lzdGVyX1ZBUlRIUjEJUi9XCTI0CTMyIFpQCVUJMHgwMDAwMDAJTW9z dCBzaWduaWZpY2FudCAyNCBiaXRzIG9mIFZBUlRIUls0NzowXSB0aHJlc2hvbGQgdXNlZCBpbiBw aGFzZSB0b3RhbC9mdW5kYW1lbnRhbCByZWFjdGl2ZSBwb3dlciBkYXRhcGF0aCAoQURFNzg1OCwg QURFNzg2OCwgYW5kIEFERTc4NzgpLgo+ID4+IDB4NDNBRQlWQVJUSFIwCXJlZ2lzdGVyX1ZBUlRI UjAJUi9XCTI0CTMyIFpQCVUJMHgwMDAwMDAJTGVzcyBzaWduaWZpY2FudCAyNCBiaXRzIG9mIFZB UlRIUls0NzowXSB0aHJlc2hvbGQgdXNlZCBpbiBwaGFzZSB0b3RhbC9mdW5kYW1lbnRhbCByZWFj dGl2ZSBwb3dlciBkYXRhcGF0aCAoQURFNzg1OCwgQURFNzg2OCwgYW5kIEFERTc4NzgpLgo+ID4+ IDB4NDNBRglSZXNlcnZlZAkJTi9BNAlOL0E0CU4vQTQJTi9BNAkweDAwMDAwMAlUaGlzIG1lbW9y eSBsb2NhdGlvbiBzaG91bGQgYmUga2VwdCBhdCAweDAwMDAwMCBmb3IgcHJvcGVyIG9wZXJhdGlv bi4KPiA+PiAweDQzQjAJVkFOT0xPQUQJcmVnaXN0ZXJfVkFOT0xPQUQJUi9XCTI0CTMyIFpQU0UJ UwkweDAwMDAwMDAJTm8gbG9hZCB0aHJlc2hvbGQgaW4gdGhlIGFwcGFyZW50IHBvd2VyIGRhdGFw YXRoLiAgCj4gPiBUaGlzIG9uZSBpcyBraW5kIG9mIGFuIGV2ZW50IHBhcmFtZXRlciwgYnV0IG9u ZSB0aGF0IGNvbnRyb2xzIGludGVybmFsIGNyZWVwIHByZXZlbnRpb24uCj4gPiBUaGlzIHdpbGwg YmUgYSBkcml2ZXIgc3BlY2lmaWMgYXR0ciBJIHRoaW5rIGZvciBub3cuIFdlIG1heSBhZGQgaXQg dG8gaW5mb19tYXNrCj4gPiBsYXRlciBpZiB3ZSBnZXQgbG90cyBvZiBtZXRlciBkcml2ZXJzLiAK PiA+IFNvbWV0aGluZyBsaWtlCj4gPiBpbl9wb3dlcjBfbm9fbG9hZF90aHJlc2ggdGhvdWdoIEkg aGF2ZW4ndCByZWFsbHkgdGhvdWdodCBhYm91dCBpdCBvciBsb29rZWQKPiA+IGZvciBzaW1pbGFy IHByZWNlZGVuY2UuICAKPiBBZ2FpbiwgdGhpcyBpcyBzb21ldGhpbmcgdGhhdCB3b3VsZCBiZSBz ZXQgYW5kIG5ldmVyIGNoYW5nZWQsIHNvIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgbW92ZWQgdG8g RFQuCgpDb29sLgoKPiA+IAo+ID4gICAKPiA+PiAweDQzQjEJQVBOT0xPQUQJcmVnaXN0ZXJfQVBO T0xPQUQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMDAJTm8gbG9hZCB0aHJlc2hvbGQgaW4gdGhl IHRvdGFsL2Z1bmRhbWVudGFsIGFjdGl2ZSBwb3dlciBkYXRhcGF0aC4gIAo+ID4gaW5fYWN0aXZl cG93ZXIwX25vX2xvYWRfdGhyZXNoICAKPiBEVAo+ID4+IDB4NDNCMglWQVJOT0xPQUQJcmVnaXN0 ZXJfVkFSTk9MT0FECVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAwCU5vIGxvYWQgdGhyZXNob2xk IGluIHRoZSB0b3RhbC9mdW5kYW1lbnRhbCByZWFjdGl2ZSBwb3dlciBkYXRhcGF0aC4gTG9jYXRp b24gcmVzZXJ2ZWQgZm9yIEFERTc4NTQuICAKPiA+IGluX3JlYWN0aXZwb3dlcjBfbm9fbG9hZF90 aHJlc2ggIAo+IERUCj4gPiAgIAo+ID4+IDB4NDNCMwlWTEVWRUwJcmVnaXN0ZXJfVkxFVkVMCVIv VwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUmVnaXN0ZXIgdXNlZCBpbiB0aGUgYWxnb3JpdGhtIHRo YXQgY29tcHV0ZXMgdGhlIGZ1bmRhbWVudGFsIGFjdGl2ZSBhbmQgcmVhY3RpdmUgcG93ZXJzIChB REU3ODc4IG9ubHkpLiAgCj4gPiBUaGlzIG9uZSBsb29rcyBsaWtlIGEgY2hhcmFjdGVyaXN0aWMg b2YgdGhlIGNpcmN1aXQgYXR0YWNoZWQuICBTbyBzaG91bGQgYmUgZGV2aWNldHJlZQo+ID4gb3Ig c2ltaWxhciBhbmQgbm90IGV4cG9zZWQgdG8gdXNlcnNwYWNlLiAgCj4gRFQKPiA+ICAgCj4gPj4g MHg0M0I1CURJQ09FRkYJcmVnaXN0ZXJfRElDT0VGRglSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAw MAlSZWdpc3RlciB1c2VkIGluIHRoZSBkaWdpdGFsIGludGVncmF0b3IgYWxnb3JpdGhtLiBJZiB0 aGUgaW50ZWdyYXRvciBpcyB0dXJuZWQgb24sIGl0IG11c3QgYmUgc2V0IGF0IDB4RkY4MDAwLiBJ biBwcmFjdGljZSwgaXQgaXMgdHJhbnNtaXR0ZWQgYXMgMHhGRkY4MDAwLiAgCj4gPiBubyB1c2Vy c3BhY2UgaW50ZXJmYWNlLiAgCj4gRFQKPiA+ICAgCj4gPj4gMHg0M0I2CUhQRkRJUwlyZWdpc3Rl cl9IUEZESVMJUi9XCTI0CTMyIFpQCVUJMHgwMDAwMDAJRGlzYWJsZXMvZW5hYmxlcyB0aGUgSFBG IGluIHRoZSBjdXJyZW50IGRhdGFwYXRoIChzZWUgVGFibGUgMzQpLiAgCj4gPiBXZSBoYXZlIGNv bnRyb2xzIGZvciBoaWdoIHBhc3MgZmlsdGVycywgeW91J2xsIG5lZWQgdG8gbWFwIG9uIHRvIHRo ZW0uCj4gPiBEaXNhYmxlIGlzIHVzdWFsbHkgc2V0dGluZyAzREIgcG9pbnQgdG8gMCBJSVJDLiAg Cj4gRFQKPiA+ICAgCj4gPj4gMHg0M0I4CUlTVU1MVkwJcmVnaXN0ZXJfSVNVTUxWTAlSL1cJMjQJ MzIgWlBTRQlTCTB4MDAwMDAwCVRocmVzaG9sZCB1c2VkIGluIGNvbXBhcmlzb24gYmV0d2VlbiB0 aGUgc3VtIG9mIHBoYXNlIGN1cnJlbnRzIGFuZCB0aGUgbmV1dHJhbCBjdXJyZW50IChBREU3ODY4 IGFuZCBBREU3ODc4IG9ubHkpLiAgCj4gPiBUaGlzIGlzIGFuIGV2ZW50IHRocmVzaG9sZCBzbyBu ZWVkcyB0byBtYXAgdG8gdGhlIGV2ZW50cyBpbmZyYXN0cnVjdHVyZQo+ID4gYXMgYmVzdCB3ZSBj YW4uICBJdCdzIGFjdHVhbGx5IGEgcGFpbiB0byBkZXNjcmliZSBzbyBtYXkgYmUgZGV2aWNlIHNw ZWNpZmljIEFCSS4gIAo+IERULiBJ4oCZbSBub3Qgc3VyZSB3aHkgdGhpcyB3b3VsZCBiZSBtYXBw ZWQgdG8gdGhlIGV2ZW50cyBpbmZyYXN0cnVjdHVyZT8gVGhlcmUgaXMgbm8gZXZlbnQgZ2VuZXJh dGVkIGJ5IHRoaXMgcmVnaXN0ZXIuCkNvbnRyb2wgcGFyYW1ldGVyIG9mIGFuIGV2ZW50IEkgdGhp bms/ClNvIHRoZSBldmVudCBkZXNjcmlwdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIHRoYXQgb2YgdGhl IGNoYW5uZWxzIGFuZCBoYXMgaXQncwpvd24gZXh0ZW5kZWQgQUJJIHRvIGRlc2NyaWJlIHRoaXMg c29ydCBvZiB2YWx1ZS4KCj4gPiAgIAo+ID4+IDB4NDNCRglJU1VNCXJlZ2lzdGVyX0lTVU0JUgky OAkzMiBaUAlTCU4vQTQJU3VtIG9mIElBV1YsIElCV1YsIGFuZCBJQ1dWIHJlZ2lzdGVycyAoQURF Nzg2OCBhbmQgQURFNzg3OCBvbmx5KS4gIAo+ID4gU28gdGhpcyB3b3VsZCBiZSB1c2luZyBhIG1v ZGlmaWVyIGZvciBBYW5kQmFuZEMgcGhhc2VzIChzaW1pbGFyIHRvIHRoZSBYYW5kWWFuWiBvbmVz IGZvciBtZW1zIGRldmljZXMgYW5kCj4gPiBhIGRlcml2ZWQgdmFsdWUgb2Ygc3VtIEkgdGhpbmsg U28gd291bGQgbG9vayBzb21ldGhpbmcgbGlrZS4KPiA+IGluX2N1cnJlbnQwX3BoYXNlQSZwaGFz ZUImcGhhc2VDX3N1bSBhbmQgeWV0IGFub3RoZXIgY2hhbm5lbAo+ID4gICAKPiA+PiAweDQzQzAJ QUlSTVMJaW5fY3VycmVudDBfcGhhc2VBX3JtcwlSCTI0CTMyIFpQCVMJTi9BNAlQaGFzZSBBIGN1 cnJlbnQgcm1zIHZhbHVlLgo+ID4+IDB4NDNDMQlBVlJNUwlpbl92b2x0YWdlMF9waGFzZUFfcm1z CVIJMjQJMzIgWlAJUwlOL0E0CVBoYXNlIEEgdm9sdGFnZSBybXMgdmFsdWUuCj4gPj4gMHg0M0My CUJJUk1TCWluX2N1cnJlbnQwX3BoYXNlQl9ybXMJUgkyNAkzMiBaUAlTCU4vQTQJUGhhc2UgQiBj dXJyZW50IHJtcyB2YWx1ZS4KPiA+PiAweDQzQzMJQlZSTVMJaW5fdm9sdGFnZTBfcGhhc2VCX3Jt cwlSCTI0CTMyIFpQCVMJTi9BNAlQaGFzZSBCIHZvbHRhZ2Ugcm1zIHZhbHVlLgo+ID4+IDB4NDND NAlDSVJNUwlpbl9jdXJyZW50MF9waGFzZUNfcm1zCVIJMjQJMzIgWlAJUwlOL0E0CVBoYXNlIEMg Y3VycmVudCBybXMgdmFsdWUuCj4gPj4gMHg0M0M1CUNWUk1TCWluX3ZvbHRhZ2UwX3BoYXNlQ19y bXMJUgkyNAkzMiBaUAlTCU4vQTQJUGhhc2UgQyB2b2x0YWdlIHJtcyB2YWx1ZS4KPiA+PiAweDQz QzYJTklSTVMJaW5fY3VycmVudDBfbmV1dHJhbF9ybXMJUgkyNAkzMiBaUAlTCU4vQTQJTmV1dHJh bCBjdXJyZW50IHJtcyB2YWx1ZSAoQURFNzg2OCBhbmQgQURFNzg3OCBvbmx5KS4KPiA+PiAweEUy MjgJUnVuCXJlZ2lzdGVyX1J1bglSL1cJMTYJMTYJVQkweDAwMDAJUnVuIHJlZ2lzdGVyIHN0YXJ0 cyBhbmQgc3RvcHMgdGhlIERTUC4gU2VlIHRoZSBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzb3Igc2Vj dGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgCj4gPiBOb3QgZXhwb3NlZCB0byB1c2Vyc3BhY2UuICAK PiBEVAo+ID4gICAKPiA+PiAweEU0MDAJQVdBVFRIUglpbl9lbmVyZ3kwX3BoYXNlQV9yYXcJUgkz MgkzMglTCTB4MDAwMDAwMDAJUGhhc2UgQSB0b3RhbCBhY3RpdmUgZW5lcmd5IGFjY3VtdWxhdGlv bi4KPiA+PiAweEU0MDEJQldBVFRIUglpbl9lbmVyZ3kwX3BoYXNlQl9yYXcJUgkzMgkzMglTCTB4 MDAwMDAwMDAJUGhhc2UgQiB0b3RhbCBhY3RpdmUgZW5lcmd5IGFjY3VtdWxhdGlvbi4KPiA+PiAw eEU0MDIJQ1dBVFRIUglpbl9lbmVyZ3kwX3BoYXNlQ19yYXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJ UGhhc2UgQyB0b3RhbCBhY3RpdmUgZW5lcmd5IGFjY3VtdWxhdGlvbi4KPiA+PiAweEU0MDMJQUZX QVRUSFIJaW5fZW5lcmd5MF9waGFzZUFfZnVuZGFtZW50YWxfcmF3CVIJMzIJMzIJUwkweDAwMDAw MDAwCVBoYXNlIEEgZnVuZGFtZW50YWwgYWN0aXZlIGVuZXJneSBhY2N1bXVsYXRpb24gKEFERTc4 Nzggb25seSkuCj4gPj4gMHhFNDA0CUJGV0FUVEhSCWluX2VuZXJneTBfcGhhc2VCX2Z1bmRhbWVu dGFsX3JhdwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBCIGZ1bmRhbWVudGFsIGFjdGl2ZSBl bmVyZ3kgYWNjdW11bGF0aW9uIChBREU3ODc4IG9ubHkpLgo+ID4+IDB4RTQwNQlDRldBVFRIUglp bl9lbmVyZ3kwX3BoYXNlQ19mdW5kYW1lbnRhbF9yYXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJUGhh c2UgQyBmdW5kYW1lbnRhbCBhY3RpdmUgZW5lcmd5IGFjY3VtdWxhdGlvbiAoQURFNzg3OCBvbmx5 KS4KPiA+PiAweEU0MDYJQVZBUkhSCWluX2VuZXJneXJlYWN0aXZlMF9waGFzZUFfcmF3CVIJMzIJ MzIJUwkweDAwMDAwMDAwCVBoYXNlIEEgdG90YWwgcmVhY3RpdmUgZW5lcmd5IGFjY3VtdWxhdGlv biAoQURFNzg1OCwgQURFNzg2OCwgYW5kIEFERTc4Nzggb25seSkuCj4gPj4gMHhFNDA3CUJWQVJI Uglpbl9lbmVyZ3lyZWFjdGl2ZTBfcGhhc2VCX3JhdwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFz ZSBCIHRvdGFsIHJlYWN0aXZlIGVuZXJneSBhY2N1bXVsYXRpb24gKEFERTc4NTgsIEFERTc4Njgs IGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+IDB4RTQwOAlDVkFSSFIJaW5fZW5lcmd5cmVhY3RpdmUw X3BoYXNlQ19yYXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJUGhhc2UgQyB0b3RhbCByZWFjdGl2ZSBl bmVyZ3kgYWNjdW11bGF0aW9uIChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCBvbmx5KS4K PiA+PiAweEU0MDkJQUZWQVJIUglpbl9lbmVyZ3lyZWFjdGl2ZTBfcGhhc2VBX2Z1bmRhbWVudGFs X3JhdwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBBIGZ1bmRhbWVudGFsIHJlYWN0aXZlIGVu ZXJneSBhY2N1bXVsYXRpb24gKEFERTc4Nzggb25seSkuCj4gPj4gMHhFNDBBCUJGVkFSSFIJaW5f ZW5lcmd5cmVhY3RpdmUwX3BoYXNlQl9mdW5kYW1lbnRhbF9yYXcJUgkzMgkzMglTCTB4MDAwMDAw MDAJUGhhc2UgQiBmdW5kYW1lbnRhbCByZWFjdGl2ZSBlbmVyZ3kgYWNjdW11bGF0aW9uIChBREU3 ODc4IG9ubHkpLgo+ID4+IDB4RTQwQglDRlZBUkhSCWluX2VuZXJneXJlYWN0aXZlMF9waGFzZUNf ZnVuZGFtZW50YWxfcmF3CVIJMzIJMzIJUwkweDAwMDAwMDAwCVBoYXNlIEMgZnVuZGFtZW50YWwg cmVhY3RpdmUgZW5lcmd5IGFjY3VtdWxhdGlvbiAoQURFNzg3OCBvbmx5KS4KPiA+PiAweEU0MEMJ QVZBSFIJaW5fZW5lcmd5YXBwYXJlbnQwX3BoYXNlQV9yYXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJ UGhhc2UgQSBhcHBhcmVudCBlbmVyZ3kgYWNjdW11bGF0aW9uLgo+ID4+IDB4RTQwRAlCVkFIUglp bl9lbmVyZ3lhcHBhcmVudDBfcGhhc2VCX3JhdwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBC IGFwcGFyZW50IGVuZXJneSBhY2N1bXVsYXRpb24uCj4gPj4gMHhFNDBFCUNWQUhSCWluX2VuZXJn eWFwcGFyZW50MF9waGFzZUNfcmF3CVIJMzIJMzIJUwkweDAwMDAwMDAwCVBoYXNlIEMgYXBwYXJl bnQgZW5lcmd5IGFjY3VtdWxhdGlvbi4KPiA+PiAweEU1MDAJSVBFQUsJaW5fY3VycmVudDBfcGVh awlSCTMyCTMyCVUJTi9BCUN1cnJlbnQgcGVhayByZWdpc3Rlci4gU2VlIEZpZ3VyZSA1MCBhbmQg VGFibGUgMzUgZm9yIGRldGFpbHMgYWJvdXQgaXRzIGNvbXBvc2l0aW9uLiAgCj4gPiBPaCBnb29k eS4gSSBoYXZlIG5vIGlkZWEgaG93IHdlIGV4cG9zZSB0aGUgd2hpY2ggcGhhc2UgZWxlbWVudCBv ZiB0aGlzCj4gPiBjbGVhbmx5LiAgT25lIG9wdGlvbiBJIHN1cHBvc2UgaXMgdG8gaGF2ZSBpbl9j dXJyZW50MF9waGFzZUFfcGVhayBldGMKPiA+IGFuZCBoYXZlIGFsbCBidXQgdGhlIGN1cnJlbnQg cGVhayByZXR1cm4gYW4gZXJyb3Igd2hlbiByZWFkPyBJdCBpcyBhIGJpdAo+ID4gbmFzdHkgYnV0 IG9ubHkgc28gbXVjaCB3ZSBjYW4gZG8gYW5kIGtlZXAgd2l0aCBhIGNvbnNpc3RlbnQgaW50ZXJm YWNlLgo+ID4gICAKPiA+PiAweEU1MDEJVlBFQUsJaW5fdm9sdGFnZV9wZWFrCVIJMzIJMzIJVQlO L0EJVm9sdGFnZSBwZWFrIHJlZ2lzdGVyLiBTZWUgRmlndXJlIDUwIGFuZCBUYWJsZSAzNiBmb3Ig ZGV0YWlscyBhYm91dCBpdHMgY29tcG9zaXRpb24uICAKPiA+IFNhbWUgYXMgcGVhay4KPiA+ICAg Cj4gPj4gMHhFNTAyCVNUQVRVUzAJcmVnaXN0ZXJfU1RBVFVTMAlSL1cJMzIJMzIJVQlOL0EJSW50 ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAwLiBTZWUgVGFibGUgMzcuCj4gPj4gMHhFNTAzCVNUQVRV UzEJcmVnaXN0ZXJfU1RBVFVTMQlSL1cJMzIJMzIJVQlOL0EJSW50ZXJydXB0IFN0YXR1cyBSZWdp c3RlciAxLiBTZWUgVGFibGUgMzguICAKPiA+IE5vIHVzZXJzcGFjZSBpbnRlcmZhY2UgZXhjZXB0 IHZpYSBldmVudHMgaW50ZXJmYWNlIG9yIGVycm9yIHJlcG9ydHMuICAKPiBJc27igJl0IHRoaXMg dGllZCB0byB0aGUgZXZlbnQgZnJhbWV3b3JrPyBNeSB0aGlua2luZyBpcyB0aGUgdXNlciBpbnRl cmZhY2Ugc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIG9jY3VyLgoK UHJvYmFibHkgZGVwZW5kaW5nIG9uIHRoZSBjb25kaXRpb24uICBJZiBpdCBsb29rcyBsaWtlIGEg dGhyZXNob2xkIG9uIHNvbWV0aGluZwppdCBjYW4gZ28gdGhyb3VnaCBhcyBhbiBldmVudC4gIElm IGl0IGlzIGEgJ2ZhdWx0JyBkZXRlY3Rpb24gaW4gdGhlIG1lYXN1cmVtZW50CmhhcmR3YXJlIHdl IG5lZWQgdG8gbG9vayBhdCBhIFJBUyB0eXBlIG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBhbHdheXMg YSB0cmlja3kKdG9waWMgYW5kIHRoZSB1cHNob3QgaXMgd2Ugbm9ybWFsbHkganVzdCBlbmQgdXAg ZHVtcGluZyB0aGVtIGluIHRoZSBrZXJuZWwgbG9nCmFzIGFueXRoaW5nIGVsc2UgaXMgaGFyZCB0 byBkbyAoZnJvbSBhIHBlcnN1YWRpbmcgb3RoZXIgcGVvcGxlIG9mIGl0J3MgaW1wb3J0YW5jZQpw b2ludCBvZiB2aWV3KS4KCgo+ID4gICAKPiA+PiAweEU1MDQJQUlNQVYJaW5fY3VycmVudEFfbWF2 CVIJMjAJMzIgWlAJVQlOL0EJUGhhc2UgQSBjdXJyZW50IG1lYW4gYWJzb2x1dGUgdmFsdWUgY29t cHV0ZWQgZHVyaW5nIFBTTTAgYW5kIFBTTTEgbW9kZXMgKEFERTc4NjggYW5kIEFERTc4Nzggb25s eSkuICAKPiA+IFByb2JhYmx5IGEgbG9uZ2VyIG5hbWUgYXMgbWF2IGlzIGNyeXB0aWMuCj4gPiBp bl9jdXJyZW50MF9waGFzZUFfbWVhbmFic19yYXcgLSBpdCBjb3VsZCBoYXZlIGEgc2NhbGUgYW5k IGFsbCBzb3J0cyBvZiBmdW4uCj4gPiBTbyBJIHRoaW5rIHRoaXMgbmVlZHMgdG8gYmUgdXNpbmcg dGhlIG5ldyBkZXJpdmVkIGluZnJhc3RydWN0dXJlIHByb3Bvc2VkIGhlcmUKPiA+IHJhdGhlciB0 aGFuIGJlaW5nIGFuIGluZm9fbWFzayBlbGVtZW50LiAgCj4gVGhlIHNhbWUgd2F5IGEga25vd2xl ZGdlYWJsZSBwZXJzb24gdW5kZXJzdGFuZHMgd2hhdCBSTVMgbWVhbnMsIHNvIHRoZXkgc2hvdWxk IGFsc28gdW5kZXJzdGFuZCB3aGF0IE1BViBtZWFucy4gCmhlaGUuIEkga25vdyBSTVMgYW5kIG5v dCBNQVYgc28gSSBzdXNwZWN0IGl0IGEgYml0IGRlcGVuZGVudCBvbiB3aGVyZSBleGFjdGx5IHlv dSBjYW1lIGFjcm9zcwp0aGUgdGVybXMgOykKCj4gPiAgIAo+ID4+IDB4RTUwNQlCSU1BVglpbl9j dXJyZW50Ql9tYXYJUgkyMAkzMiBaUAlVCU4vQQlQaGFzZSBCIGN1cnJlbnQgbWVhbiBhYnNvbHV0 ZSB2YWx1ZSBjb21wdXRlZCBkdXJpbmcgUFNNMCBhbmQgUFNNMSBtb2RlcyAoQURFNzg2OCBhbmQg QURFNzg3OCBvbmx5KS4KPiA+PiAweEU1MDYJQ0lNQVYJaW5fY3VycmVudENfbWF2CVIJMjAJMzIg WlAJVQlOL0EJUGhhc2UgQyBjdXJyZW50IG1lYW4gYWJzb2x1dGUgdmFsdWUgY29tcHV0ZWQgZHVy aW5nIFBTTTAgYW5kIFBTTTEgbW9kZXMgKEFERTc4NjggYW5kIEFERTc4Nzggb25seSkuCj4gPj4g MHhFNTA3CU9JTFZMCXJlZ2lzdGVyX09JTFZMCVIvVwkyNAkzMiBaUAlVCTB4RkZGRkZGCU92ZXJj dXJyZW50IHRocmVzaG9sZC4KPiA+PiAweEU1MDgJT1ZMVkwJcmVnaXN0ZXJfT1ZMVkwJUi9XCTI0 CTMyIFpQCVUJMHhGRkZGRkYJT3ZlcnZvbHRhZ2UgdGhyZXNob2xkLiAgCj4gPiBUaGVzZSBwcmVz dW1hYmx5IHJlc3VsdCBpbiBpbnRlcnJ1cHRzPyAoSSdtIHJ1bm5pbmcgb3V0IG9mIHRpbWUgc28g bm90IGNoZWNraW5nKQo+ID4gSW4gd2hpY2ggY2FzZSBzdGFuZGFyZCBldmVudCBpbnRlcmZhY2Ug c2hvdWxkIHdvcmsuCj4gPiAgIAo+ID4+IDB4RTUwOQlTQUdMVkwJcmVnaXN0ZXJfU0FHTFZMCVIv VwkyNAkzMiBaUAlVCTB4MDAwMDAwCVZvbHRhZ2UgU0FHIGxldmVsIHRocmVzaG9sZC4gIAo+ID4g VGhhdCdzIGFub3RoZXIgZXZlbnQgSSB0aGlua+KApiAgIAo+IEFnYWluLCB0aGlzIGlzIG9ubHkg c2V0dGluZyB0aGUgdGhyZXNob2xkLCBub3QgZ2VuZXJhdGluZyBhbnkgZXZlbnQuCgpXaGF0IGRv ZXMgdGhlIHRocmVzaG9sZCByZXN1bHQgaXQ/ICBQcmVzdW1hYmx5IGFuIGV2ZW50IHNvIHRoaXMg aXMgZXhwb3NlZCBhcyBhCmNvbnRyb2wgcGFyYW1ldGVyIG9mIHRoZSBldmVudC4gIFRoZXJlIGlz IGEgd2hvbGUgc2V0IG9mIEFCSSBmb3IgdGhhdC4uLgoKIAo+ID4gICAKPiA+PiAweEU1MEEJTUFT SzAJcmVnaXN0ZXJfTUFTSzAJUi9XCTMyCTMyCVUJMHgwMDAwMDAwMAlJbnRlcnJ1cHQgRW5hYmxl IFJlZ2lzdGVyIDAuIFNlZSBUYWJsZSAzOS4KPiA+PiAweEU1MEIJTUFTSzEJcmVnaXN0ZXJfTUFT SzEJUi9XCTMyCTMyCVUJMHgwMDAwMDAwMAlJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDEuIFNl ZSBUYWJsZSA0MC4gIAo+ID4gICAKPiA+PiAweEU1MEMJSUFXVglpbl9jdXJyZW50QV9pbnN0YW50 YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBBIGN1 cnJlbnQuCj4gPj4gMHhFNTBECUlCV1YJaW5fY3VycmVudEJfaW5zdGFudGFuZW91cwlSCTI0CTMy IFNFCVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiBjdXJyZW50Lgo+ID4+IDB4 RTUwRQlJQ1dWCWluX2N1cnJlbnRDX2luc3RhbnRhbmVvdXMJUgkyNAkzMiBTRQlTCU4vQQlJbnN0 YW50YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEMgY3VycmVudC4KPiA+PiAweEU1MEYJSU5XVglpbl9j dXJyZW50Tl9pbnN0YW50YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5zdGFudGFuZW91cyB2YWx1 ZSBvZiBuZXV0cmFsIGN1cnJlbnQgKEFERTc4NjggYW5kIEFERTc4Nzggb25seSkuCj4gPj4gMHhF NTEwCVZBV1YJaW5fdm9sdGFnZUFfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9BCUluc3Rh bnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQSB2b2x0YWdlLgo+ID4+IDB4RTUxMQlWQldWCWluX3Zv bHRhZ2VCX2luc3RhbnRhbmVvdXMJUgkyNAkzMiBTRQlTCU4vQQlJbnN0YW50YW5lb3VzIHZhbHVl IG9mIFBoYXNlIEIgdm9sdGFnZS4KPiA+PiAweEU1MTIJVkNXVglpbl92b2x0YWdlQ19pbnN0YW50 YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBDIHZv bHRhZ2UuICAKPiA+IE9LLCB0aGlzIGlzIGdldHRpbmcgc2lsbHkuICBJIHByZXN1bWUgdGhpcyBt ZWFucyB0aGUgdmFsdWVzIGFib3ZlIGFyZSBmaWx0ZXJlZCBhbmQgdGhlc2UKPiA+IGFyZW4ndD8g IElmIHNvIHlvdSBuZWVkIHRvIGhhdmUgY2hhbm5lbHMgZm9yIGJvdGggYW5kIGRpZmZlcmVudCBm aWx0ZXIgdmFsdWVzLiAgCj4gVGhlc2UgYXJlIHRoZSBhY3R1YWwgc2FtcGxlcyBmcm9tIHRoZSBB REMgYW5kIG5vdCBhIGNhbGN1bGF0ZWQgbWVhc3VyZW1lbnQgb3ZlciAxMC8xMiBjeWNsZXMuIFRo ZXNlIGFyZSB0aGUgc2FtcGxlcyB0aGF0IGFyZSBwbGFjZWQgaW4gdGhlIGJ1ZmZlci4KT0ssIHNv IERDIHZhbHVlcyB3aGljaCBhbnN3ZXJzIG15IHF1ZXN0aW9uIGFib3ZlLgpTbyB0aGlzIGlzIHRo ZSAnbm9ybWFsJyBtZWFzdXJlbWVudC4gIEZvciB0aGUgbXVsdGkgY3ljbGUgb25lcyB3ZSBuZWVk IHRvCnJlcHJlc2VudCB0aGVtIGFzIGFkZGl0aW9uYWwgbWVhc3VyZW1lbnRzIHVzaW5nIHRoZSBp bmRleCBhbmQgZGVzY3JpYmUgdGhlCmZpbHRlcmluZyBhcHBsaWVkIHRvIHRoZW0gKG9yIHVzZSBh bHR2b2x0YWdlIGV0YyB0byBzYXkgd2UgYXJlIGxvb2tpbmcKYXQgbWVhc3VyZW1lbnRzIHJlbGF0 ZWQgdG8gdGhlIGZhY3QgdGhleSBhcmUgYWx0ZXJuYXRpbmcgcmF0aGVyIHRoYW4gREMuCgo+ID4g ICAKPiA+PiAweEU1MTMJQVdBVFQJaW5fcG93ZXJBX2luc3RhbnRhbmVvdXMJUgkyNAkzMiBTRQlT CU4vQQlJbnN0YW50YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEEgdG90YWwgYWN0aXZlIHBvd2VyLgo+ ID4+IDB4RTUxNAlCV0FUVAlpbl9wb3dlckJfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9B CUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiB0b3RhbCBhY3RpdmUgcG93ZXIuCj4gPj4g MHhFNTE1CUNXQVRUCWluX3Bvd2VyQ19pbnN0YW50YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5z dGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBDIHRvdGFsIGFjdGl2ZSBwb3dlci4KPiA+PiAweEU1 MTYJQVZBUglpbl9wb3dlcnJlYWN0aXZlQV9pbnN0YW50YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJ SW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBBIHRvdGFsIHJlYWN0aXZlIHBvd2VyIChBREU3 ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCBvbmx5KS4KPiA+PiAweEU1MTcJQlZBUglpbl9wb3dl cnJlYWN0aXZlQl9pbnN0YW50YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5zdGFudGFuZW91cyB2 YWx1ZSBvZiBQaGFzZSBCIHRvdGFsIHJlYWN0aXZlIHBvd2VyIChBREU3ODU4LCBBREU3ODY4LCBh bmQgQURFNzg3OCBvbmx5KS4KPiA+PiAweEU1MTgJQ1ZBUglpbl9wb3dlcnJlYWN0aXZlQ19pbnN0 YW50YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBD IHRvdGFsIHJlYWN0aXZlIHBvd2VyIChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCBvbmx5 KS4KPiA+PiAweEU1MTkJQVZBCWluX3Bvd2VyYXBwYXJlbnRBX2luc3RhbnRhbmVvdXMJUgkyNAkz MiBTRQlTCU4vQQlJbnN0YW50YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEEgYXBwYXJlbnQgcG93ZXIu Cj4gPj4gMHhFNTFBCUJWQQlpbl9wb3dlcmFwcGFyZW50Ql9pbnN0YW50YW5lb3VzCVIJMjQJMzIg U0UJUwlOL0EJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBCIGFwcGFyZW50IHBvd2VyLgo+ ID4+IDB4RTUxQglDVkEJaW5fcG93ZXJhcHBhdGVudENfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNF CVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQyBhcHBhcmVudCBwb3dlci4gIAo+ ID4gU2FtZSBmb3IgYWxsIG9mIHRoZXNlLgo+ID4gICAKPiA+PiAweEU1MUYJQ0hFQ0tTVU0JcmVn aXN0ZXJfQ0hFQ0tTVU0JUgkzMgkzMglVCTB4MzM2NjY3ODcJQ2hlY2tzdW0gdmVyaWZpY2F0aW9u LiBTZWUgdGhlIENoZWNrc3VtIFJlZ2lzdGVyIHNlY3Rpb24gZm9yIGRldGFpbHMuICAKPiA+IE5v dCBleHBvc2VkIHRvIHVzZXJzcGFjZS4gIAo+IFllYWgsIHRoaXMgaXMgb25seSB1c2VkIHRvIGNo ZWNrIHRoZSBjb21tdW5pY2F0aW9uIGZvciBlcnJvcnMuCj4gPiAgIAo+ID4+IDB4RTUyMAlWTk9N CWluX3ZvbHRhZ2Vfcm1zX25vbWluYWwJUi9XCTI0CTMyIFpQCVMJMHgwMDAwMDAJTm9taW5hbCBw aGFzZSB2b2x0YWdlIHJtcyB1c2VkIGluIHRoZSBhbHRlcm5hdGl2ZSBjb21wdXRhdGlvbiBvZiB0 aGUgYXBwYXJlbnQgcG93ZXIuIFdoZW4gdGhlIFZOT014RU4gYml0IGlzIHNldCwgdGhlIGFwcGxp ZWQgdm9sdGFnZSBpbnB1dCBpbiB0aGUgY29ycmVzcG9uZGluZyBwaGFzZSBpcyBpZ25vcmVkIGFu ZCBhbGwgY29ycmVzcG9uZGluZyBybXMgdm9sdGFnZSBpbnN0YW5jZXMgYXJlIHJlcGxhY2VkIGJ5 IHRoZSB2YWx1ZSBpbiB0aGUgVk5PTSByZWdpc3Rlci4gIAo+ID4gV2h5IHdvdWxkIHRoaXMgYmUg ZG9uZT8gIFNvdW5kcyBsaWtlIHNvbWV0aGluZyB0aGF0IGlzIGEgY2lyY3VpdCBkZXNpZ24gdGlt ZQo+ID4gZGVjaXNpb24gc28gYSBqb2IgZm9yIERUIHRvIG1lLiAgCj4gWWVhaCwgSSBhZ3JlZS4K PiA+ICAgCj4gPj4gMHhFNjAwCVBIU1RBVFVTCWluX2N1cnJlbnRfcGhhc2VfcGVhawlSCTE2CTE2 CVUJTi9BCVBoYXNlIHBlYWsgcmVnaXN0ZXIuIFNlZSBUYWJsZSA0MS4KPiA+PiAweEU2MDEJQU5H TEUwCXJlZ2lzdGVyX0FOR0xFMAlSCTE2CTE2CVUJTi9BCVRpbWUgRGVsYXkgMC4gU2VlIHRoZSBU aW1lIEludGVydmFsIEJldHdlZW4gUGhhc2VzIHNlY3Rpb24gZm9yIGRldGFpbHMuCj4gPj4gMHhF NjAyCUFOR0xFMQlyZWdpc3Rlcl9BTkdMRTEJUgkxNgkxNglVCU4vQQlUaW1lIERlbGF5IDEuIFNl ZSB0aGUgVGltZSBJbnRlcnZhbCBCZXR3ZWVuIFBoYXNlcyBzZWN0aW9uIGZvciBkZXRhaWxzLgo+ ID4+IDB4RTYwMwlBTkdMRTIJcmVnaXN0ZXJfQU5HTEUyCVIJMTYJMTYJVQlOL0EJVGltZSBEZWxh eSAyLiBTZWUgdGhlIFRpbWUgSW50ZXJ2YWwgQmV0d2VlbiBQaGFzZXMgc2VjdGlvbiBmb3IgZGV0 YWlscy4gIAo+ID4gSG1tLiBNb3JlIGZ1bi4gIFRoZXNlIGFyZSBkZXJpdmVkIHZhbHVlcyBiZXR3 ZWVuIHRvIHBoYXNlIG1lYXN1cmVtZW50cy4gCj4gPiBUaGUgcGhhc2UgYXMgYSBtb2RpZmllciBm YWxscyBkb3duIGEgYml0IGhlcmUgLSBpZiB3ZSBoYWQganVzdCB0cmVhdGVkCj4gPiB0aGVtIGFz IGNoYW5uZWxzIHdlIGNvdWxkIGhhdmUgZG9uZSB0aGlzIGEgZGlmZmVyZW50aWFsIGFuZ2xlIGNo YW5uZWwuCj4gPiBSaWdodCBub3cgSSdtIG5vdCBzdXJlIGhvdyB3ZSBkbyB0aGlzLCBjb3VsZCBk byBpdCBhcyBhIGRlcml2ZWQgdmFsdWVzIHNvIHNvbWV0aGluZyBsaWtlCj4gPiBpbl9hbmdsZTBf cGhhc2VBJnBoYXNlQl9kaWZmX3JhdyBldGMgYnV0IHRoYXQgZmVlbHMgb2RkLgo+ID4gVGhpcyBv bmUgbmVlZHMgbW9yZSB0aG91Z2h0Lgo+ID4gICAKPiA+PiAweEU2MDQgdG8gMHhFNjA2CVJlc2Vy dmVkCQkJCQkJCVRoZXNlIGFkZHJlc3NlcyBzaG91bGQgbm90IGJlIHdyaXR0ZW4gZm9yIHByb3Bl ciBvcGVyYXRpb24uCj4gPj4gMHhFNjA3CVBFUklPRAlyZWdpc3Rlcl9QRVJJT0QJUgkxNgkxNglV CU4vQQlOZXR3b3JrIGxpbmUgcGVyaW9kLiAgCj4gPiBTdXBlcmZpY2lhbGx5IHRoaXMgc291bmRz IGxpa2UgYSBjaGFubmVsIGZyZWUgZWxlbWVudCBzbyBzaGFyZWRfYnlfYWxsLgo+ID4gICAKPiA+ PiAweEU2MDgJUEhOT0xPQUQJcmVnaXN0ZXJfUEhOT0xPQUQJUgkxNgkxNglVCU4vQQlQaGFzZSBu byBsb2FkIHJlZ2lzdGVyLiBTZWUgVGFibGUgNDIuICAKPiA+IEhtbS4gU28gdGhpcyBpcyBraW5k IG9mIGEgc2V0IG9mIGV2ZW50cyB3aXRoIGJ1dCB3aXRob3V0IEkgdGhpbmsgYW4gaW50ZXJydXB0 Lgo+ID4gT2RkLgo+ID4gICAKPiA+PiAweEU2MEMJTElORUNZQwlyZWdpc3Rlcl9MSU5FQ1lDCVIv VwkxNgkxNglVCTB4RkZGRglMaW5lIGN5Y2xlIGFjY3VtdWxhdGlvbiBtb2RlIGNvdW50LiAgCj4g PiBpbl9jb3VudDBfcmF3IHByb2JhYmx5IHRob3VnaCBpdCdzIGEgYml0IG9mIGEgc3RyZXRjaC4K PiA+ICAgCj4gPj4gMHhFNjBECVpYVE9VVAlyZWdpc3Rlcl9aWFRPVVQJUi9XCTE2CTE2CVUJMHhG RkZGCVplcm8tY3Jvc3NpbmcgdGltZW91dCBjb3VudC4gIAo+ID4gVGhpcyBpcyBnb2luZyB0byBi ZSBhbm90aGVyIHRvcCBsZXZlbCBvbmUgSSB0aGluayBhbmQgZGV2aWNlIHNwZWNpZmljIGZvciBu b3cuCj4gPiAgIAo+ID4+IDB4RTYwRQlDT01QTU9ERQlyZWdpc3Rlcl9DT01QTU9ERQlSL1cJMTYJ MTYJVQkweDAxRkYJQ29tcHV0YXRpb24tbW9kZSByZWdpc3Rlci4gU2VlIFRhYmxlIDQzLiAgCj4g PiBJZiB0aGVyZSBpcyBzdHVmZiB0byBjb250cm9sIGluIGhlcmUgaXQgbmVlZCBicmVha2luZyBv dXQuCj4gPiAgIAo+ID4+IDB4RTYwRglHYWluCXJlZ2lzdGVyX0dhaW4JUi9XCTE2CTE2CVUJMHgw MDAwCVBHQSBnYWlucyBhdCBBREMgaW5wdXRzLiBTZWUgVGFibGUgNDQuICAKPiA+IE9oIGdvb2R5 IGFub3RoZXIgc2NhbGUgdmFsdWUuIE5lZWRzIGJyZWFraW5nIHVwIGludG8gc2VwYXJhdGUgY29u dHJvbHMuCj4gPiBEbyB0aGVzZSBkaXJlY3RseSBlZmZlY3QgdGhlIG1lYXN1cmVkIG91dHB1dCB2 b2x0YWdlIGV0Yz8gSWYgdGhleSBkbyB0aGVuCj4gPiBJJ20gbm90IHN1cmUgaG93IHRvIHNlcGFy YXRlIHRoZSB0d28gZ2FpbnMsIHRoZXJlIG91Z2h0IHRvIGJlIGEgJ3JpZ2h0Jwo+ID4gYW5zd2Vy LiAgSWYgdGhpcyBpcyBhYm91dCBtYXRjaGluZyB0byB0aGUgY2lyY3VpdCBwcmVzZW50IHRoZW4g dGhleQo+ID4gc2hvdWxkIHByb2JhYmx5IGJlIGNvbWluZyBmcm9tIERUIG9yIHNpbWlsbGFyLgo+ ID4gCj4gPiAgIAo+ID4+IDB4RTYxMAlDRk1PREUJcmVnaXN0ZXJfQ0ZNT0RFCVIvVwkxNgkxNglV CTB4MEU4OAlDRnggY29uZmlndXJhdGlvbiByZWdpc3Rlci4gU2VlIFRhYmxlIDQ1Lgo+ID4+IDB4 RTYxMQlDRjFERU4JcmVnaXN0ZXJfQ0YxREVOCVIvVwkxNgkxNglVCTB4MDAwMAlDRjEgZGVub21p bmF0b3IuCj4gPj4gMHhFNjEyCUNGMkRFTglyZWdpc3Rlcl9DRjJERU4JUi9XCTE2CTE2CVUJMHgw MDAwCUNGMiBkZW5vbWluYXRvci4KPiA+PiAweEU2MTMJQ0YzREVOCXJlZ2lzdGVyX0NGM0RFTglS L1cJMTYJMTYJVQkweDAwMDAJQ0YzIGRlbm9taW5hdG9yLiAgCj4gPiBBcmUgdGhlc2UgdGhpbmdz IHRoYXQgc2hvdWxkIGJlIGluIERUPyAgTG9vayB2ZXJ5IHF1aWNrbHkgbGlrZSB0aGV5IGFyZSB0 b2RvIHdpdGggb3RoZXIgY2lyY3VpdHMgbmVhcmJ5LiAgCj4gQWdyZWVkCj4gPiAgIAo+ID4+IDB4 RTYxNAlBUEhDQUwJcmVnaXN0ZXJfQVBIQ0FMCVIvVwkxMAkxNiBaUAlTCTB4MDAwMAlQaGFzZSBj YWxpYnJhdGlvbiBvZiBQaGFzZSBBLiBTZWUgVGFibGUgNDYuCj4gPj4gMHhFNjE1CUJQSENBTAly ZWdpc3Rlcl9CUEhDQUwJUi9XCTEwCTE2IFpQCVMJMHgwMDAwCVBoYXNlIGNhbGlicmF0aW9uIG9m IFBoYXNlIEIuIFNlZSBUYWJsZSA0Ni4KPiA+PiAweEU2MTYJQ1BIQ0FMCXJlZ2lzdGVyX19DUEhD QUwJUi9XCTEwCTE2IFpQCVMJMHgwMDAwCVBoYXNlIGNhbGlicmF0aW9uIG9mIFBoYXNlIEMuIFNl ZSBUYWJsZSA0Ni4gIAo+ID4gSSdtIG5vdCBhY3R1YWxseSBzdXJlIGhvdyB5b3Ugd291bGQgc2V0 IHRoZXNlLiAgUGVyIGNpcmN1aXQgZGVzaWduPyAgCj4gVGhlcmUgc2hvdWxkIGJlIHNvbWUgYmFz ZSBjYWxpYnJhdGlvbiBzdG9yZWQgaW4gRFQgYW5kIGZpbmUgdHVuZWQgY2FsaWJyYXRpb24gc3Rv cmVkIGluIGFuIElOSSBmaWxlIG9yIGN1c3RvbSBlZXByb20gb2YgbnZyYW0uIApIbW0uIFRoZW4g d2UgbmVlZCB0byBleHBvc2UgdGhlbSB0byB1c2Vyc3BhY2UgdG8gYWxsb3cgdGhhdCBJTkkgdG8g YmUgYXBwbGllZC4KCkxldHMgZGVhbCB3aXRoIHRoZSByZXN0IGZpcnN0IGFuZCBjb21lIGJhY2sg dG8gdGhlc2UuIE1heSB3ZWxsIG5lZWQKc29tZSBkZXZpY2Ugc3BlY2lmaWMgQUJJIHdoaWNoIGlz IGFsd2F5cyBhbm5veWluZy4uCgo+ID4gICAKPiA+PiAweEU2MTcJUEhTSUdOCXJlZ2lzdGVyX1BI U0lHTglSCTE2CTE2CVUJTi9BCVBvd2VyIHNpZ24gcmVnaXN0ZXIuIFNlZSBUYWJsZSA0Ny4KPiA+ PiAweEU2MTgJQ09ORklHCXJlZ2lzdGVyX0NPTkZJRwlSL1cJMTYJMTYJVQkweDAwMDAJQURFNzg3 OCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiBTZWUgVGFibGUgNDguCj4gPj4gMHhFNzAwCU1NT0RF CXJlZ2lzdGVyX19NTU9ERQlSL1cJOAk4CVUJMHgxQwlNZWFzdXJlbWVudCBtb2RlIHJlZ2lzdGVy LiBTZWUgVGFibGUgNDkuCj4gPj4gMHhFNzAxCUFDQ01PREUJcmVnaXN0ZXJfX0FDQ01PREUJUi9X CTgJOAlVCTB4MDAJQWNjdW11bGF0aW9uIG1vZGUgcmVnaXN0ZXIuIFNlZSBUYWJsZSA1MC4KPiA+ PiAweEU3MDIJTENZQ01PREUJcmVnaXN0ZXJfTENZQ01PREUJUi9XCTgJOAlVCTB4NzgJTGluZSBh Y2N1bXVsYXRpb24gbW9kZSBiZWhhdmlvci4gU2VlIFRhYmxlIDUyLiAgCj4gQWxsIHRvIERUCj4g Pj4gMHhFNzAzCVBFQUtDWUMJcmVnaXN0ZXJfUEVBS0NZQwlSL1cJOAk4CVUJMHgwMAlQZWFrIGRl dGVjdGlvbiBoYWxmIGxpbmUgY3ljbGVzLgo+ID4+IDB4RTcwNAlTQUdDWUMJcmVnaXN0ZXJfU0FH Q1lDCVIvVwk4CTgJVQkweDAwCVNBRyBkZXRlY3Rpb24gaGFsZiBsaW5lIGN5Y2xlcy4gIAo+ID4g U29tZSBvZiB0aGVzZSBhcmUgZXZlbnQgY29udHJvbHMuIE1hcCB0aGVtIGFzIHN1Y2guICAKPiBB Z3JlZWQKPiA+ICAgCj4gPj4gMHhFNzA1CUNGQ1lDCXJlZ2lzdGVyX0NGQ1lDCVIvVwk4CTgJVQkw eDAxCU51bWJlciBvZiBDRiBwdWxzZXMgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgZW5lcmd5IGxh dGNoZXMuIFNlZSB0aGUgU3luY2hyb25pemluZyBFbmVyZ3kgUmVnaXN0ZXJzIHdpdGggQ0Z4IE91 dHB1dHMgc2VjdGlvbi4KPiA+PiAweEU3MDYJSFNEQ19DRkcJcmVnaXN0ZXJfSFNEQ19DRkcJUi9X CTgJOAlVCTB4MDAJSFNEQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiBTZWUgVGFibGUgNTMuICAK PiBEVAo+ID4+IDB4RTcwNwlWZXJzaW9uCXJlZ2lzdGVyX1ZlcnNpb24JUgk4CTgJVQkJVmVyc2lv biBvZiBkaWUuICAKPiBNaWdodCB3YW50IHRvIGV4cG9zZSB0aGlzIHRvIFVzZXIgU3BhY2UgYXMg dGhlcmUgY291bGQgYmUgZGlmZmVyZW5jZXMgYmV0d2VlbiBkaWUgdmVyc2lvbgo+IGluX3ZlcnNp b24wX3Jhdwo+ID4+IDB4RUJGRglSZXNlcnZlZAkJCTgJOAkJCVRoaXMgYWRkcmVzcyBjYW4gYmUg dXNlZCBpbiBtYW5pcHVsYXRpbmcgdGhlIFNTL0hTQSBwaW4gd2hlbiBTUEkgaXMgY2hvc2VuIGFz IHRoZSBhY3RpdmUgcG9ydC4gU2VlIHRoZSBTZXJpYWwgSW50ZXJmYWNlcyBzZWN0aW9uIGZvciBk ZXRhaWxzLgo+ID4+IDB4RUMwMAlMUE9JTFZMCXJlZ2lzdGVyX0xQT0lMVkwJUi9XCTgJOAlVCTB4 MDcJIk92ZXJjdXJyZW50IHRocmVzaG9sZCB1c2VkIGR1cmluZyBQU00yIG1vZGUgKEFERTc4Njgg YW5kIEFERTc4NzgKPiA+PiBvbmx5KS4gU2VlIFRhYmxlIDU0IGluIHdoaWNoIHRoZSByZWdpc3Rl ciBpcyBkZXRhaWxlZC4iCj4gPj4gMHhFQzAxCUNPTkZJRzIJcmVnaXN0ZXJfQ09ORklHMglSL1cJ OAk4CVUJMHgwMAlDb25maWd1cmF0aW9uIHJlZ2lzdGVyIHVzZWQgZHVyaW5nIFBTTTEgbW9kZS4g U2VlIFRhYmxlIDU1LiAgCj4gQWxsIHRvIERUCj4gPiAKPiA+IEFzIHlvdSBjYW4gZ3Vlc3MgSSB3 YXMgcnVubmluZyBvdXQgb2Ygc3RhbWluYSB0b3dhcmRzIHRoZSBlbmQgb2YgdGhhdC4KPiA+IAo+ ID4gSSdtIG5vdCB0b3RhbGx5IHN1cmUgb2YgdGhlIGFuc3dlciBJIHByb3ZpZGVkLiBJdCBtYXkg dGFrZSBzb21lIG1vcmUgdGhvdWdodC4KPiA+IElkZWFsbHkgc29tZSBvdGhlcnMgd2lsbCBnaXZl IGlucHV0IG9uIHRoaXMgcXVlc3Rpb24uICAKPiAKPiBUaGFuayB5b3UgYWdhaW4gZm9yIGFsbCB5 b3VyIGZlZWRiYWNrLiBJ4oCZbGwgZ2VuZXJhdGUgYSBuZXcgbGlzdCBhbmQgc2VuZCBpdCBuZXh0 LgpDb29sLgoKSm9uYXRoYW4KCj4gCj4gUmVnYXJkcywKPiBKb2huCj4gPiAKPiA+IEpvbmF0aGFu ICAKPiA+PiAKPiA+PiBSZWdhcmRzLAo+ID4+IEpvaG4KPiA+PiAKPiA+PiAKPiA+PiAKPiA+PiAK PiA+PiAgIAo+ID4+PiBPbiBNYXIgMTcsIDIwMTgsIGF0IDE6MzAgUE0sIEpvbmF0aGFuIENhbWVy b24gPGppYzIzQGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4+PiAKPiA+Pj4gT24gV2VkLCAxNCBNYXIg MjAxOCAyMzoxMjowMiAtMDcwMAo+ID4+PiBKb2huIFN5bmUgPGpvaG4zOTA5QGdtYWlsLmNvbT4g d3JvdGU6Cj4gPj4+ICAgCj4gPj4+PiBIaSBKb25hdGhhbiwKPiA+Pj4+IAo+ID4+Pj4gSSBoYXZl IGJlZW4gbG9va2luZyBhdCB0aGUgSUlPIEFCSSBkb2NzIGFuZCBpZiBJIHVuZGVyc3RhbmQKPiA+ Pj4+IGNvcnJlY3RseSwgdGhlIGlkZWEgaXMgdG8gdXNlIGNvbnNpc3RlbnQgbmFtaW5nIGNvbnZl bnRpb25zPyBTbyBmb3IKPiA+Pj4+IGV4YW1wbGUsIGxvb2tpbmcgYXQgdGhlIEFERTc4NTQgZGF0 YXNoZWV0LCB0aGUgbmFtaW5nIG1hdGNoaW5nIHRoZQo+ID4+Pj4gQURFNzg1NCByZWdpc3RlcnMg d291bGQgYmUgYXMgZm9sbG93czogICAgCj4gPj4+IAo+ID4+PiBXZWxjb21lIHRvIG9uZSBvZiB0 aGUgYmlnIHJlYXNvbnMgbm8gb25lIHRpZGllZCB0aGVzZSBkcml2ZXJzCj4gPj4+IHVwIG9yaWdp bmFsbHkuICBTdGlsbCB3ZSBoYXZlIG1vdmVkIG9uIHNvbWV3aGF0IHNpbmNlIHRoZW4KPiA+Pj4g c28gc2ltaWxhciBjaXJjdW1zdGFuY2VzIGhhdmUgY29tZSB1cCBpbiBvdGhlciB0eXBlcyBvZiBz ZW5zb3IuCj4gPj4+ICAgCj4gPj4+PiAKPiA+Pj4+IHtkaXJlY3Rpb259X3t0eXBlfV97aW5kZXh9 X3ttb2RpZmllcn1fe2luZm9fbWFza30KPiA+Pj4+IAo+ID4+Pj4gQUlHQUlOCS0JSW5fY3VycmVu dF9hX2dhaW4gICAgCj4gPj4+IE90aGVyIHRoYW4gdGhlIGZhY3QgdGhhdCBnYWluIGlzbid0IGFu IEFCSSBlbGVtZW50IGFuZCB0aGF0IGluZGV4Cj4gPj4+IGRvZXNuJ3QgaGF2ZQo+ID4+PiBfIGJl Zm9yZSBpdCB0aGF0IGlzIHJpZ2h0Lgo+ID4+PiBpbl92b2x0YWdlQV9zY2FsZQo+ID4+PiAKPiA+ Pj4gVGhhdCB3YXMgYSB3ZWlyZCBxdWlyayBhIGxvbmcgdGltZSBiYWNrIHdoaWNoIHdlIHNob3Vs ZCBwcm9iYWJseQo+ID4+PiBub3QgaGF2ZSBkb25lIChjb3BpZWQgaXQgZnJvbSBod21vbikKPiA+ Pj4gICAKPiA+Pj4+IEFWR0FJTgktCWluX3ZvbHRhZ2VfYV9nYWluCj4gPj4+PiBCSUdBSU4JLQlp bl9jdXJyZW50X2JfZ2Fpbgo+ID4+Pj4gQlZHQUlOCS0JaW5fdm9sdGFnZV9iX2dhaW4KPiA+Pj4+ IOKAlAo+ID4+Pj4gSG93IGRvIHdlIHJlcHJlc2VudCB0aGUgcm1zIGFuZCBvZmZzZXQKPiA+Pj4+ IEFJUk1TT1MJLQlpbl9jdXJyZW50X2Ffcm1zb2Zmc2V0Cj4gPj4+PiBBVlJNU09TCS0JaW5fdm9s dGFnZV9hX3Jtc29mZnNldCAgICAKPiA+Pj4gCj4gPj4+IFJpZ2h0IG5vdyB3ZSBjYW4ndCB1bmZv cnR1bmF0ZWx5IHRob3VnaCB0aGlzIG9uZSBpcyBlYXNpZXIgdG8gZml4Lgo+ID4+PiBXZSBhbHJl YWR5IGhhdmUgbW9kaWZpZXJzIGZvciBtdWx0aSBheGlzIGRldmljZXMgZG9pbmcgc3VtX3NxdWFy ZWQKPiA+Pj4gc28gYWRkIG9uZSBvZiB0aG9zZSBmb3Igcm9vdF9tZWFuX3NxdWFyZSAtIHRoaXMg b25lIGlzIHdlbGwga25vd24KPiA+Pj4gZW5vdWdoIHRoYXQgcm1zIGlzIGZpbmUgaW4gdGhlIHN0 cmluZy4KPiA+Pj4gCj4gPj4+IEl0J3MgYSBlZmZlY3RpdmVseSBhIGRpZmZlcmVudCBjaGFubmVs IGJlIGl0IG9uZSBkZXJpdmVkIGZyb20gYSBzaW1wbGUKPiA+Pj4gb25lLiAgVGhpcyBpcyBnb2lu ZyB0byBnZXQgdHJpY2t5IGhvd2V2ZXIgYXMgd2Ugd291bGQgbm9ybWFsbHkgdXNlCj4gPj4+IG1v ZGlmaWVyIHRvIHNwZWNpYWxpc2UgYSBjaGFubmVsIHR5cGUgLSB0aG91Z2h0cyBvbiB0aGlzIGJl bG93Lgo+ID4+PiAgIAo+ID4+Pj4g4oCUCj4gPj4+PiBIZXJlIEkgZG9u4oCZdCB1bmRlcnN0YW5k IGhvdyB0byByZXByZXNlbnQgYm90aCB0aGUgcGhhc2UgYW5kIHRoZSBhY3RpdmUvcmVhY3RpdmUv YXBwYXJlbnQgcG93ZXIgY29tcG9uZW50cy4gRG8gd2UgY29tYmluZSB0aGUgcGhhc2UgYW5kIHF1 YWRyYXR1cmUgcGFydCBsaWtlIHRoaXMKPiA+Pj4+IEFWQUdBSU4JCS0JaW5fcG93ZXJfYV9nYWlu CQkJCS8qIGFwcGFyZW50IHBvd2VyICovCj4gPj4+PiDigJQKPiA+Pj4+IEFXR0FJTgkJLQlpbl9w b3dlcl9haV9nYWluCQkJCS8qIGFjdGl2ZSBwb3dlciAqLyAgICAKPiA+Pj4gQW5kIHRoYXQgaXMg dGhlIHByb2JsZW0uICBIb3cgZG8gd2UgcmVwcmVzZW50IHRoZSB2YXJpb3VzIHBvd2VyIHR5cGVz Lgo+ID4+PiBIbW0uIFdlIGNvdWxkIGRvIGl0IHdpdGggbW9kaWZpZXJzIGJ1dCBhYm92ZSB3ZSBz aG93IHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHVzZWQgdGhlbS4KPiA+Pj4gCj4gPj4+IEl0IHdvdWxk IGJlIGVhc3kgZW5vdWdoIHRvIGFkZCB5ZXQgYW5vdGhlciBmaWVsZCB0byB0aGUgY2hhbm5lbCBz cGVjIHRvIHNwZWNpZnkKPiA+Pj4gdGhpcyBidXQgdGhlcmUgaXMgYSBwcm9ibGVtIC0gRXZlbnRz LiAgVGhlIGV2ZW50IGZvcm1hdCBpcyBhbHJlYWR5IHByZXR0eSBmdWxsCj4gPj4+IHNvIHdoZXJl IGRvIHdlIHB1dCB0aGlzIGV4dHJhIGVsZW1lbnQgaWYgd2UgbmVlZCB0byBkZWZpbmUgYSBjaGFu bmVsIHNlcGFyYXRlZAo+ID4+PiBvbmx5IGJ5IGl0Lgo+ID4+PiAKPiA+Pj4gT25lIHRob3VnaHQg aXMgd2UgY291bGQgaW5zdGVhZCBkZWZpbmUgdGhlc2UgYXMgZGlmZmVyZW50IHRvcCBsZXZlbAo+ ID4+PiBJSU9fQ0hBTl9UWVBFUyBpbiBhIHNpbWlsYXIgZmFzaGlvbiB0byB3ZSBkbyBmb3IgcmVs YXRpdmUgaHVtaWRpdHkgdnMKPiA+Pj4gdGhlIHByb3Bvc2VkIGFic29sdXRlIGh1bWlkaXR5Lgo+ ID4+PiAKPiA+Pj4gaW5fcG93ZXJyZWFjdGl2ZUFfc2NhbGUKPiA+Pj4gaW5fcG93ZXJhY3RpdmNl QV9zY2FsZQo+ID4+PiAob3IgaW5fcG93ZXJyZWFsQV9zY2FsZSB0byBtYXRjaCB3aXRoIHdoYXQg SSBnb3QgdGF1Z2h0IHllYXJzIGFnbz8pCj4gPj4+IAo+ID4+PiBJIHByZXN1bWUgd2Uga2VlcCBp bl9wb3dlckFfc2NhbGUgZXRjIGZvciB0aGUgYXBwYXJlbnQgcG93ZXIgYW5kCj4gPj4+IG1vZGlm eSBhbnkgZG9jcyB0byBtYWtlIHRoYXQgY2xlYXIuCj4gPj4+ICAgCj4gPj4+PiDigJQKPiA+Pj4+ IEFWQVJHQUlOCS0JaW5fcG93ZXJfYXFfZ2FpbgkJCQkvKiByZWFjdGl2ZSBwb3dlciAqLwo+ID4+ Pj4g4oCUCj4gPj4+PiBOb3cgaGVyZSBpdCBiZWNvbWVzIG1vcmUgY29tcGxpY2F0ZWQuIE5vdCBz dXJlIGhvdyB0aGlzIGdldHMgaGFuZGxlZC4gCj4gPj4+PiBBRldBVFRPUwktCWluX3Bvd2VyX2Ff YWN0aXZlL2Z1bmRhbWVudGFsL29mZnNldCAgICAKPiA+Pj4gWWVhaCwgc29tZSBvZiB0aGVzZSBh cmUgZ2V0dGluZyBvZGQuCj4gPj4+IElmIEkgcmVhZCB0aGlzIGNvcnJlY3RseSB0aGlzIGlzIHRo ZSBhY3RpdmUgcG93ZXIgZXN0aW1hdGUgYmFzZWQgb24gb25seQo+ID4+PiB0aGUgZnVuZGFtZW50 YWwgZnJlcXVlbmN5IC0gc28gbm8gaGFybW9uaWNzPwo+ID4+PiAKPiA+Pj4gSG1tLiAgVGhpcyB0 aGVuIGJlY29tZXMgYSBzZXBhcmF0ZSBjaGFubmVsIHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVz Cj4gPj4+IHNwZWNpZnlpbmcgaXQgaXMgb25seSB0aGUgZnVuZGFtZW50YWwuICBUaGlzIGZlZWxz IGEgYml0IGxpa2UgYSBmaWx0ZXIKPiA+Pj4gYmUgaXQgYW4gdW51c3VhbCBvbmU/ICBNaWdodCBq dXN0IGJlIG5lY2Vzc2FyeSB0byBhZGQgYSBfZnVuZGFtZW50YWxfb25seQo+ID4+PiBlbGVtZW50 IG9uIHRoZSBlbmQgKHdvdWxkIGJlIGluZm9fbWFzayBpZiB0aGlzIGlzIGNvbW1vbiBlbm91Z2gg dG8KPiA+Pj4ganVzdGlmeSB0aGF0IHJhdGhlciB0aGFuIHVzaW5nIHRoZSBleHRlbmRlZCBtZXRo b2RzIHRvIGRlZmluZSBpdC4pLgo+ID4+PiAKPiA+Pj4gICAKPiA+Pj4+IOKAlAo+ID4+Pj4gQVdB VFRIUgktCWluX2VuZXJneV9haV9hY2N1bXVsYXRpb24gICAgCj4gPj4+IEdyZWF0LCBqdXN0IHdo ZW4gSSB0aG91Z2h0IHdlIGhhZCBnb25lIGZhciBlbm91Z2ggdGhleSBkZWZpbmUgcmVhY3RpdmUK PiA+Pj4gZW5lcmd5IHdoaWNoIGlzIHByZXN1bWFibHkgcm91Z2hseSB0aGUgc2FtZSBhcyByZWFj dGl2ZXBvd2VyICogdGltZT8KPiA+Pj4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdHlwZXMgZm9yIHRo YXQgYXMgd2VsbC4KPiA+Pj4gaW5fZW5lcmd5cmVhY3RpdmVBXyoKPiA+Pj4gaW5fZW5lcmd5YWN0 aXZlQV8qCj4gPj4+ICAgCj4gPj4+PiDigJQKPiA+Pj4+IEFWQVJIUgkJLQlpbl9lbmVyZ3lfYXFf YWNjdW11bGF0aW9uCj4gPj4+PiDigJQKPiA+Pj4+IElQRUFLCQktCWluX2N1cnJlbnRfcGVhayAg ICAKPiA+Pj4gVGhhdCBvbmUgaXMgZWFzeSBhcyB3ZSBoYXZlIGFuIGluZm9fbWFzayBlbGVtZW50 IGZvciBwZWFrIGFuZCBvbmUKPiA+Pj4gZm9yIHBlYWtfc2NhbGUgdGhhdCBoYXMgYWx3YXlzIGJl ZW4gYSBiaXQgb2RkIGJ1dCB3YXMgbmVlZGVkIHNvbWV3aGVyZS4KPiA+Pj4gICAKPiA+Pj4+IOKA lAo+ID4+Pj4gCj4gPj4+PiBJ4oCZbGwgbGVhdmUgaXQgdGhlcmUsIGJlY2F1c2UgdGhlcmUgYXJl IHNvbWUgZXZlbiBtb3JlIGNvbXBsaWNhdGVkIHJlZ2lzdGVyIG5hbWluZyBpc3N1ZXMuICAgIAo+ ID4+PiBTb21ldGhpbmcgdG8gbG9vayBmb3J3YXJkIHRvLiAgR2FoLCBJIGFsd2F5cyBoYXRlZCBw b3dlciBlbmdpbmVlcmluZwo+ID4+PiB0aG91Z2ggSSB0YXVnaHQgaXQgdmVyeSBicmllZmx5IChJ IHJlYWxseSBwaXR5IHRob3NlIHN0dWRlbnRzIDooCj4gPj4+IAo+ID4+PiBKb25hdGhhbgo+ID4+ PiAgIAo+ID4+Pj4gCj4gPj4+PiBSZWdhcmRzLAo+ID4+Pj4gSm9obgo+ID4+Pj4gCj4gPj4+PiAK PiA+Pj4+IAo+ID4+Pj4gCj4gPj4+PiAgIAo+ID4+Pj4+IE9uIE1hciAxMCwgMjAxOCwgYXQgNzox MCBBTSwgSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPj4+Pj4g Cj4gPj4+Pj4gT24gVGh1LCA4IE1hciAyMDE4IDIxOjM3OjMzIC0wMzAwCj4gPj4+Pj4gUm9kcmln byBTaXF1ZWlyYSA8cm9kcmlnb3NpcXVlaXJhbWVsb0BnbWFpbC5jb20+IHdyb3RlOgo+ID4+Pj4+ ICAgCj4gPj4+Pj4+IE9uIDAzLzA3LCBKb25hdGhhbiBDYW1lcm9uIHdyb3RlOiAgICAgIAo+ID4+ Pj4+Pj4gT24gVHVlLCA2IE1hciAyMDE4IDIxOjQzOjQ3IC0wMzAwCj4gPj4+Pj4+PiBSb2RyaWdv IFNpcXVlaXJhIDxyb2RyaWdvc2lxdWVpcmFtZWxvQGdtYWlsLmNvbT4gd3JvdGU6Cj4gPj4+Pj4+ PiAgIAo+ID4+Pj4+Pj4+IFRoZSBtYWNybyBJSU9fREVWX0FUVFJfQ0hfT0ZGIGlzIGEgd3JhcHBl ciBmb3IgSUlPX0RFVklDRV9BVFRSLCB3aXRoIGEKPiA+Pj4+Pj4+PiB0aW55IGNoYW5nZSBpbiB0 aGUgbmFtZSBkZWZpbml0aW9uLiBUaGlzIGV4dHJhIG1hY3JvIGRvZXMgbm90IGltcHJvdmUKPiA+ Pj4+Pj4+PiB0aGUgcmVhZGFiaWxpdHkgYW5kIGFsc28gY3JlYXRlcyBzb21lIGNoZWNrcGF0Y2gg ZXJyb3JzLgo+ID4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+IFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGNoZWNr cGF0Y2gucGwgZXJyb3JzOgo+ID4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+IHN0YWdpbmcvaWlvL21ldGVy L2FkZTc3NTMuYzozOTE6IEVSUk9SOiBVc2UgNCBkaWdpdCBvY3RhbCAoMDc3Nykgbm90Cj4gPj4+ Pj4+Pj4gZGVjaW1hbCBwZXJtaXNzaW9ucwo+ID4+Pj4+Pj4+IHN0YWdpbmcvaWlvL21ldGVyL2Fk ZTc3NTMuYzozOTU6IEVSUk9SOiBVc2UgNCBkaWdpdCBvY3RhbCAoMDc3Nykgbm90Cj4gPj4+Pj4+ Pj4gZGVjaW1hbCBwZXJtaXNzaW9ucwo+ID4+Pj4+Pj4+IHN0YWdpbmcvaWlvL21ldGVyL2FkZTc3 NTkuYzozMzE6IEVSUk9SOiBVc2UgNCBkaWdpdCBvY3RhbCAoMDc3Nykgbm90Cj4gPj4+Pj4+Pj4g ZGVjaW1hbCBwZXJtaXNzaW9ucwo+ID4+Pj4+Pj4+IHN0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTku YzozMzU6IEVSUk9SOiBVc2UgNCBkaWdpdCBvY3RhbCAoMDc3Nykgbm90Cj4gPj4+Pj4+Pj4gZGVj aW1hbCBwZXJtaXNzaW9ucwo+ID4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+IFNpZ25lZC1vZmYtYnk6IFJv ZHJpZ28gU2lxdWVpcmEgPHJvZHJpZ29zaXF1ZWlyYW1lbG9AZ21haWwuY29tPiAgICAgICAgCj4g Pj4+Pj4+PiAKPiA+Pj4+Pj4+IEhtbS4gSSB3b25kZXJlZCBhIGJpdCBhYm91dCB0aGlzIG9uZS4g SXQncyBhIGNvcnJlY3QgcGF0Y2ggaW4gb2YKPiA+Pj4+Pj4+IGl0c2VsZiBidXQgdGhlIGludGVy ZmFjZSBpbiBxdWVzdGlvbiBkb2Vzbid0IGV2ZW4gdmFndWVseSBjb25mb3JtCj4gPj4+Pj4+PiB0 byBhbnkgb2YgZGVmaW5lZCBJSU8gQUJJLiAgQW55aG93LCBpdCdzIHN0aWxsIGFuZCBpbXByb3Zl bWVudCBzbwo+ID4+Pj4+Pj4gSSdsbCB0YWtlIGl0LiAgICAgICAgCj4gPj4+Pj4+IAo+ID4+Pj4+ PiBJIGFtIG5vdCBzdXJlIGlmIEkgdW5kZXJzdG9vZCB0aGUgY29tbWVudCBhYm91dCB0aGUgQUJJ LiBUaGUgbWV0ZXIKPiA+Pj4+Pj4gaW50ZXJmYWNlIGlzIHdyb25nIGJlY2F1c2UgaXQgdXNlcyB0 aGluZ3MgbGlrZSBJSU9fREVWSUNFX0FUVFI/IEl0Cj4gPj4+Pj4+IHNob3VsZCB1c2UgaWlvX2lu Zm8gdG9nZXRoZXIgd2l0aCAqd3JpdGVfcmF3IGFuZCAqcmVhZF9yYXcuIFJpZ2h0PyBJcyBpdAo+ ID4+Pj4+PiB0aGUgQUJJIHByb2JsZW0gdGhhdCB5b3UgcmVmZXI/ICAgICAgCj4gPj4+Pj4gVGhl IEFCSSBpcyBhYm91dCB0aGUgdXNlcnNwYWNlIGludGVyZmFjZSBvZiBJSU8uICBJdCBpcyBkZWZp bmVkCj4gPj4+Pj4gaW4gRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaWlvKgo+ ID4+Pj4+IFNvIHRoaXMgZG9jdW1lbnRzIHRoZSBuYW1pbmcgb2Ygc3lzZnMgYXR0cmlidXRlcyBh bmQgKG1vcmUgb3IgbGVzcykKPiA+Pj4+PiBkZXNjcmliZXMgYSBjb25zaXN0ZW50IGludGVyZmFj ZSB0byB1c2Vyc3BhY2UgYWNyb3NzIGxvdHMgb2YgZGlmZmVyZW50Cj4gPj4+Pj4gdHlwZXMgb2Yg ZGV2aWNlcy4KPiA+Pj4+PiAKPiA+Pj4+PiBBIGxvdCBvZiB0aGVzZSBvbGRlciBkcml2ZXJzIGlu IHN0YWdpbmcgaW52b2x2ZSBhIGdvb2QgZGVhbCBvZiBBQkkgdGhhdAo+ID4+Pj4+IHdhcyBub3Qg cmV2aWV3ZWQgb3IgZGlzY3Vzc2VkLiAgVGhhdCBpcyBvbmUgb2YgdGhlIGJpZ2dlc3QgcmVhc29u cyB3ZQo+ID4+Pj4+IGRpZG4ndCB0YWtlIHRoZW0gb3V0IG9mIHN0YWdpbmcgaW4gdGhlIGZpcnN0 IHBsYWNlLgo+ID4+Pj4+IAo+ID4+Pj4+IEluIG9yZGVyIGZvciBnZW5lcmljIHVzZXJzcGFjZSBw cm9ncmFtcyB0byBoYXZlIGFueSBpZGVhIHdoYXQgdG8gZG8KPiA+Pj4+PiB3aXRoIHRoZXNlIGRl dmljZXMgdGhpcyBhbGwgbmVlZHMgdG8gYmUgZml4ZWQuCj4gPj4+Pj4gCj4gPj4+Pj4gVGhlcmUg bWF5IHdlbGwgYmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0byBleHBhbmQgdGhlIGV4aXN0aW5nIEFC SSB0bwo+ID4+Pj4+IGNvdmVyIG5ldyB0aGluZ3MuICAgVGhhdCdzIGZpbmUsIGJ1dCBpdCBoYXMg dG8gYmUgZG9uZSB3aXRoIGZ1bGwKPiA+Pj4+PiByZXZpZXcgb2YgdGhlIHJlbGV2YW50IGRvY3Vt ZW50YXRpb24gcGF0Y2hlcy4KPiA+Pj4+PiAKPiA+Pj4+PiBJbmNpZGVudGFsbHkgaWYgeW91IHdh bnQgYW4gZWFzeSBkcml2ZXIgdG8gd29yayBvbiBtb3Zpbmcgb3V0IG9mIHN0YWdpbmcKPiA+Pj4+ PiB0aGVuIGZpcnN0IHRoaW5nIHRvIGRvIGlzIHRvIGNvbXBhcmUgd2hhdCBpdCBzaG93cyB0byB1 c2Vyc3BhY2Ugd2l0aCB0aGVzZQo+ID4+Pj4+IGRvY3MuICBJZiBpdCdzIHRvdGFsbHkgZGlmZmVy ZW50IHRoZW4geW91IGhhdmUgYSBiaWcgam9iIG9uIHlvdXIgaGFuZHMKPiA+Pj4+PiBhcyBvZnRl biBBQkkgY2FuIHRha2UgYSBsb3Qgb2YgZGlzY3Vzc2lvbiBhbmQgYSBsb25nIHRpbWUgdG8gZXN0 YWJsaXNoCj4gPj4+Pj4gYSBjb25zZW5zdXMuCj4gPj4+Pj4gCj4gPj4+Pj4gSm9uYXRoYW4KPiA+ Pj4+PiAKPiA+Pj4+PiAgIAo+ID4+Pj4+PiAKPiA+Pj4+Pj4gVGhhbmtzIDopCj4gPj4+Pj4+ICAg Cj4gPj4+Pj4+PiBBcHBsaWVkIHRvIHRoZSB0b2dyZWcgYnJhbmNoIG9mIGlpby5naXQgYW5kIHB1 c2hlZCBvdXQgYXMgdGVzdGluZwo+ID4+Pj4+Pj4gZm9yIHRoZSBhdXRvYnVpbGRlcnMgdG8gcGxh eSB3aXRoIGl0Lgo+ID4+Pj4+Pj4gCj4gPj4+Pj4+PiBJIGFsc28gYWRkZWQgdGhlIHJlbW92YWwg b2YgdGhlIGhlYWRlciBkZWZpbmUgd2hpY2ggaXMgbm8KPiA+Pj4+Pj4+IGxvbmdlciB1c2VkLgo+ ID4+Pj4+Pj4gCj4gPj4+Pj4+PiBQbGVhc2Ugbm90ZSwgZm9sbG93aW5nIGRpc2N1c3Npb25zIHdp dGggTWljaGFlbCwgSSBhbSBnb2luZyB0byBzZW5kCj4gPj4+Pj4+PiBhbiBlbWFpbCBhbm5vdW5j aW5nIGFuIGludGVudCB0byBkcm9wIHRoZXNlIG1ldGVyIGRyaXZlcnMgbmV4dAo+ID4+Pj4+Pj4g Y3ljbGUgdW5sZXNzIHNvbWVvbmUgY2FuIHByb3ZpZGUgdGVzdGluZyBmb3IgYW55IGF0dGVtcHQg dG8KPiA+Pj4+Pj4+IG1vdmUgdGhlbSBvdXQgb2Ygc3RhZ2luZy4gIEknbSBzdGlsbCB0YWtpbmcg cGF0Y2hlcyBvbiB0aGUgYmFzaXMKPiA+Pj4+Pj4+IHRoYXQgJ21pZ2h0JyBoYXBwZW4gLSBidXQg SSB3b3VsZG4ndCBmb2N1cyBvbiB0aGVzZSB1bnRpbCB3ZQo+ID4+Pj4+Pj4gaGF2ZSBzb21lIGNl cnRhaW50eSBvbiB3aGV0aGVyIHRoZXkgd2lsbCBiZSBhcm91bmQgbG9uZyB0ZXJtIQo+ID4+Pj4+ Pj4gCj4gPj4+Pj4+PiBKb25hdGhhbgo+ID4+Pj4+Pj4gICAKPiA+Pj4+Pj4+PiAtLS0KPiA+Pj4+ Pj4+PiBkcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYyB8IDE4ICsrKysrKysrKyst LS0tLS0tLQo+ID4+Pj4+Pj4+IGRyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jIHwg MTggKysrKysrKysrKy0tLS0tLS0tCj4gPj4+Pj4+Pj4gMiBmaWxlcyBjaGFuZ2VkLCAyMCBpbnNl cnRpb25zKCspLCAxNiBkZWxldGlvbnMoLSkKPiA+Pj4+Pj4+PiAKPiA+Pj4+Pj4+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMgYi9kcml2ZXJzL3N0YWdp bmcvaWlvL21ldGVyL2FkZTc3NTMuYwo+ID4+Pj4+Pj4+IGluZGV4IGM0NGViNTc3ZGMzNS4uMjc1 ZThkZmZmODM2IDEwMDY0NAo+ID4+Pj4+Pj4+IC0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0 ZXIvYWRlNzc1My5jCj4gPj4+Pj4+Pj4gKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9h ZGU3NzUzLmMKPiA+Pj4+Pj4+PiBAQCAtMzg4LDE0ICszODgsMTYgQEAgc3RhdGljIElJT19ERVZf QVRUUl9WUEVSSU9EKDA0NDQsCj4gPj4+Pj4+Pj4gCQlhZGU3NzUzX3JlYWRfMTZiaXQsCj4gPj4+ Pj4+Pj4gCQlOVUxMLAo+ID4+Pj4+Pj4+IAkJQURFNzc1M19QRVJJT0QpOwo+ID4+Pj4+Pj4+IC1z dGF0aWMgSUlPX0RFVl9BVFRSX0NIX09GRigxLCAwNjQ0LAo+ID4+Pj4+Pj4+IC0JCWFkZTc3NTNf cmVhZF84Yml0LAo+ID4+Pj4+Pj4+IC0JCWFkZTc3NTNfd3JpdGVfOGJpdCwKPiA+Pj4+Pj4+PiAt CQlBREU3NzUzX0NIMU9TKTsKPiA+Pj4+Pj4+PiAtc3RhdGljIElJT19ERVZfQVRUUl9DSF9PRkYo MiwgMDY0NCwKPiA+Pj4+Pj4+PiAtCQlhZGU3NzUzX3JlYWRfOGJpdCwKPiA+Pj4+Pj4+PiAtCQlh ZGU3NzUzX3dyaXRlXzhiaXQsCj4gPj4+Pj4+Pj4gLQkJQURFNzc1M19DSDJPUyk7Cj4gPj4+Pj4+ Pj4gKwo+ID4+Pj4+Pj4+ICtzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGNob2ZmXzEsIDA2NDQsCj4g Pj4+Pj4+Pj4gKwkJCWFkZTc3NTNfcmVhZF84Yml0LAo+ID4+Pj4+Pj4+ICsJCQlhZGU3NzUzX3dy aXRlXzhiaXQsCj4gPj4+Pj4+Pj4gKwkJCUFERTc3NTNfQ0gxT1MpOwo+ID4+Pj4+Pj4+ICsKPiA+ Pj4+Pj4+PiArc3RhdGljIElJT19ERVZJQ0VfQVRUUihjaG9mZl8yLCAwNjQ0LAo+ID4+Pj4+Pj4+ ICsJCQlhZGU3NzUzX3JlYWRfOGJpdCwKPiA+Pj4+Pj4+PiArCQkJYWRlNzc1M193cml0ZV84Yml0 LAo+ID4+Pj4+Pj4+ICsJCQlBREU3NzUzX0NIMk9TKTsKPiA+Pj4+Pj4+PiAKPiA+Pj4+Pj4+PiBz dGF0aWMgaW50IGFkZTc3NTNfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxl KQo+ID4+Pj4+Pj4+IHsKPiA+Pj4+Pj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lp by9tZXRlci9hZGU3NzU5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwo+ ID4+Pj4+Pj4+IGluZGV4IDFkZWNiMmI4YWZhYi4uYzA3OGI3NzBmYTUzIDEwMDY0NAo+ID4+Pj4+ Pj4+IC0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jCj4gPj4+Pj4+Pj4g KysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMKPiA+Pj4+Pj4+PiBAQCAt MzI4LDE0ICszMjgsMTYgQEAgc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfR0FJTigw NjQ0LAo+ID4+Pj4+Pj4+IAkJYWRlNzc1OV9yZWFkXzE2Yml0LAo+ID4+Pj4+Pj4+IAkJYWRlNzc1 OV93cml0ZV8xNmJpdCwKPiA+Pj4+Pj4+PiAJCUFERTc3NTlfQVBHQUlOKTsKPiA+Pj4+Pj4+PiAt c3RhdGljIElJT19ERVZfQVRUUl9DSF9PRkYoMSwgMDY0NCwKPiA+Pj4+Pj4+PiAtCQlhZGU3NzU5 X3JlYWRfOGJpdCwKPiA+Pj4+Pj4+PiAtCQlhZGU3NzU5X3dyaXRlXzhiaXQsCj4gPj4+Pj4+Pj4g LQkJQURFNzc1OV9DSDFPUyk7Cj4gPj4+Pj4+Pj4gLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZG KDIsIDA2NDQsCj4gPj4+Pj4+Pj4gLQkJYWRlNzc1OV9yZWFkXzhiaXQsCj4gPj4+Pj4+Pj4gLQkJ YWRlNzc1OV93cml0ZV84Yml0LAo+ID4+Pj4+Pj4+IC0JCUFERTc3NTlfQ0gyT1MpOwo+ID4+Pj4+ Pj4+ICsKPiA+Pj4+Pj4+PiArc3RhdGljIElJT19ERVZJQ0VfQVRUUihjaG9mZl8xLCAwNjQ0LAo+ ID4+Pj4+Pj4+ICsJCQlhZGU3NzU5X3JlYWRfOGJpdCwKPiA+Pj4+Pj4+PiArCQkJYWRlNzc1OV93 cml0ZV84Yml0LAo+ID4+Pj4+Pj4+ICsJCQlBREU3NzU5X0NIMU9TKTsKPiA+Pj4+Pj4+PiArCj4g Pj4+Pj4+Pj4gK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hvZmZfMiwgMDY0NCwKPiA+Pj4+Pj4+ PiArCQkJYWRlNzc1OV9yZWFkXzhiaXQsCj4gPj4+Pj4+Pj4gKwkJCWFkZTc3NTlfd3JpdGVfOGJp dCwKPiA+Pj4+Pj4+PiArCQkJQURFNzc1OV9DSDJPUyk7Cj4gPj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4g c3RhdGljIGludCBhZGU3NzU5X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJs ZSkKPiA+Pj4+Pj4+PiB7ICAgICAgICAKPiA+Pj4+Pj4+ICAgCj4gPj4+Pj4+IC0tCj4gPj4+Pj4+ IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmli ZSBsaW51eC1paW8iIGluCj4gPj4+Pj4+IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRv bW9Admdlci5rZXJuZWwub3JnCj4gPj4+Pj4+IE1vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6 Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbCAgICAgIAo+ID4+Pj4+IAo+ID4+ Pj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gPj4+ Pj4gZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPj4+Pj4gZGV2ZWxAbGludXhkcml2ZXJwcm9qZWN0Lm9y Zwo+ID4+Pj4+IGh0dHA6Ly9kcml2ZXJkZXYubGludXhkcml2ZXJwcm9qZWN0Lm9yZy9tYWlsbWFu L2xpc3RpbmZvL2RyaXZlcmRldi1kZXZlbCAgICAgIAo+ID4+Pj4gICAKPiA+Pj4gICAKPiA+PiAg IAo+ID4gICAKPiAKPiAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpkZXZlbCBtYWlsaW5nIGxpc3QKZGV2ZWxAbGludXhkcml2ZXJwcm9qZWN0Lm9yZwpo dHRwOi8vZHJpdmVyZGV2LmxpbnV4ZHJpdmVycHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby9k cml2ZXJkZXYtZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.kernel.org ([198.145.29.99]:47300 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751891AbeCXPCM (ORCPT ); Sat, 24 Mar 2018 11:02:12 -0400 Date: Sat, 24 Mar 2018 15:02:05 +0000 From: Jonathan Cameron To: John Syne Cc: Rodrigo Siqueira , devel@driverdev.osuosl.org, Lars-Peter Clausen , linux-iio@vger.kernel.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Peter Meerwald-Stadler , Hartmut Knaack , daniel.baluta@nxp.com Subject: Re: meter ABI: (was Re: [PATCH v2 1/3] staging:iio:meter: Replaces IIO_DEV_ATTR_CH_OFF by IIO_DEVICE_ATTR) Message-ID: <20180324150205.709aa211@archlinux> In-Reply-To: References: <3af0e5a795059a8418cf08ff29f05f8d5e00da9b.1520382753.git.rodrigosiqueiramelo@gmail.com> <20180307200730.08ed3c2f@archlinux> <20180309003733.aichruo53vqryafg@smtp.gmail.com> <20180310151045.4570e85d@archlinux> <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> <20180317203037.1093cc11@archlinux> <20180318122312.0d395367@archlinux> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-iio-owner@vger.kernel.org List-Id: linux-iio@vger.kernel.org On Mon, 19 Mar 2018 22:57:16 -0700 John Syne wrote: > Hi Jonathan, > > Thank you for all your hard work. Your feedback is really helpful. I’m surprised that no one from Analog Device has offered any suggestions. > Sadly those active in the mainline linux kernel from ADI are focused in other areas currently :( > Anyway, please see my comments inline below > > Regards, > John > > > > > > > On Mar 18, 2018, at 5:23 AM, Jonathan Cameron wrote: > > > > On Sat, 17 Mar 2018 23:11:45 -0700 > > John Syne wrote: > > > >> Hi Jonathan, > > Hi John and All, > > > > I'd love to get some additional input on this from anyone interested. > > There are a lot of weird and wonderful derived quantities in an energy > > meter and it seems we need to make some fundamental changes to support > > them - including potentially a userspace breaking change to the event > > code description. > > > >> > >> Here is the complete list of registers for the ADE7878 which I copied from the data sheet. I added a column “IIO Attribute” which I hope follows your IIO ABI. Please make any changes you feel are incorrect. BTW, there are several registers that cannot be generalized and are used purely for chip configuration. I think we should add a new naming convention, namely {register}_{}. Also, I see in the sys_bus_iio doc > >> in_accel_x_peak_raw > >> > >> so shouldn’t the phase be represented as follows: > >> > >> in_current_A_scale > > I'm still confused. What does A represent here? I assumed that was a wild > > card for the channel number before but clearly not. > > > > Ah, you are labelling the 3 separate phases as A, B and C. Hmm. > > I guess they sort of look like axis, and sort of like independent channels. > > So could be indexed or done via modifiers depending on how you look at it. > In metering terminology, the three phases are commonly referred to as RED, GREEN, BLUE or PhaseA, PhaseB, PhaseC and Neutral. Analog Devices uses the ABCN nomenclature so anyone using this driver will probably have referenced the Analog Devices datasheet so this terminology should be familiar. Which is more commonly used in general? We are designing what we hope will be a general interface and last thing we want is to have everyone not using ADI parts confused! Personally not assigning 'colours' makes more sense to me. (btw please wrap any lines that don't need to be long to around 80 characters). > > > > Hmm. With neutral in there as well I guess we need to make them > > modifiers (but might change my mind later ;) > > > > Particularly as we are using the the modifier for RMS under the previous > > plan... It appears we should treat that instead like we did for peak > > and do it as an additional info mask element. The problem with doing that > > on a continuous measurement is that we can't treat it as a channel to > > be output through the buffered interface. > I’ve changed the layout of the spreadsheet to breakout the Direction, Type, Index, Modifier and Info Mask to make sure there is no miss-understanding and will help identify all the items we need to add. > > The ADE7878 channels that will use the buffer are IAWV, VAWV, IBWV, VBWV, ICWV, VCWV, INWV, AVA, BVA, CVA, AWATT, BWATT, CWATT, AVAR, BVAR, and CVAR. So I guess we have to add an index Probably a good idea anyway, we are sort of slowly moving away from index less channels. The ABI always allowed index assignment and it makes for easier userspace code. > > Address Register IIO Attribute Dir Type Index Modifier Info Mask R/W Bit Bit Length Type Default Description > Length During Comm Value > 0xE50C IAWV in_current0_phaseA_instantaneous in current 0 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A current. I'm unconvinced by "instantaneous". That is the default assumption that you are measuring current at this point in time. I'm still confused on what this actually is. Is it effectively the DC current? I.e. the wave form value for current? You answer this below. They are DC measurements.. Which actually raises a point I'd forgotten. We have an explicit type for altvoltage (defined for DDS devices as the waveform amplitude IIRC). We should be consistent with that if possible. So I think this should be. in_current0_phaseA_raw etc A channel can be uniquely identified using index and modifier as as pair (if we add the new field for computation applied that will also allow separate identification). So the later channels can be. in_current0_phaseB_raw etc Indexes can be shared by different types as well. Often done to associate different measurements of the same signal (though the ABI doesn't specify that). > 0xE50D IBWV in_current1_phaseB_instantaneous in current 1 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B current. > 0xE50E ICWV in_current2_phaseC_instantaneous in current 2 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C current. > 0xE50F INWV in_current3_phaseN_instantaneous in current 3 neutral instantaneous R 24 32 SE S N/A Instantaneous value of neutral current (ADE7868 and ADE7878 only). in_voltage0_phaseA_raw > 0xE510 VAWV in_voltage4_phaseA_instantaneous in voltage 4 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A voltage. > 0xE511 VBWV in_voltage5_phaseB_instantaneous in voltage 5 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B voltage. > 0xE512 VCWV in_voltage6_phaseC_instantaneous in voltage 6 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C voltage. > 0xE513 AWATT in_power7_phaseA_instantaneous in power 7 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total active power. > 0xE514 BWATT in_power8_phaseB_instantaneous in power 8 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total active power. > 0xE515 CWATT in_power9_phaseC_instantaneous in power 9 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total active power. in_power0_phaseC_raw > 0xE516 AVAR in_powerreactive10_phaseA_instantaneous in powerreactive 10 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total reactive power (ADE7858, ADE7868, and ADE7878 only). in_powerreactive0_phaseA_raw etc > 0xE517 BVAR in_powerreactive11_phaseB_instantaneous in powerreactive 11 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total reactive power (ADE7858, ADE7868, and ADE7878 only). > 0xE518 CVAR in_powerreactive12_phaseC_instantaneous in powerreactive 12 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total reactive power (ADE7858, ADE7868, and ADE7878 only). > 0xE519 AVA in_powerapparent13_phaseA_instantaneous in powerapparent 13 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A apparent power. > 0xE51A BVA in_powerapparent14_phaseB_instantaneous in powerapparent 14 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B apparent power. > 0xE51B CVA in_powerappatent15_phaseC_instantaneous in powerapparent 15 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C apparent power. > > The ADE9000 channels that use the buffer are IA, VA, IB, VB, IC, VC and IN > > > > So again we have run out of space. It's increasingly looking like we need > > room for another field in the events - to cleanly represent computed values. > > > > Hmm. What is the current usage? - it's been a while so I had to go > > look in the header. > > > > 0-15 Channel (lots of channels) > > 31-16 Channel 2 (36 modifiers - lots of channels) > > 47-32 Channel Type (31 used so far - this looks most likely to run out of > > space in the long run so leave this one alone). > > 54-48 Event Direction (4 used) > > 55 Differential (1: channel 2 as differential pair 0: as a modifier) > > 63-56 Event Type (6 used) > > > > So I think we can pinch bit 53 as another flag to indicate we have > > a computed value or possibly bit 63 as event types are few and > > far between as well. > > > > Probably reasonable to assume we never have 16 bits worth > > of channels and computed channels at the same time? > > Hence I think we can steal bits off the top of Channel. > > How many do we need? Not sure unfortunately but feels like > > 8 should be plenty. > When you speak of Channels here, are you referring to measurements that will use the buffer? Even when counting all the IIO attributes, the ADE9000 has 462 registers, and not all of those would be defined as attributes. I think 8 Bits should be more than enough. Not quite. This is all about allowing us to differentiate between the actual channels where a channel is a single measurement that we are interested in. So we care about 256 measurements that are otherwise indistinguishable using combination of index, modifier and our new propose computedvalue bit. > > > > The other element of this is we add a new field to iio_chan_spec > > to contain 'derived_type' or something like that which has > > rms and sum squared etc. Over time we can move some of those > > from the modifiers and free up a few entires there. > > So modifier might be "X and Y and Z" with a derived_type of > > sum_squared to give existing sum_squared_x_y_z but no > > rush on that. > > > > Anyhow so now we have an extra element to play that will result > > in a different channel. > > > > Whilst here we should think about any other mods needed to > > that event structure. It is a little unfortunate that this > > will be a breaking change for any old userspace code playing > > with new drivers but it can't be helped as we didn't have > > reserved values in the original definition (oops). > > > > At somepoint we may need to add the 'shared by derived_value' > > info mask but I think we can ignore that for now (seems > > moderately unlikely to have anything in it!) > >> > >> But for now, I followed your instructions from your reply. > >> > >> After finalizing this one, I will work on the ADE9000, which as way more registers ;-) > >> > >> Once we can agree on the register naming, I will update the ADE7854 driver for Rodrigo, which will go a long way to getting it out of staging. > > I'll edit to fit with new scheme and insert indexes which I think would be > > preferred though optional under the ABI as we only have one of each type/ > >> > >> Address Register IIO Attribute R/W Bit Length Bit Length During Communications Type Default Value Description > >> 0x4380 AIGAIN in_current0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A current gain adjust. > > A, B, C, N aren't obvious to the lay reader so I suggest we burn a few characters and stick phase in for ABC and just have neutral for > > the neutral one. Not sure about capitalization or not though. > > > >> 0x4381 AVGAIN in_voltage0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A voltage gain adjust. > >> 0x4382 BIGAIN in_current0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B current gain adjust. > >> 0x4383 BVGAIN in_voltage0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B voltage gain adjust. > >> 0x4384 CIGAIN in_current0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C current gain adjust. > >> 0x4385 CVGAIN in_voltage0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C voltage gain adjust. > >> 0x4386 NIGAIN in_current0_neutral_scale R/W 24 32 ZPSE S 0x000000 Neutral current gain adjust (ADE7868 and ADE7878 only). > >> 0x4387 AIRMSOS in_current0_phaseA_rms_offset R/W 24 32 ZPSE S 0x000000 Phase A current rms offset. > >> 0x4388 AVRMSOS in_voltage0_phaseA_rms_offset R/W 24 32 ZPSE S 0x000000 Phase A voltage rms offset. > >> 0x4389 BIRMSOS in_current0_phaseB_rms_offset R/W 24 32 ZPSE S 0x000000 Phase B current rms offset. > >> 0x438A BVRMSOS in_voltage0_phaseB_rms_offset R/W 24 32 ZPSE S 0x000000 Phase B voltage rms offset. > >> 0x438B CIRMSOS in_current0_phaseC_rms_offset R/W 24 32 ZPSE S 0x000000 Phase C current rms offset. > >> 0x438C CVRMSOS in_voltage0_phaseC_rms_offset R/W 24 32 ZPSE S 0x000000 Phase C voltage rms offset. > >> 0x438D NIRMSOS in_current0_neutral_rms_offset R/W 24 32 ZPSE S 0x000000 Neutral current rms offset (ADE7868 and ADE7878 only). > >> 0x438E AVAGAIN in_powerapparent0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A apparent power gain adjust. > >> 0x438F BVAGAIN in_powerapparent0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B apparent power gain adjust. > >> 0x4390 CVAGAIN in_powerapparent0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C apparent power gain adjust. > >> 0x4391 AWGAIN in_power0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A total active power gain adjust. > >> 0x4392 AWATTOS in_power0_phaseA_offset R/W 24 32 ZPSE S 0x000000 Phase A total active power offset adjust. > >> 0x4393 BWGAIN in_power0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B total active power gain adjust. > >> 0x4394 BWATTOS in_power0_phaseB_offset R/W 24 32 ZPSE S 0x000000 Phase B total active power offset adjust. > >> 0x4395 CWGAIN in_power0_PhaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C total active power gain adjust. > >> 0x4396 CWATTOS in_power0_phaseC_offset R/W 24 32 ZPSE S 0x000000 Phase C total active power offset adjust. > >> 0x4397 AVARGAIN in_powerreactive0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A total reactive power gain adjust (ADE7858, ADE7868, and ADE7878). > >> 0x4398 AVAROS in_powerreactive0_phaseA_offset R/W 24 32 ZPSE S 0x000000 Phase A total reactive power offset adjust (ADE7858, ADE7868, and ADE7878). > >> 0x4399 BVARGAIN in_powerreactive0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B total reactive power gain adjust (ADE7858, ADE7868, and ADE7878). > >> 0x439A BVAROS in_powerreactive0_phaseB_offset R/W 24 32 ZPSE S 0x000000 Phase B total reactive power offset adjust (ADE7858, ADE7868, and ADE7878). > >> 0x439B CVARGAIN in_powerreactive0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C total reactive power gain adjust (ADE7858, ADE7868, and ADE7878). > >> 0x439C CVAROS in_powerreactive0_phaseC_offset R/W 24 32 ZPSE S 0x000000 Phase C total reactive power offset adjust (ADE7858, ADE7868, and ADE7878). > >> 0x439D AFWGAIN in_power0_phaseA_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase A fundamental active power gain adjust. Location reserved for ADE7854, ADE7858, and ADE7868. > > Hmm. fundamental is the oddity here. I here because it is sort of a derived value > > and sort of a filter applied. Can it be sensible combined with RMS? probably not but > > it can be combined with peak for example (which I'd also ideally move into > > the derived representation.). > Includes only the measurement spectrum at 50Hz or 60Hz and does not include harmonic. I think for that we need to define a different indexed channel and define the filters applied with appropriate values to make it a band pass at these frequencies. We may need to expand the current filter definitions to do this but that is fine if needed. > > > > >> 0x439E AFWATTOS in_power0_phaseA_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase A fundamental active power offset adjust. Location reserved for ADE7854, ADE7858, and ADE7868. > >> 0x439F BFWGAIN in_power0_phaseB_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase B fundamental active power gain adjust (ADE7878 only). > >> 0x43A0 BFWATTOS in_power0_phaseB_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase B fundamental active power offset adjust (ADE7878 only). > >> 0x43A1 CFWGAIN in_power0_phaseC_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase C fundamental active power gain adjust. > >> 0x43A2 CFWATTOS in_power0_phaseC_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase C fundamental active power offset adjust (ADE7878 only). > >> 0x43A3 AFVARGAIN in_powerreactive0_phaseA_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase A fundamental reactive power gain adjust (ADE7878 only). > >> 0x43A4 AFVAROS in_powerreactive0_phaseA_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase A fundamental reactive power offset adjust (ADE7878 only). > >> 0x43A5 BFVARGAIN in_powerreactive0_phaseB_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase B fundamental reactive power gain adjust (ADE7878 only). > >> 0x43A6 BFVAROS in_powerreactive0_phaseB_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase B fundamental reactive power offset adjust (ADE7878 only). > >> 0x43A7 CFVARGAIN in_powerreactive0_phaseC_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase C fundamental reactive power gain adjust (ADE7878 only). > >> 0x43A8 CFVAROS in_powerreactive0_phaseC_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase C fundamental reactive power offset adjust (ADE7878 only). > >> 0x43A9 VATHR1 regiister_VATHR1 R/W 24 32 ZP U 0x000000 Most significant 24 bits of VATHR[47:0] threshold used in phase apparent power datapath. > > Do not expose these to userspace. Why would it care? > Brilliant, yes these should be moved the the DeviceTree (DT) Cool > > > >> 0x43AA VATHR0 register_VATHR0 R/W 24 32 ZP U 0x000000 Less significant 24 bits of VATHR[47:0] threshold used in phase apparent power datapath. > >> 0x43AB WTHR1 register_WTHR1 R/W 24 32 ZP U 0x000000 Most significant 24 bits of WTHR[47:0] threshold used in phase total/fundamental active power datapath. > >> 0x43AC WTHR0 register_WTHR0 R/W 24 32 ZP U 0x000000 Less significant 24 bits of WTHR[47:0] threshold used in phase total/fundamental active power datapath. > >> 0x43AD VARTHR1 register_VARTHR1 R/W 24 32 ZP U 0x000000 Most significant 24 bits of VARTHR[47:0] threshold used in phase total/fundamental reactive power datapath (ADE7858, ADE7868, and ADE7878). > >> 0x43AE VARTHR0 register_VARTHR0 R/W 24 32 ZP U 0x000000 Less significant 24 bits of VARTHR[47:0] threshold used in phase total/fundamental reactive power datapath (ADE7858, ADE7868, and ADE7878). > >> 0x43AF Reserved N/A4 N/A4 N/A4 N/A4 0x000000 This memory location should be kept at 0x000000 for proper operation. > >> 0x43B0 VANOLOAD register_VANOLOAD R/W 24 32 ZPSE S 0x0000000 No load threshold in the apparent power datapath. > > This one is kind of an event parameter, but one that controls internal creep prevention. > > This will be a driver specific attr I think for now. We may add it to info_mask > > later if we get lots of meter drivers. > > Something like > > in_power0_no_load_thresh though I haven't really thought about it or looked > > for similar precedence. > Again, this is something that would be set and never changed, so I think this should be moved to DT. Cool. > > > > > >> 0x43B1 APNOLOAD register_APNOLOAD R/W 24 32 ZPSE S 0x0000000 No load threshold in the total/fundamental active power datapath. > > in_activepower0_no_load_thresh > DT > >> 0x43B2 VARNOLOAD register_VARNOLOAD R/W 24 32 ZPSE S 0x0000000 No load threshold in the total/fundamental reactive power datapath. Location reserved for ADE7854. > > in_reactivpower0_no_load_thresh > DT > > > >> 0x43B3 VLEVEL register_VLEVEL R/W 24 32 ZPSE S 0x000000 Register used in the algorithm that computes the fundamental active and reactive powers (ADE7878 only). > > This one looks like a characteristic of the circuit attached. So should be devicetree > > or similar and not exposed to userspace. > DT > > > >> 0x43B5 DICOEFF register_DICOEFF R/W 24 32 ZPSE S 0x0000000 Register used in the digital integrator algorithm. If the integrator is turned on, it must be set at 0xFF8000. In practice, it is transmitted as 0xFFF8000. > > no userspace interface. > DT > > > >> 0x43B6 HPFDIS register_HPFDIS R/W 24 32 ZP U 0x000000 Disables/enables the HPF in the current datapath (see Table 34). > > We have controls for high pass filters, you'll need to map on to them. > > Disable is usually setting 3DB point to 0 IIRC. > DT > > > >> 0x43B8 ISUMLVL register_ISUMLVL R/W 24 32 ZPSE S 0x000000 Threshold used in comparison between the sum of phase currents and the neutral current (ADE7868 and ADE7878 only). > > This is an event threshold so needs to map to the events infrastructure > > as best we can. It's actually a pain to describe so may be device specific ABI. > DT. I’m not sure why this would be mapped to the events infrastructure? There is no event generated by this register. Control parameter of an event I think? So the event description is separate from that of the channels and has it's own extended ABI to describe this sort of value. > > > >> 0x43BF ISUM register_ISUM R 28 32 ZP S N/A4 Sum of IAWV, IBWV, and ICWV registers (ADE7868 and ADE7878 only). > > So this would be using a modifier for AandBandC phases (similar to the XandYanZ ones for mems devices and > > a derived value of sum I think So would look something like. > > in_current0_phaseA&phaseB&phaseC_sum and yet another channel > > > >> 0x43C0 AIRMS in_current0_phaseA_rms R 24 32 ZP S N/A4 Phase A current rms value. > >> 0x43C1 AVRMS in_voltage0_phaseA_rms R 24 32 ZP S N/A4 Phase A voltage rms value. > >> 0x43C2 BIRMS in_current0_phaseB_rms R 24 32 ZP S N/A4 Phase B current rms value. > >> 0x43C3 BVRMS in_voltage0_phaseB_rms R 24 32 ZP S N/A4 Phase B voltage rms value. > >> 0x43C4 CIRMS in_current0_phaseC_rms R 24 32 ZP S N/A4 Phase C current rms value. > >> 0x43C5 CVRMS in_voltage0_phaseC_rms R 24 32 ZP S N/A4 Phase C voltage rms value. > >> 0x43C6 NIRMS in_current0_neutral_rms R 24 32 ZP S N/A4 Neutral current rms value (ADE7868 and ADE7878 only). > >> 0xE228 Run register_Run R/W 16 16 U 0x0000 Run register starts and stops the DSP. See the Digital Signal Processor section for more details. > > Not exposed to userspace. > DT > > > >> 0xE400 AWATTHR in_energy0_phaseA_raw R 32 32 S 0x00000000 Phase A total active energy accumulation. > >> 0xE401 BWATTHR in_energy0_phaseB_raw R 32 32 S 0x00000000 Phase B total active energy accumulation. > >> 0xE402 CWATTHR in_energy0_phaseC_raw R 32 32 S 0x00000000 Phase C total active energy accumulation. > >> 0xE403 AFWATTHR in_energy0_phaseA_fundamental_raw R 32 32 S 0x00000000 Phase A fundamental active energy accumulation (ADE7878 only). > >> 0xE404 BFWATTHR in_energy0_phaseB_fundamental_raw R 32 32 S 0x00000000 Phase B fundamental active energy accumulation (ADE7878 only). > >> 0xE405 CFWATTHR in_energy0_phaseC_fundamental_raw R 32 32 S 0x00000000 Phase C fundamental active energy accumulation (ADE7878 only). > >> 0xE406 AVARHR in_energyreactive0_phaseA_raw R 32 32 S 0x00000000 Phase A total reactive energy accumulation (ADE7858, ADE7868, and ADE7878 only). > >> 0xE407 BVARHR in_energyreactive0_phaseB_raw R 32 32 S 0x00000000 Phase B total reactive energy accumulation (ADE7858, ADE7868, and ADE7878 only). > >> 0xE408 CVARHR in_energyreactive0_phaseC_raw R 32 32 S 0x00000000 Phase C total reactive energy accumulation (ADE7858, ADE7868, and ADE7878 only). > >> 0xE409 AFVARHR in_energyreactive0_phaseA_fundamental_raw R 32 32 S 0x00000000 Phase A fundamental reactive energy accumulation (ADE7878 only). > >> 0xE40A BFVARHR in_energyreactive0_phaseB_fundamental_raw R 32 32 S 0x00000000 Phase B fundamental reactive energy accumulation (ADE7878 only). > >> 0xE40B CFVARHR in_energyreactive0_phaseC_fundamental_raw R 32 32 S 0x00000000 Phase C fundamental reactive energy accumulation (ADE7878 only). > >> 0xE40C AVAHR in_energyapparent0_phaseA_raw R 32 32 S 0x00000000 Phase A apparent energy accumulation. > >> 0xE40D BVAHR in_energyapparent0_phaseB_raw R 32 32 S 0x00000000 Phase B apparent energy accumulation. > >> 0xE40E CVAHR in_energyapparent0_phaseC_raw R 32 32 S 0x00000000 Phase C apparent energy accumulation. > >> 0xE500 IPEAK in_current0_peak R 32 32 U N/A Current peak register. See Figure 50 and Table 35 for details about its composition. > > Oh goody. I have no idea how we expose the which phase element of this > > cleanly. One option I suppose is to have in_current0_phaseA_peak etc > > and have all but the current peak return an error when read? It is a bit > > nasty but only so much we can do and keep with a consistent interface. > > > >> 0xE501 VPEAK in_voltage_peak R 32 32 U N/A Voltage peak register. See Figure 50 and Table 36 for details about its composition. > > Same as peak. > > > >> 0xE502 STATUS0 register_STATUS0 R/W 32 32 U N/A Interrupt Status Register 0. See Table 37. > >> 0xE503 STATUS1 register_STATUS1 R/W 32 32 U N/A Interrupt Status Register 1. See Table 38. > > No userspace interface except via events interface or error reports. > Isn’t this tied to the event framework? My thinking is the user interface should be notified when certain conditions occur. Probably depending on the condition. If it looks like a threshold on something it can go through as an event. If it is a 'fault' detection in the measurement hardware we need to look at a RAS type notification. This is always a tricky topic and the upshot is we normally just end up dumping them in the kernel log as anything else is hard to do (from a persuading other people of it's importance point of view). > > > >> 0xE504 AIMAV in_currentA_mav R 20 32 ZP U N/A Phase A current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and ADE7878 only). > > Probably a longer name as mav is cryptic. > > in_current0_phaseA_meanabs_raw - it could have a scale and all sorts of fun. > > So I think this needs to be using the new derived infrastructure proposed here > > rather than being an info_mask element. > The same way a knowledgeable person understands what RMS means, so they should also understand what MAV means. hehe. I know RMS and not MAV so I suspect it a bit dependent on where exactly you came across the terms ;) > > > >> 0xE505 BIMAV in_currentB_mav R 20 32 ZP U N/A Phase B current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and ADE7878 only). > >> 0xE506 CIMAV in_currentC_mav R 20 32 ZP U N/A Phase C current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and ADE7878 only). > >> 0xE507 OILVL register_OILVL R/W 24 32 ZP U 0xFFFFFF Overcurrent threshold. > >> 0xE508 OVLVL register_OVLVL R/W 24 32 ZP U 0xFFFFFF Overvoltage threshold. > > These presumably result in interrupts? (I'm running out of time so not checking) > > In which case standard event interface should work. > > > >> 0xE509 SAGLVL register_SAGLVL R/W 24 32 ZP U 0x000000 Voltage SAG level threshold. > > That's another event I think… > Again, this is only setting the threshold, not generating any event. What does the threshold result it? Presumably an event so this is exposed as a control parameter of the event. There is a whole set of ABI for that... > > > >> 0xE50A MASK0 register_MASK0 R/W 32 32 U 0x00000000 Interrupt Enable Register 0. See Table 39. > >> 0xE50B MASK1 register_MASK1 R/W 32 32 U 0x00000000 Interrupt Enable Register 1. See Table 40. > > > >> 0xE50C IAWV in_currentA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A current. > >> 0xE50D IBWV in_currentB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B current. > >> 0xE50E ICWV in_currentC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C current. > >> 0xE50F INWV in_currentN_instantaneous R 24 32 SE S N/A Instantaneous value of neutral current (ADE7868 and ADE7878 only). > >> 0xE510 VAWV in_voltageA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A voltage. > >> 0xE511 VBWV in_voltageB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B voltage. > >> 0xE512 VCWV in_voltageC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C voltage. > > OK, this is getting silly. I presume this means the values above are filtered and these > > aren't? If so you need to have channels for both and different filter values. > These are the actual samples from the ADC and not a calculated measurement over 10/12 cycles. These are the samples that are placed in the buffer. OK, so DC values which answers my question above. So this is the 'normal' measurement. For the multi cycle ones we need to represent them as additional measurements using the index and describe the filtering applied to them (or use altvoltage etc to say we are looking at measurements related to the fact they are alternating rather than DC. > > > >> 0xE513 AWATT in_powerA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total active power. > >> 0xE514 BWATT in_powerB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total active power. > >> 0xE515 CWATT in_powerC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total active power. > >> 0xE516 AVAR in_powerreactiveA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total reactive power (ADE7858, ADE7868, and ADE7878 only). > >> 0xE517 BVAR in_powerreactiveB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total reactive power (ADE7858, ADE7868, and ADE7878 only). > >> 0xE518 CVAR in_powerreactiveC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total reactive power (ADE7858, ADE7868, and ADE7878 only). > >> 0xE519 AVA in_powerapparentA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A apparent power. > >> 0xE51A BVA in_powerapparentB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B apparent power. > >> 0xE51B CVA in_powerappatentC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C apparent power. > > Same for all of these. > > > >> 0xE51F CHECKSUM register_CHECKSUM R 32 32 U 0x33666787 Checksum verification. See the Checksum Register section for details. > > Not exposed to userspace. > Yeah, this is only used to check the communication for errors. > > > >> 0xE520 VNOM in_voltage_rms_nominal R/W 24 32 ZP S 0x000000 Nominal phase voltage rms used in the alternative computation of the apparent power. When the VNOMxEN bit is set, the applied voltage input in the corresponding phase is ignored and all corresponding rms voltage instances are replaced by the value in the VNOM register. > > Why would this be done? Sounds like something that is a circuit design time > > decision so a job for DT to me. > Yeah, I agree. > > > >> 0xE600 PHSTATUS in_current_phase_peak R 16 16 U N/A Phase peak register. See Table 41. > >> 0xE601 ANGLE0 register_ANGLE0 R 16 16 U N/A Time Delay 0. See the Time Interval Between Phases section for details. > >> 0xE602 ANGLE1 register_ANGLE1 R 16 16 U N/A Time Delay 1. See the Time Interval Between Phases section for details. > >> 0xE603 ANGLE2 register_ANGLE2 R 16 16 U N/A Time Delay 2. See the Time Interval Between Phases section for details. > > Hmm. More fun. These are derived values between to phase measurements. > > The phase as a modifier falls down a bit here - if we had just treated > > them as channels we could have done this a differential angle channel. > > Right now I'm not sure how we do this, could do it as a derived values so something like > > in_angle0_phaseA&phaseB_diff_raw etc but that feels odd. > > This one needs more thought. > > > >> 0xE604 to 0xE606 Reserved These addresses should not be written for proper operation. > >> 0xE607 PERIOD register_PERIOD R 16 16 U N/A Network line period. > > Superficially this sounds like a channel free element so shared_by_all. > > > >> 0xE608 PHNOLOAD register_PHNOLOAD R 16 16 U N/A Phase no load register. See Table 42. > > Hmm. So this is kind of a set of events with but without I think an interrupt. > > Odd. > > > >> 0xE60C LINECYC register_LINECYC R/W 16 16 U 0xFFFF Line cycle accumulation mode count. > > in_count0_raw probably though it's a bit of a stretch. > > > >> 0xE60D ZXTOUT register_ZXTOUT R/W 16 16 U 0xFFFF Zero-crossing timeout count. > > This is going to be another top level one I think and device specific for now. > > > >> 0xE60E COMPMODE register_COMPMODE R/W 16 16 U 0x01FF Computation-mode register. See Table 43. > > If there is stuff to control in here it need breaking out. > > > >> 0xE60F Gain register_Gain R/W 16 16 U 0x0000 PGA gains at ADC inputs. See Table 44. > > Oh goody another scale value. Needs breaking up into separate controls. > > Do these directly effect the measured output voltage etc? If they do then > > I'm not sure how to separate the two gains, there ought to be a 'right' > > answer. If this is about matching to the circuit present then they > > should probably be coming from DT or simillar. > > > > > >> 0xE610 CFMODE register_CFMODE R/W 16 16 U 0x0E88 CFx configuration register. See Table 45. > >> 0xE611 CF1DEN register_CF1DEN R/W 16 16 U 0x0000 CF1 denominator. > >> 0xE612 CF2DEN register_CF2DEN R/W 16 16 U 0x0000 CF2 denominator. > >> 0xE613 CF3DEN register_CF3DEN R/W 16 16 U 0x0000 CF3 denominator. > > Are these things that should be in DT? Look very quickly like they are todo with other circuits nearby. > Agreed > > > >> 0xE614 APHCAL register_APHCAL R/W 10 16 ZP S 0x0000 Phase calibration of Phase A. See Table 46. > >> 0xE615 BPHCAL register_BPHCAL R/W 10 16 ZP S 0x0000 Phase calibration of Phase B. See Table 46. > >> 0xE616 CPHCAL register__CPHCAL R/W 10 16 ZP S 0x0000 Phase calibration of Phase C. See Table 46. > > I'm not actually sure how you would set these. Per circuit design? > There should be some base calibration stored in DT and fine tuned calibration stored in an INI file or custom eeprom of nvram. Hmm. Then we need to expose them to userspace to allow that INI to be applied. Lets deal with the rest first and come back to these. May well need some device specific ABI which is always annoying.. > > > >> 0xE617 PHSIGN register_PHSIGN R 16 16 U N/A Power sign register. See Table 47. > >> 0xE618 CONFIG register_CONFIG R/W 16 16 U 0x0000 ADE7878 configuration register. See Table 48. > >> 0xE700 MMODE register__MMODE R/W 8 8 U 0x1C Measurement mode register. See Table 49. > >> 0xE701 ACCMODE register__ACCMODE R/W 8 8 U 0x00 Accumulation mode register. See Table 50. > >> 0xE702 LCYCMODE register_LCYCMODE R/W 8 8 U 0x78 Line accumulation mode behavior. See Table 52. > All to DT > >> 0xE703 PEAKCYC register_PEAKCYC R/W 8 8 U 0x00 Peak detection half line cycles. > >> 0xE704 SAGCYC register_SAGCYC R/W 8 8 U 0x00 SAG detection half line cycles. > > Some of these are event controls. Map them as such. > Agreed > > > >> 0xE705 CFCYC register_CFCYC R/W 8 8 U 0x01 Number of CF pulses between two consecutive energy latches. See the Synchronizing Energy Registers with CFx Outputs section. > >> 0xE706 HSDC_CFG register_HSDC_CFG R/W 8 8 U 0x00 HSDC configuration register. See Table 53. > DT > >> 0xE707 Version register_Version R 8 8 U Version of die. > Might want to expose this to User Space as there could be differences between die version > in_version0_raw > >> 0xEBFF Reserved 8 8 This address can be used in manipulating the SS/HSA pin when SPI is chosen as the active port. See the Serial Interfaces section for details. > >> 0xEC00 LPOILVL register_LPOILVL R/W 8 8 U 0x07 "Overcurrent threshold used during PSM2 mode (ADE7868 and ADE7878 > >> only). See Table 54 in which the register is detailed." > >> 0xEC01 CONFIG2 register_CONFIG2 R/W 8 8 U 0x00 Configuration register used during PSM1 mode. See Table 55. > All to DT > > > > As you can guess I was running out of stamina towards the end of that. > > > > I'm not totally sure of the answer I provided. It may take some more thought. > > Ideally some others will give input on this question. > > Thank you again for all your feedback. I’ll generate a new list and send it next. Cool. Jonathan > > Regards, > John > > > > Jonathan > >> > >> Regards, > >> John > >> > >> > >> > >> > >> > >>> On Mar 17, 2018, at 1:30 PM, Jonathan Cameron wrote: > >>> > >>> On Wed, 14 Mar 2018 23:12:02 -0700 > >>> John Syne wrote: > >>> > >>>> Hi Jonathan, > >>>> > >>>> I have been looking at the IIO ABI docs and if I understand > >>>> correctly, the idea is to use consistent naming conventions? So for > >>>> example, looking at the ADE7854 datasheet, the naming matching the > >>>> ADE7854 registers would be as follows: > >>> > >>> Welcome to one of the big reasons no one tidied these drivers > >>> up originally. Still we have moved on somewhat since then > >>> so similar circumstances have come up in other types of sensor. > >>> > >>>> > >>>> {direction}_{type}_{index}_{modifier}_{info_mask} > >>>> > >>>> AIGAIN - In_current_a_gain > >>> Other than the fact that gain isn't an ABI element and that index > >>> doesn't have > >>> _ before it that is right. > >>> in_voltageA_scale > >>> > >>> That was a weird quirk a long time back which we should probably > >>> not have done (copied it from hwmon) > >>> > >>>> AVGAIN - in_voltage_a_gain > >>>> BIGAIN - in_current_b_gain > >>>> BVGAIN - in_voltage_b_gain > >>>> — > >>>> How do we represent the rms and offset > >>>> AIRMSOS - in_current_a_rmsoffset > >>>> AVRMSOS - in_voltage_a_rmsoffset > >>> > >>> Right now we can't unfortunately though this one is easier to fix. > >>> We already have modifiers for multi axis devices doing sum_squared > >>> so add one of those for root_mean_square - this one is well known > >>> enough that rms is fine in the string. > >>> > >>> It's a effectively a different channel be it one derived from a simple > >>> one. This is going to get tricky however as we would normally use > >>> modifier to specialise a channel type - thoughts on this below. > >>> > >>>> — > >>>> Here I don’t understand how to represent both the phase and the active/reactive/apparent power components. Do we combine the phase and quadrature part like this > >>>> AVAGAIN - in_power_a_gain /* apparent power */ > >>>> — > >>>> AWGAIN - in_power_ai_gain /* active power */ > >>> And that is the problem. How do we represent the various power types. > >>> Hmm. We could do it with modifiers but above we show that we have already used them. > >>> > >>> It would be easy enough to add yet another field to the channel spec to specify > >>> this but there is a problem - Events. The event format is already pretty full > >>> so where do we put this extra element if we need to define a channel separated > >>> only by it. > >>> > >>> One thought is we could instead define these as different top level > >>> IIO_CHAN_TYPES in a similar fashion to we do for relative humidity vs > >>> the proposed absolute humidity. > >>> > >>> in_powerreactiveA_scale > >>> in_poweractivceA_scale > >>> (or in_powerrealA_scale to match with what I got taught years ago?) > >>> > >>> I presume we keep in_powerA_scale etc for the apparent power and > >>> modify any docs to make that clear. > >>> > >>>> — > >>>> AVARGAIN - in_power_aq_gain /* reactive power */ > >>>> — > >>>> Now here it becomes more complicated. Not sure how this gets handled. > >>>> AFWATTOS - in_power_a_active/fundamental/offset > >>> Yeah, some of these are getting odd. > >>> If I read this correctly this is the active power estimate based on only > >>> the fundamental frequency - so no harmonics? > >>> > >>> Hmm. This then becomes a separate channel with additional properties > >>> specifying it is only the fundamental. This feels a bit like a filter > >>> be it an unusual one? Might just be necessary to add a _fundamental_only > >>> element on the end (would be info_mask if this is common enough to > >>> justify that rather than using the extended methods to define it.). > >>> > >>> > >>>> — > >>>> AWATTHR - in_energy_ai_accumulation > >>> Great, just when I thought we had gone far enough they define reactive > >>> energy which is presumably roughly the same as reactivepower * time? > >>> In that case we need types for that as well. > >>> in_energyreactiveA_* > >>> in_energyactiveA_* > >>> > >>>> — > >>>> AVARHR - in_energy_aq_accumulation > >>>> — > >>>> IPEAK - in_current_peak > >>> That one is easy as we have an info_mask element for peak and one > >>> for peak_scale that has always been a bit odd but was needed somewhere. > >>> > >>>> — > >>>> > >>>> I’ll leave it there, because there are some even more complicated register naming issues. > >>> Something to look forward to. Gah, I always hated power engineering > >>> though I taught it very briefly (I really pity those students :( > >>> > >>> Jonathan > >>> > >>>> > >>>> Regards, > >>>> John > >>>> > >>>> > >>>> > >>>> > >>>> > >>>>> On Mar 10, 2018, at 7:10 AM, Jonathan Cameron wrote: > >>>>> > >>>>> On Thu, 8 Mar 2018 21:37:33 -0300 > >>>>> Rodrigo Siqueira wrote: > >>>>> > >>>>>> On 03/07, Jonathan Cameron wrote: > >>>>>>> On Tue, 6 Mar 2018 21:43:47 -0300 > >>>>>>> Rodrigo Siqueira wrote: > >>>>>>> > >>>>>>>> The macro IIO_DEV_ATTR_CH_OFF is a wrapper for IIO_DEVICE_ATTR, with a > >>>>>>>> tiny change in the name definition. This extra macro does not improve > >>>>>>>> the readability and also creates some checkpatch errors. > >>>>>>>> > >>>>>>>> This patch fixes the checkpatch.pl errors: > >>>>>>>> > >>>>>>>> staging/iio/meter/ade7753.c:391: ERROR: Use 4 digit octal (0777) not > >>>>>>>> decimal permissions > >>>>>>>> staging/iio/meter/ade7753.c:395: ERROR: Use 4 digit octal (0777) not > >>>>>>>> decimal permissions > >>>>>>>> staging/iio/meter/ade7759.c:331: ERROR: Use 4 digit octal (0777) not > >>>>>>>> decimal permissions > >>>>>>>> staging/iio/meter/ade7759.c:335: ERROR: Use 4 digit octal (0777) not > >>>>>>>> decimal permissions > >>>>>>>> > >>>>>>>> Signed-off-by: Rodrigo Siqueira > >>>>>>> > >>>>>>> Hmm. I wondered a bit about this one. It's a correct patch in of > >>>>>>> itself but the interface in question doesn't even vaguely conform > >>>>>>> to any of defined IIO ABI. Anyhow, it's still and improvement so > >>>>>>> I'll take it. > >>>>>> > >>>>>> I am not sure if I understood the comment about the ABI. The meter > >>>>>> interface is wrong because it uses things like IIO_DEVICE_ATTR? It > >>>>>> should use iio_info together with *write_raw and *read_raw. Right? Is it > >>>>>> the ABI problem that you refer? > >>>>> The ABI is about the userspace interface of IIO. It is defined > >>>>> in Documentation/ABI/testing/sysfs-bus-iio* > >>>>> So this documents the naming of sysfs attributes and (more or less) > >>>>> describes a consistent interface to userspace across lots of different > >>>>> types of devices. > >>>>> > >>>>> A lot of these older drivers in staging involve a good deal of ABI that > >>>>> was not reviewed or discussed. That is one of the biggest reasons we > >>>>> didn't take them out of staging in the first place. > >>>>> > >>>>> In order for generic userspace programs to have any idea what to do > >>>>> with these devices this all needs to be fixed. > >>>>> > >>>>> There may well be cases where we need to expand the existing ABI to > >>>>> cover new things. That's fine, but it has to be done with full > >>>>> review of the relevant documentation patches. > >>>>> > >>>>> Incidentally if you want an easy driver to work on moving out of staging > >>>>> then first thing to do is to compare what it shows to userspace with these > >>>>> docs. If it's totally different then you have a big job on your hands > >>>>> as often ABI can take a lot of discussion and a long time to establish > >>>>> a consensus. > >>>>> > >>>>> Jonathan > >>>>> > >>>>> > >>>>>> > >>>>>> Thanks :) > >>>>>> > >>>>>>> Applied to the togreg branch of iio.git and pushed out as testing > >>>>>>> for the autobuilders to play with it. > >>>>>>> > >>>>>>> I also added the removal of the header define which is no > >>>>>>> longer used. > >>>>>>> > >>>>>>> Please note, following discussions with Michael, I am going to send > >>>>>>> an email announcing an intent to drop these meter drivers next > >>>>>>> cycle unless someone can provide testing for any attempt to > >>>>>>> move them out of staging. I'm still taking patches on the basis > >>>>>>> that 'might' happen - but I wouldn't focus on these until we > >>>>>>> have some certainty on whether they will be around long term! > >>>>>>> > >>>>>>> Jonathan > >>>>>>> > >>>>>>>> --- > >>>>>>>> drivers/staging/iio/meter/ade7753.c | 18 ++++++++++-------- > >>>>>>>> drivers/staging/iio/meter/ade7759.c | 18 ++++++++++-------- > >>>>>>>> 2 files changed, 20 insertions(+), 16 deletions(-) > >>>>>>>> > >>>>>>>> diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c > >>>>>>>> index c44eb577dc35..275e8dfff836 100644 > >>>>>>>> --- a/drivers/staging/iio/meter/ade7753.c > >>>>>>>> +++ b/drivers/staging/iio/meter/ade7753.c > >>>>>>>> @@ -388,14 +388,16 @@ static IIO_DEV_ATTR_VPERIOD(0444, > >>>>>>>> ade7753_read_16bit, > >>>>>>>> NULL, > >>>>>>>> ADE7753_PERIOD); > >>>>>>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644, > >>>>>>>> - ade7753_read_8bit, > >>>>>>>> - ade7753_write_8bit, > >>>>>>>> - ADE7753_CH1OS); > >>>>>>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644, > >>>>>>>> - ade7753_read_8bit, > >>>>>>>> - ade7753_write_8bit, > >>>>>>>> - ADE7753_CH2OS); > >>>>>>>> + > >>>>>>>> +static IIO_DEVICE_ATTR(choff_1, 0644, > >>>>>>>> + ade7753_read_8bit, > >>>>>>>> + ade7753_write_8bit, > >>>>>>>> + ADE7753_CH1OS); > >>>>>>>> + > >>>>>>>> +static IIO_DEVICE_ATTR(choff_2, 0644, > >>>>>>>> + ade7753_read_8bit, > >>>>>>>> + ade7753_write_8bit, > >>>>>>>> + ADE7753_CH2OS); > >>>>>>>> > >>>>>>>> static int ade7753_set_irq(struct device *dev, bool enable) > >>>>>>>> { > >>>>>>>> diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c > >>>>>>>> index 1decb2b8afab..c078b770fa53 100644 > >>>>>>>> --- a/drivers/staging/iio/meter/ade7759.c > >>>>>>>> +++ b/drivers/staging/iio/meter/ade7759.c > >>>>>>>> @@ -328,14 +328,16 @@ static IIO_DEV_ATTR_ACTIVE_POWER_GAIN(0644, > >>>>>>>> ade7759_read_16bit, > >>>>>>>> ade7759_write_16bit, > >>>>>>>> ADE7759_APGAIN); > >>>>>>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644, > >>>>>>>> - ade7759_read_8bit, > >>>>>>>> - ade7759_write_8bit, > >>>>>>>> - ADE7759_CH1OS); > >>>>>>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644, > >>>>>>>> - ade7759_read_8bit, > >>>>>>>> - ade7759_write_8bit, > >>>>>>>> - ADE7759_CH2OS); > >>>>>>>> + > >>>>>>>> +static IIO_DEVICE_ATTR(choff_1, 0644, > >>>>>>>> + ade7759_read_8bit, > >>>>>>>> + ade7759_write_8bit, > >>>>>>>> + ADE7759_CH1OS); > >>>>>>>> + > >>>>>>>> +static IIO_DEVICE_ATTR(choff_2, 0644, > >>>>>>>> + ade7759_read_8bit, > >>>>>>>> + ade7759_write_8bit, > >>>>>>>> + ADE7759_CH2OS); > >>>>>>>> > >>>>>>>> static int ade7759_set_irq(struct device *dev, bool enable) > >>>>>>>> { > >>>>>>> > >>>>>> -- > >>>>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in > >>>>>> the body of a message to majordomo@vger.kernel.org > >>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html > >>>>> > >>>>> _______________________________________________ > >>>>> devel mailing list > >>>>> devel@linuxdriverproject.org > >>>>> http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel > >>>> > >>> > >> > > > >