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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 950D7C0015E for ; Wed, 9 Aug 2023 18:58:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230153AbjHIS66 (ORCPT ); Wed, 9 Aug 2023 14:58:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41694 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229807AbjHIS66 (ORCPT ); Wed, 9 Aug 2023 14:58:58 -0400 Received: from mout-p-101.mailbox.org (mout-p-101.mailbox.org [80.241.56.151]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D156E2127; Wed, 9 Aug 2023 11:58:41 -0700 (PDT) Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4RLfTp2kn8z9tqw; Wed, 9 Aug 2023 20:58:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1691607518; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=X0YKvXT2KTxuKbCA3hfvQcc37tbMysXpUHS3VgATp4w=; b=b8GzOv6ExfexVopbHz3/mLUFMyxkjAeP4OSx1wHyTGUXoe+wG0fJsbu9N4cUOhD3/23fNT BgTdSAKas3t7GHhjELrgT3m2X/A1SOdbw0i7lWfdlXa93uBCGMwslj3D4CSWingZ1l0rn4 yY9tHL3NABRz47D+OUJ+iuxsYYbMcWpNbtPPWb/hf/JPuuMM5SXgwJTtVCLcmOFEQ+QqmO b7EqSuHF0eltdIAX3p8yM0HxfO5HHE/FknFMiSDwUXm7/TPSqkP5zPThebTuQXidaKZmbP QRrcsDc8fm3EHEUSc7DeUw46U29Zmj4ZRNxGVng8nUwnK64gXEOB5DFzi0Fpsg== References: <20230807-pll-mipi_set_rate_parent-v6-0-f173239a4b59@oltmanns.dev> From: Frank Oltmanns To: wens@csie.org Cc: Maxime Ripard , Michael Turquette , Stephen Boyd , Jernej Skrabec , Samuel Holland , Andre Przywara , Roman Beranek , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v6 00/11] clk: sunxi-ng: Consider alternative parent rates when determining NKM clock rate In-reply-to: Date: Wed, 09 Aug 2023 20:58:21 +0200 Message-ID: <877cq42gc2.fsf@oltmanns.dev> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 4RLfTp2kn8z9tqw Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org On 2023-08-10 at 00:44:53 +0800, Chen-Yu Tsai wrote: > On Mon, Aug 7, 2023 at 8:44=E2=80=AFPM Frank Oltmanns wrote: >> >> This patchset enables NKM clocks to consider alternative parent rates >> and utilize this new feature to adjust the pll-video0 clock on Allwinner >> A64. >> >> Furthermore, with this patchset pll-video0 considers rates that are >> higher than the requested rate when finding the closest rate. In >> consequence, higher rates are also considered by pll-video0's >> descandents. In total, after applying this patchset, finding the closest >> rate is supported by: >> - ccu_nm >> - ccu_nkm >> - ccu_mux >> - ccu_div >> >> This allows us to achieve an optimal rate for driving the board's panel. >> >> To provide some context, the clock structure involved in this process is >> as follows: >> clock clock type >> -------------------------------------- >> pll-video0 ccu_nm >> pll-mipi ccu_nkm >> tcon0 ccu_mux >> tcon-data-clock sun4i_dclk >> >> The divider between tcon0 and tcon-data-clock is fixed at 4. Therefore, >> in order to achieve a rate that closely matches the desired rate of the >> panel, pll-mipi needs to operate at a specific rate. >> >> Tests >> =3D=3D=3D=3D=3D >> So far, this has been successfully tested on the A64-based Pinephone >> using three different panel rates: >> >> 1. A panel rate that can be matched exactly by pll-video0. >> 2. A panel rate that requires pll-video0 to undershoot to get the >> closest rate. >> 3. A panel rate that requires pll-video0 to overshoot to get the >> closest rate. >> >> Test records: >> >> Re 1: >> ----- >> Panel requests tcon-data-clock of 103500000 Hz, i.e., pll-mipi needs to >> run at 414000000 Hz. This results in the following clock rates: >> clock rate >> ------------------------------------- >> pll-video0 207000000 >> hdmi-phy-clk 51750000 >> hdmi 207000000 >> tcon1 207000000 >> pll-mipi 414000000 >> tcon0 414000000 >> tcon-data-clock 103500000 >> >> The results of the find_best calls: >> ccu_nkm_find_best_with_parent_adj: rate=3D414000000, best_rate=3D4140000= 00, best_parent_rate=3D207000000, n=3D1, k=3D2, m=3D1 >> ccu_nkm_find_best_with_parent_adj: rate=3D414000000, best_rate=3D4140000= 00, best_parent_rate=3D207000000, n=3D1, k=3D2, m=3D1 >> ccu_nkm_find_best_with_parent_adj: rate=3D414000000, best_rate=3D4140000= 00, best_parent_rate=3D207000000, n=3D1, k=3D2, m=3D1 >> ccu_nkm_find_best_with_parent_adj: rate=3D414000000, best_rate=3D4140000= 00, best_parent_rate=3D207000000, n=3D1, k=3D2, m=3D1 >> ccu_nkm_find_best: rate=3D414000000, best_rate=3D414000000, parent_rate= =3D207000000, n=3D1, k=3D2, m=3D1 >> >> Re 2: >> ----- >> Panel requests tcon-data-clock of 103650000 Hz, i.e., pll-mipi needs to >> run at 414600000 Hz. This results in the following clock rates: >> clock rate >> ------------------------------------- >> pll-video0 282666666 >> hdmi-phy-clk 70666666 >> hdmi 282666666 >> tcon1 282666666 >> pll-mipi 414577776 >> tcon0 414577776 >> tcon-data-clock 103644444 >> >> The results of the find_best calls: >> ccu_nkm_find_best_with_parent_adj: rate=3D414600000, best_rate=3D4145777= 76, best_parent_rate=3D282666666, n=3D11, k=3D2, m=3D15 >> ccu_nkm_find_best_with_parent_adj: rate=3D414600000, best_rate=3D4145777= 76, best_parent_rate=3D282666666, n=3D11, k=3D2, m=3D15 >> ccu_nkm_find_best_with_parent_adj: rate=3D414577776, best_rate=3D4145777= 76, best_parent_rate=3D282666666, n=3D11, k=3D2, m=3D15 >> ccu_nkm_find_best_with_parent_adj: rate=3D414577776, best_rate=3D4145777= 76, best_parent_rate=3D282666666, n=3D11, k=3D2, m=3D15 >> ccu_nkm_find_best: rate=3D414577776, best_rate=3D414577776, parent_rate= =3D282666666, n=3D11, k=3D2, m=3D15 >> >> Re 3: >> ----- >> Panel requests tcon-data-clock of 112266000 Hz, i.e., pll-mipi needs to >> run at 449064000 Hz. This results in the following clock rates: >> clock rate >> ------------------------------------- >> pll-video0 207272727 >> hdmi-phy-clk 51818181 >> hdmi 207272727 >> tcon1 207272727 >> pll-mipi 449090908 >> tcon0 449090908 >> tcon-data-clock 112272727 >> >> The results of the find_best calls: >> ccu_nkm_find_best_with_parent_adj: rate=3D449064000, best_rate=3D4490909= 08, best_parent_rate=3D207272727, n=3D13, k=3D2, m=3D12 >> ccu_nkm_find_best_with_parent_adj: rate=3D449064000, best_rate=3D4490909= 08, best_parent_rate=3D207272727, n=3D13, k=3D2, m=3D12 >> ccu_nkm_find_best_with_parent_adj: rate=3D449090908, best_rate=3D4490909= 08, best_parent_rate=3D207272727, n=3D13, k=3D2, m=3D12 >> ccu_nkm_find_best_with_parent_adj: rate=3D449090908, best_rate=3D4490909= 08, best_parent_rate=3D207272727, n=3D13, k=3D2, m=3D12 >> ccu_nkm_find_best: rate=3D449090908, best_rate=3D449090908, parent_rate= =3D207272727, n=3D13, k=3D2, m=3D12 >> >> Changelog: >> ---------- >> Changes in v6: >> - Removed unnecessary #include from ccu_nkm.c >> - Link to v5: https://lore.kernel.org/r/20230806-pll-mipi_set_rate_pare= nt-v5-0-db4f5ca33fc3@oltmanns.dev >> >> Changes in v5: >> - Remove the dedicated function for calculating the optimal parent rate >> for nkm clocks that was introduced in v2 and again in v4. Instead use >> a simple calculation and require the parent clock to select the >> closest rate to achieve optimal results. >> - Change the order of parameters of nkm_best_rate and >> nkm_best_rate_with_parent_adj as requested my Maxime Ripard. >> - Prefer to not reset the rate of the nkm clock's parent if the ideal >> rate can be reached using the parent's current rate, copying the >> behavior of ccu_mp. >> - Link to v4: https://lore.kernel.org/r/20230717-pll-mipi_set_rate_pare= nt-v4-0-04acf1d39765@oltmanns.dev >> >> Changes in v4: >> - Re-introduce a dedicated function for calculating the optimal parent >> rate for nkm clocks that was introduced in v2 and removed in v3. It >> turned out that not having this functionality introduces a bug when >> the parent does not support finding the closest rate: >> https://lore.kernel.org/all/87pm4xg2ub.fsf@oltmanns.dev/ >> - Incorporate review remarks: >> - Correcting the parameter name for ccu_nkm_round_rate()'s parent HW >> is now in a separate patch. >> - Use correct parameter order in ccu_nkm_find_best_with_parent_adj. >> - Add ccu_is_better_rate() and use it for determining the best rate >> for nm and nkm, as well as ccu_mux_helper_determine_rate. >> - Consistently introduce new macros for clock variants that support >> finding the closest rate instead of updating existing macros. >> - Use wrapper function for determining a ccu_mux's rate in order to >> support finding the closest rate. >> - Link to v3: https://lore.kernel.org/r/20230702-pll-mipi_set_rate_pare= nt-v3-0-46dcb8aa9cbc@oltmanns.dev >> >> Changes in v3: >> - Use dedicated function for finding the best rate in cases where an >> nkm clock supports setting its parent's rate, streamlining it with >> the structure that is used in other sunxi-ng ccus such as ccu_mp >> (PATCH 1). >> - Therefore, remove the now obsolete comments that were introduced in >> v2 (PATCH 1). >> - Remove the dedicated function for calculating the optimal parent rate >> for nkm clocks that was introduced in v2. Instead use a simple >> calculation and require the parent clock to select the closest rate to >> achieve optimal results (PATCH 1). >> - Therefore, add support to set the closest rate for nm clocks (because >> pll-mipi's parent pll-video0 is an nm clock) and all clock types that >> are descendants of a64's pll-video0, i.e., nkm, mux, and div (PATCH 3 >> et. seq.). >> - Link to v2: https://lore.kernel.org/all/20230611090143.132257-1-frank= @oltmanns.dev/ >> >> Changes in V2: >> - Move optimal parent rate calculation to dedicated function >> - Choose a parent rate that does not to overshoot requested rate >> - Add comments to ccu_nkm_find_best >> - Make sure that best_parent_rate stays at original parent rate in the = unlikely >> case that all combinations overshoot. >> >> Link to V1: >> https://lore.kernel.org/lkml/20230605190745.366882-1-frank@oltmanns.dev/ >> >> --- >> Frank Oltmanns (11): >> clk: sunxi-ng: nkm: Use correct parameter name for parent HW >> clk: sunxi-ng: nkm: consider alternative parent rates when determi= ning rate >> clk: sunxi-ng: a64: allow pll-mipi to set parent's rate >> clk: sunxi-ng: Add feature to find closest rate >> clk: sunxi-ng: Add helper function to find closest rate >> clk: sunxi-ng: nm: Support finding closest rate >> clk: sunxi-ng: nkm: Support finding closest rate >> clk: sunxi-ng: mux: Support finding closest rate >> clk: sunxi-ng: div: Support finding closest rate >> clk: sunxi-ng: a64: select closest rate for pll-video0 >> clk: sunxi-ng: nkm: Prefer current parent rate > > Whole series applied. There were some conflicts on patch 10 I had to > fix up. I also took the liberty of realigning some of the lines. > Please check if things are correct: > > https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git/commit/?h= =3Dsunxi/clk-for-6.6&id=3Dbf8eb12f52c49e10ca1d86564bfa096e09c51c38 > Thank you. I'm sorry, I used the wrong base-commit. Yours looks perfect! Also thank you for re-indenting. Looks cleaner. Best regards, Frank > > ChenYu > >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 36 ++++++++++------------- >> drivers/clk/sunxi-ng/ccu_common.c | 12 ++++++++ >> drivers/clk/sunxi-ng/ccu_common.h | 6 ++++ >> drivers/clk/sunxi-ng/ccu_div.h | 30 +++++++++++++++++++ >> drivers/clk/sunxi-ng/ccu_mux.c | 15 ++++++++-- >> drivers/clk/sunxi-ng/ccu_mux.h | 38 +++++++++++++++++------- >> drivers/clk/sunxi-ng/ccu_nkm.c | 55 ++++++++++++++++++++++++++++= ++----- >> drivers/clk/sunxi-ng/ccu_nm.c | 13 ++++----- >> drivers/clk/sunxi-ng/ccu_nm.h | 48 ++++++++++++++++++++++++++++= -- >> 9 files changed, 202 insertions(+), 51 deletions(-) >> --- >> base-commit: 6995e2de6891c724bfeb2db33d7b87775f913ad1 >> change-id: 20230626-pll-mipi_set_rate_parent-3363fc0d6e6f >> >> Best regards, >> -- >> Frank Oltmanns >> 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 DB7A6C0015E for ; Wed, 9 Aug 2023 18:59:24 +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:MIME-Version:Message-ID:Date: In-reply-to:Subject:Cc:To:From:References:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=4lbCIJWj7BK2LAnH9cr2DouVO1/EtViIBjQi/NgwX14=; b=rKEa6v2EeidygwHGi2bo8l/Gbd Snc2I551wwDsvTlE55qd9wItVPcewDsg1xZpNxt1dyHHxpoy1gOtEaz6wRcENr5N5FAxxN5kkREjl +GqmymW9qc8b7HnEZMedBBOPPEX13vsNM5PRPreISpcvlGjxK8694qNOd12JTB+weIBJi++XhyiwX Q8sJ46269WJQATy4mwxMbTy5a9RchoAIrILhwpFMmMPWLvuTP047kYrNU/KIato0Njn97HU0iZnt+ gbvWMUvRlLzZNnJLsXkGM2XjE5uqAwc4Z+GVHRh61NQ/yS3StGZSVUpwJ8yf3bPjFDXE6wMc09BL1 9JQH8IqA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qToOR-005fIE-36; Wed, 09 Aug 2023 18:58:51 +0000 Received: from mout-p-101.mailbox.org ([2001:67c:2050:0:465::101]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qToOO-005fHl-0O for linux-arm-kernel@lists.infradead.org; Wed, 09 Aug 2023 18:58:50 +0000 Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4RLfTp2kn8z9tqw; Wed, 9 Aug 2023 20:58:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1691607518; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=X0YKvXT2KTxuKbCA3hfvQcc37tbMysXpUHS3VgATp4w=; b=b8GzOv6ExfexVopbHz3/mLUFMyxkjAeP4OSx1wHyTGUXoe+wG0fJsbu9N4cUOhD3/23fNT BgTdSAKas3t7GHhjELrgT3m2X/A1SOdbw0i7lWfdlXa93uBCGMwslj3D4CSWingZ1l0rn4 yY9tHL3NABRz47D+OUJ+iuxsYYbMcWpNbtPPWb/hf/JPuuMM5SXgwJTtVCLcmOFEQ+QqmO b7EqSuHF0eltdIAX3p8yM0HxfO5HHE/FknFMiSDwUXm7/TPSqkP5zPThebTuQXidaKZmbP QRrcsDc8fm3EHEUSc7DeUw46U29Zmj4ZRNxGVng8nUwnK64gXEOB5DFzi0Fpsg== References: <20230807-pll-mipi_set_rate_parent-v6-0-f173239a4b59@oltmanns.dev> From: Frank Oltmanns To: wens@csie.org Cc: Maxime Ripard , Michael Turquette , Stephen Boyd , Jernej Skrabec , Samuel Holland , Andre Przywara , Roman Beranek , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v6 00/11] clk: sunxi-ng: Consider alternative parent rates when determining NKM clock rate In-reply-to: Date: Wed, 09 Aug 2023 20:58:21 +0200 Message-ID: <877cq42gc2.fsf@oltmanns.dev> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4RLfTp2kn8z9tqw X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230809_115848_596546_491FEDD3 X-CRM114-Status: GOOD ( 26.00 ) 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="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Ck9uIDIwMjMtMDgtMTAgYXQgMDA6NDQ6NTMgKzA4MDAsIENoZW4tWXUgVHNhaSA8d2Vuc0Bjc2ll Lm9yZz4gd3JvdGU6Cj4gT24gTW9uLCBBdWcgNywgMjAyMyBhdCA4OjQ04oCvUE0gRnJhbmsgT2x0 bWFubnMgPGZyYW5rQG9sdG1hbm5zLmRldj4gd3JvdGU6Cj4+Cj4+IFRoaXMgcGF0Y2hzZXQgZW5h YmxlcyBOS00gY2xvY2tzIHRvIGNvbnNpZGVyIGFsdGVybmF0aXZlIHBhcmVudCByYXRlcwo+PiBh bmQgdXRpbGl6ZSB0aGlzIG5ldyBmZWF0dXJlIHRvIGFkanVzdCB0aGUgcGxsLXZpZGVvMCBjbG9j ayBvbiBBbGx3aW5uZXIKPj4gQTY0Lgo+Pgo+PiBGdXJ0aGVybW9yZSwgd2l0aCB0aGlzIHBhdGNo c2V0IHBsbC12aWRlbzAgY29uc2lkZXJzIHJhdGVzIHRoYXQgYXJlCj4+IGhpZ2hlciB0aGFuIHRo ZSByZXF1ZXN0ZWQgcmF0ZSB3aGVuIGZpbmRpbmcgdGhlIGNsb3Nlc3QgcmF0ZS4gSW4KPj4gY29u c2VxdWVuY2UsIGhpZ2hlciByYXRlcyBhcmUgYWxzbyBjb25zaWRlcmVkIGJ5IHBsbC12aWRlbzAn cwo+PiBkZXNjYW5kZW50cy4gSW4gdG90YWwsIGFmdGVyIGFwcGx5aW5nIHRoaXMgcGF0Y2hzZXQs IGZpbmRpbmcgdGhlIGNsb3Nlc3QKPj4gcmF0ZSBpcyBzdXBwb3J0ZWQgYnk6Cj4+ICAgLSBjY3Vf bm0KPj4gICAtIGNjdV9ua20KPj4gICAtIGNjdV9tdXgKPj4gICAtIGNjdV9kaXYKPj4KPj4gVGhp cyBhbGxvd3MgdXMgdG8gYWNoaWV2ZSBhbiBvcHRpbWFsIHJhdGUgZm9yIGRyaXZpbmcgdGhlIGJv YXJkJ3MgcGFuZWwuCj4+Cj4+IFRvIHByb3ZpZGUgc29tZSBjb250ZXh0LCB0aGUgY2xvY2sgc3Ry dWN0dXJlIGludm9sdmVkIGluIHRoaXMgcHJvY2VzcyBpcwo+PiBhcyBmb2xsb3dzOgo+PiAgICAg Y2xvY2sgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrIHR5cGUKPj4gICAgIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+ICAgICBwbGwtdmlkZW8wICAgICAgICAgICAg ICAgICAgY2N1X25tCj4+ICAgICAgICBwbGwtbWlwaSAgICAgICAgICAgICAgICAgY2N1X25rbQo+ PiAgICAgICAgICAgdGNvbjAgICAgICAgICAgICAgICAgIGNjdV9tdXgKPj4gICAgICAgICAgICAg IHRjb24tZGF0YS1jbG9jayAgICBzdW40aV9kY2xrCj4+Cj4+IFRoZSBkaXZpZGVyIGJldHdlZW4g dGNvbjAgYW5kIHRjb24tZGF0YS1jbG9jayBpcyBmaXhlZCBhdCA0LiBUaGVyZWZvcmUsCj4+IGlu IG9yZGVyIHRvIGFjaGlldmUgYSByYXRlIHRoYXQgY2xvc2VseSBtYXRjaGVzIHRoZSBkZXNpcmVk IHJhdGUgb2YgdGhlCj4+IHBhbmVsLCBwbGwtbWlwaSBuZWVkcyB0byBvcGVyYXRlIGF0IGEgc3Bl Y2lmaWMgcmF0ZS4KPj4KPj4gVGVzdHMKPj4gPT09PT0KPj4gU28gZmFyLCB0aGlzIGhhcyBiZWVu IHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgb24gdGhlIEE2NC1iYXNlZCBQaW5lcGhvbmUKPj4gdXNpbmcg dGhyZWUgZGlmZmVyZW50IHBhbmVsIHJhdGVzOgo+Pgo+PiAgMS4gQSBwYW5lbCByYXRlIHRoYXQg Y2FuIGJlIG1hdGNoZWQgZXhhY3RseSBieSBwbGwtdmlkZW8wLgo+PiAgMi4gQSBwYW5lbCByYXRl IHRoYXQgcmVxdWlyZXMgcGxsLXZpZGVvMCB0byB1bmRlcnNob290IHRvIGdldCB0aGUKPj4gICAg IGNsb3Nlc3QgcmF0ZS4KPj4gIDMuIEEgcGFuZWwgcmF0ZSB0aGF0IHJlcXVpcmVzIHBsbC12aWRl bzAgdG8gb3ZlcnNob290IHRvIGdldCB0aGUKPj4gICAgIGNsb3Nlc3QgcmF0ZS4KPj4KPj4gVGVz dCByZWNvcmRzOgo+Pgo+PiBSZSAxOgo+PiAtLS0tLQo+PiBQYW5lbCByZXF1ZXN0cyB0Y29uLWRh dGEtY2xvY2sgb2YgMTAzNTAwMDAwIEh6LCBpLmUuLCBwbGwtbWlwaSBuZWVkcyB0bwo+PiBydW4g YXQgNDE0MDAwMDAwIEh6LiBUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBjbG9jayByYXRl czoKPj4gICAgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZQo+PiAgICAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+ICAgICBwbGwtdmlkZW8wICAgICAg ICAgICAgICAgICAyMDcwMDAwMDAKPj4gICAgICAgIGhkbWktcGh5LWNsayAgICAgICAgICAgICA1 MTc1MDAwMAo+PiAgICAgICAgaGRtaSAgICAgICAgICAgICAgICAgICAgMjA3MDAwMDAwCj4+ICAg ICAgICB0Y29uMSAgICAgICAgICAgICAgICAgICAyMDcwMDAwMDAKPj4gICAgICAgIHBsbC1taXBp ICAgICAgICAgICAgICAgIDQxNDAwMDAwMAo+PiAgICAgICAgICAgdGNvbjAgICAgICAgICAgICAg ICAgNDE0MDAwMDAwCj4+ICAgICAgICAgICAgICB0Y29uLWRhdGEtY2xvY2sgICAxMDM1MDAwMDAK Pj4KPj4gVGhlIHJlc3VsdHMgb2YgdGhlIGZpbmRfYmVzdCBjYWxsczoKPj4gY2N1X25rbV9maW5k X2Jlc3Rfd2l0aF9wYXJlbnRfYWRqOiByYXRlPTQxNDAwMDAwMCwgYmVzdF9yYXRlPTQxNDAwMDAw MCwgYmVzdF9wYXJlbnRfcmF0ZT0yMDcwMDAwMDAsIG49MSwgaz0yLCBtPTEKPj4gY2N1X25rbV9m aW5kX2Jlc3Rfd2l0aF9wYXJlbnRfYWRqOiByYXRlPTQxNDAwMDAwMCwgYmVzdF9yYXRlPTQxNDAw MDAwMCwgYmVzdF9wYXJlbnRfcmF0ZT0yMDcwMDAwMDAsIG49MSwgaz0yLCBtPTEKPj4gY2N1X25r bV9maW5kX2Jlc3Rfd2l0aF9wYXJlbnRfYWRqOiByYXRlPTQxNDAwMDAwMCwgYmVzdF9yYXRlPTQx NDAwMDAwMCwgYmVzdF9wYXJlbnRfcmF0ZT0yMDcwMDAwMDAsIG49MSwgaz0yLCBtPTEKPj4gY2N1 X25rbV9maW5kX2Jlc3Rfd2l0aF9wYXJlbnRfYWRqOiByYXRlPTQxNDAwMDAwMCwgYmVzdF9yYXRl PTQxNDAwMDAwMCwgYmVzdF9wYXJlbnRfcmF0ZT0yMDcwMDAwMDAsIG49MSwgaz0yLCBtPTEKPj4g Y2N1X25rbV9maW5kX2Jlc3Q6IHJhdGU9NDE0MDAwMDAwLCBiZXN0X3JhdGU9NDE0MDAwMDAwLCBw YXJlbnRfcmF0ZT0yMDcwMDAwMDAsIG49MSwgaz0yLCBtPTEKPj4KPj4gUmUgMjoKPj4gLS0tLS0K Pj4gUGFuZWwgcmVxdWVzdHMgdGNvbi1kYXRhLWNsb2NrIG9mIDEwMzY1MDAwMCBIeiwgaS5lLiwg cGxsLW1pcGkgbmVlZHMgdG8KPj4gcnVuIGF0IDQxNDYwMDAwMCBIei4gVGhpcyByZXN1bHRzIGlu IHRoZSBmb2xsb3dpbmcgY2xvY2sgcmF0ZXM6Cj4+ICAgIGNsb2NrICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJhdGUKPj4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQo+PiAgICAgcGxsLXZpZGVvMCAgICAgICAgICAgICAgICAgMjgyNjY2NjY2Cj4+ICAgICAgICBo ZG1pLXBoeS1jbGsgICAgICAgICAgICAgNzA2NjY2NjYKPj4gICAgICAgIGhkbWkgICAgICAgICAg ICAgICAgICAgIDI4MjY2NjY2Ngo+PiAgICAgICAgdGNvbjEgICAgICAgICAgICAgICAgICAgMjgy NjY2NjY2Cj4+ICAgICAgICBwbGwtbWlwaSAgICAgICAgICAgICAgICA0MTQ1Nzc3NzYKPj4gICAg ICAgICAgIHRjb24wICAgICAgICAgICAgICAgIDQxNDU3Nzc3Ngo+PiAgICAgICAgICAgICAgdGNv bi1kYXRhLWNsb2NrICAgMTAzNjQ0NDQ0Cj4+Cj4+IFRoZSByZXN1bHRzIG9mIHRoZSBmaW5kX2Jl c3QgY2FsbHM6Cj4+IGNjdV9ua21fZmluZF9iZXN0X3dpdGhfcGFyZW50X2FkajogcmF0ZT00MTQ2 MDAwMDAsIGJlc3RfcmF0ZT00MTQ1Nzc3NzYsIGJlc3RfcGFyZW50X3JhdGU9MjgyNjY2NjY2LCBu PTExLCBrPTIsIG09MTUKPj4gY2N1X25rbV9maW5kX2Jlc3Rfd2l0aF9wYXJlbnRfYWRqOiByYXRl PTQxNDYwMDAwMCwgYmVzdF9yYXRlPTQxNDU3Nzc3NiwgYmVzdF9wYXJlbnRfcmF0ZT0yODI2NjY2 NjYsIG49MTEsIGs9MiwgbT0xNQo+PiBjY3VfbmttX2ZpbmRfYmVzdF93aXRoX3BhcmVudF9hZGo6 IHJhdGU9NDE0NTc3Nzc2LCBiZXN0X3JhdGU9NDE0NTc3Nzc2LCBiZXN0X3BhcmVudF9yYXRlPTI4 MjY2NjY2Niwgbj0xMSwgaz0yLCBtPTE1Cj4+IGNjdV9ua21fZmluZF9iZXN0X3dpdGhfcGFyZW50 X2FkajogcmF0ZT00MTQ1Nzc3NzYsIGJlc3RfcmF0ZT00MTQ1Nzc3NzYsIGJlc3RfcGFyZW50X3Jh dGU9MjgyNjY2NjY2LCBuPTExLCBrPTIsIG09MTUKPj4gY2N1X25rbV9maW5kX2Jlc3Q6IHJhdGU9 NDE0NTc3Nzc2LCBiZXN0X3JhdGU9NDE0NTc3Nzc2LCBwYXJlbnRfcmF0ZT0yODI2NjY2NjYsIG49 MTEsIGs9MiwgbT0xNQo+Pgo+PiBSZSAzOgo+PiAtLS0tLQo+PiBQYW5lbCByZXF1ZXN0cyB0Y29u LWRhdGEtY2xvY2sgb2YgMTEyMjY2MDAwIEh6LCBpLmUuLCBwbGwtbWlwaSBuZWVkcyB0bwo+PiBy dW4gYXQgNDQ5MDY0MDAwIEh6LiBUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBjbG9jayBy YXRlczoKPj4gICAgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZQo+PiAgICAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+ICAgICBwbGwtdmlkZW8wICAg ICAgICAgICAgICAgICAyMDcyNzI3MjcKPj4gICAgICAgIGhkbWktcGh5LWNsayAgICAgICAgICAg ICA1MTgxODE4MQo+PiAgICAgICAgaGRtaSAgICAgICAgICAgICAgICAgICAgMjA3MjcyNzI3Cj4+ ICAgICAgICB0Y29uMSAgICAgICAgICAgICAgICAgICAyMDcyNzI3MjcKPj4gICAgICAgIHBsbC1t aXBpICAgICAgICAgICAgICAgIDQ0OTA5MDkwOAo+PiAgICAgICAgICAgdGNvbjAgICAgICAgICAg ICAgICAgNDQ5MDkwOTA4Cj4+ICAgICAgICAgICAgICB0Y29uLWRhdGEtY2xvY2sgICAxMTIyNzI3 MjcKPj4KPj4gVGhlIHJlc3VsdHMgb2YgdGhlIGZpbmRfYmVzdCBjYWxsczoKPj4gY2N1X25rbV9m aW5kX2Jlc3Rfd2l0aF9wYXJlbnRfYWRqOiByYXRlPTQ0OTA2NDAwMCwgYmVzdF9yYXRlPTQ0OTA5 MDkwOCwgYmVzdF9wYXJlbnRfcmF0ZT0yMDcyNzI3MjcsIG49MTMsIGs9MiwgbT0xMgo+PiBjY3Vf bmttX2ZpbmRfYmVzdF93aXRoX3BhcmVudF9hZGo6IHJhdGU9NDQ5MDY0MDAwLCBiZXN0X3JhdGU9 NDQ5MDkwOTA4LCBiZXN0X3BhcmVudF9yYXRlPTIwNzI3MjcyNywgbj0xMywgaz0yLCBtPTEyCj4+ IGNjdV9ua21fZmluZF9iZXN0X3dpdGhfcGFyZW50X2FkajogcmF0ZT00NDkwOTA5MDgsIGJlc3Rf cmF0ZT00NDkwOTA5MDgsIGJlc3RfcGFyZW50X3JhdGU9MjA3MjcyNzI3LCBuPTEzLCBrPTIsIG09 MTIKPj4gY2N1X25rbV9maW5kX2Jlc3Rfd2l0aF9wYXJlbnRfYWRqOiByYXRlPTQ0OTA5MDkwOCwg YmVzdF9yYXRlPTQ0OTA5MDkwOCwgYmVzdF9wYXJlbnRfcmF0ZT0yMDcyNzI3MjcsIG49MTMsIGs9 MiwgbT0xMgo+PiBjY3VfbmttX2ZpbmRfYmVzdDogcmF0ZT00NDkwOTA5MDgsIGJlc3RfcmF0ZT00 NDkwOTA5MDgsIHBhcmVudF9yYXRlPTIwNzI3MjcyNywgbj0xMywgaz0yLCBtPTEyCj4+Cj4+IENo YW5nZWxvZzoKPj4gLS0tLS0tLS0tLQo+PiBDaGFuZ2VzIGluIHY2Ogo+PiAgLSBSZW1vdmVkIHVu bmVjZXNzYXJ5ICNpbmNsdWRlIGZyb20gY2N1X25rbS5jCj4+ICAtIExpbmsgdG8gdjU6IGh0dHBz Oi8vbG9yZS5rZXJuZWwub3JnL3IvMjAyMzA4MDYtcGxsLW1pcGlfc2V0X3JhdGVfcGFyZW50LXY1 LTAtZGI0ZjVjYTMzZmMzQG9sdG1hbm5zLmRldgo+Pgo+PiBDaGFuZ2VzIGluIHY1Ogo+PiAgLSBS ZW1vdmUgdGhlIGRlZGljYXRlZCBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgdGhlIG9wdGltYWwg cGFyZW50IHJhdGUKPj4gICAgZm9yIG5rbSBjbG9ja3MgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiB2 MiBhbmQgYWdhaW4gaW4gdjQuIEluc3RlYWQgdXNlCj4+ICAgIGEgc2ltcGxlIGNhbGN1bGF0aW9u IGFuZCByZXF1aXJlIHRoZSBwYXJlbnQgY2xvY2sgdG8gc2VsZWN0IHRoZQo+PiAgICBjbG9zZXN0 IHJhdGUgdG8gYWNoaWV2ZSBvcHRpbWFsIHJlc3VsdHMuCj4+ICAtIENoYW5nZSB0aGUgb3JkZXIg b2YgcGFyYW1ldGVycyBvZiBua21fYmVzdF9yYXRlIGFuZAo+PiAgICBua21fYmVzdF9yYXRlX3dp dGhfcGFyZW50X2FkaiBhcyByZXF1ZXN0ZWQgbXkgTWF4aW1lIFJpcGFyZC4KPj4gIC0gUHJlZmVy IHRvIG5vdCByZXNldCB0aGUgcmF0ZSBvZiB0aGUgbmttIGNsb2NrJ3MgcGFyZW50IGlmIHRoZSBp ZGVhbAo+PiAgICByYXRlIGNhbiBiZSByZWFjaGVkIHVzaW5nIHRoZSBwYXJlbnQncyBjdXJyZW50 IHJhdGUsIGNvcHlpbmcgdGhlCj4+ICAgIGJlaGF2aW9yIG9mIGNjdV9tcC4KPj4gIC0gTGluayB0 byB2NDogaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDIzMDcxNy1wbGwtbWlwaV9zZXRfcmF0 ZV9wYXJlbnQtdjQtMC0wNGFjZjFkMzk3NjVAb2x0bWFubnMuZGV2Cj4+Cj4+IENoYW5nZXMgaW4g djQ6Cj4+ICAtIFJlLWludHJvZHVjZSBhIGRlZGljYXRlZCBmdW5jdGlvbiBmb3IgY2FsY3VsYXRp bmcgdGhlIG9wdGltYWwgcGFyZW50Cj4+ICAgIHJhdGUgZm9yIG5rbSBjbG9ja3MgdGhhdCB3YXMg aW50cm9kdWNlZCBpbiB2MiBhbmQgcmVtb3ZlZCBpbiB2My4gSXQKPj4gICAgdHVybmVkIG91dCB0 aGF0IG5vdCBoYXZpbmcgdGhpcyBmdW5jdGlvbmFsaXR5IGludHJvZHVjZXMgYSBidWcgd2hlbgo+ PiAgICB0aGUgcGFyZW50IGRvZXMgbm90IHN1cHBvcnQgZmluZGluZyB0aGUgY2xvc2VzdCByYXRl Ogo+PiAgICBodHRwczovL2xvcmUua2VybmVsLm9yZy9hbGwvODdwbTR4ZzJ1Yi5mc2ZAb2x0bWFu bnMuZGV2Lwo+PiAgLSBJbmNvcnBvcmF0ZSByZXZpZXcgcmVtYXJrczoKPj4gICAgIC0gQ29ycmVj dGluZyB0aGUgcGFyYW1ldGVyIG5hbWUgZm9yIGNjdV9ua21fcm91bmRfcmF0ZSgpJ3MgcGFyZW50 IEhXCj4+ICAgICAgIGlzIG5vdyBpbiBhIHNlcGFyYXRlIHBhdGNoLgo+PiAgICAgLSBVc2UgY29y cmVjdCBwYXJhbWV0ZXIgb3JkZXIgaW4gY2N1X25rbV9maW5kX2Jlc3Rfd2l0aF9wYXJlbnRfYWRq Lgo+PiAgICAgLSBBZGQgY2N1X2lzX2JldHRlcl9yYXRlKCkgYW5kIHVzZSBpdCBmb3IgZGV0ZXJt aW5pbmcgdGhlIGJlc3QgcmF0ZQo+PiAgICAgICBmb3Igbm0gYW5kIG5rbSwgYXMgd2VsbCBhcyBj Y3VfbXV4X2hlbHBlcl9kZXRlcm1pbmVfcmF0ZS4KPj4gICAgIC0gQ29uc2lzdGVudGx5IGludHJv ZHVjZSBuZXcgbWFjcm9zIGZvciBjbG9jayB2YXJpYW50cyB0aGF0IHN1cHBvcnQKPj4gICAgICAg ZmluZGluZyB0aGUgY2xvc2VzdCByYXRlIGluc3RlYWQgb2YgdXBkYXRpbmcgZXhpc3RpbmcgbWFj cm9zLgo+PiAgICAgLSBVc2Ugd3JhcHBlciBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgYSBjY3Vf bXV4J3MgcmF0ZSBpbiBvcmRlciB0bwo+PiAgICAgICBzdXBwb3J0IGZpbmRpbmcgdGhlIGNsb3Nl c3QgcmF0ZS4KPj4gIC0gTGluayB0byB2MzogaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDIz MDcwMi1wbGwtbWlwaV9zZXRfcmF0ZV9wYXJlbnQtdjMtMC00NmRjYjhhYTljYmNAb2x0bWFubnMu ZGV2Cj4+Cj4+IENoYW5nZXMgaW4gdjM6Cj4+ICAtIFVzZSBkZWRpY2F0ZWQgZnVuY3Rpb24gZm9y IGZpbmRpbmcgdGhlIGJlc3QgcmF0ZSBpbiBjYXNlcyB3aGVyZSBhbgo+PiAgICBua20gY2xvY2sg c3VwcG9ydHMgc2V0dGluZyBpdHMgcGFyZW50J3MgcmF0ZSwgc3RyZWFtbGluaW5nIGl0IHdpdGgK Pj4gICAgdGhlIHN0cnVjdHVyZSB0aGF0IGlzIHVzZWQgaW4gb3RoZXIgc3VueGktbmcgY2N1cyBz dWNoIGFzIGNjdV9tcAo+PiAgICAoUEFUQ0ggMSkuCj4+ICAtIFRoZXJlZm9yZSwgcmVtb3ZlIHRo ZSBub3cgb2Jzb2xldGUgY29tbWVudHMgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4KPj4gICAgdjIg KFBBVENIIDEpLgo+PiAgLSBSZW1vdmUgdGhlIGRlZGljYXRlZCBmdW5jdGlvbiBmb3IgY2FsY3Vs YXRpbmcgdGhlIG9wdGltYWwgcGFyZW50IHJhdGUKPj4gICAgZm9yIG5rbSBjbG9ja3MgdGhhdCB3 YXMgaW50cm9kdWNlZCBpbiB2Mi4gSW5zdGVhZCB1c2UgYSBzaW1wbGUKPj4gICAgY2FsY3VsYXRp b24gYW5kIHJlcXVpcmUgdGhlIHBhcmVudCBjbG9jayB0byBzZWxlY3QgdGhlIGNsb3Nlc3QgcmF0 ZSB0bwo+PiAgICBhY2hpZXZlIG9wdGltYWwgcmVzdWx0cyAoUEFUQ0ggMSkuCj4+ICAtIFRoZXJl Zm9yZSwgYWRkIHN1cHBvcnQgdG8gc2V0IHRoZSBjbG9zZXN0IHJhdGUgZm9yIG5tIGNsb2NrcyAo YmVjYXVzZQo+PiAgICBwbGwtbWlwaSdzIHBhcmVudCBwbGwtdmlkZW8wIGlzIGFuIG5tIGNsb2Nr KSBhbmQgYWxsIGNsb2NrIHR5cGVzIHRoYXQKPj4gICAgYXJlIGRlc2NlbmRhbnRzIG9mIGE2NCdz IHBsbC12aWRlbzAsIGkuZS4sIG5rbSwgbXV4LCBhbmQgZGl2IChQQVRDSCAzCj4+ICAgIGV0LiBz ZXEuKS4KPj4gIC0gTGluayB0byB2MjogaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvYWxsLzIwMjMw NjExMDkwMTQzLjEzMjI1Ny0xLWZyYW5rQG9sdG1hbm5zLmRldi8KPj4KPj4gQ2hhbmdlcyBpbiBW MjoKPj4gIC0gTW92ZSBvcHRpbWFsIHBhcmVudCByYXRlIGNhbGN1bGF0aW9uIHRvIGRlZGljYXRl ZCBmdW5jdGlvbgo+PiAgLSBDaG9vc2UgYSBwYXJlbnQgcmF0ZSB0aGF0IGRvZXMgbm90IHRvIG92 ZXJzaG9vdCByZXF1ZXN0ZWQgcmF0ZQo+PiAgLSBBZGQgY29tbWVudHMgdG8gY2N1X25rbV9maW5k X2Jlc3QKPj4gIC0gTWFrZSBzdXJlIHRoYXQgYmVzdF9wYXJlbnRfcmF0ZSBzdGF5cyBhdCBvcmln aW5hbCBwYXJlbnQgcmF0ZSBpbiB0aGUgdW5saWtlbHkKPj4gICAgY2FzZSB0aGF0IGFsbCBjb21i aW5hdGlvbnMgb3ZlcnNob290Lgo+Pgo+PiBMaW5rIHRvIFYxOgo+PiBodHRwczovL2xvcmUua2Vy bmVsLm9yZy9sa21sLzIwMjMwNjA1MTkwNzQ1LjM2Njg4Mi0xLWZyYW5rQG9sdG1hbm5zLmRldi8K Pj4KPj4gLS0tCj4+IEZyYW5rIE9sdG1hbm5zICgxMSk6Cj4+ICAgICAgIGNsazogc3VueGktbmc6 IG5rbTogVXNlIGNvcnJlY3QgcGFyYW1ldGVyIG5hbWUgZm9yIHBhcmVudCBIVwo+PiAgICAgICBj bGs6IHN1bnhpLW5nOiBua206IGNvbnNpZGVyIGFsdGVybmF0aXZlIHBhcmVudCByYXRlcyB3aGVu IGRldGVybWluaW5nIHJhdGUKPj4gICAgICAgY2xrOiBzdW54aS1uZzogYTY0OiBhbGxvdyBwbGwt bWlwaSB0byBzZXQgcGFyZW50J3MgcmF0ZQo+PiAgICAgICBjbGs6IHN1bnhpLW5nOiBBZGQgZmVh dHVyZSB0byBmaW5kIGNsb3Nlc3QgcmF0ZQo+PiAgICAgICBjbGs6IHN1bnhpLW5nOiBBZGQgaGVs cGVyIGZ1bmN0aW9uIHRvIGZpbmQgY2xvc2VzdCByYXRlCj4+ICAgICAgIGNsazogc3VueGktbmc6 IG5tOiBTdXBwb3J0IGZpbmRpbmcgY2xvc2VzdCByYXRlCj4+ICAgICAgIGNsazogc3VueGktbmc6 IG5rbTogU3VwcG9ydCBmaW5kaW5nIGNsb3Nlc3QgcmF0ZQo+PiAgICAgICBjbGs6IHN1bnhpLW5n OiBtdXg6IFN1cHBvcnQgZmluZGluZyBjbG9zZXN0IHJhdGUKPj4gICAgICAgY2xrOiBzdW54aS1u ZzogZGl2OiBTdXBwb3J0IGZpbmRpbmcgY2xvc2VzdCByYXRlCj4+ICAgICAgIGNsazogc3VueGkt bmc6IGE2NDogc2VsZWN0IGNsb3Nlc3QgcmF0ZSBmb3IgcGxsLXZpZGVvMAo+PiAgICAgICBjbGs6 IHN1bnhpLW5nOiBua206IFByZWZlciBjdXJyZW50IHBhcmVudCByYXRlCj4KPiBXaG9sZSBzZXJp ZXMgYXBwbGllZC4gVGhlcmUgd2VyZSBzb21lIGNvbmZsaWN0cyBvbiBwYXRjaCAxMCBJIGhhZCB0 bwo+IGZpeCB1cC4gSSBhbHNvIHRvb2sgdGhlIGxpYmVydHkgb2YgcmVhbGlnbmluZyBzb21lIG9m IHRoZSBsaW5lcy4KPiBQbGVhc2UgY2hlY2sgaWYgdGhpbmdzIGFyZSBjb3JyZWN0Ogo+Cj4gaHR0 cHM6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc3VueGkvbGludXgu Z2l0L2NvbW1pdC8/aD1zdW54aS9jbGstZm9yLTYuNiZpZD1iZjhlYjEyZjUyYzQ5ZTEwY2ExZDg2 NTY0YmZhMDk2ZTA5YzUxYzM4Cj4KClRoYW5rIHlvdS4gSSdtIHNvcnJ5LCBJIHVzZWQgdGhlIHdy b25nIGJhc2UtY29tbWl0LiBZb3VycyBsb29rcyBwZXJmZWN0IQoKQWxzbyB0aGFuayB5b3UgZm9y IHJlLWluZGVudGluZy4gTG9va3MgY2xlYW5lci4KCkJlc3QgcmVnYXJkcywKICBGcmFuawoKPgo+ IENoZW5ZdQo+Cj4+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLWE2NC5jIHwgMzYg KysrKysrKysrKy0tLS0tLS0tLS0tLS0KPj4gIGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9jb21t b24uYyAgICAgfCAxMiArKysrKysrKwo+PiAgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X2NvbW1v bi5oICAgICB8ICA2ICsrKysKPj4gIGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9kaXYuaCAgICAg ICAgfCAzMCArKysrKysrKysrKysrKysrKysrCj4+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Vf bXV4LmMgICAgICAgIHwgMTUgKysrKysrKystLQo+PiAgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1 X211eC5oICAgICAgICB8IDM4ICsrKysrKysrKysrKysrKysrLS0tLS0tLQo+PiAgZHJpdmVycy9j bGsvc3VueGktbmcvY2N1X25rbS5jICAgICAgICB8IDU1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKy0tLS0tCj4+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Vfbm0uYyAgICAgICAgIHwg MTMgKysrKy0tLS0tCj4+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Vfbm0uaCAgICAgICAgIHwg NDggKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tCj4+ICA5IGZpbGVzIGNoYW5nZWQsIDIw MiBpbnNlcnRpb25zKCspLCA1MSBkZWxldGlvbnMoLSkKPj4gLS0tCj4+IGJhc2UtY29tbWl0OiA2 OTk1ZTJkZTY4OTFjNzI0YmZlYjJkYjMzZDdiODc3NzVmOTEzYWQxCj4+IGNoYW5nZS1pZDogMjAy MzA2MjYtcGxsLW1pcGlfc2V0X3JhdGVfcGFyZW50LTMzNjNmYzBkNmU2Zgo+Pgo+PiBCZXN0IHJl Z2FyZHMsCj4+IC0tCj4+IEZyYW5rIE9sdG1hbm5zIDxmcmFua0BvbHRtYW5ucy5kZXY+Cj4+Cgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0t a2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2Vy bmVsCg==