From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Hoath Subject: Re: [PATCH v2] drm/i915/guc: Clean up locks in GuC Date: Thu, 26 Nov 2015 09:16:07 +0000 Message-ID: <5656CDD7.7000705@intel.com> References: <1448319778-29282-1-git-send-email-yu.dai@intel.com> <1448479759-22734-1-git-send-email-yu.dai@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTP id C99477A135 for ; Thu, 26 Nov 2015 01:16:10 -0800 (PST) In-Reply-To: <1448479759-22734-1-git-send-email-yu.dai@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "Dai, Yu" , "intel-gfx@lists.freedesktop.org" List-Id: intel-gfx@lists.freedesktop.org T24gMjUvMTEvMjAxNSAxOToyOSwgRGFpLCBZdSB3cm90ZToKPiBGcm9tOiBBbGV4IERhaSA8eXUu ZGFpQGludGVsLmNvbT4KPgo+IFdoZW4gR3VDIFdvcmsgUXVldWUgaXMgZnVsbCwgZHJpdmVyIHdp bGwgd2FpdCBHdUMgZm9yIGF2YWxpYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKPiBzcGFjZSBieSBkZWxheWluZyAx bXMuIFRoZSB3YWl0IG5lZWRzIHRvIGJlIG91dCBvZiBzcGlubG9ja2lycSAvCj4gdW5sb2NrLiBP dGhlcndpc2UsIGxvY2t1cCBoYXBwZW5zIGJlY2F1c2UgamlmZmllcyB3b24ndCBiZSB1cGRhdGVk Cj4gZHVyIHRvIGlycSBpcyBkaXNhYmxlZC4gVGhlIHVubmVjZXNzYXJ5IGxvY2tzIGhhcyBiZWVu IGNsZWFyZWQuCiAgIGR1ZSAgICAgICAgYmVpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBoYXZlCj4gZGV2LT5zdHJ1Y3RfbXV0ZXggaXMgdXNlZCBpbnN0ZWFkIHdoZXJlIG5lZWRlZC4K Pgo+IElzc3VlIGlzIGZvdW5kIGluIGlndC9nZW1fY2xvc2VfcmFjZS4KPgo+IHYyOiBDbGVhbiB1 cCB3cV9sb2NrIHRvbwo+IHYxOiBDbGVhbiB1cCBob3N0Mmd1YyBsb2NrIGFzIHdlbGwKPgo+IFNp Z25lZC1vZmYtYnk6IEFsZXggRGFpIDx5dS5kYWlAaW50ZWwuY29tPgo+IC0tLQo+ICAgZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgICAgICAgIHwgMTIgKysrKystLS0tLS0KPiAg IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1pc3Npb24uYyB8IDMyICsrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3Vj LmggICAgICAgICAgIHwgIDQgLS0tLQo+ICAgMyBmaWxlcyBjaGFuZ2VkLCAxMyBpbnNlcnRpb25z KCspLCAzNSBkZWxldGlvbnMoLSkKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2RlYnVnZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCj4g aW5kZXggYTcyOGZmMS4uZDZiNzgxNyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2RlYnVnZnMuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdm cy5jCj4gQEAgLTI0NzMsMTUgKzI0NzMsMTUgQEAgc3RhdGljIGludCBpOTE1X2d1Y19pbmZvKHN0 cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKPiAgIAlpZiAoIUhBU19HVUNfU0NIRUQoZGV2 X3ByaXYtPmRldikpCj4gICAJCXJldHVybiAwOwo+Cj4gKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1 cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCkpCj4gKwkJcmV0dXJuIDA7Cj4gKwo+ICAgCS8qIFRh a2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBHdUMgZGF0YSwgc28gd2UgY2FuIGR1bXAgaXQgYXQgbGVp c3VyZSAqLwo+IC0Jc3Bpbl9sb2NrKCZkZXZfcHJpdi0+Z3VjLmhvc3QyZ3VjX2xvY2spOwo+ICAg CWd1YyA9IGRldl9wcml2LT5ndWM7Cj4gLQlpZiAoZ3VjLmV4ZWNidWZfY2xpZW50KSB7Cj4gLQkJ c3Bpbl9sb2NrKCZndWMuZXhlY2J1Zl9jbGllbnQtPndxX2xvY2spOwo+ICsJaWYgKGd1Yy5leGVj YnVmX2NsaWVudCkKPiAgIAkJY2xpZW50ID0gKmd1Yy5leGVjYnVmX2NsaWVudDsKPiAtCQlzcGlu X3VubG9jaygmZ3VjLmV4ZWNidWZfY2xpZW50LT53cV9sb2NrKTsKPiAtCX0KPiAtCXNwaW5fdW5s b2NrKCZkZXZfcHJpdi0+Z3VjLmhvc3QyZ3VjX2xvY2spOwo+ICsKPiArCW11dGV4X3VubG9jaygm ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwo+Cj4gICAJc2VxX3ByaW50ZihtLCAiR3VDIHRvdGFsIGFjdGlv biBjb3VudDogJWxsdVxuIiwgZ3VjLmFjdGlvbl9jb3VudCk7Cj4gICAJc2VxX3ByaW50ZihtLCAi R3VDIGFjdGlvbiBmYWlsdXJlIGNvdW50OiAldVxuIiwgZ3VjLmFjdGlvbl9mYWlsKTsKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ndWNfc3VibWlzc2lvbi5jIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ndWNfc3VibWlzc2lvbi5jCj4gaW5kZXggZWQ5ZjEwMC4u OTc5OTZlNSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJt aXNzaW9uLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9u LmMKPiBAQCAtODYsNyArODYsNiBAQCBzdGF0aWMgaW50IGhvc3QyZ3VjX2FjdGlvbihzdHJ1Y3Qg aW50ZWxfZ3VjICpndWMsIHUzMiAqZGF0YSwgdTMyIGxlbikKPiAgIAkJcmV0dXJuIC1FSU5WQUw7 Cj4KPiAgIAlpbnRlbF91bmNvcmVfZm9yY2V3YWtlX2dldChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FM TCk7Cj4gLQlzcGluX2xvY2soJmRldl9wcml2LT5ndWMuaG9zdDJndWNfbG9jayk7Cj4KPiAgIAlk ZXZfcHJpdi0+Z3VjLmFjdGlvbl9jb3VudCArPSAxOwo+ICAgCWRldl9wcml2LT5ndWMuYWN0aW9u X2NtZCA9IGRhdGFbMF07Cj4gQEAgLTExOSw3ICsxMTgsNiBAQCBzdGF0aWMgaW50IGhvc3QyZ3Vj X2FjdGlvbihzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHUzMiAqZGF0YSwgdTMyIGxlbikKPiAgIAl9 Cj4gICAJZGV2X3ByaXYtPmd1Yy5hY3Rpb25fc3RhdHVzID0gc3RhdHVzOwo+Cj4gLQlzcGluX3Vu bG9jaygmZGV2X3ByaXYtPmd1Yy5ob3N0Mmd1Y19sb2NrKTsKPiAgIAlpbnRlbF91bmNvcmVfZm9y Y2V3YWtlX3B1dChkZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7Cj4KPiAgIAlyZXR1cm4gcmV0Owo+ IEBAIC0yNDksNiArMjQ3LDcgQEAgc3RhdGljIGludCBndWNfcmluZ19kb29yYmVsbChzdHJ1Y3Qg aTkxNV9ndWNfY2xpZW50ICpnYykKPiAgIAl9Cj4KPiAgIAlrdW5tYXBfYXRvbWljKGJhc2UpOwo+ ICsKVW5uZWNlc3Nhcnkgd2hpdGVzcGFjZSBjaHVybgo+ICAgCXJldHVybiByZXQ7Cj4gICB9Cj4K PiBAQCAtMjkyLDE2ICsyOTEsMTIgQEAgc3RhdGljIHVpbnQzMl90IHNlbGVjdF9kb29yYmVsbF9j YWNoZWxpbmUoc3RydWN0IGludGVsX2d1YyAqZ3VjKQo+ICAgCWNvbnN0IHVpbnQzMl90IGNhY2hl bGluZV9zaXplID0gY2FjaGVfbGluZV9zaXplKCk7Cj4gICAJdWludDMyX3Qgb2Zmc2V0Owo+Cj4g LQlzcGluX2xvY2soJmd1Yy0+aG9zdDJndWNfbG9jayk7Cj4gLQo+ICAgCS8qIERvb3JiZWxsIHVz ZXMgYSBzaW5nbGUgY2FjaGUgbGluZSB3aXRoaW4gYSBwYWdlICovCj4gICAJb2Zmc2V0ID0gb2Zm c2V0X2luX3BhZ2UoZ3VjLT5kYl9jYWNoZWxpbmUpOwo+Cj4gICAJLyogTW92aW5nIHRvIG5leHQg Y2FjaGUgbGluZSB0byByZWR1Y2UgY29udGVudGlvbiAqLwo+ICAgCWd1Yy0+ZGJfY2FjaGVsaW5l ICs9IGNhY2hlbGluZV9zaXplOwo+Cj4gLQlzcGluX3VubG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2Nr KTsKPiAtCj4gICAJRFJNX0RFQlVHX0RSSVZFUigic2VsZWN0ZWQgZG9vcmJlbGwgY2FjaGVsaW5l IDB4JXgsIG5leHQgMHgleCwgbGluZXNpemUgJXVcbiIsCj4gICAJCQlvZmZzZXQsIGd1Yy0+ZGJf Y2FjaGVsaW5lLCBjYWNoZWxpbmVfc2l6ZSk7Cj4KPiBAQCAtMzIyLDEzICszMTcsMTEgQEAgc3Rh dGljIHVpbnQxNl90IGFzc2lnbl9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHVpbnQz Ml90IHByaW9yaXR5KQo+ICAgCWNvbnN0IHVpbnQxNl90IGVuZCA9IHN0YXJ0ICsgaGFsZjsKPiAg IAl1aW50MTZfdCBpZDsKPgo+IC0Jc3Bpbl9sb2NrKCZndWMtPmhvc3QyZ3VjX2xvY2spOwo+ICAg CWlkID0gZmluZF9uZXh0X3plcm9fYml0KGd1Yy0+ZG9vcmJlbGxfYml0bWFwLCBlbmQsIHN0YXJ0 KTsKPiAgIAlpZiAoaWQgPT0gZW5kKQo+ICAgCQlpZCA9IEdVQ19JTlZBTElEX0RPT1JCRUxMX0lE Owo+ICAgCWVsc2UKPiAgIAkJYml0bWFwX3NldChndWMtPmRvb3JiZWxsX2JpdG1hcCwgaWQsIDEp Owo+IC0Jc3Bpbl91bmxvY2soJmd1Yy0+aG9zdDJndWNfbG9jayk7Cj4KPiAgIAlEUk1fREVCVUdf RFJJVkVSKCJhc3NpZ25lZCAlcyBwcmlvcml0eSBkb29yYmVsbCBpZCAweCV4XG4iLAo+ICAgCQkJ aGlfcHJpID8gImhpZ2giIDogIm5vcm1hbCIsIGlkKTsKPiBAQCAtMzM4LDkgKzMzMSw3IEBAIHN0 YXRpYyB1aW50MTZfdCBhc3NpZ25fZG9vcmJlbGwoc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1aW50 MzJfdCBwcmlvcml0eSkKPgo+ICAgc3RhdGljIHZvaWQgcmVsZWFzZV9kb29yYmVsbChzdHJ1Y3Qg aW50ZWxfZ3VjICpndWMsIHVpbnQxNl90IGlkKQo+ICAgewo+IC0Jc3Bpbl9sb2NrKCZndWMtPmhv c3QyZ3VjX2xvY2spOwo+ICAgCWJpdG1hcF9jbGVhcihndWMtPmRvb3JiZWxsX2JpdG1hcCwgaWQs IDEpOwo+IC0Jc3Bpbl91bmxvY2soJmd1Yy0+aG9zdDJndWNfbG9jayk7Cj4gICB9Cj4KPiAgIC8q Cj4gQEAgLTQ4NywxNiArNDc4LDEzIEBAIHN0YXRpYyBpbnQgZ3VjX2dldF93b3JrcXVldWVfc3Bh Y2Uoc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqZ2MsIHUzMiAqb2Zmc2V0KQo+ICAgCXN0cnVjdCBn dWNfcHJvY2Vzc19kZXNjICpkZXNjOwo+ICAgCXZvaWQgKmJhc2U7Cj4gICAJdTMyIHNpemUgPSBz aXplb2Yoc3RydWN0IGd1Y193cV9pdGVtKTsKPiAtCWludCByZXQgPSAwLCB0aW1lb3V0X2NvdW50 ZXIgPSAyMDA7Cj4gKwlpbnQgcmV0ID0gLUVUSU1FRE9VVCwgdGltZW91dF9jb3VudGVyID0gMjAw Owo+Cj4gICAJYmFzZSA9IGttYXBfYXRvbWljKGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShnYy0+ Y2xpZW50X29iaiwgMCkpOwo+ICAgCWRlc2MgPSBiYXNlICsgZ2MtPnByb2NfZGVzY19vZmZzZXQ7 Cj4KPiAgIAl3aGlsZSAodGltZW91dF9jb3VudGVyLS0gPiAwKSB7Cj4gLQkJcmV0ID0gd2FpdF9m b3JfYXRvbWljKENJUkNfU1BBQ0UoZ2MtPndxX3RhaWwsIGRlc2MtPmhlYWQsCj4gLQkJCQlnYy0+ d3Ffc2l6ZSkgPj0gc2l6ZSwgMSk7Cj4gLQo+IC0JCWlmICghcmV0KSB7Cj4gKwkJaWYgKENJUkNf U1BBQ0UoZ2MtPndxX3RhaWwsIGRlc2MtPmhlYWQsIGdjLT53cV9zaXplKSA+PSBzaXplKSB7Cj4g ICAJCQkqb2Zmc2V0ID0gZ2MtPndxX3RhaWw7Cj4KPiAgIAkJCS8qIGFkdmFuY2UgdGhlIHRhaWwg Zm9yIG5leHQgd29ya3F1ZXVlIGl0ZW0gKi8KPiBAQCAtNTA1LDcgKzQ5MywxMSBAQCBzdGF0aWMg aW50IGd1Y19nZXRfd29ya3F1ZXVlX3NwYWNlKHN0cnVjdCBpOTE1X2d1Y19jbGllbnQgKmdjLCB1 MzIgKm9mZnNldCkKPgo+ICAgCQkJLyogdGhpcyB3aWxsIGJyZWFrIHRoZSBsb29wICovCj4gICAJ CQl0aW1lb3V0X2NvdW50ZXIgPSAwOwo+ICsJCQlyZXQgPSAwOwo+ICAgCQl9Cj4gKwo+ICsJCWlm ICh0aW1lb3V0X2NvdW50ZXIpCj4gKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKPiAgIAl9 Owo+Cj4gICAJa3VubWFwX2F0b21pYyhiYXNlKTsKPiBAQCAtNTk3LDE1ICs1ODksMTIgQEAgaW50 IGk5MTVfZ3VjX3N1Ym1pdChzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQsCj4gICB7Cj4g ICAJc3RydWN0IGludGVsX2d1YyAqZ3VjID0gY2xpZW50LT5ndWM7Cj4gICAJZW51bSBpbnRlbF9y aW5nX2lkIHJpbmdfaWQgPSBycS0+cmluZy0+aWQ7Cj4gLQl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ ICAgCWludCBxX3JldCwgYl9yZXQ7Cj4KPiAgIAkvKiBOZWVkIHRoaXMgYmVjYXVzZSBvZiB0aGUg ZGVmZXJyZWQgcGluIGN0eCBhbmQgcmluZyAqLwo+ICAgCS8qIFNoYWxsIHdlIG1vdmUgdGhpcyBy aWdodCBhZnRlciByaW5nIGlzIHBpbm5lZD8gKi8KPiAgIAlscl9jb250ZXh0X3VwZGF0ZShycSk7 Cj4KPiAtCXNwaW5fbG9ja19pcnFzYXZlKCZjbGllbnQtPndxX2xvY2ssIGZsYWdzKTsKPiAtCj4g ICAJcV9yZXQgPSBndWNfYWRkX3dvcmtxdWV1ZV9pdGVtKGNsaWVudCwgcnEpOwo+ICAgCWlmIChx X3JldCA9PSAwKQo+ICAgCQliX3JldCA9IGd1Y19yaW5nX2Rvb3JiZWxsKGNsaWVudCk7Cj4gQEAg LTYyMCwxMiArNjA5LDggQEAgaW50IGk5MTVfZ3VjX3N1Ym1pdChzdHJ1Y3QgaTkxNV9ndWNfY2xp ZW50ICpjbGllbnQsCj4gICAJfSBlbHNlIHsKPiAgIAkJY2xpZW50LT5yZXRjb2RlID0gMDsKPiAg IAl9Cj4gLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPndxX2xvY2ssIGZsYWdzKTsK PiAtCj4gLQlzcGluX2xvY2soJmd1Yy0+aG9zdDJndWNfbG9jayk7Cj4gICAJZ3VjLT5zdWJtaXNz aW9uc1tyaW5nX2lkXSArPSAxOwo+ICAgCWd1Yy0+bGFzdF9zZXFub1tyaW5nX2lkXSA9IHJxLT5z ZXFubzsKPiAtCXNwaW5fdW5sb2NrKCZndWMtPmhvc3QyZ3VjX2xvY2spOwo+Cj4gICAJcmV0dXJu IHFfcmV0Owo+ICAgfQo+IEBAIC03NjgsNyArNzUzLDYgQEAgc3RhdGljIHN0cnVjdCBpOTE1X2d1 Y19jbGllbnQgKmd1Y19jbGllbnRfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPiAgIAlj bGllbnQtPmNsaWVudF9vYmogPSBvYmo7Cj4gICAJY2xpZW50LT53cV9vZmZzZXQgPSBHVUNfREJf U0laRTsKPiAgIAljbGllbnQtPndxX3NpemUgPSBHVUNfV1FfU0laRTsKPiAtCXNwaW5fbG9ja19p bml0KCZjbGllbnQtPndxX2xvY2spOwo+Cj4gICAJY2xpZW50LT5kb29yYmVsbF9vZmZzZXQgPSBz ZWxlY3RfZG9vcmJlbGxfY2FjaGVsaW5lKGd1Yyk7Cj4KPiBAQCAtODcxLDggKzg1NSw2IEBAIGlu dCBpOTE1X2d1Y19zdWJtaXNzaW9uX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKPiAgIAlp ZiAoIWd1Yy0+Y3R4X3Bvb2xfb2JqKQo+ICAgCQlyZXR1cm4gLUVOT01FTTsKPgo+IC0Jc3Bpbl9s b2NrX2luaXQoJmRldl9wcml2LT5ndWMuaG9zdDJndWNfbG9jayk7Cj4gLQo+ICAgCWlkYV9pbml0 KCZndWMtPmN0eF9pZHMpOwo+Cj4gICAJZ3VjX2NyZWF0ZV9sb2coZ3VjKTsKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9ndWMuaAo+IGluZGV4IDViYTU4NjYuLjgyMjk1MjIgMTAwNjQ0Cj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9ndWMuaAo+IEBAIC00Miw4ICs0Miw2IEBAIHN0cnVjdCBpOTE1X2d1Y19jbGllbnQg ewo+Cj4gICAJdWludDMyX3Qgd3Ffb2Zmc2V0Owo+ICAgCXVpbnQzMl90IHdxX3NpemU7Cj4gLQo+ IC0Jc3BpbmxvY2tfdCB3cV9sb2NrOwkJLyogUHJvdGVjdHMgYWxsIGRhdGEgYmVsb3cJKi8KPiAg IAl1aW50MzJfdCB3cV90YWlsOwo+Cj4gICAJLyogR3VDIHN1Ym1pc3Npb24gc3RhdGlzdGljcyAm IHN0YXR1cyAqLwo+IEBAIC05NSw4ICs5Myw2IEBAIHN0cnVjdCBpbnRlbF9ndWMgewo+Cj4gICAJ c3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqZXhlY2J1Zl9jbGllbnQ7Cj4KPiAtCXNwaW5sb2NrX3Qg aG9zdDJndWNfbG9jazsJLyogUHJvdGVjdHMgYWxsIGRhdGEgYmVsb3cJKi8KPiAtCj4gICAJREVD TEFSRV9CSVRNQVAoZG9vcmJlbGxfYml0bWFwLCBHVUNfTUFYX0RPT1JCRUxMUyk7Cj4gICAJdWlu dDMyX3QgZGJfY2FjaGVsaW5lOwkJLyogQ3ljbGljIGNvdW50ZXIgbW9kIHBhZ2VzaXplCSovCj4K PgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwt Z2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK