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=-3.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 09520C433B4 for ; Wed, 12 May 2021 13:02:13 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 60DC261287 for ; Wed, 12 May 2021 13:02:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 60DC261287 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 557876EB98; Wed, 12 May 2021 13:02:11 +0000 (UTC) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by gabe.freedesktop.org (Postfix) with ESMTPS id A77D36EB98; Wed, 12 May 2021 13:02:09 +0000 (UTC) IronPort-SDR: mz37/KCvRAK/+6Bwc5enMohDDAmTitMRX2JhERlCtotZPLms+Uog84RYMXc32VGOdFeIUHvlTG P1DYajJlPlxA== X-IronPort-AV: E=McAfee;i="6200,9189,9981"; a="179963349" X-IronPort-AV: E=Sophos;i="5.82,293,1613462400"; d="scan'208";a="179963349" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2021 06:02:06 -0700 IronPort-SDR: cfTayY3noWvjLgRlrcBfD+8S9sVW2vG5X0AHxR/ciDX6w4SCFEv/bw6BHISIOpnHtWhzHQ4LtB g91OWBZt57/A== X-IronPort-AV: E=Sophos;i="5.82,293,1613462400"; d="scan'208";a="609921226" Received: from kjeldbeg-mobl2.ger.corp.intel.com ([10.249.254.168]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2021 06:02:05 -0700 Message-ID: <6e317ee2b22546a2333d3098f5cda1a59da62a1a.camel@linux.intel.com> Subject: Re: [PATCH 6/7] drm/i915/ttm, drm/ttm: Introduce a TTM i915 gem object backend From: Thomas =?ISO-8859-1?Q?Hellstr=F6m?= To: Christian =?ISO-8859-1?Q?K=F6nig?= , Thomas =?ISO-8859-1?Q?Hellstr=F6m?= "(Intel)" , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Wed, 12 May 2021 15:02:02 +0200 In-Reply-To: References: <20210511132525.377190-1-thomas.hellstrom@linux.intel.com> <20210511132525.377190-7-thomas.hellstrom@linux.intel.com> <8ac6bc5c-17c0-2ffd-7f8c-823ab3c8a858@amd.com> <88ea8e22-3314-60a4-8f4b-0b37de444b1d@shipmail.org> <8551810c-a095-3906-d982-7bc409140c48@amd.com> <0b7f32d8-bfb9-84dd-fea7-556dddded1cc@linux.intel.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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" On Wed, 2021-05-12 at 09:09 +0200, Christian König wrote: > Am 12.05.21 um 09:05 schrieb Thomas Hellström: > > On Wed, 2021-05-12 at 08:57 +0200, Christian König wrote: > > > Am 11.05.21 um 16:28 schrieb Thomas Hellström: > > > > On 5/11/21 4:09 PM, Christian König wrote: > > > > > > > > > > Am 11.05.21 um 16:06 schrieb Thomas Hellström (Intel): > > > > > > On 5/11/21 3:58 PM, Christian König wrote: > > > > > > > Am 11.05.21 um 15:25 schrieb Thomas Hellström: > > > > > > > > Most logical place to introduce TTM buffer objects is > > > > > > > > as an > > > > > > > > i915 > > > > > > > > gem object backend. We need to add some ops to account > > > > > > > > for > > > > > > > > added > > > > > > > > functionality like delayed delete and LRU list > > > > > > > > manipulation. > > > > > > > > > > > > > > > > Initially we support only LMEM and SYSTEM memory, but > > > > > > > > SYSTEM > > > > > > > > (which in this case means evicted LMEM objects) is not > > > > > > > > visible to i915 GEM yet. The plan is to move the i915 > > > > > > > > gem > > > > > > > > system > > > > > > > > region > > > > > > > > over to the TTM system memory type in upcoming patches. > > > > > > > > > > > > > > > > We set up GPU bindings directly both from LMEM and from > > > > > > > > the > > > > > > > > system > > > > > > > > region, > > > > > > > > as there is no need to use the legacy TTM_TT memory > > > > > > > > type. > > > > > > > > We reserve > > > > > > > > that for future porting of GGTT bindings to TTM. > > > > > > > > > > > > > > > > There are some changes to TTM to allow for purging > > > > > > > > system > > > > > > > > memory > > > > > > > > buffer > > > > > > > > objects and to refuse swapping of some objects: > > > > > > > > Unfortunately i915 > > > > > > > > gem > > > > > > > > still relies heavily on short-term object pinning, and > > > > > > > > we've > > > > > > > > chosen to > > > > > > > > keep short-term-pinned buffer objects on the TTM LRU > > > > > > > > lists > > > > > > > > for now, > > > > > > > > meaning that we need some sort of mechanism to tell TTM > > > > > > > > they are not > > > > > > > > swappable. A longer term goal is to get rid of the > > > > > > > > short- > > > > > > > > term > > > > > > > > pinning. > > > > > > > Well just use the eviction_valuable interface for this. > > > > > > Yes, we do that for vram/lmem eviction, but we have nothing > > > > > > similar > > > > > > for system swapping. Do I understand you correctly that you > > > > > > want me > > > > > > to add a call to eviction_valuable() also for that instead > > > > > > of > > > > > > swap_possible()? > > > > > You should already have that. eviction_valuable is called in > > > > > both > > > > > cases. > > > > > > > > > Hmm. I can only see it called from ttm_mem_evict_first() which > > > > is > > > > not > > > > in the swapping path? Or do I miss something? > > > Mhm, looks like my recollection was wrong. We should probably > > > move > > > the > > > call into the ttm_bo_evict_swapout_allowable() function. > > Yes, I think we also need a convention whether it's called dma_resv > > locked or not, since the helper accesses bo->mem, which should > > really > > only be done under reservation. At the same point, there is value > > in > > calling this function while holding the LRU lock. > > You actually need to call it while holding the lock because eviction > otherwise ends up in an endless loop. > > Trying to fix that for years, but so far no luck with that. > > > Also, I wonder whether implementations of this callback might > > encounter > > unexpected data when called from the swapout path, because at least > > the > > helper assumes it not in system memory, since it is accessing bo- > > > mem.start. > > So unless we use a separate callback for swapout, there's some > > auditing > > to be done. > > Please audit the existing callbacks and move the callback into the > function after doing that. > > Thanks, > Christian. Would it be OK if I also move the kref_get_unless_zero() to before ttm_bo_evict_swapout_allowable() to make the code less sensitive to surprises? /Thomas > > > > > Pls let me know what you think. > > Thanks, > > Thomas > > > > > > > > > Christian. > > > > > > > Thanks, > > > > > > > > Thomas > > > > > > > > > > > > > > > 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=-3.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 AD380C433ED for ; Wed, 12 May 2021 13:02:16 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 4379960200 for ; Wed, 12 May 2021 13:02:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4379960200 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AA9E16EB9A; Wed, 12 May 2021 13:02:11 +0000 (UTC) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by gabe.freedesktop.org (Postfix) with ESMTPS id A77D36EB98; Wed, 12 May 2021 13:02:09 +0000 (UTC) IronPort-SDR: mz37/KCvRAK/+6Bwc5enMohDDAmTitMRX2JhERlCtotZPLms+Uog84RYMXc32VGOdFeIUHvlTG P1DYajJlPlxA== X-IronPort-AV: E=McAfee;i="6200,9189,9981"; a="179963349" X-IronPort-AV: E=Sophos;i="5.82,293,1613462400"; d="scan'208";a="179963349" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2021 06:02:06 -0700 IronPort-SDR: cfTayY3noWvjLgRlrcBfD+8S9sVW2vG5X0AHxR/ciDX6w4SCFEv/bw6BHISIOpnHtWhzHQ4LtB g91OWBZt57/A== X-IronPort-AV: E=Sophos;i="5.82,293,1613462400"; d="scan'208";a="609921226" Received: from kjeldbeg-mobl2.ger.corp.intel.com ([10.249.254.168]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2021 06:02:05 -0700 Message-ID: <6e317ee2b22546a2333d3098f5cda1a59da62a1a.camel@linux.intel.com> From: Thomas =?ISO-8859-1?Q?Hellstr=F6m?= To: Christian =?ISO-8859-1?Q?K=F6nig?= , Thomas =?ISO-8859-1?Q?Hellstr=F6m?= "(Intel)" , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Wed, 12 May 2021 15:02:02 +0200 In-Reply-To: References: <20210511132525.377190-1-thomas.hellstrom@linux.intel.com> <20210511132525.377190-7-thomas.hellstrom@linux.intel.com> <8ac6bc5c-17c0-2ffd-7f8c-823ab3c8a858@amd.com> <88ea8e22-3314-60a4-8f4b-0b37de444b1d@shipmail.org> <8551810c-a095-3906-d982-7bc409140c48@amd.com> <0b7f32d8-bfb9-84dd-fea7-556dddded1cc@linux.intel.com> User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Subject: Re: [Intel-gfx] [PATCH 6/7] drm/i915/ttm, drm/ttm: Introduce a TTM i915 gem object backend X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gV2VkLCAyMDIxLTA1LTEyIGF0IDA5OjA5ICswMjAwLCBDaHJpc3RpYW4gS8O2bmlnIHdyb3Rl Ogo+IEFtIDEyLjA1LjIxIHVtIDA5OjA1IHNjaHJpZWIgVGhvbWFzIEhlbGxzdHLDtm06Cj4gPiBP biBXZWQsIDIwMjEtMDUtMTIgYXQgMDg6NTcgKzAyMDAsIENocmlzdGlhbiBLw7ZuaWcgd3JvdGU6 Cj4gPiA+IEFtIDExLjA1LjIxIHVtIDE2OjI4IHNjaHJpZWIgVGhvbWFzIEhlbGxzdHLDtm06Cj4g PiA+ID4gT24gNS8xMS8yMSA0OjA5IFBNLCBDaHJpc3RpYW4gS8O2bmlnIHdyb3RlOgo+ID4gPiA+ ID4gCj4gPiA+ID4gPiBBbSAxMS4wNS4yMSB1bSAxNjowNiBzY2hyaWViIFRob21hcyBIZWxsc3Ry w7ZtIChJbnRlbCk6Cj4gPiA+ID4gPiA+IE9uIDUvMTEvMjEgMzo1OCBQTSwgQ2hyaXN0aWFuIEvD tm5pZyB3cm90ZToKPiA+ID4gPiA+ID4gPiBBbSAxMS4wNS4yMSB1bSAxNToyNSBzY2hyaWViIFRo b21hcyBIZWxsc3Ryw7ZtOgo+ID4gPiA+ID4gPiA+ID4gTW9zdCBsb2dpY2FsIHBsYWNlIHRvIGlu dHJvZHVjZSBUVE0gYnVmZmVyIG9iamVjdHMgaXMKPiA+ID4gPiA+ID4gPiA+IGFzIGFuCj4gPiA+ ID4gPiA+ID4gPiBpOTE1Cj4gPiA+ID4gPiA+ID4gPiBnZW0gb2JqZWN0IGJhY2tlbmQuIFdlIG5l ZWQgdG8gYWRkIHNvbWUgb3BzIHRvIGFjY291bnQKPiA+ID4gPiA+ID4gPiA+IGZvcgo+ID4gPiA+ ID4gPiA+ID4gYWRkZWQKPiA+ID4gPiA+ID4gPiA+IGZ1bmN0aW9uYWxpdHkgbGlrZSBkZWxheWVk IGRlbGV0ZSBhbmQgTFJVIGxpc3QKPiA+ID4gPiA+ID4gPiA+IG1hbmlwdWxhdGlvbi4KPiA+ID4g PiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gSW5pdGlhbGx5IHdlIHN1cHBvcnQgb25seSBMTUVN IGFuZCBTWVNURU0gbWVtb3J5LCBidXQKPiA+ID4gPiA+ID4gPiA+IFNZU1RFTQo+ID4gPiA+ID4g PiA+ID4gKHdoaWNoIGluIHRoaXMgY2FzZSBtZWFucyBldmljdGVkIExNRU0gb2JqZWN0cykgaXMg bm90Cj4gPiA+ID4gPiA+ID4gPiB2aXNpYmxlIHRvIGk5MTUgR0VNIHlldC4gVGhlIHBsYW4gaXMg dG8gbW92ZSB0aGUgaTkxNQo+ID4gPiA+ID4gPiA+ID4gZ2VtCj4gPiA+ID4gPiA+ID4gPiBzeXN0 ZW0KPiA+ID4gPiA+ID4gPiA+IHJlZ2lvbgo+ID4gPiA+ID4gPiA+ID4gb3ZlciB0byB0aGUgVFRN IHN5c3RlbSBtZW1vcnkgdHlwZSBpbiB1cGNvbWluZyBwYXRjaGVzLgo+ID4gPiA+ID4gPiA+ID4g Cj4gPiA+ID4gPiA+ID4gPiBXZSBzZXQgdXAgR1BVIGJpbmRpbmdzIGRpcmVjdGx5IGJvdGggZnJv bSBMTUVNIGFuZCBmcm9tCj4gPiA+ID4gPiA+ID4gPiB0aGUKPiA+ID4gPiA+ID4gPiA+IHN5c3Rl bQo+ID4gPiA+ID4gPiA+ID4gcmVnaW9uLAo+ID4gPiA+ID4gPiA+ID4gYXMgdGhlcmUgaXMgbm8g bmVlZCB0byB1c2UgdGhlIGxlZ2FjeSBUVE1fVFQgbWVtb3J5Cj4gPiA+ID4gPiA+ID4gPiB0eXBl Lgo+ID4gPiA+ID4gPiA+ID4gV2UgcmVzZXJ2ZQo+ID4gPiA+ID4gPiA+ID4gdGhhdCBmb3IgZnV0 dXJlIHBvcnRpbmcgb2YgR0dUVCBiaW5kaW5ncyB0byBUVE0uCj4gPiA+ID4gPiA+ID4gPiAKPiA+ ID4gPiA+ID4gPiA+IFRoZXJlIGFyZSBzb21lIGNoYW5nZXMgdG8gVFRNIHRvIGFsbG93IGZvciBw dXJnaW5nCj4gPiA+ID4gPiA+ID4gPiBzeXN0ZW0KPiA+ID4gPiA+ID4gPiA+IG1lbW9yeQo+ID4g PiA+ID4gPiA+ID4gYnVmZmVyCj4gPiA+ID4gPiA+ID4gPiBvYmplY3RzIGFuZCB0byByZWZ1c2Ug c3dhcHBpbmcgb2Ygc29tZSBvYmplY3RzOgo+ID4gPiA+ID4gPiA+ID4gVW5mb3J0dW5hdGVseSBp OTE1Cj4gPiA+ID4gPiA+ID4gPiBnZW0KPiA+ID4gPiA+ID4gPiA+IHN0aWxsIHJlbGllcyBoZWF2 aWx5IG9uIHNob3J0LXRlcm0gb2JqZWN0IHBpbm5pbmcsIGFuZAo+ID4gPiA+ID4gPiA+ID4gd2Un dmUKPiA+ID4gPiA+ID4gPiA+IGNob3NlbiB0bwo+ID4gPiA+ID4gPiA+ID4ga2VlcCBzaG9ydC10 ZXJtLXBpbm5lZCBidWZmZXIgb2JqZWN0cyBvbiB0aGUgVFRNIExSVQo+ID4gPiA+ID4gPiA+ID4g bGlzdHMKPiA+ID4gPiA+ID4gPiA+IGZvciBub3csCj4gPiA+ID4gPiA+ID4gPiBtZWFuaW5nIHRo YXQgd2UgbmVlZCBzb21lIHNvcnQgb2YgbWVjaGFuaXNtIHRvIHRlbGwgVFRNCj4gPiA+ID4gPiA+ ID4gPiB0aGV5IGFyZSBub3QKPiA+ID4gPiA+ID4gPiA+IHN3YXBwYWJsZS4gQSBsb25nZXIgdGVy bSBnb2FsIGlzIHRvIGdldCByaWQgb2YgdGhlCj4gPiA+ID4gPiA+ID4gPiBzaG9ydC0KPiA+ID4g PiA+ID4gPiA+IHRlcm0KPiA+ID4gPiA+ID4gPiA+IHBpbm5pbmcuCj4gPiA+ID4gPiA+ID4gV2Vs bCBqdXN0IHVzZSB0aGUgZXZpY3Rpb25fdmFsdWFibGUgaW50ZXJmYWNlIGZvciB0aGlzLgo+ID4g PiA+ID4gPiBZZXMsIHdlIGRvIHRoYXQgZm9yIHZyYW0vbG1lbSBldmljdGlvbiwgYnV0IHdlIGhh dmUgbm90aGluZwo+ID4gPiA+ID4gPiBzaW1pbGFyCj4gPiA+ID4gPiA+IGZvciBzeXN0ZW0gc3dh cHBpbmcuIERvIEkgdW5kZXJzdGFuZCB5b3UgY29ycmVjdGx5IHRoYXQgeW91Cj4gPiA+ID4gPiA+ IHdhbnQgbWUKPiA+ID4gPiA+ID4gdG8gYWRkIGEgY2FsbCB0byBldmljdGlvbl92YWx1YWJsZSgp IGFsc28gZm9yIHRoYXQgaW5zdGVhZAo+ID4gPiA+ID4gPiBvZgo+ID4gPiA+ID4gPiBzd2FwX3Bv c3NpYmxlKCk/Cj4gPiA+ID4gPiBZb3Ugc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGF0LiBldmljdGlv bl92YWx1YWJsZSBpcyBjYWxsZWQgaW4KPiA+ID4gPiA+IGJvdGgKPiA+ID4gPiA+IGNhc2VzLgo+ ID4gPiA+ID4gCj4gPiA+ID4gSG1tLiBJIGNhbiBvbmx5IHNlZSBpdCBjYWxsZWQgZnJvbSB0dG1f bWVtX2V2aWN0X2ZpcnN0KCkgd2hpY2gKPiA+ID4gPiBpcwo+ID4gPiA+IG5vdAo+ID4gPiA+IGlu IHRoZSBzd2FwcGluZyBwYXRoPyBPciBkbyBJIG1pc3Mgc29tZXRoaW5nPwo+ID4gPiBNaG0sIGxv b2tzIGxpa2UgbXkgcmVjb2xsZWN0aW9uIHdhcyB3cm9uZy4gV2Ugc2hvdWxkIHByb2JhYmx5Cj4g PiA+IG1vdmUKPiA+ID4gdGhlCj4gPiA+IGNhbGwgaW50byB0aGUgdHRtX2JvX2V2aWN0X3N3YXBv dXRfYWxsb3dhYmxlKCkgZnVuY3Rpb24uCj4gPiBZZXMsIEkgdGhpbmsgd2UgYWxzbyBuZWVkIGEg Y29udmVudGlvbiB3aGV0aGVyIGl0J3MgY2FsbGVkIGRtYV9yZXN2Cj4gPiBsb2NrZWQgb3Igbm90 LCBzaW5jZSB0aGUgaGVscGVyIGFjY2Vzc2VzIGJvLT5tZW0sIHdoaWNoIHNob3VsZAo+ID4gcmVh bGx5Cj4gPiBvbmx5IGJlIGRvbmUgdW5kZXIgcmVzZXJ2YXRpb24uIEF0IHRoZSBzYW1lIHBvaW50 LCB0aGVyZSBpcyB2YWx1ZQo+ID4gaW4KPiA+IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aGlsZSBo b2xkaW5nIHRoZSBMUlUgbG9jay4KPiAKPiBZb3UgYWN0dWFsbHkgbmVlZCB0byBjYWxsIGl0IHdo aWxlIGhvbGRpbmcgdGhlIGxvY2sgYmVjYXVzZSBldmljdGlvbiAKPiBvdGhlcndpc2UgZW5kcyB1 cCBpbiBhbiBlbmRsZXNzIGxvb3AuCj4gCj4gVHJ5aW5nIHRvIGZpeCB0aGF0IGZvciB5ZWFycywg YnV0IHNvIGZhciBubyBsdWNrIHdpdGggdGhhdC4KPiAKPiA+IEFsc28sIEkgd29uZGVyIHdoZXRo ZXIgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2FsbGJhY2sgbWlnaHQKPiA+IGVuY291bnRlcgo+ ID4gdW5leHBlY3RlZCBkYXRhIHdoZW4gY2FsbGVkIGZyb20gdGhlIHN3YXBvdXQgcGF0aCwgYmVj YXVzZSBhdCBsZWFzdAo+ID4gdGhlCj4gPiBoZWxwZXIgYXNzdW1lcyBpdCBub3QgaW4gc3lzdGVt IG1lbW9yeSwgc2luY2UgaXQgaXMgYWNjZXNzaW5nIGJvLQo+ID4gPiBtZW0uc3RhcnQuCj4gPiBT byB1bmxlc3Mgd2UgdXNlIGEgc2VwYXJhdGUgY2FsbGJhY2sgZm9yIHN3YXBvdXQsIHRoZXJlJ3Mg c29tZQo+ID4gYXVkaXRpbmcKPiA+IHRvIGJlIGRvbmUuCj4gCj4gUGxlYXNlIGF1ZGl0IHRoZSBl eGlzdGluZyBjYWxsYmFja3MgYW5kIG1vdmUgdGhlIGNhbGxiYWNrIGludG8gdGhlIAo+IGZ1bmN0 aW9uIGFmdGVyIGRvaW5nIHRoYXQuCj4gCj4gVGhhbmtzLAo+IENocmlzdGlhbi4KCldvdWxkIGl0 IGJlIE9LIGlmIEkgYWxzbyBtb3ZlIHRoZSBrcmVmX2dldF91bmxlc3NfemVybygpIHRvIGJlZm9y ZSAKdHRtX2JvX2V2aWN0X3N3YXBvdXRfYWxsb3dhYmxlKCkgdG8gbWFrZSB0aGUgY29kZSBsZXNz IHNlbnNpdGl2ZSB0bwpzdXJwcmlzZXM/CgovVGhvbWFzCgoKPiAKPiA+IAo+ID4gUGxzIGxldCBt ZSBrbm93IHdoYXQgeW91IHRoaW5rLgo+ID4gVGhhbmtzLAo+ID4gVGhvbWFzCj4gPiAKPiA+IAo+ ID4gCj4gPiA+IENocmlzdGlhbi4KPiA+ID4gCj4gPiA+ID4gVGhhbmtzLAo+ID4gPiA+IAo+ID4g PiA+IFRob21hcwo+ID4gPiA+IAo+ID4gPiA+IAo+ID4gPiA+IAo+ID4gCj4gCgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcg bGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRl c2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==