From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: [PATCH v3 3/8] xen: delay allocation of grant table sub structures Date: Wed, 6 Sep 2017 14:46:48 +0200 Message-ID: <20170906124653.5408-4-jgross@suse.com> References: <20170906124653.5408-1-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170906124653.5408-1-jgross@suse.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xen.org Cc: Juergen Gross , sstabellini@kernel.org, wei.liu2@citrix.com, George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, tim@xen.org, julien.grall@arm.com, jbeulich@suse.com List-Id: xen-devel@lists.xenproject.org RGVsYXkgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGdyYW50IHRhYmxlIHN1YiBzdHJ1Y3R1cmVzIGlu IG9yZGVyIHRvCmFsbG93IG1vZGlmeWluZyBwYXJhbWV0ZXJzIG5lZWRlZCBmb3Igc2l6aW5nIG9m IHRoZXNlIHN0cnVjdHVyZXMgYXQgYQpwZXIgZG9tYWluIGJhc2lzLiBFaXRoZXIgZG8gaXQgZnJv bSBnbnR0YWJfc2V0dXBfdGFibGUoKSBvciBqdXN0CmJlZm9yZSB0aGUgZG9tYWluIGlzIHN0YXJ0 ZWQgdGhlIGZpcnN0IHRpbWUuCgpTaWduZWQtb2ZmLWJ5OiBKdWVyZ2VuIEdyb3NzIDxqZ3Jvc3NA c3VzZS5jb20+Ci0tLQpWMzoKLSBtb3ZlIGNhbGwgb2YgZ3JhbnRfdGFibGVfaW5pdCgpIGZyb20g Z250dGFiX3NldHVwX3RhYmxlKCkgdG8KICBnbnR0YWJfZ3Jvd190YWJsZSgpIChQYXVsIER1cnJh bnQpCi0tLQogeGVuL2NvbW1vbi9kb21haW4uYyAgICAgICAgICAgfCAgMTcgKysrKystCiB4ZW4v Y29tbW9uL2dyYW50X3RhYmxlLmMgICAgICB8IDEzOCArKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0KIHhlbi9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oIHwgICAyICsK IDMgZmlsZXMgY2hhbmdlZCwgOTYgaW5zZXJ0aW9ucygrKSwgNjEgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEveGVuL2NvbW1vbi9kb21haW4uYyBiL3hlbi9jb21tb24vZG9tYWluLmMKaW5kZXgg NWFlYmNmMjY1Zi4uMTFlYjE3NzhhMyAxMDA2NDQKLS0tIGEveGVuL2NvbW1vbi9kb21haW4uYwor KysgYi94ZW4vY29tbW9uL2RvbWFpbi5jCkBAIC0zNjMsNiArMzYzLDkgQEAgc3RydWN0IGRvbWFp biAqZG9tYWluX2NyZWF0ZShkb21pZF90IGRvbWlkLCB1bnNpZ25lZCBpbnQgZG9tY3JfZmxhZ3Ms CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIGluaXRfc3RhdHVzIHw9IElOSVRfZ250 dGFiOwogCisgICAgICAgIGlmICggZG9taWQgPT0gMCAmJiBncmFudF90YWJsZV9pbml0KGQpICkK KyAgICAgICAgICAgIGdvdG8gZmFpbDsKKwogICAgICAgICBwb29saWQgPSAwOwogCiAgICAgICAg IGVyciA9IC1FTk9NRU07CkBAIC05OTgsNyArMTAwMSw4IEBAIGludCBfX2RvbWFpbl9wYXVzZV9i eV9zeXN0ZW1jb250cm9sbGVyKHN0cnVjdCBkb21haW4gKmQsCiAgICAgICAgIHByZXYgPSBjbXB4 Y2hnKCZkLT5jb250cm9sbGVyX3BhdXNlX2NvdW50LCBvbGQsIG5ldyk7CiAgICAgfSB3aGlsZSAo IHByZXYgIT0gb2xkICk7CiAKLSAgICBwYXVzZV9mbihkKTsKKyAgICBpZiAoIHBhdXNlX2ZuICkK KyAgICAgICAgcGF1c2VfZm4oZCk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTEwMDYsNiArMTAx MCw3IEBAIGludCBfX2RvbWFpbl9wYXVzZV9ieV9zeXN0ZW1jb250cm9sbGVyKHN0cnVjdCBkb21h aW4gKmQsCiBpbnQgZG9tYWluX3VucGF1c2VfYnlfc3lzdGVtY29udHJvbGxlcihzdHJ1Y3QgZG9t YWluICpkKQogewogICAgIGludCBvbGQsIG5ldywgcHJldiA9IGQtPmNvbnRyb2xsZXJfcGF1c2Vf Y291bnQ7CisgICAgaW50IHJldDsKIAogICAgIGRvCiAgICAgewpAQCAtMTAyOSw4ICsxMDM0LDE2 IEBAIGludCBkb21haW5fdW5wYXVzZV9ieV9zeXN0ZW1jb250cm9sbGVyKHN0cnVjdCBkb21haW4g KmQpCiAgICAgICogQ3JlYXRpb24gaXMgY29uc2lkZXJlZCBmaW5pc2hlZCB3aGVuIHRoZSBjb250 cm9sbGVyIHJlZmVyZW5jZSBjb3VudAogICAgICAqIGZpcnN0IGRyb3BzIHRvIDAuCiAgICAgICov Ci0gICAgaWYgKCBuZXcgPT0gMCApCisgICAgaWYgKCBuZXcgPT0gMCAmJiAhZC0+Y3JlYXRpb25f ZmluaXNoZWQgKQorICAgIHsKKyAgICAgICAgcmV0ID0gZ3JhbnRfdGFibGVfaW5pdChkKTsKKyAg ICAgICAgaWYgKCByZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBfX2RvbWFpbl9wYXVzZV9i eV9zeXN0ZW1jb250cm9sbGVyKGQsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAg ICAgICAgfQogICAgICAgICBkLT5jcmVhdGlvbl9maW5pc2hlZCA9IHRydWU7CisgICAgfQogCiAg ICAgZG9tYWluX3VucGF1c2UoZCk7CiAKZGlmZiAtLWdpdCBhL3hlbi9jb21tb24vZ3JhbnRfdGFi bGUuYyBiL3hlbi9jb21tb24vZ3JhbnRfdGFibGUuYwppbmRleCA0NTIwZTM2ZDkwLi4yOWU3ZmE1 MzliIDEwMDY0NAotLS0gYS94ZW4vY29tbW9uL2dyYW50X3RhYmxlLmMKKysrIGIveGVuL2NvbW1v bi9ncmFudF90YWJsZS5jCkBAIC0xNjU1LDYgKzE2NTUsNzggQEAgZ250dGFiX3VucG9wdWxhdGVf c3RhdHVzX2ZyYW1lcyhzdHJ1Y3QgZG9tYWluICpkLCBzdHJ1Y3QgZ3JhbnRfdGFibGUgKmd0KQog ICAgIGd0LT5ucl9zdGF0dXNfZnJhbWVzID0gMDsKIH0KIAoraW50CitncmFudF90YWJsZV9pbml0 KHN0cnVjdCBkb21haW4gKmQpCit7CisgICAgc3RydWN0IGdyYW50X3RhYmxlICpndCA9IGQtPmdy YW50X3RhYmxlOworICAgIHVuc2lnbmVkIGludCBpLCBqOworCisgICAgaWYgKCBndC0+bnJfZ3Jh bnRfZnJhbWVzICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBndC0+bnJfZ3JhbnRfZnJhbWVz ID0gSU5JVElBTF9OUl9HUkFOVF9GUkFNRVM7CisKKyAgICAvKiBBY3RpdmUgZ3JhbnQgdGFibGUu ICovCisgICAgaWYgKCAoZ3QtPmFjdGl2ZSA9IHh6YWxsb2NfYXJyYXkoc3RydWN0IGFjdGl2ZV9n cmFudF9lbnRyeSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9u cl9hY3RpdmVfZ3JhbnRfZnJhbWVzKSkgPT0gTlVMTCApCisgICAgICAgIGdvdG8gbm9fbWVtXzE7 CisgICAgZm9yICggaSA9IDA7CisgICAgICAgICAgaSA8IG51bV9hY3RfZnJhbWVzX2Zyb21fc2hh X2ZyYW1lcyhJTklUSUFMX05SX0dSQU5UX0ZSQU1FUyk7IGkrKyApCisgICAgeworICAgICAgICBp ZiAoIChndC0+YWN0aXZlW2ldID0gYWxsb2NfeGVuaGVhcF9wYWdlKCkpID09IE5VTEwgKQorICAg ICAgICAgICAgZ290byBub19tZW1fMjsKKyAgICAgICAgY2xlYXJfcGFnZShndC0+YWN0aXZlW2ld KTsKKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBBQ0dOVF9QRVJfUEFHRTsgaisrICkKKyAgICAg ICAgICAgIHNwaW5fbG9ja19pbml0KCZndC0+YWN0aXZlW2ldW2pdLmxvY2spOworICAgIH0KKwor ICAgIC8qIFRyYWNraW5nIG9mIG1hcHBlZCBmb3JlaWduIGZyYW1lcyB0YWJsZSAqLworICAgIGd0 LT5tYXB0cmFjayA9IHZ6YWxsb2MobWF4X21hcHRyYWNrX2ZyYW1lcyAqIHNpemVvZigqZ3QtPm1h cHRyYWNrKSk7CisgICAgaWYgKCBndC0+bWFwdHJhY2sgPT0gTlVMTCApCisgICAgICAgIGdvdG8g bm9fbWVtXzI7CisKKyAgICAvKiBTaGFyZWQgZ3JhbnQgdGFibGUuICovCisgICAgaWYgKCAoZ3Qt PnNoYXJlZF9yYXcgPSB4emFsbG9jX2FycmF5KHZvaWQgKiwgbWF4X2dyYW50X2ZyYW1lcykpID09 IE5VTEwgKQorICAgICAgICBnb3RvIG5vX21lbV8zOworICAgIGZvciAoIGkgPSAwOyBpIDwgSU5J VElBTF9OUl9HUkFOVF9GUkFNRVM7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIChndC0+c2hh cmVkX3Jhd1tpXSA9IGFsbG9jX3hlbmhlYXBfcGFnZSgpKSA9PSBOVUxMICkKKyAgICAgICAgICAg IGdvdG8gbm9fbWVtXzQ7CisgICAgICAgIGNsZWFyX3BhZ2UoZ3QtPnNoYXJlZF9yYXdbaV0pOwor ICAgIH0KKworICAgIC8qIFN0YXR1cyBwYWdlcyBmb3IgZ3JhbnQgdGFibGUgLSBmb3IgdmVyc2lv biAyICovCisgICAgZ3QtPnN0YXR1cyA9IHh6YWxsb2NfYXJyYXkoZ3JhbnRfc3RhdHVzX3QgKiwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudF90b19zdGF0dXNfZnJhbWVzKG1h eF9ncmFudF9mcmFtZXMpKTsKKyAgICBpZiAoIGd0LT5zdGF0dXMgPT0gTlVMTCApCisgICAgICAg IGdvdG8gbm9fbWVtXzQ7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IElOSVRJQUxfTlJfR1JBTlRf RlJBTUVTOyBpKysgKQorICAgICAgICBnbnR0YWJfY3JlYXRlX3NoYXJlZF9wYWdlKGQsIGd0LCBp KTsKKworICAgIGd0LT5ucl9zdGF0dXNfZnJhbWVzID0gMDsKKworICAgIHJldHVybiAwOworCisg bm9fbWVtXzQ6CisgICAgZm9yICggaSA9IDA7IGkgPCBJTklUSUFMX05SX0dSQU5UX0ZSQU1FUzsg aSsrICkKKyAgICAgICAgZnJlZV94ZW5oZWFwX3BhZ2UoZ3QtPnNoYXJlZF9yYXdbaV0pOworICAg IHhmcmVlKGd0LT5zaGFyZWRfcmF3KTsKKyAgICBndC0+c2hhcmVkX3JhdyA9IE5VTEw7Cisgbm9f bWVtXzM6CisgICAgdmZyZWUoZ3QtPm1hcHRyYWNrKTsKKyAgICBndC0+bWFwdHJhY2sgPSBOVUxM OworIG5vX21lbV8yOgorICAgIGZvciAoIGkgPSAwOworICAgICAgICAgIGkgPCBudW1fYWN0X2Zy YW1lc19mcm9tX3NoYV9mcmFtZXMoSU5JVElBTF9OUl9HUkFOVF9GUkFNRVMpOyBpKysgKQorICAg ICAgICBmcmVlX3hlbmhlYXBfcGFnZShndC0+YWN0aXZlW2ldKTsKKyAgICB4ZnJlZShndC0+YWN0 aXZlKTsKKyAgICBndC0+YWN0aXZlID0gTlVMTDsKKyBub19tZW1fMToKKyAgICBndC0+bnJfZ3Jh bnRfZnJhbWVzID0gMDsKKyAgICByZXR1cm4gLUVOT01FTTsKK30KKwogLyoKICAqIEdyb3cgdGhl IGdyYW50IHRhYmxlLiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgZ3JhbnQgdGFibGUncwogICog d3JpdGUgbG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgpAQCAtMTY2NSw2ICsxNzM3 LDEyIEBAIGdudHRhYl9ncm93X3RhYmxlKHN0cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGludCBy ZXFfbnJfZnJhbWVzKQogICAgIHN0cnVjdCBncmFudF90YWJsZSAqZ3QgPSBkLT5ncmFudF90YWJs ZTsKICAgICB1bnNpZ25lZCBpbnQgaSwgajsKIAorICAgIGlmICggIWd0LT5ucl9ncmFudF9mcmFt ZXMgJiYgZ3JhbnRfdGFibGVfaW5pdChkKSApCisgICAgeworICAgICAgICBnZHByaW50ayhYRU5M T0dfSU5GTywgIkFsbG9jYXRpb24gZmFpbHVyZSBpbiBncmFudCB0YWJsZSBpbml0LlxuIik7Cisg ICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIEFTU0VSVChyZXFfbnJfZnJhbWVzIDw9IG1h eF9ncmFudF9mcmFtZXMpOwogCiAgICAgZ2RwcmludGsoWEVOTE9HX0lORk8sCkBAIC0zMzgwLDc1 ICszNDU4LDE3IEBAIGdyYW50X3RhYmxlX2NyZWF0ZSgKICAgICBzdHJ1Y3QgZG9tYWluICpkKQog ewogICAgIHN0cnVjdCBncmFudF90YWJsZSAqdDsKLSAgICB1bnNpZ25lZCBpbnQgaSwgajsKIAog ICAgIGlmICggKHQgPSB4emFsbG9jKHN0cnVjdCBncmFudF90YWJsZSkpID09IE5VTEwgKQotICAg ICAgICBnb3RvIG5vX21lbV8wOworICAgICAgICByZXR1cm4gLUVOT01FTTsKIAogICAgIC8qIFNp bXBsZSBzdHVmZi4gKi8KICAgICBwZXJjcHVfcndsb2NrX3Jlc291cmNlX2luaXQoJnQtPmxvY2ss IGdyYW50X3J3bG9jayk7CiAgICAgc3Bpbl9sb2NrX2luaXQoJnQtPm1hcHRyYWNrX2xvY2spOwot ICAgIHQtPm5yX2dyYW50X2ZyYW1lcyA9IElOSVRJQUxfTlJfR1JBTlRfRlJBTUVTOwotCi0gICAg LyogQWN0aXZlIGdyYW50IHRhYmxlLiAqLwotICAgIGlmICggKHQtPmFjdGl2ZSA9IHh6YWxsb2Nf YXJyYXkoc3RydWN0IGFjdGl2ZV9ncmFudF9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbWF4X25yX2FjdGl2ZV9ncmFudF9mcmFtZXMpKSA9PSBOVUxMICkKLSAg ICAgICAgZ290byBub19tZW1fMTsKLSAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICBpIDwgbnVt X2FjdF9mcmFtZXNfZnJvbV9zaGFfZnJhbWVzKElOSVRJQUxfTlJfR1JBTlRfRlJBTUVTKTsgaSsr ICkKLSAgICB7Ci0gICAgICAgIGlmICggKHQtPmFjdGl2ZVtpXSA9IGFsbG9jX3hlbmhlYXBfcGFn ZSgpKSA9PSBOVUxMICkKLSAgICAgICAgICAgIGdvdG8gbm9fbWVtXzI7Ci0gICAgICAgIGNsZWFy X3BhZ2UodC0+YWN0aXZlW2ldKTsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBBQ0dOVF9QRVJf UEFHRTsgaisrICkKLSAgICAgICAgICAgIHNwaW5fbG9ja19pbml0KCZ0LT5hY3RpdmVbaV1bal0u bG9jayk7Ci0gICAgfQotCi0gICAgLyogVHJhY2tpbmcgb2YgbWFwcGVkIGZvcmVpZ24gZnJhbWVz IHRhYmxlICovCi0gICAgdC0+bWFwdHJhY2sgPSB2emFsbG9jKG1heF9tYXB0cmFja19mcmFtZXMg KiBzaXplb2YoKnQtPm1hcHRyYWNrKSk7Ci0gICAgaWYgKCB0LT5tYXB0cmFjayA9PSBOVUxMICkK LSAgICAgICAgZ290byBub19tZW1fMjsKLQotICAgIC8qIFNoYXJlZCBncmFudCB0YWJsZS4gKi8K LSAgICBpZiAoICh0LT5zaGFyZWRfcmF3ID0geHphbGxvY19hcnJheSh2b2lkICosIG1heF9ncmFu dF9mcmFtZXMpKSA9PSBOVUxMICkKLSAgICAgICAgZ290byBub19tZW1fMzsKLSAgICBmb3IgKCBp ID0gMDsgaSA8IElOSVRJQUxfTlJfR1JBTlRfRlJBTUVTOyBpKysgKQotICAgIHsKLSAgICAgICAg aWYgKCAodC0+c2hhcmVkX3Jhd1tpXSA9IGFsbG9jX3hlbmhlYXBfcGFnZSgpKSA9PSBOVUxMICkK LSAgICAgICAgICAgIGdvdG8gbm9fbWVtXzQ7Ci0gICAgICAgIGNsZWFyX3BhZ2UodC0+c2hhcmVk X3Jhd1tpXSk7Ci0gICAgfQotCi0gICAgLyogU3RhdHVzIHBhZ2VzIGZvciBncmFudCB0YWJsZSAt IGZvciB2ZXJzaW9uIDIgKi8KLSAgICB0LT5zdGF0dXMgPSB4emFsbG9jX2FycmF5KGdyYW50X3N0 YXR1c190ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudF90b19zdGF0dXNf ZnJhbWVzKG1heF9ncmFudF9mcmFtZXMpKTsKLSAgICBpZiAoIHQtPnN0YXR1cyA9PSBOVUxMICkK LSAgICAgICAgZ290byBub19tZW1fNDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgSU5JVElBTF9O Ul9HUkFOVF9GUkFNRVM7IGkrKyApCi0gICAgICAgIGdudHRhYl9jcmVhdGVfc2hhcmVkX3BhZ2Uo ZCwgdCwgaSk7Ci0KLSAgICB0LT5ucl9zdGF0dXNfZnJhbWVzID0gMDsKIAogICAgIC8qIE9rYXks IGluc3RhbGwgdGhlIHN0cnVjdHVyZS4gKi8KICAgICBkLT5ncmFudF90YWJsZSA9IHQ7CiAgICAg cmV0dXJuIDA7Ci0KLSBub19tZW1fNDoKLSAgICBmb3IgKCBpID0gMDsgaSA8IElOSVRJQUxfTlJf R1JBTlRfRlJBTUVTOyBpKysgKQotICAgICAgICBmcmVlX3hlbmhlYXBfcGFnZSh0LT5zaGFyZWRf cmF3W2ldKTsKLSAgICB4ZnJlZSh0LT5zaGFyZWRfcmF3KTsKLSBub19tZW1fMzoKLSAgICB2ZnJl ZSh0LT5tYXB0cmFjayk7Ci0gbm9fbWVtXzI6Ci0gICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAg aSA8IG51bV9hY3RfZnJhbWVzX2Zyb21fc2hhX2ZyYW1lcyhJTklUSUFMX05SX0dSQU5UX0ZSQU1F Uyk7IGkrKyApCi0gICAgICAgIGZyZWVfeGVuaGVhcF9wYWdlKHQtPmFjdGl2ZVtpXSk7Ci0gICAg eGZyZWUodC0+YWN0aXZlKTsKLSBub19tZW1fMToKLSAgICB4ZnJlZSh0KTsKLSBub19tZW1fMDoK LSAgICByZXR1cm4gLUVOT01FTTsKIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEveGVuL2luY2x1ZGUv eGVuL2dyYW50X3RhYmxlLmggYi94ZW4vaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaAppbmRleCA0 M2IwN2U2MGM1Li44NGE4ZDYxNjE2IDEwMDY0NAotLS0gYS94ZW4vaW5jbHVkZS94ZW4vZ3JhbnRf dGFibGUuaAorKysgYi94ZW4vaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaApAQCAtMzUsNiArMzUs OCBAQCBleHRlcm4gdW5zaWduZWQgaW50IG1heF9ncmFudF9mcmFtZXM7CiAvKiBDcmVhdGUvZGVz dHJveSBwZXItZG9tYWluIGdyYW50IHRhYmxlIGNvbnRleHQuICovCiBpbnQgZ3JhbnRfdGFibGVf Y3JlYXRlKAogICAgIHN0cnVjdCBkb21haW4gKmQpOworaW50IGdyYW50X3RhYmxlX2luaXQoCisg ICAgc3RydWN0IGRvbWFpbiAqZCk7CiB2b2lkIGdyYW50X3RhYmxlX2Rlc3Ryb3koCiAgICAgc3Ry dWN0IGRvbWFpbiAqZCk7CiB2b2lkIGdyYW50X3RhYmxlX2luaXRfdmNwdShzdHJ1Y3QgdmNwdSAq dik7Ci0tIAoyLjEyLjMKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0 dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK