From mboxrd@z Thu Jan 1 00:00:00 1970 From: ville.syrjala@linux.intel.com Subject: [PATCH v2 07/17] drm/i915: Introduce spt_irq_handler() Date: Thu, 27 Aug 2015 23:56:02 +0300 Message-ID: <1440708972-17112-8-git-send-email-ville.syrjala@linux.intel.com> References: <1440708972-17112-1-git-send-email-ville.syrjala@linux.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 791E86EE55 for ; Thu, 27 Aug 2015 13:56:52 -0700 (PDT) In-Reply-To: <1440708972-17112-1-git-send-email-ville.syrjala@linux.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 RnJvbTogVmlsbGUgU3lyasOkbMOkIDx2aWxsZS5zeXJqYWxhQGxpbnV4LmludGVsLmNvbT4KClN0 YXJ0aW5nIGZyb20gU1BUIHRoZSBvbmx5IGludGVycnVwdHMgbGl2aW5nIGluIHRoZSBzb3V0aCBh cmUgR01CVVMgYW5kCkhQRC4gV2hhdCdzIHdvcnNlIHNvbWUgb2YgdGhlIFNQVCBzcGVjaWZpYyBu ZXcgYml0cyBjb25mbGljdCB3aXRoIHNvbWUKb3RoZXIgYml0cyBvbiBlYXJsaWVyIFBDSCBnZW5l cmF0aW9ucy4gU28gYmV0dGVyIG5vdCB1c2UgdGhlCmNwdF9pcnFfaGFuZGxlcigpIGZvciBTUFQr IGFueW1vcmUuCgpBbHNvIGtpbGwgdGhlIGhhbmQgcm9sbGVkIHBvcnQgRSBoYW5kbGluZyB3aXRo IHNvbWV0aGluZyBtb3JlCnN0YW5kYXJkaXNoLiBUaGlzIGFsc28gYXZvaWRzIGFjY2lkZW50YWxs eSBjb25mdXNpbmcgcG9ydCBCIGFuZCBwb3J0IEUKbG9uZyBwdWxzZXMgc2luY2UgdGhlIGJpdHMg b2NjdXB5IHRoZSBzYW1lIHBvc2l0aW9ucywganVzdCBpbiBkaWZmZXJlbnQKcmVnaXN0ZXJzLgoK QWxzbyBhZGQgYSBjb21tZW50IG5vdGluZyB0aGF0IHRoZSBzaG9ydCBwdWxzZSBkdXJhdGlvbiBi aXRzIGFyZQpyZXNlcnZlZCBvbiBMUFQrLiBUaGUgMm1zIHZhbHVlIHdlIHByb2dyYW0gaXMgMCwg c28gbm8gaXNzdWUgd3J0LiB0aGUKTUJaIGluIHRoZSBzcGVjLgoKdjI6IENhbGwgaW50ZWxfaHBk X2lycV9oYW5kbGVyKCkgb25seSBvbmNlIChQYXVsbykKClNpZ25lZC1vZmYtYnk6IFZpbGxlIFN5 cmrDpGzDpCA8dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9pcnEuYyB8IDEyNCArKysrKysrKysrKysrKysrKysrKysrKysrKystLS0t LS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgODQgaW5zZXJ0aW9ucygrKSwgNDAgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKaW5kZXggZGIyNzk0NS4uOTc4YTUyOCAxMDA2NDQK LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2lycS5jCkBAIC0xMjYyLDYgKzEyNjIsMTYgQEAgc3RhdGljIGJvb2wgYnh0 X3BvcnRfaG90cGx1Z19sb25nX2RldGVjdChlbnVtIHBvcnQgcG9ydCwgdTMyIHZhbCkKIAl9CiB9 CiAKK3N0YXRpYyBib29sIHNwdF9wb3J0X2hvdHBsdWcyX2xvbmdfZGV0ZWN0KGVudW0gcG9ydCBw b3J0LCB1MzIgdmFsKQoreworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgUE9SVF9FOgorCQlyZXR1 cm4gdmFsICYgUE9SVEVfSE9UUExVR19MT05HX0RFVEVDVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4g ZmFsc2U7CisJfQorfQorCiBzdGF0aWMgYm9vbCBwY2hfcG9ydF9ob3RwbHVnX2xvbmdfZGV0ZWN0 KGVudW0gcG9ydCBwb3J0LCB1MzIgdmFsKQogewogCXN3aXRjaCAocG9ydCkgewpAQCAtMTI3MSw4 ICsxMjgxLDYgQEAgc3RhdGljIGJvb2wgcGNoX3BvcnRfaG90cGx1Z19sb25nX2RldGVjdChlbnVt IHBvcnQgcG9ydCwgdTMyIHZhbCkKIAkJcmV0dXJuIHZhbCAmIFBPUlRDX0hPVFBMVUdfTE9OR19E RVRFQ1Q7CiAJY2FzZSBQT1JUX0Q6CiAJCXJldHVybiB2YWwgJiBQT1JURF9IT1RQTFVHX0xPTkdf REVURUNUOwotCWNhc2UgUE9SVF9FOgotCQlyZXR1cm4gdmFsICYgUE9SVEVfSE9UUExVR19MT05H X0RFVEVDVDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMTc3MCwxMiArMTc3 OCw3IEBAIHN0YXRpYyB2b2lkIGNwdF9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LCB1MzIgcGNoX2lpcikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBk ZXYtPmRldl9wcml2YXRlOwogCWludCBwaXBlOwotCXUzMiBob3RwbHVnX3RyaWdnZXI7Ci0KLQlp ZiAoSEFTX1BDSF9TUFQoZGV2KSkKLQkJaG90cGx1Z190cmlnZ2VyID0gcGNoX2lpciAmIFNERV9I T1RQTFVHX01BU0tfU1BUOwotCWVsc2UKLQkJaG90cGx1Z190cmlnZ2VyID0gcGNoX2lpciAmIFNE RV9IT1RQTFVHX01BU0tfQ1BUOworCXUzMiBob3RwbHVnX3RyaWdnZXIgPSBwY2hfaWlyICYgU0RF X0hPVFBMVUdfTUFTS19DUFQ7CiAKIAlpZiAoaG90cGx1Z190cmlnZ2VyKSB7CiAJCXUzMiBkaWdf aG90cGx1Z19yZWcsIHBpbl9tYXNrID0gMCwgbG9uZ19tYXNrID0gMDsKQEAgLTE3ODMsMjIgKzE3 ODYsMTAgQEAgc3RhdGljIHZvaWQgY3B0X2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYsIHUzMiBwY2hfaWlyKQogCQlkaWdfaG90cGx1Z19yZWcgPSBJOTE1X1JFQUQoUENIX1BPUlRf SE9UUExVRyk7CiAJCUk5MTVfV1JJVEUoUENIX1BPUlRfSE9UUExVRywgZGlnX2hvdHBsdWdfcmVn KTsKIAotCQlpZiAoSEFTX1BDSF9TUFQoZGV2KSkgewotCQkJaW50ZWxfZ2V0X2hwZF9waW5zKCZw aW5fbWFzaywgJmxvbmdfbWFzaywKLQkJCQkJICAgaG90cGx1Z190cmlnZ2VyLAotCQkJCQkgICBk aWdfaG90cGx1Z19yZWcsIGhwZF9zcHQsCi0JCQkJCSAgIHBjaF9wb3J0X2hvdHBsdWdfbG9uZ19k ZXRlY3QpOwotCi0JCQkvKiBkZXRlY3QgUE9SVEUgSFAgZXZlbnQgKi8KLQkJCWRpZ19ob3RwbHVn X3JlZyA9IEk5MTVfUkVBRChQQ0hfUE9SVF9IT1RQTFVHMik7Ci0JCQlpZiAocGNoX3BvcnRfaG90 cGx1Z19sb25nX2RldGVjdChQT1JUX0UsCi0JCQkJCQkJIGRpZ19ob3RwbHVnX3JlZykpCi0JCQkJ bG9uZ19tYXNrIHw9IDEgPDwgSFBEX1BPUlRfRTsKLQkJfSBlbHNlCi0JCQlpbnRlbF9nZXRfaHBk X3BpbnMoJnBpbl9tYXNrLCAmbG9uZ19tYXNrLAotCQkJCQkgICBob3RwbHVnX3RyaWdnZXIsCi0J CQkJCSAgIGRpZ19ob3RwbHVnX3JlZywgaHBkX2NwdCwKLQkJCQkJICAgcGNoX3BvcnRfaG90cGx1 Z19sb25nX2RldGVjdCk7CisJCWludGVsX2dldF9ocGRfcGlucygmcGluX21hc2ssICZsb25nX21h c2ssCisJCQkJICAgaG90cGx1Z190cmlnZ2VyLAorCQkJCSAgIGRpZ19ob3RwbHVnX3JlZywgaHBk X2NwdCwKKwkJCQkgICBwY2hfcG9ydF9ob3RwbHVnX2xvbmdfZGV0ZWN0KTsKIAogCQlpbnRlbF9o cGRfaXJxX2hhbmRsZXIoZGV2LCBwaW5fbWFzaywgbG9uZ19tYXNrKTsKIAl9CkBAIC0xODMyLDYg KzE4MjMsNDMgQEAgc3RhdGljIHZvaWQgY3B0X2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYsIHUzMiBwY2hfaWlyKQogCQljcHRfc2Vycl9pbnRfaGFuZGxlcihkZXYpOwogfQogCitz dGF0aWMgdm9pZCBzcHRfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHBj aF9paXIpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZf cHJpdmF0ZTsKKwl1MzIgaG90cGx1Z190cmlnZ2VyID0gcGNoX2lpciAmIFNERV9IT1RQTFVHX01B U0tfU1BUICYKKwkJflNERV9QT1JURV9IT1RQTFVHX1NQVDsKKwl1MzIgaG90cGx1ZzJfdHJpZ2dl ciA9IHBjaF9paXIgJiBTREVfUE9SVEVfSE9UUExVR19TUFQ7CisJdTMyIHBpbl9tYXNrID0gMCwg bG9uZ19tYXNrID0gMDsKKworCWlmIChob3RwbHVnX3RyaWdnZXIpIHsKKwkJdTMyIGRpZ19ob3Rw bHVnX3JlZzsKKworCQlkaWdfaG90cGx1Z19yZWcgPSBJOTE1X1JFQUQoUENIX1BPUlRfSE9UUExV Ryk7CisJCUk5MTVfV1JJVEUoUENIX1BPUlRfSE9UUExVRywgZGlnX2hvdHBsdWdfcmVnKTsKKwor CQlpbnRlbF9nZXRfaHBkX3BpbnMoJnBpbl9tYXNrLCAmbG9uZ19tYXNrLCBob3RwbHVnX3RyaWdn ZXIsCisJCQkJICAgZGlnX2hvdHBsdWdfcmVnLCBocGRfc3B0LAorCQkJCSAgIHBjaF9wb3J0X2hv dHBsdWdfbG9uZ19kZXRlY3QpOworCX0KKworCWlmIChob3RwbHVnMl90cmlnZ2VyKSB7CisJCXUz MiBkaWdfaG90cGx1Z19yZWc7CisKKwkJZGlnX2hvdHBsdWdfcmVnID0gSTkxNV9SRUFEKFBDSF9Q T1JUX0hPVFBMVUcyKTsKKwkJSTkxNV9XUklURShQQ0hfUE9SVF9IT1RQTFVHMiwgZGlnX2hvdHBs dWdfcmVnKTsKKworCQlpbnRlbF9nZXRfaHBkX3BpbnMoJnBpbl9tYXNrLCAmbG9uZ19tYXNrLCBo b3RwbHVnMl90cmlnZ2VyLAorCQkJCSAgIGRpZ19ob3RwbHVnX3JlZywgaHBkX3NwdCwKKwkJCQkg ICBzcHRfcG9ydF9ob3RwbHVnMl9sb25nX2RldGVjdCk7CisJfQorCisJaWYgKHBpbl9tYXNrKQor CQlpbnRlbF9ocGRfaXJxX2hhbmRsZXIoZGV2LCBwaW5fbWFzaywgbG9uZ19tYXNrKTsKKworCWlm IChwY2hfaWlyICYgU0RFX0dNQlVTX0NQVCkKKwkJZ21idXNfaXJxX2hhbmRsZXIoZGV2KTsKK30K Kwogc3RhdGljIHZvaWQgaWxrX2Rpc3BsYXlfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgdTMyIGRlX2lpcikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYg PSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjE1MCw3ICsyMTc4LDExIEBAIHN0YXRpYyBpcnFyZXR1 cm5fdCBnZW44X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIAkJaWYgKHBjaF9paXIp IHsKIAkJCUk5MTVfV1JJVEUoU0RFSUlSLCBwY2hfaWlyKTsKIAkJCXJldCA9IElSUV9IQU5ETEVE OwotCQkJY3B0X2lycV9oYW5kbGVyKGRldiwgcGNoX2lpcik7CisKKwkJCWlmIChIQVNfUENIX1NQ VChkZXZfcHJpdikpCisJCQkJc3B0X2lycV9oYW5kbGVyKGRldiwgcGNoX2lpcik7CisJCQllbHNl CisJCQkJY3B0X2lycV9oYW5kbGVyKGRldiwgcGNoX2lpcik7CiAJCX0gZWxzZQogCQkJRFJNX0VS Uk9SKCJUaGUgbWFzdGVyIGNvbnRyb2wgaW50ZXJydXB0IGxpZWQgKFNERSkhXG4iKTsKIApAQCAt MzAzMiw5ICszMDY0LDYgQEAgc3RhdGljIHZvaWQgaWJ4X2hwZF9pcnFfc2V0dXAoc3RydWN0IGRy bV9kZXZpY2UgKmRldikKIAlpZiAoSEFTX1BDSF9JQlgoZGV2KSkgewogCQlob3RwbHVnX2lycXMg PSBTREVfSE9UUExVR19NQVNLOwogCQllbmFibGVkX2lycXMgPSBpbnRlbF9ocGRfZW5hYmxlZF9p cnFzKGRldiwgaHBkX2lieCk7Ci0JfSBlbHNlIGlmIChIQVNfUENIX1NQVChkZXYpKSB7Ci0JCWhv dHBsdWdfaXJxcyA9IFNERV9IT1RQTFVHX01BU0tfU1BUOwotCQllbmFibGVkX2lycXMgPSBpbnRl bF9ocGRfZW5hYmxlZF9pcnFzKGRldiwgaHBkX3NwdCk7CiAJfSBlbHNlIHsKIAkJaG90cGx1Z19p cnFzID0gU0RFX0hPVFBMVUdfTUFTS19DUFQ7CiAJCWVuYWJsZWRfaXJxcyA9IGludGVsX2hwZF9l bmFibGVkX2lycXMoZGV2LCBocGRfY3B0KTsKQEAgLTMwNDQsOSArMzA3Myw4IEBAIHN0YXRpYyB2 b2lkIGlieF9ocGRfaXJxX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAKIAkvKgogCSAq IEVuYWJsZSBkaWdpdGFsIGhvdHBsdWcgb24gdGhlIFBDSCwgYW5kIGNvbmZpZ3VyZSB0aGUgRFAg c2hvcnQgcHVsc2UKLQkgKiBkdXJhdGlvbiB0byAybXMgKHdoaWNoIGlzIHRoZSBtaW5pbXVtIGlu IHRoZSBEaXNwbGF5IFBvcnQgc3BlYykKLQkgKgotCSAqIFRoaXMgcmVnaXN0ZXIgaXMgdGhlIHNh bWUgb24gYWxsIGtub3duIFBDSCBjaGlwcy4KKwkgKiBkdXJhdGlvbiB0byAybXMgKHdoaWNoIGlz IHRoZSBtaW5pbXVtIGluIHRoZSBEaXNwbGF5IFBvcnQgc3BlYykuCisJICogVGhlIHB1bHNlIGR1 cmF0aW9uIGJpdHMgYXJlIHJlc2VydmVkIG9uIExQVCsuCiAJICovCiAJaG90cGx1ZyA9IEk5MTVf UkVBRChQQ0hfUE9SVF9IT1RQTFVHKTsKIAlob3RwbHVnICY9IH4oUE9SVERfUFVMU0VfRFVSQVRJ T05fTUFTS3xQT1JUQ19QVUxTRV9EVVJBVElPTl9NQVNLfFBPUlRCX1BVTFNFX0RVUkFUSU9OX01B U0spOwpAQCAtMzA1NCwxMyArMzA4MiwyNyBAQCBzdGF0aWMgdm9pZCBpYnhfaHBkX2lycV9zZXR1 cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCWhvdHBsdWcgfD0gUE9SVENfSE9UUExVR19FTkFC TEUgfCBQT1JUQ19QVUxTRV9EVVJBVElPTl8ybXM7CiAJaG90cGx1ZyB8PSBQT1JUQl9IT1RQTFVH X0VOQUJMRSB8IFBPUlRCX1BVTFNFX0RVUkFUSU9OXzJtczsKIAlJOTE1X1dSSVRFKFBDSF9QT1JU X0hPVFBMVUcsIGhvdHBsdWcpOworfQogCi0JLyogZW5hYmxlIFNQVCBQT1JURSBob3QgcGx1ZyAq LwotCWlmIChIQVNfUENIX1NQVChkZXYpKSB7Ci0JCWhvdHBsdWcgPSBJOTE1X1JFQUQoUENIX1BP UlRfSE9UUExVRzIpOwotCQlob3RwbHVnIHw9IFBPUlRFX0hPVFBMVUdfRU5BQkxFOwotCQlJOTE1 X1dSSVRFKFBDSF9QT1JUX0hPVFBMVUcyLCBob3RwbHVnKTsKLQl9CitzdGF0aWMgdm9pZCBzcHRf aHBkX2lycV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIGhvdHBsdWdfaXJx cywgaG90cGx1ZywgZW5hYmxlZF9pcnFzOworCisJaG90cGx1Z19pcnFzID0gU0RFX0hPVFBMVUdf TUFTS19TUFQ7CisJZW5hYmxlZF9pcnFzID0gaW50ZWxfaHBkX2VuYWJsZWRfaXJxcyhkZXYsIGhw ZF9zcHQpOworCisJaWJ4X2Rpc3BsYXlfaW50ZXJydXB0X3VwZGF0ZShkZXZfcHJpdiwgaG90cGx1 Z19pcnFzLCBlbmFibGVkX2lycXMpOworCisJLyogRW5hYmxlIGRpZ2l0YWwgaG90cGx1ZyBvbiB0 aGUgUENIICovCisJaG90cGx1ZyA9IEk5MTVfUkVBRChQQ0hfUE9SVF9IT1RQTFVHKTsKKwlob3Rw bHVnIHw9IFBPUlREX0hPVFBMVUdfRU5BQkxFIHwgUE9SVENfSE9UUExVR19FTkFCTEUgfAorCQlQ T1JUQl9IT1RQTFVHX0VOQUJMRTsKKwlJOTE1X1dSSVRFKFBDSF9QT1JUX0hPVFBMVUcsIGhvdHBs dWcpOworCisJaG90cGx1ZyA9IEk5MTVfUkVBRChQQ0hfUE9SVF9IT1RQTFVHMik7CisJaG90cGx1 ZyB8PSBQT1JURV9IT1RQTFVHX0VOQUJMRTsKKwlJOTE1X1dSSVRFKFBDSF9QT1JUX0hPVFBMVUcy LCBob3RwbHVnKTsKIH0KIAogc3RhdGljIHZvaWQgYnh0X2hwZF9pcnFfc2V0dXAoc3RydWN0IGRy bV9kZXZpY2UgKmRldikKQEAgLTQxNjUsMTAgKzQyMDcsMTIgQEAgdm9pZCBpbnRlbF9pcnFfaW5p dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiAJCWRldi0+ZHJpdmVyLT5pcnFf dW5pbnN0YWxsID0gZ2VuOF9pcnFfdW5pbnN0YWxsOwogCQlkZXYtPmRyaXZlci0+ZW5hYmxlX3Zi bGFuayA9IGdlbjhfZW5hYmxlX3ZibGFuazsKIAkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5r ID0gZ2VuOF9kaXNhYmxlX3ZibGFuazsKLQkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJCWRl dl9wcml2LT5kaXNwbGF5LmhwZF9pcnFfc2V0dXAgPSBpYnhfaHBkX2lycV9zZXR1cDsKLQkJZWxz ZQorCQlpZiAoSVNfQlJPWFRPTihkZXYpKQogCQkJZGV2X3ByaXYtPmRpc3BsYXkuaHBkX2lycV9z ZXR1cCA9IGJ4dF9ocGRfaXJxX3NldHVwOworCQllbHNlIGlmIChIQVNfUENIX1NQVChkZXYpKQor CQkJZGV2X3ByaXYtPmRpc3BsYXkuaHBkX2lycV9zZXR1cCA9IHNwdF9ocGRfaXJxX3NldHVwOwor CQllbHNlCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5ocGRfaXJxX3NldHVwID0gaWJ4X2hwZF9pcnFf c2V0dXA7CiAJfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpIHsKIAkJZGV2LT5kcml2ZXIt PmlycV9oYW5kbGVyID0gaXJvbmxha2VfaXJxX2hhbmRsZXI7CiAJCWRldi0+ZHJpdmVyLT5pcnFf cHJlaW5zdGFsbCA9IGlyb25sYWtlX2lycV9yZXNldDsKLS0gCjIuNC42CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0 CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=