From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thierry Reding Subject: [PATCH v4 06/11] drm/fb-helper: Make top-level lock more robust Date: Wed, 29 Mar 2017 16:43:56 +0200 Message-ID: <20170329144401.1804-7-thierry.reding@gmail.com> References: <20170329144401.1804-1-thierry.reding@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170329144401.1804-1-thierry.reding@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Daniel Vetter Cc: John Stultz , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4KClRoZSBleGlzdGluZyBk cm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQoKSBmdW5jdGlvbiBuZWVkcyB0byB0YWtlIHRoZQp0 b3AtbGV2ZWwgZmItaGVscGVyIGxvY2suIEhvd2V2ZXIsIHRoZSBmdW5jdGlvbiBjYW4gYWxzbyBi ZSBjYWxsZWQgZnJvbQpjb2RlIHRoYXQgaGFzIGFscmVhZHkgdGFrZW4gdGhpcyBsb2NrLiBJbnRy b2R1Y2UgYW4gdW5sb2NrZWQgdmFyaWFudCBvZgp0aGlzIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVz ZWQgaW4gdGhlIGxhdHRlciBjYXNlLgoKVGhpcyBmdW5jdGlvbiBjYWxscyBkcm1fZmJfaGVscGVy X3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCgpLCB2aWEKZHJtX2ZiX2hlbHBlcl9zZXRfcGFy KCksIHNvIHdlIGFsc28gbmVlZCB0byBpbnRyb2R1Y2UgYW4gdW5sb2NrZWQgY29weQpvZiB0aGF0 IHRvIGF2b2lkIHJlY3Vyc2l2ZSBsb2NraW5nIGlzc3Vlcy4KClNpbWlsYXJseSwgdGhlIGRybV9m Yl9oZWxwZXJfaW5pdGlhbF9jb25maWcoKSBmdW5jdGlvbiBlbmRzIHVwIGNhbGxpbmcKZHJtX2Zi X2hlbHBlcl9zZXRfcGFyKCksIHZpYSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcigpLCBhbmQgbmVlZHMg YW4KdW5sb2NrZWQgdmFyaWFudCB0byBhdm9pZCByZWN1cnNpdmUgbG9ja2luZy4KClNpZ25lZC1v ZmYtYnk6IFRoaWVycnkgUmVkaW5nIDx0cmVkaW5nQG52aWRpYS5jb20+Ci0tLQogZHJpdmVycy9n cHUvZHJtL2RybV9mYl9oZWxwZXIuYyB8IDE2NyArKysrKysrKysrKysrKysrKysrKysrKysrLS0t LS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTA0IGluc2VydGlvbnMoKyksIDYzIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgYi9k cml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCmluZGV4IDg2MGJlNTFkOTJmNi4uMjFhOTAz MjI1MzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKQEAgLTQ5MSwxOCArNDkxLDEwIEBAIHN0 YXRpYyBpbnQgcmVzdG9yZV9mYmRldl9tb2RlKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxw ZXIpCiAJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2 X21vZGVfdW5sb2NrZWQgLSByZXN0b3JlIGZiZGV2IGNvbmZpZ3VyYXRpb24KLSAqIEBmYl9oZWxw ZXI6IGZiY29uIHRvIHJlc3RvcmUKLSAqCi0gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBk cml2ZXIncyBkcm0gJmRybV9kcml2ZXIubGFzdGNsb3NlIGNhbGxiYWNrCi0gKiB3aGVuIGltcGxl bWVudGluZyBhbiBmYmNvbiBvbiB0b3Agb2Yga21zIHVzaW5nIHRoaXMgaGVscGVyLiBUaGlzIGVu c3VyZXMgdGhhdAotICogdGhlIHVzZXIgaXNuJ3QgZ3JlZXRlZCB3aXRoIGEgYmxhY2sgc2NyZWVu IHdoZW4gZS5nLiBYIGRpZXMuCi0gKgotICogUkVUVVJOUzoKLSAqIFplcm8gaWYgZXZlcnl0aGlu ZyB3ZW50IG9rLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAqLwotaW50IGRybV9m Yl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKHN0cnVjdCBkcm1fZmJfaGVscGVy ICpmYl9oZWxwZXIpCitzdGF0aWMgaW50IF9fZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KHN0 cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpOworCitzdGF0aWMgaW50CitfX2RybV9mYl9o ZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKHN0cnVjdCBkcm1fZmJfaGVscGVyICpm Yl9oZWxwZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGZiX2hlbHBlci0+ZGV2Owog CWJvb2wgZG9fZGVsYXllZDsKQEAgLTUxMSw3ICs1MDMsOCBAQCBpbnQgZHJtX2ZiX2hlbHBlcl9y ZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBl cikKIAlpZiAoIWRybV9mYmRldl9lbXVsYXRpb24pCiAJCXJldHVybiAtRU5PREVWOwogCi0JbXV0 ZXhfbG9jaygmZmJfaGVscGVyLT5sb2NrKTsKKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmZi X2hlbHBlci0+bG9jaykpOworCiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKIAogCXJldCA9 IHJlc3RvcmVfZmJkZXZfbW9kZShmYl9oZWxwZXIpOwpAQCAtNTIxLDEwICs1MTQsMzEgQEAgaW50 IGRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKHN0cnVjdCBkcm1fZmJf aGVscGVyICpmYl9oZWxwZXIpCiAJCWZiX2hlbHBlci0+ZGVsYXllZF9ob3RwbHVnID0gZmFsc2U7 CiAKIAlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7Ci0JbXV0ZXhfdW5sb2NrKCZmYl9oZWxw ZXItPmxvY2spOwogCiAJaWYgKGRvX2RlbGF5ZWQpCi0JCWRybV9mYl9oZWxwZXJfaG90cGx1Z19l dmVudChmYl9oZWxwZXIpOworCQlfX2RybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudChmYl9oZWxw ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkcm1fZmJfaGVscGVyX3Jlc3RvcmVf ZmJkZXZfbW9kZV91bmxvY2tlZCAtIHJlc3RvcmUgZmJkZXYgY29uZmlndXJhdGlvbgorICogQGZi X2hlbHBlcjogZmJjb24gdG8gcmVzdG9yZQorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBm cm9tIGRyaXZlcidzIGRybSAmZHJtX2RyaXZlci5sYXN0Y2xvc2UgY2FsbGJhY2sKKyAqIHdoZW4g aW1wbGVtZW50aW5nIGFuIGZiY29uIG9uIHRvcCBvZiBrbXMgdXNpbmcgdGhpcyBoZWxwZXIuIFRo aXMgZW5zdXJlcyB0aGF0CisgKiB0aGUgdXNlciBpc24ndCBncmVldGVkIHdpdGggYSBibGFjayBz Y3JlZW4gd2hlbiBlLmcuIFggZGllcy4KKyAqCisgKiBSRVRVUk5TOgorICogWmVybyBpZiBldmVy eXRoaW5nIHdlbnQgb2ssIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQg ZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQoc3RydWN0IGRybV9mYl9o ZWxwZXIgKmZiX2hlbHBlcikKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZmJfaGVscGVy LT5sb2NrKTsKKwlyZXQgPSBfX2RybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9j a2VkKGZiX2hlbHBlcik7CisJbXV0ZXhfdW5sb2NrKCZmYl9oZWxwZXItPmxvY2spOwogCiAJcmV0 dXJuIHJldDsKIH0KQEAgLTE0ODYsNyArMTUwMCw3IEBAIGludCBkcm1fZmJfaGVscGVyX3NldF9w YXIoc3RydWN0IGZiX2luZm8gKmluZm8pCiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRybV9m Yl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKGZiX2hlbHBlcik7CisJX19kcm1f ZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZChmYl9oZWxwZXIpOwogCiAJcmV0 dXJuIDA7CiB9CkBAIC0yMzMzLDYgKzIzNDcsNDYgQEAgc3RhdGljIHZvaWQgZHJtX3NldHVwX2Ny dGNzKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAJa2ZyZWUoZW5hYmxlZCk7CiB9 CiAKK3N0YXRpYyBpbnQgX19kcm1fZmJfaGVscGVyX2luaXRpYWxfY29uZmlnKHN0cnVjdCBkcm1f ZmJfaGVscGVyICpmYl9oZWxwZXIsCisJCQkJCSAgaW50IGJwcF9zZWwpCit7CisJc3RydWN0IGRy bV9kZXZpY2UgKmRldiA9IGZiX2hlbHBlci0+ZGV2OworCXN0cnVjdCBmYl9pbmZvICppbmZvOwor CWludCByZXQ7CisKKwlpZiAoIWRybV9mYmRldl9lbXVsYXRpb24pCisJCXJldHVybiAwOworCisJ V0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZmYl9oZWxwZXItPmxvY2spKTsKKworCW11dGV4X2xv Y2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWRybV9zZXR1cF9jcnRjcyhmYl9oZWxwZXIs CisJCQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCwKKwkJCWRldi0+bW9kZV9jb25maWcubWF4 X2hlaWdodCk7CisJcmV0ID0gZHJtX2ZiX2hlbHBlcl9zaW5nbGVfZmJfcHJvYmUoZmJfaGVscGVy LCBicHBfc2VsKTsKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbmZvID0gZmJfaGVscGVyLT5mYmRldjsKKwlpbmZv LT52YXIucGl4Y2xvY2sgPSAwOworCXJldCA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwor CWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGV2X2luZm8oZGV2LT5kZXYsICJmYiVk OiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLAorCQkgaW5mby0+bm9kZSwgaW5mby0+Zml4Lmlk KTsKKworCW11dGV4X2xvY2soJmtlcm5lbF9mYl9oZWxwZXJfbG9jayk7CisJaWYgKGxpc3RfZW1w dHkoJmtlcm5lbF9mYl9oZWxwZXJfbGlzdCkpCisJCXJlZ2lzdGVyX3N5c3JxX2tleSgndicsICZz eXNycV9kcm1fZmJfaGVscGVyX3Jlc3RvcmVfb3ApOworCisJbGlzdF9hZGQoJmZiX2hlbHBlci0+ a2VybmVsX2ZiX2xpc3QsICZrZXJuZWxfZmJfaGVscGVyX2xpc3QpOworCW11dGV4X3VubG9jaygm a2VybmVsX2ZiX2hlbHBlcl9sb2NrKTsKKworCXJldHVybiAwOworfQorCiAvKioKICAqIGRybV9m Yl9oZWxwZXJfaW5pdGlhbF9jb25maWcgLSBzZXR1cCBhIHNhbmUgaW5pdGlhbCBjb25uZWN0b3Ig Y29uZmlndXJhdGlvbgogICogQGZiX2hlbHBlcjogZmJfaGVscGVyIGRldmljZSBzdHJ1Y3QKQEAg LTIzNzcsNDEgKzI0MzEsNTAgQEAgc3RhdGljIHZvaWQgZHJtX3NldHVwX2NydGNzKHN0cnVjdCBk cm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAgKi8KIGludCBkcm1fZmJfaGVscGVyX2luaXRpYWxf Y29uZmlnKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsIGludCBicHBfc2VsKQogewot CXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmYl9oZWxwZXItPmRldjsKLQlzdHJ1Y3QgZmJfaW5m byAqaW5mbzsKIAlpbnQgcmV0OwogCisJbXV0ZXhfbG9jaygmZmJfaGVscGVyLT5sb2NrKTsKKwly ZXQgPSBfX2RybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoZmJfaGVscGVyLCBicHBfc2VsKTsK KwltdXRleF91bmxvY2soJmZiX2hlbHBlci0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQ T1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX2luaXRpYWxfY29uZmlnKTsKKworc3RhdGljIGludCBf X2RybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudChzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVs cGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmYl9oZWxwZXItPmRldjsKKwl1bnNp Z25lZCBpbnQgd2lkdGgsIGhlaWdodDsKKwogCWlmICghZHJtX2ZiZGV2X2VtdWxhdGlvbikKIAkJ cmV0dXJuIDA7CiAKKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmZiX2hlbHBlci0+bG9jaykp OworCiAJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Ci0JZHJtX3NldHVwX2Ny dGNzKGZiX2hlbHBlciwKLQkJCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoLAotCQkJZGV2LT5t b2RlX2NvbmZpZy5tYXhfaGVpZ2h0KTsKLQlyZXQgPSBkcm1fZmJfaGVscGVyX3NpbmdsZV9mYl9w cm9iZShmYl9oZWxwZXIsIGJwcF9zZWwpOwotCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZp Zy5tdXRleCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKIAotCWluZm8gPSBmYl9oZWxwZXIt PmZiZGV2OwotCWluZm8tPnZhci5waXhjbG9jayA9IDA7Ci0JcmV0ID0gcmVnaXN0ZXJfZnJhbWVi dWZmZXIoaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJaWYgKCFmYl9oZWxw ZXItPmZiIHx8ICFkcm1fZmJfaGVscGVyX2lzX2JvdW5kKGZiX2hlbHBlcikpIHsKKwkJZmJfaGVs cGVyLT5kZWxheWVkX2hvdHBsdWcgPSB0cnVlOworCQltdXRleF91bmxvY2soJmRldi0+bW9kZV9j b25maWcubXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CiAKLQlkZXZfaW5mbyhkZXYtPmRldiwgImZi JWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCi0JCSBpbmZvLT5ub2RlLCBpbmZvLT5maXgu aWQpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAKLQltdXRleF9sb2NrKCZrZXJuZWxfZmJfaGVs cGVyX2xvY2spOwotCWlmIChsaXN0X2VtcHR5KCZrZXJuZWxfZmJfaGVscGVyX2xpc3QpKQotCQly ZWdpc3Rlcl9zeXNycV9rZXkoJ3YnLCAmc3lzcnFfZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX29wKTsK Kwl3aWR0aCA9IGRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoOworCWhlaWdodCA9IGRldi0+bW9k ZV9jb25maWcubWF4X2hlaWdodDsKIAotCWxpc3RfYWRkKCZmYl9oZWxwZXItPmtlcm5lbF9mYl9s aXN0LCAma2VybmVsX2ZiX2hlbHBlcl9saXN0KTsKLQltdXRleF91bmxvY2soJmtlcm5lbF9mYl9o ZWxwZXJfbG9jayk7CisJaWYgKGRybV9mYl9oZWxwZXJfcHJvYmVfY29ubmVjdG9yX21vZGVzKGZi X2hlbHBlciwgd2lkdGgsIGhlaWdodCkgPT0gMCkKKwkJRFJNX0RFQlVHX0tNUygiTm8gY29ubmVj dG9ycyByZXBvcnRlZCBjb25uZWN0ZWQgd2l0aCBtb2Rlc1xuIik7CisKKwlkcm1fc2V0dXBfY3J0 Y3MoZmJfaGVscGVyLCBmYl9oZWxwZXItPmZiLT53aWR0aCwgZmJfaGVscGVyLT5mYi0+aGVpZ2h0 KTsKKworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwlkcm1fZmJf aGVscGVyX3NldF9wYXIoZmJfaGVscGVyLT5mYmRldik7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9S VF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9pbml0aWFsX2NvbmZpZyk7CiAKIC8qKgogICogZHJtX2Zi X2hlbHBlcl9ob3RwbHVnX2V2ZW50IC0gcmVzcG9uZCB0byBhIGhvdHBsdWcgbm90aWZpY2F0aW9u IGJ5CkBAIC0yNDM2LDM1ICsyNDk5LDEzIEBAIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9p bml0aWFsX2NvbmZpZyk7CiAgKi8KIGludCBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQoc3Ry dWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 ID0gZmJfaGVscGVyLT5kZXY7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoIWRybV9mYmRldl9lbXVs YXRpb24pCi0JCXJldHVybiAwOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZmYl9oZWxwZXIt PmxvY2spOwotCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwotCi0JaWYgKCFm Yl9oZWxwZXItPmZiIHx8ICFkcm1fZmJfaGVscGVyX2lzX2JvdW5kKGZiX2hlbHBlcikpIHsKLQkJ ZmJfaGVscGVyLT5kZWxheWVkX2hvdHBsdWcgPSB0cnVlOwotCQltdXRleF91bmxvY2soJmRldi0+ bW9kZV9jb25maWcubXV0ZXgpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlEUk1fREVCVUdfS01T KCJcbiIpOwotCi0JZHJtX3NldHVwX2NydGNzKGZiX2hlbHBlciwgZmJfaGVscGVyLT5mYi0+d2lk dGgsIGZiX2hlbHBlci0+ZmItPmhlaWdodCk7Ci0KLQltdXRleF91bmxvY2soJmRldi0+bW9kZV9j b25maWcubXV0ZXgpOworCXJldCA9IF9fZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KGZiX2hl bHBlcik7CiAJbXV0ZXhfdW5sb2NrKCZmYl9oZWxwZXItPmxvY2spOwogCi0JZHJtX2ZiX2hlbHBl cl9zZXRfcGFyKGZiX2hlbHBlci0+ZmJkZXYpOwotCi0JcmV0dXJuIDA7Ci0KLXVubG9jazoKLQlt dXRleF91bmxvY2soJmZiX2hlbHBlci0+bG9jayk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcmV0 OwogfQogRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQpOwogCi0tIAoy LjEyLjAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCklu dGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=