From mboxrd@z Thu Jan 1 00:00:00 1970 From: Imre Deak Subject: [PATCH v2 4.1/5] drm/i915: calculate the port clock rate along with other PLL params Date: Mon, 22 Jun 2015 23:35:51 +0300 Message-ID: <1435005352-27604-2-git-send-email-imre.deak@intel.com> References: <1435005352-27604-1-git-send-email-imre.deak@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 887B86E2C8 for ; Mon, 22 Jun 2015 13:35:55 -0700 (PDT) In-Reply-To: <1435005352-27604-1-git-send-email-imre.deak@intel.com> In-Reply-To: <1434637557-4856-4-git-send-email-imre.deak@intel.com> References: <1434637557-4856-4-git-send-email-imre.deak@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB0aGUgcG9ydCBjbG9jayBmZWQgdG8gdGhlIHBpcGUg Y2FuIGJlIHRoZSBQTEwncwpwb3N0LWRpdmlkZWQgZmFzdCBjbG9jayByYXRlIG9yIGEgLzUgZGl2 aWRlZCB2ZXJzaW9uIG9mIGl0LiBUbyBtYWtlIHRoaXMKbW9yZSBvYnZpb3VzIGFjcm9zcyB0aGUg cGxhdGZvcm1zIGNhbGN1bGF0ZSB0aGlzIHBvcnQgY2xvY2sgYWxvbmcgd2l0aAp0aGUgcmVzdCBv ZiB0aGUgUExMIHBhcmFtZXRlcnMuCgpUaGlzIGlzIGFsc28gbmVlZGVkIGJ5IHRoZSBuZXh0IHBh dGNoIHdoZXJlIHdlIGNhbiByZXVzZSB0aGUgQ0hWIGhlbHBlcgpmb3IgdGhlIEJYVCBQTEwgSFcg cmVhZG91dCBjb2RlOyBzbyBleHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgaGVscGVyLgoKV2hpbGUg YXQgaXQgYWxzbyBhZGQgYSBtb3JlIGRlc2NyaXB0aXZlIG5hbWUgdG8gdGhlIGhlbHBlcnMgYW5k IGEKY29tbWVudCBleHBsYWluaW5nIHdoYXQncyBiZWluZyBjYWxjdWxhdGVkLgoKTm8gZnVuY3Rp b25hbCBjaGFuZ2UuCgpTdWdnZXN0ZWQtYnk6IFZpbGxlIFN5cmrDpGzDpCA8dmlsbGUuc3lyamFs YUBsaW51eC5pbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IEltcmUgRGVhayA8aW1yZS5kZWFrQGlu dGVsLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgfCA2MSAr KysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2Rydi5oICAgICB8ICAyICsrCiAyIGZpbGVzIGNoYW5nZWQsIDM4IGluc2VydGlvbnMo KyksIDI1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2lu dGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRl eCBmYjdmZDVmLi5hMTFjZTdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpA QCAtNTUzLDE1ICs1NTMsMjUgQEAgaW50ZWxfbGltaXQoc3RydWN0IGludGVsX2NydGNfc3RhdGUg KmNydGNfc3RhdGUsIGludCByZWZjbGspCiAJcmV0dXJuIGxpbWl0OwogfQogCisvKgorICogUGxh dGZvcm0gc3BlY2lmaWMgaGVscGVycyB0byBjYWxjdWxhdGUgdGhlIHBvcnQgUExMIGxvb3BiYWNr LSAoY2xvY2subSksCisgKiBhbmQgcG9zdC1kaXZpZGVyIChjbG9jay5wKSB2YWx1ZXMsIHByZS0g KGNsb2NrLnZjbykgYW5kIHBvc3QtZGl2aWRlZCBmYXN0CisgKiAoY2xvY2suZG90KSBjbG9jayBy YXRlcy4gVGhpcyBmYXN0IGRvdCBjbG9jayBpcyBmZWQgdG8gdGhlIHBvcnQncyBJTyBsb2dpYy4K KyAqIFRoZSBoZWxwZXJzJyByZXR1cm4gdmFsdWUgaXMgdGhlIHJhdGUgb2YgdGhlIGNsb2NrIHRo YXQgaXMgZmVkIHRvIHRoZQorICogZGlzcGxheSBlbmdpbmUncyBwaXBlIHdoaWNoIGNhbiBiZSB0 aGUgYWJvdmUgZmFzdCBkb3QgY2xvY2sgcmF0ZSBvciBhCisgKiBkaXZpZGVkLWRvd24gdmVyc2lv biBvZiBpdC4KKyAqLwogLyogbTEgaXMgcmVzZXJ2ZWQgYXMgMCBpbiBQaW5ldmlldywgbiBpcyBh IHJpbmcgY291bnRlciAqLwotc3RhdGljIHZvaWQgcGluZXZpZXdfY2xvY2soaW50IHJlZmNsaywg aW50ZWxfY2xvY2tfdCAqY2xvY2spCitzdGF0aWMgaW50IHBudl9jYWxjX2RwbGxfcGFyYW1zKGlu dCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmNsb2NrKQogewogCWNsb2NrLT5tID0gY2xvY2stPm0y ICsgMjsKIAljbG9jay0+cCA9IGNsb2NrLT5wMSAqIGNsb2NrLT5wMjsKIAlpZiAoV0FSTl9PTihj bG9jay0+biA9PSAwIHx8IGNsb2NrLT5wID09IDApKQotCQlyZXR1cm47CisJCXJldHVybiAwOwog CWNsb2NrLT52Y28gPSBESVZfUk9VTkRfQ0xPU0VTVChyZWZjbGsgKiBjbG9jay0+bSwgY2xvY2st Pm4pOwogCWNsb2NrLT5kb3QgPSBESVZfUk9VTkRfQ0xPU0VTVChjbG9jay0+dmNvLCBjbG9jay0+ cCk7CisKKwlyZXR1cm4gY2xvY2stPmRvdDsKIH0KIAogc3RhdGljIHVpbnQzMl90IGk5eHhfZHBs bF9jb21wdXRlX20oc3RydWN0IGRwbGwgKmRwbGwpCkBAIC01NjksMzUgKzU3OSw0MSBAQCBzdGF0 aWMgdWludDMyX3QgaTl4eF9kcGxsX2NvbXB1dGVfbShzdHJ1Y3QgZHBsbCAqZHBsbCkKIAlyZXR1 cm4gNSAqIChkcGxsLT5tMSArIDIpICsgKGRwbGwtPm0yICsgMik7CiB9CiAKLXN0YXRpYyB2b2lk IGk5eHhfY2xvY2soaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCitzdGF0aWMgaW50 IGk5eHhfY2FsY19kcGxsX3BhcmFtcyhpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpjbG9jaykK IHsKIAljbG9jay0+bSA9IGk5eHhfZHBsbF9jb21wdXRlX20oY2xvY2spOwogCWNsb2NrLT5wID0g Y2xvY2stPnAxICogY2xvY2stPnAyOwogCWlmIChXQVJOX09OKGNsb2NrLT5uICsgMiA9PSAwIHx8 IGNsb2NrLT5wID09IDApKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCWNsb2NrLT52Y28gPSBE SVZfUk9VTkRfQ0xPU0VTVChyZWZjbGsgKiBjbG9jay0+bSwgY2xvY2stPm4gKyAyKTsKIAljbG9j ay0+ZG90ID0gRElWX1JPVU5EX0NMT1NFU1QoY2xvY2stPnZjbywgY2xvY2stPnApOworCisJcmV0 dXJuIGNsb2NrLT5kb3Q7CiB9CiAKLXN0YXRpYyB2b2lkIHZsdl9jbG9jayhpbnQgcmVmY2xrLCBp bnRlbF9jbG9ja190ICpjbG9jaykKK3N0YXRpYyBpbnQgdmx2X2NhbGNfZHBsbF9wYXJhbXMoaW50 IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCiB7CiAJY2xvY2stPm0gPSBjbG9jay0+bTEg KiBjbG9jay0+bTI7CiAJY2xvY2stPnAgPSBjbG9jay0+cDEgKiBjbG9jay0+cDI7CiAJaWYgKFdB Uk5fT04oY2xvY2stPm4gPT0gMCB8fCBjbG9jay0+cCA9PSAwKSkKLQkJcmV0dXJuOworCQlyZXR1 cm4gMDsKIAljbG9jay0+dmNvID0gRElWX1JPVU5EX0NMT1NFU1QocmVmY2xrICogY2xvY2stPm0s IGNsb2NrLT5uKTsKIAljbG9jay0+ZG90ID0gRElWX1JPVU5EX0NMT1NFU1QoY2xvY2stPnZjbywg Y2xvY2stPnApOworCisJcmV0dXJuIGNsb2NrLT5kb3QgLyA1OwogfQogCi1zdGF0aWMgdm9pZCBj aHZfY2xvY2soaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCitpbnQgY2h2X2NhbGNf ZHBsbF9wYXJhbXMoaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCiB7CiAJY2xvY2st Pm0gPSBjbG9jay0+bTEgKiBjbG9jay0+bTI7CiAJY2xvY2stPnAgPSBjbG9jay0+cDEgKiBjbG9j ay0+cDI7CiAJaWYgKFdBUk5fT04oY2xvY2stPm4gPT0gMCB8fCBjbG9jay0+cCA9PSAwKSkKLQkJ cmV0dXJuOworCQlyZXR1cm4gMDsKIAljbG9jay0+dmNvID0gRElWX1JPVU5EX0NMT1NFU1RfVUxM KCh1aW50NjRfdClyZWZjbGsgKiBjbG9jay0+bSwKIAkJCWNsb2NrLT5uIDw8IDIyKTsKIAljbG9j ay0+ZG90ID0gRElWX1JPVU5EX0NMT1NFU1QoY2xvY2stPnZjbywgY2xvY2stPnApOworCisJcmV0 dXJuIGNsb2NrLT5kb3QgLyA1OwogfQogCiAjZGVmaW5lIElOVEVMUGxsSW52YWxpZChzKSAgIGRv IHsgLyogRFJNX0RFQlVHKHMpOyAqLyByZXR1cm4gZmFsc2U7IH0gd2hpbGUgKDApCkBAIC02OTIs NyArNzA4LDcgQEAgaTl4eF9maW5kX2Jlc3RfZHBsbChjb25zdCBpbnRlbF9saW1pdF90ICpsaW1p dCwKIAkJCQkJY2xvY2sucDEgPD0gbGltaXQtPnAxLm1heDsgY2xvY2sucDErKykgewogCQkJCQlp bnQgdGhpc19lcnI7CiAKLQkJCQkJaTl4eF9jbG9jayhyZWZjbGssICZjbG9jayk7CisJCQkJCWk5 eHhfY2FsY19kcGxsX3BhcmFtcyhyZWZjbGssICZjbG9jayk7CiAJCQkJCWlmICghaW50ZWxfUExM X2lzX3ZhbGlkKGRldiwgbGltaXQsCiAJCQkJCQkJCSZjbG9jaykpCiAJCQkJCQljb250aW51ZTsK QEAgLTczNyw3ICs3NTMsNyBAQCBwbnZfZmluZF9iZXN0X2RwbGwoY29uc3QgaW50ZWxfbGltaXRf dCAqbGltaXQsCiAJCQkJCWNsb2NrLnAxIDw9IGxpbWl0LT5wMS5tYXg7IGNsb2NrLnAxKyspIHsK IAkJCQkJaW50IHRoaXNfZXJyOwogCi0JCQkJCXBpbmV2aWV3X2Nsb2NrKHJlZmNsaywgJmNsb2Nr KTsKKwkJCQkJcG52X2NhbGNfZHBsbF9wYXJhbXMocmVmY2xrLCAmY2xvY2spOwogCQkJCQlpZiAo IWludGVsX1BMTF9pc192YWxpZChkZXYsIGxpbWl0LAogCQkJCQkJCQkmY2xvY2spKQogCQkJCQkJ Y29udGludWU7CkBAIC03ODcsNyArODAzLDcgQEAgZzR4X2ZpbmRfYmVzdF9kcGxsKGNvbnN0IGlu dGVsX2xpbWl0X3QgKmxpbWl0LAogCQkJCSAgICAgY2xvY2sucDEgPj0gbGltaXQtPnAxLm1pbjsg Y2xvY2sucDEtLSkgewogCQkJCQlpbnQgdGhpc19lcnI7CiAKLQkJCQkJaTl4eF9jbG9jayhyZWZj bGssICZjbG9jayk7CisJCQkJCWk5eHhfY2FsY19kcGxsX3BhcmFtcyhyZWZjbGssICZjbG9jayk7 CiAJCQkJCWlmICghaW50ZWxfUExMX2lzX3ZhbGlkKGRldiwgbGltaXQsCiAJCQkJCQkJCSZjbG9j aykpCiAJCQkJCQljb250aW51ZTsKQEAgLTg3Nyw3ICs4OTMsNyBAQCB2bHZfZmluZF9iZXN0X2Rw bGwoY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQsCiAJCQkJCWNsb2NrLm0yID0gRElWX1JPVU5E X0NMT1NFU1QodGFyZ2V0ICogY2xvY2sucCAqIGNsb2NrLm4sCiAJCQkJCQkJCSAgICAgcmVmY2xr ICogY2xvY2subTEpOwogCi0JCQkJCXZsdl9jbG9jayhyZWZjbGssICZjbG9jayk7CisJCQkJCXZs dl9jYWxjX2RwbGxfcGFyYW1zKHJlZmNsaywgJmNsb2NrKTsKIAogCQkJCQlpZiAoIWludGVsX1BM TF9pc192YWxpZChkZXYsIGxpbWl0LAogCQkJCQkJCQkmY2xvY2spKQpAQCAtOTQwLDcgKzk1Niw3 IEBAIGNodl9maW5kX2Jlc3RfZHBsbChjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwKIAogCQkJ Y2xvY2subTIgPSBtMjsKIAotCQkJY2h2X2Nsb2NrKHJlZmNsaywgJmNsb2NrKTsKKwkJCWNodl9j YWxjX2RwbGxfcGFyYW1zKHJlZmNsaywgJmNsb2NrKTsKIAogCQkJaWYgKCFpbnRlbF9QTExfaXNf dmFsaWQoZGV2LCBsaW1pdCwgJmNsb2NrKSkKIAkJCQljb250aW51ZTsKQEAgLTc5MjYsMTAgKzc5 NDIsNyBAQCBzdGF0aWMgdm9pZCB2bHZfY3J0Y19jbG9ja19nZXQoc3RydWN0IGludGVsX2NydGMg KmNydGMsCiAJY2xvY2sucDEgPSAobWRpdiA+PiBEUElPX1AxX1NISUZUKSAmIDc7CiAJY2xvY2su cDIgPSAobWRpdiA+PiBEUElPX1AyX1NISUZUKSAmIDB4MWY7CiAKLQl2bHZfY2xvY2socmVmY2xr LCAmY2xvY2spOwotCi0JLyogY2xvY2suZG90IGlzIHRoZSBmYXN0IGNsb2NrICovCi0JcGlwZV9j b25maWctPnBvcnRfY2xvY2sgPSBjbG9jay5kb3QgLyA1OworCXBpcGVfY29uZmlnLT5wb3J0X2Ns b2NrID0gdmx2X2NhbGNfZHBsbF9wYXJhbXMocmVmY2xrLCAmY2xvY2spOwogfQogCiBzdGF0aWMg dm9pZApAQCAtODAyNSwxMCArODAzOCw3IEBAIHN0YXRpYyB2b2lkIGNodl9jcnRjX2Nsb2NrX2dl dChzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywKIAljbG9jay5wMSA9IChjbW5fZHcxMyA+PiBEUElP X0NIVl9QMV9ESVZfU0hJRlQpICYgMHg3OwogCWNsb2NrLnAyID0gKGNtbl9kdzEzID4+IERQSU9f Q0hWX1AyX0RJVl9TSElGVCkgJiAweDFmOwogCi0JY2h2X2Nsb2NrKHJlZmNsaywgJmNsb2NrKTsK LQotCS8qIGNsb2NrLmRvdCBpcyB0aGUgZmFzdCBjbG9jayAqLwotCXBpcGVfY29uZmlnLT5wb3J0 X2Nsb2NrID0gY2xvY2suZG90IC8gNTsKKwlwaXBlX2NvbmZpZy0+cG9ydF9jbG9jayA9IGNodl9j YWxjX2RwbGxfcGFyYW1zKHJlZmNsaywgJmNsb2NrKTsKIH0KIAogc3RhdGljIGJvb2wgaTl4eF9n ZXRfcGlwZV9jb25maWcoc3RydWN0IGludGVsX2NydGMgKmNydGMsCkBAIC0xMDQ4MSw2ICsxMDQ5 MSw3IEBAIHN0YXRpYyB2b2lkIGk5eHhfY3J0Y19jbG9ja19nZXQoc3RydWN0IGludGVsX2NydGMg KmNydGMsCiAJdTMyIGRwbGwgPSBwaXBlX2NvbmZpZy0+ZHBsbF9od19zdGF0ZS5kcGxsOwogCXUz MiBmcDsKIAlpbnRlbF9jbG9ja190IGNsb2NrOworCWludCBwb3J0X2Nsb2NrOwogCWludCByZWZj bGsgPSBpOXh4X3BsbF9yZWZjbGsoZGV2LCBwaXBlX2NvbmZpZyk7CiAKIAlpZiAoKGRwbGwgJiBE SVNQTEFZX1JBVEVfU0VMRUNUX0ZQQTEpID09IDApCkBAIC0xMDUyMSw5ICsxMDUzMiw5IEBAIHN0 YXRpYyB2b2lkIGk5eHhfY3J0Y19jbG9ja19nZXQoc3RydWN0IGludGVsX2NydGMgKmNydGMsCiAJ CX0KIAogCQlpZiAoSVNfUElORVZJRVcoZGV2KSkKLQkJCXBpbmV2aWV3X2Nsb2NrKHJlZmNsaywg JmNsb2NrKTsKKwkJCXBvcnRfY2xvY2sgPSBwbnZfY2FsY19kcGxsX3BhcmFtcyhyZWZjbGssICZj bG9jayk7CiAJCWVsc2UKLQkJCWk5eHhfY2xvY2socmVmY2xrLCAmY2xvY2spOworCQkJcG9ydF9j bG9jayA9IGk5eHhfY2FsY19kcGxsX3BhcmFtcyhyZWZjbGssICZjbG9jayk7CiAJfSBlbHNlIHsK IAkJdTMyIGx2ZHMgPSBJU19JODMwKGRldikgPyAwIDogSTkxNV9SRUFEKExWRFMpOwogCQlib29s IGlzX2x2ZHMgPSAocGlwZSA9PSAxKSAmJiAobHZkcyAmIExWRFNfUE9SVF9FTik7CkBAIC0xMDU0 OSw3ICsxMDU2MCw3IEBAIHN0YXRpYyB2b2lkIGk5eHhfY3J0Y19jbG9ja19nZXQoc3RydWN0IGlu dGVsX2NydGMgKmNydGMsCiAJCQkJY2xvY2sucDIgPSAyOwogCQl9CiAKLQkJaTl4eF9jbG9jayhy ZWZjbGssICZjbG9jayk7CisJCXBvcnRfY2xvY2sgPSBpOXh4X2NhbGNfZHBsbF9wYXJhbXMocmVm Y2xrLCAmY2xvY2spOwogCX0KIAogCS8qCkBAIC0xMDU1Nyw3ICsxMDU2OCw3IEBAIHN0YXRpYyB2 b2lkIGk5eHhfY3J0Y19jbG9ja19nZXQoc3RydWN0IGludGVsX2NydGMgKmNydGMsCiAJICogcG9y dF9jbG9jayB0byBjb21wdXRlIGFkanVzdGVkX21vZGUuY3J0Y19jbG9jayBpbiB0aGUKIAkgKiBl bmNvZGVyJ3MgZ2V0X2NvbmZpZygpIGZ1bmN0aW9uLgogCSAqLwotCXBpcGVfY29uZmlnLT5wb3J0 X2Nsb2NrID0gY2xvY2suZG90OworCXBpcGVfY29uZmlnLT5wb3J0X2Nsb2NrID0gcG9ydF9jbG9j azsKIH0KIAogaW50IGludGVsX2RvdGNsb2NrX2NhbGN1bGF0ZShpbnQgbGlua19mcmVxLApkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmggYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9kcnYuaAppbmRleCBlMjE3NGZkLi43YTViM2JjIDEwMDY0NAotLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9kcnYuaApAQCAtMTEzOCw2ICsxMTM4LDggQEAgaXJvbmxha2VfY2hlY2tfZW5jb2Rl cl9kb3RjbG9jayhjb25zdCBzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqcGlwZV9jb25maWcsCiAJ CQkJaW50IGRvdGNsb2NrKTsKIGJvb2wgYnh0X2ZpbmRfYmVzdF9kcGxsKHN0cnVjdCBpbnRlbF9j cnRjX3N0YXRlICpjcnRjX3N0YXRlLCBpbnQgdGFyZ2V0X2Nsb2NrLAogCQkJaW50ZWxfY2xvY2tf dCAqYmVzdF9jbG9jayk7CitpbnQgY2h2X2NhbGNfZHBsbF9wYXJhbXMoaW50IHJlZmNsaywgaW50 ZWxfY2xvY2tfdCAqcGxsX2Nsb2NrKTsKKwogYm9vbCBpbnRlbF9jcnRjX2FjdGl2ZShzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMpOwogdm9pZCBoc3dfZW5hYmxlX2lwcyhzdHJ1Y3QgaW50ZWxfY3J0YyAq Y3J0Yyk7CiB2b2lkIGhzd19kaXNhYmxlX2lwcyhzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0Yyk7Ci0t IAoyLjEuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K SW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK