From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754799AbdCGDFf (ORCPT ); Mon, 6 Mar 2017 22:05:35 -0500 Received: from ozlabs.org ([103.22.144.67]:33657 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754773AbdCGDEe (ORCPT ); Mon, 6 Mar 2017 22:04:34 -0500 Date: Tue, 7 Mar 2017 10:48:03 +1100 From: Stephen Rothwell To: Daniel Vetter , Intel Graphics , DRI Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Noralf =?UTF-8?B?VHLDuG5uZXM=?= , Chris Wilson , Lyude Subject: linux-next: manual merge of the drm-misc tree with the drm-intel tree Message-ID: <20170307104803.63b3f3cb@canb.auug.org.au> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi all, Today's linux-next merge of the drm-misc tree got a conflict in: drivers/gpu/drm/i915/i915_debugfs.c between commits: 418e3cd80051 ("drm/i915: Show the current i915_params in debugfs/i915_capabilites") 317eaa95081b ("drm/i915/debugfs: Add i915_hpd_storm_ctl") from the drm-intel tree and commit: b05eeb0f47a3 ("drm/i915: Remove i915_debugfs_unregister()") from the drm-misc tree. I fixed it up (see below) and can carry the fix as necessary. This is now fixed as far as linux-next is concerned, but any non trivial conflicts should be mentioned to your upstream maintainer when your tree is submitted for merging. You may also want to consider cooperating with the maintainer of the conflicting tree to minimise any particularly complex conflicts. -- Cheers, Stephen Rothwell diff --cc drivers/gpu/drm/i915/i915_debugfs.c index 478f19d2f3d8,7d7244798507..000000000000 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@@ -35,49 -35,6 +35,23 @@@ static inline struct drm_i915_private * return to_i915(node->minor->dev); } - /* As the drm_debugfs_init() routines are called before dev->dev_private is - * allocated we need to hook into the minor for release. */ - static int - drm_add_fake_info_node(struct drm_minor *minor, - struct dentry *ent, - const void *key) - { - struct drm_info_node *node; - - node = kmalloc(sizeof(*node), GFP_KERNEL); - if (node == NULL) { - debugfs_remove(ent); - return -ENOMEM; - } - - node->minor = minor; - node->dent = ent; - node->info_ent = (void *)key; - - mutex_lock(&minor->debugfs_lock); - list_add(&node->list, &minor->debugfs_list); - mutex_unlock(&minor->debugfs_lock); - - return 0; - } - +static __always_inline void seq_print_param(struct seq_file *m, + const char *name, + const char *type, + const void *x) +{ + if (!__builtin_strcmp(type, "bool")) + seq_printf(m, "i915.%s=%s\n", name, yesno(*(const bool *)x)); + else if (!__builtin_strcmp(type, "int")) + seq_printf(m, "i915.%s=%d\n", name, *(const int *)x); + else if (!__builtin_strcmp(type, "unsigned int")) + seq_printf(m, "i915.%s=%u\n", name, *(const unsigned int *)x); + else if (!__builtin_strcmp(type, "char *")) + seq_printf(m, "i915.%s=%s\n", name, *(const char **)x); + else + BUILD_BUG(); +} + static int i915_capabilities(struct seq_file *m, void *data) { struct drm_i915_private *dev_priv = node_to_i915(m->private); @@@ -4646,112 -4567,6 +4620,81 @@@ static const struct file_operations i91 .release = i915_forcewake_release, }; - static int i915_forcewake_create(struct dentry *root, struct drm_minor *minor) - { - struct dentry *ent; - - ent = debugfs_create_file("i915_forcewake_user", - S_IRUSR, - root, to_i915(minor->dev), - &i915_forcewake_fops); - if (!ent) - return -ENOMEM; - - return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops); - } - +static int i915_hpd_storm_ctl_show(struct seq_file *m, void *data) +{ + struct drm_i915_private *dev_priv = m->private; + struct i915_hotplug *hotplug = &dev_priv->hotplug; + + seq_printf(m, "Threshold: %d\n", hotplug->hpd_storm_threshold); + seq_printf(m, "Detected: %s\n", + yesno(delayed_work_pending(&hotplug->reenable_work))); + + return 0; +} + +static ssize_t i915_hpd_storm_ctl_write(struct file *file, + const char __user *ubuf, size_t len, + loff_t *offp) +{ + struct seq_file *m = file->private_data; + struct drm_i915_private *dev_priv = m->private; + struct i915_hotplug *hotplug = &dev_priv->hotplug; + unsigned int new_threshold; + int i; + char *newline; + char tmp[16]; + + if (len >= sizeof(tmp)) + return -EINVAL; + + if (copy_from_user(tmp, ubuf, len)) + return -EFAULT; + + tmp[len] = '\0'; + + /* Strip newline, if any */ + newline = strchr(tmp, '\n'); + if (newline) + *newline = '\0'; + + if (strcmp(tmp, "reset") == 0) + new_threshold = HPD_STORM_DEFAULT_THRESHOLD; + else if (kstrtouint(tmp, 10, &new_threshold) != 0) + return -EINVAL; + + if (new_threshold > 0) + DRM_DEBUG_KMS("Setting HPD storm detection threshold to %d\n", + new_threshold); + else + DRM_DEBUG_KMS("Disabling HPD storm detection\n"); + + spin_lock_irq(&dev_priv->irq_lock); + hotplug->hpd_storm_threshold = new_threshold; + /* Reset the HPD storm stats so we don't accidentally trigger a storm */ + for_each_hpd_pin(i) + hotplug->stats[i].count = 0; + spin_unlock_irq(&dev_priv->irq_lock); + + /* Re-enable hpd immediately if we were in an irq storm */ + flush_delayed_work(&dev_priv->hotplug.reenable_work); + + return len; +} + +static int i915_hpd_storm_ctl_open(struct inode *inode, struct file *file) +{ + return single_open(file, i915_hpd_storm_ctl_show, inode->i_private); +} + +static const struct file_operations i915_hpd_storm_ctl_fops = { + .owner = THIS_MODULE, + .open = i915_hpd_storm_ctl_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .write = i915_hpd_storm_ctl_write +}; + - static int i915_debugfs_create(struct dentry *root, - struct drm_minor *minor, - const char *name, - const struct file_operations *fops) - { - struct dentry *ent; - - ent = debugfs_create_file(name, - S_IRUGO | S_IWUSR, - root, to_i915(minor->dev), - fops); - if (!ent) - return -ENOMEM; - - return drm_add_fake_info_node(minor, ent, fops); - } - static const struct drm_info_list i915_debugfs_list[] = { {"i915_capabilities", i915_capabilities, 0}, {"i915_gem_objects", i915_gem_object_info, 0}, From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Rothwell Subject: linux-next: manual merge of the drm-misc tree with the drm-intel tree Date: Tue, 7 Mar 2017 10:48:03 +1100 Message-ID: <20170307104803.63b3f3cb@canb.auug.org.au> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter , Intel Graphics , DRI Cc: Lyude , linux-next@vger.kernel.org, linux-kernel@vger.kernel.org List-Id: linux-next.vger.kernel.org SGkgYWxsLAoKVG9kYXkncyBsaW51eC1uZXh0IG1lcmdlIG9mIHRoZSBkcm0tbWlzYyB0cmVlIGdv dCBhIGNvbmZsaWN0IGluOgoKICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwoK YmV0d2VlbiBjb21taXRzOgoKICA0MThlM2NkODAwNTEgKCJkcm0vaTkxNTogU2hvdyB0aGUgY3Vy cmVudCBpOTE1X3BhcmFtcyBpbiBkZWJ1Z2ZzL2k5MTVfY2FwYWJpbGl0ZXMiKQogIDMxN2VhYTk1 MDgxYiAoImRybS9pOTE1L2RlYnVnZnM6IEFkZCBpOTE1X2hwZF9zdG9ybV9jdGwiKQoKZnJvbSB0 aGUgZHJtLWludGVsIHRyZWUgYW5kIGNvbW1pdDoKCiAgYjA1ZWViMGY0N2EzICgiZHJtL2k5MTU6 IFJlbW92ZSBpOTE1X2RlYnVnZnNfdW5yZWdpc3RlcigpIikKCmZyb20gdGhlIGRybS1taXNjIHRy ZWUuCgpJIGZpeGVkIGl0IHVwIChzZWUgYmVsb3cpIGFuZCBjYW4gY2FycnkgdGhlIGZpeCBhcyBu ZWNlc3NhcnkuIFRoaXMKaXMgbm93IGZpeGVkIGFzIGZhciBhcyBsaW51eC1uZXh0IGlzIGNvbmNl cm5lZCwgYnV0IGFueSBub24gdHJpdmlhbApjb25mbGljdHMgc2hvdWxkIGJlIG1lbnRpb25lZCB0 byB5b3VyIHVwc3RyZWFtIG1haW50YWluZXIgd2hlbiB5b3VyIHRyZWUKaXMgc3VibWl0dGVkIGZv ciBtZXJnaW5nLiAgWW91IG1heSBhbHNvIHdhbnQgdG8gY29uc2lkZXIgY29vcGVyYXRpbmcKd2l0 aCB0aGUgbWFpbnRhaW5lciBvZiB0aGUgY29uZmxpY3RpbmcgdHJlZSB0byBtaW5pbWlzZSBhbnkg cGFydGljdWxhcmx5CmNvbXBsZXggY29uZmxpY3RzLgoKLS0gCkNoZWVycywKU3RlcGhlbiBSb3Ro d2VsbAoKZGlmZiAtLWNjIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCmluZGV4 IDQ3OGYxOWQyZjNkOCw3ZDcyNDQ3OTg1MDcuLjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X2RlYnVnZnMuYwpAQEAgLTM1LDQ5IC0zNSw2ICszNSwyMyBAQEAgc3RhdGljIGlubGluZSBzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqCiAgCXJldHVybiB0b19pOTE1KG5vZGUtPm1pbm9yLT5kZXYp OwogIH0KICAKLSAvKiBBcyB0aGUgZHJtX2RlYnVnZnNfaW5pdCgpIHJvdXRpbmVzIGFyZSBjYWxs ZWQgYmVmb3JlIGRldi0+ZGV2X3ByaXZhdGUgaXMKLSAgKiBhbGxvY2F0ZWQgd2UgbmVlZCB0byBo b29rIGludG8gdGhlIG1pbm9yIGZvciByZWxlYXNlLiAqLwotIHN0YXRpYyBpbnQKLSBkcm1fYWRk X2Zha2VfaW5mb19ub2RlKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yLAotIAkJICAgICAgIHN0cnVj dCBkZW50cnkgKmVudCwKLSAJCSAgICAgICBjb25zdCB2b2lkICprZXkpCi0gewotIAlzdHJ1Y3Qg ZHJtX2luZm9fbm9kZSAqbm9kZTsKLSAKLSAJbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCpub2RlKSwg R0ZQX0tFUk5FTCk7Ci0gCWlmIChub2RlID09IE5VTEwpIHsKLSAJCWRlYnVnZnNfcmVtb3ZlKGVu dCk7Ci0gCQlyZXR1cm4gLUVOT01FTTsKLSAJfQotIAotIAlub2RlLT5taW5vciA9IG1pbm9yOwot IAlub2RlLT5kZW50ID0gZW50OwotIAlub2RlLT5pbmZvX2VudCA9ICh2b2lkICopa2V5OwotIAot IAltdXRleF9sb2NrKCZtaW5vci0+ZGVidWdmc19sb2NrKTsKLSAJbGlzdF9hZGQoJm5vZGUtPmxp c3QsICZtaW5vci0+ZGVidWdmc19saXN0KTsKLSAJbXV0ZXhfdW5sb2NrKCZtaW5vci0+ZGVidWdm c19sb2NrKTsKLSAKLSAJcmV0dXJuIDA7Ci0gfQotIAogK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUg dm9pZCBzZXFfcHJpbnRfcGFyYW0oc3RydWN0IHNlcV9maWxlICptLAogKwkJCQkJICAgIGNvbnN0 IGNoYXIgKm5hbWUsCiArCQkJCQkgICAgY29uc3QgY2hhciAqdHlwZSwKICsJCQkJCSAgICBjb25z dCB2b2lkICp4KQogK3sKICsJaWYgKCFfX2J1aWx0aW5fc3RyY21wKHR5cGUsICJib29sIikpCiAr CQlzZXFfcHJpbnRmKG0sICJpOTE1LiVzPSVzXG4iLCBuYW1lLCB5ZXNubygqKGNvbnN0IGJvb2wg Kil4KSk7CiArCWVsc2UgaWYgKCFfX2J1aWx0aW5fc3RyY21wKHR5cGUsICJpbnQiKSkKICsJCXNl cV9wcmludGYobSwgImk5MTUuJXM9JWRcbiIsIG5hbWUsICooY29uc3QgaW50ICopeCk7CiArCWVs c2UgaWYgKCFfX2J1aWx0aW5fc3RyY21wKHR5cGUsICJ1bnNpZ25lZCBpbnQiKSkKICsJCXNlcV9w cmludGYobSwgImk5MTUuJXM9JXVcbiIsIG5hbWUsICooY29uc3QgdW5zaWduZWQgaW50ICopeCk7 CiArCWVsc2UgaWYgKCFfX2J1aWx0aW5fc3RyY21wKHR5cGUsICJjaGFyICoiKSkKICsJCXNlcV9w cmludGYobSwgImk5MTUuJXM9JXNcbiIsIG5hbWUsICooY29uc3QgY2hhciAqKil4KTsKICsJZWxz ZQogKwkJQlVJTERfQlVHKCk7CiArfQogKwogIHN0YXRpYyBpbnQgaTkxNV9jYXBhYmlsaXRpZXMo c3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogIHsKICAJc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2ID0gbm9kZV90b19pOTE1KG0tPnByaXZhdGUpOwpAQEAgLTQ2NDYsMTEy IC00NTY3LDYgKzQ2MjAsODEgQEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25z IGk5MQogIAkucmVsZWFzZSA9IGk5MTVfZm9yY2V3YWtlX3JlbGVhc2UsCiAgfTsKICAKLSBzdGF0 aWMgaW50IGk5MTVfZm9yY2V3YWtlX2NyZWF0ZShzdHJ1Y3QgZGVudHJ5ICpyb290LCBzdHJ1Y3Qg ZHJtX21pbm9yICptaW5vcikKLSB7Ci0gCXN0cnVjdCBkZW50cnkgKmVudDsKLSAKLSAJZW50ID0g ZGVidWdmc19jcmVhdGVfZmlsZSgiaTkxNV9mb3JjZXdha2VfdXNlciIsCi0gCQkJCSAgU19JUlVT UiwKLSAJCQkJICByb290LCB0b19pOTE1KG1pbm9yLT5kZXYpLAotIAkJCQkgICZpOTE1X2ZvcmNl d2FrZV9mb3BzKTsKLSAJaWYgKCFlbnQpCi0gCQlyZXR1cm4gLUVOT01FTTsKLSAKLSAJcmV0dXJu IGRybV9hZGRfZmFrZV9pbmZvX25vZGUobWlub3IsIGVudCwgJmk5MTVfZm9yY2V3YWtlX2ZvcHMp OwotIH0KLSAKICtzdGF0aWMgaW50IGk5MTVfaHBkX3N0b3JtX2N0bF9zaG93KHN0cnVjdCBzZXFf ZmlsZSAqbSwgdm9pZCAqZGF0YSkKICt7CiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiA9IG0tPnByaXZhdGU7CiArCXN0cnVjdCBpOTE1X2hvdHBsdWcgKmhvdHBsdWcgPSAmZGV2 X3ByaXYtPmhvdHBsdWc7CiArCiArCXNlcV9wcmludGYobSwgIlRocmVzaG9sZDogJWRcbiIsIGhv dHBsdWctPmhwZF9zdG9ybV90aHJlc2hvbGQpOwogKwlzZXFfcHJpbnRmKG0sICJEZXRlY3RlZDog JXNcbiIsCiArCQkgICB5ZXNubyhkZWxheWVkX3dvcmtfcGVuZGluZygmaG90cGx1Zy0+cmVlbmFi bGVfd29yaykpKTsKICsKICsJcmV0dXJuIDA7CiArfQogKwogK3N0YXRpYyBzc2l6ZV90IGk5MTVf aHBkX3N0b3JtX2N0bF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKICsJCQkJCWNvbnN0IGNoYXIg X191c2VyICp1YnVmLCBzaXplX3QgbGVuLAogKwkJCQkJbG9mZl90ICpvZmZwKQogK3sKICsJc3Ry dWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogKwlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPSBtLT5wcml2YXRlOwogKwlzdHJ1Y3QgaTkxNV9ob3RwbHVnICpo b3RwbHVnID0gJmRldl9wcml2LT5ob3RwbHVnOwogKwl1bnNpZ25lZCBpbnQgbmV3X3RocmVzaG9s ZDsKICsJaW50IGk7CiArCWNoYXIgKm5ld2xpbmU7CiArCWNoYXIgdG1wWzE2XTsKICsKICsJaWYg KGxlbiA+PSBzaXplb2YodG1wKSkKICsJCXJldHVybiAtRUlOVkFMOwogKwogKwlpZiAoY29weV9m cm9tX3VzZXIodG1wLCB1YnVmLCBsZW4pKQogKwkJcmV0dXJuIC1FRkFVTFQ7CiArCiArCXRtcFts ZW5dID0gJ1wwJzsKICsKICsJLyogU3RyaXAgbmV3bGluZSwgaWYgYW55ICovCiArCW5ld2xpbmUg PSBzdHJjaHIodG1wLCAnXG4nKTsKICsJaWYgKG5ld2xpbmUpCiArCQkqbmV3bGluZSA9ICdcMCc7 CiArCiArCWlmIChzdHJjbXAodG1wLCAicmVzZXQiKSA9PSAwKQogKwkJbmV3X3RocmVzaG9sZCA9 IEhQRF9TVE9STV9ERUZBVUxUX1RIUkVTSE9MRDsKICsJZWxzZSBpZiAoa3N0cnRvdWludCh0bXAs IDEwLCAmbmV3X3RocmVzaG9sZCkgIT0gMCkKICsJCXJldHVybiAtRUlOVkFMOwogKwogKwlpZiAo bmV3X3RocmVzaG9sZCA+IDApCiArCQlEUk1fREVCVUdfS01TKCJTZXR0aW5nIEhQRCBzdG9ybSBk ZXRlY3Rpb24gdGhyZXNob2xkIHRvICVkXG4iLAogKwkJCSAgICAgIG5ld190aHJlc2hvbGQpOwog KwllbHNlCiArCQlEUk1fREVCVUdfS01TKCJEaXNhYmxpbmcgSFBEIHN0b3JtIGRldGVjdGlvblxu Iik7CiArCiArCXNwaW5fbG9ja19pcnEoJmRldl9wcml2LT5pcnFfbG9jayk7CiArCWhvdHBsdWct PmhwZF9zdG9ybV90aHJlc2hvbGQgPSBuZXdfdGhyZXNob2xkOwogKwkvKiBSZXNldCB0aGUgSFBE IHN0b3JtIHN0YXRzIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSB0cmlnZ2VyIGEgc3Rvcm0gKi8K ICsJZm9yX2VhY2hfaHBkX3BpbihpKQogKwkJaG90cGx1Zy0+c3RhdHNbaV0uY291bnQgPSAwOwog KwlzcGluX3VubG9ja19pcnEoJmRldl9wcml2LT5pcnFfbG9jayk7CiArCiArCS8qIFJlLWVuYWJs ZSBocGQgaW1tZWRpYXRlbHkgaWYgd2Ugd2VyZSBpbiBhbiBpcnEgc3Rvcm0gKi8KICsJZmx1c2hf ZGVsYXllZF93b3JrKCZkZXZfcHJpdi0+aG90cGx1Zy5yZWVuYWJsZV93b3JrKTsKICsKICsJcmV0 dXJuIGxlbjsKICt9CiArCiArc3RhdGljIGludCBpOTE1X2hwZF9zdG9ybV9jdGxfb3BlbihzdHJ1 Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKICt7CiArCXJldHVybiBzaW5nbGVf b3BlbihmaWxlLCBpOTE1X2hwZF9zdG9ybV9jdGxfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7CiAr fQogKwogK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk5MTVfaHBkX3N0b3Jt X2N0bF9mb3BzID0gewogKwkub3duZXIgPSBUSElTX01PRFVMRSwKICsJLm9wZW4gPSBpOTE1X2hw ZF9zdG9ybV9jdGxfb3BlbiwKICsJLnJlYWQgPSBzZXFfcmVhZCwKICsJLmxsc2VlayA9IHNlcV9s c2VlaywKICsJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKICsJLndyaXRlID0gaTkxNV9ocGRf c3Rvcm1fY3RsX3dyaXRlCiArfTsKICsKLSBzdGF0aWMgaW50IGk5MTVfZGVidWdmc19jcmVhdGUo c3RydWN0IGRlbnRyeSAqcm9vdCwKLSAJCQkgICAgICAgc3RydWN0IGRybV9taW5vciAqbWlub3Is Ci0gCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gCQkJICAgICAgIGNvbnN0IHN0cnVjdCBm aWxlX29wZXJhdGlvbnMgKmZvcHMpCi0gewotIAlzdHJ1Y3QgZGVudHJ5ICplbnQ7Ci0gCi0gCWVu dCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwKLSAJCQkJICBTX0lSVUdPIHwgU19JV1VTUiwK LSAJCQkJICByb290LCB0b19pOTE1KG1pbm9yLT5kZXYpLAotIAkJCQkgIGZvcHMpOwotIAlpZiAo IWVudCkKLSAJCXJldHVybiAtRU5PTUVNOwotIAotIAlyZXR1cm4gZHJtX2FkZF9mYWtlX2luZm9f bm9kZShtaW5vciwgZW50LCBmb3BzKTsKLSB9Ci0gCiAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1f aW5mb19saXN0IGk5MTVfZGVidWdmc19saXN0W10gPSB7CiAgCXsiaTkxNV9jYXBhYmlsaXRpZXMi LCBpOTE1X2NhcGFiaWxpdGllcywgMH0sCiAgCXsiaTkxNV9nZW1fb2JqZWN0cyIsIGk5MTVfZ2Vt X29iamVjdF9pbmZvLCAwfSwKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJp LWRldmVsCg==