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 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7BCEACD4F3C for ; Mon, 18 May 2026 10:50:32 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D2E9B10E5DD; Mon, 18 May 2026 10:50:31 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=bootlin.com header.i=@bootlin.com header.b="heXyafCM"; dkim-atps=neutral Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) by gabe.freedesktop.org (Postfix) with ESMTPS id 87FAF10E5DD for ; Mon, 18 May 2026 10:50:30 +0000 (UTC) Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id C0E714E42CE2; Mon, 18 May 2026 10:50:28 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 741C95FFA3; Mon, 18 May 2026 10:50:28 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 685B811AF8493; Mon, 18 May 2026 12:50:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779101427; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=9/zO0zp2r2FGgOERfPfiqfEES0NFm6hJuu5wdDFRS34=; b=heXyafCM/wLX2BEnRUVB6I1LvciXkXkGOp1QVSXzvEVNPgbmW4kOe5GBgki6tpZrpmEpQm XYGDYYm87gHlRs/wz1vK2gz227wopf/fMYJaEHGmOWDznkO4nyZAoHhGILrwsTcM5RWIxD mbiCD94a95vAXB5AzxHG96indCe5cXxpC0GLXk/mnorsK6skaw8EstUgNekqTXNg9O4qbF ae87N/6mNYw99dtmyztg5Krr+bq4yxC9LZ3Nxk9bYxZmzQVZifp8IH5R0aJov160Zs+mtv 5N04Gbbpo2IUhzf0uzLgITVYZMF3IEv9ClgD7I+6IHOa++cAstqYqOUsnjHzbw== Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Mon, 18 May 2026 12:50:18 +0200 Message-Id: To: "Simon Wright" , "Cristian Ciocaltea" From: "Luca Ceresoli" Subject: Re: [PATCH] drm/bridge: dw-hdmi-qp: compute audio CTS from N when not in TMDS table Cc: "Andrzej Hajda" , "Neil Armstrong" , "Robert Foss" , "Laurent Pinchart" , "Jonas Karlman" , "Jernej Skrabec" , "David Airlie" , "Simona Vetter" , "Heiko Stuebner" , "Andy Yan" , "Sebastian Reichel" , "Dmitry Baryshkov" , "Algea Cao" , , , , X-Mailer: aerc 0.20.1 References: <92aa4191-2a2a-41e3-badb-c0a5b1fbb957@symple.nz> In-Reply-To: <92aa4191-2a2a-41e3-badb-c0a5b1fbb957@symple.nz> X-Last-TLS-Session-Version: TLSv1.3 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hello Simon, On Sat May 9, 2026 at 9:09 AM CEST, Simon Wright wrote: > dw_hdmi_qp_find_cts() returns 0 for any TMDS character rate not > present in common_tmds_cts_table[] (which terminates at 148.5 MHz). > In that case dw_hdmi_qp_set_sample_rate() calls dw_hdmi_qp_set_cts_n() > with cts =3D=3D 0, which leaves AUDPKT_ACR_CTS_OVR_EN clear and falls > back to the controller's internal CTS auto-measurement. > On at least the RK3576 hdptx integration, strict HDMI sinks mute > audio in this configuration. =C2=A0The behaviour reproduces at any rate > not present in the table -- it is not specific to HDMI 2.x: > 1920x1080@60 with 10-bit deep colour (185.625 MHz, HDMI 1.4) is > affected, as is 3840x2160@60 8-bit (594 MHz, HDMI 2.0). =C2=A0Supplying > explicit CTS via the standard set_cts_n() override path resolves > the mute. > The driver already has the symmetric machinery for the N-table-miss > case: dw_hdmi_qp_compute_n() falls back to a dynamic search using > dw_hdmi_qp_audio_math_diff() ((pixel_clk * n) / (128 * freq)) when > no table entry matches. =C2=A0The CTS path lacks the equivalent fallback. > Compute CTS inline in dw_hdmi_qp_set_sample_rate() from N per the > HDMI spec (CTS =3D TMDS * N / (128 * Fs)) when find_cts() returns 0. > The same formula appears in the legacy DesignWare HDMI driver > (drivers/gpu/drm/bridge/synopsys/dw-hdmi.c, hdmi_set_clk_regenerator()) > under its AHB / GP audio paths. > Tested on R76S (RK3576) on Armbian-edge mainline 7.0.1 with Cristian > Ciocaltea's hdptx-clk-fixes v1 series applied: > =C2=A0 TMDS =C2=A0 =C2=A0 =C2=A0 =C2=A0 Mode =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 In table? =C2=A0Audio with fix > =C2=A0 148.5 MHz =C2=A0 =C2=A01080p60 =C2=A08-bit =C2=A0 yes =C2=A0 =C2= =A0 =C2=A0 =C2=A0plays (regression check) > =C2=A0 185.625 MHz =C2=A01080p60 10-bit =C2=A0 no =C2=A0 =C2=A0 =C2=A0 = =C2=A0 plays > =C2=A0 297 MHz =C2=A0 =C2=A0 =C2=A03840p30 =C2=A08-bit =C2=A0 no =C2=A0 = =C2=A0 =C2=A0 =C2=A0 plays > =C2=A0 594 MHz =C2=A0 =C2=A0 =C2=A03840p60 =C2=A08-bit =C2=A0 no =C2=A0 = =C2=A0 =C2=A0 =C2=A0 plays > Sinks tested: LG G3 OLED, LG C4 OLED, TCL 75P7K QLED, Kogan > KALED43XU9210STA (Changhong-OEM 4K LED). =C2=A0Without the fix, the LG > G3 mutes audio -- this is the originally reported bug > (linux-rockchip 070633). =C2=A0The LG C4 was verified during this cycle > to mute at 185.625 MHz (1080p60 10-bit) with the unpatched module. > The Kogan TV plays audio with or without the fix; it is a > permissive HDMI 2.0 implementation that does not strictly cross- > check ACR timing. =C2=A0The TCL 75P7K was tested with the fix loaded > only. > Audio plays at every supported sample rate (32 / 44.1 / 48 / 96 / > 192 kHz) verified on the TCL at the 185.625 MHz out-of-table TMDS > rate -- the fallback's CTS =3D (TMDS * N) / (128 * Fs) computation is > independent of sample rate, as expected. > The LG C4's CTA-861 SVDs do not advertise 3840x2160@60 over TMDS > (it is signalled FRL-only on that model), so that one row is N/A > on the C4. =C2=A0The same audio-path code is exercised at 297 MHz on > that sink and behaves identically to the G3. > Reported-by: Simon Wright > Closes: > https://lists.infradead.org/pipermail/linux-rockchip/2026-May/070633.html > Suggested-by: Cristian Ciocaltea > Tested-by: Simon Wright > Signed-off-by: Simon Wright > --- > =C2=A0drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 15 +++++++++++++++ > =C2=A01 file changed, 15 insertions(+) > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c > b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c > index 0dbb1274360..25ac8d3cfc8 100644 > ---a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c > +++b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c > @@-461,6 +461,21 @@static void dw_hdmi_qp_set_sample_rate(struct > dw_hdmi_qp *hdmi, unsigned long lo > =C2=A0 n =3D dw_hdmi_qp_find_n(hdmi, tmds_char_rate, sample_rate); > =C2=A0 cts =3D dw_hdmi_qp_find_cts(hdmi, tmds_char_rate, sample_rate); > + /* > + =C2=A0* dw_hdmi_qp_find_cts() returns 0 for any TMDS rate not in > + =C2=A0* common_tmds_cts_table[]. =C2=A0Falling through to the controlle= r's > + =C2=A0* auto-measure path mutes audio on strict HDMI sinks at out-of- > + =C2=A0* table rates (e.g. 185.625 MHz, 297 MHz, 594 MHz). =C2=A0Compute= CTS > + =C2=A0* from N per HDMI spec instead, so the standard override path > + =C2=A0* supplies it on the wire. > + =C2=A0*/ > + if (!cts && n) { > + =C2=A0 u64 computed =3D (u64)tmds_char_rate * n; > + > + =C2=A0 do_div(computed, 128ULL * sample_rate); > + =C2=A0 cts =3D (unsigned int)computed; > + } > + > =C2=A0 dw_hdmi_qp_set_cts_n(hdmi, cts, n); > =C2=A0} Thanks for your patch. I cannot comment on the content but I can point for formal issues with your submission. Your patch got mangled by your mailer and cannot be applied. Please don't try to convince your mailer to send patches the right way: save your time and use "git-format patch + git send-email", or even better use b4. Also your commit message is very detailed, and think it would be more readable if split in paragraphs. You can have a look at various commits in the kernel log for inspiration. There's plenty of suggestions on how to send patches in [0], ensure you read them all. [0] https://docs.kernel.org/process/submitting-patches.html Thanks! Luca -- Luca Ceresoli, Bootlin Embedded Linux and Kernel engineering https://bootlin.com 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 67E62CD4F52 for ; Mon, 18 May 2026 10:50:55 +0000 (UTC) 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:In-Reply-To:References:Cc:Subject:From: To:Message-Id:Date:Mime-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9Ihi2agsNnlQGtDFiuUclAR2funnKmX80mSK+lFH170=; b=c415WcGus2iLVv 05guqdsmsZQSa4U/YHgSWmp4tIxTpzXIzHcjAlKPD/0zOMtRwKYOW48ucDYJGphVehHQ/+itY0JlV yt9rivvApTRq3Iw3QrTFohD2Dtl+1ldBfuAUkPvKYtZdZwvCRU2gQ8aUlDkrr7XRxq6N6WZKnjoNv hppIG0gb7tJuvGRuyzWFHl8WirxPzkgtVJ4iJjlQI3pijEZXvK8sF51/Ms2GRfL7IDG4sTyGEI0xQ 2BA1kS4grF0olT9ReDVjq5EcSgZBjtYIyeVLuI6xSVWxqAnmezTNILOFCkEamGhAmOVbySc54frVf vQILnC94tTZALvBZ4Xog==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wOvYS-0000000FJpT-1FDk; Mon, 18 May 2026 10:50:38 +0000 Received: from smtpout-04.galae.net ([185.171.202.116]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wOvYP-0000000FJmp-02dZ for linux-rockchip@lists.infradead.org; Mon, 18 May 2026 10:50:35 +0000 Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 694BBC2B9E6; Mon, 18 May 2026 10:51:21 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 741C95FFA3; Mon, 18 May 2026 10:50:28 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 685B811AF8493; Mon, 18 May 2026 12:50:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779101427; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=9/zO0zp2r2FGgOERfPfiqfEES0NFm6hJuu5wdDFRS34=; b=heXyafCM/wLX2BEnRUVB6I1LvciXkXkGOp1QVSXzvEVNPgbmW4kOe5GBgki6tpZrpmEpQm XYGDYYm87gHlRs/wz1vK2gz227wopf/fMYJaEHGmOWDznkO4nyZAoHhGILrwsTcM5RWIxD mbiCD94a95vAXB5AzxHG96indCe5cXxpC0GLXk/mnorsK6skaw8EstUgNekqTXNg9O4qbF ae87N/6mNYw99dtmyztg5Krr+bq4yxC9LZ3Nxk9bYxZmzQVZifp8IH5R0aJov160Zs+mtv 5N04Gbbpo2IUhzf0uzLgITVYZMF3IEv9ClgD7I+6IHOa++cAstqYqOUsnjHzbw== Mime-Version: 1.0 Date: Mon, 18 May 2026 12:50:18 +0200 Message-Id: To: "Simon Wright" , "Cristian Ciocaltea" From: "Luca Ceresoli" Subject: Re: [PATCH] drm/bridge: dw-hdmi-qp: compute audio CTS from N when not in TMDS table Cc: "Andrzej Hajda" , "Neil Armstrong" , "Robert Foss" , "Laurent Pinchart" , "Jonas Karlman" , "Jernej Skrabec" , "David Airlie" , "Simona Vetter" , "Heiko Stuebner" , "Andy Yan" , "Sebastian Reichel" , "Dmitry Baryshkov" , "Algea Cao" , , , , X-Mailer: aerc 0.20.1 References: <92aa4191-2a2a-41e3-badb-c0a5b1fbb957@symple.nz> In-Reply-To: <92aa4191-2a2a-41e3-badb-c0a5b1fbb957@symple.nz> X-Last-TLS-Session-Version: TLSv1.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260518_035033_206625_44C945B2 X-CRM114-Status: GOOD ( 27.21 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGVsbG8gU2ltb24sCgpPbiBTYXQgTWF5IDksIDIwMjYgYXQgOTowOSBBTSBDRVNULCBTaW1vbiBX cmlnaHQgd3JvdGU6Cj4gZHdfaGRtaV9xcF9maW5kX2N0cygpIHJldHVybnMgMCBmb3IgYW55IFRN RFMgY2hhcmFjdGVyIHJhdGUgbm90Cj4gcHJlc2VudCBpbiBjb21tb25fdG1kc19jdHNfdGFibGVb XSAod2hpY2ggdGVybWluYXRlcyBhdCAxNDguNSBNSHopLgo+IEluIHRoYXQgY2FzZSBkd19oZG1p X3FwX3NldF9zYW1wbGVfcmF0ZSgpIGNhbGxzIGR3X2hkbWlfcXBfc2V0X2N0c19uKCkKPiB3aXRo IGN0cyA9PSAwLCB3aGljaCBsZWF2ZXMgQVVEUEtUX0FDUl9DVFNfT1ZSX0VOIGNsZWFyIGFuZCBm YWxscwo+IGJhY2sgdG8gdGhlIGNvbnRyb2xsZXIncyBpbnRlcm5hbCBDVFMgYXV0by1tZWFzdXJl bWVudC4KPiBPbiBhdCBsZWFzdCB0aGUgUkszNTc2IGhkcHR4IGludGVncmF0aW9uLCBzdHJpY3Qg SERNSSBzaW5rcyBtdXRlCj4gYXVkaW8gaW4gdGhpcyBjb25maWd1cmF0aW9uLiDCoFRoZSBiZWhh dmlvdXIgcmVwcm9kdWNlcyBhdCBhbnkgcmF0ZQo+IG5vdCBwcmVzZW50IGluIHRoZSB0YWJsZSAt LSBpdCBpcyBub3Qgc3BlY2lmaWMgdG8gSERNSSAyLng6Cj4gMTkyMHgxMDgwQDYwIHdpdGggMTAt Yml0IGRlZXAgY29sb3VyICgxODUuNjI1IE1IeiwgSERNSSAxLjQpIGlzCj4gYWZmZWN0ZWQsIGFz IGlzIDM4NDB4MjE2MEA2MCA4LWJpdCAoNTk0IE1IeiwgSERNSSAyLjApLiDCoFN1cHBseWluZwo+ IGV4cGxpY2l0IENUUyB2aWEgdGhlIHN0YW5kYXJkIHNldF9jdHNfbigpIG92ZXJyaWRlIHBhdGgg cmVzb2x2ZXMKPiB0aGUgbXV0ZS4KPiBUaGUgZHJpdmVyIGFscmVhZHkgaGFzIHRoZSBzeW1tZXRy aWMgbWFjaGluZXJ5IGZvciB0aGUgTi10YWJsZS1taXNzCj4gY2FzZTogZHdfaGRtaV9xcF9jb21w dXRlX24oKSBmYWxscyBiYWNrIHRvIGEgZHluYW1pYyBzZWFyY2ggdXNpbmcKPiBkd19oZG1pX3Fw X2F1ZGlvX21hdGhfZGlmZigpICgocGl4ZWxfY2xrICogbikgLyAoMTI4ICogZnJlcSkpIHdoZW4K PiBubyB0YWJsZSBlbnRyeSBtYXRjaGVzLiDCoFRoZSBDVFMgcGF0aCBsYWNrcyB0aGUgZXF1aXZh bGVudCBmYWxsYmFjay4KPiBDb21wdXRlIENUUyBpbmxpbmUgaW4gZHdfaGRtaV9xcF9zZXRfc2Ft cGxlX3JhdGUoKSBmcm9tIE4gcGVyIHRoZQo+IEhETUkgc3BlYyAoQ1RTID0gVE1EUyAqIE4gLyAo MTI4ICogRnMpKSB3aGVuIGZpbmRfY3RzKCkgcmV0dXJucyAwLgo+IFRoZSBzYW1lIGZvcm11bGEg YXBwZWFycyBpbiB0aGUgbGVnYWN5IERlc2lnbldhcmUgSERNSSBkcml2ZXIKPiAoZHJpdmVycy9n cHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1pLmMsIGhkbWlfc2V0X2Nsa19yZWdlbmVyYXRv cigpKQo+IHVuZGVyIGl0cyBBSEIgLyBHUCBhdWRpbyBwYXRocy4KPiBUZXN0ZWQgb24gUjc2UyAo UkszNTc2KSBvbiBBcm1iaWFuLWVkZ2UgbWFpbmxpbmUgNy4wLjEgd2l0aCBDcmlzdGlhbgo+IENp b2NhbHRlYSdzIGhkcHR4LWNsay1maXhlcyB2MSBzZXJpZXMgYXBwbGllZDoKPiAgwqAgVE1EUyDC oCDCoCDCoCDCoCBNb2RlIMKgIMKgIMKgIMKgIMKgIMKgIEluIHRhYmxlPyDCoEF1ZGlvIHdpdGgg Zml4Cj4gIMKgIDE0OC41IE1IeiDCoCDCoDEwODBwNjAgwqA4LWJpdCDCoCB5ZXMgwqAgwqAgwqAg wqBwbGF5cyAocmVncmVzc2lvbiBjaGVjaykKPiAgwqAgMTg1LjYyNSBNSHogwqAxMDgwcDYwIDEw LWJpdCDCoCBubyDCoCDCoCDCoCDCoCBwbGF5cwo+ICDCoCAyOTcgTUh6IMKgIMKgIMKgMzg0MHAz MCDCoDgtYml0IMKgIG5vIMKgIMKgIMKgIMKgIHBsYXlzCj4gIMKgIDU5NCBNSHogwqAgwqAgwqAz ODQwcDYwIMKgOC1iaXQgwqAgbm8gwqAgwqAgwqAgwqAgcGxheXMKPiBTaW5rcyB0ZXN0ZWQ6IExH IEczIE9MRUQsIExHIEM0IE9MRUQsIFRDTCA3NVA3SyBRTEVELCBLb2dhbgo+IEtBTEVENDNYVTky MTBTVEEgKENoYW5naG9uZy1PRU0gNEsgTEVEKS4gwqBXaXRob3V0IHRoZSBmaXgsIHRoZSBMRwo+ IEczIG11dGVzIGF1ZGlvIC0tIHRoaXMgaXMgdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgYnVnCj4g KGxpbnV4LXJvY2tjaGlwIDA3MDYzMykuIMKgVGhlIExHIEM0IHdhcyB2ZXJpZmllZCBkdXJpbmcg dGhpcyBjeWNsZQo+IHRvIG11dGUgYXQgMTg1LjYyNSBNSHogKDEwODBwNjAgMTAtYml0KSB3aXRo IHRoZSB1bnBhdGNoZWQgbW9kdWxlLgo+IFRoZSBLb2dhbiBUViBwbGF5cyBhdWRpbyB3aXRoIG9y IHdpdGhvdXQgdGhlIGZpeDsgaXQgaXMgYQo+IHBlcm1pc3NpdmUgSERNSSAyLjAgaW1wbGVtZW50 YXRpb24gdGhhdCBkb2VzIG5vdCBzdHJpY3RseSBjcm9zcy0KPiBjaGVjayBBQ1IgdGltaW5nLiDC oFRoZSBUQ0wgNzVQN0sgd2FzIHRlc3RlZCB3aXRoIHRoZSBmaXggbG9hZGVkCj4gb25seS4KPiBB dWRpbyBwbGF5cyBhdCBldmVyeSBzdXBwb3J0ZWQgc2FtcGxlIHJhdGUgKDMyIC8gNDQuMSAvIDQ4 IC8gOTYgLwo+IDE5MiBrSHopIHZlcmlmaWVkIG9uIHRoZSBUQ0wgYXQgdGhlIDE4NS42MjUgTUh6 IG91dC1vZi10YWJsZSBUTURTCj4gcmF0ZSAtLSB0aGUgZmFsbGJhY2sncyBDVFMgPSAoVE1EUyAq IE4pIC8gKDEyOCAqIEZzKSBjb21wdXRhdGlvbiBpcwo+IGluZGVwZW5kZW50IG9mIHNhbXBsZSBy YXRlLCBhcyBleHBlY3RlZC4KPiBUaGUgTEcgQzQncyBDVEEtODYxIFNWRHMgZG8gbm90IGFkdmVy dGlzZSAzODQweDIxNjBANjAgb3ZlciBUTURTCj4gKGl0IGlzIHNpZ25hbGxlZCBGUkwtb25seSBv biB0aGF0IG1vZGVsKSwgc28gdGhhdCBvbmUgcm93IGlzIE4vQQo+IG9uIHRoZSBDNC4gwqBUaGUg c2FtZSBhdWRpby1wYXRoIGNvZGUgaXMgZXhlcmNpc2VkIGF0IDI5NyBNSHogb24KPiB0aGF0IHNp bmsgYW5kIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8gdGhlIEczLgo+IFJlcG9ydGVkLWJ5OiBTaW1v biBXcmlnaHQgPHNpbW9uQHN5bXBsZS5uej4KPiBDbG9zZXM6Cj4gaHR0cHM6Ly9saXN0cy5pbmZy YWRlYWQub3JnL3BpcGVybWFpbC9saW51eC1yb2NrY2hpcC8yMDI2LU1heS8wNzA2MzMuaHRtbAo+ IFN1Z2dlc3RlZC1ieTogQ3Jpc3RpYW4gQ2lvY2FsdGVhIDxjcmlzdGlhbi5jaW9jYWx0ZWFAY29s bGFib3JhLmNvbT4KPiBUZXN0ZWQtYnk6IFNpbW9uIFdyaWdodCA8c2ltb25Ac3ltcGxlLm56Pgo+ IFNpZ25lZC1vZmYtYnk6IFNpbW9uIFdyaWdodCA8c2ltb25Ac3ltcGxlLm56Pgo+IC0tLQo+ICDC oGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lub3BzeXMvZHctaGRtaS1xcC5jIHwgMTUgKysrKysr KysrKysrKysrCj4gIMKgMSBmaWxlIGNoYW5nZWQsIDE1IGluc2VydGlvbnMoKykKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1pLXFwLmMKPiBiL2Ry aXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lub3BzeXMvZHctaGRtaS1xcC5jCj4gaW5kZXggMGRiYjEy NzQzNjAuLjI1YWM4ZDNjZmM4IDEwMDY0NAo+IC0tLWEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9z eW5vcHN5cy9kdy1oZG1pLXFwLmMKPiArKytiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lub3Bz eXMvZHctaGRtaS1xcC5jCj4gQEAtNDYxLDYgKzQ2MSwyMSBAQHN0YXRpYyB2b2lkIGR3X2hkbWlf cXBfc2V0X3NhbXBsZV9yYXRlKHN0cnVjdAo+IGR3X2hkbWlfcXAgKmhkbWksIHVuc2lnbmVkIGxv bmcgbG8KPiAgwqAgbiA9IGR3X2hkbWlfcXBfZmluZF9uKGhkbWksIHRtZHNfY2hhcl9yYXRlLCBz YW1wbGVfcmF0ZSk7Cj4gIMKgIGN0cyA9IGR3X2hkbWlfcXBfZmluZF9jdHMoaGRtaSwgdG1kc19j aGFyX3JhdGUsIHNhbXBsZV9yYXRlKTsKPiArIC8qCj4gKyDCoCogZHdfaGRtaV9xcF9maW5kX2N0 cygpIHJldHVybnMgMCBmb3IgYW55IFRNRFMgcmF0ZSBub3QgaW4KPiArIMKgKiBjb21tb25fdG1k c19jdHNfdGFibGVbXS4gwqBGYWxsaW5nIHRocm91Z2ggdG8gdGhlIGNvbnRyb2xsZXIncwo+ICsg wqAqIGF1dG8tbWVhc3VyZSBwYXRoIG11dGVzIGF1ZGlvIG9uIHN0cmljdCBIRE1JIHNpbmtzIGF0 IG91dC1vZi0KPiArIMKgKiB0YWJsZSByYXRlcyAoZS5nLiAxODUuNjI1IE1IeiwgMjk3IE1Ieiwg NTk0IE1IeikuIMKgQ29tcHV0ZSBDVFMKPiArIMKgKiBmcm9tIE4gcGVyIEhETUkgc3BlYyBpbnN0 ZWFkLCBzbyB0aGUgc3RhbmRhcmQgb3ZlcnJpZGUgcGF0aAo+ICsgwqAqIHN1cHBsaWVzIGl0IG9u IHRoZSB3aXJlLgo+ICsgwqAqLwo+ICsgaWYgKCFjdHMgJiYgbikgewo+ICsgwqAgdTY0IGNvbXB1 dGVkID0gKHU2NCl0bWRzX2NoYXJfcmF0ZSAqIG47Cj4gKwo+ICsgwqAgZG9fZGl2KGNvbXB1dGVk LCAxMjhVTEwgKiBzYW1wbGVfcmF0ZSk7Cj4gKyDCoCBjdHMgPSAodW5zaWduZWQgaW50KWNvbXB1 dGVkOwo+ICsgfQo+ICsKPiAgwqAgZHdfaGRtaV9xcF9zZXRfY3RzX24oaGRtaSwgY3RzLCBuKTsK PiAgwqB9CgpUaGFua3MgZm9yIHlvdXIgcGF0Y2guIEkgY2Fubm90IGNvbW1lbnQgb24gdGhlIGNv bnRlbnQgYnV0IEkgY2FuIHBvaW50IGZvcgpmb3JtYWwgaXNzdWVzIHdpdGggeW91ciBzdWJtaXNz aW9uLgoKWW91ciBwYXRjaCBnb3QgbWFuZ2xlZCBieSB5b3VyIG1haWxlciBhbmQgY2Fubm90IGJl IGFwcGxpZWQuIFBsZWFzZSBkb24ndAp0cnkgdG8gY29udmluY2UgeW91ciBtYWlsZXIgdG8gc2Vu ZCBwYXRjaGVzIHRoZSByaWdodCB3YXk6IHNhdmUgeW91ciB0aW1lCmFuZCB1c2UgImdpdC1mb3Jt YXQgcGF0Y2ggKyBnaXQgc2VuZC1lbWFpbCIsIG9yIGV2ZW4gYmV0dGVyIHVzZSBiNC4KCkFsc28g eW91ciBjb21taXQgbWVzc2FnZSBpcyB2ZXJ5IGRldGFpbGVkLCBhbmQgdGhpbmsgaXQgd291bGQg YmUgbW9yZQpyZWFkYWJsZSBpZiBzcGxpdCBpbiBwYXJhZ3JhcGhzLiBZb3UgY2FuIGhhdmUgYSBs b29rIGF0IHZhcmlvdXMgY29tbWl0cyBpbgp0aGUga2VybmVsIGxvZyBmb3IgaW5zcGlyYXRpb24u CgpUaGVyZSdzIHBsZW50eSBvZiBzdWdnZXN0aW9ucyBvbiBob3cgdG8gc2VuZCBwYXRjaGVzIGlu IFswXSwgZW5zdXJlIHlvdQpyZWFkIHRoZW0gYWxsLgoKWzBdIGh0dHBzOi8vZG9jcy5rZXJuZWwu b3JnL3Byb2Nlc3Mvc3VibWl0dGluZy1wYXRjaGVzLmh0bWwKClRoYW5rcyEKCkx1Y2EKCi0tCkx1 Y2EgQ2VyZXNvbGksIEJvb3RsaW4KRW1iZWRkZWQgTGludXggYW5kIEtlcm5lbCBlbmdpbmVlcmlu ZwpodHRwczovL2Jvb3RsaW4uY29tCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpMaW51eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBA bGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xpbnV4LXJvY2tjaGlwCg==