From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH 6/8] drm/i915: Engine busy time tracking Date: Mon, 25 Sep 2017 16:15:41 +0100 Message-ID: <20170925151543.7395-7-tvrtko.ursulin@linux.intel.com> References: <20170925151543.7395-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr0-x241.google.com (mail-wr0-x241.google.com [IPv6:2a00:1450:400c:c0c::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1738C6E347 for ; Mon, 25 Sep 2017 15:16:00 +0000 (UTC) Received: by mail-wr0-x241.google.com with SMTP id u48so33703wrf.4 for ; Mon, 25 Sep 2017 08:16:00 -0700 (PDT) In-Reply-To: <20170925151543.7395-1-tvrtko.ursulin@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 RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KClRyYWNrIHRv dGFsIHRpbWUgcmVxdWVzdHMgaGF2ZSBiZWVuIGV4ZWN1dGluZyBvbiB0aGUgaGFyZHdhcmUuCgpX ZSBhZGQgbmV3IGtlcm5lbCBBUEkgdG8gYWxsb3cgc29mdHdhcmUgdHJhY2tpbmcgb2YgdGltZSBH UFUKZW5naW5lcyBhcmUgc3BlbmRpbmcgZXhlY3V0aW5nIHJlcXVlc3RzLgoKQm90aCBwZXItZW5n aW5lIGFuZCBnbG9iYWwgQVBJIGlzIGFkZGVkIHdpdGggdGhlIGxhdHRlciBhbHNvCmJlaW5nIGV4 cG9ydGVkIGZvciB1c2UgYnkgZXh0ZXJuYWwgdXNlcnMuCgp2MjoKICogU3F1YXNoZWQgd2l0aCB0 aGUgaW50ZXJuYWwgQVBJLgogKiBEcm9wcGVkIHN0YXRpYyBrZXkuCiAqIE1hZGUgcGVyLWVuZ2lu ZS4KICogU3RvcmUgdGltZSBpbiBtb25vdG9uaWMga3RpbWUuCgp2MzogTW92ZWQgc3RhdHMgY2xl YXJpbmcgdG8gZGlzYWJsZS4KCnY0OgogKiBDb21tZW50cy4KICogRG9uJ3QgZXhwb3J0IHRoZSBB UEkganVzdCB5ZXQuCgp2NTogV2hpdGVzcGFjZSBjbGVhbnVwLgoKdjY6CiAqIFJlbmFtZSByZWYg dG8gYWN0aXZlLgogKiBEcm9wIGVuZ2luZSBhZ2dyZWdhdGUgc3RhdHMgZm9yIG5vdy4KICogQWNj b3VudCBpbml0aWFsIGJ1c3kgcGVyaW9kIGFmdGVyIGVuYWJsaW5nIHN0YXRzLgoKdjc6CiAqIFJl YmFzZS4KClNpZ25lZC1vZmYtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBpbnRl bC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZW5naW5lX2NzLmMgIHwgODQg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF9scmMuYyAgICAgICAgfCAgMiArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVm ZmVyLmggfCA5MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hh bmdlZCwgMTc4IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9lbmdpbmVfY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2VuZ2luZV9j cy5jCmluZGV4IDM1YzExN2MzZmEwZC4uOGRiODNmNTA0ZDcwIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9lbmdpbmVfY3MuYwpAQCAtMjM0LDYgKzIzNCw4IEBAIGludGVsX2VuZ2luZV9zZXR1 cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJLyogTm90aGluZyB0byBkbyBo ZXJlLCBleGVjdXRlIGluIG9yZGVyIG9mIGRlcGVuZGVuY2llcyAqLwogCWVuZ2luZS0+c2NoZWR1 bGUgPSBOVUxMOwogCisJc3Bpbl9sb2NrX2luaXQoJmVuZ2luZS0+c3RhdHMubG9jayk7CisKIAlB VE9NSUNfSU5JVF9OT1RJRklFUl9IRUFEKCZlbmdpbmUtPmNvbnRleHRfc3RhdHVzX25vdGlmaWVy KTsKIAogCWRldl9wcml2LT5lbmdpbmVfY2xhc3NbaW5mby0+Y2xhc3NdW2luZm8tPmluc3RhbmNl XSA9IGVuZ2luZTsKQEAgLTE2MTMsNiArMTYxNSw4OCBAQCBpbnRlbF9lbmdpbmVfbG9va3VwX3Vz ZXIoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsIHU4IGNsYXNzLCB1OCBpbnN0YW5jZSkK IAlyZXR1cm4gaTkxNS0+ZW5naW5lX2NsYXNzW2NsYXNzXVtpbnN0YW5jZV07CiB9CiAKKy8qKgor ICogaW50ZWxfZW5hYmxlX2VuZ2luZV9zdGF0cygpIC0gRW5hYmxlIGVuZ2luZSBidXN5IHRyYWNr aW5nIG9uIGVuZ2luZQorICogQGVuZ2luZTogZW5naW5lIHRvIGVuYWJsZSBzdGF0cyBjb2xsZWN0 aW9uCisgKgorICogU3RhcnQgY29sbGVjdGluZyB0aGUgZW5naW5lIGJ1c3luZXNzIGRhdGEgZm9y IEBlbmdpbmUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJv ciBjb2RlLgorICovCitpbnQgaW50ZWxfZW5hYmxlX2VuZ2luZV9zdGF0cyhzdHJ1Y3QgaW50ZWxf ZW5naW5lX2NzICplbmdpbmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaTkx NV9tb2RwYXJhbXMuZW5hYmxlX2V4ZWNsaXN0cykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmZW5naW5lLT5zdGF0cy5sb2NrLCBmbGFncyk7CisJaWYgKGVuZ2luZS0+ c3RhdHMuZW5hYmxlZCA9PSB+MCkKKwkJZ290byBidXN5OworCWlmIChlbmdpbmUtPnN0YXRzLmVu YWJsZWQrKyA9PSAwKQorCQllbmdpbmUtPnN0YXRzLmVuYWJsZWRfYXQgPSBrdGltZV9nZXQoKTsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmdpbmUtPnN0YXRzLmxvY2ssIGZsYWdzKTsKKwor CXJldHVybiAwOworCitidXN5OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZ2luZS0+c3Rh dHMubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworLyoqCisgKiBpbnRlbF9k aXNhYmxlX2VuZ2luZV9zdGF0cygpIC0gRGlzYWJsZSBlbmdpbmUgYnVzeSB0cmFja2luZyBvbiBl bmdpbmUKKyAqIEBlbmdpbmU6IGVuZ2luZSB0byBkaXNhYmxlIHN0YXRzIGNvbGxlY3Rpb24KKyAq CisgKiBTdG9wcyBjb2xsZWN0aW5nIHRoZSBlbmdpbmUgYnVzeW5lc3MgZGF0YSBmb3IgQGVuZ2lu ZS4KKyAqLwordm9pZCBpbnRlbF9kaXNhYmxlX2VuZ2luZV9zdGF0cyhzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaTkxNV9t b2RwYXJhbXMuZW5hYmxlX2V4ZWNsaXN0cykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNh dmUoJmVuZ2luZS0+c3RhdHMubG9jaywgZmxhZ3MpOworCVdBUk5fT05fT05DRShlbmdpbmUtPnN0 YXRzLmVuYWJsZWQgPT0gMCk7CisJaWYgKC0tZW5naW5lLT5zdGF0cy5lbmFibGVkID09IDApIHsK KwkJZW5naW5lLT5zdGF0cy5lbmFibGVkX2F0ID0gMDsKKwkJZW5naW5lLT5zdGF0cy5hY3RpdmUg PSAwOworCQllbmdpbmUtPnN0YXRzLnN0YXJ0ID0gMDsKKwkJZW5naW5lLT5zdGF0cy50b3RhbCA9 IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZ2luZS0+c3RhdHMubG9jaywgZmxh Z3MpOworfQorCisvKioKKyAqIGludGVsX2VuZ2luZV9nZXRfYnVzeV90aW1lKCkgLSBSZXR1cm4g Y3VycmVudCBhY2N1bXVsYXRlZCBlbmdpbmUgYnVzeW5lc3MKKyAqIEBlbmdpbmU6IGVuZ2luZSB0 byByZXBvcnQgb24KKyAqCisgKiBSZXR1cm5zIGFjY3VtdWxhdGVkIHRpbWUgQGVuZ2luZSB3YXMg YnVzeSBzaW5jZSBlbmdpbmUgc3RhdHMgd2VyZSBlbmFibGVkLgorICovCitrdGltZV90IGludGVs X2VuZ2luZV9nZXRfYnVzeV90aW1lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sK KwlrdGltZV90IHRvdGFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJx c2F2ZSgmZW5naW5lLT5zdGF0cy5sb2NrLCBmbGFncyk7CisKKwl0b3RhbCA9IGVuZ2luZS0+c3Rh dHMudG90YWw7CisKKwkvKgorCSAqIElmIHRoZSBlbmdpbmUgaXMgZXhlY3V0aW5nIHNvbWV0aGlu ZyBhdCB0aGUgbW9tZW50CisJICogYWRkIGl0IHRvIHRoZSB0b3RhbC4KKwkgKi8KKwlpZiAoZW5n aW5lLT5zdGF0cy5hY3RpdmUpCisJCXRvdGFsID0ga3RpbWVfYWRkKHRvdGFsLAorCQkJCSAga3Rp bWVfc3ViKGt0aW1lX2dldCgpLCBlbmdpbmUtPnN0YXRzLnN0YXJ0KSk7CisKKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZlbmdpbmUtPnN0YXRzLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB0b3Rh bDsKK30KKwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1X1NFTEZURVNUKQogI2luY2x1 ZGUgInNlbGZ0ZXN0cy9tb2NrX2VuZ2luZS5jIgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2xy Yy5jCmluZGV4IDdjZDE0YjcwMWVkNy4uMWU3NDNkM2QxNmNiIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF9scmMuYwpAQCAtMzY2LDEyICszNjYsMTQgQEAgZXhlY2xpc3RzX2NvbnRleHRfc3RhdHVzX2No YW5nZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxLAogc3RhdGljIGlubGluZSB2b2lk CiBleGVjbGlzdHNfY29udGV4dF9zY2hlZHVsZV9pbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVl c3QgKnJxKQogeworCWludGVsX2VuZ2luZV9jb250ZXh0X2luKHJxLT5lbmdpbmUpOwogCWV4ZWNs aXN0c19jb250ZXh0X3N0YXR1c19jaGFuZ2UocnEsIElOVEVMX0NPTlRFWFRfU0NIRURVTEVfSU4p OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGV4ZWNsaXN0c19jb250ZXh0X3NjaGVkdWxlX291 dChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxKQogeworCWludGVsX2VuZ2luZV9jb250 ZXh0X291dChycS0+ZW5naW5lKTsKIAlleGVjbGlzdHNfY29udGV4dF9zdGF0dXNfY2hhbmdlKHJx LCBJTlRFTF9DT05URVhUX1NDSEVEVUxFX09VVCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2lu dGVsX3JpbmdidWZmZXIuaAppbmRleCA3YTkwMWU3NjZkMDMuLjhkYjIyOGViZGIyOCAxMDA2NDQK LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaApAQCAtNTM4LDYgKzUzOCwzOCBAQCBz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzIHsKIAkgKiBjZXJ0YWluIGJpdHMgdG8gZW5jb2RlIHRoZSBj b21tYW5kIGxlbmd0aCBpbiB0aGUgaGVhZGVyKS4KIAkgKi8KIAl1MzIgKCpnZXRfY21kX2xlbmd0 aF9tYXNrKSh1MzIgY21kX2hlYWRlcik7CisKKwlzdHJ1Y3QgeworCQkvKioKKwkJICogQGxvY2s6 IExvY2sgcHJvdGVjdGluZyB0aGUgYmVsb3cgZmllbGRzLgorCQkgKi8KKwkJc3BpbmxvY2tfdCBs b2NrOworCQkvKioKKwkJICogQGVuYWJsZWQ6IFJlZmVyZW5jZSBjb3VudCBpbmRpY2F0aW5nIG51 bWJlciBvZiBsaXN0ZW5lcnMuCisJCSAqLworCQl1bnNpZ25lZCBpbnQgZW5hYmxlZDsKKwkJLyoq CisJCSAqIEBhY3RpdmU6IE51bWJlciBvZiBjb250ZXh0cyBjdXJyZW50bHkgc2NoZWR1bGVkIGlu LgorCQkgKi8KKwkJdW5zaWduZWQgaW50IGFjdGl2ZTsKKwkJLyoqCisJCSAqIEBlbmFibGVkX2F0 OiBUaW1lc3RhbXAgd2hlbiBidXN5IHN0YXRzIHdlcmUgZW5hYmxlZC4KKwkJICovCisJCWt0aW1l X3QgZW5hYmxlZF9hdDsKKwkJLyoqCisJCSAqIEBzdGFydDogVGltZXN0YW1wIG9mIHRoZSBsYXN0 IGlkbGUgdG8gYWN0aXZlIHRyYW5zaXRpb24uCisJCSAqCisJCSAqIElkbGUgaXMgZGVmaW5lZCBh cyBhY3RpdmUgPT0gMCwgYWN0aXZlIGlzIGFjdGl2ZSA+IDAuCisJCSAqLworCQlrdGltZV90IHN0 YXJ0OworCQkvKioKKwkJICogQHRvdGFsOiBUb3RhbCB0aW1lIHRoaXMgZW5naW5lIHdhcyBidXN5 LgorCQkgKgorCQkgKiBBY2N1bXVsYXRlZCB0aW1lIG5vdCBjb3VudGluZyB0aGUgbW9zdCByZWNl bnQgYmxvY2sgaW4gY2FzZXMKKwkJICogd2hlcmUgZW5naW5lIGlzIGN1cnJlbnRseSBidXN5IChh Y3RpdmUgPiAwKS4KKwkJICovCisJCWt0aW1lX3QgdG90YWw7CisJfSBzdGF0czsKIH07CiAKIHN0 YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CkBAIC04NTksNCArODkxLDY0IEBAIGJvb2wgaW50ZWxf ZW5naW5lX2Nhbl9zdG9yZV9kd29yZChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpOwog c3RydWN0IGludGVsX2VuZ2luZV9jcyAqCiBpbnRlbF9lbmdpbmVfbG9va3VwX3VzZXIoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsIHU4IGNsYXNzLCB1OCBpbnN0YW5jZSk7CiAKK3N0YXRp YyBpbmxpbmUgdm9pZCBpbnRlbF9lbmdpbmVfY29udGV4dF9pbihzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChSRUFEX09OQ0Uo ZW5naW5lLT5zdGF0cy5lbmFibGVkKSA9PSAwKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJx c2F2ZSgmZW5naW5lLT5zdGF0cy5sb2NrLCBmbGFncyk7CisKKwlpZiAoZW5naW5lLT5zdGF0cy5l bmFibGVkID4gMCkgeworCQlpZiAoZW5naW5lLT5zdGF0cy5hY3RpdmUrKyA9PSAwKQorCQkJZW5n aW5lLT5zdGF0cy5zdGFydCA9IGt0aW1lX2dldCgpOworCQlHRU1fQlVHX09OKGVuZ2luZS0+c3Rh dHMuYWN0aXZlID09IDApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZ2luZS0+ c3RhdHMubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfZW5naW5l X2NvbnRleHRfb3V0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCisJaWYgKFJFQURfT05DRShlbmdpbmUtPnN0YXRzLmVuYWJsZWQpID09 IDApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbmdpbmUtPnN0YXRzLmxvY2ss IGZsYWdzKTsKKworCWlmIChlbmdpbmUtPnN0YXRzLmVuYWJsZWQgPiAwKSB7CisJCWt0aW1lX3Qg bGFzdCwgbm93ID0ga3RpbWVfZ2V0KCk7CisKKwkJaWYgKGVuZ2luZS0+c3RhdHMuYWN0aXZlICYm IC0tZW5naW5lLT5zdGF0cy5hY3RpdmUgPT0gMCkgeworCQkJLyoKKwkJCSAqIERlY3JlbWVudCB0 aGUgYWN0aXZlIGNvbnRleHQgY291bnQgYW5kIGluIGNhc2UgR1BVCisJCQkgKiBpcyBub3cgaWRs ZSBhZGQgdXAgdG8gdGhlIHJ1bm5pbmcgdG90YWwuCisJCQkgKi8KKwkJCWxhc3QgPSBrdGltZV9z dWIobm93LCBlbmdpbmUtPnN0YXRzLnN0YXJ0KTsKKworCQkJZW5naW5lLT5zdGF0cy50b3RhbCA9 IGt0aW1lX2FkZChlbmdpbmUtPnN0YXRzLnRvdGFsLAorCQkJCQkJCWxhc3QpOworCQl9IGVsc2Ug aWYgKGVuZ2luZS0+c3RhdHMuYWN0aXZlID09IDApIHsKKwkJCS8qCisJCQkgKiBBZnRlciB0dXJu aW5nIG9uIGVuZ2luZSBzdGF0cywgY29udGV4dCBvdXQgbWlnaHQgYmUKKwkJCSAqIHRoZSBmaXJz dCBldmVudCBpbiB3aGljaCBjYXNlIHdlIGFjY291bnQgZnJvbSB0aGUKKwkJCSAqIHRpbWUgc3Rh dHMgZ2F0aGVyaW5nIHdhcyB0dXJuZWQgb24uCisJCQkgKi8KKwkJCWxhc3QgPSBrdGltZV9zdWIo bm93LCBlbmdpbmUtPnN0YXRzLmVuYWJsZWRfYXQpOworCisJCQllbmdpbmUtPnN0YXRzLnRvdGFs ID0ga3RpbWVfYWRkKGVuZ2luZS0+c3RhdHMudG90YWwsCisJCQkJCQkJbGFzdCk7CisJCX0KKwl9 CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmdpbmUtPnN0YXRzLmxvY2ssIGZsYWdzKTsK K30KKworaW50IGludGVsX2VuYWJsZV9lbmdpbmVfc3RhdHMoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lKTsKK3ZvaWQgaW50ZWxfZGlzYWJsZV9lbmdpbmVfc3RhdHMoc3RydWN0IGludGVs X2VuZ2luZV9jcyAqZW5naW5lKTsKKwora3RpbWVfdCBpbnRlbF9lbmdpbmVfZ2V0X2J1c3lfdGlt ZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpOworCiAjZW5kaWYgLyogX0lOVEVMX1JJ TkdCVUZGRVJfSF8gKi8KLS0gCjIuOS41CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9pbnRlbC1nZngK