From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B0024C4338F for ; Mon, 26 Jul 2021 14:32:23 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5F63E60F23 for ; Mon, 26 Jul 2021 14:32:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 5F63E60F23 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 156B516FB; Mon, 26 Jul 2021 16:31:30 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 156B516FB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1627309940; bh=9fs7tslMh1prUEYA/QkKsRBWaDgZ7nrYEvIWIkBVZvY=; h=Subject:From:To:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=ULfnKdveQpIwb6TDgELGe9uDaMU2E7NgDDxqqEpPEBPgBVl+SC3ISgLXNv1CoEo5q 3G5ez/BVrwgCWXpNTNURDsB1lUc0RJgCbwHPwPI9oNB+hrQSG4A8ZCQ3zBx2EQi8y9 dRQe18ctYb1x3+BoF1o5HY+6ldTAofU3vbzmSX9c= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id A014FF80253; Mon, 26 Jul 2021 16:31:29 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 6942FF8025A; Mon, 26 Jul 2021 16:31:27 +0200 (CEST) Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id A69F1F80132 for ; Mon, 26 Jul 2021 16:31:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz A69F1F80132 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="pqN7wlCo" X-UUID: 553247dd14f2407ea272fc0770140fa5-20210726 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=9fs7tslMh1prUEYA/QkKsRBWaDgZ7nrYEvIWIkBVZvY=; b=pqN7wlCoC0PTzj7/i/MywIE2CZmJsI+fCBYAXqM3uTPQ4ElSPnjc+cncCJM4p9rRzPpefNlSoaQn+Q2YD96geBRQz47IUPpcByRQyHk6BX451T7Pn4zbngpFbhxKfiGitcH6LzkR1IBEvFfJds4pfRQJ4cwYzHVREuy6SgeLY64=; X-UUID: 553247dd14f2407ea272fc0770140fa5-20210726 Received: from mtkcas06.mediatek.inc [(172.21.101.30)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1662838556; Mon, 26 Jul 2021 22:31:07 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs06n1.mediatek.inc (172.21.101.129) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 26 Jul 2021 22:31:06 +0800 Received: from mtksdccf07 (172.21.84.99) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 26 Jul 2021 22:31:06 +0800 Message-ID: Subject: Re: [PATCH v2 5/8] ASoC: mediatek: mt8195: add platform driver From: Trevor Wu To: Chen-Yu Tsai Date: Mon, 26 Jul 2021 22:31:06 +0800 In-Reply-To: References: <20210629014736.31153-1-trevor.wu@mediatek.com> <20210629014736.31153-6-trevor.wu@mediatek.com> <9929a3a20df1a89fc94baf7c75c0c65d9a61de0f.camel@mediatek.com> <266fd1f5de56743292ac5fc64664113c0bb0e41a.camel@mediatek.com> <31bcc613abb0f805400faa8b8108100cb578d9b1.camel@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Cc: devicetree@vger.kernel.org, alsa-devel@alsa-project.org, Jimmy Cheng-Yi Chiang , Chun-Jie Chen , tiwai@suse.com, Rob Herring , LKML , broonie@kernel.org, linux-mediatek@lists.infradead.org, Jiaxin Yu , Matthias Brugger , Li-Yu Yu , bicycle.tsai@mediatek.com, linux-arm-kernel@lists.infradead.org X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" T24gRnJpLCAyMDIxLTA3LTIzIGF0IDE0OjI3ICswODAwLCBDaGVuLVl1IFRzYWkgd3JvdGU6DQo+ IE9uIFRodSwgSnVsIDIyLCAyMDIxIGF0IDQ6NTYgUE0gVHJldm9yIFd1IDx0cmV2b3Iud3VAbWVk aWF0ZWsuY29tPg0KPiB3cm90ZToNCj4gPiANCj4gPiBPbiBNb24sIDIwMjEtMDctMTkgYXQgMTg6 MDUgKzA4MDAsIENoZW4tWXUgVHNhaSB3cm90ZToNCj4gPiA+IEhpLA0KPiA+ID4gDQo+ID4gPiBP biBUaHUsIEp1bCAxNSwgMjAyMSBhdCA3OjA1IFBNIFRyZXZvciBXdSA8dHJldm9yLnd1QG1lZGlh dGVrLmNvbQ0KPiA+ID4gPg0KPiA+ID4gd3JvdGU6DQo+ID4gPiA+IA0KPiA+ID4gPiBPbiBUdWUs IDIwMjEtMDctMTMgYXQgMTQ6MDAgKzA4MDAsIENoZW4tWXUgVHNhaSB3cm90ZToNCj4gPiA+ID4g PiBPbiBNb24sIEp1bCAxMiwgMjAyMSBhdCAxMToxMCBQTSBUcmV2b3IgV3UgPA0KPiA+ID4gPiA+ IHRyZXZvci53dUBtZWRpYXRlay5jb20+DQo+ID4gPiA+ID4gd3JvdGU6DQo+ID4gPiA+ID4gPiAN Cj4gPiA+ID4gPiA+IE9uIE1vbiwgMjAyMS0wNy0xMiBhdCAxNDo1NyArMDgwMCwgQ2hlbi1ZdSBU c2FpIHdyb3RlOg0KPiA+ID4gPiA+ID4gPiAgYXJlIGFsbCBpbnRlcm5hbCBIaSwNCj4gPiA+ID4g PiA+ID4gDQo+ID4gPiA+ID4gPiA+IE9uIFR1ZSwgSnVuIDI5LCAyMDIxIGF0IDk6NDkgQU0gVHJl dm9yIFd1IDwNCj4gPiA+ID4gPiA+ID4gdHJldm9yLnd1QG1lZGlhdGVrLmNvbQ0KPiA+ID4gPiA+ ID4gPiA+IA0KPiA+ID4gPiA+ID4gPiANCj4gPiA+ID4gPiA+ID4gd3JvdGU6DQo+ID4gPiA+ID4g PiA+ID4gDQo+ID4gPiA+ID4gPiA+ID4gVGhpcyBwYXRjaCBhZGRzIG10ODE5NSBwbGF0Zm9ybSBh bmQgYWZmaWxpYXRlZCBkcml2ZXIuDQo+ID4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+ID4g U2lnbmVkLW9mZi1ieTogVHJldm9yIFd1IDx0cmV2b3Iud3VAbWVkaWF0ZWsuY29tPg0KPiA+ID4g PiA+ID4gPiA+IC0tLQ0KPiA+ID4gPiA+ID4gPiA+ICBzb3VuZC9zb2MvbWVkaWF0ZWsvS2NvbmZp ZyAgICAgICAgICAgICAgICAgICAgIHwgICAgOQ0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4g PiA+ID4gPiAgc291bmQvc29jL21lZGlhdGVrL01ha2VmaWxlICAgICAgICAgICAgICAgICAgIHwg ICAgMSArDQo+ID4gPiA+ID4gPiA+ID4gIHNvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvTWFrZWZp bGUgICAgICAgICAgICB8ICAgMTEgKw0KPiA+ID4gPiA+ID4gPiA+ICBzb3VuZC9zb2MvbWVkaWF0 ZWsvbXQ4MTk1L210ODE5NS1hZmUtY2xrLmMgICAgfCAgODk5DQo+ID4gPiA+ID4gPiA+ID4gKysr KysNCj4gPiA+ID4gPiA+ID4gPiAgc291bmQvc29jL21lZGlhdGVrL210ODE5NS9tdDgxOTUtYWZl LWNsay5oICAgIHwgIDIwMSArDQo+ID4gPiA+ID4gPiA+ID4gIHNvdW5kL3NvYy9tZWRpYXRlay9t dDgxOTUvbXQ4MTk1LWFmZS1jb21tb24uaCB8ICAyMDAgKw0KPiA+ID4gPiA+ID4gPiA+ICBzb3Vu ZC9zb2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS1hZmUtcGNtLmMgICAgfCAzMjY0DQo+ID4gPiA+ ID4gPiA+ID4gKysrKysrKysrKysrKysrKysNCj4gPiA+ID4gPiA+ID4gPiAgc291bmQvc29jL21l ZGlhdGVrL210ODE5NS9tdDgxOTUtcmVnLmggICAgICAgIHwgMjc5Mw0KPiA+ID4gPiA+ID4gPiA+ ICsrKysrKysrKysrKysrDQo+ID4gPiA+ID4gPiA+ID4gIDggZmlsZXMgY2hhbmdlZCwgNzM3OCBp bnNlcnRpb25zKCspDQo+ID4gPiA+ID4gPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9z b2MvbWVkaWF0ZWsvbXQ4MTk1L01ha2VmaWxlDQo+ID4gPiA+ID4gPiA+ID4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBzb3VuZC9zb2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS0NCj4gPiA+ID4gPiA+ID4g PiBhZmUtDQo+ID4gPiA+ID4gPiA+ID4gY2xrLmMNCj4gPiA+ID4gPiA+ID4gPiAgY3JlYXRlIG1v ZGUgMTAwNjQ0IHNvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvbXQ4MTk1LQ0KPiA+ID4gPiA+ID4g PiA+IGFmZS0NCj4gPiA+ID4gPiA+ID4gPiBjbGsuaA0KPiA+ID4gPiA+ID4gPiA+ICBjcmVhdGUg bW9kZSAxMDA2NDQgc291bmQvc29jL21lZGlhdGVrL210ODE5NS9tdDgxOTUtDQo+ID4gPiA+ID4g PiA+ID4gYWZlLQ0KPiA+ID4gPiA+ID4gPiA+IGNvbW1vbi5oDQo+ID4gPiA+ID4gPiA+ID4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS0NCj4gPiA+ ID4gPiA+ID4gPiBhZmUtDQo+ID4gPiA+ID4gPiA+ID4gcGNtLmMNCj4gPiA+ID4gPiA+ID4gPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvbXQ4MTk1LQ0KPiA+ ID4gPiA+ID4gPiA+IHJlZy5oDQo+ID4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+ID4gZGlm ZiAtLWdpdCBhL3NvdW5kL3NvYy9tZWRpYXRlay9LY29uZmlnDQo+ID4gPiA+ID4gPiA+ID4gYi9z b3VuZC9zb2MvbWVkaWF0ZWsvS2NvbmZpZw0KPiA+ID4gPiA+ID4gPiA+IGluZGV4IDc0ZGFlNDMz MmQxNy4uMzM4OWYzODJiZTA2IDEwMDY0NA0KPiA+ID4gPiA+ID4gPiA+IC0tLSBhL3NvdW5kL3Nv Yy9tZWRpYXRlay9LY29uZmlnDQo+ID4gPiA+ID4gPiA+ID4gKysrIGIvc291bmQvc29jL21lZGlh dGVrL0tjb25maWcNCj4gPiA+ID4gPiA+ID4gPiBAQCAtMTg0LDMgKzE4NCwxMiBAQCBjb25maWcN Cj4gPiA+ID4gPiA+ID4gPiBTTkRfU09DX01UODE5Ml9NVDYzNTlfUlQxMDE1X1JUNTY4Mg0KPiA+ ID4gPiA+ID4gPiA+ICAgICAgICAgICB3aXRoIHRoZSBNVDYzNTkgUlQxMDE1IFJUNTY4MiBhdWRp byBjb2RlYy4NCj4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgU2VsZWN0IFkgaWYgeW91IGhhdmUg c3VjaCBkZXZpY2UuDQo+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgIElmIHVuc3VyZSBzZWxlY3Qg Ik4iLg0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiArY29uZmlnIFNORF9TT0Nf TVQ4MTk1DQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICB0cmlzdGF0ZSAiQVNvQyBzdXBwb3J0IGZv ciBNZWRpYXRlayBNVDgxOTUNCj4gPiA+ID4gPiA+ID4gPiBjaGlwIg0KPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgc2VsZWN0IFNORF9TT0NfTUVESUFURUsNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IGhlbHANCj4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgVGhpcyBhZGRzIEFTb0MgcGxhdGZvcm0g ZHJpdmVyIHN1cHBvcnQgZm9yDQo+ID4gPiA+ID4gPiA+ID4gTWVkaWF0ZWsNCj4gPiA+ID4gPiA+ ID4gPiBNVDgxOTUgY2hpcA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICB0aGF0IGNhbiBiZSB1 c2VkIHdpdGggb3RoZXIgY29kZWNzLg0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICBTZWxlY3Qg WSBpZiB5b3UgaGF2ZSBzdWNoIGRldmljZS4NCj4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgSWYg dW5zdXJlIHNlbGVjdCAiTiIuDQo+ID4gPiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL3NvdW5kL3Nv Yy9tZWRpYXRlay9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IGIvc291bmQvc29jL21lZGlhdGVr L01ha2VmaWxlDQo+ID4gPiA+ID4gPiA+ID4gaW5kZXggZjZjYjZiODUwOGUzLi4zNDc3OGNhMTIx MDYgMTAwNjQ0DQo+ID4gPiA+ID4gPiA+ID4gLS0tIGEvc291bmQvc29jL21lZGlhdGVrL01ha2Vm aWxlDQo+ID4gPiA+ID4gPiA+ID4gKysrIGIvc291bmQvc29jL21lZGlhdGVrL01ha2VmaWxlDQo+ ID4gPiA+ID4gPiA+ID4gQEAgLTUsMyArNSw0IEBAIG9iai0kKENPTkZJR19TTkRfU09DX01UNjc5 NykgKz0gbXQ2Nzk3Lw0KPiA+ID4gPiA+ID4gPiA+ICBvYmotJChDT05GSUdfU05EX1NPQ19NVDgx NzMpICs9IG10ODE3My8NCj4gPiA+ID4gPiA+ID4gPiAgb2JqLSQoQ09ORklHX1NORF9TT0NfTVQ4 MTgzKSArPSBtdDgxODMvDQo+ID4gPiA+ID4gPiA+ID4gIG9iai0kKENPTkZJR19TTkRfU09DX01U ODE5MikgKz0gbXQ4MTkyLw0KPiA+ID4gPiA+ID4gPiA+ICtvYmotJChDT05GSUdfU05EX1NPQ19N VDgxOTUpICs9IG10ODE5NS8NCj4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvc291bmQvc29j L21lZGlhdGVrL210ODE5NS9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IGIvc291bmQvc29jL21l ZGlhdGVrL210ODE5NS9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0DQo+ID4gPiA+ID4gPiA+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5iMmM5ZmQ4OGYzOWUNCj4g PiA+ID4gPiA+ID4gPiAtLS0gL2Rldi9udWxsDQo+ID4gPiA+ID4gPiA+ID4gKysrIGIvc291bmQv c29jL21lZGlhdGVrL210ODE5NS9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IEBAIC0wLDAgKzEs MTEgQEANCj4gPiA+ID4gPiA+ID4gPiArIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MA0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiArIyBwbGF0Zm9ybSBkcml2ZXIN Cj4gPiA+ID4gPiA+ID4gPiArc25kLXNvYy1tdDgxOTUtYWZlLW9ianMgOj0gXA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgbXQ4MTk1LWFmZS1jbGsubyBcDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBtdDgxOTUtYWZlLXBjbS5vIFwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIG10ODE5NS1kYWkt YWRkYS5vIFwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIG10ODE5NS1kYWktZXRkbS5vIFwNCj4g PiA+ID4gPiA+ID4gPiArICAgICAgIG10ODE5NS1kYWktcGNtLm8NCj4gPiA+ID4gPiA+ID4gPiAr DQo+ID4gPiA+ID4gPiA+ID4gK29iai0kKENPTkZJR19TTkRfU09DX01UODE5NSkgKz0gc25kLXNv Yy1tdDgxOTUtYWZlLm8NCj4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL21l ZGlhdGVrL210ODE5NS9tdDgxOTUtYWZlLWNsay5jDQo+ID4gPiA+ID4gPiA+ID4gYi9zb3VuZC9z b2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS1hZmUtY2xrLmMNCj4gPiA+ID4gPiA+ID4gPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NA0KPiA+ID4gPiA+ID4gPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uNTdh YTc5OWI0ZjQxDQo+ID4gPiA+ID4gPiA+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ID4gPiA+ID4gPiA+ ICsrKyBiL3NvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvbXQ4MTk1LWFmZS1jbGsuYw0KPiA+ID4g PiA+ID4gPiA+IEBAIC0wLDAgKzEsODk5IEBADQo+ID4gPiA+ID4gPiA+ID4gKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQo+ID4gPiA+ID4gPiA+ID4gKy8qDQo+ID4gPiA+ID4g PiA+ID4gKyAqIG10ODE5NS1hZmUtY2xrLmMgIC0tICBNZWRpYXRlayA4MTk1IGFmZSBjbG9jayBj dHJsDQo+ID4gPiA+ID4gPiA+ID4gKyAqDQo+ID4gPiA+ID4gPiA+ID4gKyAqIENvcHlyaWdodCAo YykgMjAyMSBNZWRpYVRlayBJbmMuDQo+ID4gPiA+ID4gPiA+ID4gKyAqIEF1dGhvcjogQmljeWNs ZSBUc2FpIDxiaWN5Y2xlLnRzYWlAbWVkaWF0ZWsuY29tPg0KPiA+ID4gPiA+ID4gPiA+ICsgKiAg ICAgICAgIFRyZXZvciBXdSA8dHJldm9yLnd1QG1lZGlhdGVrLmNvbT4NCj4gPiA+ID4gPiA+ID4g PiArICovDQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICsjaW5jbHVkZSA8bGlu dXgvY2xrLmg+DQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICsjaW5jbHVkZSAi bXQ4MTk1LWFmZS1jb21tb24uaCINCj4gPiA+ID4gPiA+ID4gPiArI2luY2x1ZGUgIm10ODE5NS1h ZmUtY2xrLmgiDQo+ID4gPiA+ID4gPiA+ID4gKyNpbmNsdWRlICJtdDgxOTUtcmVnLmgiDQo+ID4g PiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICtzdGF0aWMgY29uc3QgY2hhciAqYXVkX2Ns a3NbTVQ4MTk1X0NMS19OVU1dID0gew0KPiA+ID4gPiA+ID4gPiANCj4gPiA+ID4gPiA+ID4gTW9z dCBvZiB0aGVzZSBjbG9ja3MgYXJlIG5vdCBkZXNjcmliZWQgaW4gdGhlIGRldmljZSB0cmVlDQo+ ID4gPiA+ID4gPiA+IGJpbmRpbmcuIElmDQo+ID4gPiA+ID4gPiA+IHRoZSBkcml2ZXIgbmVlZHMg dG8gcmVmZXJlbmNlIHRoZW0sIHRoZXkgc2hvdWxkIGJlDQo+ID4gPiA+ID4gPiA+IGRlc2NyaWJl ZC4NCj4gPiA+ID4gPiA+ID4gV2UNCj4gPiA+ID4gPiA+ID4gc2hvdWxkDQo+ID4gPiA+ID4gPiA+ IG5vdCBiZSBoYXJkLWNvZGluZyBjbG9jayBuYW1lcyBhY3Jvc3MgZGlmZmVyZW50IGRyaXZlcnMu DQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiBTb3JyeSwgSSBkaWRu J3Qga25vdyBJIGhhdmUgdG8gbGlzdCBhbGwgY2xvY2tzIGluIHRoZSBkdC0NCj4gPiA+ID4gPiA+ IGJpbmRpbmcuDQo+ID4gPiA+ID4gPiBPcmlnaW5hbGx5LCBJIHRob3VnaHQgdGhlc2UgY2xvY2tz IHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZQ0KPiA+ID4gPiA+ID4gY2xvY2sNCj4gPiA+ID4gPiA+ IGJpbmRpbmcsIHNvIEkgZGlkbid0IGFkZCB0aGVtIHRvIHRoZSBiaW5kaW5nIG9mIGFmZSBkcml2 ZXIuDQo+ID4gPiA+ID4gPiBJIHdpbGwgYWRkIHRoZXNlIGNsb2NrcyB0byBtdDgxOTUtYWZlLXBj bS55YW1sLg0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+IElmIHRoZSBkZXZpY2UgY29uc3VtZXMgY2xv Y2tzLCB0aGVuIHRoZSBjbG9ja3MgdGhhdCBnZXQNCj4gPiA+ID4gPiBjb25zdW1lZA0KPiA+ID4g PiA+IHNob3VsZA0KPiA+ID4gPiA+IGJlIGxpc3RlZCBpbiB0aGUgZGV2aWNlJ3MgYmluZGluZ3Mu IFRoaXMgaXMgbm90IHJlbGF0ZWQgdG8NCj4gPiA+ID4gPiB0aGUNCj4gPiA+ID4gPiBjbG9jaw0K PiA+ID4gPiA+IGJpbmRpbmdzLCB3aGljaCBpcyBhIGNsb2NrIHByb3ZpZGVyLg0KPiA+ID4gPiA+ IA0KPiA+ID4gPiANCj4gPiA+ID4gR290IGl0LiBUaGFua3MuDQo+ID4gPiA+IA0KPiA+ID4gPiA+ ID4gPiBUaGUgbW9yZSBpbXBvcnRhbnQgcXVlc3Rpb24gaXMsIHdoeSBkb2VzIHRoZSBkcml2ZXIg bmVlZA0KPiA+ID4gPiA+ID4gPiB0bw0KPiA+ID4gPiA+ID4gPiByZWZlcmVuY2UNCj4gPiA+ID4g PiA+ID4gYWxsIG9mIHRoZW0/IE1heWJlIHdlIHNob3VsZCB0YWtlIGEgc3RlcCBiYWNrIGFuZCBk cmF3DQo+ID4gPiA+ID4gPiA+IG91dCBhDQo+ID4gPiA+ID4gPiA+IGNsb2NrDQo+ID4gPiA+ID4g PiA+IHRyZWUNCj4gPiA+ID4gPiA+ID4gZGlhZ3JhbSBmb3IgdGhlIGhhcmR3YXJlPw0KPiA+ID4g PiA+ID4gPiANCj4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4gVGhlIGNsb2NrIHN0cnVjdHVyZSBp cyBQTEwgLT4gTVVYIC0+IEdBVEUuDQo+ID4gPiA+ID4gPiB4dGFsLCBwbGwgYW5kIGRpdmlkZXIg YXJlIHRoZSBwb3NzaWJsZSBjbG9jayBpbnB1dHMgZm9yDQo+ID4gPiA+ID4gPiBNVVguDQo+ID4g PiA+ID4gPiBCZWNhdXNlIHdlIHNlbGVjdCB0aGUgY2xvY2sgaW5wdXQgb2YgYXVkaW8gbW9kdWxl IGJhc2VkIG9uDQo+ID4gPiA+ID4gPiB0aGUNCj4gPiA+ID4gPiA+IHVzZQ0KPiA+ID4gPiA+ID4g Y2FzZSwgd2UgdXNlIGNsa19nZXQgdG8gcmV0cml2ZSBhbGwgY2xvY2tzIHdoaWNoIGFyZQ0KPiA+ ID4gPiA+ID4gcG9zc2libGUNCj4gPiA+ID4gPiA+IHRvIGJlDQo+ID4gPiA+ID4gPiB1c2VkLg0K PiA+ID4gPiA+IA0KPiA+ID4gPiA+IFNvIEkgc2VlIGEgY291cGxlIHRoZSBkcml2ZXIgaXMgZG9p bmcgcmVwYXJlbnRpbmc6DQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gICBhLiBSZXBhcmVudCBhdWRp b19oIHRvIHN0YW5kYXJkIG9zY2lsbGF0b3Igd2hlbiBBRERBIGlzIG5vdA0KPiA+ID4gPiA+IHVz ZWQsDQo+ID4gPiA+ID4gICAgICBwcmVzdW1hYmx5IHRvIGxldCB0aGUgQVBMTCBiZSB0dXJuZWQg b2ZmDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gV2h5IG5vdCBqdXN0IHR1cm4gb2ZmIGF1ZGlvX2g/ IEl0IGxvb2tzIGxpa2UgYXVkaW9faCBmZWVkcyBhDQo+ID4gPiA+ID4gY291cGxlDQo+ID4gPiA+ ID4gY2xvY2sNCj4gPiA+ID4gPiBnYXRlcyBpbiB0aGUgYXVkaW8gc3Vic3lzdGVtLiBKdXN0IGEg Z3Vlc3MsIGJ1dCBpcyB0aGlzIHRoZQ0KPiA+ID4gPiA+IEFIQg0KPiA+ID4gPiA+IGJ1cw0KPiA+ ID4gPiA+IGNsb2NrPw0KPiA+ID4gPiA+IFdoeSBub3QganVzdCBoYXZlIGl0IHBhcmVudGVkIHRv ICJ1bml2cGxsX2Q3IiBhbGwgdGhlIHRpbWUNCj4gPiA+ID4gPiB0aGVuPw0KPiA+ID4gPiA+IA0K PiA+ID4gPiANCj4gPiA+ID4gU29ycnksIEkgYW0gbm90IHN1cmUgaWYgaXQgaXMgdGhlIEFIQiBi dXMgY2xvY2suDQo+ID4gPiA+IEkgb25seSBrbm93IGhvdyBhdWRpbyBtb2R1bGUgdXNlcyB0aGUg Y2xvY2suDQo+ID4gPiA+IGF1ZGlvX2ggZmVlZHMgdG8gc29tZSBjbG9jayBnYXRlIGxpa2UgYXVk X2FkY19oaXJlcywgd2hpY2ggaXMNCj4gPiA+ID4gdXNlZA0KPiA+ID4gPiB3aGVuDQo+ID4gPiA+ IHNhbXBsaW5nIHJhdGUgaXMgaGlnaGVyIHRoYW4gNDhrSHosIGFuZCBoYXJkd2FyZSBkZXNpZ25l cg0KPiA+ID4gPiBzdWdnZXN0cw0KPiA+ID4gPiB1cw0KPiA+ID4gPiB1c2UgYXBsbDFfY2sgd2hl biBBRkUgcmVxdXJpcmVzIHRoZSBjbG9jay4NCj4gPiA+IA0KPiA+ID4gSSBzZWUuIFNvIHRoZSBz aW1wbGlmaWVkIGV4cGxhbmF0aW9uIGlzIGhpZ2ggY2xvY2sgcmF0ZSBmb3IgaGlnaA0KPiA+ID4g cmVzDQo+ID4gPiBhdWRpby4NCj4gPiA+IFdvdWxkIGhpZ2ggY2xvY2sgcmF0ZSB3b3JrIGZvciBz dGFuZGFyZCBzYW1wbGUgcmF0ZXM/DQo+ID4gDQo+ID4gQXMgZmFyIGFzIEkga25vdywgSFcgd2ls bCBzd2l0Y2ggY2xvY2sgdG8gaGlyZXMgY2xvY2sgYXV0b21hdGljYWxseQ0KPiA+IHdoZW4gdGhl IHJlcXVpcmVkIHJhdGUgaXMgaGlnaCwoZXg6IGF1ZF9hZGMgYW5kIGF1ZF9hZGNfaGlyZXMpIHNv DQo+ID4gaXQNCj4gPiBjYW4ndCBiZSBjb250cm9sbGVkIGJ5IGRyaXZlci4NCj4gDQo+IEkgc2Vl LiBUaGF0IG1pZ2h0IG5vdCBiZSBzbyBmcmllbmRseSB0byB0aGUgTGludXggY2xrIGRyaXZlci4N Cj4gDQo+ID4gPiBXb3VsZCB1c2luZyBhcGxsMSBvciB1bml2cGxsIGFsbCB0aGUgdGltZSB3b3Jr LCBpbnN0ZWFkIG9mDQo+ID4gPiByZXBhcmVudGluZz8NCj4gPiA+IFdoYXQncyB0aGUgZ2FpbiBp ZiB3ZSBkbyByZXBhcmVudGluZz8NCj4gPiA+IA0KPiA+IA0KPiA+IEFzIHlvdSBzYWlkIGJlZm9y ZSwgdGhlIGdhaW4gaXMgYXBsbCBjYW4gYmUgdHVybmVkIG9mZiB3aGVuIHRoZQ0KPiA+IGNsb2Nr DQo+ID4gaXMgbm90IHJlcXVyaXJlZCBieSBBRERBLiBUaGF0J3Mgd2h5IHdlIGRpZG4ndCB1c2Ug YXBsbCBhbGwgdGhlDQo+ID4gdGltZS4NCj4gDQo+IFJpZ2h0LCBhbmQgd2hhdCdzIHRoZSBnYWlu IGZyb20gdHVybmluZyBpdCBvZmY/IExvd2VyIHBvd2VyDQo+IGNvbnN1bXB0aW9uPw0KPiANCg0K WWVzLiBYdGFsXzI2bSBpcyBzdXBwbGllZCB0byBtb3N0IG1vZHVsZXMsIGJ1dCBBUExMMSBpcyBt YWlubHkgdXNlZCBieQ0KYWZlLiBXaGVuIGF1ZGlvIGZlYXR1cmUgaXMgbm90IHVzZWQsIHdlIGhv cGUgQVBMTDEgY2FuIGJlIHR1cm5lZCBvZmYgdG8NCmxvd2VyIHBvd2VyIGNvbnN1bXB0aW9uLg0K DQo+ID4gPiA+IEFzIEkga25vdywgRFNQIGFsc28gcmVxdWlyZXMgYXVkaW9faC4NCj4gPiA+ID4g V2hlbiB3ZSBkaXNhYmxlIHRoZSBjbG9jayBpbiBBRkUgZHJpdmVyLCB0aGUgcmVmIGNvdW50IGlu IENDRg0KPiA+ID4gPiBpcw0KPiA+ID4gPiBub3QNCj4gPiA+ID4gYmVjb21pbmcgemVybyBpZiBE U1Agc3RpbGwgdXNlcyBpdC4NCj4gPiA+ID4gQnV0IG9ubHkgQUZFIHJlcXVpcmVzIGhpZ2hlciBj bG9jayByYXRlLCBzbyB3ZSByZXBhcmVudCBhdWRpb19oDQo+ID4gPiA+IHRvDQo+ID4gPiA+IDI2 TQ0KPiA+ID4gPiB3aGVuIGl0J3Mgbm90IHJlcXVpcmVkIGluIGFkZGEgbW9kdWxlLg0KPiA+ID4g DQo+ID4gPiBJIHNlZS4gV291bGRuJ3QgcmVwYXJlbnRpbmcgdGhlIGNsb2NrIHdoaWxlIGl0IGlz IGluIHVzZSBieQ0KPiA+ID4gYW5vdGhlcg0KPiA+ID4gbW9kdWxlDQo+ID4gPiBjYXVzZSBnbGl0 Y2hlcz8NCj4gPiANCj4gPiBJIGNoZWNrZWQgd2l0aCB0aGUgRFNQIG93bmVyLg0KPiA+IGF1ZGlv X2ggY2xvY2sgaXMgcmVxdWlyZWQgZm9yIERTUCBidXMsIGJ1dCB0aGUgY2xvY2sgcmF0ZSBpcyBu b3QNCj4gPiBpbXBvcnRhbnQuDQo+ID4gVGhlIG9ubHkgdGhpbmcgaXQgY2FyZXMgaXMgYXVkaW9f aCBzaG91bGQgYmUgcG93ZXJlZCBvbiwgc28NCj4gPiByZXBhcmVudGluZw0KPiA+IGlzIGhhcm1s ZXNzIGZvciBEU1AuDQo+IA0KPiBPSy4NCj4gDQo+ID4gPiA+ID4gQWxzbywgcmVwYXJlbnRpbmcg cmVhbGx5IHNob3VsZCBiZSBkb25lIGltcGxpY2l0bHkgd2l0aA0KPiA+ID4gPiA+IGNsa19zZXRf cmF0ZSgpDQo+ID4gPiA+ID4gd2l0aCB0aGUgY2xvY2sgZHJpdmVyIHN1cHBvcnRpbmcgcmVwYXJl bnRpbmcgb24gcmF0ZSBjaGFuZ2VzLg0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+ICAgYi4gQXNzaWdu bWVudCBvZiBQTExzIGZvciBJMlMvUENNIE1DTEsgb3V0cHV0cw0KPiA+ID4gPiA+IA0KPiA+ID4g PiA+IElzIHRoZXJlIGEgcmVhc29uIGZvciBleHBsaWNpdCBhc3NpZ25tZW50LCBvdGhlciB0aGFu IGNsb2NrDQo+ID4gPiA+ID4gcmF0ZQ0KPiA+ID4gPiA+IGNvbmZsaWN0cz8NCj4gPiA+ID4gPiBD Q0Ygc3VwcG9ydHMgcmVxdWVzdGluZyBhbmQgbG9ja2luZyB0aGUgY2xvY2sgcmF0ZS4gQW5kDQo+ ID4gPiA+ID4gYWdhaW4sDQo+ID4gPiA+ID4gaW1wbGljaXQNCj4gPiA+ID4gPiByZXBhcmVudGlu ZyBzaG91bGQgYmUgdGhlIG5vcm0uIFRoZSBjbG9jayBkcml2ZXIncyBwdXJwb3NlIGlzDQo+ID4g PiA+ID4gdG8NCj4gPiA+ID4gPiBmdWxmaWxsDQo+ID4gPiA+ID4gYW55IGFuZCBhbGwgY2xvY2sg cmF0ZSByZXF1aXJlbWVudHMgZnJvbSBpdHMgY29uc3VtZXJzLiBUaGUNCj4gPiA+ID4gPiBjb25z dW1lcg0KPiA+ID4gPiA+IHNob3VsZA0KPiA+ID4gPiA+IG9ubHkgbmVlZCB0byBhc2sgZm9yIHRo ZSBjbG9jayByYXRlLCBub3QgYSBzcGVjaWZpYyBwYXJlbnQsDQo+ID4gPiA+ID4gdW5sZXNzDQo+ ID4gPiA+ID4gdGhlcmUNCj4gPiA+ID4gPiBhcmUgZGV0YWlscyB0aGF0IGFyZSBub3QgeWV0IGNv dmVyZWQgYnkgdGhlIENDRi4NCj4gPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+IEZvciBNQ0xL IG91dHB1dCwgd2Ugc2hvdWxkIGNvbmZpZ3VyZSBkaXZpZGVyIHRvIGdldCB0aGUgdGFyZ2V0DQo+ ID4gPiA+IHJhdGUsDQo+ID4gPiA+IGFuZCBpdCBjYW4gb25seSBkaXZpZGUgdGhlIGNsb2NrIGZy b20gY3VycmVudCBwYXJlbnQgc291cmNlLg0KPiA+ID4gPiBTbyB3ZSBzaG91bGQgZG8gcmVwYXJl bnQgdG8gZGl2aWRlcidzIHBhcmVudCBpbiBjYXNlIHRoZSBwYXJlbnQNCj4gPiA+ID4gcmF0ZSBp cw0KPiA+ID4gPiBub3QgYSBtdWx0aXBsZSBvZiB0YXJnZXQgcmF0ZS4NCj4gPiA+IA0KPiA+ID4g UmlnaHQuIFRoYXQgaXMgZXhwZWN0ZWQuIFdoYXQgSSdtIHNheWluZyBpcyB0aGF0IHRoZSBDQ0Yg cHJvdmlkZXMNCj4gPiA+IHRoZQ0KPiA+ID4gZnJhbWV3b3JrIGZvciBhdXRvbWF0aWNhbGx5IHJl cGFyZW50aW5nIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQNCj4gPiA+IGNsb2NrDQo+ID4gPiByYXRl LiBUaGlzIGlzIGRvbmUgaW4gdGhlIGNsb2NrIGRyaXZlcidzIC5kZXRlcm1pbmVfcmF0ZSBvcC4N Cj4gPiA+IA0KPiA+ID4gV2hlbiBwcm9wZXJseSBpbXBsZW1lbnRlZCwgYW5kIGFsc28gcmVzdHJp Y3Rpbmcgb3IgbG9ja2luZyB0aGUNCj4gPiA+IGNsb2NrDQo+ID4gPiByYXRlcw0KPiA+ID4gb2Yg dGhlIFBMTHMsIHRoZW4geW91IGNhbiBzaW1wbHkgcmVxdWVzdCBhIGNsb2NrIHJhdGUgb24gdGhl IGxlYWYNCj4gPiA+IGNsb2NrLA0KPiA+ID4gaW4gdGhpcyBjYXNlIG9uZSBvZiB0aGUgTUNMS3Ms IGFuZCB0aGUgQ0NGIGFuZCBjbG9jayBkcml2ZXIgd291bGQNCj4gPiA+IGhhbmRsZQ0KPiA+ID4g ZXZlcnl0aGluZyBlbHNlLiBUaGUgY29uc3VtZXIgc2hvdWxkIG5vdCBiZSByZXBhcmVudGluZyBj bG9ja3MNCj4gPiA+IG1hbnVhbGx5DQo+ID4gPiB1bmxlc3MgZm9yIGEgdmVyeSBnb29kIHJlYXNv biB3aGljaCBjYW5ub3QgYmUgc2F0aXNmaWVkIGJ5IHRoZQ0KPiA+ID4gQ0NGLg0KPiA+ID4gDQo+ ID4gDQo+ID4gSW4gc29tZSB1c2UgY2FzZXMsIHdlIHJlYWxseSBuZWVkIHRvIHJlcGFyZW50IGNs b2NrIG1hbnVhbGx5Lg0KPiA+IEZvciBleGFtcGxlLCBzcGRpZiBpbihzbGF2ZSkgLT4gLi4uLiAt PiBpMnMgb3V0KG1hc3RlcikNCj4gPiANCj4gPiBBUExMMy9BUExMNCBhcmUgcmVzZXJ2ZWQgZm9y IHNsYXZlIGlucHV0IGxpa2UgZWFyYyBpbiBvciBzcGRpZiBpbiwNCj4gPiB3aGljaCBjYW4gcmVm ZXIgdG8gdGhlIGV4dGVybmFsIGNsb2NrIHNvdXJjZS4oQVBMTDMgc3luY3Mgd2l0aA0KPiA+IGVh cmMsDQo+ID4gYW5kIEFQTEw0IHN5bmNzIHdpdGggc3BkaWYgaW4uKQ0KPiA+IA0KPiA+IFdoZW4g aTJzIG91dCBzZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UgdG8gQVBMTDQsIHRoaXMgbWFrZXMgc3Vy ZQ0KPiA+IHRoYXQNCj4gPiBzcGRpZiBpbiBhbmQgaTJzIG91dCB3b3JrcyBpbiB0aGUgc2FtZSBj bG9jayBzb3VyY2UuDQo+ID4gSWYgd2UganVzdCB1c2UgQVBMTDEvQVBMTDIgb24gaTJzIG91dCwg dGhlcmUgaXMgbGl0dGxlIHJhdGUNCj4gPiBtaXNtYXRjaA0KPiA+IGJldHdlZW4gZGF0YSBpbnB1 dCBhbmQgb3V0cHV0LiBGaW5hbGx5LCBpdCByZXN1bHRzIGluIFhSVU4uDQo+IA0KPiBJIHNlZSwg dGhhdCBtYWtlcyBtb3JlIHNlbnNlLg0KPiANCj4gPiBJZiB3ZSBvbmx5IHVzZSBzZXRfcmF0ZSwg aXQncyBwb3NzaWJsZSB0aGF0IGl0IGNhbid0IHN3aXRjaCB0byB0aGUNCj4gPiBleHBlY3RlZCBQ TEwgc291cmNlLCBiZWNhdXNlIHRoZSByYXRlIG9mIEFQTEwzL0FQTEw0IHNob3VsZCBiZQ0KPiA+ IGNsb3NlIHRvDQo+ID4gQVBMTDEvQVBMTDIuDQo+IA0KPiBXZWxsLCBpbiB0aGVvcnkgdGhlIEND RiBzaG91bGQgY2hvb3NlIHRoZSBvbmUgd2l0aCB0aGUgY2xvc2VzdCByYXRlLg0KPiBBbmQgaWYg QVBMTDMvQVBMTDQgaXMgYWxyZWFkeSB0cmFja2luZyB0aGUgZXh0ZXJuYWwgY2xvY2sgc291cmNl LCBpdHMNCj4gY2xvY2sgcmF0ZSBzaG91bGQgbWF0Y2guDQo+IA0KPiBJZiBpdCdzIGEgc3RhdGlj IHJlcXVpcmVtZW50LCBtYXliZSB3ZSBjb3VsZCByZXBsYWNlIHRoZSAqLW1jbGstDQo+IHNvdXJj ZQ0KPiBEVCBwcm9wZXJ0aWVzIHdpdGggc3RhbmRhcmQgYXNzaWduZWQtY2xvY2tzIGFuZCBhc3Np Z25lZC1jbG9jay0NCj4gcGFyZW50cz8NCj4gVGhpcyB3b3VsZCBnZXQgaGFuZGxlZCBieSBDQ0Yg ZGlyZWN0bHksIGFuZCB0aGVuIHRoZSBvbmx5IHRoaW5nIHRoZQ0KPiBjbGsgZHJpdmVyIGhhcyB0 byBkbyBpcyBtYWtlIHN1cmUgaXQgZG9lc24ndCBnZXQgcmVwYXJlbnRlZCBhZ2Fpbi4NCj4gDQo+ IE9yIGlzIHRoZXJlIGEgbmVlZCB0byBkbyByZXBhcmVudGluZyBhdCBydW50aW1lPw0KPiANCg0K Rm9yIHRoZSB1c2UgY2FzZSBvZiBBUExMMy9BUExMNCwgc3RhdGljIGFzc2lnbm1lbnQgc2hvdWxk IGJlIG9rLg0KDQpCdXQgSSBjaGVja2VkIHdpdGggQ0NGIG93bmVyLCB3ZSBjYW4ndCBqdXN0IHVz ZSBjbGtfc2V0X3JhdGUoZGl2aWRlciwNCnJhdGUpIHRvIGdldCBleHBlY3RlZCBNQ0xLIG91dHB1 dCwgYmVjYXVzZSByZXBhcmVudGluZyBNVVgNCmF1dG9tYXRpY2FsbHkgaXMgbm90IHN1cHBvcnRl ZCBub3cuIChQTEwgLT4gTVVYIC0+IGRpdmlkZXIpDQoNCldlIHN0aWxsIGhhdmUgdG8gY2FsbCBj bGtfc2V0X3BhcmVudCgpIGJlZm9yZSBjbGtfc2V0X3JhdGUoKS4gV2hpY2gNCm1lYW5zIHNvbWUg aW5mb3JtYXRpb24gc2hvdWxkIGJlIGdvdCBmcm9tIERUUyB0byBjaGVjayB3aGV0aGVyIHRoZSBQ TEwNCnNvdXJjZSBjYW4gYmUgc3dpdGNoZWQgb3Igbm90LCBzbyAqLW1jbGstc291cmNlIHNob3Vs ZCBiZSBrZWVwZWQgdG8NCmlkZW50aWZ5IHRoZSBjYXNlLg0KDQpUaGFua3MsDQpUcmV2b3INCg0K PiA+ID4gPiA+IEEgcmVsYXRlZCBxdWVzdGlvbjogdGhlIGNoaXAgaGFzIGZpdmUgQVBMTHMuIEhv dyBtYW55IE1DTEsNCj4gPiA+ID4gPiBjb21iaW5hdGlvbnMNCj4gPiA+ID4gPiBkb2VzIHRoZSBh cHBsaWNhdGlvbiBuZWVkIHRvIHN1cHBvcnQ/IEkgYXNzdW1lIHRoaXMgaW5jbHVkZXMNCj4gPiA+ ID4gPiB0aGUNCj4gPiA+ID4gPiBzdGFuZGFyZA0KPiA+ID4gPiA+IDI0LjU3NiBNSHogYW5kIDIy LjU3OTIgTUh6IGNsb2NrIHJhdGVzLg0KPiA+ID4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gQVBM TDEgYW5kIEFQTEwyIGFyZSB1c2VkIGluIG1vc3QgQUZFIG1vZHVsZXMsIHNvIHRoZWlyIHJhdGUN Cj4gPiA+ID4gc2hvdWxkDQo+ID4gPiA+IGJlDQo+ID4gPiA+IGZpeGVkLg0KPiA+ID4gPiBBUExM MSBpcyBmaXhlZCB0byAxOTY2MDgwMDBIei4NCj4gPiA+ID4gQVBMTDIgaXMgZml4ZWQgdG8gMTgw NjMzNjAwSHouDQo+ID4gPiA+IEFQTEwgaXMgaW5wdXRlZCB0byB0aGUgZGl2aWRlcig4Yml0KSwg YW5kIE1DTEsgaXMgdGhlIG91dHB1dCBvZg0KPiA+ID4gPiBkaXZpZGVyLg0KPiA+ID4gPiBPdGhl ciBBUExMcyBhcmUgcmVzZXJ2ZWQgZm9yIHNvbWUgc3BlY2lhbCB1c2FnZSB3aGljaCBjYW4ndCBi ZQ0KPiA+ID4gPiBzdXBwb3J0ZWQgYnkgQVBMTDEgJiBBUExMMi4NCj4gPiA+ID4gQnV0IEFQTEwz fkFQTEw1IGFyZW4ndCB1c2VkIGluIHRoZSBzZXJpZXMsIHNvIEkgd2lsbCByZW1vdmUNCj4gPiA+ ID4gdGhlbSBpbg0KPiA+ID4gPiB2My4NCj4gPiA+ID4gDQo+ID4gPiA+ID4gPiBTb21lIG9mIHRo ZW0gYXJlIG5vdCB1c2VkIGluIHRoaXMgc2VyaWVzLCBiZWNhdXNlIHNvbWUNCj4gPiA+ID4gPiA+ IG1vZHVsZXMNCj4gPiA+ID4gPiA+IGFyZQ0KPiA+ID4gPiA+ID4gc3RpbGwgZGV2ZWxvcGluZy4g U2hvdWxkIEkgb25seSBrZWVwIHRoZSBjbG9ja3MgdGhhdCBoYXZlDQo+ID4gPiA+ID4gPiBiZWVu DQo+ID4gPiA+ID4gPiB1c2VkDQo+ID4gPiA+ID4gPiBpbg0KPiA+ID4gPiA+ID4gdGhlIHNlcmll cz8NCj4gPiA+ID4gPiANCj4gPiA+ID4gPiBZZXMgcGxlYXNlLiBPbmx5IGFkZCB0aGUgb25lcyB0 aGF0IGFyZSB1c2VkLiBUaGluZ3MgdGhhdA0KPiA+ID4gPiA+IGFyZW4ndA0KPiA+ID4gPiA+IHVz ZWQNCj4gPiA+ID4gPiBkb24ndCBnZXQgdGVzdGVkIGFuZCB2ZXJpZmllZCwgYW5kIGVuZCB1cCBh cyBkZWFkIGNvZGUuIElmDQo+ID4gPiA+ID4gdGhlcmUNCj4gPiA+ID4gPiBhcmUNCj4gPiA+ID4g PiBwbGFucyB0byBleHRlbmQgdGhlbSBpbiB0aGUgZnV0dXJlLCBhbmQgeW91IGNhbiBsZWF2ZQ0K PiA+ID4gPiA+IGNvbW1lbnRzDQo+ID4gPiA+ID4gc3RhdGluZw0KPiA+ID4gPiA+IHRoYXQgaW50 ZW50LCBhbmQgYWxzbyBtZW50aW9uIGl0IGluIHRoZSBjb3ZlciBsZXR0ZXIuDQo+ID4gPiA+ID4g DQo+ID4gPiA+IA0KPiA+ID4gPiBPSywgSSB3aWxsIHJlbW92ZSB0aGUgdW51c2VkIGNsb2NrIGlu IHYzLg0KPiA+ID4gPiANCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIC8qIHh0YWwgKi8NCj4gPiA+ ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1hUQUxfMjZNXSA9ICJjbGsyNm0iLA0KPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgLyogcGxsICovDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBb TVQ4MTk1X0NMS19BUE1JWEVEX0FQTEwxXSA9ICJhcGxsMSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEwyXSA9ICJhcGxsMiIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEwzXSA9ICJhcGxsMyIsDQo+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEw0XSA9ICJhcGxsNCIsDQo+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEw1XSA9ICJhcGxs NSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0hETUlSWF9B UExMXSA9DQo+ID4gPiA+ID4gPiA+ID4gImhkbWlyeF9hcGxsIiwNCj4gPiA+ID4gPiA+ID4gPiAr ICAgICAgIC8qIGRpdmlkZXIgKi8NCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xL X1RPUF9BUExMMV0gPSAiYXBsbDFfY2siLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfVE9QX0FQTEwxX0Q0XSA9ICJhcGxsMV9kNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19UT1BfQVBMTDJdID0gImFwbGwyX2NrIiwNCj4gPiA+ID4gPiA+ID4gPiAr ICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMMl9ENF0gPSAiYXBsbDJfZDQiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQTEwzXSA9ICJhcGxsM19jayIsDQo+ID4g PiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQVBMTDNfRDRdID0gImFwbGwzX2Q0 IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMNF0gPSAiYXBs bDRfY2siLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQTEw0X0Q0 XSA9ICJhcGxsNF9kNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1Bf QVBMTDVdID0gImFwbGw1X2NrIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xL X1RPUF9BUExMNV9ENF0gPSAiYXBsbDVfZDQiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01U ODE5NV9DTEtfVE9QX0FQTEwxMl9ESVYwXSA9ICJhcGxsMTJfZGl2MCIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQVBMTDEyX0RJVjFdID0gImFwbGwxMl9kaXYxIiwN Cj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMMTJfRElWMl0gPSAi YXBsbDEyX2RpdjIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQ TEwxMl9ESVYzXSA9ICJhcGxsMTJfZGl2MyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4 MTk1X0NMS19UT1BfQVBMTDEyX0RJVjRdID0gImFwbGwxMl9kaXY0IiwNCj4gPiA+ID4gPiA+ID4g PiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMMTJfRElWOV0gPSAiYXBsbDEyX2RpdjkiLA0K PiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0hETUlSWF9BUExMXSA9DQo+ ID4gPiA+ID4gPiA+ID4gImhkbWlyeF9hcGxsX2NrIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX1RPUF9NQUlOUExMX0Q0X0Q0XSA9DQo+ID4gPiA+ID4gPiA+ID4gIm1haW5w bGxfZDRfZDQiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX01BSU5Q TExfRDVfRDJdID0NCj4gPiA+ID4gPiA+ID4gPiAibWFpbnBsbF9kNV9kMiIsDQo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfTUFJTlBMTF9EN19EMl0gPQ0KPiA+ID4gPiA+ ID4gPiA+ICJtYWlucGxsX2Q3X2QyIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVf Q0xLX1RPUF9VTklWUExMX0Q0XSA9ICJ1bml2cGxsX2Q0IiwNCj4gPiA+ID4gPiA+ID4gPiArICAg ICAgIC8qIG11eCAqLw0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQ TEwxX1NFTF0gPSAiYXBsbDFfc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVf Q0xLX1RPUF9BUExMMl9TRUxdID0gImFwbGwyX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19UT1BfQVBMTDNfU0VMXSA9ICJhcGxsM19zZWwiLA0KPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQTEw0X1NFTF0gPSAiYXBsbDRfc2VsIiwNCj4g PiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMNV9TRUxdID0gImFwbGw1 X3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQTFTWVNfSFBf U0VMXSA9ICJhMXN5c19ocF9zZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9D TEtfVE9QX0EyU1lTX1NFTF0gPSAiYTJzeXNfc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX1RPUF9BM1NZU19TRUxdID0gImEzc3lzX3NlbCIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQTRTWVNfU0VMXSA9ICJhNHN5c19zZWwiLA0KPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FTTV9IX1NFTF0gPSAiYXNtX2hf c2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BU01fTV9TRUxd ID0gImFzbV9tX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1Bf QVNNX0xfU0VMXSA9ICJhc21fbF9zZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfVE9QX0FVRF9JRUNfU0VMXSA9ICJhdWRfaWVjX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQVVEX0lOVEJVU19TRUxdID0NCj4gPiA+ID4gPiA+ID4g PiAiYXVkX2ludGJ1c19zZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf VE9QX0FVRElPX0hfU0VMXSA9ICJhdWRpb19oX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19UT1BfQVVESU9fTE9DQUxfQlVTX1NFTF0gPQ0KPiA+ID4gPiA+ID4gPiA+ ICJhdWRpb19sb2NhbF9idXNfc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVf Q0xLX1RPUF9EUFRYX01fU0VMXSA9ICJkcHR4X21fc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAg ICAgIFtNVDgxOTVfQ0xLX1RPUF9JTlRESVJfU0VMXSA9ICJpbnRkaXJfc2VsIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9JMlNPMV9NX1NFTF0gPSAiaTJzbzFfbV9z ZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0kyU08yX01fU0VM XSA9ICJpMnNvMl9tX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19U T1BfSTJTSTFfTV9TRUxdID0gImkyc2kxX21fc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX1RPUF9JMlNJMl9NX1NFTF0gPSAiaTJzaTJfbV9zZWwiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgLyogY2xvY2sgZ2F0ZSAqLw0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAg W01UODE5NV9DTEtfVE9QX01QSE9ORV9TTEFWRV9CXSA9DQo+ID4gPiA+ID4gPiA+ID4gIm1waG9u ZV9zbGF2ZV9iIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9DRkdf MjZNX0FVRF0gPSAiY2ZnXzI2bV9hdWQiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfSU5GUkFfQU9fQVVESU9dID0gImluZnJhX2FvX2F1ZGlvIiwNCj4gPiA+ID4gPiA+ID4g PiArICAgICAgIFtNVDgxOTVfQ0xLX0lORlJBX0FPX0FVRElPXzI2TV9CXSA9DQo+ID4gPiA+ID4g PiA+ID4gImluZnJhX2FvX2F1ZGlvXzI2bV9iIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtN VDgxOTVfQ0xLX1NDUF9BRFNQX0FVRElPRFNQXSA9DQo+ID4gPiA+ID4gPiA+ID4gInNjcF9hZHNw X2F1ZGlvZHNwIiwNCj4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0FGRV0gPSAiYXVkX2FmZSIsDQo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfTFJDS19DTlRdID0gImF1ZF9scmNrX2NudCIs DQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfU1BESUZJTl9UVU5FUl9B UExMXSA9DQo+ID4gPiA+ID4gPiA+ID4gImF1ZF9zcGRpZmluX3R1bmVyX2FwbGwiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX1NQRElGSU5fVFVORVJfREJHXSA9DQo+ ID4gPiA+ID4gPiA+ID4gImF1ZF9zcGRpZmluX3R1bmVyX2RiZyIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19BVURfVUxfVE1MXSA9ICJhdWRfdWxfdG1sIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BUExMMV9UVU5FUl0gPQ0KPiA+ID4gPiA+ ID4gPiA+ICJhdWRfYXBsbDFfdHVuZXIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfQVVEX0FQTEwyX1RVTkVSXSA9DQo+ID4gPiA+ID4gPiA+ID4gImF1ZF9hcGxsMl90dW5l ciIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfVE9QMF9TUERGXSA9 ICJhdWRfdG9wMF9zcGRmIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9BUExMXSA9ICJhdWRfYXBsbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NM S19BVURfQVBMTDJdID0gImF1ZF9hcGxsMiIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4 MTk1X0NMS19BVURfREFDXSA9ICJhdWRfZGFjIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtN VDgxOTVfQ0xLX0FVRF9EQUNfUFJFRElTXSA9ICJhdWRfZGFjX3ByZWRpcyIsDQo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfVE1MXSA9ICJhdWRfdG1sIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BRENdID0gImF1ZF9hZGMiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0RBQ19ISVJFU10gPSAiYXVkX2RhY19o aXJlcyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQTFTWVNfSFBd ID0gImF1ZF9hMXN5c19ocCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfQUZFX0RNSUMxXSA9ICJhdWRfYWZlX2RtaWMxIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX0FVRF9BRkVfRE1JQzJdID0gImF1ZF9hZmVfZG1pYzIiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0FGRV9ETUlDM10gPSAiYXVkX2FmZV9kbWlj MyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQUZFX0RNSUM0XSA9 ICJhdWRfYWZlX2RtaWM0IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9BRkVfMjZNX0RNSUNfVE1dID0NCj4gPiA+ID4gPiA+ID4gPiAiYXVkX2FmZV8yNm1fZG1pY190 bSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfVUxfVE1MX0hJUkVT XSA9DQo+ID4gPiA+ID4gPiA+ID4gImF1ZF91bF90bWxfaGlyZXMiLA0KPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0FEQ19ISVJFU10gPSAiYXVkX2FkY19oaXJlcyIsDQo+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQUREQTZfQURDXSA9ICJhdWRf YWRkYTZfYWRjIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BRERB Nl9BRENfSElSRVNdID0NCj4gPiA+ID4gPiA+ID4gPiAiYXVkX2FkZGE2X2FkY19oaXJlcyIsDQo+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfTElORUlOX1RVTkVSXSA9DQo+ ID4gPiA+ID4gPiA+ID4gImF1ZF9saW5laW5fdHVuZXIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgW01UODE5NV9DTEtfQVVEX0VBUkNfVFVORVJdID0gImF1ZF9lYXJjX3R1bmVyIiwNCj4gPiA+ ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9JMlNJTl0gPSAiYXVkX2kyc2luIiwN Cj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9URE1fSU5dID0gImF1ZF90 ZG1faW4iLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0kyU19PVVRd ID0gImF1ZF9pMnNfb3V0IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9URE1fT1VUXSA9ICJhdWRfdGRtX291dCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4 MTk1X0NMS19BVURfSERNSV9PVVRdID0gImF1ZF9oZG1pX291dCIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19BVURfQVNSQzExXSA9ICJhdWRfYXNyYzExIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BU1JDMTJdID0gImF1ZF9hc3JjMTIiLA0K PiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01VTFRJX0lOXSA9ICJhdWRf bXVsdGlfaW4iLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0lOVERJ Ul0gPSAiYXVkX2ludGRpciIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfQTFTWVNdID0gImF1ZF9hMXN5cyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1 X0NMS19BVURfQTJTWVNdID0gImF1ZF9hMnN5cyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBb TVQ4MTk1X0NMS19BVURfUENNSUZdID0gImF1ZF9wY21pZiIsDQo+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICBbTVQ4MTk1X0NMS19BVURfQTNTWVNdID0gImF1ZF9hM3N5cyIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQTRTWVNdID0gImF1ZF9hNHN5cyIsDQo+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfTUVNSUZfVUwxXSA9ICJhdWRfbWVtaWZf dWwxIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9VTDJd ID0gImF1ZF9tZW1pZl91bDIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf QVVEX01FTUlGX1VMM10gPSAiYXVkX21lbWlmX3VsMyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19BVURfTUVNSUZfVUw0XSA9ICJhdWRfbWVtaWZfdWw0IiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9VTDVdID0gImF1ZF9tZW1pZl91 bDUiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01FTUlGX1VMNl0g PSAiYXVkX21lbWlmX3VsNiIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfTUVNSUZfVUw4XSA9ICJhdWRfbWVtaWZfdWw4IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9VTDldID0gImF1ZF9tZW1pZl91bDkiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01FTUlGX1VMMTBdID0gImF1ZF9tZW1pZl91 bDEwIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9ETDJd ID0gImF1ZF9tZW1pZl9kbDIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf QVVEX01FTUlGX0RMM10gPSAiYXVkX21lbWlmX2RsMyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19BVURfTUVNSUZfREw2XSA9ICJhdWRfbWVtaWZfZGw2IiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9ETDddID0gImF1ZF9tZW1pZl9k bDciLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01FTUlGX0RMOF0g PSAiYXVkX21lbWlmX2RsOCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfTUVNSUZfREwxMF0gPSAiYXVkX21lbWlmX2RsMTAiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgW01UODE5NV9DTEtfQVVEX01FTUlGX0RMMTFdID0gImF1ZF9tZW1pZl9kbDExIiwNCj4gPiA+ ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzBdID0gImF1ZF9nYXNyYzAi LA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDMV0gPSAiYXVk X2dhc3JjMSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMy XSA9ICJhdWRfZ2FzcmMyIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9HQVNSQzNdID0gImF1ZF9nYXNyYzMiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfQVVEX0dBU1JDNF0gPSAiYXVkX2dhc3JjNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19BVURfR0FTUkM1XSA9ICJhdWRfZ2FzcmM1IiwNCj4gPiA+ID4gPiA+ID4g PiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzZdID0gImF1ZF9nYXNyYzYiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDN10gPSAiYXVkX2dhc3JjNyIs DQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkM4XSA9ICJhdWRf Z2FzcmM4IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzld ID0gImF1ZF9nYXNyYzkiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVE X0dBU1JDMTBdID0gImF1ZF9nYXNyYzEwIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgx OTVfQ0xLX0FVRF9HQVNSQzExXSA9ICJhdWRfZ2FzcmMxMSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMxMl0gPSAiYXVkX2dhc3JjMTIiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDMTNdID0gImF1ZF9nYXNyYzEzIiwN Cj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzE0XSA9ICJhdWRf Z2FzcmMxNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMx NV0gPSAiYXVkX2dhc3JjMTUiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf QVVEX0dBU1JDMTZdID0gImF1ZF9nYXNyYzE2IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtN VDgxOTVfQ0xLX0FVRF9HQVNSQzE3XSA9ICJhdWRfZ2FzcmMxNyIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMxOF0gPSAiYXVkX2dhc3JjMTgiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDMTldID0gImF1ZF9nYXNyYzE5 IiwNCj4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+IFRoZSBNVDgxOTVfQ0xLX0FVRF8qIGNs b2NrcyBhcmUgYWxsIGludGVybmFsIHRvIHRoZSBhdWRpbw0KPiA+ID4gPiA+ID4gPiBzdWJzeXN0 ZW06DQo+ID4gPiA+ID4gPiA+IHRoZSBiaXRzIHRoYXQgY29udHJvbCB0aGVzZSBjbG9jayBnYXRl cyBhcmUgaW4gdGhlIHNhbWUNCj4gPiA+ID4gPiA+ID4gYWRkcmVzcw0KPiA+ID4gPiA+ID4gPiBz cGFjZQ0KPiA+ID4gPiA+ID4gPiBhcyB0aGUgYXVkaW8gcGFydHMuIFdvdWxkIGl0IGJlIHBvc3Np YmxlIHRvIG1vZGVsIHRoZW0gYXMNCj4gPiA+ID4gPiA+ID4gaW50ZXJuYWwNCj4gPiA+ID4gPiA+ ID4gQVNvQyBTVVBQTFkgd2lkZ2V0cz8gVGhlIGV4dGVybmFsIG9uZXMgY291bGQgYmUgbW9kZWxl ZA0KPiA+ID4gPiA+ID4gPiB1c2luZw0KPiA+ID4gPiA+ID4gPiBBU29DDQo+ID4gPiA+ID4gPiA+ IENMS19TVVBQTFkgd2lkZ2V0cywgYW5kIHRoZSBkZXBlbmRlbmNpZXMgY291bGQgYmUgbW9kZWxl ZA0KPiA+ID4gPiA+ID4gPiB3aXRoDQo+ID4gPiA+ID4gPiA+IEFTb0MNCj4gPiA+ID4gPiA+ID4g cm91dGVzLiBUaGUgQVNvQyBjb3JlIGNvdWxkIHRoZW4gaGFuZGxlIHBvd2VyIHNlcXVlbmNpbmcs DQo+ID4gPiA+ID4gPiA+IHdoaWNoDQo+ID4gPiA+ID4gPiA+IHRoZQ0KPiA+ID4gPiA+ID4gPiBk cml2ZXIgY3VycmVudGx5IGRvZXMgbWFudWFsbHkuDQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ ID4gPiBJTU8gdGhpcyBpcyBiZXR0ZXIgdGhhbiBoYXZpbmcgdHdvIGRyaXZlcnMgaGFuZGxpbmcg dHdvDQo+ID4gPiA+ID4gPiA+IGFzcGVjdHMNCj4gPiA+ID4gPiA+ID4gb2YNCj4gPiA+ID4gPiA+ ID4gdGhlIHNhbWUgcGllY2Ugb2YgaGFyZHdhcmUsIHdoaWxlIHRoZSB0d28gYXNwZWN0cyBhcmUN Cj4gPiA+ID4gPiA+ID4gaW50ZXJ0d2luZWQuDQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4g DQo+ID4gPiA+ID4gPiBZZXMsIGl0J3Mgb2sgdG8gdXNlIHRoZSBDTEtfU1VQUExZIGFuZCBTVVBQ TFkgdG8gbW9kZWwgc3VjaA0KPiA+ID4gPiA+ID4gY2xvY2tzLg0KPiA+ID4gPiA+ID4gQnV0IHRo b3NlIGNsb2NrcyBhcmUgbWFuYWdlZCBieSBDQ0YgaW4gdGhlIHByZWNlZGluZyBTT0NzDQo+ID4g PiA+ID4gPiBsaWtlDQo+ID4gPiA+ID4gPiBtdDI3MDEsDQo+ID4gPiA+ID4gPiBtdDY3NzkgYW5k IG10ODE4My4gQWRkaXRpb25hbGx5LCBpbiBzb21lIGF1ZGlvIG1vZHVsZXMsDQo+ID4gPiA+ID4g PiBjbG9ja3MNCj4gPiA+ID4gPiA+IHNob3VsZA0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+IFRoaXMg YmVpbmcgYSBuZXcgZHJpdmVyLCB3ZSBoYXZlIHNvbWUgbW9yZSBmcmVlZG9tIHRvIGltcHJvdmUN Cj4gPiA+ID4gPiB0aGUNCj4gPiA+ID4gPiBkZXNpZ24uDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4g PiBiZSBlbmFibGVkIGJlZm9yZSBjb25maWd1cmluZyBwYXJhbWV0ZXJzKGh3X3BhcmFtcykuIEFz IGZhcg0KPiA+ID4gPiA+ID4gYXMNCj4gPiA+ID4gPiA+IEkNCj4gPiA+ID4gPiA+IGtub3csDQo+ ID4gPiA+ID4gPiBpZiB3ZSB1c2UgQ0xLX1NVUFBMWSBvciBTVVBQTFkgdG8gbW9kZWwgY2xvY2tz LCB0aGUgcG93ZXINCj4gPiA+ID4gPiA+IHNlcXVlbmNlDQo+ID4gPiA+ID4gPiBpcw0KPiA+ID4g PiA+ID4gY29udHJvbGxlZCBieSBEQVBNLiBJdCBzZWVtcyB0byBiZSBpbXBvc3NpYmxlIHRvIGZ1 bGZpbGwNCj4gPiA+ID4gPiA+IGFsbA0KPiA+ID4gPiA+ID4gdXNlDQo+ID4gPiA+ID4gPiBjYXNl cy4NCj4gPiA+ID4gPiA+IFRoYXQncyB3aHkgd2UganVzdCBrZWVwIHRoZSBtYW51YWwgY29udHJv bCBzZXF1ZW5jZSBhbmQgQ0NGDQo+ID4gPiA+ID4gPiBzZWVtcw0KPiA+ID4gPiA+ID4gdG8gYmUN Cj4gPiA+ID4gPiA+IHRoZSBiZXN0IGNob2ljZSB0byBtb2RlbCBzdWNoIGNsb2NrIGdhdGVzcy4N Cj4gPiA+ID4gPiANCj4gPiA+ID4gPiBJIHNlZS4gU28geWVzLCB1c2luZyBDQ0YgZG9lcyBnaXZl IHlvdSByZWZlcmVuY2UgY291bnRpbmcsDQo+ID4gPiA+ID4gZGVwZW5kZW5jeQ0KPiA+ID4gPiA+ IHRyYWNraW5nIGFuZCBvdGhlciBhZHZhbnRhZ2VzLiBBbmQgdXNpbmcgREFQTSBzdXBwbGllcyBt ZWFucw0KPiA+ID4gPiA+IHlvdQ0KPiA+ID4gPiA+IGNhbid0DQo+ID4gPiA+ID4gZW5hYmxlIHRo ZSBjbG9jayBnYXRlcyBvdXRzaWRlIG9mIERBUE0gd2l0aG91dCBib3RoIHBpZWNlcyBvZg0KPiA+ ID4gPiA+IGNvZGUNCj4gPiA+ID4gPiBmaWdodGluZyBmb3IgY29udHJvbC4NCj4gPiA+ID4gPiAN Cj4gPiA+ID4gPiBDYW4gd2UgYXQgbGVhc3QgbW92ZSB0aGUgYXVkaW8gY2xvY2sgZ2F0ZXMgaW50 byB0aGUgYXVkaW8NCj4gPiA+ID4gPiBkcml2ZXINCj4gPiA+ID4gPiB0aG91Z2g/DQo+ID4gPiA+ ID4gVGhlIGFyYml0cmFyeSBzZXBhcmF0aW9uIGludG8gdHdvIGRldmljZXMgYW5kIGRyaXZlcnMg aXMNCj4gPiA+ID4gPiBmaXNoeS4NCj4gPiA+ID4gPiBBbmQNCj4gPiA+ID4gPiB3aXRoDQo+ID4g PiA+ID4gdGhlIG1vdmUgdGhlIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlIGF1ZGlvIGNsb2Nr IGdhdGVzIGNhbg0KPiA+ID4gPiA+IGJlDQo+ID4gPiA+ID4gcmVtb3ZlZC4NCj4gPiA+ID4gPiAN Cj4gPiA+ID4gDQo+ID4gPiA+IEJlY2F1c2UgREFQTSBTVVBQTFkgY2FuJ3QgZml0IG91ciBjb250 cm9sIHNjZW5hcmlvLg0KPiA+ID4gPiBEaWQgeW91IHN1Z2dlc3QgdXMgaW1wbGVtZW50IHRoZSBz aW1wbGUgbG9naWMgY29udHJvbChpbmNsdWRpbmcNCj4gPiA+ID4gcmVmDQo+ID4gPiA+IGNvdW50 LCBjbG9jayBkZXBlbmRlbmN5KSBmb3IgY2xvY2sgZ2F0ZShNVDgxOTVfQ0xLX0FVRF8qKSBpbg0K PiA+ID4gPiBhZmUNCj4gPiA+ID4gZHJpdmVyDQo+ID4gPiA+IGluc3RlYWQgb2YgdXNpbmcgQ0NG Pw0KPiA+ID4gDQo+ID4gPiBJIG1lYW50IHNpbXBseSBtb3ZpbmcgdGhlIENDRi1iYXNlZCBjbGsg ZHJpdmVyIGNvZGUgKGNsay1tdDg1MTYtDQo+ID4gPiBhdWQuYykNCj4gPiA+IGZyb20gYGRyaXZl cnMvY2xrYCBhbmQgaW5jb3Jwb3JhdGluZyBpdCBpbnRvIHRoZSBhdWRpbyBkcml2ZXIsDQo+ID4g PiBsaWtlbHkNCj4gPiA+IGluIGBtdDgxOTUtYWZlLWNsay5jYCBvciBtYXliZSBhcyBhIHNlcGFy YXRlIGZpbGUuIFNvIHRoZSBhdWRpbw0KPiA+ID4gZHJpdmVyDQo+ID4gPiB3b3VsZCBiZSBhIGNs b2NrIHByb3ZpZGVyLCBhbmQgYSBjbG9jayBjb25zdW1lci4gSXQgd2lsbCBkaXJlY3RseQ0KPiA+ ID4gdXNlDQo+ID4gPiB0aGUgY2xvY2tzIGl0IHByb3ZpZGVzLCBpbnRlcm5hbGx5LCBhbmQgeW91 IGNvdWxkIHJlbW92ZSBhbGwNCj4gPiA+IHRob3NlDQo+ID4gPiBjbG9jayByZWZlcmVuY2VzIGZy b20gdGhlIGRldmljZSB0cmVlLg0KPiA+ID4gDQo+ID4gPiBUaGUgZ29hbCBpcyB0byBoYXZlIG9u ZSBoYXJkd2FyZSByZXByZXNlbnRhdGlvbiAoZGV2aWNlIG5vZGUpDQo+ID4gPiBvbmx5LA0KPiA+ ID4gc28NCj4gPiA+IHRoYXQgaXQgbWF0Y2hlcyB0aGUgaGFyZHdhcmUsIHdoaWNoIGlzIG9uZSBz aW5nbGUgdW5pZmllZCBibG9jay4NCj4gPiA+IA0KPiA+ID4gQWZ0ZXIgdGhlIGRyaXZlciBpcyBj b21wbGV0ZWQsIHdlIGNhbiBsb29rIGZvciBvcHBvcnR1bml0aWVzIHRvDQo+ID4gPiBpbXByb3Zl DQo+ID4gPiBpdCwgaWYgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUuDQo+ID4gDQo+ID4gVGhhbmtz IGZvciB5b3VyIGRldGFpbGVkIGluZm9ybWF0aW9uLg0KPiA+IEkgd2lsbCB0cnkgdG8gbW92ZSB0 aGUgQ0NGLWJhc2VkIGNsayBkcml2ZXIgY29kZSB0byBBRkUgZHJpdmVyLg0KPiA+IElmIHRoZXJl IGFyZSBubyBvdGhlciBpbnRlcm5hbCBjb25jZXJucyBhbmQgYmxvY2tpbmcgcHJvYmxlbXMsIEkN Cj4gPiB3aWxsDQo+ID4gaW5jbHVkZSB0aGUgY2hhbmdlcyBpbiB2My4NCj4gDQo+IEdyZWF0Lg0K PiANCj4gPiA+ID4gPiBBbmQgcmVnYXJkaW5nIHRoZSBjbG9jayByZXF1aXJlbWVudHMgZm9yIGRp ZmZlcmVudCBtb2R1bGVzLA0KPiA+ID4gPiA+IGNvdWxkDQo+ID4gPiA+ID4gd2UNCj4gPiA+ID4g PiBoYXZlDQo+ID4gPiA+ID4gdGhhdCBpbmZvcm1hdGlvbiBwdXQgaW4gY29tbWVudHMgc29tZXdo ZXJlLCBzbyBpZiBzb21lb25lDQo+ID4gPiA+ID4gd2VyZSB0bw0KPiA+ID4gPiA+IHJldmlzaXQN Cj4gPiA+ID4gPiBpdCBsYXRlciwgdGhleSB3b3VsZCBoYXZlIHRoZSBpbmZvcm1hdGlvbiBuZWVk ZWQgdG8NCj4gPiA+ID4gPiB1bmRlcnN0YW5kDQo+ID4gPiA+ID4gYW5kDQo+ID4gPiA+ID4gcG9z c2libHkNCj4gPiA+ID4gPiBpbXByb3ZlIGl0PyBCZWNhdXNlIHJpZ2h0IG5vdyB0aGVyZSdzIGp1 c3QgYSBidW5jaCBvZiBjbG9ja3MNCj4gPiA+ID4gPiBlbmFibGVkDQo+ID4gPiA+ID4gYW5kDQo+ ID4gPiA+ID4gZGlzYWJsZWQgYW5kIG5vdGhpbmcgdG8gZXhwbGFpbiB3aHkgdGhhdCdzIG5lZWRl ZC4NCj4gPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+IEZvciBleGFtcGxlLA0KPiA+ID4gPiBN VDgxOTVfQ0xLX0FVRF9BREMoY2xvY2sgZ2F0ZSkgaXMgb25lIG9mIHRoZSBjbG9jayBmZWVkaW5n IHRvDQo+ID4gPiA+IEFEREENCj4gPiA+ID4gbW9kdWxlLg0KPiA+ID4gPiBEaWQgeW91IHdhbnQg bWUgc2hvdyB0aGUgY2xvY2sgZ2F0ZSBsaXN0IGZlZWRpbmcgdG8gQUREQT8NCj4gPiA+ID4gT24g dGhlIG90aGVyIGhhbmQsIEkgZGlkbid0IGtub3cgaG93IHRvIHNob3cgdGhlIGluZm9ybWF0aW9u DQo+ID4gPiA+IHByb3Blcmx5DQo+ID4gPiA+IGluIGNvbW1lbnRzLiBDb3VsZCB5b3Uga2luZGx5 IHNoYXJlIG1lIGFuIGV4YW1wbGUgZm9yDQo+ID4gPiA+IHJlZmVyZW5jZT8NCj4gPiA+IA0KPiA+ ID4gDQo+ID4gPiBGb3IgZXhhbXBsZSwgaW4gYG10ODE5NV9hZmVfZW5hYmxlX3JlZ19yd19jbGso KWAgaW4gbXQ4MTk1LWFmZS0NCj4gPiA+IGNsay5jOg0KPiA+ID4gDQo+ID4gPiAgICAgICAgIHVu c2lnbmVkIGludCBjbGtfYXJyYXlbXSA9IHsNCj4gPiA+ICAgICAgICAgICAgICAgICBNVDgxOTVf Q0xLX1NDUF9BRFNQX0FVRElPRFNQLA0KPiA+ID4gICAgICAgICAgICAgICAgIE1UODE5NV9DTEtf VE9QX0FVRElPX0xPQ0FMX0JVU19TRUwsDQo+ID4gPiAgICAgICAgICAgICAgICAgTVQ4MTk1X0NM S19UT1BfQ0ZHXzI2TV9BVUQsDQo+ID4gPiAgICAgICAgICAgICAgICAgTVQ4MTk1X0NMS19JTkZS QV9BT19BVURJTywNCj4gPiA+ICAgICAgICAgICAgICAgICBNVDgxOTVfQ0xLX0lORlJBX0FPX0FV RElPXzI2TV9CLA0KPiA+ID4gICAgICAgICAgICAgICAgIE1UODE5NV9DTEtfVE9QX0FVRF9JTlRC VVNfU0VMLA0KPiA+ID4gICAgICAgICAgICAgICAgIE1UODE5NV9DTEtfVE9QX0ExU1lTX0hQX1NF TCwNCj4gPiA+ICAgICAgICAgICAgICAgICBNVDgxOTVfQ0xLX0FVRF9BMVNZU19IUCwNCj4gPiA+ ICAgICAgICAgICAgICAgICBNVDgxOTVfQ0xLX0FVRF9BMVNZUywNCj4gPiA+ICAgICAgICAgICAg ICAgICBNVDgxOTVfQ0xLX1RPUF9BVURJT19IX1NFTCwNCj4gPiA+ICAgICAgICAgfTsNCj4gPiA+ IA0KPiA+ID4gWW91IGNvdWxkIGFkZCBhIGNvbW1lbnQgYWZ0ZXIgZWFjaCBsaW5lIHN0YXRpbmcg d2h5IHRoYXQgY2xvY2sNCj4gPiA+IG5lZWRzDQo+ID4gPiB0bw0KPiA+ID4gYmUgZW5hYmxlZC4g QSBzaW1wbGUgbm90ZSBsaWtlICJidXMgYWNjZXNzIGNsb2NrIiBvciAiaW50ZXJuYWwNCj4gPiA+ IGxvZ2ljDQo+ID4gPiBjbG9jayINCj4gPiA+IHdvdWxkIHN1ZmZpY2UuDQo+ID4gPiANCj4gPiAN Cj4gPiBPSywgSSB3aWxsIGFkZCBzaG9ydCBub3RlcyB0byBzdWNoIGNsb2NrIGxpc3RzLg0KPiA+ IA0KPiA+ID4gVGhlIGFib3ZlIGxpc3QgYWxzbyBoYXMgc29tZSByZWR1bmRhbmNpZXMgdGhhdCBj b3VsZCBiZQ0KPiA+ID4gZWxpbWluYXRlZC4NCj4gPiA+IE1UODE5NV9DTEtfVE9QX0ExU1lTX0hQ X1NFTCBpcyBwYXJlbnQgdG8gYm90aA0KPiA+ID4gTVQ4MTk1X0NMS19BVURfQTFTWVNfSFANCj4g PiA+IGFuZA0KPiA+ID4gTVQ4MTk1X0NMS19BVURfQTFTWVMuIFdoZW4gY2xvY2tzIGFyZSBlbmFi bGVkLCB0aGVpciBwYXJlbnRzIGFyZQ0KPiA+ID4gYWxzbw0KPiA+ID4gZW5hYmxlZCBieSBDQ0Ys IHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBlbmFibGUgdGhlbSBleHBsaWNpdGx5LA0KPiA+ID4gdW5s ZXNzDQo+ID4gPiB0aGF0IGNsb2NrIGFsc28gZGlyZWN0bHkgZmVlZHMgdGhlIGNsb2NrIGNvbnN1 bWVyLg0KPiA+ID4gDQo+ID4gDQo+ID4gT0ssIEkgd2lsbCByZXZpZXcgYWxsIGNsb2NrIHVzYWdl cyBhbmQgcmVtb3ZlIHRoZSB1bm5lY2Vzc2FyeQ0KPiA+IGNsb2Nrcy4NCj4gPiANCj4gPiA+IA0K PiA+ID4gQW5vdGhlciB0aGluZyBJIHdhbnRlZCB0byBicmluZyB1cDogaXMgYW55IG9mIHRoZSBj b2RlIGFmdGVyDQo+ID4gPiANCj4gPiA+ICAgICBzdHJ1Y3QgbXQ4MTk1X2FmZV90dW5lcl9jZmcg ew0KPiA+ID4gDQo+ID4gPiB1c2VkPyBJdCBsb29rcyBsaWtlIGl0IGlzIHVzZWQgdG8gY29uZmln dXJlIHRoZSBmaXZlIGV4dHJhIFBMTHMNCj4gPiA+IGluDQo+ID4gPiB0aGUgYXVkaW8NCj4gPiA+ IHN1YnN5c3RlbSwgYnV0IHRoZSBleHBvc2VkIChub24tc3RhdGljKSBmdW5jdGlvbnMgZG9uJ3Qg c2VlbSB0bw0KPiA+ID4gYmUNCj4gPiA+IGNhbGxlZA0KPiA+ID4gYW55d2hlcmUuIEFyZSB0aGV5 IGZvciBtb2R1bGVzIG5vdCB5ZXQgc3VwcG9ydGVkPw0KPiA+ID4gDQo+ID4gDQo+ID4gWWVzLCB0 dW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgbm93Lg0KPiA+IEkgd2lsbCByZW1vdmUgdGhlIGNvZGUg YW5kIGFkZCB0aGVtIGJhY2sgd2hlbiB0dW5lcnMgYXJlIHJlcXVpcmVkDQo+ID4gaW4NCj4gPiB0 aGUgZnV0dXJlLg0KPiANCj4gVGhhbmtzLg0KPiANCj4gDQo+IENoZW5ZdQ0K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AEF38C432BE for ; Mon, 26 Jul 2021 14:31:38 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id F06EF60F37 for ; Mon, 26 Jul 2021 14:31:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org F06EF60F37 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:CC:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=mBtXPeIVdbUHkG+17UYJg+PCcv3XZ7cGm+4rYJ7n+2E=; b=Cr/Xqg6MR+fYBx 6CY5gCuYO3CPljSm3GmIMeNFJ0Y4DIhyZ5n16sbDiuyxXEhRsUorDOjWbggUIxw4XPVdf2e+YrrMl 0dMSMRJJK6NkEXsvYY9kBgCLhOm0NGrqEFfG1jRxH0yLMatzFWrXUAY9IUb7KzJXneVs0lqDNjsaD JcoZ3vAP/7W3urj6yaQoaq9xnj3obDO1q+rxg18HSJ5lHR1SkB3eqcp+Ki26/zrP+IPyVTa6Vo/Tm J/NqY86A4ksPGRGOvjN85xzKi+bKgxftX3fUbAhvNtLxqdvhXC0LP/PF3vaXf7+2o/UUTCKbIoKxQ UxhBmiZOdYfulT6BdYnw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m81dY-00BWgR-Sz; Mon, 26 Jul 2021 14:31:20 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m81dR-00BWfb-IH; Mon, 26 Jul 2021 14:31:18 +0000 X-UUID: b15a22881cc74862ab45e600cd76e3d5-20210726 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=9fs7tslMh1prUEYA/QkKsRBWaDgZ7nrYEvIWIkBVZvY=; b=pqN7wlCoC0PTzj7/i/MywIE2CZmJsI+fCBYAXqM3uTPQ4ElSPnjc+cncCJM4p9rRzPpefNlSoaQn+Q2YD96geBRQz47IUPpcByRQyHk6BX451T7Pn4zbngpFbhxKfiGitcH6LzkR1IBEvFfJds4pfRQJ4cwYzHVREuy6SgeLY64=; X-UUID: b15a22881cc74862ab45e600cd76e3d5-20210726 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1449069056; Mon, 26 Jul 2021 07:31:09 -0700 Received: from MTKMBS06N1.mediatek.inc (172.21.101.129) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 26 Jul 2021 07:31:07 -0700 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs06n1.mediatek.inc (172.21.101.129) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 26 Jul 2021 22:31:06 +0800 Received: from mtksdccf07 (172.21.84.99) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 26 Jul 2021 22:31:06 +0800 Message-ID: Subject: Re: [PATCH v2 5/8] ASoC: mediatek: mt8195: add platform driver From: Trevor Wu To: Chen-Yu Tsai CC: Chun-Jie Chen , , , Rob Herring , Matthias Brugger , , , , LKML , , , Jiaxin Yu , "Jimmy Cheng-Yi Chiang" , Li-Yu Yu Date: Mon, 26 Jul 2021 22:31:06 +0800 In-Reply-To: References: <20210629014736.31153-1-trevor.wu@mediatek.com> <20210629014736.31153-6-trevor.wu@mediatek.com> <9929a3a20df1a89fc94baf7c75c0c65d9a61de0f.camel@mediatek.com> <266fd1f5de56743292ac5fc64664113c0bb0e41a.camel@mediatek.com> <31bcc613abb0f805400faa8b8108100cb578d9b1.camel@mediatek.com> X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210726_073115_110150_F6464EC1 X-CRM114-Status: GOOD ( 61.64 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Fri, 2021-07-23 at 14:27 +0800, Chen-Yu Tsai wrote: > On Thu, Jul 22, 2021 at 4:56 PM Trevor Wu > wrote: > > > > On Mon, 2021-07-19 at 18:05 +0800, Chen-Yu Tsai wrote: > > > Hi, > > > > > > On Thu, Jul 15, 2021 at 7:05 PM Trevor Wu > > > > > > wrote: > > > > > > > > On Tue, 2021-07-13 at 14:00 +0800, Chen-Yu Tsai wrote: > > > > > On Mon, Jul 12, 2021 at 11:10 PM Trevor Wu < > > > > > trevor.wu@mediatek.com> > > > > > wrote: > > > > > > > > > > > > On Mon, 2021-07-12 at 14:57 +0800, Chen-Yu Tsai wrote: > > > > > > > are all internal Hi, > > > > > > > > > > > > > > On Tue, Jun 29, 2021 at 9:49 AM Trevor Wu < > > > > > > > trevor.wu@mediatek.com > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > This patch adds mt8195 platform and affiliated driver. > > > > > > > > > > > > > > > > Signed-off-by: Trevor Wu > > > > > > > > --- > > > > > > > > sound/soc/mediatek/Kconfig | 9 > > > > > > > > + > > > > > > > > sound/soc/mediatek/Makefile | 1 + > > > > > > > > sound/soc/mediatek/mt8195/Makefile | 11 + > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-clk.c | 899 > > > > > > > > +++++ > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-clk.h | 201 + > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-common.h | 200 + > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-pcm.c | 3264 > > > > > > > > +++++++++++++++++ > > > > > > > > sound/soc/mediatek/mt8195/mt8195-reg.h | 2793 > > > > > > > > ++++++++++++++ > > > > > > > > 8 files changed, 7378 insertions(+) > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/Makefile > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > clk.c > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > clk.h > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > common.h > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > pcm.c > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > reg.h > > > > > > > > > > > > > > > > diff --git a/sound/soc/mediatek/Kconfig > > > > > > > > b/sound/soc/mediatek/Kconfig > > > > > > > > index 74dae4332d17..3389f382be06 100644 > > > > > > > > --- a/sound/soc/mediatek/Kconfig > > > > > > > > +++ b/sound/soc/mediatek/Kconfig > > > > > > > > @@ -184,3 +184,12 @@ config > > > > > > > > SND_SOC_MT8192_MT6359_RT1015_RT5682 > > > > > > > > with the MT6359 RT1015 RT5682 audio codec. > > > > > > > > Select Y if you have such device. > > > > > > > > If unsure select "N". > > > > > > > > + > > > > > > > > +config SND_SOC_MT8195 > > > > > > > > + tristate "ASoC support for Mediatek MT8195 > > > > > > > > chip" > > > > > > > > + select SND_SOC_MEDIATEK > > > > > > > > + help > > > > > > > > + This adds ASoC platform driver support for > > > > > > > > Mediatek > > > > > > > > MT8195 chip > > > > > > > > + that can be used with other codecs. > > > > > > > > + Select Y if you have such device. > > > > > > > > + If unsure select "N". > > > > > > > > diff --git a/sound/soc/mediatek/Makefile > > > > > > > > b/sound/soc/mediatek/Makefile > > > > > > > > index f6cb6b8508e3..34778ca12106 100644 > > > > > > > > --- a/sound/soc/mediatek/Makefile > > > > > > > > +++ b/sound/soc/mediatek/Makefile > > > > > > > > @@ -5,3 +5,4 @@ obj-$(CONFIG_SND_SOC_MT6797) += mt6797/ > > > > > > > > obj-$(CONFIG_SND_SOC_MT8173) += mt8173/ > > > > > > > > obj-$(CONFIG_SND_SOC_MT8183) += mt8183/ > > > > > > > > obj-$(CONFIG_SND_SOC_MT8192) += mt8192/ > > > > > > > > +obj-$(CONFIG_SND_SOC_MT8195) += mt8195/ > > > > > > > > diff --git a/sound/soc/mediatek/mt8195/Makefile > > > > > > > > b/sound/soc/mediatek/mt8195/Makefile > > > > > > > > new file mode 100644 > > > > > > > > index 000000000000..b2c9fd88f39e > > > > > > > > --- /dev/null > > > > > > > > +++ b/sound/soc/mediatek/mt8195/Makefile > > > > > > > > @@ -0,0 +1,11 @@ > > > > > > > > +# SPDX-License-Identifier: GPL-2.0 > > > > > > > > + > > > > > > > > +# platform driver > > > > > > > > +snd-soc-mt8195-afe-objs := \ > > > > > > > > + mt8195-afe-clk.o \ > > > > > > > > + mt8195-afe-pcm.o \ > > > > > > > > + mt8195-dai-adda.o \ > > > > > > > > + mt8195-dai-etdm.o \ > > > > > > > > + mt8195-dai-pcm.o > > > > > > > > + > > > > > > > > +obj-$(CONFIG_SND_SOC_MT8195) += snd-soc-mt8195-afe.o > > > > > > > > diff --git a/sound/soc/mediatek/mt8195/mt8195-afe-clk.c > > > > > > > > b/sound/soc/mediatek/mt8195/mt8195-afe-clk.c > > > > > > > > new file mode 100644 > > > > > > > > index 000000000000..57aa799b4f41 > > > > > > > > --- /dev/null > > > > > > > > +++ b/sound/soc/mediatek/mt8195/mt8195-afe-clk.c > > > > > > > > @@ -0,0 +1,899 @@ > > > > > > > > +// SPDX-License-Identifier: GPL-2.0 > > > > > > > > +/* > > > > > > > > + * mt8195-afe-clk.c -- Mediatek 8195 afe clock ctrl > > > > > > > > + * > > > > > > > > + * Copyright (c) 2021 MediaTek Inc. > > > > > > > > + * Author: Bicycle Tsai > > > > > > > > + * Trevor Wu > > > > > > > > + */ > > > > > > > > + > > > > > > > > +#include > > > > > > > > + > > > > > > > > +#include "mt8195-afe-common.h" > > > > > > > > +#include "mt8195-afe-clk.h" > > > > > > > > +#include "mt8195-reg.h" > > > > > > > > + > > > > > > > > +static const char *aud_clks[MT8195_CLK_NUM] = { > > > > > > > > > > > > > > Most of these clocks are not described in the device tree > > > > > > > binding. If > > > > > > > the driver needs to reference them, they should be > > > > > > > described. > > > > > > > We > > > > > > > should > > > > > > > not be hard-coding clock names across different drivers. > > > > > > > > > > > > > > > > > > > Sorry, I didn't know I have to list all clocks in the dt- > > > > > > binding. > > > > > > Originally, I thought these clocks will be described in the > > > > > > clock > > > > > > binding, so I didn't add them to the binding of afe driver. > > > > > > I will add these clocks to mt8195-afe-pcm.yaml. > > > > > > > > > > If the device consumes clocks, then the clocks that get > > > > > consumed > > > > > should > > > > > be listed in the device's bindings. This is not related to > > > > > the > > > > > clock > > > > > bindings, which is a clock provider. > > > > > > > > > > > > > Got it. Thanks. > > > > > > > > > > > The more important question is, why does the driver need > > > > > > > to > > > > > > > reference > > > > > > > all of them? Maybe we should take a step back and draw > > > > > > > out a > > > > > > > clock > > > > > > > tree > > > > > > > diagram for the hardware? > > > > > > > > > > > > > > > > > > > The clock structure is PLL -> MUX -> GATE. > > > > > > xtal, pll and divider are the possible clock inputs for > > > > > > MUX. > > > > > > Because we select the clock input of audio module based on > > > > > > the > > > > > > use > > > > > > case, we use clk_get to retrive all clocks which are > > > > > > possible > > > > > > to be > > > > > > used. > > > > > > > > > > So I see a couple the driver is doing reparenting: > > > > > > > > > > a. Reparent audio_h to standard oscillator when ADDA is not > > > > > used, > > > > > presumably to let the APLL be turned off > > > > > > > > > > Why not just turn off audio_h? It looks like audio_h feeds a > > > > > couple > > > > > clock > > > > > gates in the audio subsystem. Just a guess, but is this the > > > > > AHB > > > > > bus > > > > > clock? > > > > > Why not just have it parented to "univpll_d7" all the time > > > > > then? > > > > > > > > > > > > > Sorry, I am not sure if it is the AHB bus clock. > > > > I only know how audio module uses the clock. > > > > audio_h feeds to some clock gate like aud_adc_hires, which is > > > > used > > > > when > > > > sampling rate is higher than 48kHz, and hardware designer > > > > suggests > > > > us > > > > use apll1_ck when AFE requrires the clock. > > > > > > I see. So the simplified explanation is high clock rate for high > > > res > > > audio. > > > Would high clock rate work for standard sample rates? > > > > As far as I know, HW will switch clock to hires clock automatically > > when the required rate is high,(ex: aud_adc and aud_adc_hires) so > > it > > can't be controlled by driver. > > I see. That might not be so friendly to the Linux clk driver. > > > > Would using apll1 or univpll all the time work, instead of > > > reparenting? > > > What's the gain if we do reparenting? > > > > > > > As you said before, the gain is apll can be turned off when the > > clock > > is not requrired by ADDA. That's why we didn't use apll all the > > time. > > Right, and what's the gain from turning it off? Lower power > consumption? > Yes. Xtal_26m is supplied to most modules, but APLL1 is mainly used by afe. When audio feature is not used, we hope APLL1 can be turned off to lower power consumption. > > > > As I know, DSP also requires audio_h. > > > > When we disable the clock in AFE driver, the ref count in CCF > > > > is > > > > not > > > > becoming zero if DSP still uses it. > > > > But only AFE requires higher clock rate, so we reparent audio_h > > > > to > > > > 26M > > > > when it's not required in adda module. > > > > > > I see. Wouldn't reparenting the clock while it is in use by > > > another > > > module > > > cause glitches? > > > > I checked with the DSP owner. > > audio_h clock is required for DSP bus, but the clock rate is not > > important. > > The only thing it cares is audio_h should be powered on, so > > reparenting > > is harmless for DSP. > > OK. > > > > > > Also, reparenting really should be done implicitly with > > > > > clk_set_rate() > > > > > with the clock driver supporting reparenting on rate changes. > > > > > > > > > > b. Assignment of PLLs for I2S/PCM MCLK outputs > > > > > > > > > > Is there a reason for explicit assignment, other than clock > > > > > rate > > > > > conflicts? > > > > > CCF supports requesting and locking the clock rate. And > > > > > again, > > > > > implicit > > > > > reparenting should be the norm. The clock driver's purpose is > > > > > to > > > > > fulfill > > > > > any and all clock rate requirements from its consumers. The > > > > > consumer > > > > > should > > > > > only need to ask for the clock rate, not a specific parent, > > > > > unless > > > > > there > > > > > are details that are not yet covered by the CCF. > > > > > > > > > > > > > For MCLK output, we should configure divider to get the target > > > > rate, > > > > and it can only divide the clock from current parent source. > > > > So we should do reparent to divider's parent in case the parent > > > > rate is > > > > not a multiple of target rate. > > > > > > Right. That is expected. What I'm saying is that the CCF provides > > > the > > > framework for automatically reparenting based on the requested > > > clock > > > rate. This is done in the clock driver's .determine_rate op. > > > > > > When properly implemented, and also restricting or locking the > > > clock > > > rates > > > of the PLLs, then you can simply request a clock rate on the leaf > > > clock, > > > in this case one of the MCLKs, and the CCF and clock driver would > > > handle > > > everything else. The consumer should not be reparenting clocks > > > manually > > > unless for a very good reason which cannot be satisfied by the > > > CCF. > > > > > > > In some use cases, we really need to reparent clock manually. > > For example, spdif in(slave) -> .... -> i2s out(master) > > > > APLL3/APLL4 are reserved for slave input like earc in or spdif in, > > which can refer to the external clock source.(APLL3 syncs with > > earc, > > and APLL4 syncs with spdif in.) > > > > When i2s out selects the clock source to APLL4, this makes sure > > that > > spdif in and i2s out works in the same clock source. > > If we just use APLL1/APLL2 on i2s out, there is little rate > > mismatch > > between data input and output. Finally, it results in XRUN. > > I see, that makes more sense. > > > If we only use set_rate, it's possible that it can't switch to the > > expected PLL source, because the rate of APLL3/APLL4 should be > > close to > > APLL1/APLL2. > > Well, in theory the CCF should choose the one with the closest rate. > And if APLL3/APLL4 is already tracking the external clock source, its > clock rate should match. > > If it's a static requirement, maybe we could replace the *-mclk- > source > DT properties with standard assigned-clocks and assigned-clock- > parents? > This would get handled by CCF directly, and then the only thing the > clk driver has to do is make sure it doesn't get reparented again. > > Or is there a need to do reparenting at runtime? > For the use case of APLL3/APLL4, static assignment should be ok. But I checked with CCF owner, we can't just use clk_set_rate(divider, rate) to get expected MCLK output, because reparenting MUX automatically is not supported now. (PLL -> MUX -> divider) We still have to call clk_set_parent() before clk_set_rate(). Which means some information should be got from DTS to check whether the PLL source can be switched or not, so *-mclk-source should be keeped to identify the case. Thanks, Trevor > > > > > A related question: the chip has five APLLs. How many MCLK > > > > > combinations > > > > > does the application need to support? I assume this includes > > > > > the > > > > > standard > > > > > 24.576 MHz and 22.5792 MHz clock rates. > > > > > > > > > > > > > APLL1 and APLL2 are used in most AFE modules, so their rate > > > > should > > > > be > > > > fixed. > > > > APLL1 is fixed to 196608000Hz. > > > > APLL2 is fixed to 180633600Hz. > > > > APLL is inputed to the divider(8bit), and MCLK is the output of > > > > divider. > > > > Other APLLs are reserved for some special usage which can't be > > > > supported by APLL1 & APLL2. > > > > But APLL3~APLL5 aren't used in the series, so I will remove > > > > them in > > > > v3. > > > > > > > > > > Some of them are not used in this series, because some > > > > > > modules > > > > > > are > > > > > > still developing. Should I only keep the clocks that have > > > > > > been > > > > > > used > > > > > > in > > > > > > the series? > > > > > > > > > > Yes please. Only add the ones that are used. Things that > > > > > aren't > > > > > used > > > > > don't get tested and verified, and end up as dead code. If > > > > > there > > > > > are > > > > > plans to extend them in the future, and you can leave > > > > > comments > > > > > stating > > > > > that intent, and also mention it in the cover letter. > > > > > > > > > > > > > OK, I will remove the unused clock in v3. > > > > > > > > > > > > + /* xtal */ > > > > > > > > + [MT8195_CLK_XTAL_26M] = "clk26m", > > > > > > > > + /* pll */ > > > > > > > > + [MT8195_CLK_APMIXED_APLL1] = "apll1", > > > > > > > > + [MT8195_CLK_APMIXED_APLL2] = "apll2", > > > > > > > > + [MT8195_CLK_APMIXED_APLL3] = "apll3", > > > > > > > > + [MT8195_CLK_APMIXED_APLL4] = "apll4", > > > > > > > > + [MT8195_CLK_APMIXED_APLL5] = "apll5", > > > > > > > > + [MT8195_CLK_APMIXED_HDMIRX_APLL] = > > > > > > > > "hdmirx_apll", > > > > > > > > + /* divider */ > > > > > > > > + [MT8195_CLK_TOP_APLL1] = "apll1_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL1_D4] = "apll1_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL2] = "apll2_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL2_D4] = "apll2_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL3] = "apll3_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL3_D4] = "apll3_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL4] = "apll4_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL4_D4] = "apll4_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL5] = "apll5_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL5_D4] = "apll5_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV0] = "apll12_div0", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV1] = "apll12_div1", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV2] = "apll12_div2", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV3] = "apll12_div3", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV4] = "apll12_div4", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV9] = "apll12_div9", > > > > > > > > + [MT8195_CLK_TOP_HDMIRX_APLL] = > > > > > > > > "hdmirx_apll_ck", > > > > > > > > + [MT8195_CLK_TOP_MAINPLL_D4_D4] = > > > > > > > > "mainpll_d4_d4", > > > > > > > > + [MT8195_CLK_TOP_MAINPLL_D5_D2] = > > > > > > > > "mainpll_d5_d2", > > > > > > > > + [MT8195_CLK_TOP_MAINPLL_D7_D2] = > > > > > > > > "mainpll_d7_d2", > > > > > > > > + [MT8195_CLK_TOP_UNIVPLL_D4] = "univpll_d4", > > > > > > > > + /* mux */ > > > > > > > > + [MT8195_CLK_TOP_APLL1_SEL] = "apll1_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL2_SEL] = "apll2_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL3_SEL] = "apll3_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL4_SEL] = "apll4_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL5_SEL] = "apll5_sel", > > > > > > > > + [MT8195_CLK_TOP_A1SYS_HP_SEL] = "a1sys_hp_sel", > > > > > > > > + [MT8195_CLK_TOP_A2SYS_SEL] = "a2sys_sel", > > > > > > > > + [MT8195_CLK_TOP_A3SYS_SEL] = "a3sys_sel", > > > > > > > > + [MT8195_CLK_TOP_A4SYS_SEL] = "a4sys_sel", > > > > > > > > + [MT8195_CLK_TOP_ASM_H_SEL] = "asm_h_sel", > > > > > > > > + [MT8195_CLK_TOP_ASM_M_SEL] = "asm_m_sel", > > > > > > > > + [MT8195_CLK_TOP_ASM_L_SEL] = "asm_l_sel", > > > > > > > > + [MT8195_CLK_TOP_AUD_IEC_SEL] = "aud_iec_sel", > > > > > > > > + [MT8195_CLK_TOP_AUD_INTBUS_SEL] = > > > > > > > > "aud_intbus_sel", > > > > > > > > + [MT8195_CLK_TOP_AUDIO_H_SEL] = "audio_h_sel", > > > > > > > > + [MT8195_CLK_TOP_AUDIO_LOCAL_BUS_SEL] = > > > > > > > > "audio_local_bus_sel", > > > > > > > > + [MT8195_CLK_TOP_DPTX_M_SEL] = "dptx_m_sel", > > > > > > > > + [MT8195_CLK_TOP_INTDIR_SEL] = "intdir_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SO1_M_SEL] = "i2so1_m_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SO2_M_SEL] = "i2so2_m_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SI1_M_SEL] = "i2si1_m_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SI2_M_SEL] = "i2si2_m_sel", > > > > > > > > + /* clock gate */ > > > > > > > > + [MT8195_CLK_TOP_MPHONE_SLAVE_B] = > > > > > > > > "mphone_slave_b", > > > > > > > > + [MT8195_CLK_TOP_CFG_26M_AUD] = "cfg_26m_aud", > > > > > > > > + [MT8195_CLK_INFRA_AO_AUDIO] = "infra_ao_audio", > > > > > > > > + [MT8195_CLK_INFRA_AO_AUDIO_26M_B] = > > > > > > > > "infra_ao_audio_26m_b", > > > > > > > > + [MT8195_CLK_SCP_ADSP_AUDIODSP] = > > > > > > > > "scp_adsp_audiodsp", > > > > > > > > > > > > > > > > > > > > > > + [MT8195_CLK_AUD_AFE] = "aud_afe", > > > > > > > > + [MT8195_CLK_AUD_LRCK_CNT] = "aud_lrck_cnt", > > > > > > > > + [MT8195_CLK_AUD_SPDIFIN_TUNER_APLL] = > > > > > > > > "aud_spdifin_tuner_apll", > > > > > > > > + [MT8195_CLK_AUD_SPDIFIN_TUNER_DBG] = > > > > > > > > "aud_spdifin_tuner_dbg", > > > > > > > > + [MT8195_CLK_AUD_UL_TML] = "aud_ul_tml", > > > > > > > > + [MT8195_CLK_AUD_APLL1_TUNER] = > > > > > > > > "aud_apll1_tuner", > > > > > > > > + [MT8195_CLK_AUD_APLL2_TUNER] = > > > > > > > > "aud_apll2_tuner", > > > > > > > > + [MT8195_CLK_AUD_TOP0_SPDF] = "aud_top0_spdf", > > > > > > > > + [MT8195_CLK_AUD_APLL] = "aud_apll", > > > > > > > > + [MT8195_CLK_AUD_APLL2] = "aud_apll2", > > > > > > > > + [MT8195_CLK_AUD_DAC] = "aud_dac", > > > > > > > > + [MT8195_CLK_AUD_DAC_PREDIS] = "aud_dac_predis", > > > > > > > > + [MT8195_CLK_AUD_TML] = "aud_tml", > > > > > > > > + [MT8195_CLK_AUD_ADC] = "aud_adc", > > > > > > > > + [MT8195_CLK_AUD_DAC_HIRES] = "aud_dac_hires", > > > > > > > > + [MT8195_CLK_AUD_A1SYS_HP] = "aud_a1sys_hp", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC1] = "aud_afe_dmic1", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC2] = "aud_afe_dmic2", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC3] = "aud_afe_dmic3", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC4] = "aud_afe_dmic4", > > > > > > > > + [MT8195_CLK_AUD_AFE_26M_DMIC_TM] = > > > > > > > > "aud_afe_26m_dmic_tm", > > > > > > > > + [MT8195_CLK_AUD_UL_TML_HIRES] = > > > > > > > > "aud_ul_tml_hires", > > > > > > > > + [MT8195_CLK_AUD_ADC_HIRES] = "aud_adc_hires", > > > > > > > > + [MT8195_CLK_AUD_ADDA6_ADC] = "aud_adda6_adc", > > > > > > > > + [MT8195_CLK_AUD_ADDA6_ADC_HIRES] = > > > > > > > > "aud_adda6_adc_hires", > > > > > > > > + [MT8195_CLK_AUD_LINEIN_TUNER] = > > > > > > > > "aud_linein_tuner", > > > > > > > > + [MT8195_CLK_AUD_EARC_TUNER] = "aud_earc_tuner", > > > > > > > > + [MT8195_CLK_AUD_I2SIN] = "aud_i2sin", > > > > > > > > + [MT8195_CLK_AUD_TDM_IN] = "aud_tdm_in", > > > > > > > > + [MT8195_CLK_AUD_I2S_OUT] = "aud_i2s_out", > > > > > > > > + [MT8195_CLK_AUD_TDM_OUT] = "aud_tdm_out", > > > > > > > > + [MT8195_CLK_AUD_HDMI_OUT] = "aud_hdmi_out", > > > > > > > > + [MT8195_CLK_AUD_ASRC11] = "aud_asrc11", > > > > > > > > + [MT8195_CLK_AUD_ASRC12] = "aud_asrc12", > > > > > > > > + [MT8195_CLK_AUD_MULTI_IN] = "aud_multi_in", > > > > > > > > + [MT8195_CLK_AUD_INTDIR] = "aud_intdir", > > > > > > > > + [MT8195_CLK_AUD_A1SYS] = "aud_a1sys", > > > > > > > > + [MT8195_CLK_AUD_A2SYS] = "aud_a2sys", > > > > > > > > + [MT8195_CLK_AUD_PCMIF] = "aud_pcmif", > > > > > > > > + [MT8195_CLK_AUD_A3SYS] = "aud_a3sys", > > > > > > > > + [MT8195_CLK_AUD_A4SYS] = "aud_a4sys", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL1] = "aud_memif_ul1", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL2] = "aud_memif_ul2", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL3] = "aud_memif_ul3", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL4] = "aud_memif_ul4", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL5] = "aud_memif_ul5", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL6] = "aud_memif_ul6", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL8] = "aud_memif_ul8", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL9] = "aud_memif_ul9", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL10] = "aud_memif_ul10", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL2] = "aud_memif_dl2", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL3] = "aud_memif_dl3", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL6] = "aud_memif_dl6", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL7] = "aud_memif_dl7", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL8] = "aud_memif_dl8", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL10] = "aud_memif_dl10", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL11] = "aud_memif_dl11", > > > > > > > > + [MT8195_CLK_AUD_GASRC0] = "aud_gasrc0", > > > > > > > > + [MT8195_CLK_AUD_GASRC1] = "aud_gasrc1", > > > > > > > > + [MT8195_CLK_AUD_GASRC2] = "aud_gasrc2", > > > > > > > > + [MT8195_CLK_AUD_GASRC3] = "aud_gasrc3", > > > > > > > > + [MT8195_CLK_AUD_GASRC4] = "aud_gasrc4", > > > > > > > > + [MT8195_CLK_AUD_GASRC5] = "aud_gasrc5", > > > > > > > > + [MT8195_CLK_AUD_GASRC6] = "aud_gasrc6", > > > > > > > > + [MT8195_CLK_AUD_GASRC7] = "aud_gasrc7", > > > > > > > > + [MT8195_CLK_AUD_GASRC8] = "aud_gasrc8", > > > > > > > > + [MT8195_CLK_AUD_GASRC9] = "aud_gasrc9", > > > > > > > > + [MT8195_CLK_AUD_GASRC10] = "aud_gasrc10", > > > > > > > > + [MT8195_CLK_AUD_GASRC11] = "aud_gasrc11", > > > > > > > > + [MT8195_CLK_AUD_GASRC12] = "aud_gasrc12", > > > > > > > > + [MT8195_CLK_AUD_GASRC13] = "aud_gasrc13", > > > > > > > > + [MT8195_CLK_AUD_GASRC14] = "aud_gasrc14", > > > > > > > > + [MT8195_CLK_AUD_GASRC15] = "aud_gasrc15", > > > > > > > > + [MT8195_CLK_AUD_GASRC16] = "aud_gasrc16", > > > > > > > > + [MT8195_CLK_AUD_GASRC17] = "aud_gasrc17", > > > > > > > > + [MT8195_CLK_AUD_GASRC18] = "aud_gasrc18", > > > > > > > > + [MT8195_CLK_AUD_GASRC19] = "aud_gasrc19", > > > > > > > > > > > > > > The MT8195_CLK_AUD_* clocks are all internal to the audio > > > > > > > subsystem: > > > > > > > the bits that control these clock gates are in the same > > > > > > > address > > > > > > > space > > > > > > > as the audio parts. Would it be possible to model them as > > > > > > > internal > > > > > > > ASoC SUPPLY widgets? The external ones could be modeled > > > > > > > using > > > > > > > ASoC > > > > > > > CLK_SUPPLY widgets, and the dependencies could be modeled > > > > > > > with > > > > > > > ASoC > > > > > > > routes. The ASoC core could then handle power sequencing, > > > > > > > which > > > > > > > the > > > > > > > driver currently does manually. > > > > > > > > > > > > > > IMO this is better than having two drivers handling two > > > > > > > aspects > > > > > > > of > > > > > > > the same piece of hardware, while the two aspects are > > > > > > > intertwined. > > > > > > > > > > > > > > > > > > > Yes, it's ok to use the CLK_SUPPLY and SUPPLY to model such > > > > > > clocks. > > > > > > But those clocks are managed by CCF in the preceding SOCs > > > > > > like > > > > > > mt2701, > > > > > > mt6779 and mt8183. Additionally, in some audio modules, > > > > > > clocks > > > > > > should > > > > > > > > > > This being a new driver, we have some more freedom to improve > > > > > the > > > > > design. > > > > > > > > > > > be enabled before configuring parameters(hw_params). As far > > > > > > as > > > > > > I > > > > > > know, > > > > > > if we use CLK_SUPPLY or SUPPLY to model clocks, the power > > > > > > sequence > > > > > > is > > > > > > controlled by DAPM. It seems to be impossible to fulfill > > > > > > all > > > > > > use > > > > > > cases. > > > > > > That's why we just keep the manual control sequence and CCF > > > > > > seems > > > > > > to be > > > > > > the best choice to model such clock gatess. > > > > > > > > > > I see. So yes, using CCF does give you reference counting, > > > > > dependency > > > > > tracking and other advantages. And using DAPM supplies means > > > > > you > > > > > can't > > > > > enable the clock gates outside of DAPM without both pieces of > > > > > code > > > > > fighting for control. > > > > > > > > > > Can we at least move the audio clock gates into the audio > > > > > driver > > > > > though? > > > > > The arbitrary separation into two devices and drivers is > > > > > fishy. > > > > > And > > > > > with > > > > > the move the external references to the audio clock gates can > > > > > be > > > > > removed. > > > > > > > > > > > > > Because DAPM SUPPLY can't fit our control scenario. > > > > Did you suggest us implement the simple logic control(including > > > > ref > > > > count, clock dependency) for clock gate(MT8195_CLK_AUD_*) in > > > > afe > > > > driver > > > > instead of using CCF? > > > > > > I meant simply moving the CCF-based clk driver code (clk-mt8516- > > > aud.c) > > > from `drivers/clk` and incorporating it into the audio driver, > > > likely > > > in `mt8195-afe-clk.c` or maybe as a separate file. So the audio > > > driver > > > would be a clock provider, and a clock consumer. It will directly > > > use > > > the clocks it provides, internally, and you could remove all > > > those > > > clock references from the device tree. > > > > > > The goal is to have one hardware representation (device node) > > > only, > > > so > > > that it matches the hardware, which is one single unified block. > > > > > > After the driver is completed, we can look for opportunities to > > > improve > > > it, if resources are available. > > > > Thanks for your detailed information. > > I will try to move the CCF-based clk driver code to AFE driver. > > If there are no other internal concerns and blocking problems, I > > will > > include the changes in v3. > > Great. > > > > > > And regarding the clock requirements for different modules, > > > > > could > > > > > we > > > > > have > > > > > that information put in comments somewhere, so if someone > > > > > were to > > > > > revisit > > > > > it later, they would have the information needed to > > > > > understand > > > > > and > > > > > possibly > > > > > improve it? Because right now there's just a bunch of clocks > > > > > enabled > > > > > and > > > > > disabled and nothing to explain why that's needed. > > > > > > > > > > > > > For example, > > > > MT8195_CLK_AUD_ADC(clock gate) is one of the clock feeding to > > > > ADDA > > > > module. > > > > Did you want me show the clock gate list feeding to ADDA? > > > > On the other hand, I didn't know how to show the information > > > > properly > > > > in comments. Could you kindly share me an example for > > > > reference? > > > > > > > > > For example, in `mt8195_afe_enable_reg_rw_clk()` in mt8195-afe- > > > clk.c: > > > > > > unsigned int clk_array[] = { > > > MT8195_CLK_SCP_ADSP_AUDIODSP, > > > MT8195_CLK_TOP_AUDIO_LOCAL_BUS_SEL, > > > MT8195_CLK_TOP_CFG_26M_AUD, > > > MT8195_CLK_INFRA_AO_AUDIO, > > > MT8195_CLK_INFRA_AO_AUDIO_26M_B, > > > MT8195_CLK_TOP_AUD_INTBUS_SEL, > > > MT8195_CLK_TOP_A1SYS_HP_SEL, > > > MT8195_CLK_AUD_A1SYS_HP, > > > MT8195_CLK_AUD_A1SYS, > > > MT8195_CLK_TOP_AUDIO_H_SEL, > > > }; > > > > > > You could add a comment after each line stating why that clock > > > needs > > > to > > > be enabled. A simple note like "bus access clock" or "internal > > > logic > > > clock" > > > would suffice. > > > > > > > OK, I will add short notes to such clock lists. > > > > > The above list also has some redundancies that could be > > > eliminated. > > > MT8195_CLK_TOP_A1SYS_HP_SEL is parent to both > > > MT8195_CLK_AUD_A1SYS_HP > > > and > > > MT8195_CLK_AUD_A1SYS. When clocks are enabled, their parents are > > > also > > > enabled by CCF, so there's no need to enable them explicitly, > > > unless > > > that clock also directly feeds the clock consumer. > > > > > > > OK, I will review all clock usages and remove the unnecessary > > clocks. > > > > > > > > Another thing I wanted to bring up: is any of the code after > > > > > > struct mt8195_afe_tuner_cfg { > > > > > > used? It looks like it is used to configure the five extra PLLs > > > in > > > the audio > > > subsystem, but the exposed (non-static) functions don't seem to > > > be > > > called > > > anywhere. Are they for modules not yet supported? > > > > > > > Yes, tuners are not supported now. > > I will remove the code and add them back when tuners are required > > in > > the future. > > Thanks. > > > ChenYu _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 32BC3C4338F for ; Mon, 26 Jul 2021 14:33:44 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E45CD60F23 for ; Mon, 26 Jul 2021 14:33:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org E45CD60F23 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:CC:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=uUzhrxkY/IZXzHeJyDgs2A8dYlrvH4lr/XSxArS9LiU=; b=cr1LzitvjDzjGq BrFAwkzt3fN8uTJGm8IgMvLOpu+B/+g9WJNJj9S6KJCmxHLPBN8KYILHxX8H1oLIOut5fdOYEU+3C NqKdoGyNh1l5Y8uIS6SzteXJHIhdDVa3fx+7wBPj4Y5So8I+0UWAo0f2ewGA4JDPKI4ExcOSjbPuv ZshVi+wuPWAQF6FVW5x2U77IbVLtJ9BaCqidzXk3b21yHJxLrHwDIx573oqVNe6CWSpFh57fti1Ek cQLEwfHSAiLSOJ2G88JZQj8n8LsaT/AzGLi2TwuhEwBJO1eb7l3Mw4JAQkaR+x/ZXVYcvk6PSFAo5 0ZgAn0gZ9VGQIESxbe6A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m81da-00BWgX-NS; Mon, 26 Jul 2021 14:31:22 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m81dR-00BWfb-IH; Mon, 26 Jul 2021 14:31:18 +0000 X-UUID: b15a22881cc74862ab45e600cd76e3d5-20210726 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=9fs7tslMh1prUEYA/QkKsRBWaDgZ7nrYEvIWIkBVZvY=; b=pqN7wlCoC0PTzj7/i/MywIE2CZmJsI+fCBYAXqM3uTPQ4ElSPnjc+cncCJM4p9rRzPpefNlSoaQn+Q2YD96geBRQz47IUPpcByRQyHk6BX451T7Pn4zbngpFbhxKfiGitcH6LzkR1IBEvFfJds4pfRQJ4cwYzHVREuy6SgeLY64=; X-UUID: b15a22881cc74862ab45e600cd76e3d5-20210726 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1449069056; Mon, 26 Jul 2021 07:31:09 -0700 Received: from MTKMBS06N1.mediatek.inc (172.21.101.129) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 26 Jul 2021 07:31:07 -0700 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs06n1.mediatek.inc (172.21.101.129) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 26 Jul 2021 22:31:06 +0800 Received: from mtksdccf07 (172.21.84.99) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 26 Jul 2021 22:31:06 +0800 Message-ID: Subject: Re: [PATCH v2 5/8] ASoC: mediatek: mt8195: add platform driver From: Trevor Wu To: Chen-Yu Tsai CC: Chun-Jie Chen , , , Rob Herring , Matthias Brugger , , , , LKML , , , Jiaxin Yu , "Jimmy Cheng-Yi Chiang" , Li-Yu Yu Date: Mon, 26 Jul 2021 22:31:06 +0800 In-Reply-To: References: <20210629014736.31153-1-trevor.wu@mediatek.com> <20210629014736.31153-6-trevor.wu@mediatek.com> <9929a3a20df1a89fc94baf7c75c0c65d9a61de0f.camel@mediatek.com> <266fd1f5de56743292ac5fc64664113c0bb0e41a.camel@mediatek.com> <31bcc613abb0f805400faa8b8108100cb578d9b1.camel@mediatek.com> X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210726_073115_110150_F6464EC1 X-CRM114-Status: GOOD ( 61.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, 2021-07-23 at 14:27 +0800, Chen-Yu Tsai wrote: > On Thu, Jul 22, 2021 at 4:56 PM Trevor Wu > wrote: > > > > On Mon, 2021-07-19 at 18:05 +0800, Chen-Yu Tsai wrote: > > > Hi, > > > > > > On Thu, Jul 15, 2021 at 7:05 PM Trevor Wu > > > > > > wrote: > > > > > > > > On Tue, 2021-07-13 at 14:00 +0800, Chen-Yu Tsai wrote: > > > > > On Mon, Jul 12, 2021 at 11:10 PM Trevor Wu < > > > > > trevor.wu@mediatek.com> > > > > > wrote: > > > > > > > > > > > > On Mon, 2021-07-12 at 14:57 +0800, Chen-Yu Tsai wrote: > > > > > > > are all internal Hi, > > > > > > > > > > > > > > On Tue, Jun 29, 2021 at 9:49 AM Trevor Wu < > > > > > > > trevor.wu@mediatek.com > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > This patch adds mt8195 platform and affiliated driver. > > > > > > > > > > > > > > > > Signed-off-by: Trevor Wu > > > > > > > > --- > > > > > > > > sound/soc/mediatek/Kconfig | 9 > > > > > > > > + > > > > > > > > sound/soc/mediatek/Makefile | 1 + > > > > > > > > sound/soc/mediatek/mt8195/Makefile | 11 + > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-clk.c | 899 > > > > > > > > +++++ > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-clk.h | 201 + > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-common.h | 200 + > > > > > > > > sound/soc/mediatek/mt8195/mt8195-afe-pcm.c | 3264 > > > > > > > > +++++++++++++++++ > > > > > > > > sound/soc/mediatek/mt8195/mt8195-reg.h | 2793 > > > > > > > > ++++++++++++++ > > > > > > > > 8 files changed, 7378 insertions(+) > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/Makefile > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > clk.c > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > clk.h > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > common.h > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > afe- > > > > > > > > pcm.c > > > > > > > > create mode 100644 sound/soc/mediatek/mt8195/mt8195- > > > > > > > > reg.h > > > > > > > > > > > > > > > > diff --git a/sound/soc/mediatek/Kconfig > > > > > > > > b/sound/soc/mediatek/Kconfig > > > > > > > > index 74dae4332d17..3389f382be06 100644 > > > > > > > > --- a/sound/soc/mediatek/Kconfig > > > > > > > > +++ b/sound/soc/mediatek/Kconfig > > > > > > > > @@ -184,3 +184,12 @@ config > > > > > > > > SND_SOC_MT8192_MT6359_RT1015_RT5682 > > > > > > > > with the MT6359 RT1015 RT5682 audio codec. > > > > > > > > Select Y if you have such device. > > > > > > > > If unsure select "N". > > > > > > > > + > > > > > > > > +config SND_SOC_MT8195 > > > > > > > > + tristate "ASoC support for Mediatek MT8195 > > > > > > > > chip" > > > > > > > > + select SND_SOC_MEDIATEK > > > > > > > > + help > > > > > > > > + This adds ASoC platform driver support for > > > > > > > > Mediatek > > > > > > > > MT8195 chip > > > > > > > > + that can be used with other codecs. > > > > > > > > + Select Y if you have such device. > > > > > > > > + If unsure select "N". > > > > > > > > diff --git a/sound/soc/mediatek/Makefile > > > > > > > > b/sound/soc/mediatek/Makefile > > > > > > > > index f6cb6b8508e3..34778ca12106 100644 > > > > > > > > --- a/sound/soc/mediatek/Makefile > > > > > > > > +++ b/sound/soc/mediatek/Makefile > > > > > > > > @@ -5,3 +5,4 @@ obj-$(CONFIG_SND_SOC_MT6797) += mt6797/ > > > > > > > > obj-$(CONFIG_SND_SOC_MT8173) += mt8173/ > > > > > > > > obj-$(CONFIG_SND_SOC_MT8183) += mt8183/ > > > > > > > > obj-$(CONFIG_SND_SOC_MT8192) += mt8192/ > > > > > > > > +obj-$(CONFIG_SND_SOC_MT8195) += mt8195/ > > > > > > > > diff --git a/sound/soc/mediatek/mt8195/Makefile > > > > > > > > b/sound/soc/mediatek/mt8195/Makefile > > > > > > > > new file mode 100644 > > > > > > > > index 000000000000..b2c9fd88f39e > > > > > > > > --- /dev/null > > > > > > > > +++ b/sound/soc/mediatek/mt8195/Makefile > > > > > > > > @@ -0,0 +1,11 @@ > > > > > > > > +# SPDX-License-Identifier: GPL-2.0 > > > > > > > > + > > > > > > > > +# platform driver > > > > > > > > +snd-soc-mt8195-afe-objs := \ > > > > > > > > + mt8195-afe-clk.o \ > > > > > > > > + mt8195-afe-pcm.o \ > > > > > > > > + mt8195-dai-adda.o \ > > > > > > > > + mt8195-dai-etdm.o \ > > > > > > > > + mt8195-dai-pcm.o > > > > > > > > + > > > > > > > > +obj-$(CONFIG_SND_SOC_MT8195) += snd-soc-mt8195-afe.o > > > > > > > > diff --git a/sound/soc/mediatek/mt8195/mt8195-afe-clk.c > > > > > > > > b/sound/soc/mediatek/mt8195/mt8195-afe-clk.c > > > > > > > > new file mode 100644 > > > > > > > > index 000000000000..57aa799b4f41 > > > > > > > > --- /dev/null > > > > > > > > +++ b/sound/soc/mediatek/mt8195/mt8195-afe-clk.c > > > > > > > > @@ -0,0 +1,899 @@ > > > > > > > > +// SPDX-License-Identifier: GPL-2.0 > > > > > > > > +/* > > > > > > > > + * mt8195-afe-clk.c -- Mediatek 8195 afe clock ctrl > > > > > > > > + * > > > > > > > > + * Copyright (c) 2021 MediaTek Inc. > > > > > > > > + * Author: Bicycle Tsai > > > > > > > > + * Trevor Wu > > > > > > > > + */ > > > > > > > > + > > > > > > > > +#include > > > > > > > > + > > > > > > > > +#include "mt8195-afe-common.h" > > > > > > > > +#include "mt8195-afe-clk.h" > > > > > > > > +#include "mt8195-reg.h" > > > > > > > > + > > > > > > > > +static const char *aud_clks[MT8195_CLK_NUM] = { > > > > > > > > > > > > > > Most of these clocks are not described in the device tree > > > > > > > binding. If > > > > > > > the driver needs to reference them, they should be > > > > > > > described. > > > > > > > We > > > > > > > should > > > > > > > not be hard-coding clock names across different drivers. > > > > > > > > > > > > > > > > > > > Sorry, I didn't know I have to list all clocks in the dt- > > > > > > binding. > > > > > > Originally, I thought these clocks will be described in the > > > > > > clock > > > > > > binding, so I didn't add them to the binding of afe driver. > > > > > > I will add these clocks to mt8195-afe-pcm.yaml. > > > > > > > > > > If the device consumes clocks, then the clocks that get > > > > > consumed > > > > > should > > > > > be listed in the device's bindings. This is not related to > > > > > the > > > > > clock > > > > > bindings, which is a clock provider. > > > > > > > > > > > > > Got it. Thanks. > > > > > > > > > > > The more important question is, why does the driver need > > > > > > > to > > > > > > > reference > > > > > > > all of them? Maybe we should take a step back and draw > > > > > > > out a > > > > > > > clock > > > > > > > tree > > > > > > > diagram for the hardware? > > > > > > > > > > > > > > > > > > > The clock structure is PLL -> MUX -> GATE. > > > > > > xtal, pll and divider are the possible clock inputs for > > > > > > MUX. > > > > > > Because we select the clock input of audio module based on > > > > > > the > > > > > > use > > > > > > case, we use clk_get to retrive all clocks which are > > > > > > possible > > > > > > to be > > > > > > used. > > > > > > > > > > So I see a couple the driver is doing reparenting: > > > > > > > > > > a. Reparent audio_h to standard oscillator when ADDA is not > > > > > used, > > > > > presumably to let the APLL be turned off > > > > > > > > > > Why not just turn off audio_h? It looks like audio_h feeds a > > > > > couple > > > > > clock > > > > > gates in the audio subsystem. Just a guess, but is this the > > > > > AHB > > > > > bus > > > > > clock? > > > > > Why not just have it parented to "univpll_d7" all the time > > > > > then? > > > > > > > > > > > > > Sorry, I am not sure if it is the AHB bus clock. > > > > I only know how audio module uses the clock. > > > > audio_h feeds to some clock gate like aud_adc_hires, which is > > > > used > > > > when > > > > sampling rate is higher than 48kHz, and hardware designer > > > > suggests > > > > us > > > > use apll1_ck when AFE requrires the clock. > > > > > > I see. So the simplified explanation is high clock rate for high > > > res > > > audio. > > > Would high clock rate work for standard sample rates? > > > > As far as I know, HW will switch clock to hires clock automatically > > when the required rate is high,(ex: aud_adc and aud_adc_hires) so > > it > > can't be controlled by driver. > > I see. That might not be so friendly to the Linux clk driver. > > > > Would using apll1 or univpll all the time work, instead of > > > reparenting? > > > What's the gain if we do reparenting? > > > > > > > As you said before, the gain is apll can be turned off when the > > clock > > is not requrired by ADDA. That's why we didn't use apll all the > > time. > > Right, and what's the gain from turning it off? Lower power > consumption? > Yes. Xtal_26m is supplied to most modules, but APLL1 is mainly used by afe. When audio feature is not used, we hope APLL1 can be turned off to lower power consumption. > > > > As I know, DSP also requires audio_h. > > > > When we disable the clock in AFE driver, the ref count in CCF > > > > is > > > > not > > > > becoming zero if DSP still uses it. > > > > But only AFE requires higher clock rate, so we reparent audio_h > > > > to > > > > 26M > > > > when it's not required in adda module. > > > > > > I see. Wouldn't reparenting the clock while it is in use by > > > another > > > module > > > cause glitches? > > > > I checked with the DSP owner. > > audio_h clock is required for DSP bus, but the clock rate is not > > important. > > The only thing it cares is audio_h should be powered on, so > > reparenting > > is harmless for DSP. > > OK. > > > > > > Also, reparenting really should be done implicitly with > > > > > clk_set_rate() > > > > > with the clock driver supporting reparenting on rate changes. > > > > > > > > > > b. Assignment of PLLs for I2S/PCM MCLK outputs > > > > > > > > > > Is there a reason for explicit assignment, other than clock > > > > > rate > > > > > conflicts? > > > > > CCF supports requesting and locking the clock rate. And > > > > > again, > > > > > implicit > > > > > reparenting should be the norm. The clock driver's purpose is > > > > > to > > > > > fulfill > > > > > any and all clock rate requirements from its consumers. The > > > > > consumer > > > > > should > > > > > only need to ask for the clock rate, not a specific parent, > > > > > unless > > > > > there > > > > > are details that are not yet covered by the CCF. > > > > > > > > > > > > > For MCLK output, we should configure divider to get the target > > > > rate, > > > > and it can only divide the clock from current parent source. > > > > So we should do reparent to divider's parent in case the parent > > > > rate is > > > > not a multiple of target rate. > > > > > > Right. That is expected. What I'm saying is that the CCF provides > > > the > > > framework for automatically reparenting based on the requested > > > clock > > > rate. This is done in the clock driver's .determine_rate op. > > > > > > When properly implemented, and also restricting or locking the > > > clock > > > rates > > > of the PLLs, then you can simply request a clock rate on the leaf > > > clock, > > > in this case one of the MCLKs, and the CCF and clock driver would > > > handle > > > everything else. The consumer should not be reparenting clocks > > > manually > > > unless for a very good reason which cannot be satisfied by the > > > CCF. > > > > > > > In some use cases, we really need to reparent clock manually. > > For example, spdif in(slave) -> .... -> i2s out(master) > > > > APLL3/APLL4 are reserved for slave input like earc in or spdif in, > > which can refer to the external clock source.(APLL3 syncs with > > earc, > > and APLL4 syncs with spdif in.) > > > > When i2s out selects the clock source to APLL4, this makes sure > > that > > spdif in and i2s out works in the same clock source. > > If we just use APLL1/APLL2 on i2s out, there is little rate > > mismatch > > between data input and output. Finally, it results in XRUN. > > I see, that makes more sense. > > > If we only use set_rate, it's possible that it can't switch to the > > expected PLL source, because the rate of APLL3/APLL4 should be > > close to > > APLL1/APLL2. > > Well, in theory the CCF should choose the one with the closest rate. > And if APLL3/APLL4 is already tracking the external clock source, its > clock rate should match. > > If it's a static requirement, maybe we could replace the *-mclk- > source > DT properties with standard assigned-clocks and assigned-clock- > parents? > This would get handled by CCF directly, and then the only thing the > clk driver has to do is make sure it doesn't get reparented again. > > Or is there a need to do reparenting at runtime? > For the use case of APLL3/APLL4, static assignment should be ok. But I checked with CCF owner, we can't just use clk_set_rate(divider, rate) to get expected MCLK output, because reparenting MUX automatically is not supported now. (PLL -> MUX -> divider) We still have to call clk_set_parent() before clk_set_rate(). Which means some information should be got from DTS to check whether the PLL source can be switched or not, so *-mclk-source should be keeped to identify the case. Thanks, Trevor > > > > > A related question: the chip has five APLLs. How many MCLK > > > > > combinations > > > > > does the application need to support? I assume this includes > > > > > the > > > > > standard > > > > > 24.576 MHz and 22.5792 MHz clock rates. > > > > > > > > > > > > > APLL1 and APLL2 are used in most AFE modules, so their rate > > > > should > > > > be > > > > fixed. > > > > APLL1 is fixed to 196608000Hz. > > > > APLL2 is fixed to 180633600Hz. > > > > APLL is inputed to the divider(8bit), and MCLK is the output of > > > > divider. > > > > Other APLLs are reserved for some special usage which can't be > > > > supported by APLL1 & APLL2. > > > > But APLL3~APLL5 aren't used in the series, so I will remove > > > > them in > > > > v3. > > > > > > > > > > Some of them are not used in this series, because some > > > > > > modules > > > > > > are > > > > > > still developing. Should I only keep the clocks that have > > > > > > been > > > > > > used > > > > > > in > > > > > > the series? > > > > > > > > > > Yes please. Only add the ones that are used. Things that > > > > > aren't > > > > > used > > > > > don't get tested and verified, and end up as dead code. If > > > > > there > > > > > are > > > > > plans to extend them in the future, and you can leave > > > > > comments > > > > > stating > > > > > that intent, and also mention it in the cover letter. > > > > > > > > > > > > > OK, I will remove the unused clock in v3. > > > > > > > > > > > > + /* xtal */ > > > > > > > > + [MT8195_CLK_XTAL_26M] = "clk26m", > > > > > > > > + /* pll */ > > > > > > > > + [MT8195_CLK_APMIXED_APLL1] = "apll1", > > > > > > > > + [MT8195_CLK_APMIXED_APLL2] = "apll2", > > > > > > > > + [MT8195_CLK_APMIXED_APLL3] = "apll3", > > > > > > > > + [MT8195_CLK_APMIXED_APLL4] = "apll4", > > > > > > > > + [MT8195_CLK_APMIXED_APLL5] = "apll5", > > > > > > > > + [MT8195_CLK_APMIXED_HDMIRX_APLL] = > > > > > > > > "hdmirx_apll", > > > > > > > > + /* divider */ > > > > > > > > + [MT8195_CLK_TOP_APLL1] = "apll1_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL1_D4] = "apll1_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL2] = "apll2_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL2_D4] = "apll2_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL3] = "apll3_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL3_D4] = "apll3_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL4] = "apll4_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL4_D4] = "apll4_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL5] = "apll5_ck", > > > > > > > > + [MT8195_CLK_TOP_APLL5_D4] = "apll5_d4", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV0] = "apll12_div0", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV1] = "apll12_div1", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV2] = "apll12_div2", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV3] = "apll12_div3", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV4] = "apll12_div4", > > > > > > > > + [MT8195_CLK_TOP_APLL12_DIV9] = "apll12_div9", > > > > > > > > + [MT8195_CLK_TOP_HDMIRX_APLL] = > > > > > > > > "hdmirx_apll_ck", > > > > > > > > + [MT8195_CLK_TOP_MAINPLL_D4_D4] = > > > > > > > > "mainpll_d4_d4", > > > > > > > > + [MT8195_CLK_TOP_MAINPLL_D5_D2] = > > > > > > > > "mainpll_d5_d2", > > > > > > > > + [MT8195_CLK_TOP_MAINPLL_D7_D2] = > > > > > > > > "mainpll_d7_d2", > > > > > > > > + [MT8195_CLK_TOP_UNIVPLL_D4] = "univpll_d4", > > > > > > > > + /* mux */ > > > > > > > > + [MT8195_CLK_TOP_APLL1_SEL] = "apll1_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL2_SEL] = "apll2_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL3_SEL] = "apll3_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL4_SEL] = "apll4_sel", > > > > > > > > + [MT8195_CLK_TOP_APLL5_SEL] = "apll5_sel", > > > > > > > > + [MT8195_CLK_TOP_A1SYS_HP_SEL] = "a1sys_hp_sel", > > > > > > > > + [MT8195_CLK_TOP_A2SYS_SEL] = "a2sys_sel", > > > > > > > > + [MT8195_CLK_TOP_A3SYS_SEL] = "a3sys_sel", > > > > > > > > + [MT8195_CLK_TOP_A4SYS_SEL] = "a4sys_sel", > > > > > > > > + [MT8195_CLK_TOP_ASM_H_SEL] = "asm_h_sel", > > > > > > > > + [MT8195_CLK_TOP_ASM_M_SEL] = "asm_m_sel", > > > > > > > > + [MT8195_CLK_TOP_ASM_L_SEL] = "asm_l_sel", > > > > > > > > + [MT8195_CLK_TOP_AUD_IEC_SEL] = "aud_iec_sel", > > > > > > > > + [MT8195_CLK_TOP_AUD_INTBUS_SEL] = > > > > > > > > "aud_intbus_sel", > > > > > > > > + [MT8195_CLK_TOP_AUDIO_H_SEL] = "audio_h_sel", > > > > > > > > + [MT8195_CLK_TOP_AUDIO_LOCAL_BUS_SEL] = > > > > > > > > "audio_local_bus_sel", > > > > > > > > + [MT8195_CLK_TOP_DPTX_M_SEL] = "dptx_m_sel", > > > > > > > > + [MT8195_CLK_TOP_INTDIR_SEL] = "intdir_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SO1_M_SEL] = "i2so1_m_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SO2_M_SEL] = "i2so2_m_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SI1_M_SEL] = "i2si1_m_sel", > > > > > > > > + [MT8195_CLK_TOP_I2SI2_M_SEL] = "i2si2_m_sel", > > > > > > > > + /* clock gate */ > > > > > > > > + [MT8195_CLK_TOP_MPHONE_SLAVE_B] = > > > > > > > > "mphone_slave_b", > > > > > > > > + [MT8195_CLK_TOP_CFG_26M_AUD] = "cfg_26m_aud", > > > > > > > > + [MT8195_CLK_INFRA_AO_AUDIO] = "infra_ao_audio", > > > > > > > > + [MT8195_CLK_INFRA_AO_AUDIO_26M_B] = > > > > > > > > "infra_ao_audio_26m_b", > > > > > > > > + [MT8195_CLK_SCP_ADSP_AUDIODSP] = > > > > > > > > "scp_adsp_audiodsp", > > > > > > > > > > > > > > > > > > > > > > + [MT8195_CLK_AUD_AFE] = "aud_afe", > > > > > > > > + [MT8195_CLK_AUD_LRCK_CNT] = "aud_lrck_cnt", > > > > > > > > + [MT8195_CLK_AUD_SPDIFIN_TUNER_APLL] = > > > > > > > > "aud_spdifin_tuner_apll", > > > > > > > > + [MT8195_CLK_AUD_SPDIFIN_TUNER_DBG] = > > > > > > > > "aud_spdifin_tuner_dbg", > > > > > > > > + [MT8195_CLK_AUD_UL_TML] = "aud_ul_tml", > > > > > > > > + [MT8195_CLK_AUD_APLL1_TUNER] = > > > > > > > > "aud_apll1_tuner", > > > > > > > > + [MT8195_CLK_AUD_APLL2_TUNER] = > > > > > > > > "aud_apll2_tuner", > > > > > > > > + [MT8195_CLK_AUD_TOP0_SPDF] = "aud_top0_spdf", > > > > > > > > + [MT8195_CLK_AUD_APLL] = "aud_apll", > > > > > > > > + [MT8195_CLK_AUD_APLL2] = "aud_apll2", > > > > > > > > + [MT8195_CLK_AUD_DAC] = "aud_dac", > > > > > > > > + [MT8195_CLK_AUD_DAC_PREDIS] = "aud_dac_predis", > > > > > > > > + [MT8195_CLK_AUD_TML] = "aud_tml", > > > > > > > > + [MT8195_CLK_AUD_ADC] = "aud_adc", > > > > > > > > + [MT8195_CLK_AUD_DAC_HIRES] = "aud_dac_hires", > > > > > > > > + [MT8195_CLK_AUD_A1SYS_HP] = "aud_a1sys_hp", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC1] = "aud_afe_dmic1", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC2] = "aud_afe_dmic2", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC3] = "aud_afe_dmic3", > > > > > > > > + [MT8195_CLK_AUD_AFE_DMIC4] = "aud_afe_dmic4", > > > > > > > > + [MT8195_CLK_AUD_AFE_26M_DMIC_TM] = > > > > > > > > "aud_afe_26m_dmic_tm", > > > > > > > > + [MT8195_CLK_AUD_UL_TML_HIRES] = > > > > > > > > "aud_ul_tml_hires", > > > > > > > > + [MT8195_CLK_AUD_ADC_HIRES] = "aud_adc_hires", > > > > > > > > + [MT8195_CLK_AUD_ADDA6_ADC] = "aud_adda6_adc", > > > > > > > > + [MT8195_CLK_AUD_ADDA6_ADC_HIRES] = > > > > > > > > "aud_adda6_adc_hires", > > > > > > > > + [MT8195_CLK_AUD_LINEIN_TUNER] = > > > > > > > > "aud_linein_tuner", > > > > > > > > + [MT8195_CLK_AUD_EARC_TUNER] = "aud_earc_tuner", > > > > > > > > + [MT8195_CLK_AUD_I2SIN] = "aud_i2sin", > > > > > > > > + [MT8195_CLK_AUD_TDM_IN] = "aud_tdm_in", > > > > > > > > + [MT8195_CLK_AUD_I2S_OUT] = "aud_i2s_out", > > > > > > > > + [MT8195_CLK_AUD_TDM_OUT] = "aud_tdm_out", > > > > > > > > + [MT8195_CLK_AUD_HDMI_OUT] = "aud_hdmi_out", > > > > > > > > + [MT8195_CLK_AUD_ASRC11] = "aud_asrc11", > > > > > > > > + [MT8195_CLK_AUD_ASRC12] = "aud_asrc12", > > > > > > > > + [MT8195_CLK_AUD_MULTI_IN] = "aud_multi_in", > > > > > > > > + [MT8195_CLK_AUD_INTDIR] = "aud_intdir", > > > > > > > > + [MT8195_CLK_AUD_A1SYS] = "aud_a1sys", > > > > > > > > + [MT8195_CLK_AUD_A2SYS] = "aud_a2sys", > > > > > > > > + [MT8195_CLK_AUD_PCMIF] = "aud_pcmif", > > > > > > > > + [MT8195_CLK_AUD_A3SYS] = "aud_a3sys", > > > > > > > > + [MT8195_CLK_AUD_A4SYS] = "aud_a4sys", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL1] = "aud_memif_ul1", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL2] = "aud_memif_ul2", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL3] = "aud_memif_ul3", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL4] = "aud_memif_ul4", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL5] = "aud_memif_ul5", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL6] = "aud_memif_ul6", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL8] = "aud_memif_ul8", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL9] = "aud_memif_ul9", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_UL10] = "aud_memif_ul10", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL2] = "aud_memif_dl2", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL3] = "aud_memif_dl3", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL6] = "aud_memif_dl6", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL7] = "aud_memif_dl7", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL8] = "aud_memif_dl8", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL10] = "aud_memif_dl10", > > > > > > > > + [MT8195_CLK_AUD_MEMIF_DL11] = "aud_memif_dl11", > > > > > > > > + [MT8195_CLK_AUD_GASRC0] = "aud_gasrc0", > > > > > > > > + [MT8195_CLK_AUD_GASRC1] = "aud_gasrc1", > > > > > > > > + [MT8195_CLK_AUD_GASRC2] = "aud_gasrc2", > > > > > > > > + [MT8195_CLK_AUD_GASRC3] = "aud_gasrc3", > > > > > > > > + [MT8195_CLK_AUD_GASRC4] = "aud_gasrc4", > > > > > > > > + [MT8195_CLK_AUD_GASRC5] = "aud_gasrc5", > > > > > > > > + [MT8195_CLK_AUD_GASRC6] = "aud_gasrc6", > > > > > > > > + [MT8195_CLK_AUD_GASRC7] = "aud_gasrc7", > > > > > > > > + [MT8195_CLK_AUD_GASRC8] = "aud_gasrc8", > > > > > > > > + [MT8195_CLK_AUD_GASRC9] = "aud_gasrc9", > > > > > > > > + [MT8195_CLK_AUD_GASRC10] = "aud_gasrc10", > > > > > > > > + [MT8195_CLK_AUD_GASRC11] = "aud_gasrc11", > > > > > > > > + [MT8195_CLK_AUD_GASRC12] = "aud_gasrc12", > > > > > > > > + [MT8195_CLK_AUD_GASRC13] = "aud_gasrc13", > > > > > > > > + [MT8195_CLK_AUD_GASRC14] = "aud_gasrc14", > > > > > > > > + [MT8195_CLK_AUD_GASRC15] = "aud_gasrc15", > > > > > > > > + [MT8195_CLK_AUD_GASRC16] = "aud_gasrc16", > > > > > > > > + [MT8195_CLK_AUD_GASRC17] = "aud_gasrc17", > > > > > > > > + [MT8195_CLK_AUD_GASRC18] = "aud_gasrc18", > > > > > > > > + [MT8195_CLK_AUD_GASRC19] = "aud_gasrc19", > > > > > > > > > > > > > > The MT8195_CLK_AUD_* clocks are all internal to the audio > > > > > > > subsystem: > > > > > > > the bits that control these clock gates are in the same > > > > > > > address > > > > > > > space > > > > > > > as the audio parts. Would it be possible to model them as > > > > > > > internal > > > > > > > ASoC SUPPLY widgets? The external ones could be modeled > > > > > > > using > > > > > > > ASoC > > > > > > > CLK_SUPPLY widgets, and the dependencies could be modeled > > > > > > > with > > > > > > > ASoC > > > > > > > routes. The ASoC core could then handle power sequencing, > > > > > > > which > > > > > > > the > > > > > > > driver currently does manually. > > > > > > > > > > > > > > IMO this is better than having two drivers handling two > > > > > > > aspects > > > > > > > of > > > > > > > the same piece of hardware, while the two aspects are > > > > > > > intertwined. > > > > > > > > > > > > > > > > > > > Yes, it's ok to use the CLK_SUPPLY and SUPPLY to model such > > > > > > clocks. > > > > > > But those clocks are managed by CCF in the preceding SOCs > > > > > > like > > > > > > mt2701, > > > > > > mt6779 and mt8183. Additionally, in some audio modules, > > > > > > clocks > > > > > > should > > > > > > > > > > This being a new driver, we have some more freedom to improve > > > > > the > > > > > design. > > > > > > > > > > > be enabled before configuring parameters(hw_params). As far > > > > > > as > > > > > > I > > > > > > know, > > > > > > if we use CLK_SUPPLY or SUPPLY to model clocks, the power > > > > > > sequence > > > > > > is > > > > > > controlled by DAPM. It seems to be impossible to fulfill > > > > > > all > > > > > > use > > > > > > cases. > > > > > > That's why we just keep the manual control sequence and CCF > > > > > > seems > > > > > > to be > > > > > > the best choice to model such clock gatess. > > > > > > > > > > I see. So yes, using CCF does give you reference counting, > > > > > dependency > > > > > tracking and other advantages. And using DAPM supplies means > > > > > you > > > > > can't > > > > > enable the clock gates outside of DAPM without both pieces of > > > > > code > > > > > fighting for control. > > > > > > > > > > Can we at least move the audio clock gates into the audio > > > > > driver > > > > > though? > > > > > The arbitrary separation into two devices and drivers is > > > > > fishy. > > > > > And > > > > > with > > > > > the move the external references to the audio clock gates can > > > > > be > > > > > removed. > > > > > > > > > > > > > Because DAPM SUPPLY can't fit our control scenario. > > > > Did you suggest us implement the simple logic control(including > > > > ref > > > > count, clock dependency) for clock gate(MT8195_CLK_AUD_*) in > > > > afe > > > > driver > > > > instead of using CCF? > > > > > > I meant simply moving the CCF-based clk driver code (clk-mt8516- > > > aud.c) > > > from `drivers/clk` and incorporating it into the audio driver, > > > likely > > > in `mt8195-afe-clk.c` or maybe as a separate file. So the audio > > > driver > > > would be a clock provider, and a clock consumer. It will directly > > > use > > > the clocks it provides, internally, and you could remove all > > > those > > > clock references from the device tree. > > > > > > The goal is to have one hardware representation (device node) > > > only, > > > so > > > that it matches the hardware, which is one single unified block. > > > > > > After the driver is completed, we can look for opportunities to > > > improve > > > it, if resources are available. > > > > Thanks for your detailed information. > > I will try to move the CCF-based clk driver code to AFE driver. > > If there are no other internal concerns and blocking problems, I > > will > > include the changes in v3. > > Great. > > > > > > And regarding the clock requirements for different modules, > > > > > could > > > > > we > > > > > have > > > > > that information put in comments somewhere, so if someone > > > > > were to > > > > > revisit > > > > > it later, they would have the information needed to > > > > > understand > > > > > and > > > > > possibly > > > > > improve it? Because right now there's just a bunch of clocks > > > > > enabled > > > > > and > > > > > disabled and nothing to explain why that's needed. > > > > > > > > > > > > > For example, > > > > MT8195_CLK_AUD_ADC(clock gate) is one of the clock feeding to > > > > ADDA > > > > module. > > > > Did you want me show the clock gate list feeding to ADDA? > > > > On the other hand, I didn't know how to show the information > > > > properly > > > > in comments. Could you kindly share me an example for > > > > reference? > > > > > > > > > For example, in `mt8195_afe_enable_reg_rw_clk()` in mt8195-afe- > > > clk.c: > > > > > > unsigned int clk_array[] = { > > > MT8195_CLK_SCP_ADSP_AUDIODSP, > > > MT8195_CLK_TOP_AUDIO_LOCAL_BUS_SEL, > > > MT8195_CLK_TOP_CFG_26M_AUD, > > > MT8195_CLK_INFRA_AO_AUDIO, > > > MT8195_CLK_INFRA_AO_AUDIO_26M_B, > > > MT8195_CLK_TOP_AUD_INTBUS_SEL, > > > MT8195_CLK_TOP_A1SYS_HP_SEL, > > > MT8195_CLK_AUD_A1SYS_HP, > > > MT8195_CLK_AUD_A1SYS, > > > MT8195_CLK_TOP_AUDIO_H_SEL, > > > }; > > > > > > You could add a comment after each line stating why that clock > > > needs > > > to > > > be enabled. A simple note like "bus access clock" or "internal > > > logic > > > clock" > > > would suffice. > > > > > > > OK, I will add short notes to such clock lists. > > > > > The above list also has some redundancies that could be > > > eliminated. > > > MT8195_CLK_TOP_A1SYS_HP_SEL is parent to both > > > MT8195_CLK_AUD_A1SYS_HP > > > and > > > MT8195_CLK_AUD_A1SYS. When clocks are enabled, their parents are > > > also > > > enabled by CCF, so there's no need to enable them explicitly, > > > unless > > > that clock also directly feeds the clock consumer. > > > > > > > OK, I will review all clock usages and remove the unnecessary > > clocks. > > > > > > > > Another thing I wanted to bring up: is any of the code after > > > > > > struct mt8195_afe_tuner_cfg { > > > > > > used? It looks like it is used to configure the five extra PLLs > > > in > > > the audio > > > subsystem, but the exposed (non-static) functions don't seem to > > > be > > > called > > > anywhere. Are they for modules not yet supported? > > > > > > > Yes, tuners are not supported now. > > I will remove the code and add them back when tuners are required > > in > > the future. > > Thanks. > > > ChenYu _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2AC40C4338F for ; Mon, 26 Jul 2021 14:31:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F21BB60F44 for ; Mon, 26 Jul 2021 14:31:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233774AbhGZNup (ORCPT ); Mon, 26 Jul 2021 09:50:45 -0400 Received: from mailgw01.mediatek.com ([60.244.123.138]:52598 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S234397AbhGZNuo (ORCPT ); Mon, 26 Jul 2021 09:50:44 -0400 X-UUID: 553247dd14f2407ea272fc0770140fa5-20210726 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=9fs7tslMh1prUEYA/QkKsRBWaDgZ7nrYEvIWIkBVZvY=; b=pqN7wlCoC0PTzj7/i/MywIE2CZmJsI+fCBYAXqM3uTPQ4ElSPnjc+cncCJM4p9rRzPpefNlSoaQn+Q2YD96geBRQz47IUPpcByRQyHk6BX451T7Pn4zbngpFbhxKfiGitcH6LzkR1IBEvFfJds4pfRQJ4cwYzHVREuy6SgeLY64=; X-UUID: 553247dd14f2407ea272fc0770140fa5-20210726 Received: from mtkcas06.mediatek.inc [(172.21.101.30)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1662838556; Mon, 26 Jul 2021 22:31:07 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs06n1.mediatek.inc (172.21.101.129) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 26 Jul 2021 22:31:06 +0800 Received: from mtksdccf07 (172.21.84.99) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 26 Jul 2021 22:31:06 +0800 Message-ID: Subject: Re: [PATCH v2 5/8] ASoC: mediatek: mt8195: add platform driver From: Trevor Wu To: Chen-Yu Tsai CC: Chun-Jie Chen , , , Rob Herring , Matthias Brugger , , , , LKML , , , Jiaxin Yu , "Jimmy Cheng-Yi Chiang" , Li-Yu Yu Date: Mon, 26 Jul 2021 22:31:06 +0800 In-Reply-To: References: <20210629014736.31153-1-trevor.wu@mediatek.com> <20210629014736.31153-6-trevor.wu@mediatek.com> <9929a3a20df1a89fc94baf7c75c0c65d9a61de0f.camel@mediatek.com> <266fd1f5de56743292ac5fc64664113c0bb0e41a.camel@mediatek.com> <31bcc613abb0f805400faa8b8108100cb578d9b1.camel@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org T24gRnJpLCAyMDIxLTA3LTIzIGF0IDE0OjI3ICswODAwLCBDaGVuLVl1IFRzYWkgd3JvdGU6DQo+ IE9uIFRodSwgSnVsIDIyLCAyMDIxIGF0IDQ6NTYgUE0gVHJldm9yIFd1IDx0cmV2b3Iud3VAbWVk aWF0ZWsuY29tPg0KPiB3cm90ZToNCj4gPiANCj4gPiBPbiBNb24sIDIwMjEtMDctMTkgYXQgMTg6 MDUgKzA4MDAsIENoZW4tWXUgVHNhaSB3cm90ZToNCj4gPiA+IEhpLA0KPiA+ID4gDQo+ID4gPiBP biBUaHUsIEp1bCAxNSwgMjAyMSBhdCA3OjA1IFBNIFRyZXZvciBXdSA8dHJldm9yLnd1QG1lZGlh dGVrLmNvbQ0KPiA+ID4gPg0KPiA+ID4gd3JvdGU6DQo+ID4gPiA+IA0KPiA+ID4gPiBPbiBUdWUs IDIwMjEtMDctMTMgYXQgMTQ6MDAgKzA4MDAsIENoZW4tWXUgVHNhaSB3cm90ZToNCj4gPiA+ID4g PiBPbiBNb24sIEp1bCAxMiwgMjAyMSBhdCAxMToxMCBQTSBUcmV2b3IgV3UgPA0KPiA+ID4gPiA+ IHRyZXZvci53dUBtZWRpYXRlay5jb20+DQo+ID4gPiA+ID4gd3JvdGU6DQo+ID4gPiA+ID4gPiAN Cj4gPiA+ID4gPiA+IE9uIE1vbiwgMjAyMS0wNy0xMiBhdCAxNDo1NyArMDgwMCwgQ2hlbi1ZdSBU c2FpIHdyb3RlOg0KPiA+ID4gPiA+ID4gPiAgYXJlIGFsbCBpbnRlcm5hbCBIaSwNCj4gPiA+ID4g PiA+ID4gDQo+ID4gPiA+ID4gPiA+IE9uIFR1ZSwgSnVuIDI5LCAyMDIxIGF0IDk6NDkgQU0gVHJl dm9yIFd1IDwNCj4gPiA+ID4gPiA+ID4gdHJldm9yLnd1QG1lZGlhdGVrLmNvbQ0KPiA+ID4gPiA+ ID4gPiA+IA0KPiA+ID4gPiA+ID4gPiANCj4gPiA+ID4gPiA+ID4gd3JvdGU6DQo+ID4gPiA+ID4g PiA+ID4gDQo+ID4gPiA+ID4gPiA+ID4gVGhpcyBwYXRjaCBhZGRzIG10ODE5NSBwbGF0Zm9ybSBh bmQgYWZmaWxpYXRlZCBkcml2ZXIuDQo+ID4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+ID4g U2lnbmVkLW9mZi1ieTogVHJldm9yIFd1IDx0cmV2b3Iud3VAbWVkaWF0ZWsuY29tPg0KPiA+ID4g PiA+ID4gPiA+IC0tLQ0KPiA+ID4gPiA+ID4gPiA+ICBzb3VuZC9zb2MvbWVkaWF0ZWsvS2NvbmZp ZyAgICAgICAgICAgICAgICAgICAgIHwgICAgOQ0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4g PiA+ID4gPiAgc291bmQvc29jL21lZGlhdGVrL01ha2VmaWxlICAgICAgICAgICAgICAgICAgIHwg ICAgMSArDQo+ID4gPiA+ID4gPiA+ID4gIHNvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvTWFrZWZp bGUgICAgICAgICAgICB8ICAgMTEgKw0KPiA+ID4gPiA+ID4gPiA+ICBzb3VuZC9zb2MvbWVkaWF0 ZWsvbXQ4MTk1L210ODE5NS1hZmUtY2xrLmMgICAgfCAgODk5DQo+ID4gPiA+ID4gPiA+ID4gKysr KysNCj4gPiA+ID4gPiA+ID4gPiAgc291bmQvc29jL21lZGlhdGVrL210ODE5NS9tdDgxOTUtYWZl LWNsay5oICAgIHwgIDIwMSArDQo+ID4gPiA+ID4gPiA+ID4gIHNvdW5kL3NvYy9tZWRpYXRlay9t dDgxOTUvbXQ4MTk1LWFmZS1jb21tb24uaCB8ICAyMDAgKw0KPiA+ID4gPiA+ID4gPiA+ICBzb3Vu ZC9zb2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS1hZmUtcGNtLmMgICAgfCAzMjY0DQo+ID4gPiA+ ID4gPiA+ID4gKysrKysrKysrKysrKysrKysNCj4gPiA+ID4gPiA+ID4gPiAgc291bmQvc29jL21l ZGlhdGVrL210ODE5NS9tdDgxOTUtcmVnLmggICAgICAgIHwgMjc5Mw0KPiA+ID4gPiA+ID4gPiA+ ICsrKysrKysrKysrKysrDQo+ID4gPiA+ID4gPiA+ID4gIDggZmlsZXMgY2hhbmdlZCwgNzM3OCBp bnNlcnRpb25zKCspDQo+ID4gPiA+ID4gPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9z b2MvbWVkaWF0ZWsvbXQ4MTk1L01ha2VmaWxlDQo+ID4gPiA+ID4gPiA+ID4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBzb3VuZC9zb2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS0NCj4gPiA+ID4gPiA+ID4g PiBhZmUtDQo+ID4gPiA+ID4gPiA+ID4gY2xrLmMNCj4gPiA+ID4gPiA+ID4gPiAgY3JlYXRlIG1v ZGUgMTAwNjQ0IHNvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvbXQ4MTk1LQ0KPiA+ID4gPiA+ID4g PiA+IGFmZS0NCj4gPiA+ID4gPiA+ID4gPiBjbGsuaA0KPiA+ID4gPiA+ID4gPiA+ICBjcmVhdGUg bW9kZSAxMDA2NDQgc291bmQvc29jL21lZGlhdGVrL210ODE5NS9tdDgxOTUtDQo+ID4gPiA+ID4g PiA+ID4gYWZlLQ0KPiA+ID4gPiA+ID4gPiA+IGNvbW1vbi5oDQo+ID4gPiA+ID4gPiA+ID4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS0NCj4gPiA+ ID4gPiA+ID4gPiBhZmUtDQo+ID4gPiA+ID4gPiA+ID4gcGNtLmMNCj4gPiA+ID4gPiA+ID4gPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvbXQ4MTk1LQ0KPiA+ ID4gPiA+ID4gPiA+IHJlZy5oDQo+ID4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+ID4gZGlm ZiAtLWdpdCBhL3NvdW5kL3NvYy9tZWRpYXRlay9LY29uZmlnDQo+ID4gPiA+ID4gPiA+ID4gYi9z b3VuZC9zb2MvbWVkaWF0ZWsvS2NvbmZpZw0KPiA+ID4gPiA+ID4gPiA+IGluZGV4IDc0ZGFlNDMz MmQxNy4uMzM4OWYzODJiZTA2IDEwMDY0NA0KPiA+ID4gPiA+ID4gPiA+IC0tLSBhL3NvdW5kL3Nv Yy9tZWRpYXRlay9LY29uZmlnDQo+ID4gPiA+ID4gPiA+ID4gKysrIGIvc291bmQvc29jL21lZGlh dGVrL0tjb25maWcNCj4gPiA+ID4gPiA+ID4gPiBAQCAtMTg0LDMgKzE4NCwxMiBAQCBjb25maWcN Cj4gPiA+ID4gPiA+ID4gPiBTTkRfU09DX01UODE5Ml9NVDYzNTlfUlQxMDE1X1JUNTY4Mg0KPiA+ ID4gPiA+ID4gPiA+ICAgICAgICAgICB3aXRoIHRoZSBNVDYzNTkgUlQxMDE1IFJUNTY4MiBhdWRp byBjb2RlYy4NCj4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgU2VsZWN0IFkgaWYgeW91IGhhdmUg c3VjaCBkZXZpY2UuDQo+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgIElmIHVuc3VyZSBzZWxlY3Qg Ik4iLg0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiArY29uZmlnIFNORF9TT0Nf TVQ4MTk1DQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICB0cmlzdGF0ZSAiQVNvQyBzdXBwb3J0IGZv ciBNZWRpYXRlayBNVDgxOTUNCj4gPiA+ID4gPiA+ID4gPiBjaGlwIg0KPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgc2VsZWN0IFNORF9TT0NfTUVESUFURUsNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IGhlbHANCj4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgVGhpcyBhZGRzIEFTb0MgcGxhdGZvcm0g ZHJpdmVyIHN1cHBvcnQgZm9yDQo+ID4gPiA+ID4gPiA+ID4gTWVkaWF0ZWsNCj4gPiA+ID4gPiA+ ID4gPiBNVDgxOTUgY2hpcA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICB0aGF0IGNhbiBiZSB1 c2VkIHdpdGggb3RoZXIgY29kZWNzLg0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICBTZWxlY3Qg WSBpZiB5b3UgaGF2ZSBzdWNoIGRldmljZS4NCj4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgSWYg dW5zdXJlIHNlbGVjdCAiTiIuDQo+ID4gPiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL3NvdW5kL3Nv Yy9tZWRpYXRlay9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IGIvc291bmQvc29jL21lZGlhdGVr L01ha2VmaWxlDQo+ID4gPiA+ID4gPiA+ID4gaW5kZXggZjZjYjZiODUwOGUzLi4zNDc3OGNhMTIx MDYgMTAwNjQ0DQo+ID4gPiA+ID4gPiA+ID4gLS0tIGEvc291bmQvc29jL21lZGlhdGVrL01ha2Vm aWxlDQo+ID4gPiA+ID4gPiA+ID4gKysrIGIvc291bmQvc29jL21lZGlhdGVrL01ha2VmaWxlDQo+ ID4gPiA+ID4gPiA+ID4gQEAgLTUsMyArNSw0IEBAIG9iai0kKENPTkZJR19TTkRfU09DX01UNjc5 NykgKz0gbXQ2Nzk3Lw0KPiA+ID4gPiA+ID4gPiA+ICBvYmotJChDT05GSUdfU05EX1NPQ19NVDgx NzMpICs9IG10ODE3My8NCj4gPiA+ID4gPiA+ID4gPiAgb2JqLSQoQ09ORklHX1NORF9TT0NfTVQ4 MTgzKSArPSBtdDgxODMvDQo+ID4gPiA+ID4gPiA+ID4gIG9iai0kKENPTkZJR19TTkRfU09DX01U ODE5MikgKz0gbXQ4MTkyLw0KPiA+ID4gPiA+ID4gPiA+ICtvYmotJChDT05GSUdfU05EX1NPQ19N VDgxOTUpICs9IG10ODE5NS8NCj4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvc291bmQvc29j L21lZGlhdGVrL210ODE5NS9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IGIvc291bmQvc29jL21l ZGlhdGVrL210ODE5NS9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0DQo+ID4gPiA+ID4gPiA+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5iMmM5ZmQ4OGYzOWUNCj4g PiA+ID4gPiA+ID4gPiAtLS0gL2Rldi9udWxsDQo+ID4gPiA+ID4gPiA+ID4gKysrIGIvc291bmQv c29jL21lZGlhdGVrL210ODE5NS9NYWtlZmlsZQ0KPiA+ID4gPiA+ID4gPiA+IEBAIC0wLDAgKzEs MTEgQEANCj4gPiA+ID4gPiA+ID4gPiArIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MA0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiArIyBwbGF0Zm9ybSBkcml2ZXIN Cj4gPiA+ID4gPiA+ID4gPiArc25kLXNvYy1tdDgxOTUtYWZlLW9ianMgOj0gXA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgbXQ4MTk1LWFmZS1jbGsubyBcDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBtdDgxOTUtYWZlLXBjbS5vIFwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIG10ODE5NS1kYWkt YWRkYS5vIFwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIG10ODE5NS1kYWktZXRkbS5vIFwNCj4g PiA+ID4gPiA+ID4gPiArICAgICAgIG10ODE5NS1kYWktcGNtLm8NCj4gPiA+ID4gPiA+ID4gPiAr DQo+ID4gPiA+ID4gPiA+ID4gK29iai0kKENPTkZJR19TTkRfU09DX01UODE5NSkgKz0gc25kLXNv Yy1tdDgxOTUtYWZlLm8NCj4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL21l ZGlhdGVrL210ODE5NS9tdDgxOTUtYWZlLWNsay5jDQo+ID4gPiA+ID4gPiA+ID4gYi9zb3VuZC9z b2MvbWVkaWF0ZWsvbXQ4MTk1L210ODE5NS1hZmUtY2xrLmMNCj4gPiA+ID4gPiA+ID4gPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NA0KPiA+ID4gPiA+ID4gPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uNTdh YTc5OWI0ZjQxDQo+ID4gPiA+ID4gPiA+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ID4gPiA+ID4gPiA+ ICsrKyBiL3NvdW5kL3NvYy9tZWRpYXRlay9tdDgxOTUvbXQ4MTk1LWFmZS1jbGsuYw0KPiA+ID4g PiA+ID4gPiA+IEBAIC0wLDAgKzEsODk5IEBADQo+ID4gPiA+ID4gPiA+ID4gKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQo+ID4gPiA+ID4gPiA+ID4gKy8qDQo+ID4gPiA+ID4g PiA+ID4gKyAqIG10ODE5NS1hZmUtY2xrLmMgIC0tICBNZWRpYXRlayA4MTk1IGFmZSBjbG9jayBj dHJsDQo+ID4gPiA+ID4gPiA+ID4gKyAqDQo+ID4gPiA+ID4gPiA+ID4gKyAqIENvcHlyaWdodCAo YykgMjAyMSBNZWRpYVRlayBJbmMuDQo+ID4gPiA+ID4gPiA+ID4gKyAqIEF1dGhvcjogQmljeWNs ZSBUc2FpIDxiaWN5Y2xlLnRzYWlAbWVkaWF0ZWsuY29tPg0KPiA+ID4gPiA+ID4gPiA+ICsgKiAg ICAgICAgIFRyZXZvciBXdSA8dHJldm9yLnd1QG1lZGlhdGVrLmNvbT4NCj4gPiA+ID4gPiA+ID4g PiArICovDQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICsjaW5jbHVkZSA8bGlu dXgvY2xrLmg+DQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICsjaW5jbHVkZSAi bXQ4MTk1LWFmZS1jb21tb24uaCINCj4gPiA+ID4gPiA+ID4gPiArI2luY2x1ZGUgIm10ODE5NS1h ZmUtY2xrLmgiDQo+ID4gPiA+ID4gPiA+ID4gKyNpbmNsdWRlICJtdDgxOTUtcmVnLmgiDQo+ID4g PiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICtzdGF0aWMgY29uc3QgY2hhciAqYXVkX2Ns a3NbTVQ4MTk1X0NMS19OVU1dID0gew0KPiA+ID4gPiA+ID4gPiANCj4gPiA+ID4gPiA+ID4gTW9z dCBvZiB0aGVzZSBjbG9ja3MgYXJlIG5vdCBkZXNjcmliZWQgaW4gdGhlIGRldmljZSB0cmVlDQo+ ID4gPiA+ID4gPiA+IGJpbmRpbmcuIElmDQo+ID4gPiA+ID4gPiA+IHRoZSBkcml2ZXIgbmVlZHMg dG8gcmVmZXJlbmNlIHRoZW0sIHRoZXkgc2hvdWxkIGJlDQo+ID4gPiA+ID4gPiA+IGRlc2NyaWJl ZC4NCj4gPiA+ID4gPiA+ID4gV2UNCj4gPiA+ID4gPiA+ID4gc2hvdWxkDQo+ID4gPiA+ID4gPiA+ IG5vdCBiZSBoYXJkLWNvZGluZyBjbG9jayBuYW1lcyBhY3Jvc3MgZGlmZmVyZW50IGRyaXZlcnMu DQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiBTb3JyeSwgSSBkaWRu J3Qga25vdyBJIGhhdmUgdG8gbGlzdCBhbGwgY2xvY2tzIGluIHRoZSBkdC0NCj4gPiA+ID4gPiA+ IGJpbmRpbmcuDQo+ID4gPiA+ID4gPiBPcmlnaW5hbGx5LCBJIHRob3VnaHQgdGhlc2UgY2xvY2tz IHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZQ0KPiA+ID4gPiA+ID4gY2xvY2sNCj4gPiA+ID4gPiA+ IGJpbmRpbmcsIHNvIEkgZGlkbid0IGFkZCB0aGVtIHRvIHRoZSBiaW5kaW5nIG9mIGFmZSBkcml2 ZXIuDQo+ID4gPiA+ID4gPiBJIHdpbGwgYWRkIHRoZXNlIGNsb2NrcyB0byBtdDgxOTUtYWZlLXBj bS55YW1sLg0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+IElmIHRoZSBkZXZpY2UgY29uc3VtZXMgY2xv Y2tzLCB0aGVuIHRoZSBjbG9ja3MgdGhhdCBnZXQNCj4gPiA+ID4gPiBjb25zdW1lZA0KPiA+ID4g PiA+IHNob3VsZA0KPiA+ID4gPiA+IGJlIGxpc3RlZCBpbiB0aGUgZGV2aWNlJ3MgYmluZGluZ3Mu IFRoaXMgaXMgbm90IHJlbGF0ZWQgdG8NCj4gPiA+ID4gPiB0aGUNCj4gPiA+ID4gPiBjbG9jaw0K PiA+ID4gPiA+IGJpbmRpbmdzLCB3aGljaCBpcyBhIGNsb2NrIHByb3ZpZGVyLg0KPiA+ID4gPiA+ IA0KPiA+ID4gPiANCj4gPiA+ID4gR290IGl0LiBUaGFua3MuDQo+ID4gPiA+IA0KPiA+ID4gPiA+ ID4gPiBUaGUgbW9yZSBpbXBvcnRhbnQgcXVlc3Rpb24gaXMsIHdoeSBkb2VzIHRoZSBkcml2ZXIg bmVlZA0KPiA+ID4gPiA+ID4gPiB0bw0KPiA+ID4gPiA+ID4gPiByZWZlcmVuY2UNCj4gPiA+ID4g PiA+ID4gYWxsIG9mIHRoZW0/IE1heWJlIHdlIHNob3VsZCB0YWtlIGEgc3RlcCBiYWNrIGFuZCBk cmF3DQo+ID4gPiA+ID4gPiA+IG91dCBhDQo+ID4gPiA+ID4gPiA+IGNsb2NrDQo+ID4gPiA+ID4g PiA+IHRyZWUNCj4gPiA+ID4gPiA+ID4gZGlhZ3JhbSBmb3IgdGhlIGhhcmR3YXJlPw0KPiA+ID4g PiA+ID4gPiANCj4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4gVGhlIGNsb2NrIHN0cnVjdHVyZSBp cyBQTEwgLT4gTVVYIC0+IEdBVEUuDQo+ID4gPiA+ID4gPiB4dGFsLCBwbGwgYW5kIGRpdmlkZXIg YXJlIHRoZSBwb3NzaWJsZSBjbG9jayBpbnB1dHMgZm9yDQo+ID4gPiA+ID4gPiBNVVguDQo+ID4g PiA+ID4gPiBCZWNhdXNlIHdlIHNlbGVjdCB0aGUgY2xvY2sgaW5wdXQgb2YgYXVkaW8gbW9kdWxl IGJhc2VkIG9uDQo+ID4gPiA+ID4gPiB0aGUNCj4gPiA+ID4gPiA+IHVzZQ0KPiA+ID4gPiA+ID4g Y2FzZSwgd2UgdXNlIGNsa19nZXQgdG8gcmV0cml2ZSBhbGwgY2xvY2tzIHdoaWNoIGFyZQ0KPiA+ ID4gPiA+ID4gcG9zc2libGUNCj4gPiA+ID4gPiA+IHRvIGJlDQo+ID4gPiA+ID4gPiB1c2VkLg0K PiA+ID4gPiA+IA0KPiA+ID4gPiA+IFNvIEkgc2VlIGEgY291cGxlIHRoZSBkcml2ZXIgaXMgZG9p bmcgcmVwYXJlbnRpbmc6DQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gICBhLiBSZXBhcmVudCBhdWRp b19oIHRvIHN0YW5kYXJkIG9zY2lsbGF0b3Igd2hlbiBBRERBIGlzIG5vdA0KPiA+ID4gPiA+IHVz ZWQsDQo+ID4gPiA+ID4gICAgICBwcmVzdW1hYmx5IHRvIGxldCB0aGUgQVBMTCBiZSB0dXJuZWQg b2ZmDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gV2h5IG5vdCBqdXN0IHR1cm4gb2ZmIGF1ZGlvX2g/ IEl0IGxvb2tzIGxpa2UgYXVkaW9faCBmZWVkcyBhDQo+ID4gPiA+ID4gY291cGxlDQo+ID4gPiA+ ID4gY2xvY2sNCj4gPiA+ID4gPiBnYXRlcyBpbiB0aGUgYXVkaW8gc3Vic3lzdGVtLiBKdXN0IGEg Z3Vlc3MsIGJ1dCBpcyB0aGlzIHRoZQ0KPiA+ID4gPiA+IEFIQg0KPiA+ID4gPiA+IGJ1cw0KPiA+ ID4gPiA+IGNsb2NrPw0KPiA+ID4gPiA+IFdoeSBub3QganVzdCBoYXZlIGl0IHBhcmVudGVkIHRv ICJ1bml2cGxsX2Q3IiBhbGwgdGhlIHRpbWUNCj4gPiA+ID4gPiB0aGVuPw0KPiA+ID4gPiA+IA0K PiA+ID4gPiANCj4gPiA+ID4gU29ycnksIEkgYW0gbm90IHN1cmUgaWYgaXQgaXMgdGhlIEFIQiBi dXMgY2xvY2suDQo+ID4gPiA+IEkgb25seSBrbm93IGhvdyBhdWRpbyBtb2R1bGUgdXNlcyB0aGUg Y2xvY2suDQo+ID4gPiA+IGF1ZGlvX2ggZmVlZHMgdG8gc29tZSBjbG9jayBnYXRlIGxpa2UgYXVk X2FkY19oaXJlcywgd2hpY2ggaXMNCj4gPiA+ID4gdXNlZA0KPiA+ID4gPiB3aGVuDQo+ID4gPiA+ IHNhbXBsaW5nIHJhdGUgaXMgaGlnaGVyIHRoYW4gNDhrSHosIGFuZCBoYXJkd2FyZSBkZXNpZ25l cg0KPiA+ID4gPiBzdWdnZXN0cw0KPiA+ID4gPiB1cw0KPiA+ID4gPiB1c2UgYXBsbDFfY2sgd2hl biBBRkUgcmVxdXJpcmVzIHRoZSBjbG9jay4NCj4gPiA+IA0KPiA+ID4gSSBzZWUuIFNvIHRoZSBz aW1wbGlmaWVkIGV4cGxhbmF0aW9uIGlzIGhpZ2ggY2xvY2sgcmF0ZSBmb3IgaGlnaA0KPiA+ID4g cmVzDQo+ID4gPiBhdWRpby4NCj4gPiA+IFdvdWxkIGhpZ2ggY2xvY2sgcmF0ZSB3b3JrIGZvciBz dGFuZGFyZCBzYW1wbGUgcmF0ZXM/DQo+ID4gDQo+ID4gQXMgZmFyIGFzIEkga25vdywgSFcgd2ls bCBzd2l0Y2ggY2xvY2sgdG8gaGlyZXMgY2xvY2sgYXV0b21hdGljYWxseQ0KPiA+IHdoZW4gdGhl IHJlcXVpcmVkIHJhdGUgaXMgaGlnaCwoZXg6IGF1ZF9hZGMgYW5kIGF1ZF9hZGNfaGlyZXMpIHNv DQo+ID4gaXQNCj4gPiBjYW4ndCBiZSBjb250cm9sbGVkIGJ5IGRyaXZlci4NCj4gDQo+IEkgc2Vl LiBUaGF0IG1pZ2h0IG5vdCBiZSBzbyBmcmllbmRseSB0byB0aGUgTGludXggY2xrIGRyaXZlci4N Cj4gDQo+ID4gPiBXb3VsZCB1c2luZyBhcGxsMSBvciB1bml2cGxsIGFsbCB0aGUgdGltZSB3b3Jr LCBpbnN0ZWFkIG9mDQo+ID4gPiByZXBhcmVudGluZz8NCj4gPiA+IFdoYXQncyB0aGUgZ2FpbiBp ZiB3ZSBkbyByZXBhcmVudGluZz8NCj4gPiA+IA0KPiA+IA0KPiA+IEFzIHlvdSBzYWlkIGJlZm9y ZSwgdGhlIGdhaW4gaXMgYXBsbCBjYW4gYmUgdHVybmVkIG9mZiB3aGVuIHRoZQ0KPiA+IGNsb2Nr DQo+ID4gaXMgbm90IHJlcXVyaXJlZCBieSBBRERBLiBUaGF0J3Mgd2h5IHdlIGRpZG4ndCB1c2Ug YXBsbCBhbGwgdGhlDQo+ID4gdGltZS4NCj4gDQo+IFJpZ2h0LCBhbmQgd2hhdCdzIHRoZSBnYWlu IGZyb20gdHVybmluZyBpdCBvZmY/IExvd2VyIHBvd2VyDQo+IGNvbnN1bXB0aW9uPw0KPiANCg0K WWVzLiBYdGFsXzI2bSBpcyBzdXBwbGllZCB0byBtb3N0IG1vZHVsZXMsIGJ1dCBBUExMMSBpcyBt YWlubHkgdXNlZCBieQ0KYWZlLiBXaGVuIGF1ZGlvIGZlYXR1cmUgaXMgbm90IHVzZWQsIHdlIGhv cGUgQVBMTDEgY2FuIGJlIHR1cm5lZCBvZmYgdG8NCmxvd2VyIHBvd2VyIGNvbnN1bXB0aW9uLg0K DQo+ID4gPiA+IEFzIEkga25vdywgRFNQIGFsc28gcmVxdWlyZXMgYXVkaW9faC4NCj4gPiA+ID4g V2hlbiB3ZSBkaXNhYmxlIHRoZSBjbG9jayBpbiBBRkUgZHJpdmVyLCB0aGUgcmVmIGNvdW50IGlu IENDRg0KPiA+ID4gPiBpcw0KPiA+ID4gPiBub3QNCj4gPiA+ID4gYmVjb21pbmcgemVybyBpZiBE U1Agc3RpbGwgdXNlcyBpdC4NCj4gPiA+ID4gQnV0IG9ubHkgQUZFIHJlcXVpcmVzIGhpZ2hlciBj bG9jayByYXRlLCBzbyB3ZSByZXBhcmVudCBhdWRpb19oDQo+ID4gPiA+IHRvDQo+ID4gPiA+IDI2 TQ0KPiA+ID4gPiB3aGVuIGl0J3Mgbm90IHJlcXVpcmVkIGluIGFkZGEgbW9kdWxlLg0KPiA+ID4g DQo+ID4gPiBJIHNlZS4gV291bGRuJ3QgcmVwYXJlbnRpbmcgdGhlIGNsb2NrIHdoaWxlIGl0IGlz IGluIHVzZSBieQ0KPiA+ID4gYW5vdGhlcg0KPiA+ID4gbW9kdWxlDQo+ID4gPiBjYXVzZSBnbGl0 Y2hlcz8NCj4gPiANCj4gPiBJIGNoZWNrZWQgd2l0aCB0aGUgRFNQIG93bmVyLg0KPiA+IGF1ZGlv X2ggY2xvY2sgaXMgcmVxdWlyZWQgZm9yIERTUCBidXMsIGJ1dCB0aGUgY2xvY2sgcmF0ZSBpcyBu b3QNCj4gPiBpbXBvcnRhbnQuDQo+ID4gVGhlIG9ubHkgdGhpbmcgaXQgY2FyZXMgaXMgYXVkaW9f aCBzaG91bGQgYmUgcG93ZXJlZCBvbiwgc28NCj4gPiByZXBhcmVudGluZw0KPiA+IGlzIGhhcm1s ZXNzIGZvciBEU1AuDQo+IA0KPiBPSy4NCj4gDQo+ID4gPiA+ID4gQWxzbywgcmVwYXJlbnRpbmcg cmVhbGx5IHNob3VsZCBiZSBkb25lIGltcGxpY2l0bHkgd2l0aA0KPiA+ID4gPiA+IGNsa19zZXRf cmF0ZSgpDQo+ID4gPiA+ID4gd2l0aCB0aGUgY2xvY2sgZHJpdmVyIHN1cHBvcnRpbmcgcmVwYXJl bnRpbmcgb24gcmF0ZSBjaGFuZ2VzLg0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+ICAgYi4gQXNzaWdu bWVudCBvZiBQTExzIGZvciBJMlMvUENNIE1DTEsgb3V0cHV0cw0KPiA+ID4gPiA+IA0KPiA+ID4g PiA+IElzIHRoZXJlIGEgcmVhc29uIGZvciBleHBsaWNpdCBhc3NpZ25tZW50LCBvdGhlciB0aGFu IGNsb2NrDQo+ID4gPiA+ID4gcmF0ZQ0KPiA+ID4gPiA+IGNvbmZsaWN0cz8NCj4gPiA+ID4gPiBD Q0Ygc3VwcG9ydHMgcmVxdWVzdGluZyBhbmQgbG9ja2luZyB0aGUgY2xvY2sgcmF0ZS4gQW5kDQo+ ID4gPiA+ID4gYWdhaW4sDQo+ID4gPiA+ID4gaW1wbGljaXQNCj4gPiA+ID4gPiByZXBhcmVudGlu ZyBzaG91bGQgYmUgdGhlIG5vcm0uIFRoZSBjbG9jayBkcml2ZXIncyBwdXJwb3NlIGlzDQo+ID4g PiA+ID4gdG8NCj4gPiA+ID4gPiBmdWxmaWxsDQo+ID4gPiA+ID4gYW55IGFuZCBhbGwgY2xvY2sg cmF0ZSByZXF1aXJlbWVudHMgZnJvbSBpdHMgY29uc3VtZXJzLiBUaGUNCj4gPiA+ID4gPiBjb25z dW1lcg0KPiA+ID4gPiA+IHNob3VsZA0KPiA+ID4gPiA+IG9ubHkgbmVlZCB0byBhc2sgZm9yIHRo ZSBjbG9jayByYXRlLCBub3QgYSBzcGVjaWZpYyBwYXJlbnQsDQo+ID4gPiA+ID4gdW5sZXNzDQo+ ID4gPiA+ID4gdGhlcmUNCj4gPiA+ID4gPiBhcmUgZGV0YWlscyB0aGF0IGFyZSBub3QgeWV0IGNv dmVyZWQgYnkgdGhlIENDRi4NCj4gPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+IEZvciBNQ0xL IG91dHB1dCwgd2Ugc2hvdWxkIGNvbmZpZ3VyZSBkaXZpZGVyIHRvIGdldCB0aGUgdGFyZ2V0DQo+ ID4gPiA+IHJhdGUsDQo+ID4gPiA+IGFuZCBpdCBjYW4gb25seSBkaXZpZGUgdGhlIGNsb2NrIGZy b20gY3VycmVudCBwYXJlbnQgc291cmNlLg0KPiA+ID4gPiBTbyB3ZSBzaG91bGQgZG8gcmVwYXJl bnQgdG8gZGl2aWRlcidzIHBhcmVudCBpbiBjYXNlIHRoZSBwYXJlbnQNCj4gPiA+ID4gcmF0ZSBp cw0KPiA+ID4gPiBub3QgYSBtdWx0aXBsZSBvZiB0YXJnZXQgcmF0ZS4NCj4gPiA+IA0KPiA+ID4g UmlnaHQuIFRoYXQgaXMgZXhwZWN0ZWQuIFdoYXQgSSdtIHNheWluZyBpcyB0aGF0IHRoZSBDQ0Yg cHJvdmlkZXMNCj4gPiA+IHRoZQ0KPiA+ID4gZnJhbWV3b3JrIGZvciBhdXRvbWF0aWNhbGx5IHJl cGFyZW50aW5nIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQNCj4gPiA+IGNsb2NrDQo+ID4gPiByYXRl LiBUaGlzIGlzIGRvbmUgaW4gdGhlIGNsb2NrIGRyaXZlcidzIC5kZXRlcm1pbmVfcmF0ZSBvcC4N Cj4gPiA+IA0KPiA+ID4gV2hlbiBwcm9wZXJseSBpbXBsZW1lbnRlZCwgYW5kIGFsc28gcmVzdHJp Y3Rpbmcgb3IgbG9ja2luZyB0aGUNCj4gPiA+IGNsb2NrDQo+ID4gPiByYXRlcw0KPiA+ID4gb2Yg dGhlIFBMTHMsIHRoZW4geW91IGNhbiBzaW1wbHkgcmVxdWVzdCBhIGNsb2NrIHJhdGUgb24gdGhl IGxlYWYNCj4gPiA+IGNsb2NrLA0KPiA+ID4gaW4gdGhpcyBjYXNlIG9uZSBvZiB0aGUgTUNMS3Ms IGFuZCB0aGUgQ0NGIGFuZCBjbG9jayBkcml2ZXIgd291bGQNCj4gPiA+IGhhbmRsZQ0KPiA+ID4g ZXZlcnl0aGluZyBlbHNlLiBUaGUgY29uc3VtZXIgc2hvdWxkIG5vdCBiZSByZXBhcmVudGluZyBj bG9ja3MNCj4gPiA+IG1hbnVhbGx5DQo+ID4gPiB1bmxlc3MgZm9yIGEgdmVyeSBnb29kIHJlYXNv biB3aGljaCBjYW5ub3QgYmUgc2F0aXNmaWVkIGJ5IHRoZQ0KPiA+ID4gQ0NGLg0KPiA+ID4gDQo+ ID4gDQo+ID4gSW4gc29tZSB1c2UgY2FzZXMsIHdlIHJlYWxseSBuZWVkIHRvIHJlcGFyZW50IGNs b2NrIG1hbnVhbGx5Lg0KPiA+IEZvciBleGFtcGxlLCBzcGRpZiBpbihzbGF2ZSkgLT4gLi4uLiAt PiBpMnMgb3V0KG1hc3RlcikNCj4gPiANCj4gPiBBUExMMy9BUExMNCBhcmUgcmVzZXJ2ZWQgZm9y IHNsYXZlIGlucHV0IGxpa2UgZWFyYyBpbiBvciBzcGRpZiBpbiwNCj4gPiB3aGljaCBjYW4gcmVm ZXIgdG8gdGhlIGV4dGVybmFsIGNsb2NrIHNvdXJjZS4oQVBMTDMgc3luY3Mgd2l0aA0KPiA+IGVh cmMsDQo+ID4gYW5kIEFQTEw0IHN5bmNzIHdpdGggc3BkaWYgaW4uKQ0KPiA+IA0KPiA+IFdoZW4g aTJzIG91dCBzZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UgdG8gQVBMTDQsIHRoaXMgbWFrZXMgc3Vy ZQ0KPiA+IHRoYXQNCj4gPiBzcGRpZiBpbiBhbmQgaTJzIG91dCB3b3JrcyBpbiB0aGUgc2FtZSBj bG9jayBzb3VyY2UuDQo+ID4gSWYgd2UganVzdCB1c2UgQVBMTDEvQVBMTDIgb24gaTJzIG91dCwg dGhlcmUgaXMgbGl0dGxlIHJhdGUNCj4gPiBtaXNtYXRjaA0KPiA+IGJldHdlZW4gZGF0YSBpbnB1 dCBhbmQgb3V0cHV0LiBGaW5hbGx5LCBpdCByZXN1bHRzIGluIFhSVU4uDQo+IA0KPiBJIHNlZSwg dGhhdCBtYWtlcyBtb3JlIHNlbnNlLg0KPiANCj4gPiBJZiB3ZSBvbmx5IHVzZSBzZXRfcmF0ZSwg aXQncyBwb3NzaWJsZSB0aGF0IGl0IGNhbid0IHN3aXRjaCB0byB0aGUNCj4gPiBleHBlY3RlZCBQ TEwgc291cmNlLCBiZWNhdXNlIHRoZSByYXRlIG9mIEFQTEwzL0FQTEw0IHNob3VsZCBiZQ0KPiA+ IGNsb3NlIHRvDQo+ID4gQVBMTDEvQVBMTDIuDQo+IA0KPiBXZWxsLCBpbiB0aGVvcnkgdGhlIEND RiBzaG91bGQgY2hvb3NlIHRoZSBvbmUgd2l0aCB0aGUgY2xvc2VzdCByYXRlLg0KPiBBbmQgaWYg QVBMTDMvQVBMTDQgaXMgYWxyZWFkeSB0cmFja2luZyB0aGUgZXh0ZXJuYWwgY2xvY2sgc291cmNl LCBpdHMNCj4gY2xvY2sgcmF0ZSBzaG91bGQgbWF0Y2guDQo+IA0KPiBJZiBpdCdzIGEgc3RhdGlj IHJlcXVpcmVtZW50LCBtYXliZSB3ZSBjb3VsZCByZXBsYWNlIHRoZSAqLW1jbGstDQo+IHNvdXJj ZQ0KPiBEVCBwcm9wZXJ0aWVzIHdpdGggc3RhbmRhcmQgYXNzaWduZWQtY2xvY2tzIGFuZCBhc3Np Z25lZC1jbG9jay0NCj4gcGFyZW50cz8NCj4gVGhpcyB3b3VsZCBnZXQgaGFuZGxlZCBieSBDQ0Yg ZGlyZWN0bHksIGFuZCB0aGVuIHRoZSBvbmx5IHRoaW5nIHRoZQ0KPiBjbGsgZHJpdmVyIGhhcyB0 byBkbyBpcyBtYWtlIHN1cmUgaXQgZG9lc24ndCBnZXQgcmVwYXJlbnRlZCBhZ2Fpbi4NCj4gDQo+ IE9yIGlzIHRoZXJlIGEgbmVlZCB0byBkbyByZXBhcmVudGluZyBhdCBydW50aW1lPw0KPiANCg0K Rm9yIHRoZSB1c2UgY2FzZSBvZiBBUExMMy9BUExMNCwgc3RhdGljIGFzc2lnbm1lbnQgc2hvdWxk IGJlIG9rLg0KDQpCdXQgSSBjaGVja2VkIHdpdGggQ0NGIG93bmVyLCB3ZSBjYW4ndCBqdXN0IHVz ZSBjbGtfc2V0X3JhdGUoZGl2aWRlciwNCnJhdGUpIHRvIGdldCBleHBlY3RlZCBNQ0xLIG91dHB1 dCwgYmVjYXVzZSByZXBhcmVudGluZyBNVVgNCmF1dG9tYXRpY2FsbHkgaXMgbm90IHN1cHBvcnRl ZCBub3cuIChQTEwgLT4gTVVYIC0+IGRpdmlkZXIpDQoNCldlIHN0aWxsIGhhdmUgdG8gY2FsbCBj bGtfc2V0X3BhcmVudCgpIGJlZm9yZSBjbGtfc2V0X3JhdGUoKS4gV2hpY2gNCm1lYW5zIHNvbWUg aW5mb3JtYXRpb24gc2hvdWxkIGJlIGdvdCBmcm9tIERUUyB0byBjaGVjayB3aGV0aGVyIHRoZSBQ TEwNCnNvdXJjZSBjYW4gYmUgc3dpdGNoZWQgb3Igbm90LCBzbyAqLW1jbGstc291cmNlIHNob3Vs ZCBiZSBrZWVwZWQgdG8NCmlkZW50aWZ5IHRoZSBjYXNlLg0KDQpUaGFua3MsDQpUcmV2b3INCg0K PiA+ID4gPiA+IEEgcmVsYXRlZCBxdWVzdGlvbjogdGhlIGNoaXAgaGFzIGZpdmUgQVBMTHMuIEhv dyBtYW55IE1DTEsNCj4gPiA+ID4gPiBjb21iaW5hdGlvbnMNCj4gPiA+ID4gPiBkb2VzIHRoZSBh cHBsaWNhdGlvbiBuZWVkIHRvIHN1cHBvcnQ/IEkgYXNzdW1lIHRoaXMgaW5jbHVkZXMNCj4gPiA+ ID4gPiB0aGUNCj4gPiA+ID4gPiBzdGFuZGFyZA0KPiA+ID4gPiA+IDI0LjU3NiBNSHogYW5kIDIy LjU3OTIgTUh6IGNsb2NrIHJhdGVzLg0KPiA+ID4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gQVBM TDEgYW5kIEFQTEwyIGFyZSB1c2VkIGluIG1vc3QgQUZFIG1vZHVsZXMsIHNvIHRoZWlyIHJhdGUN Cj4gPiA+ID4gc2hvdWxkDQo+ID4gPiA+IGJlDQo+ID4gPiA+IGZpeGVkLg0KPiA+ID4gPiBBUExM MSBpcyBmaXhlZCB0byAxOTY2MDgwMDBIei4NCj4gPiA+ID4gQVBMTDIgaXMgZml4ZWQgdG8gMTgw NjMzNjAwSHouDQo+ID4gPiA+IEFQTEwgaXMgaW5wdXRlZCB0byB0aGUgZGl2aWRlcig4Yml0KSwg YW5kIE1DTEsgaXMgdGhlIG91dHB1dCBvZg0KPiA+ID4gPiBkaXZpZGVyLg0KPiA+ID4gPiBPdGhl ciBBUExMcyBhcmUgcmVzZXJ2ZWQgZm9yIHNvbWUgc3BlY2lhbCB1c2FnZSB3aGljaCBjYW4ndCBi ZQ0KPiA+ID4gPiBzdXBwb3J0ZWQgYnkgQVBMTDEgJiBBUExMMi4NCj4gPiA+ID4gQnV0IEFQTEwz fkFQTEw1IGFyZW4ndCB1c2VkIGluIHRoZSBzZXJpZXMsIHNvIEkgd2lsbCByZW1vdmUNCj4gPiA+ ID4gdGhlbSBpbg0KPiA+ID4gPiB2My4NCj4gPiA+ID4gDQo+ID4gPiA+ID4gPiBTb21lIG9mIHRo ZW0gYXJlIG5vdCB1c2VkIGluIHRoaXMgc2VyaWVzLCBiZWNhdXNlIHNvbWUNCj4gPiA+ID4gPiA+ IG1vZHVsZXMNCj4gPiA+ID4gPiA+IGFyZQ0KPiA+ID4gPiA+ID4gc3RpbGwgZGV2ZWxvcGluZy4g U2hvdWxkIEkgb25seSBrZWVwIHRoZSBjbG9ja3MgdGhhdCBoYXZlDQo+ID4gPiA+ID4gPiBiZWVu DQo+ID4gPiA+ID4gPiB1c2VkDQo+ID4gPiA+ID4gPiBpbg0KPiA+ID4gPiA+ID4gdGhlIHNlcmll cz8NCj4gPiA+ID4gPiANCj4gPiA+ID4gPiBZZXMgcGxlYXNlLiBPbmx5IGFkZCB0aGUgb25lcyB0 aGF0IGFyZSB1c2VkLiBUaGluZ3MgdGhhdA0KPiA+ID4gPiA+IGFyZW4ndA0KPiA+ID4gPiA+IHVz ZWQNCj4gPiA+ID4gPiBkb24ndCBnZXQgdGVzdGVkIGFuZCB2ZXJpZmllZCwgYW5kIGVuZCB1cCBh cyBkZWFkIGNvZGUuIElmDQo+ID4gPiA+ID4gdGhlcmUNCj4gPiA+ID4gPiBhcmUNCj4gPiA+ID4g PiBwbGFucyB0byBleHRlbmQgdGhlbSBpbiB0aGUgZnV0dXJlLCBhbmQgeW91IGNhbiBsZWF2ZQ0K PiA+ID4gPiA+IGNvbW1lbnRzDQo+ID4gPiA+ID4gc3RhdGluZw0KPiA+ID4gPiA+IHRoYXQgaW50 ZW50LCBhbmQgYWxzbyBtZW50aW9uIGl0IGluIHRoZSBjb3ZlciBsZXR0ZXIuDQo+ID4gPiA+ID4g DQo+ID4gPiA+IA0KPiA+ID4gPiBPSywgSSB3aWxsIHJlbW92ZSB0aGUgdW51c2VkIGNsb2NrIGlu IHYzLg0KPiA+ID4gPiANCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIC8qIHh0YWwgKi8NCj4gPiA+ ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1hUQUxfMjZNXSA9ICJjbGsyNm0iLA0KPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgLyogcGxsICovDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBb TVQ4MTk1X0NMS19BUE1JWEVEX0FQTEwxXSA9ICJhcGxsMSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEwyXSA9ICJhcGxsMiIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEwzXSA9ICJhcGxsMyIsDQo+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEw0XSA9ICJhcGxsNCIsDQo+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0FQTEw1XSA9ICJhcGxs NSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BUE1JWEVEX0hETUlSWF9B UExMXSA9DQo+ID4gPiA+ID4gPiA+ID4gImhkbWlyeF9hcGxsIiwNCj4gPiA+ID4gPiA+ID4gPiAr ICAgICAgIC8qIGRpdmlkZXIgKi8NCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xL X1RPUF9BUExMMV0gPSAiYXBsbDFfY2siLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfVE9QX0FQTEwxX0Q0XSA9ICJhcGxsMV9kNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19UT1BfQVBMTDJdID0gImFwbGwyX2NrIiwNCj4gPiA+ID4gPiA+ID4gPiAr ICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMMl9ENF0gPSAiYXBsbDJfZDQiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQTEwzXSA9ICJhcGxsM19jayIsDQo+ID4g PiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQVBMTDNfRDRdID0gImFwbGwzX2Q0 IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMNF0gPSAiYXBs bDRfY2siLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQTEw0X0Q0 XSA9ICJhcGxsNF9kNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1Bf QVBMTDVdID0gImFwbGw1X2NrIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xL X1RPUF9BUExMNV9ENF0gPSAiYXBsbDVfZDQiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01U ODE5NV9DTEtfVE9QX0FQTEwxMl9ESVYwXSA9ICJhcGxsMTJfZGl2MCIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQVBMTDEyX0RJVjFdID0gImFwbGwxMl9kaXYxIiwN Cj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMMTJfRElWMl0gPSAi YXBsbDEyX2RpdjIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQ TEwxMl9ESVYzXSA9ICJhcGxsMTJfZGl2MyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4 MTk1X0NMS19UT1BfQVBMTDEyX0RJVjRdID0gImFwbGwxMl9kaXY0IiwNCj4gPiA+ID4gPiA+ID4g PiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMMTJfRElWOV0gPSAiYXBsbDEyX2RpdjkiLA0K PiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0hETUlSWF9BUExMXSA9DQo+ ID4gPiA+ID4gPiA+ID4gImhkbWlyeF9hcGxsX2NrIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX1RPUF9NQUlOUExMX0Q0X0Q0XSA9DQo+ID4gPiA+ID4gPiA+ID4gIm1haW5w bGxfZDRfZDQiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX01BSU5Q TExfRDVfRDJdID0NCj4gPiA+ID4gPiA+ID4gPiAibWFpbnBsbF9kNV9kMiIsDQo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfTUFJTlBMTF9EN19EMl0gPQ0KPiA+ID4gPiA+ ID4gPiA+ICJtYWlucGxsX2Q3X2QyIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVf Q0xLX1RPUF9VTklWUExMX0Q0XSA9ICJ1bml2cGxsX2Q0IiwNCj4gPiA+ID4gPiA+ID4gPiArICAg ICAgIC8qIG11eCAqLw0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQ TEwxX1NFTF0gPSAiYXBsbDFfc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVf Q0xLX1RPUF9BUExMMl9TRUxdID0gImFwbGwyX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19UT1BfQVBMTDNfU0VMXSA9ICJhcGxsM19zZWwiLA0KPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FQTEw0X1NFTF0gPSAiYXBsbDRfc2VsIiwNCj4g PiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BUExMNV9TRUxdID0gImFwbGw1 X3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQTFTWVNfSFBf U0VMXSA9ICJhMXN5c19ocF9zZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9D TEtfVE9QX0EyU1lTX1NFTF0gPSAiYTJzeXNfc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX1RPUF9BM1NZU19TRUxdID0gImEzc3lzX3NlbCIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQTRTWVNfU0VMXSA9ICJhNHN5c19zZWwiLA0KPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0FTTV9IX1NFTF0gPSAiYXNtX2hf c2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9BU01fTV9TRUxd ID0gImFzbV9tX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19UT1Bf QVNNX0xfU0VMXSA9ICJhc21fbF9zZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfVE9QX0FVRF9JRUNfU0VMXSA9ICJhdWRfaWVjX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19UT1BfQVVEX0lOVEJVU19TRUxdID0NCj4gPiA+ID4gPiA+ID4g PiAiYXVkX2ludGJ1c19zZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf VE9QX0FVRElPX0hfU0VMXSA9ICJhdWRpb19oX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19UT1BfQVVESU9fTE9DQUxfQlVTX1NFTF0gPQ0KPiA+ID4gPiA+ID4gPiA+ ICJhdWRpb19sb2NhbF9idXNfc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVf Q0xLX1RPUF9EUFRYX01fU0VMXSA9ICJkcHR4X21fc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAg ICAgIFtNVDgxOTVfQ0xLX1RPUF9JTlRESVJfU0VMXSA9ICJpbnRkaXJfc2VsIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9JMlNPMV9NX1NFTF0gPSAiaTJzbzFfbV9z ZWwiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfVE9QX0kyU08yX01fU0VM XSA9ICJpMnNvMl9tX3NlbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19U T1BfSTJTSTFfTV9TRUxdID0gImkyc2kxX21fc2VsIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX1RPUF9JMlNJMl9NX1NFTF0gPSAiaTJzaTJfbV9zZWwiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgLyogY2xvY2sgZ2F0ZSAqLw0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAg W01UODE5NV9DTEtfVE9QX01QSE9ORV9TTEFWRV9CXSA9DQo+ID4gPiA+ID4gPiA+ID4gIm1waG9u ZV9zbGF2ZV9iIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX1RPUF9DRkdf MjZNX0FVRF0gPSAiY2ZnXzI2bV9hdWQiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfSU5GUkFfQU9fQVVESU9dID0gImluZnJhX2FvX2F1ZGlvIiwNCj4gPiA+ID4gPiA+ID4g PiArICAgICAgIFtNVDgxOTVfQ0xLX0lORlJBX0FPX0FVRElPXzI2TV9CXSA9DQo+ID4gPiA+ID4g PiA+ID4gImluZnJhX2FvX2F1ZGlvXzI2bV9iIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtN VDgxOTVfQ0xLX1NDUF9BRFNQX0FVRElPRFNQXSA9DQo+ID4gPiA+ID4gPiA+ID4gInNjcF9hZHNw X2F1ZGlvZHNwIiwNCj4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0FGRV0gPSAiYXVkX2FmZSIsDQo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfTFJDS19DTlRdID0gImF1ZF9scmNrX2NudCIs DQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfU1BESUZJTl9UVU5FUl9B UExMXSA9DQo+ID4gPiA+ID4gPiA+ID4gImF1ZF9zcGRpZmluX3R1bmVyX2FwbGwiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX1NQRElGSU5fVFVORVJfREJHXSA9DQo+ ID4gPiA+ID4gPiA+ID4gImF1ZF9zcGRpZmluX3R1bmVyX2RiZyIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19BVURfVUxfVE1MXSA9ICJhdWRfdWxfdG1sIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BUExMMV9UVU5FUl0gPQ0KPiA+ID4gPiA+ ID4gPiA+ICJhdWRfYXBsbDFfdHVuZXIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfQVVEX0FQTEwyX1RVTkVSXSA9DQo+ID4gPiA+ID4gPiA+ID4gImF1ZF9hcGxsMl90dW5l ciIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfVE9QMF9TUERGXSA9 ICJhdWRfdG9wMF9zcGRmIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9BUExMXSA9ICJhdWRfYXBsbCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NM S19BVURfQVBMTDJdID0gImF1ZF9hcGxsMiIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4 MTk1X0NMS19BVURfREFDXSA9ICJhdWRfZGFjIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtN VDgxOTVfQ0xLX0FVRF9EQUNfUFJFRElTXSA9ICJhdWRfZGFjX3ByZWRpcyIsDQo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfVE1MXSA9ICJhdWRfdG1sIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BRENdID0gImF1ZF9hZGMiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0RBQ19ISVJFU10gPSAiYXVkX2RhY19o aXJlcyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQTFTWVNfSFBd ID0gImF1ZF9hMXN5c19ocCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfQUZFX0RNSUMxXSA9ICJhdWRfYWZlX2RtaWMxIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX0FVRF9BRkVfRE1JQzJdID0gImF1ZF9hZmVfZG1pYzIiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0FGRV9ETUlDM10gPSAiYXVkX2FmZV9kbWlj MyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQUZFX0RNSUM0XSA9 ICJhdWRfYWZlX2RtaWM0IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9BRkVfMjZNX0RNSUNfVE1dID0NCj4gPiA+ID4gPiA+ID4gPiAiYXVkX2FmZV8yNm1fZG1pY190 bSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfVUxfVE1MX0hJUkVT XSA9DQo+ID4gPiA+ID4gPiA+ID4gImF1ZF91bF90bWxfaGlyZXMiLA0KPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0FEQ19ISVJFU10gPSAiYXVkX2FkY19oaXJlcyIsDQo+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQUREQTZfQURDXSA9ICJhdWRf YWRkYTZfYWRjIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BRERB Nl9BRENfSElSRVNdID0NCj4gPiA+ID4gPiA+ID4gPiAiYXVkX2FkZGE2X2FkY19oaXJlcyIsDQo+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfTElORUlOX1RVTkVSXSA9DQo+ ID4gPiA+ID4gPiA+ID4gImF1ZF9saW5laW5fdHVuZXIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgW01UODE5NV9DTEtfQVVEX0VBUkNfVFVORVJdID0gImF1ZF9lYXJjX3R1bmVyIiwNCj4gPiA+ ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9JMlNJTl0gPSAiYXVkX2kyc2luIiwN Cj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9URE1fSU5dID0gImF1ZF90 ZG1faW4iLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0kyU19PVVRd ID0gImF1ZF9pMnNfb3V0IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9URE1fT1VUXSA9ICJhdWRfdGRtX291dCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4 MTk1X0NMS19BVURfSERNSV9PVVRdID0gImF1ZF9oZG1pX291dCIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19BVURfQVNSQzExXSA9ICJhdWRfYXNyYzExIiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9BU1JDMTJdID0gImF1ZF9hc3JjMTIiLA0K PiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01VTFRJX0lOXSA9ICJhdWRf bXVsdGlfaW4iLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0lOVERJ Ul0gPSAiYXVkX2ludGRpciIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfQTFTWVNdID0gImF1ZF9hMXN5cyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1 X0NMS19BVURfQTJTWVNdID0gImF1ZF9hMnN5cyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBb TVQ4MTk1X0NMS19BVURfUENNSUZdID0gImF1ZF9wY21pZiIsDQo+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICBbTVQ4MTk1X0NMS19BVURfQTNTWVNdID0gImF1ZF9hM3N5cyIsDQo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfQTRTWVNdID0gImF1ZF9hNHN5cyIsDQo+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfTUVNSUZfVUwxXSA9ICJhdWRfbWVtaWZf dWwxIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9VTDJd ID0gImF1ZF9tZW1pZl91bDIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf QVVEX01FTUlGX1VMM10gPSAiYXVkX21lbWlmX3VsMyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19BVURfTUVNSUZfVUw0XSA9ICJhdWRfbWVtaWZfdWw0IiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9VTDVdID0gImF1ZF9tZW1pZl91 bDUiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01FTUlGX1VMNl0g PSAiYXVkX21lbWlmX3VsNiIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfTUVNSUZfVUw4XSA9ICJhdWRfbWVtaWZfdWw4IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAg IFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9VTDldID0gImF1ZF9tZW1pZl91bDkiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01FTUlGX1VMMTBdID0gImF1ZF9tZW1pZl91 bDEwIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9ETDJd ID0gImF1ZF9tZW1pZl9kbDIiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf QVVEX01FTUlGX0RMM10gPSAiYXVkX21lbWlmX2RsMyIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19BVURfTUVNSUZfREw2XSA9ICJhdWRfbWVtaWZfZGw2IiwNCj4gPiA+ID4g PiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9NRU1JRl9ETDddID0gImF1ZF9tZW1pZl9k bDciLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX01FTUlGX0RMOF0g PSAiYXVkX21lbWlmX2RsOCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19B VURfTUVNSUZfREwxMF0gPSAiYXVkX21lbWlmX2RsMTAiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgW01UODE5NV9DTEtfQVVEX01FTUlGX0RMMTFdID0gImF1ZF9tZW1pZl9kbDExIiwNCj4gPiA+ ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzBdID0gImF1ZF9nYXNyYzAi LA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDMV0gPSAiYXVk X2dhc3JjMSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMy XSA9ICJhdWRfZ2FzcmMyIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FV RF9HQVNSQzNdID0gImF1ZF9nYXNyYzMiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5 NV9DTEtfQVVEX0dBU1JDNF0gPSAiYXVkX2dhc3JjNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAg ICBbTVQ4MTk1X0NMS19BVURfR0FTUkM1XSA9ICJhdWRfZ2FzcmM1IiwNCj4gPiA+ID4gPiA+ID4g PiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzZdID0gImF1ZF9nYXNyYzYiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDN10gPSAiYXVkX2dhc3JjNyIs DQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkM4XSA9ICJhdWRf Z2FzcmM4IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzld ID0gImF1ZF9nYXNyYzkiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVE X0dBU1JDMTBdID0gImF1ZF9nYXNyYzEwIiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgx OTVfQ0xLX0FVRF9HQVNSQzExXSA9ICJhdWRfZ2FzcmMxMSIsDQo+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMxMl0gPSAiYXVkX2dhc3JjMTIiLA0KPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDMTNdID0gImF1ZF9nYXNyYzEzIiwN Cj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtNVDgxOTVfQ0xLX0FVRF9HQVNSQzE0XSA9ICJhdWRf Z2FzcmMxNCIsDQo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMx NV0gPSAiYXVkX2dhc3JjMTUiLA0KPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtf QVVEX0dBU1JDMTZdID0gImF1ZF9nYXNyYzE2IiwNCj4gPiA+ID4gPiA+ID4gPiArICAgICAgIFtN VDgxOTVfQ0xLX0FVRF9HQVNSQzE3XSA9ICJhdWRfZ2FzcmMxNyIsDQo+ID4gPiA+ID4gPiA+ID4g KyAgICAgICBbTVQ4MTk1X0NMS19BVURfR0FTUkMxOF0gPSAiYXVkX2dhc3JjMTgiLA0KPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgW01UODE5NV9DTEtfQVVEX0dBU1JDMTldID0gImF1ZF9nYXNyYzE5 IiwNCj4gPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiA+IFRoZSBNVDgxOTVfQ0xLX0FVRF8qIGNs b2NrcyBhcmUgYWxsIGludGVybmFsIHRvIHRoZSBhdWRpbw0KPiA+ID4gPiA+ID4gPiBzdWJzeXN0 ZW06DQo+ID4gPiA+ID4gPiA+IHRoZSBiaXRzIHRoYXQgY29udHJvbCB0aGVzZSBjbG9jayBnYXRl cyBhcmUgaW4gdGhlIHNhbWUNCj4gPiA+ID4gPiA+ID4gYWRkcmVzcw0KPiA+ID4gPiA+ID4gPiBz cGFjZQ0KPiA+ID4gPiA+ID4gPiBhcyB0aGUgYXVkaW8gcGFydHMuIFdvdWxkIGl0IGJlIHBvc3Np YmxlIHRvIG1vZGVsIHRoZW0gYXMNCj4gPiA+ID4gPiA+ID4gaW50ZXJuYWwNCj4gPiA+ID4gPiA+ ID4gQVNvQyBTVVBQTFkgd2lkZ2V0cz8gVGhlIGV4dGVybmFsIG9uZXMgY291bGQgYmUgbW9kZWxl ZA0KPiA+ID4gPiA+ID4gPiB1c2luZw0KPiA+ID4gPiA+ID4gPiBBU29DDQo+ID4gPiA+ID4gPiA+ IENMS19TVVBQTFkgd2lkZ2V0cywgYW5kIHRoZSBkZXBlbmRlbmNpZXMgY291bGQgYmUgbW9kZWxl ZA0KPiA+ID4gPiA+ID4gPiB3aXRoDQo+ID4gPiA+ID4gPiA+IEFTb0MNCj4gPiA+ID4gPiA+ID4g cm91dGVzLiBUaGUgQVNvQyBjb3JlIGNvdWxkIHRoZW4gaGFuZGxlIHBvd2VyIHNlcXVlbmNpbmcs DQo+ID4gPiA+ID4gPiA+IHdoaWNoDQo+ID4gPiA+ID4gPiA+IHRoZQ0KPiA+ID4gPiA+ID4gPiBk cml2ZXIgY3VycmVudGx5IGRvZXMgbWFudWFsbHkuDQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ ID4gPiBJTU8gdGhpcyBpcyBiZXR0ZXIgdGhhbiBoYXZpbmcgdHdvIGRyaXZlcnMgaGFuZGxpbmcg dHdvDQo+ID4gPiA+ID4gPiA+IGFzcGVjdHMNCj4gPiA+ID4gPiA+ID4gb2YNCj4gPiA+ID4gPiA+ ID4gdGhlIHNhbWUgcGllY2Ugb2YgaGFyZHdhcmUsIHdoaWxlIHRoZSB0d28gYXNwZWN0cyBhcmUN Cj4gPiA+ID4gPiA+ID4gaW50ZXJ0d2luZWQuDQo+ID4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4g DQo+ID4gPiA+ID4gPiBZZXMsIGl0J3Mgb2sgdG8gdXNlIHRoZSBDTEtfU1VQUExZIGFuZCBTVVBQ TFkgdG8gbW9kZWwgc3VjaA0KPiA+ID4gPiA+ID4gY2xvY2tzLg0KPiA+ID4gPiA+ID4gQnV0IHRo b3NlIGNsb2NrcyBhcmUgbWFuYWdlZCBieSBDQ0YgaW4gdGhlIHByZWNlZGluZyBTT0NzDQo+ID4g PiA+ID4gPiBsaWtlDQo+ID4gPiA+ID4gPiBtdDI3MDEsDQo+ID4gPiA+ID4gPiBtdDY3NzkgYW5k IG10ODE4My4gQWRkaXRpb25hbGx5LCBpbiBzb21lIGF1ZGlvIG1vZHVsZXMsDQo+ID4gPiA+ID4g PiBjbG9ja3MNCj4gPiA+ID4gPiA+IHNob3VsZA0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+IFRoaXMg YmVpbmcgYSBuZXcgZHJpdmVyLCB3ZSBoYXZlIHNvbWUgbW9yZSBmcmVlZG9tIHRvIGltcHJvdmUN Cj4gPiA+ID4gPiB0aGUNCj4gPiA+ID4gPiBkZXNpZ24uDQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4g PiBiZSBlbmFibGVkIGJlZm9yZSBjb25maWd1cmluZyBwYXJhbWV0ZXJzKGh3X3BhcmFtcykuIEFz IGZhcg0KPiA+ID4gPiA+ID4gYXMNCj4gPiA+ID4gPiA+IEkNCj4gPiA+ID4gPiA+IGtub3csDQo+ ID4gPiA+ID4gPiBpZiB3ZSB1c2UgQ0xLX1NVUFBMWSBvciBTVVBQTFkgdG8gbW9kZWwgY2xvY2tz LCB0aGUgcG93ZXINCj4gPiA+ID4gPiA+IHNlcXVlbmNlDQo+ID4gPiA+ID4gPiBpcw0KPiA+ID4g PiA+ID4gY29udHJvbGxlZCBieSBEQVBNLiBJdCBzZWVtcyB0byBiZSBpbXBvc3NpYmxlIHRvIGZ1 bGZpbGwNCj4gPiA+ID4gPiA+IGFsbA0KPiA+ID4gPiA+ID4gdXNlDQo+ID4gPiA+ID4gPiBjYXNl cy4NCj4gPiA+ID4gPiA+IFRoYXQncyB3aHkgd2UganVzdCBrZWVwIHRoZSBtYW51YWwgY29udHJv bCBzZXF1ZW5jZSBhbmQgQ0NGDQo+ID4gPiA+ID4gPiBzZWVtcw0KPiA+ID4gPiA+ID4gdG8gYmUN Cj4gPiA+ID4gPiA+IHRoZSBiZXN0IGNob2ljZSB0byBtb2RlbCBzdWNoIGNsb2NrIGdhdGVzcy4N Cj4gPiA+ID4gPiANCj4gPiA+ID4gPiBJIHNlZS4gU28geWVzLCB1c2luZyBDQ0YgZG9lcyBnaXZl IHlvdSByZWZlcmVuY2UgY291bnRpbmcsDQo+ID4gPiA+ID4gZGVwZW5kZW5jeQ0KPiA+ID4gPiA+ IHRyYWNraW5nIGFuZCBvdGhlciBhZHZhbnRhZ2VzLiBBbmQgdXNpbmcgREFQTSBzdXBwbGllcyBt ZWFucw0KPiA+ID4gPiA+IHlvdQ0KPiA+ID4gPiA+IGNhbid0DQo+ID4gPiA+ID4gZW5hYmxlIHRo ZSBjbG9jayBnYXRlcyBvdXRzaWRlIG9mIERBUE0gd2l0aG91dCBib3RoIHBpZWNlcyBvZg0KPiA+ ID4gPiA+IGNvZGUNCj4gPiA+ID4gPiBmaWdodGluZyBmb3IgY29udHJvbC4NCj4gPiA+ID4gPiAN Cj4gPiA+ID4gPiBDYW4gd2UgYXQgbGVhc3QgbW92ZSB0aGUgYXVkaW8gY2xvY2sgZ2F0ZXMgaW50 byB0aGUgYXVkaW8NCj4gPiA+ID4gPiBkcml2ZXINCj4gPiA+ID4gPiB0aG91Z2g/DQo+ID4gPiA+ ID4gVGhlIGFyYml0cmFyeSBzZXBhcmF0aW9uIGludG8gdHdvIGRldmljZXMgYW5kIGRyaXZlcnMg aXMNCj4gPiA+ID4gPiBmaXNoeS4NCj4gPiA+ID4gPiBBbmQNCj4gPiA+ID4gPiB3aXRoDQo+ID4g PiA+ID4gdGhlIG1vdmUgdGhlIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlIGF1ZGlvIGNsb2Nr IGdhdGVzIGNhbg0KPiA+ID4gPiA+IGJlDQo+ID4gPiA+ID4gcmVtb3ZlZC4NCj4gPiA+ID4gPiAN Cj4gPiA+ID4gDQo+ID4gPiA+IEJlY2F1c2UgREFQTSBTVVBQTFkgY2FuJ3QgZml0IG91ciBjb250 cm9sIHNjZW5hcmlvLg0KPiA+ID4gPiBEaWQgeW91IHN1Z2dlc3QgdXMgaW1wbGVtZW50IHRoZSBz aW1wbGUgbG9naWMgY29udHJvbChpbmNsdWRpbmcNCj4gPiA+ID4gcmVmDQo+ID4gPiA+IGNvdW50 LCBjbG9jayBkZXBlbmRlbmN5KSBmb3IgY2xvY2sgZ2F0ZShNVDgxOTVfQ0xLX0FVRF8qKSBpbg0K PiA+ID4gPiBhZmUNCj4gPiA+ID4gZHJpdmVyDQo+ID4gPiA+IGluc3RlYWQgb2YgdXNpbmcgQ0NG Pw0KPiA+ID4gDQo+ID4gPiBJIG1lYW50IHNpbXBseSBtb3ZpbmcgdGhlIENDRi1iYXNlZCBjbGsg ZHJpdmVyIGNvZGUgKGNsay1tdDg1MTYtDQo+ID4gPiBhdWQuYykNCj4gPiA+IGZyb20gYGRyaXZl cnMvY2xrYCBhbmQgaW5jb3Jwb3JhdGluZyBpdCBpbnRvIHRoZSBhdWRpbyBkcml2ZXIsDQo+ID4g PiBsaWtlbHkNCj4gPiA+IGluIGBtdDgxOTUtYWZlLWNsay5jYCBvciBtYXliZSBhcyBhIHNlcGFy YXRlIGZpbGUuIFNvIHRoZSBhdWRpbw0KPiA+ID4gZHJpdmVyDQo+ID4gPiB3b3VsZCBiZSBhIGNs b2NrIHByb3ZpZGVyLCBhbmQgYSBjbG9jayBjb25zdW1lci4gSXQgd2lsbCBkaXJlY3RseQ0KPiA+ ID4gdXNlDQo+ID4gPiB0aGUgY2xvY2tzIGl0IHByb3ZpZGVzLCBpbnRlcm5hbGx5LCBhbmQgeW91 IGNvdWxkIHJlbW92ZSBhbGwNCj4gPiA+IHRob3NlDQo+ID4gPiBjbG9jayByZWZlcmVuY2VzIGZy b20gdGhlIGRldmljZSB0cmVlLg0KPiA+ID4gDQo+ID4gPiBUaGUgZ29hbCBpcyB0byBoYXZlIG9u ZSBoYXJkd2FyZSByZXByZXNlbnRhdGlvbiAoZGV2aWNlIG5vZGUpDQo+ID4gPiBvbmx5LA0KPiA+ ID4gc28NCj4gPiA+IHRoYXQgaXQgbWF0Y2hlcyB0aGUgaGFyZHdhcmUsIHdoaWNoIGlzIG9uZSBz aW5nbGUgdW5pZmllZCBibG9jay4NCj4gPiA+IA0KPiA+ID4gQWZ0ZXIgdGhlIGRyaXZlciBpcyBj b21wbGV0ZWQsIHdlIGNhbiBsb29rIGZvciBvcHBvcnR1bml0aWVzIHRvDQo+ID4gPiBpbXByb3Zl DQo+ID4gPiBpdCwgaWYgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUuDQo+ID4gDQo+ID4gVGhhbmtz IGZvciB5b3VyIGRldGFpbGVkIGluZm9ybWF0aW9uLg0KPiA+IEkgd2lsbCB0cnkgdG8gbW92ZSB0 aGUgQ0NGLWJhc2VkIGNsayBkcml2ZXIgY29kZSB0byBBRkUgZHJpdmVyLg0KPiA+IElmIHRoZXJl IGFyZSBubyBvdGhlciBpbnRlcm5hbCBjb25jZXJucyBhbmQgYmxvY2tpbmcgcHJvYmxlbXMsIEkN Cj4gPiB3aWxsDQo+ID4gaW5jbHVkZSB0aGUgY2hhbmdlcyBpbiB2My4NCj4gDQo+IEdyZWF0Lg0K PiANCj4gPiA+ID4gPiBBbmQgcmVnYXJkaW5nIHRoZSBjbG9jayByZXF1aXJlbWVudHMgZm9yIGRp ZmZlcmVudCBtb2R1bGVzLA0KPiA+ID4gPiA+IGNvdWxkDQo+ID4gPiA+ID4gd2UNCj4gPiA+ID4g PiBoYXZlDQo+ID4gPiA+ID4gdGhhdCBpbmZvcm1hdGlvbiBwdXQgaW4gY29tbWVudHMgc29tZXdo ZXJlLCBzbyBpZiBzb21lb25lDQo+ID4gPiA+ID4gd2VyZSB0bw0KPiA+ID4gPiA+IHJldmlzaXQN Cj4gPiA+ID4gPiBpdCBsYXRlciwgdGhleSB3b3VsZCBoYXZlIHRoZSBpbmZvcm1hdGlvbiBuZWVk ZWQgdG8NCj4gPiA+ID4gPiB1bmRlcnN0YW5kDQo+ID4gPiA+ID4gYW5kDQo+ID4gPiA+ID4gcG9z c2libHkNCj4gPiA+ID4gPiBpbXByb3ZlIGl0PyBCZWNhdXNlIHJpZ2h0IG5vdyB0aGVyZSdzIGp1 c3QgYSBidW5jaCBvZiBjbG9ja3MNCj4gPiA+ID4gPiBlbmFibGVkDQo+ID4gPiA+ID4gYW5kDQo+ ID4gPiA+ID4gZGlzYWJsZWQgYW5kIG5vdGhpbmcgdG8gZXhwbGFpbiB3aHkgdGhhdCdzIG5lZWRl ZC4NCj4gPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+IEZvciBleGFtcGxlLA0KPiA+ID4gPiBN VDgxOTVfQ0xLX0FVRF9BREMoY2xvY2sgZ2F0ZSkgaXMgb25lIG9mIHRoZSBjbG9jayBmZWVkaW5n IHRvDQo+ID4gPiA+IEFEREENCj4gPiA+ID4gbW9kdWxlLg0KPiA+ID4gPiBEaWQgeW91IHdhbnQg bWUgc2hvdyB0aGUgY2xvY2sgZ2F0ZSBsaXN0IGZlZWRpbmcgdG8gQUREQT8NCj4gPiA+ID4gT24g dGhlIG90aGVyIGhhbmQsIEkgZGlkbid0IGtub3cgaG93IHRvIHNob3cgdGhlIGluZm9ybWF0aW9u DQo+ID4gPiA+IHByb3Blcmx5DQo+ID4gPiA+IGluIGNvbW1lbnRzLiBDb3VsZCB5b3Uga2luZGx5 IHNoYXJlIG1lIGFuIGV4YW1wbGUgZm9yDQo+ID4gPiA+IHJlZmVyZW5jZT8NCj4gPiA+IA0KPiA+ ID4gDQo+ID4gPiBGb3IgZXhhbXBsZSwgaW4gYG10ODE5NV9hZmVfZW5hYmxlX3JlZ19yd19jbGso KWAgaW4gbXQ4MTk1LWFmZS0NCj4gPiA+IGNsay5jOg0KPiA+ID4gDQo+ID4gPiAgICAgICAgIHVu c2lnbmVkIGludCBjbGtfYXJyYXlbXSA9IHsNCj4gPiA+ICAgICAgICAgICAgICAgICBNVDgxOTVf Q0xLX1NDUF9BRFNQX0FVRElPRFNQLA0KPiA+ID4gICAgICAgICAgICAgICAgIE1UODE5NV9DTEtf VE9QX0FVRElPX0xPQ0FMX0JVU19TRUwsDQo+ID4gPiAgICAgICAgICAgICAgICAgTVQ4MTk1X0NM S19UT1BfQ0ZHXzI2TV9BVUQsDQo+ID4gPiAgICAgICAgICAgICAgICAgTVQ4MTk1X0NMS19JTkZS QV9BT19BVURJTywNCj4gPiA+ICAgICAgICAgICAgICAgICBNVDgxOTVfQ0xLX0lORlJBX0FPX0FV RElPXzI2TV9CLA0KPiA+ID4gICAgICAgICAgICAgICAgIE1UODE5NV9DTEtfVE9QX0FVRF9JTlRC VVNfU0VMLA0KPiA+ID4gICAgICAgICAgICAgICAgIE1UODE5NV9DTEtfVE9QX0ExU1lTX0hQX1NF TCwNCj4gPiA+ICAgICAgICAgICAgICAgICBNVDgxOTVfQ0xLX0FVRF9BMVNZU19IUCwNCj4gPiA+ ICAgICAgICAgICAgICAgICBNVDgxOTVfQ0xLX0FVRF9BMVNZUywNCj4gPiA+ICAgICAgICAgICAg ICAgICBNVDgxOTVfQ0xLX1RPUF9BVURJT19IX1NFTCwNCj4gPiA+ICAgICAgICAgfTsNCj4gPiA+ IA0KPiA+ID4gWW91IGNvdWxkIGFkZCBhIGNvbW1lbnQgYWZ0ZXIgZWFjaCBsaW5lIHN0YXRpbmcg d2h5IHRoYXQgY2xvY2sNCj4gPiA+IG5lZWRzDQo+ID4gPiB0bw0KPiA+ID4gYmUgZW5hYmxlZC4g QSBzaW1wbGUgbm90ZSBsaWtlICJidXMgYWNjZXNzIGNsb2NrIiBvciAiaW50ZXJuYWwNCj4gPiA+ IGxvZ2ljDQo+ID4gPiBjbG9jayINCj4gPiA+IHdvdWxkIHN1ZmZpY2UuDQo+ID4gPiANCj4gPiAN Cj4gPiBPSywgSSB3aWxsIGFkZCBzaG9ydCBub3RlcyB0byBzdWNoIGNsb2NrIGxpc3RzLg0KPiA+ IA0KPiA+ID4gVGhlIGFib3ZlIGxpc3QgYWxzbyBoYXMgc29tZSByZWR1bmRhbmNpZXMgdGhhdCBj b3VsZCBiZQ0KPiA+ID4gZWxpbWluYXRlZC4NCj4gPiA+IE1UODE5NV9DTEtfVE9QX0ExU1lTX0hQ X1NFTCBpcyBwYXJlbnQgdG8gYm90aA0KPiA+ID4gTVQ4MTk1X0NMS19BVURfQTFTWVNfSFANCj4g PiA+IGFuZA0KPiA+ID4gTVQ4MTk1X0NMS19BVURfQTFTWVMuIFdoZW4gY2xvY2tzIGFyZSBlbmFi bGVkLCB0aGVpciBwYXJlbnRzIGFyZQ0KPiA+ID4gYWxzbw0KPiA+ID4gZW5hYmxlZCBieSBDQ0Ys IHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBlbmFibGUgdGhlbSBleHBsaWNpdGx5LA0KPiA+ID4gdW5s ZXNzDQo+ID4gPiB0aGF0IGNsb2NrIGFsc28gZGlyZWN0bHkgZmVlZHMgdGhlIGNsb2NrIGNvbnN1 bWVyLg0KPiA+ID4gDQo+ID4gDQo+ID4gT0ssIEkgd2lsbCByZXZpZXcgYWxsIGNsb2NrIHVzYWdl cyBhbmQgcmVtb3ZlIHRoZSB1bm5lY2Vzc2FyeQ0KPiA+IGNsb2Nrcy4NCj4gPiANCj4gPiA+IA0K PiA+ID4gQW5vdGhlciB0aGluZyBJIHdhbnRlZCB0byBicmluZyB1cDogaXMgYW55IG9mIHRoZSBj b2RlIGFmdGVyDQo+ID4gPiANCj4gPiA+ICAgICBzdHJ1Y3QgbXQ4MTk1X2FmZV90dW5lcl9jZmcg ew0KPiA+ID4gDQo+ID4gPiB1c2VkPyBJdCBsb29rcyBsaWtlIGl0IGlzIHVzZWQgdG8gY29uZmln dXJlIHRoZSBmaXZlIGV4dHJhIFBMTHMNCj4gPiA+IGluDQo+ID4gPiB0aGUgYXVkaW8NCj4gPiA+ IHN1YnN5c3RlbSwgYnV0IHRoZSBleHBvc2VkIChub24tc3RhdGljKSBmdW5jdGlvbnMgZG9uJ3Qg c2VlbSB0bw0KPiA+ID4gYmUNCj4gPiA+IGNhbGxlZA0KPiA+ID4gYW55d2hlcmUuIEFyZSB0aGV5 IGZvciBtb2R1bGVzIG5vdCB5ZXQgc3VwcG9ydGVkPw0KPiA+ID4gDQo+ID4gDQo+ID4gWWVzLCB0 dW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgbm93Lg0KPiA+IEkgd2lsbCByZW1vdmUgdGhlIGNvZGUg YW5kIGFkZCB0aGVtIGJhY2sgd2hlbiB0dW5lcnMgYXJlIHJlcXVpcmVkDQo+ID4gaW4NCj4gPiB0 aGUgZnV0dXJlLg0KPiANCj4gVGhhbmtzLg0KPiANCj4gDQo+IENoZW5ZdQ0K