Name: series-workflowrfgbf Phase: Succeeded StartedAt: 2026-08-07 20:46:15 +0000 UTC FinishedAt: 2026-08-08 00:46:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[0] Phase: Succeeded StartedAt: 2026-08-07 20:46:15 +0000 UTC FinishedAt: 2026-08-07 21:04:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[0].run-triage Phase: Succeeded StartedAt: 2026-08-07 20:46:15 +0000 UTC FinishedAt: 2026-08-07 21:04:09 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "5cbef379a94b161726c5f504598bf4791d45cedc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BLK_CGROUP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "5cbef379a94b161726c5f504598bf4791d45cedc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BLK_CGROUP" ], "series_id": "ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "fs" ], "focus_symbols": [ "bpf_get_root_blkcg", "bpf_get_blkcg", "bpf_put_blkcg", "bpf_blkcg_flush_stats", "bpf_iter_blkg_new", "bpf_iter_blkg_next", "bpf_iter_blkg_destroy", "bpf_blkg_iostat_bytes", "bpf_blkg_iostat_ios", "bpf_blkg_dev", "blkcg_fill_root_iostats" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfZ2V0X3Jvb3RfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX2dldF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfcHV0X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2lvc3RhdF9ieXRlcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfaW9zJiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2RldiYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBUaGVzZSBrZnVuY3MgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBoYW5kbGUgdmFyaW91cyBpbnB1dHMgYW5kIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBzYWZlbHkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyY2ExOWE4YTI0ODg3Mjg4OGRlMWE1YmU3ZDY3ODM4YTJmMmE0MjE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTXG5AQCAtNjYxNyw2ICYjNDM7NjYxNyw3IEBAIEY6XHRibG9jay9ibGstY2dyb3VwLmNcbiBGOlx0YmxvY2svYmxrLWlvY29zdC5jXG4gRjpcdGJsb2NrL2Jsay1pb2xhdGVuY3kuY1xuIEY6XHRibG9jay9ibGstdGhyb3R0bGUuY1xuJiM0MztGOlx0YmxvY2svYnBmX2Jsa2NnLmNcbiBGOlx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcbiBcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTE3LDYgJiM0MzsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSAmIzQzOz0gZXJyb3ItaW5qZWN0aW9uLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dfQ09NTU9OKSAmIzQzOz0gYnNnLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXHQmIzQzOz0gYnNnLWxpYi5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQmIzQzOz0gYmxrLWNncm91cC5vXG4mIzQzO2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuJiM0MztvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCYjNDM7PSBicGZfYmxrY2cub1xuJiM0MztlbmRpZlxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcdCYjNDM7PSBibGstY2dyb3VwLXJ3c3RhdC5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICYjNDM7PSBibGstY2dyb3VwLWZjLWFwcGlkLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HKVx0JiM0Mzs9IGJsay10aHJvdHRsZS5vXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmNcbkBAIC0xMDg2LDcgJiM0MzsxMDg2LDcgQEAgc3RhdGljIHZvaWQgYmxrY2dfcnN0YXRfZmx1c2goc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcywgaW50IGNwdSlcbiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAmIzM5O3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXRcbiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuJiM0Mzt2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4ge1xuIFx0c3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmhcbkBAIC0yMDUsNiAmIzQzOzIwNSw3IEBAIHZvaWQgYmxrY2dfZGVhY3RpdmF0ZV9wb2xpY3koc3RydWN0IGdlbmRpc2sgKmRpc2ssXG4gXHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpO1xuIFxuIGNvbnN0IGNoYXIgKmJsa2dfZGV2X25hbWUoc3RydWN0IGJsa2NnX2dxICpibGtnKTtcbiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTtcbiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csXG4gXHRcdCAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLFxuIFx0XHRcdFx0ICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40OGE4NmYwN2UxOThhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9icGZfYmxrY2cuY1xuQEAgLTAsMCAmIzQzOzEsMzE1IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4mIzQzOy8qXG4mIzQzOyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZXNlIGxldCBhIEJQRiBwcm9ncmFtIHJlYWQgYSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcbiYjNDM7ICogY2dyb3VwJiMzOTtzIGNzcyBpbnRvIGEgc3RydWN0IGJsa2NnIHdpdGggYnBmX2dldF9ibGtjZygpLCBmbHVzaGVzIHRoZSBzdGF0cyB3aXRoXG4mIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtncyB3aXRoIHRoZVxuJiM0MzsgKiBicGZfaXRlcl9ibGtnIG9wZW4tY29kZWQgaXRlcmF0b3IsIHJlYWRpbmcgZWFjaCBkZXZpY2UmIzM5O3MgY291bnRlcnMgd2l0aFxuJiM0MzsgKiBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoKS9icGZfYmxrZ19pb3N0YXRfaW9zKCkuIEl0IG1pcnJvcnMgdGhlIG1lbW9yeVxuJiM0MzsgKiBjb250cm9sbGVyIGtmdW5jcyBpbiBtbS9icGZfbWVtY29udHJvbC5jLCBidXQgYWRkcyBhIHBlci1kZXZpY2UgZGltZW5zaW9uOlxuJiM0MzsgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBmaWxlIGxpdmVzIGluIGJsb2NrLyBiZWNhdXNlIHRoZSBibGtjZy9ibGtnIHN0cnVjdCBsYXlvdXRzIGFyZSBwcml2YXRlXG4mIzQzOyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibGstY2dyb3VwLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBmdW5jdGlvbiBoYXMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MsIGV2ZW4gdGhvdWdoIHRoZSByb290IGJsb2NrIGNncm91cCBpc1xuJiM0MzsgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJiMzOTt0IHJlcXVpcmUgcmVmZXJlbmNlIGNvdW50aW5nLiBJdCYjMzk7cyBzYWZlIHRvIHBhc3MgaXRcbiYjNDM7ICogdG8gYnBmX3B1dF9ibGtjZygpLlxuJiM0MzsgKlxuJiM0MzsgKiBOb3RlIHRoYXQgdGhlIHJvb3QgY2dyb3VwIGlzIHNwZWNpYWw6IGl0cyBjb3VudGVycyBhcmUgdGhlIGRpc2tzJiMzOTsgb3duXG4mIzQzOyAqIHN0YXRpc3RpY3MsIHNvIHRoZXkgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTyByYXRoZXIgdGhhbiBvbmx5IHRoZSByb290JiMzOTtzLlxuJiM0MzsgKiBUaGlzIG1hdGNoZXMgd2hhdCB0aGUgcm9vdCBpby5zdGF0IGZpbGUgcHJpbnRzLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfcm9vdF9ibGtjZyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cbiYjNDM7XHRyZXR1cm4gXHUwMDI2YmxrY2dfcm9vdDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXBcbiYjNDM7ICogQGNzczogcG9pbnRlciB0byB0aGUgY3NzIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBJdCYjMzk7cyBmaW5lIHRvIHBhc3MgYSBjc3Mgd2hpY2ggYmVsb25ncyB0byBhbnkgY2dyb3VwIGNvbnRyb2xsZXIsXG4mIzQzOyAqIGUuZy4gdW5pZmllZCBoaWVyYXJjaHkmIzM5O3MgbWFpbiBjc3MuXG4mIzQzOyAqXG4mIzQzOyAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgYmxrY2cgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3NzJiMzOTtzXG4mIzQzOyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfYmxrY2coc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibGtjZyAqYmxrY2cgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRpZiAoY3NzLVx1MDAzZXNzID09IFx1MDAyNmlvX2NncnBfc3Vic3lzKVxuJiM0MztcdFx0cmV0dXJuIGNzc190cnlnZXQoY3NzKSA/IGNzc190b19ibGtjZyhjc3MpIDogTlVMTDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTb21lIG90aGVyIGNvbnRyb2xsZXImIzM5O3MgY3NzLCBvciB0aGUgY2dyb3VwJiMzOTtzIG93biBvbmUuIExvb2sgdXAgdGhlIGlvXG4mIzQzO1x0ICogY29udHJvbGxlciYjMzk7cyBjc3M7IHJjdSBrZWVwcyBpdCBhbGl2ZSBiZXR3ZWVuIHRoZSBsb2FkIGFuZCB0aGUgdHJ5Z2V0LlxuJiM0MztcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLyYjMzk7cyBsb2NrXG4mIzQzO1x0ICogY29udGV4dCBhbmFseXNpcyBjYW4gZm9sbG93IGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNzcy1cdTAwM2VjZ3JvdXAtXHUwMDNlc3Vic3lzW2lvX2NncnBfaWRdKTtcbiYjNDM7XHRpZiAoY3NzIFx1MDAyNlx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXG4mIzQzO1x0XHRibGtjZyA9IGNzc190b19ibGtjZyhjc3MpO1xuJiM0MztcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYmxrY2c7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHV0X2Jsa2NnIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgYmxvY2sgY2dyb3VwXG4mIzQzOyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcbiYjNDM7ICpcbiYjNDM7ICogUmVsZWFzZXMgYSBwcmV2aW91c2x5IGFjcXVpcmVkIGJsa2NnIHJlZmVyZW5jZS5cbiYjNDM7ICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX3B1dF9ibGtjZyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKVxuJiM0Mzt7XG4mIzQzO1x0Y3NzX3B1dChcdTAwMjZibGtjZy1cdTAwM2Vjc3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljc1xuJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cFxuJiM0MzsgKlxuJiM0MzsgKiBDYWxsIHRoaXMgYmVmb3JlIHJlYWRpbmcgY291bnRlcnMgZm9yIHVwLXRvLWRhdGUgdmFsdWVzLiBTbGVlcGFibGUuXG4mIzQzOyAqXG4mIzQzOyAqIEl0IGRvZXMgd2hhdCByZWFkaW5nIHRoZSBpby5zdGF0IGZpbGUgZG9lcywgd2hpY2ggZGlmZmVycyBieSBjZ3JvdXAuIEZvciBhXG4mIzQzOyAqIG5vbi1yb290IGNncm91cCBpdCBmb2xkcyB0aGUgcGVyLWNwdSBkZWx0YXMgaW50byB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzXG4mIzQzOyAqIGFuZCB1cCB0aGUgY2dyb3VwIHRyZWUuIFRoZSByb290IGNncm91cCBpcyBub3QgYWNjb3VudGVkIHRocm91Z2ggcnN0YXQgYXRcbiYjNDM7ICogYWxsLCBzbyBmb3IgaXQgdGhlIHBlci1kZXZpY2UgYWdncmVnYXRlcyBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MmIzM5O1xuJiM0MzsgKiBvd24gc3RhdGlzdGljcywgd2hpY2ggY291bnQgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHJvb3QgYnJhbmNoIGlzIG5vdCBzZWxmLWxpbWl0aW5nIHRoZSB3YXkgdGhlIHJzdGF0IG9uZSBpczogaXQgcmVyZWFkc1xuJiM0MzsgKiBldmVyeSBkaXNrIG9uIGV2ZXJ5IGNhbGwsIHdoaWxlIGEgc2Vjb25kIHJzdGF0IGZsdXNoIGZpbmRzIG5vdGhpbmcgbGVmdCB0b1xuJiM0MzsgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXG4mIzQzOyAqIG9uY2UgcmF0aGVyIHRoYW4gb25jZSBwZXIgY2dyb3VwIG9mIGEgd2Fsay5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXG4mIzQzO3tcbiYjNDM7XHRpZiAoIWJsa2NnLVx1MDAzZWNzcy5wYXJlbnQpXG4mIzQzO1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGNzc19yc3RhdF9mbHVzaChcdTAwMjZibGtjZy1cdTAwM2Vjc3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XG4mIzQzO1x0X191NjQgX19vcGFxdWVbMl07XG4mIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4mIzQzO1x0c3RydWN0IGJsa2NnICpibGtjZztcbiYjNDM7XHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtnc1xuJiM0MzsgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemVcbiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrXG4mIzQzOyAqXG4mIzQzOyAqIEVhY2ggeWllbGRlZCBibGtnIGhvbGRzIG9uZSBibG9jayBkZXZpY2UmIzM5O3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGFcbiYjNDM7ICogcGVyLWRldmljZSBsaW5lIG9mIHRoZSBpby5zdGF0IGZpbGUuIE9mZmxpbmUgYmxrZ3MgYXJlIHNraXBwZWQsIGFzIHRoZSBmaWxlXG4mIzQzOyAqIHNraXBzIHRoZW0uIE9uZSBjYXNlIGRpZmZlcnM6IHRoZSBmaWxlIHByaW50cyBubyBsaW5lIGZvciBhIGJsa2cgd2hvc2UgZGlza1xuJiM0MzsgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yXG4mIzQzOyAqIGl0LiBNdXN0IGJlIHVzZWQgaW5zaWRlIGFuIFJDVSByZWFkIHNlY3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCwgc3RydWN0IGJsa2NnICpibGtjZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuJiM0MztcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPVxuJiM0MztcdFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuJiM0MztcbiYjNDM7XHRraXQtXHUwMDNlYmxrY2cgPSBibGtjZztcbiYjNDM7XHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXG4mIzQzOyAqIEBpdDogaXRlcmF0b3JcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XG4mIzQzO1xuJiM0MztcdC8qIENsZWFyZWQgb25jZSB0aGUgd2FsayBpcyBkb25lLCBzZWUgYmVsb3cuICovXG4mIzQzO1x0aWYgKCFraXQtXHUwMDNlYmxrY2cpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFibGtnKVxuJiM0MztcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoXHUwMDI2a2l0LVx1MDAzZWJsa2NnLVx1MDAzZWJsa2dfbGlzdCkpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4mIzQzO1xuJiM0MztcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cbiYjNDM7XHR3aGlsZSAobm9kZSkge1xuJiM0MztcdFx0YmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7XG4mIzQzO1x0XHRpZiAoYmxrZy1cdTAwM2VvbmxpbmUpIHtcbiYjNDM7XHRcdFx0a2l0LVx1MDAzZXBvcyA9IGJsa2c7XG4mIzQzO1x0XHRcdHJldHVybiBibGtnO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yZ2V0IHRoZSBsaXN0IGhlYWQgYXMgd2VsbC4gVGhlIHZlcmlmaWVyIGFzc3VtZXMgdGhhdCBhbiBpdGVyYXRvclxuJiM0MztcdCAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGVcbiYjNDM7XHQgKiBsb29wIGZvciB0ZXJtaW5hdGlvbiBvbmNlIGl0IGhhczsgc3RhcnRpbmcgdGhlIHdhbGsgb3ZlciB3b3VsZCBsZXRcbiYjNDM7XHQgKiBzdWNoIGEgbG9vcCBzcGluIGZvcmV2ZXIuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4mIzQzO1x0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSAtIFRlYXIgZG93biBhIGJsa2cgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBpdGVyYXRvclxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJiMzOTtzIGZsdXNoZWQgaW8uc3RhdCBhZ2dyZWdhdGUuIEBjb3VudGVycyBpcyBvbmVcbiYjNDM7ICogb2YgdGhlIHR3byBhcnJheXMgaW4gYmxrZy1cdTAwM2Vpb3N0YXQuY3VyOyBib3RoIGFyZSBndWFyZGVkIGJ5IHRoYXQgc3RydWN0JiMzOTtzXG4mIzQzOyAqIHNlcWxvY2ssIHRoZSBvbmUgdGhlIGlvLnN0YXQgZmlsZSB1c2VzLiBSZXR1cm5zICh1NjQpLTEgaWYgdGhlIGNvdW50ZXJcbiYjNDM7ICogY2Fubm90IGJlIHJlYWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdTY0IGJsa2dfaW9zdGF0X3JlYWQoc3RydWN0IGJsa2NnX2dxICpibGtnLCBjb25zdCB1NjQgKmNvdW50ZXJzLFxuJiM0MztcdFx0XHQgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJsa2dfaW9zdGF0X3NldCAqYmlzID0gXHUwMDI2YmxrZy1cdTAwM2Vpb3N0YXQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlcTtcbiYjNDM7XHR1NjQgdmFsO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVuc2lnbmVkIGludClydyBcdTAwM2U9IEJMS0dfSU9TVEFUX05SKVxuJiM0MztcdFx0cmV0dXJuICh1NjQpLTE7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogT24gMzItYml0IHRoZSBsb29wIGJlbG93IHJlYWxseSBpcyBhIHNlcWNvdW50IHJldHJ5IGxvb3AuIEV2ZXJ5XG4mIzQzO1x0ICogd3JpdGVyIG9mIGJsa2ctXHUwMDNlaW9zdGF0IGtlZXBzIGludGVycnVwdHMgb2ZmLCBzbyBvbmx5IGFuIE5NSSBjYW4gbGFuZFxuJiM0MztcdCAqIGluc2lkZSBhbiB1cGRhdGUsIGFuZCB0aGVuIHRoZSBsb29wIHdvdWxkIG5ldmVyIGVuZC4gVGhlc2Uga2Z1bmNzXG4mIzQzO1x0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXG4mIzQzO1x0ICogZ2l2ZSB1cCByYXRoZXIgdGhhbiBzcGluLiBPbiA2NC1iaXQgdGhlIGxvb3AgY29tcGlsZXMgYXdheS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcdTAwMjZcdTAwMjYgaW5fbm1pKCkpXG4mIzQzO1x0XHRyZXR1cm4gKHU2NCktMTtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0c2VxID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKFx1MDAyNmJpcy1cdTAwM2VzeW5jKTtcbiYjNDM7XHRcdHZhbCA9IGNvdW50ZXJzW3J3XTtcbiYjNDM7XHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXHUwMDI2YmlzLVx1MDAzZXN5bmMsIHNlcSkpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdmFsO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSYjMzk7cyBpby5zdGF0IGJ5dGUgY291bnRlclxuJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAgKG9uZSBkZXZpY2Ugb2YgYSBibG9jayBjZ3JvdXApXG4mIzQzOyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuJiM0MzsgKlxuJiM0MzsgKiBSZWFkcyB0aGUgZmx1c2hlZCBhZ2dyZWdhdGUsIHNvIGNhbGwgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkgZmlyc3QgZm9yXG4mIzQzOyAqIHVwLXRvLWRhdGUgdmFsdWVzLiBUaGUgcmVhZCB1c2VzIHRoZSB1NjRfc3RhdHMgc2VxbG9jaywgbGlrZSB0aGUgaW8uc3RhdFxuJiM0MzsgKiBmaWxlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoc3RydWN0IGJsa2NnX2dxICpibGtnLFxuJiM0MztcdFx0XHRcdCAgICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlcywgcncpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2lvcyAtIFJlYWQgYSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBJL08gY291bnRcbiYjNDM7ICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuJiM0MzsgKiBAcnc6IHdoaWNoIGNvdW50ZXIgKEJMS0dfSU9TVEFUX1JFQUQgLyBfV1JJVEUgLyBfRElTQ0FSRClcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIEkvT3MsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfaW9zKHN0cnVjdCBibGtjZ19ncSAqYmxrZyxcbiYjNDM7XHRcdFx0XHQgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmlvcywgcncpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2dfZGV2IC0gUmV0dXJuIGEgYmxrZyYjMzk7cyBkZXZpY2UgaWRcbiYjNDM7ICogQGJsa2c6IGJsb2NrIGdyb3VwXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogdGhlIGRldmljZSYjMzk7cyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2dcbiYjNDM7ICogaGFzIG5vIGRpc2suXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZylcbiYjNDM7e1xuJiM0MztcdGlmICghYmxrZy1cdTAwM2VxIHx8ICFibGtnLVx1MDAzZXEtXHUwMDNlZGlzaylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2stXHUwMDNlcGFydDAtXHUwMDNlYmRfZGV2O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuJiM0MztcbiYjNDM7QlRGX0tGVU5DU19TVEFSVChicGZfYmxrY2dfa2Z1bmNzKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2dldF9yb290X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHV0X2Jsa2NnLCBLRl9SRUxFQVNFKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4mIzQzO1xuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXcsIEtGX0lURVJfTkVXIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbiYjNDM7XG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMsIEtGX1JDVSlcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSlcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2RldiwgS0ZfUkNVKVxuJiM0MztCVEZfS0ZVTkNTX0VORChicGZfYmxrY2dfa2Z1bmNzKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9ibGtjZ19rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyXHRcdD0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNmJwZl9ibGtjZ19rZnVuY19zZXQpO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRwcl93YXJuKFwmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBibGtjZyBrZnVuY3M6ICVkXFxuXCYjMzQ7LCBlcnIpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxuQEAgLTAsMCAmIzQzOzEsMTcgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuJiM0MzsjaWZuZGVmIF9fQ0dST1VQX0lURVJfSU9fSFxuJiM0MzsjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuJiM0MztcbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHtcbiYjNDM7XHQvKiBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMgKi9cbiYjNDM7XHRfX3U2NCByYnl0ZXM7XG4mIzQzO1x0X191NjQgd2J5dGVzO1xuJiM0MztcdF9fdTY0IHJpb3M7XG4mIzQzO1x0X191NjQgd2lvcztcbiYjNDM7XHRfX3U2NCBkYnl0ZXM7XG4mIzQzO1x0X191NjQgZGlvcztcbiYjNDM7XHRfX3U2NCBkZXY7XHQvKiBkZXZfdCBvZiB0aGUgZGV2aWNlIHRoZSBjb3VudGVycyBiZWxvbmcgdG8gKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfX0NHUk9VUF9JVEVSX0lPX0ggKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uMjcwZTZiZjkxOTRkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbkBAIC0xLDMgJiM0MzsxLDQgQEBcbiYjNDM7Q09ORklHX0JMS19DR1JPVVA9eVxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxuIENPTkZJR19CT09UUEFSQU1fSEFSRExPQ0tVUF9QQU5JQz15XG4gQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTFcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjMyY2RhODI0MzMxODNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmNcbkBAIC0wLDAgJiM0MzsxLDMxMCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9saWJicGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNtYWNyb3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaGVscGVycy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9pdGVyX2lvLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2l0ZXJfaW8uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNClcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQsIHJldCA9IDA7XG4mIzQzO1x0c3NpemVfdCBieXRlcztcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7YnBmX2l0ZXJfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuJiM0MztcdGJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsIFwmIzM0O3JlYWQgZmRcJiMzNDspKVxuJiM0MztcdFx0cmV0ID0gMTtcbiYjNDM7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcbiYjNDM7ICogZGV2aWNlIHRvIGdlbmVyYXRlIGNncm91cC1jaGFyZ2VkIEkvTyBhZ2FpbnN0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTFcbiYjNDM7ICogaWYgbG9vcCBkZXZpY2VzIGFyZSB1bmF2YWlsYWJsZSAobm9uLXJvb3QgLyBubyBDT05GSUdfQkxLX0RFVl9MT09QKSBzbyB0aGVcbiYjNDM7ICogY2FsbGVyIGNhbiBza2lwLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLFxuJiM0MztcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBiYWNrX3BhdGhbXSA9IFwmIzM0Oy90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCYjMzQ7O1xuJiM0MztcdGludCBucjtcbiYjNDM7XG4mIzQzO1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0KmN0bF9mZCA9IG9wZW4oXCYjMzQ7L2Rldi9sb29wLWNvbnRyb2xcJiMzNDssIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4mIzQzO1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuJiM0MztcdGlmIChuciBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwmIzM0Oy9kZXYvbG9vcCVkXCYjMzQ7LCBucik7XG4mIzQzO1xuJiM0MztcdCpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpO1xuJiM0MztcdGlmICgqYmFja19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcdHVubGluayhiYWNrX3BhdGgpO1xuJiM0MztcdGlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0Kmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHRpZiAoaW9jdGwoKmxvb3BfZmQsIExPT1BfU0VUX0ZELCAqYmFja19mZCkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO2VycjpcbiYjNDM7XHRpZiAoKmxvb3BfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoKmxvb3BfZmQpO1xuJiM0MztcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZSgqYmFja19mZCk7XG4mIzQzO1x0Y2xvc2UoKmN0bF9mZCk7XG4mIzQzO1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCxcbiYjNDM7XHRcdFx0ICBpbnQgYmFja19mZClcbiYjNDM7e1xuJiM0MztcdGludCBuciA9IC0xO1xuJiM0MztcbiYjNDM7XHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdGlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTtcbiYjNDM7XHRcdGNsb3NlKGxvb3BfZmQpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoYmFja19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShiYWNrX2ZkKTtcbiYjNDM7XHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0aWYgKHNzY2FuZihsb29wX3BhdGgsIFwmIzM0Oy9kZXYvbG9vcCVkXCYjMzQ7LCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpO1xuJiM0MztcdFx0Y2xvc2UoY3RsX2ZkKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIE9fRElSRUNUIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuJiM0MztzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpidWY7XG4mIzQzO1x0aW50IGZkLCByZXQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbiYjNDM7XHRcdGdvdG8gb3V0X2ZkO1xuJiM0MztcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4mIzQzO1x0XHRnb3RvIG91dF9idWY7XG4mIzQzO1x0ZnN5bmMoZmQpO1xuJiM0MztcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuJiM0MztcdFx0Z290byBvdXRfYnVmO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO291dF9idWY6XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0MztvdXRfZmQ6XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJiMzOTtzIGlvLnN0YXQgZmlsZSBhbmRcbiYjNDM7ICogZmlsbCBAb3V0LiBAZGV2IGlzIGEga2VybmVsIGRldl90IChhcyByZXR1cm5lZCBieSBicGZfYmxrZ19kZXYpLCB3aG9zZVxuJiM0MzsgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlXG4mIzQzOyAqIGRldmljZSYjMzk7cyBsaW5lIHdhcyBmb3VuZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcGFyc2VfaW9fc3RhdChpbnQgY2dyb3VwX2ZkLCBfX3U2NCBkZXYsIHN0cnVjdCBpb19xdWVyeSAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuJiM0MztcdGNoYXIgYnVmWzQwOTZdLCAqbGluZSwgKnNhdmVwdHI7XG4mIzQzO1x0aW50IGZkLCBuLCByZXQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuYXQoY2dyb3VwX2ZkLCBcJiMzNDtpby5zdGF0XCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdGlmIChuIFx1MDAzYz0gMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRidWZbbl0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcbiYjNDM7XHRmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsIFwmIzM0O1xcblwmIzM0OywgXHUwMDI2c2F2ZXB0cik7IGxpbmU7XG4mIzQzO1x0ICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgXCYjMzQ7XFxuXCYjMzQ7LCBcdTAwMjZzYXZlcHRyKSkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBsb25nIHJiID0gMCwgd2IgPSAwLCByaSA9IDAsIHdpID0gMCwgZGIgPSAwLCBkaSA9IDA7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBcJiMzNDttYWo6bWluXCYjMzQ7IHRva2VuIGlzIGFsd2F5cyBwcmVzZW50OyB0aGUgZmllbGQgYmxvY2sgaXNcbiYjNDM7XHRcdCAqIG9wdGlvbmFsICh0aGUga2VybmVsIG9taXRzIGl0IGZvciBhIGRldmljZSB3aXRoIG5vIHJlYWQvd3JpdGVcbiYjNDM7XHRcdCAqIEkvTyksIHNvIGEgbWF0Y2ggb2YgXHUwMDNlPSAyIGlzIGVub3VnaCBhbmQgYWJzZW50IGZpZWxkcyBzdGF5IDAuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChzc2NhbmYobGluZSxcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7JXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHVcJiMzNDssXG4mIzQzO1x0XHRcdCAgIFx1MDAyNm1haiwgXHUwMDI2bWluLCBcdTAwMjZyYiwgXHUwMDI2d2IsIFx1MDAyNnJpLCBcdTAwMjZ3aSwgXHUwMDI2ZGIsIFx1MDAyNmRpKSBcdTAwM2MgMilcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdieXRlcyA9IHdiO1xuJiM0MztcdFx0b3V0LVx1MDAzZXJpb3MgPSByaTtcbiYjNDM7XHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4mIzQzO1x0XHRvdXQtXHUwMDNlZGJ5dGVzID0gZGI7XG4mIzQzO1x0XHRvdXQtXHUwMDNlZGlvcyA9IGRpO1xuJiM0MztcdFx0cmV0ID0gMDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKmNncm91cF9yZWxfcGF0aCA9IFwmIzM0Oy9jZ3JvdXBfaXRlcl9pb190ZXN0XCYjMzQ7O1xuJiM0MztcdGludCBjdGxfZmQgPSAtMSwgbG9vcF9mZCA9IC0xLCBiYWNrX2ZkID0gLTE7XG4mIzQzO1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMO1xuJiM0MztcdGNoYXIgbG9vcF9wYXRoWzY0XTtcbiYjNDM7XHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4mIzQzO1x0aW50IGNncm91cF9mZDtcbiYjNDM7XG4mIzQzO1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoY2dyb3VwX2ZkLCBcJiMzNDtjZ3JvdXBfc2V0dXBfYW5kX2pvaW5cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4mIzQzO1x0XHR0ZXN0X19za2lwKCk7XHQvKiBuZWVkcyByb290ICYjNDM7IENPTkZJR19CTEtfREVWX0xPT1AgKi9cbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvb3A7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUGluIHRoZSByZWFkIHRvIHRoZSBsb29wIGRldmljZSBzbyB0aGUgbWVhc3VyZWQgZGV2aWNlIGlzIHN0YWJsZSBhbmRcbiYjNDM7XHQgKiBxdWllc2NlZC4gQ29udmVydCB0aGUgZ2xpYmMtZW5jb2RlZCBzdF9yZGV2IHRvIHRoZSBrZXJuZWwgZGV2X3RcbiYjNDM7XHQgKiBlbmNvZGluZyAobWFqb3IgXHUwMDNjXHUwMDNjIDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0e1xuJiM0MztcdFx0c3RydWN0IHN0YXQgbHN0O1xuJiM0MztcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGZzdGF0KGxvb3BfZmQsIFx1MDAyNmxzdCksIFwmIzM0O2ZzdGF0IGxvb3BcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXBfc2tlbDtcbiYjNDM7XHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2V0YXJnZXRfZGV2ID1cbiYjNDM7XHRcdFx0KChfX3U2NCltYWpvcihsc3Quc3RfcmRldikgXHUwMDNjXHUwMDNjIDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xuJiM0MztcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHtcbiYjNDM7XHRcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxuJiM0MztcdFx0LmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksXG4mIzQzO1x0fTtcbiYjNDM7XHRvcHRzLmxpbmtfaW5mbyA9IFx1MDAyNmxpbmZvO1xuJiM0MztcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XG4mIzQzO1xuJiM0MztcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfaW9fcXVlcnksIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihsaW5rLCBcJiMzNDticGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4mIzQzO1xuJiM0MztcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZG9fZGlyZWN0X2lvKGxvb3BfcGF0aCksIFwmIzM0O2RvX2RpcmVjdF9pb1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbGluaztcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCYjMzQ7cmVhZCBzdGF0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbGluaztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxuJiM0MztcdCAqIHBhdHRlcm4gaW4gY2dyb3VwX2l0ZXJfbWVtY2cuXG4mIzQzO1x0ICovXG4mIzQzO1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjZ3JvdXBfaXRlcl9pb19fd3JpdGVcJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2V3Ynl0ZXMsIDAsIFwmIzM0O3dieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2V3aW9zLCAwLCBcJiMzNDt3aW9zXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3JlYWRcJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyYnl0ZXMsIDAsIFwmIzM0O3JieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyaW9zLCAwLCBcJiMzNDtyaW9zXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX2RldlwmIzM0OykpXG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwmIzM0O2RldlwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU3Ryb25nZXIgY2hlY2s6IHRoZSBrZnVuYy1yZWFkIHZhbHVlcyBtdXN0IGVxdWFsIHdoYXQgdGhlIGlvLnN0YXRcbiYjNDM7XHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxuJiM0MztcdCAqIHRoZSBmaWxlIHdpdGggbm8gSS9PIGluIGJldHdlZW4sIHNvIGJvdGggZmx1c2hlZCBzbmFwc2hvdHMgbWF0Y2hcbiYjNDM7XHQgKiBleGFjdGx5LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2Nncm91cF9pdGVyX2lvX19tYXRjaFwmIzM0OykpIHtcbiYjNDM7XHRcdHN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9O1xuJiM0MztcbiYjNDM7XHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCYjMzQ7cmVhZCBzdGF0c1wmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgQVNTRVJUX09LKHBhcnNlX2lvX3N0YXQoY2dyb3VwX2ZkLCBxLVx1MDAzZWRldiwgXHUwMDI2ZmlsZXYpLFxuJiM0MztcdFx0XHQgICAgICBcJiMzNDtwYXJzZSBpby5zdGF0XCYjMzQ7KSkge1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXCYjMzQ7cmJ5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFwmIzM0O3dieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFwmIzM0O3Jpb3NcJiMzNDspO1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcJiMzNDt3aW9zXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFwmIzM0O2RieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFwmIzM0O2Rpb3NcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTZXBhcmF0ZSBwcm9ncmFtIGZvciB0aGUgcm9vdCBibG9jayBjZ3JvdXAuIEl0cyBjb3VudGVycyBkbyBub3QgY29tZVxuJiM0MztcdCAqIGZyb20gcnN0YXQsIHRoZXkgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMsIHNvIHRoaXNcbiYjNDM7XHQgKiBjb3ZlcnMgdGhlIG90aGVyIGhhbGYgb2YgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZXkgY292ZXIgZXZlcnlcbiYjNDM7XHQgKiBjZ3JvdXAmIzM5O3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXG4mIzQzO1x0ICogdGhleSBtdXN0IGJlIGF0IG9yIGFib3ZlIHdoYXQgdGhlIHRlc3QgY2dyb3VwIHdhcyBjaGFyZ2VkLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2Nncm91cF9pdGVyX2lvX19yb290XCYjMzQ7KSkge1xuJiM0MztcdFx0c3RydWN0IGJwZl9saW5rICpyb290X2xpbms7XG4mIzQzO1x0XHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XG4mIzQzO1xuJiM0MztcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnID0gMDtcbiYjNDM7XHRcdHJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9yb290X2Jsa2NnX3F1ZXJ5LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcJiMzNDthdHRhY2ggcm9vdCBpdGVyXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCYjMzQ7cmVhZCByb290IHN0YXRzXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnLCAxLFxuJiM0MztcdFx0XHRcdFx0ICBcJiMzNDtnb3Rfcm9vdF9ibGtjZ1wmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0VRKHItXHUwMDNlZGV2LCBxLVx1MDAzZWRldiwgXCYjMzQ7cm9vdCBkZXZcJiMzNDspO1xuJiM0MztcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdieXRlcywgcS1cdTAwM2V3Ynl0ZXMsIFwmIzM0O3Jvb3Qgd2J5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3aW9zLCBxLVx1MDAzZXdpb3MsIFwmIzM0O3Jvb3Qgd2lvc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmJ5dGVzLCBxLVx1MDAzZXJieXRlcywgXCYjMzQ7cm9vdCByYnl0ZXNcJiMzNDspO1xuJiM0MztcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJpb3MsIHEtXHUwMDNlcmlvcywgXCYjMzQ7cm9vdCByaW9zXCYjMzQ7KTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRicGZfbGlua19fZGVzdHJveShyb290X2xpbmspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO2NsZWFudXBfbGluazpcbiYjNDM7XHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbiYjNDM7Y2xlYW51cF9za2VsOlxuJiM0MztcdGNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpO1xuJiM0MztjbGVhbnVwX2xvb3A6XG4mIzQzO1x0bG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7XG4mIzQzO2NsZWFudXBfY2dyb3VwX2ZkOlxuJiM0MztcdGNsb3NlKGNncm91cF9mZCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iODM5ZGVmOTQ1MDg2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCAmIzQzOzEsMTA3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7I2luY2x1ZGUgXHUwMDNjdm1saW51eC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9pdGVyX2lvLmhcJiMzNDtcbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzQzO1xuJiM0MzsvKiBUaGUgY291bnRlcnMgb2YgdGhlIGRldmljZSBuYW1lZCBieSB0YXJnZXRfZGV2IGFyZSBzdG9yZWQgaGVyZS4gKi9cbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKiBUaGUgc2FtZSBkZXZpY2UmIzM5O3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKFwmIzM0Oy5kYXRhLnF1ZXJ5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qIFNldCB0byAxIGJ5IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5IHdoZW4gYnBmX2dldF9yb290X2Jsa2NnKCkgc3VjY2VlZHMuICovXG4mIzQzO19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKiBEZXZpY2UgdG8gcmVhZCwgc2V0IGJ5IHVzZXJzcGFjZSAoa2VybmVsIGRldl90KS4gUGlubmluZyB0aGUgZGV2aWNlIGtlZXBzXG4mIzQzOyAqIHRoZSByZWFkIGRldGVybWluaXN0aWMgYW5kIGxldHMgdGhlIHZhbHVlIGJlIGNvbXBhcmVkIHRvIGlvLnN0YXQgZXhhY3RseS5cbiYjNDM7ICovXG4mIzQzO19fdTY0IHRhcmdldF9kZXYgU0VDKFwmIzM0Oy5kYXRhLnF1ZXJ5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSYjMzk7cyBjb3VudGVycyBpbnRvIEBvdXQuIFJlYWRpbmcgb25seVxuJiM0MzsgKiB0aGUgb25lIHBpbm5lZCBkZXZpY2Uga2VlcHMgdGhlIHJlc3VsdCBkZXRlcm1pbmlzdGljOiB0aGF0IGRldmljZSBpc1xuJiM0MzsgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyBcJiMzNDthbnkgZGV2aWNlXG4mIzQzOyAqIHdpdGggSS9PXCYjMzQ7IHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGJsa2NnICpibGtjZyxcbiYjNDM7XHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xuJiM0MztcbiYjNDM7XHQvKiBpby5zdGF0IG5lZWRzIGEgZmx1c2ggYmVmb3JlIGl0IGNhbiBiZSByZWFkIChzbGVlcGFibGUpLiAqL1xuJiM0MztcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhibGtjZyk7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBwZXItZGV2aWNlIGJsa2cgd2FsayBuZWVkcyBhbiBSQ1Ugc2VjdGlvbi4gKi9cbiYjNDM7XHRicGZfcmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XG4mIzQzO1x0XHRpZiAoYnBmX2Jsa2dfZGV2KHBvcykgIT0gdGFyZ2V0X2RldilcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRldiA9IGJwZl9ibGtnX2Rldihwb3MpO1xuJiM0MztcdFx0b3V0LVx1MDAzZXJieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1JFQUQpO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbiYjNDM7XHRcdG91dC1cdTAwM2VyaW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1JFQUQpO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfV1JJVEUpO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1x0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci5zL2Nncm91cFwmIzM0OylcbiYjNDM7aW50IGNncm91cF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4mIzQzO1x0c3RydWN0IGJsa2NnICpibGtjZztcbiYjNDM7XG4mIzQzO1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuJiM0MztcdGlmICghY2dycClcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHQvKiBTdGFydCBmcmVzaCBzbyBhIGRldmljZSB0aGF0IGlzIG5vdCBmb3VuZCBzdGF5cyBhbGwtemVyby4gKi9cbiYjNDM7XHRfX2J1aWx0aW5fbWVtc2V0KFx1MDAyNmlvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTtcbiYjNDM7XG4mIzQzO1x0YmxrY2cgPSBicGZfZ2V0X2Jsa2NnKFx1MDAyNmNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFibGtjZylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZWFkX3RhcmdldF9kZXYoYmxrY2csIFx1MDAyNmlvX3F1ZXJ5KTtcbiYjNDM7XG4mIzQzO1x0YnBmX3B1dF9ibGtjZyhibGtjZyk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtpdGVyLnMvY2dyb3VwXCYjMzQ7KVxuJiM0MztpbnQgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjdHgtXHUwMDNlY2dyb3VwO1xuJiM0MztcdHN0cnVjdCBibGtjZyAqYmxrY2c7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBsYXN0IGl0ZXJhdGlvbiBoYXMgYSBOVUxMIGNncm91cCwgc2tpcCBpdC4gKi9cbiYjNDM7XHRpZiAoIWNncnApXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0X19idWlsdGluX21lbXNldChcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xuJiM0MztcbiYjNDM7XHRibGtjZyA9IGJwZl9nZXRfcm9vdF9ibGtjZygpO1xuJiM0MztcdGlmICghYmxrY2cpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcbiYjNDM7XHQgKiB0aGFuIGZyb20gcnN0YXQsIHNvIHRoaXMgYWxzbyBjb3ZlcnMgdGhlIHJvb3Qgc2lkZSBvZlxuJiM0MztcdCAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLiBUaGUgY291bnRlcnMgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTywgc29cbiYjNDM7XHQgKiB0aGV5IGNhbiBvbmx5IGJlIGF0IG9yIGFib3ZlIHdoYXQgdGhpcyB0ZXN0JiMzOTtzIG93biBjZ3JvdXAgZGlkLlxuJiM0MztcdCAqL1xuJiM0MztcdHJlYWRfdGFyZ2V0X2RldihibGtjZywgXHUwMDI2cm9vdF9xdWVyeSk7XG4mIzQzO1xuJiM0MztcdGdvdF9yb290X2Jsa2NnID0gMTtcbiYjNDM7XHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2dldF9yb290X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9nZXRfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX3B1dF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfYmxrY2dfZmx1c2hfc3RhdHMmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX2Jsa2dfZGVzdHJveSYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfYnl0ZXMmIzM0OywKICAgICYjMzQ7YnBmX2Jsa2dfaW9zdGF0X2lvcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19kZXYmIzM0OywKICAgICYjMzQ7YmxrY2dfZmlsbF9yb290X2lvc3RhdHMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgQlBGIGtmdW5jcyBmb3IgdGhlIGJsb2NrIEkvTyBjb250cm9sbGVyIChibGtjZykgdG8gYWxsb3cgQlBGIHByb2dyYW1zIHRvIHJlYWQgYSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMmNhMTlhOGEyNDg4NzI4ODhkZTFhNWJlN2Q2NzgzOGEyZjJhNDIxNwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMjE6MDM6MDMgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTCkBAIC02NjE3LDYgJiM0Mzs2NjE3LDcgQEAgRjoJYmxvY2svYmxrLWNncm91cC5jCiBGOglibG9jay9ibGstaW9jb3N0LmMKIEY6CWJsb2NrL2Jsay1pb2xhdGVuY3kuYwogRjoJYmxvY2svYmxrLXRocm90dGxlLmMKJiM0MztGOglibG9jay9icGZfYmxrY2cuYwogRjoJaW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmgKIAogQ09OVFJPTCBHUk9VUCAtIENQVVNFVApkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMTcsNiAmIzQzOzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICYjNDM7PSBlcnJvci1pbmplY3Rpb24ubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgJiM0Mzs9IGJzZy5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpCSYjNDM7PSBic2ctbGliLm8KIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYmxrLWNncm91cC5vCiYjNDM7aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCiYjNDM7b2JqLSQoQ09ORklHX0JMS19DR1JPVVApCSYjNDM7PSBicGZfYmxrY2cubwomIzQzO2VuZGlmCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpCSYjNDM7PSBibGstY2dyb3VwLXJ3c3RhdC5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgJiM0Mzs9IGJsay1jZ3JvdXAtZmMtYXBwaWQubwogb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORykJJiM0Mzs9IGJsay10aHJvdHRsZS5vCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmMKaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5jCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwpAQCAtMTA4Niw3ICYjNDM7MTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpCiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAmIzM5O3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXQKICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLgogICovCi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKQomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmgKaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5oCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaApAQCAtMjA1LDYgJiM0MzsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpOwogCiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7CiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTsKIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZywKIAkJICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosCiAJCQkJICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLApkaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi40OGE4NmYwN2UxOThhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYnBmX2Jsa2NnLmMKQEAgLTAsMCAmIzQzOzEsMzE1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKJiM0MzsvKgomIzQzOyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuCiYjNDM7ICoKJiM0MzsgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJiMzOTtzIGlvLnN0YXQgY291bnRlcnMuIEEgcHJvZ3JhbSB0dXJucyBhCiYjNDM7ICogY2dyb3VwJiMzOTtzIGNzcyBpbnRvIGEgc3RydWN0IGJsa2NnIHdpdGggYnBmX2dldF9ibGtjZygpLCBmbHVzaGVzIHRoZSBzdGF0cyB3aXRoCiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCksIHRoZW4gd2Fsa3MgdGhlIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzIHdpdGggdGhlCiYjNDM7ICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJiMzOTtzIGNvdW50ZXJzIHdpdGgKJiM0MzsgKiBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoKS9icGZfYmxrZ19pb3N0YXRfaW9zKCkuIEl0IG1pcnJvcnMgdGhlIG1lbW9yeQomIzQzOyAqIGNvbnRyb2xsZXIga2Z1bmNzIGluIG1tL2JwZl9tZW1jb250cm9sLmMsIGJ1dCBhZGRzIGEgcGVyLWRldmljZSBkaW1lbnNpb246CiYjNDM7ICogdW5saWtlIG1lbWNnLCBibGtjZyBrZWVwcyBvbmUgYmxrZyAoYW5kIG9uZSBpby5zdGF0IGxpbmUpIHBlciBibG9jayBkZXZpY2UuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYmxvY2svIGJlY2F1c2UgdGhlIGJsa2NnL2Jsa2cgc3RydWN0IGxheW91dHMgYXJlIHByaXZhdGUKJiM0MzsgKiB0byBibG9jay9ibGstY2dyb3VwLmguCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtibGstY2dyb3VwLmgmIzM0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmX2lkcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcmVlbXB0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JjdWxpc3QuaCZndDsKJiM0MzsKJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwCiYjNDM7ICoKJiM0MzsgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXMKJiM0MzsgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJiMzOTt0IHJlcXVpcmUgcmVmZXJlbmNlIGNvdW50aW5nLiBJdCYjMzk7cyBzYWZlIHRvIHBhc3MgaXQKJiM0MzsgKiB0byBicGZfcHV0X2Jsa2NnKCkuCiYjNDM7ICoKJiM0MzsgKiBOb3RlIHRoYXQgdGhlIHJvb3QgY2dyb3VwIGlzIHNwZWNpYWw6IGl0cyBjb3VudGVycyBhcmUgdGhlIGRpc2tzJiMzOTsgb3duCiYjNDM7ICogc3RhdGlzdGljcywgc28gdGhleSBjb3ZlciBldmVyeSBjZ3JvdXAmIzM5O3MgSS9PIHJhdGhlciB0aGFuIG9ubHkgdGhlIHJvb3QmIzM5O3MuCiYjNDM7ICogVGhpcyBtYXRjaGVzIHdoYXQgdGhlIHJvb3QgaW8uc3RhdCBmaWxlIHByaW50cy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfcm9vdF9ibGtjZyh2b2lkKQomIzQzO3sKJiM0MzsJLyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi8KJiM0MzsJcmV0dXJuICZhbXA7YmxrY2dfcm9vdDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2dldF9ibGtjZyAtIEdldCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cAomIzQzOyAqIEBjc3M6IHBvaW50ZXIgdG8gdGhlIGNzcyBzdHJ1Y3R1cmUKJiM0MzsgKgomIzQzOyAqIEl0JiMzOTtzIGZpbmUgdG8gcGFzcyBhIGNzcyB3aGljaCBiZWxvbmdzIHRvIGFueSBjZ3JvdXAgY29udHJvbGxlciwKJiM0MzsgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5JiMzOTtzIG1haW4gY3NzLgomIzQzOyAqCiYjNDM7ICogSW1wbGVtZW50cyBLRl9BQ1FVSVJFIHNlbWFudGljcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgYmxrY2cgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3NzJiMzOTtzCiYjNDM7ICogcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwgaWYgdGhlIGlvIGNvbnRyb2xsZXIgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNncm91cC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfYmxrY2coc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2cgPSBOVUxMOwomIzQzOwomIzQzOwlpZiAoY3NzLSZndDtzcyA9PSAmYW1wO2lvX2NncnBfc3Vic3lzKQomIzQzOwkJcmV0dXJuIGNzc190cnlnZXQoY3NzKSA/IGNzc190b19ibGtjZyhjc3MpIDogTlVMTDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU29tZSBvdGhlciBjb250cm9sbGVyJiMzOTtzIGNzcywgb3IgdGhlIGNncm91cCYjMzk7cyBvd24gb25lLiBMb29rIHVwIHRoZSBpbwomIzQzOwkgKiBjb250cm9sbGVyJiMzOTtzIGNzczsgcmN1IGtlZXBzIGl0IGFsaXZlIGJldHdlZW4gdGhlIGxvYWQgYW5kIHRoZSB0cnlnZXQuCiYjNDM7CSAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLyYjMzk7cyBsb2NrCiYjNDM7CSAqIGNvbnRleHQgYW5hbHlzaXMgY2FuIGZvbGxvdyBpdC4KJiM0MzsJICovCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJY3NzID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhjc3MtJmd0O2Nncm91cC0mZ3Q7c3Vic3lzW2lvX2NncnBfaWRdKTsKJiM0MzsJaWYgKGNzcyAmYW1wOyZhbXA7IGNzc190cnlnZXQoY3NzKSkKJiM0MzsJCWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwomIzQzOwlyZXR1cm4gYmxrY2c7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9wdXRfYmxrY2cgLSBQdXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXAKJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cCB0byByZWxlYXNlCiYjNDM7ICoKJiM0MzsgKiBSZWxlYXNlcyBhIHByZXZpb3VzbHkgYWNxdWlyZWQgYmxrY2cgcmVmZXJlbmNlLgomIzQzOyAqIEltcGxlbWVudHMgS0ZfUkVMRUFTRSBzZW1hbnRpY3MuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfcHV0X2Jsa2NnKHN0cnVjdCBibGtjZyAqYmxrY2cpCiYjNDM7ewomIzQzOwljc3NfcHV0KCZhbXA7YmxrY2ctJmd0O2Nzcyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJiMzOTtzIGlvIHN0YXRpc3RpY3MKJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cAomIzQzOyAqCiYjNDM7ICogQ2FsbCB0aGlzIGJlZm9yZSByZWFkaW5nIGNvdW50ZXJzIGZvciB1cC10by1kYXRlIHZhbHVlcy4gU2xlZXBhYmxlLgomIzQzOyAqCiYjNDM7ICogSXQgZG9lcyB3aGF0IHJlYWRpbmcgdGhlIGlvLnN0YXQgZmlsZSBkb2VzLCB3aGljaCBkaWZmZXJzIGJ5IGNncm91cC4gRm9yIGEKJiM0MzsgKiBub24tcm9vdCBjZ3JvdXAgaXQgZm9sZHMgdGhlIHBlci1jcHUgZGVsdGFzIGludG8gdGhlIHBlci1kZXZpY2UgYWdncmVnYXRlcwomIzQzOyAqIGFuZCB1cCB0aGUgY2dyb3VwIHRyZWUuIFRoZSByb290IGNncm91cCBpcyBub3QgYWNjb3VudGVkIHRocm91Z2ggcnN0YXQgYXQKJiM0MzsgKiBhbGwsIHNvIGZvciBpdCB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzIGFyZSByZWZpbGxlZCBmcm9tIHRoZSBkaXNrcyYjMzk7CiYjNDM7ICogb3duIHN0YXRpc3RpY3MsIHdoaWNoIGNvdW50IGV2ZXJ5IGNncm91cCYjMzk7cyBJL08uCiYjNDM7ICoKJiM0MzsgKiBUaGUgcm9vdCBicmFuY2ggaXMgbm90IHNlbGYtbGltaXRpbmcgdGhlIHdheSB0aGUgcnN0YXQgb25lIGlzOiBpdCByZXJlYWRzCiYjNDM7ICogZXZlcnkgZGlzayBvbiBldmVyeSBjYWxsLCB3aGlsZSBhIHNlY29uZCByc3RhdCBmbHVzaCBmaW5kcyBub3RoaW5nIGxlZnQgdG8KJiM0MzsgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtCiYjNDM7ICogb25jZSByYXRoZXIgdGhhbiBvbmNlIHBlciBjZ3JvdXAgb2YgYSB3YWxrLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpCiYjNDM7ewomIzQzOwlpZiAoIWJsa2NnLSZndDtjc3MucGFyZW50KQomIzQzOwkJYmxrY2dfZmlsbF9yb290X2lvc3RhdHMoKTsKJiM0MzsJZWxzZQomIzQzOwkJY3NzX3JzdGF0X2ZsdXNoKCZhbXA7YmxrY2ctJmd0O2Nzcyk7CiYjNDM7fQomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnIHsKJiM0MzsJX191NjQgX19vcGFxdWVbMl07CiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqcG9zOwomIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV3IC0gU3RhcnQgaXRlcmF0aW5nIGEgYmxvY2sgY2dyb3VwJiMzOTtzIHBlci1kZXZpY2UgYmxrZ3MKJiM0MzsgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cCB3aG9zZSBkZXZpY2VzIHRvIHdhbGsKJiM0MzsgKgomIzQzOyAqIEVhY2ggeWllbGRlZCBibGtnIGhvbGRzIG9uZSBibG9jayBkZXZpY2UmIzM5O3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGEKJiM0MzsgKiBwZXItZGV2aWNlIGxpbmUgb2YgdGhlIGlvLnN0YXQgZmlsZS4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZCwgYXMgdGhlIGZpbGUKJiM0MzsgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2sKJiM0MzsgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yCiYjNDM7ICogaXQuIE11c3QgYmUgdXNlZCBpbnNpZGUgYW4gUkNVIHJlYWQgc2VjdGlvbi4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0OwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICZndDsgc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7CiYjNDM7CUJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPQomIzQzOwkJICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpOwomIzQzOwomIzQzOwlraXQtJmd0O2Jsa2NnID0gYmxrY2c7CiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnX2dxICpicGZfaXRlcl9ibGtnX25leHQoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LSZndDtwb3M7CiYjNDM7CXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwomIzQzOwomIzQzOwkvKiBDbGVhcmVkIG9uY2UgdGhlIHdhbGsgaXMgZG9uZSwgc2VlIGJlbG93LiAqLwomIzQzOwlpZiAoIWtpdC0mZ3Q7YmxrY2cpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKCFibGtnKQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoJmFtcDtraXQtJmd0O2Jsa2NnLSZndDtibGtnX2xpc3QpKTsKJiM0MzsJZWxzZQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsKJiM0MzsJLyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyB0aGUgaW8uc3RhdCBmaWxlLiAqLwomIzQzOwl3aGlsZSAobm9kZSkgewomIzQzOwkJYmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7CiYjNDM7CQlpZiAoYmxrZy0mZ3Q7b25saW5lKSB7CiYjNDM7CQkJa2l0LSZndDtwb3MgPSBibGtnOwomIzQzOwkJCXJldHVybiBibGtnOwomIzQzOwkJfQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGb3JnZXQgdGhlIGxpc3QgaGVhZCBhcyB3ZWxsLiBUaGUgdmVyaWZpZXIgYXNzdW1lcyB0aGF0IGFuIGl0ZXJhdG9yCiYjNDM7CSAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGUKJiM0MzsJICogbG9vcCBmb3IgdGVybWluYXRpb24gb25jZSBpdCBoYXM7IHN0YXJ0aW5nIHRoZSB3YWxrIG92ZXIgd291bGQgbGV0CiYjNDM7CSAqIHN1Y2ggYSBsb29wIHNwaW4gZm9yZXZlci4KJiM0MzsJICovCiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsJa2l0LSZndDtibGtjZyA9IE5VTEw7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVhZCBvbmUgY291bnRlciBvdXQgb2YgQGJsa2cmIzM5O3MgZmx1c2hlZCBpby5zdGF0IGFnZ3JlZ2F0ZS4gQGNvdW50ZXJzIGlzIG9uZQomIzQzOyAqIG9mIHRoZSB0d28gYXJyYXlzIGluIGJsa2ctJmd0O2lvc3RhdC5jdXI7IGJvdGggYXJlIGd1YXJkZWQgYnkgdGhhdCBzdHJ1Y3QmIzM5O3MKJiM0MzsgKiBzZXFsb2NrLCB0aGUgb25lIHRoZSBpby5zdGF0IGZpbGUgdXNlcy4gUmV0dXJucyAodTY0KS0xIGlmIHRoZSBjb3VudGVyCiYjNDM7ICogY2Fubm90IGJlIHJlYWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCBibGtnX2lvc3RhdF9yZWFkKHN0cnVjdCBibGtjZ19ncSAqYmxrZywgY29uc3QgdTY0ICpjb3VudGVycywKJiM0MzsJCQkgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KQomIzQzO3sKJiM0MzsJc3RydWN0IGJsa2dfaW9zdGF0X3NldCAqYmlzID0gJmFtcDtibGtnLSZndDtpb3N0YXQ7CiYjNDM7CXVuc2lnbmVkIGludCBzZXE7CiYjNDM7CXU2NCB2YWw7CiYjNDM7CiYjNDM7CWlmICgodW5zaWduZWQgaW50KXJ3ICZndDs9IEJMS0dfSU9TVEFUX05SKQomIzQzOwkJcmV0dXJuICh1NjQpLTE7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE9uIDMyLWJpdCB0aGUgbG9vcCBiZWxvdyByZWFsbHkgaXMgYSBzZXFjb3VudCByZXRyeSBsb29wLiBFdmVyeQomIzQzOwkgKiB3cml0ZXIgb2YgYmxrZy0mZ3Q7aW9zdGF0IGtlZXBzIGludGVycnVwdHMgb2ZmLCBzbyBvbmx5IGFuIE5NSSBjYW4gbGFuZAomIzQzOwkgKiBpbnNpZGUgYW4gdXBkYXRlLCBhbmQgdGhlbiB0aGUgbG9vcCB3b3VsZCBuZXZlciBlbmQuIFRoZXNlIGtmdW5jcwomIzQzOwkgKiBhcmUgcmVhY2hhYmxlIGZyb20gYSBwZXJmIGV2ZW50IHByb2dyYW0sIHdoaWNoIGRvZXMgcnVuIGluIE5NSSwgc28KJiM0MzsJICogZ2l2ZSB1cCByYXRoZXIgdGhhbiBzcGluLiBPbiA2NC1iaXQgdGhlIGxvb3AgY29tcGlsZXMgYXdheS4KJiM0MzsJICovCiYjNDM7CWlmIChCSVRTX1BFUl9MT05HID09IDMyICZhbXA7JmFtcDsgaW5fbm1pKCkpCiYjNDM7CQlyZXR1cm4gKHU2NCktMTsKJiM0MzsKJiM0MzsJZG8gewomIzQzOwkJc2VxID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZhbXA7YmlzLSZndDtzeW5jKTsKJiM0MzsJCXZhbCA9IGNvdW50ZXJzW3J3XTsKJiM0MzsJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KCZhbXA7YmlzLSZndDtzeW5jLCBzZXEpKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSYjMzk7cyBpby5zdGF0IGJ5dGUgY291bnRlcgomIzQzOyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cCkKJiM0MzsgKiBAcnc6IHdoaWNoIGNvdW50ZXIgKEJMS0dfSU9TVEFUX1JFQUQgLyBfV1JJVEUgLyBfRElTQ0FSRCkKJiM0MzsgKgomIzQzOyAqIFJlYWRzIHRoZSBmbHVzaGVkIGFnZ3JlZ2F0ZSwgc28gY2FsbCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKSBmaXJzdCBmb3IKJiM0MzsgKiB1cC10by1kYXRlIHZhbHVlcy4gVGhlIHJlYWQgdXNlcyB0aGUgdTY0X3N0YXRzIHNlcWxvY2ssIGxpa2UgdGhlIGlvLnN0YXQKJiM0MzsgKiBmaWxlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBvciAodTY0KS0xIGlmIEBydyBpcyBvdXQgb2YgcmFuZ2Ugb3IgdGhlCiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHN0cnVjdCBibGtjZ19ncSAqYmxrZywKJiM0MzsJCQkJICAgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KQomIzQzO3sKJiM0MzsJcmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5ieXRlcywgcncpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSYjMzk7cyBpby5zdGF0IEkvTyBjb3VudAomIzQzOyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cCkKJiM0MzsgKiBAcnc6IHdoaWNoIGNvdW50ZXIgKEJMS0dfSU9TVEFUX1JFQUQgLyBfV1JJVEUgLyBfRElTQ0FSRCkKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG51bWJlciBvZiBJL09zLCBvciAodTY0KS0xIGlmIEBydyBpcyBvdXQgb2YgcmFuZ2Ugb3IgdGhlCiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfaW9zdGF0X2lvcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csCiYjNDM7CQkJCSAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpCiYjNDM7ewomIzQzOwlyZXR1cm4gYmxrZ19pb3N0YXRfcmVhZChibGtnLCBibGtnLSZndDtpb3N0YXQuY3VyLmlvcywgcncpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfYmxrZ19kZXYgLSBSZXR1cm4gYSBibGtnJiMzOTtzIGRldmljZSBpZAomIzQzOyAqIEBibGtnOiBibG9jayBncm91cAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgZGV2aWNlJiMzOTtzIGRldl90ICh1c2UgTUFKT1IoKS9NSU5PUigpIHRvIHNwbGl0KSwgb3IgMCBpZiB0aGUgYmxrZwomIzQzOyAqIGhhcyBubyBkaXNrLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19kZXYoc3RydWN0IGJsa2NnX2dxICpibGtnKQomIzQzO3sKJiM0MzsJaWYgKCFibGtnLSZndDtxIHx8ICFibGtnLSZndDtxLSZndDtkaXNrKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiBibGtnLSZndDtxLSZndDtkaXNrLSZndDtwYXJ0MC0mZ3Q7YmRfZGV2OwomIzQzO30KJiM0MzsKJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpOwomIzQzOwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2dldF9yb290X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfYmxrY2csIEtGX0FDUVVJUkUgfCBLRl9SRVRfTlVMTCB8IEtGX1JDVSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3B1dF9ibGtjZywgS0ZfUkVMRUFTRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKQomIzQzOwomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMsIEtGX1JDVSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2lvcywgS0ZfUkNVKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19kZXYsIEtGX1JDVSkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfYmxrY2dfa2Z1bmNzKQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiYjNDM7CS5zZXQJCT0gJmFtcDticGZfYmxrY2dfa2Z1bmNzLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiYjNDM7CQkJCQkmYW1wO2JwZl9ibGtjZ19rZnVuY19zZXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcHJfd2FybigmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBibGtjZyBrZnVuY3M6ICVkXG4mIzM0OywgZXJyKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApAQCAtMCwwICYjNDM7MSwxNyBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7I2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0gKJiM0MzsKJiM0MztzdHJ1Y3QgaW9fcXVlcnkgewomIzQzOwkvKiBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMgKi8KJiM0MzsJX191NjQgcmJ5dGVzOwomIzQzOwlfX3U2NCB3Ynl0ZXM7CiYjNDM7CV9fdTY0IHJpb3M7CiYjNDM7CV9fdTY0IHdpb3M7CiYjNDM7CV9fdTY0IGRieXRlczsKJiM0MzsJX191NjQgZGlvczsKJiM0MzsJX191NjQgZGV2OwkvKiBkZXZfdCBvZiB0aGUgZGV2aWNlIHRoZSBjb3VudGVycyBiZWxvbmcgdG8gKi8KJiM0Mzt9OwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NHUk9VUF9JVEVSX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtMSwzICYjNDM7MSw0IEBACiYjNDM7Q09ORklHX0JMS19DR1JPVVA9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eQogQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTEKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjMyY2RhODI0MzMxODMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCkBAIC0wLDAgJiM0MzsxLDMxMCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvbGliYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xvb3AuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c21hY3Jvcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgSU9fU0laRSAoNCAqIDEwMjQgKiAxMDI0KQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlpbnQgZmQsIHJldCA9IDA7CiYjNDM7CXNzaXplX3QgYnl0ZXM7CiYjNDM7CiYjNDM7CWZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkLCAmIzM0O2JwZl9pdGVyX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC0mZ3Q7ZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi8KJiM0MzsJYnl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsICYjMzQ7cmVhZCBmZCYjMzQ7KSkKJiM0MzsJCXJldCA9IDE7CiYjNDM7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBdHRhY2ggYSBsb29wIGRldmljZSB0byBhbiBhbm9ueW1vdXMgdGVtcCBmaWxlIHNvIHdlIGhhdmUgYSByZWFsIGJsb2NrCiYjNDM7ICogZGV2aWNlIHRvIGdlbmVyYXRlIGNncm91cC1jaGFyZ2VkIEkvTyBhZ2FpbnN0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEKJiM0MzsgKiBpZiBsb29wIGRldmljZXMgYXJlIHVuYXZhaWxhYmxlIChub24tcm9vdCAvIG5vIENPTkZJR19CTEtfREVWX0xPT1ApIHNvIHRoZQomIzQzOyAqIGNhbGxlciBjYW4gc2tpcC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsCiYjNDM7CQkgICAgICBpbnQgKmJhY2tfZmQpCiYjNDM7ewomIzQzOwljaGFyIGJhY2tfcGF0aFtdID0gJiMzNDsvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWCYjMzQ7OwomIzQzOwlpbnQgbnI7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSBvcGVuKCYjMzQ7L2Rldi9sb29wLWNvbnRyb2wmIzM0OywgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpjdGxfZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwluciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTsKJiM0MzsJaWYgKG5yICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlzbnByaW50Zihsb29wX3BhdGgsIHN6LCAmIzM0Oy9kZXYvbG9vcCVkJiMzNDssIG5yKTsKJiM0MzsKJiM0MzsJKmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7CiYjNDM7CWlmICgqYmFja19mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJdW5saW5rKGJhY2tfcGF0aCk7CiYjNDM7CWlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJKmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpsb29wX2ZkICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAoaW9jdGwoKmxvb3BfZmQsIExPT1BfU0VUX0ZELCAqYmFja19mZCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7ZXJyOgomIzQzOwlpZiAoKmxvb3BfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKCpsb29wX2ZkKTsKJiM0MzsJaWYgKCpiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqYmFja19mZCk7CiYjNDM7CWNsb3NlKCpjdGxfZmQpOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCwKJiM0MzsJCQkgIGludCBiYWNrX2ZkKQomIzQzO3sKJiM0MzsJaW50IG5yID0gLTE7CiYjNDM7CiYjNDM7CWlmIChsb29wX2ZkICZndDs9IDApIHsKJiM0MzsJCWlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTsKJiM0MzsJCWNsb3NlKGxvb3BfZmQpOwomIzQzOwl9CiYjNDM7CWlmIChiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShiYWNrX2ZkKTsKJiM0MzsJaWYgKGN0bF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpZiAoc3NjYW5mKGxvb3BfcGF0aCwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCAmYW1wO25yKSA9PSAxICZhbXA7JmFtcDsgbnIgJmd0Oz0gMCkKJiM0MzsJCQlpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpOwomIzQzOwkJY2xvc2UoY3RsX2ZkKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBPX0RJUkVDVCBJL08gdG8gdGhlIGxvb3AgZGV2aWNlLCBjaGFyZ2VkIHRvIHRoZSBjdXJyZW50IGNncm91cC4gKi8KJiM0MztzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpCiYjNDM7ewomIzQzOwl2b2lkICpidWY7CiYjNDM7CWludCBmZCwgcmV0ID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fRElSRUNUIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKHBvc2l4X21lbWFsaWduKCZhbXA7YnVmLCA0MDk2LCBJT19TSVpFKSkKJiM0MzsJCWdvdG8gb3V0X2ZkOwomIzQzOwltZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTsKJiM0MzsKJiM0MzsJaWYgKHB3cml0ZShmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKQomIzQzOwkJZ290byBvdXRfYnVmOwomIzQzOwlmc3luYyhmZCk7CiYjNDM7CWlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKQomIzQzOwkJZ290byBvdXRfYnVmOwomIzQzOwlyZXQgPSAwOwomIzQzO291dF9idWY6CiYjNDM7CWZyZWUoYnVmKTsKJiM0MztvdXRfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBQYXJzZSB0aGUgaW8uc3RhdCBsaW5lIGZvciBkZXZpY2UgQGRldiBvdXQgb2YgdGhlIGNncm91cCYjMzk7cyBpby5zdGF0IGZpbGUgYW5kCiYjNDM7ICogZmlsbCBAb3V0LiBAZGV2IGlzIGEga2VybmVsIGRldl90IChhcyByZXR1cm5lZCBieSBicGZfYmxrZ19kZXYpLCB3aG9zZQomIzQzOyAqIG1ham9yOm1pbm9yIHNwbGl0IG1hdGNoZXMgaG93IGlvLnN0YXQgcHJpbnRzIHRoZSBkZXZpY2UuIFJldHVybnMgMCBpZiB0aGUKJiM0MzsgKiBkZXZpY2UmIzM5O3MgbGluZSB3YXMgZm91bmQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgd2FudF9tYWogPSBkZXYgJmd0OyZndDsgMjAsIHdhbnRfbWluID0gZGV2ICZhbXA7ICgoMVUgJmx0OyZsdDsgMjApIC0gMSk7CiYjNDM7CWNoYXIgYnVmWzQwOTZdLCAqbGluZSwgKnNhdmVwdHI7CiYjNDM7CWludCBmZCwgbiwgcmV0ID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gb3BlbmF0KGNncm91cF9mZCwgJiMzNDtpby5zdGF0JiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlpZiAobiAmbHQ7PSAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlidWZbbl0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CiYjNDM7CWZvciAobGluZSA9IHN0cnRva19yKGJ1ZiwgJiMzNDtcbiYjMzQ7LCAmYW1wO3NhdmVwdHIpOyBsaW5lOwomIzQzOwkgICAgIGxpbmUgPSBzdHJ0b2tfcihOVUxMLCAmIzM0O1xuJiMzNDssICZhbXA7c2F2ZXB0cikpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwOwomIzQzOwkJdW5zaWduZWQgaW50IG1haiwgbWluOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSAmIzM0O21hajptaW4mIzM0OyB0b2tlbiBpcyBhbHdheXMgcHJlc2VudDsgdGhlIGZpZWxkIGJsb2NrIGlzCiYjNDM7CQkgKiBvcHRpb25hbCAodGhlIGtlcm5lbCBvbWl0cyBpdCBmb3IgYSBkZXZpY2Ugd2l0aCBubyByZWFkL3dyaXRlCiYjNDM7CQkgKiBJL08pLCBzbyBhIG1hdGNoIG9mICZndDs9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHNzY2FuZihsaW5lLAomIzQzOwkJCSAgICYjMzQ7JXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHUmIzM0OywKJiM0MzsJCQkgICAmYW1wO21haiwgJmFtcDttaW4sICZhbXA7cmIsICZhbXA7d2IsICZhbXA7cmksICZhbXA7d2ksICZhbXA7ZGIsICZhbXA7ZGkpICZsdDsgMikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWlmIChtYWogIT0gd2FudF9tYWogfHwgbWluICE9IHdhbnRfbWluKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSByYjsKJiM0MzsJCW91dC0mZ3Q7d2J5dGVzID0gd2I7CiYjNDM7CQlvdXQtJmd0O3Jpb3MgPSByaTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IHdpOwomIzQzOwkJb3V0LSZndDtkYnl0ZXMgPSBkYjsKJiM0MzsJCW91dC0mZ3Q7ZGlvcyA9IGRpOwomIzQzOwkJcmV0ID0gMDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9jZ3JvdXBfaXRlcl9pbyh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciAqY2dyb3VwX3JlbF9wYXRoID0gJiMzNDsvY2dyb3VwX2l0ZXJfaW9fdGVzdCYjMzQ7OwomIzQzOwlpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xOwomIzQzOwlzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMOwomIzQzOwljaGFyIGxvb3BfcGF0aFs2NF07CiYjNDM7CXN0cnVjdCBpb19xdWVyeSAqcTsKJiM0MzsJaW50IGNncm91cF9mZDsKJiM0MzsKJiM0MzsJY2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgJiMzNDtjZ3JvdXBfc2V0dXBfYW5kX2pvaW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksICZhbXA7Y3RsX2ZkLCAmYW1wO2xvb3BfZmQsICZhbXA7YmFja19mZCkpIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsJLyogbmVlZHMgcm9vdCAmIzQzOyBDT05GSUdfQkxLX0RFVl9MT09QICovCiYjNDM7CQlnb3RvIGNsZWFudXBfY2dyb3VwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb29wOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBQaW4gdGhlIHJlYWQgdG8gdGhlIGxvb3AgZGV2aWNlIHNvIHRoZSBtZWFzdXJlZCBkZXZpY2UgaXMgc3RhYmxlIGFuZAomIzQzOwkgKiBxdWllc2NlZC4gQ29udmVydCB0aGUgZ2xpYmMtZW5jb2RlZCBzdF9yZGV2IHRvIHRoZSBrZXJuZWwgZGV2X3QKJiM0MzsJICogZW5jb2RpbmcgKG1ham9yICZsdDsmbHQ7IDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuCiYjNDM7CSAqLwomIzQzOwl7CiYjNDM7CQlzdHJ1Y3Qgc3RhdCBsc3Q7CiYjNDM7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCAmYW1wO2xzdCksICYjMzQ7ZnN0YXQgbG9vcCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXBfc2tlbDsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O3RhcmdldF9kZXYgPQomIzQzOwkJCSgoX191NjQpbWFqb3IobHN0LnN0X3JkZXYpICZsdDsmbHQ7IDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTsKJiM0MzsJfQomIzQzOwomIzQzOwlERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTsKJiM0MzsJdW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0gewomIzQzOwkJLmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsCiYjNDM7CQkuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSwKJiM0MzsJfTsKJiM0MzsJb3B0cy5saW5rX2luZm8gPSAmYW1wO2xpbmZvOwomIzQzOwlvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pOwomIzQzOwomIzQzOwlsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmNncm91cF9pb19xdWVyeSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssICYjMzQ7YnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CiYjNDM7CS8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovCiYjNDM7CWlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCAmIzM0O2RvX2RpcmVjdF9pbyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9saW5rOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogV2VhayBjaGVjazogd2UgZGlkIEkvTywgc28gdGhlIG51bWJlcnMgbXVzdCBiZSBub24temVyby4gRm9sbG93cyB0aGUKJiM0MzsJICogcGF0dGVybiBpbiBjZ3JvdXBfaXRlcl9tZW1jZy4KJiM0MzsJICovCiYjNDM7CXEgPSAmYW1wO3NrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2lvX3F1ZXJ5OwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX193cml0ZSYjMzQ7KSkgewomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3dieXRlcywgMCwgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7d2lvcywgMCwgJiMzNDt3aW9zJiMzNDspOwomIzQzOwl9CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3JlYWQmIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtyYnl0ZXMsIDAsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3Jpb3MsIDAsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19kZXYmIzM0OykpCiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7ZGV2LCAwLCAmIzM0O2RldiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU3Ryb25nZXIgY2hlY2s6IHRoZSBrZnVuYy1yZWFkIHZhbHVlcyBtdXN0IGVxdWFsIHdoYXQgdGhlIGlvLnN0YXQKJiM0MzsJICogZmlsZSByZXBvcnRzIGZvciB0aGUgc2FtZSBkZXZpY2UuIFJlZnJlc2ggdmlhIHRoZSBwcm9nLCB0aGVuIHJlYWQKJiM0MzsJICogdGhlIGZpbGUgd2l0aCBubyBJL08gaW4gYmV0d2Vlbiwgc28gYm90aCBmbHVzaGVkIHNuYXBzaG90cyBtYXRjaAomIzQzOwkgKiBleGFjdGx5LgomIzQzOwkgKi8KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fbWF0Y2gmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9OwomIzQzOwomIzQzOwkJaWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkJICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS0mZ3Q7ZGV2LCAmYW1wO2ZpbGV2KSwKJiM0MzsJCQkgICAgICAmIzM0O3BhcnNlIGlvLnN0YXQmIzM0OykpIHsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7cmJ5dGVzLCBmaWxldi5yYnl0ZXMsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDt3Ynl0ZXMsIGZpbGV2LndieXRlcywgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3Jpb3MsIGZpbGV2LnJpb3MsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2lvcywgZmlsZXYud2lvcywgJiMzNDt3aW9zJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkYnl0ZXMsIGZpbGV2LmRieXRlcywgJiMzNDtkYnl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O2Rpb3MsIGZpbGV2LmRpb3MsICYjMzQ7ZGlvcyYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTZXBhcmF0ZSBwcm9ncmFtIGZvciB0aGUgcm9vdCBibG9jayBjZ3JvdXAuIEl0cyBjb3VudGVycyBkbyBub3QgY29tZQomIzQzOwkgKiBmcm9tIHJzdGF0LCB0aGV5IGFyZSByZWZpbGxlZCBmcm9tIHRoZSBkaXNrcyB0aGVtc2VsdmVzLCBzbyB0aGlzCiYjNDM7CSAqIGNvdmVycyB0aGUgb3RoZXIgaGFsZiBvZiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhleSBjb3ZlciBldmVyeQomIzQzOwkgKiBjZ3JvdXAmIzM5O3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvCiYjNDM7CSAqIHRoZXkgbXVzdCBiZSBhdCBvciBhYm92ZSB3aGF0IHRoZSB0ZXN0IGNncm91cCB3YXMgY2hhcmdlZC4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3Jvb3QmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rOwomIzQzOwkJc3RydWN0IGlvX3F1ZXJ5ICpyOwomIzQzOwomIzQzOwkJc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfYmxrY2cgPSAwOwomIzQzOwkJcm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmNncm91cF9yb290X2Jsa2NnX3F1ZXJ5LAomIzQzOwkJCQkJCSAgICAgJmFtcDtvcHRzKTsKJiM0MzsJCWlmIChBU1NFUlRfT0tfUFRSKHJvb3RfbGluaywgJiMzNDthdHRhY2ggcm9vdCBpdGVyJiMzNDspKSB7CiYjNDM7CQkJaWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKHJvb3RfbGluayksICYjMzQ7cmVhZCByb290IHN0YXRzJiMzNDspKSB7CiYjNDM7CQkJCXIgPSAmYW1wO3NrZWwtJmd0O2RhdGFfcXVlcnktJmd0O3Jvb3RfcXVlcnk7CiYjNDM7CQkJCUFTU0VSVF9FUShza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtnb3Rfcm9vdF9ibGtjZywgMSwKJiM0MzsJCQkJCSAgJiMzNDtnb3Rfcm9vdF9ibGtjZyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0VRKHItJmd0O2RldiwgcS0mZ3Q7ZGV2LCAmIzM0O3Jvb3QgZGV2JiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2J5dGVzLCBxLSZndDt3Ynl0ZXMsICYjMzQ7cm9vdCB3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDt3aW9zLCBxLSZndDt3aW9zLCAmIzM0O3Jvb3Qgd2lvcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3JieXRlcywgcS0mZ3Q7cmJ5dGVzLCAmIzM0O3Jvb3QgcmJ5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7cmlvcywgcS0mZ3Q7cmlvcywgJiMzNDtyb290IHJpb3MmIzM0Oyk7CiYjNDM7CQkJfQomIzQzOwkJCWJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MztjbGVhbnVwX2xpbms6CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGxpbmspOwomIzQzO2NsZWFudXBfc2tlbDoKJiM0MzsJY2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7Y2xlYW51cF9sb29wOgomIzQzOwlsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTsKJiM0MztjbGVhbnVwX2Nncm91cF9mZDoKJiM0MzsJY2xvc2UoY2dyb3VwX2ZkKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmI4MzlkZWY5NDUwODYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSwxMDcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaW5jbHVkZSAmbHQ7dm1saW51eC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5oJiMzNDsKJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CiYjNDM7CiYjNDM7LyogVGhlIGNvdW50ZXJzIG9mIHRoZSBkZXZpY2UgbmFtZWQgYnkgdGFyZ2V0X2RldiBhcmUgc3RvcmVkIGhlcmUuICovCiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIFRoZSBzYW1lIGRldmljZSYjMzk7cyBjb3VudGVycyByZWFkIHRocm91Z2ggdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiAqLwomIzQzO3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIFNldCB0byAxIGJ5IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5IHdoZW4gYnBmX2dldF9yb290X2Jsa2NnKCkgc3VjY2VlZHMuICovCiYjNDM7X191NjQgZ290X3Jvb3RfYmxrY2cgU0VDKCYjMzQ7LmRhdGEucXVlcnkmIzM0Oyk7CiYjNDM7CiYjNDM7LyogRGV2aWNlIHRvIHJlYWQsIHNldCBieSB1c2Vyc3BhY2UgKGtlcm5lbCBkZXZfdCkuIFBpbm5pbmcgdGhlIGRldmljZSBrZWVwcwomIzQzOyAqIHRoZSByZWFkIGRldGVybWluaXN0aWMgYW5kIGxldHMgdGhlIHZhbHVlIGJlIGNvbXBhcmVkIHRvIGlvLnN0YXQgZXhhY3RseS4KJiM0MzsgKi8KJiM0MztfX3U2NCB0YXJnZXRfZGV2IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogRmx1c2ggQGJsa2NnIGFuZCBjb3B5IHRoZSB0YXJnZXQgZGV2aWNlJiMzOTtzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5CiYjNDM7ICogdGhlIG9uZSBwaW5uZWQgZGV2aWNlIGtlZXBzIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYzogdGhhdCBkZXZpY2UgaXMKJiM0MzsgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyAmIzM0O2FueSBkZXZpY2UKJiM0MzsgKiB3aXRoIEkvTyYjMzQ7IHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay4KJiM0MzsgKi8KJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csCiYjNDM7CQkJCQkgICAgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0MzsKJiM0MzsJLyogaW8uc3RhdCBuZWVkcyBhIGZsdXNoIGJlZm9yZSBpdCBjYW4gYmUgcmVhZCAoc2xlZXBhYmxlKS4gKi8KJiM0MzsJYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKGJsa2NnKTsKJiM0MzsKJiM0MzsJLyogVGhlIHBlci1kZXZpY2UgYmxrZyB3YWxrIG5lZWRzIGFuIFJDVSBzZWN0aW9uLiAqLwomIzQzOwlicGZfcmN1X3JlYWRfbG9jaygpOwomIzQzOwlicGZfZm9yX2VhY2goYmxrZywgcG9zLCBibGtjZykgewomIzQzOwkJaWYgKGJwZl9ibGtnX2Rldihwb3MpICE9IHRhcmdldF9kZXYpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlvdXQtJmd0O2RldiA9IGJwZl9ibGtnX2Rldihwb3MpOwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSBicGZfYmxrZ19pb3N0YXRfYnl0ZXMocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTsKJiM0MzsJCW91dC0mZ3Q7d2J5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfV1JJVEUpOwomIzQzOwkJb3V0LSZndDtyaW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1JFQUQpOwomIzQzOwkJb3V0LSZndDt3aW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTsKJiM0MzsJCW91dC0mZ3Q7ZGJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7CiYjNDM7CQlvdXQtJmd0O2Rpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIucy9jZ3JvdXAmIzM0OykKJiM0MztpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LSZndDtjZ3JvdXA7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CiYjNDM7CS8qIFRoZSBsYXN0IGl0ZXJhdGlvbiBoYXMgYSBOVUxMIGNncm91cCwgc2tpcCBpdC4gKi8KJiM0MzsJaWYgKCFjZ3JwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CS8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqLwomIzQzOwlfX2J1aWx0aW5fbWVtc2V0KCZhbXA7aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpOwomIzQzOwomIzQzOwlibGtjZyA9IGJwZl9nZXRfYmxrY2coJmFtcDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFibGtjZykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWFkX3RhcmdldF9kZXYoYmxrY2csICZhbXA7aW9fcXVlcnkpOwomIzQzOwomIzQzOwlicGZfcHV0X2Jsa2NnKGJsa2NnKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIucy9jZ3JvdXAmIzM0OykKJiM0MztpbnQgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjdHgtJmd0O2Nncm91cDsKJiM0MzsJc3RydWN0IGJsa2NnICpibGtjZzsKJiM0MzsKJiM0MzsJLyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqLwomIzQzOwlpZiAoIWNncnApCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJX19idWlsdGluX21lbXNldCgmYW1wO3Jvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7CiYjNDM7CiYjNDM7CWJsa2NnID0gYnBmX2dldF9yb290X2Jsa2NnKCk7CiYjNDM7CWlmICghYmxrY2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHJvb3QgY2dyb3VwIHRha2VzIGl0cyBudW1iZXJzIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMgcmF0aGVyCiYjNDM7CSAqIHRoYW4gZnJvbSByc3RhdCwgc28gdGhpcyBhbHNvIGNvdmVycyB0aGUgcm9vdCBzaWRlIG9mCiYjNDM7CSAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLiBUaGUgY291bnRlcnMgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTywgc28KJiM0MzsJICogdGhleSBjYW4gb25seSBiZSBhdCBvciBhYm92ZSB3aGF0IHRoaXMgdGVzdCYjMzk7cyBvd24gY2dyb3VwIGRpZC4KJiM0MzsJICovCiYjNDM7CXJlYWRfdGFyZ2V0X2RldihibGtjZywgJmFtcDtyb290X3F1ZXJ5KTsKJiM0MzsKJiM0MzsJZ290X3Jvb3RfYmxrY2cgPSAxOwomIzQzOwlicGZfcHV0X2Jsa2NnKGJsa2NnKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjQ5NAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDMyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipCUEYgS2Z1bmNzIGZvciBCbG9jayBJL08gQ29udHJvbGxlcjogSW5pdGlhbCBUaG91Z2h0cyoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjaW5nIEJQRiBrZnVuY3Mgc3BlY2lmaWNhbGx5IGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIsIGJsa2NnLiBJbnRlcmVzdGluZy4gVGhlIG5ldyBgYmxvY2svYnBmX2Jsa2NnLmNgIGZpbGUgbGF5cyBvdXQgdGhlIGdyb3VuZHdvcmssIHByb3ZpZGluZyBrZnVuY3MgbGlrZSBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBhbmQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uczogYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgLiBQbHVzLCB3ZSBnZXQgYWNjZXNzIHRvIHRob3NlIGNydWNpYWwgYGJwZl9ibGtnX2lvc3RhdF9ieXRlc2AsIGBicGZfYmxrZ19pb3N0YXRfaW9zYCwgYW5kIGBicGZfYmxrZ19kZXZgIGZ1bmN0aW9ucy4gRXNzZW50aWFsbHksIEJQRiBwcm9ncmFtcyBjYW4gbm93IGRpcmVjdGx5IHJlYWQgYSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gVGhpcyBpcyBnb2luZyB0byBiZSB1c2VmdWwuIFRoZSBjaGFuZ2VzIHRvdWNoIGJvdGggdGhlIGNvcmUgYmxvY2sgbGF5ZXIgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLCB3aGljaCBtZWFucyB3ZSB3aWxsIG5lZWQgdG8gdGVzdCBib3RoLgoKTm93LCB0aGlzIHNjcmVhbXMgJiMzNDtmdXp6aW5nIHRhcmdldCYjMzQ7IHRvIG1lLiBHZXR0aW5nIEJQRiB0byByZWxpYWJseSByZWFkIGJsa2NnIGRhdGEgd2lsbCByZXF1aXJlIHNvbWUgc2VyaW91cyB0ZXN0aW5nLiBMZXQmIzM5O3MgbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHJpZ2h0IHNvIHdlIGNhbiBidWlsZCB0aGlzLgoKTGV0JiMzOTtzIGZpbmQgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zLi4uIE9rYXksIGBibG9jay9NYWtlZmlsZWAgZ2l2ZXMgdXMgdGhlIGtleToKCmBgYG1ha2VmaWxlCmlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTApvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJwZl9ibGtjZy5vCmVuZGlmCmBgYAoKU28sIHdlJiMzOTtyZSBkZWZpbml0ZWx5IGxvb2tpbmcgYXQgbmVlZGluZyBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19CTEtfQ0dST1VQYCBlbmFibGVkLiAgTGV0JiMzOTtzIHZlcmlmeSB0aGVyZSBhcmUgbm8gb3RoZXIgZGVwZW5kZW5jaWVzLiBJIG5lZWQgdG8gcnVuIGEgYGdpdCBncmVwYCBjaGVjayBvbiBgQ09ORklHX0JMS19DR1JPVVBgIGluIGBibG9jay9LY29uZmlnYCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQkxLX0NHUk9VUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2Jsb2NrLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtibG9jay9LY29uZmlnPTM5PWNvbmZpZyBCTEtfUlFfQUxMT0NfVElNRVxuLS1cbmJsb2NrL0tjb25maWctNDEtXG5ibG9jay9LY29uZmlnOjQyOmNvbmZpZyBCTEtfQ0dST1VQX1JXU1RBVFxuYmxvY2svS2NvbmZpZy00My1cdGJvb2xcbmJsb2NrL0tjb25maWctNDQtXG5ibG9jay9LY29uZmlnOjQ1OmNvbmZpZyBCTEtfQ0dST1VQX1BVTlRfQklPXG5ibG9jay9LY29uZmlnLTQ2LVx0Ym9vbFxuLS1cbmJsb2NrL0tjb25maWc9MTI3PWNvbmZpZyBCTEtfV0JUX01RXG4tLVxuYmxvY2svS2NvbmZpZy0xMzMtXG5ibG9jay9LY29uZmlnOjEzNDpjb25maWcgQkxLX0NHUk9VUF9JT0xBVEVOQ1lcbmJsb2NrL0tjb25maWctMTM1LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCBmb3IgbGF0ZW5jeSBiYXNlZCBjZ3JvdXAgSU8gcHJvdGVjdGlvblwmIzM0O1xuLS1cbmJsb2NrL0tjb25maWctMTQ0LVxuYmxvY2svS2NvbmZpZzoxNDU6Y29uZmlnIEJMS19DR1JPVVBfRkNfQVBQSURcbmJsb2NrL0tjb25maWctMTQ2LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCB0byB0cmFjayBGQyBJL08gVHJhZmZpYyBhY3Jvc3MgY2dyb3VwIGFwcGxpY2F0aW9uc1wmIzM0O1xuLS1cbmJsb2NrL0tjb25maWctMTUzLVxuYmxvY2svS2NvbmZpZzoxNTQ6Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUXG5ibG9jay9LY29uZmlnLTE1NS1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgZm9yIGNvc3QgbW9kZWwgYmFzZWQgY2dyb3VwIElPIGNvbnRyb2xsZXJcJiMzNDtcbi0tXG5ibG9jay9LY29uZmlnLTE2My1cbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xuYmxvY2svS2NvbmZpZy0xNjUtXHRib29sIFwmIzM0O0Nncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjQwCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUuIE15IGN1cnJlbnQgdHJhaW4gb2YgdGhvdWdodCBzZWVtcyB0byBiZSBzdHVjayBvbiBzb21ldGhpbmcuIEkmIzM5O20gaGl0dGluZyBhIHJvYWRibG9jayBhbmQgbmVlZCB0byBmaW5kIGEgd2F5IGFyb3VuZCBpdC4gKipJbnZlc3RpZ2F0aW5nIEtlcm5lbCBDb25maWd1cmF0aW9uKiouIAoKSSBuZWVkIHRvIHJlZmluZSBteSBzZWFyY2guIFJpZ2h0IG5vdywgSSYjMzk7bSB0aGlua2luZyBJIHNob3VsZCBmb2N1cyBvbiBrZXJuZWwgY29uZmlndXJhdGlvbiwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5IG9uIHNvbWV0aGluZyByZWxhdGVkIHRvIGJsb2NrIGNncm91cHMuIFRvIGJlIHByZWNpc2UsIEkgc2hvdWxkIHRyeSB0byBzZWFyY2ggZm9yIHRoZSBleGFjdCBzdHJpbmc6IGBjb25maWcgQkxLX0NHUk9VUGAuIEhvcGVmdWxseSwgdGhhdCB3aWxsIGxlYWQgbWUgdG8gdGhlIHJlbGV2YW50IHNldHRpbmdzIGFuZCBkb2N1bWVudGF0aW9uIEkgbmVlZC4gVGltZSB0byBnZXQgc3BlY2lmaWMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteY29uZmlnIEJMS19DR1JPVVAkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzgyMAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHN1bW1hcnksIHByZXNlbnRlZCBhcyBhIHN0cmVhbSBvZiB0aG91Z2h0OgoKKipGb2N1c2luZyBJbiBvbiBCbG9jayBDR3JvdXBzKioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBgQkxLX0NHUk9VUGAgaXMgZGVmaW5lZCBvciBjb25maWd1cmVkLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBjaGVjayB0aGUgYGJsb2NrL0tjb25maWdgIGZpbGUuIFRoYXQmIzM5O3MgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQg4oCTIGl0JiMzOTtzIHdoZXJlIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBibG9jayBkZXZpY2VzIHR5cGljYWxseSByZXNpZGUuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSXQmIzM5O3MgdGltZSB0byBkZWx2ZSBpbnRvIHRoZSBLY29uZmlnLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGVzZSBvcHRpb25zIGFyZSBkZXNjcmliZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QkxLX0NHUk9VUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2Jsb2NrL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YmxvY2svS2NvbmZpZz0zOT1jb25maWcgQkxLX1JRX0FMTE9DX1RJTUVcbi0tXG5ibG9jay9LY29uZmlnLTQxLVxuYmxvY2svS2NvbmZpZzo0Mjpjb25maWcgQkxLX0NHUk9VUF9SV1NUQVRcbmJsb2NrL0tjb25maWctNDMtXHRib29sXG5ibG9jay9LY29uZmlnLTQ0LVxuYmxvY2svS2NvbmZpZzo0NTpjb25maWcgQkxLX0NHUk9VUF9QVU5UX0JJT1xuYmxvY2svS2NvbmZpZy00Ni1cdGJvb2xcbi0tXG5ibG9jay9LY29uZmlnPTEwNj1jb25maWcgQkxLX0RFVl9USFJPVFRMSU5HXG5ibG9jay9LY29uZmlnLTEwNy1cdGJvb2wgXCYjMzQ7QmxvY2sgbGF5ZXIgYmlvIHRocm90dGxpbmcgc3VwcG9ydFwmIzM0O1xuYmxvY2svS2NvbmZpZzoxMDg6XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbmJsb2NrL0tjb25maWc6MTA5Olx0c2VsZWN0IEJMS19DR1JPVVBfUldTVEFUXG5ibG9jay9LY29uZmlnLTExMC1cdGhlbHBcbi0tXG5ibG9jay9LY29uZmlnPTEyNz1jb25maWcgQkxLX1dCVF9NUVxuLS1cbmJsb2NrL0tjb25maWctMTMzLVxuYmxvY2svS2NvbmZpZzoxMzQ6Y29uZmlnIEJMS19DR1JPVVBfSU9MQVRFTkNZXG5ibG9jay9LY29uZmlnLTEzNS1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgZm9yIGxhdGVuY3kgYmFzZWQgY2dyb3VwIElPIHByb3RlY3Rpb25cJiMzNDtcbmJsb2NrL0tjb25maWc6MTM2Olx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXG5ibG9jay9LY29uZmlnLTEzNy1cdGhlbHBcbi0tXG5ibG9jay9LY29uZmlnLTE0NC1cbmJsb2NrL0tjb25maWc6MTQ1OmNvbmZpZyBCTEtfQ0dST1VQX0ZDX0FQUElEXG5ibG9jay9LY29uZmlnLTE0Ni1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgdG8gdHJhY2sgRkMgSS9PIFRyYWZmaWMgYWNyb3NzIGNncm91cCBhcHBsaWNhdGlvbnNcJiMzNDtcbmJsb2NrL0tjb25maWc6MTQ3Olx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQIFx1MDAyNlx1MDAyNiBOVk1FX0ZDXG5ibG9jay9LY29uZmlnLTE0OC1cdGhlbHBcbi0tXG5ibG9jay9LY29uZmlnLTE1My1cbmJsb2NrL0tjb25maWc6MTU0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVFxuYmxvY2svS2NvbmZpZy0xNTUtXHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXCYjMzQ7XG5ibG9jay9LY29uZmlnOjE1NjpcdGRlcGVuZHMgb24gQkxLX0NHUk9VUFxuYmxvY2svS2NvbmZpZy0xNTctXHRzZWxlY3QgQkxLX1JRX0FMTE9DX1RJTUVcbi0tXG5ibG9jay9LY29uZmlnLTE2My1cbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xuYmxvY2svS2NvbmZpZy0xNjUtXHRib29sIFwmIzM0O0Nncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1wmIzM0O1xuYmxvY2svS2NvbmZpZzoxNjY6XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbmJsb2NrL0tjb25maWctMTY3LVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0NTg5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGVidWdnaW5nIGEgS2VybmVsLUxldmVsIEJsb2NrIEkvTyBJc3N1ZSoqCgpPa2F5LCBzbyBJJiMzOTttIGtuZWUtZGVlcCBpbiB0aGlzIGJsb2NrIEkvTyBwZXJmb3JtYW5jZSBpc3N1ZSwgYW5kIEkmIzM5O3ZlIGhpdCBhIHNuYWcuIEkmIzM5O20gbG9va2luZyBhdCB0aGUgcmVsZXZhbnQgY29kZSBwYXRoLCBhbmQgSSYjMzk7dmUgZW5jb3VudGVyZWQgYEJMS19DR1JPVVBgLiBOb3csIG15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtXYWl0IGEgbWludXRlLi4uIHdoZXJlICpleGFjdGx5KiBpcyBgQkxLX0NHUk9VUGAgZGVmaW5lZD8mIzM0OyBJdCYjMzk7cyBiZWVuIGEgd2hpbGUgc2luY2UgSSBsYXN0IGxvb2tlZCBhdCB0aGlzIHBhcnQgb2YgdGhlIGtlcm5lbCwgYW5kIHRoZSBjZ3JvdXAgYmxvY2sgSS9PIGludGVncmF0aW9uIGNhbiBiZSB0cmlja3kuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgbWFjcm9zIGFuZCB2YXJpYWJsZXMgaW4gcGxheS4gSSBuZWVkIHRoZSBkZWZpbml0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyBoZXJlLiBJcyBpdCBhIGNvcmUgY2dyb3VwIGNvbnN0YW50PyBJcyBpdCBhIGxvY2FsIGRlZmluaXRpb24gd2l0aGluIHRoZSBibG9jayBsYXllciYjMzk7cyBjZ3JvdXAgaW1wbGVtZW50YXRpb24/IEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBoZWFkZXIgZmlsZSBvciBtb2R1bGUgdGhhdCBkZWNsYXJlcyB0aGlzIGNvbnN0YW50LiBXaXRob3V0IHRoYXQsIEkmIzM5O20gZXNzZW50aWFsbHkgZmx5aW5nIGJsaW5kIGFuZCBjYW4mIzM5O3QgYWNjdXJhdGVseSBhc3Nlc3MgaXRzIHJvbGUgaW4gdGhpcyBwZXJmb3JtYW5jZSBib3R0bGVuZWNrLiBCYWNrIHRvIHRoZSBpbmNsdWRlIHBhdGhzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15tZW51Y29uZmlnIEJMS19DR1JPVVAkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ4NzUKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBwcmVzZW50ZWQgYXMgYSBzdHJlYW0gb2YgdGhvdWdodDoKCioqS2NvbmZpZyBLZXl3b3JkIEh1bnQ6IEJMS19DR1JPVVAqKgoKUmlnaHQsIHRpbWUgdG8gZ2V0IHRvIHdvcmsuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBgQkxLX0NHUk9VUGAgd2l0aGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gSSBrbm93IGl0JiMzOTtzIHJlbGF0ZWQgdG8gY2dyb3VwIGJsb2NrIGRldmljZSBjb250cm9sLCBidXQgSSBuZWVkIGEgZGVmaW5pdGl2ZSBwaWN0dXJlLiBTbywgSSBuZWVkIHRvIGRvIGEgZnVsbCBzZWFyY2guIEkmIzM5O20gZ29pbmcgdG8gc2NhbiAqYWxsKiB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBtZWFucyBhIGNvbXByZWhlbnNpdmUgc2VhcmNoIGFjcm9zcyB0aGUgZW50aXJlIGtlcm5lbCBjb25maWd1cmF0aW9uIHNwYWNlLiBObyBjaGVycnktcGlja2luZywgSSB3YW50IHRoZSBmdWxsIGNvbnRleHQuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlcyBoYXZlIHRvIHNheSBhYm91dCB0aGlzLiBUaGF0IHNlYXJjaCBzaG91bGQgZ2l2ZSBtZSB0aGUgaW5mb3JtYXRpb24gSSBuZWVkLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gZGVwZW5kZW5jaWVzIGFuZCBkZWZhdWx0IHZhbHVlcyBvbmNlIEkgaGF2ZSB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XmNvbmZpZyBCTEtfQ0dST1VQJCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTA5OT1jb25maWcgTUVNQ0dfVjFcbi0tXG5pbml0L0tjb25maWctMTExNS1cbmluaXQvS2NvbmZpZzoxMTE2OmNvbmZpZyBCTEtfQ0dST1VQXG5pbml0L0tjb25maWctMTExNy1cdGJvb2wgXCYjMzQ7SU8gY29udHJvbGxlclwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTE3MAoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKlRyYWNpbmcgYSBDb25maWd1cmF0aW9uIERlcGVuZGVuY3kqKgoKUmlnaHQsIEkmIzM5O20gb250byBzb21ldGhpbmcuLi50aGUgc2V0dGluZyBJJiMzOTttIGFmdGVyIGlzIHByb2JhYmx5IGluIGBpbml0L0tjb25maWdgLiBDbGFzc2ljIHBsYWNlIGZvciBjb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gVGltZSB0byBkaWcgaW4gYW5kIHVuZGVyc3RhbmQgaXRzIGRlcGVuZGVuY2llcy4gTm8gcG9pbnQganVzdCBmbGlwcGluZyBhIHN3aXRjaCBibGluZGx5OyBnb3R0YSBmaWd1cmUgb3V0IHRoZSByYXRpb25hbGUgYmVoaW5kIGl0IGJlaW5nIHNldCB1cCB0aGUgd2F5IGl0IGlzLiBJIG5lZWQgdG8gc2VlICp3aHkqIGl0JiMzOTtzIGNvbmZpZ3VyZWQgdGhlIHdheSBpdCBpcyAtIGFyZSB0aGVyZSBzcGVjaWZpYyBmZWF0dXJlcywga2VybmVsIHZlcnNpb25zLCBvciBoYXJkd2FyZSBjb25maWd1cmF0aW9ucyB0aGF0IHRyaWdnZXIgaXRzIGluY2x1c2lvbj8gSXMgaXQgZ2F0ZWQgb24gc29tZSBlc290ZXJpYyBtZW51IHBhdGg/IEkmIzM5O2xsIG5lZWQgdG8gcmV2ZXJzZS1lbmdpbmVlciBpdHMgaW1wbGljYXRpb25zIHdpdGhpbiB0aGUgYnJvYWRlciBhcmNoaXRlY3R1cmUuIE9rYXksIGxldCYjMzk7cyBmaXJlIHVwIHRoZSBlZGl0b3IgYW5kIHN0YXJ0IHRyYWNpbmcuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJMS19DR1JPVVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTEwOTk9Y29uZmlnIE1FTUNHX1YxXG4tLVxuaW5pdC9LY29uZmlnLTExMTUtXG5pbml0L0tjb25maWc6MTExNjpjb25maWcgQkxLX0NHUk9VUFxuaW5pdC9LY29uZmlnLTExMTctXHRib29sIFwmIzM0O0lPIGNvbnRyb2xsZXJcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU0NTQKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKgoKT2theSwgc28gSSYjMzk7bSB0cnlpbmcgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMgcGFydGljdWxhciBhc3BlY3Qgb2YgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBJJiMzOTttIHRoaW5raW5nLCBgaW5pdC9LY29uZmlnYCBpcyB0aGUgcGxhY2UgdG8gc3RhcnQsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMTE2LiBUaGF0IGFyZWEgbGlrZWx5IGRlYWxzIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvciBhIHBhcnRpY3VsYXIgbW9kdWxlIEkmIzM5O20gaW50ZXJlc3RlZCBpbi4gSSBzaG91bGQgY2hlY2sgdGhhdCBzZWN0aW9uIGZvciB0aGUgcmVsZXZhbnQgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gTGV0JiMzOTtzIHNlZSB3aGF0IGdlbXMgbGllIGluIHdhaXQgaW4gdGhhdCBwb3J0aW9uIG9mIGBLY29uZmlnYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTEwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExMTA6XHRcdCAgUGxlYXNlIG5vdGUgdGhhdCBmZWF0dXJlIHNldCBvZiB0aGUgbGVnYWN5IG1lbW9yeSBjb250cm9sbGVyIGlzIGxpa2VseVxuMTExMTpcdFx0ICBnb2luZyB0byBzaHJpbmsgZHVlIHRvIGRlcHJlY2F0aW9uIHByb2Nlc3MuIE5ldyBkZXBsb3ltZW50cyB3aXRoIHYxXG4xMTEyOlx0XHQgIGNvbnRyb2xsZXIgYXJlIGhpZ2hseSBkaXNjb3VyYWdlZC5cbjExMTM6XHRcbjExMTQ6XHRcdCAgU2F5IE4gaWYgdW5zdXJlLlxuMTExNTpcdFxuMTExNjpcdGNvbmZpZyBCTEtfQ0dST1VQXG4xMTE3Olx0XHRib29sIFwmIzM0O0lPIGNvbnRyb2xsZXJcJiMzNDtcbjExMTg6XHRcdGRlcGVuZHMgb24gQkxPQ0tcbjExMTk6XHRcdGRlZmF1bHQgblxuMTEyMDpcdFx0aGVscFxuMTEyMTpcdFx0R2VuZXJpYyBibG9jayBJTyBjb250cm9sbGVyIGNncm91cCBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlIGNvbW1vblxuMTEyMjpcdFx0Y2dyb3VwIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgdXNlZCBieSB2YXJpb3VzIElPIGNvbnRyb2xsaW5nXG4xMTIzOlx0XHRwb2xpY2llcy5cbjExMjQ6XHRcbjExMjU6XHRcdEN1cnJlbnRseSwgQ0ZRIElPIHNjaGVkdWxlciB1c2VzIGl0IHRvIHJlY29nbml6ZSB0YXNrIGdyb3VwcyBhbmRcbjExMjY6XHRcdGNvbnRyb2wgZGlzayBiYW5kd2lkdGggYWxsb2NhdGlvbiAocHJvcG9ydGlvbmFsIHRpbWUgc2xpY2UgYWxsb2NhdGlvbilcbjExMjc6XHRcdHRvIHN1Y2ggdGFzayBncm91cHMuIEl0IGlzIGFsc28gdXNlZCBieSBiaW8gdGhyb3R0bGluZyBsb2dpYyBpblxuMTEyODpcdFx0YmxvY2sgbGF5ZXIgdG8gaW1wbGVtZW50IHVwcGVyIGxpbWl0IGluIElPIHJhdGVzIG9uIGEgZGV2aWNlLlxuMTEyOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTkxNAoJCQkJCQkJb3V0cHV0OiAyMzcKCQkJCQkJCXRob3VnaHRzOiAyMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBCbG9jayBjZ3JvdXAgQlBGIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBCTEtfQ0dST1VQYCBzdHVmZiwgYW5kIGl0JiMzOTtzIHByZXR0eSBjbGVhciB0aGF0IGl0IGhhcyBhIGRlcGVuZGVuY3kgb24gYEJMT0NLYC4gVGhhdCYjMzk7cyBub3QgdW5leHBlY3RlZCwgYnV0IGdvb2QgdG8ga2VlcCBpbiBtaW5kLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCBjb25maWcgaW5jbHVkZXMgYEJQRl9TWVNDQUxMYCBhbG9uZyB3aXRoIGBCTEtfQ0dST1VQYCDigJMgdGhlc2UgYXJlIG15IGJhc2UgcmVxdWlyZW1lbnRzLgoKTm93LCBsZXQmIzM5O3MgbmFpbCBkb3duIHRoZSBjcml0aWNhbCBwaWVjZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBuZXcgYWRkaXRpb25zIGFuZCBjaGFuZ2VzLiBNeSBmb2N1cyByaWdodCBub3cgaXMgdG8gaWRlbnRpZnkgdGhlIG1haW4gc3ltYm9scyB0aGF0IGRlZmluZSB0aGUgQlBGIGludGVncmF0aW9uIGZvciBibG9jayBjZ3JvdXBzLgoKRnJvbSBgYmxvY2svYnBmX2Jsa2NnLmNgLCB0aGVzZSBhcmUgdGhlIGtleSBmdW5jdGlvbnMgSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kOiBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAsIGBicGZfYmxrZ19pb3N0YXRfYnl0ZXNgLCBgYnBmX2Jsa2dfaW9zdGF0X2lvc2AsIGFuZCBgYnBmX2Jsa2dfZGV2YC4gVGhlc2UgY2xlYXJseSBoYW5kbGUgdGhpbmdzIGxpa2Ugcm9vdCBjZ3JvdXAgYWNjZXNzLCBjZ3JvdXAgbWFuYWdlbWVudCwgc3RhdHMgZmx1c2hpbmcsIGFuZCBpdGVyYXRpb24sIGFzIHdlbGwgYXMgYWNjZXNzaW5nIEkvTyBzdGF0aXN0aWNzIGFuZCB0aGUgZGV2aWNlIGl0c2VsZi4KCkl0IGxvb2tzIGxpa2UgdGhlIGBibGtjZ19maWxsX3Jvb3RfaW9zdGF0c2AgZnVuY3Rpb24gaW4gYGJsb2NrL2Jsay1jZ3JvdXAuY2AgaGFzIGFsc28gYmVlbiBjaGFuZ2VkIHRvIGJlIG5vbi1zdGF0aWMuIEkgbmVlZCB0byBjaGVjayB0aGlzIG91dCwgYXMgbm9uLXN0YXRpYyBsaWtlbHkgaW5kaWNhdGVzIGl0JiMzOTtzIHVzZWQgbW9yZSBicm9hZGx5IG5vdy4KCkkmIzM5O2xsIG1ha2Ugc3VyZSB0byBhZGQgYWxsIG9mIHRoZXNlIGFzICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDsgaW4gbXkgbm90ZXMsIHRvIHRyYWNrIHRoZW0gYXMgSSBkaXZlIGRlZXBlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfZ2V0X3Jvb3RfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX2dldF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfcHV0X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2lvc3RhdF9ieXRlcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfaW9zJiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2RldiYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBUaGVzZSBrZnVuY3MgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBoYW5kbGUgdmFyaW91cyBpbnB1dHMgYW5kIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBzYWZlbHkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfZ2V0X3Jvb3RfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX2dldF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfcHV0X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2lvc3RhdF9ieXRlcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfaW9zJiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2RldiYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBUaGVzZSBrZnVuY3MgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBoYW5kbGUgdmFyaW91cyBpbnB1dHMgYW5kIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBzYWZlbHkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYga2Z1bmNzIHRvIHJlYWQgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzIChpby5zdGF0KS4gSXQgZG9lcyBub3QgYWxsb2NhdGUgbmV3IGNvbXBsZXggc3RydWN0dXJlcywgY29weSBkYXRhIGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UsIG9yIGludHJvZHVjZSBsb2dpYyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGtmdW5jcyByZXR1cm4gc2ltcGxlIHNjYWxhciB2YWx1ZXMgKHU2NCkgb3IgcG9pbnRlcnMgdG8gZXhpc3RpbmcsIGluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzLiBUaGUgQlBGIGl0ZXJhdG9yIHN0YXRlIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gUkNVIG9yIGNncm91cCByZWZlcmVuY2VzLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDJjYTE5YThhMjQ4ODcyODg4ZGUxYTViZTdkNjc4MzhhMmYyYTQyMTcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIxOjAzOjAzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtNjYxNyw2ICYjNDM7NjYxNyw3IEBAIEY6CWJsb2NrL2Jsay1jZ3JvdXAuYwogRjoJYmxvY2svYmxrLWlvY29zdC5jCiBGOglibG9jay9ibGstaW9sYXRlbmN5LmMKIEY6CWJsb2NrL2Jsay10aHJvdHRsZS5jCiYjNDM7RjoJYmxvY2svYnBmX2Jsa2NnLmMKIEY6CWluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oCiAKIENPTlRST0wgR1JPVVAgLSBDUFVTRVQKZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGUKaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDQKLS0tIGEvYmxvY2svTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svTWFrZWZpbGUKQEAgLTE3LDYgJiM0MzsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSAmIzQzOz0gZXJyb3ItaW5qZWN0aW9uLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0JTR19DT01NT04pICYjNDM7PSBic2cubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKQkmIzQzOz0gYnNnLWxpYi5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJsay1jZ3JvdXAubwomIzQzO2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTAomIzQzO29iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYnBmX2Jsa2NnLm8KJiM0MztlbmRpZgogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKQkmIzQzOz0gYmxrLWNncm91cC1yd3N0YXQubwogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICYjNDM7PSBibGstY2dyb3VwLWZjLWFwcGlkLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcpCSYjNDM7PSBibGstdGhyb3R0bGUubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jCmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuYwomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmMKQEAgLTEwODYsNyAmIzQzOzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KQogICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJiMzOTtzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0CiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy4KICAqLwotc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKJiM0Mzt2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpCiB7CiAJc3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7CiAJc3RydWN0IGRldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oCmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaAomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmgKQEAgLTIwNSw2ICYjNDM7MjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKIAkJCSAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTsKIAogY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpOwomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7CiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csCiAJCSAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLAogCQkJCSAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSwKZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNDhhODZmMDdlMTk4YQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2JwZl9ibGtjZy5jCkBAIC0wLDAgJiM0MzsxLDMxNSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7LyoKJiM0MzsgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlLgomIzQzOyAqCiYjNDM7ICogVGhlc2UgbGV0IGEgQlBGIHByb2dyYW0gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBBIHByb2dyYW0gdHVybnMgYQomIzQzOyAqIGNncm91cCYjMzk7cyBjc3MgaW50byBhIHN0cnVjdCBibGtjZyB3aXRoIGJwZl9nZXRfYmxrY2coKSwgZmx1c2hlcyB0aGUgc3RhdHMgd2l0aAomIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtncyB3aXRoIHRoZQomIzQzOyAqIGJwZl9pdGVyX2Jsa2cgb3Blbi1jb2RlZCBpdGVyYXRvciwgcmVhZGluZyBlYWNoIGRldmljZSYjMzk7cyBjb3VudGVycyB3aXRoCiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKCkvYnBmX2Jsa2dfaW9zdGF0X2lvcygpLiBJdCBtaXJyb3JzIHRoZSBtZW1vcnkKJiM0MzsgKiBjb250cm9sbGVyIGtmdW5jcyBpbiBtbS9icGZfbWVtY29udHJvbC5jLCBidXQgYWRkcyBhIHBlci1kZXZpY2UgZGltZW5zaW9uOgomIzQzOyAqIHVubGlrZSBtZW1jZywgYmxrY2cga2VlcHMgb25lIGJsa2cgKGFuZCBvbmUgaW8uc3RhdCBsaW5lKSBwZXIgYmxvY2sgZGV2aWNlLgomIzQzOyAqCiYjNDM7ICogVGhpcyBmaWxlIGxpdmVzIGluIGJsb2NrLyBiZWNhdXNlIHRoZSBibGtjZy9ibGtnIHN0cnVjdCBsYXlvdXRzIGFyZSBwcml2YXRlCiYjNDM7ICogdG8gYmxvY2svYmxrLWNncm91cC5oLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7YmxrLWNncm91cC5oJiMzNDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJlZW1wdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9yY3VsaXN0LmgmZ3Q7CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9nZXRfcm9vdF9ibGtjZyAtIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cAomIzQzOyAqCiYjNDM7ICogVGhlIGZ1bmN0aW9uIGhhcyBLRl9BQ1FVSVJFIHNlbWFudGljcywgZXZlbiB0aG91Z2ggdGhlIHJvb3QgYmxvY2sgY2dyb3VwIGlzCiYjNDM7ICogbmV2ZXIgZGVzdHJveWVkIGFuZCBkb2VzbiYjMzk7dCByZXF1aXJlIHJlZmVyZW5jZSBjb3VudGluZy4gSXQmIzM5O3Mgc2FmZSB0byBwYXNzIGl0CiYjNDM7ICogdG8gYnBmX3B1dF9ibGtjZygpLgomIzQzOyAqCiYjNDM7ICogTm90ZSB0aGF0IHRoZSByb290IGNncm91cCBpcyBzcGVjaWFsOiBpdHMgY291bnRlcnMgYXJlIHRoZSBkaXNrcyYjMzk7IG93bgomIzQzOyAqIHN0YXRpc3RpY3MsIHNvIHRoZXkgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTyByYXRoZXIgdGhhbiBvbmx5IHRoZSByb290JiMzOTtzLgomIzQzOyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X3Jvb3RfYmxrY2codm9pZCkKJiM0Mzt7CiYjNDM7CS8qIGNzc19nZXQoKSBpcyBub3QgbmVlZGVkICovCiYjNDM7CXJldHVybiAmYW1wO2Jsa2NnX3Jvb3Q7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXAKJiM0MzsgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBJdCYjMzk7cyBmaW5lIHRvIHBhc3MgYSBjc3Mgd2hpY2ggYmVsb25ncyB0byBhbnkgY2dyb3VwIGNvbnRyb2xsZXIsCiYjNDM7ICogZS5nLiB1bmlmaWVkIGhpZXJhcmNoeSYjMzk7cyBtYWluIGNzcy4KJiM0MzsgKgomIzQzOyAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IEEgcG9pbnRlciB0byBhIGJsa2NnIHN0cnVjdHVyZSBhZnRlciBidW1waW5nIHRoZSBjb3JyZXNwb25kaW5nIGNzcyYjMzk7cwomIzQzOyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X2Jsa2NnKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnID0gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKGNzcy0mZ3Q7c3MgPT0gJmFtcDtpb19jZ3JwX3N1YnN5cykKJiM0MzsJCXJldHVybiBjc3NfdHJ5Z2V0KGNzcykgPyBjc3NfdG9fYmxrY2coY3NzKSA6IE5VTEw7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFNvbWUgb3RoZXIgY29udHJvbGxlciYjMzk7cyBjc3MsIG9yIHRoZSBjZ3JvdXAmIzM5O3Mgb3duIG9uZS4gTG9vayB1cCB0aGUgaW8KJiM0MzsJICogY29udHJvbGxlciYjMzk7cyBjc3M7IHJjdSBrZWVwcyBpdCBhbGl2ZSBiZXR3ZWVuIHRoZSBsb2FkIGFuZCB0aGUgdHJ5Z2V0LgomIzQzOwkgKiBBY3F1aXJlIGFuZCByZWxlYXNlIHJjdSBvbiBvbmUgc3RyYWlnaHQgcGF0aCwgc28gdGhhdCBibG9jay8mIzM5O3MgbG9jawomIzQzOwkgKiBjb250ZXh0IGFuYWx5c2lzIGNhbiBmb2xsb3cgaXQuCiYjNDM7CSAqLwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CWNzcyA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoY3NzLSZndDtjZ3JvdXAtJmd0O3N1YnN5c1tpb19jZ3JwX2lkXSk7CiYjNDM7CWlmIChjc3MgJmFtcDsmYW1wOyBjc3NfdHJ5Z2V0KGNzcykpCiYjNDM7CQlibGtjZyA9IGNzc190b19ibGtjZyhjc3MpOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGJsa2NnOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHV0X2Jsa2NnIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgYmxvY2sgY2dyb3VwCiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAgdG8gcmVsZWFzZQomIzQzOyAqCiYjNDM7ICogUmVsZWFzZXMgYSBwcmV2aW91c2x5IGFjcXVpcmVkIGJsa2NnIHJlZmVyZW5jZS4KJiM0MzsgKiBJbXBsZW1lbnRzIEtGX1JFTEVBU0Ugc2VtYW50aWNzLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX3B1dF9ibGtjZyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKQomIzQzO3sKJiM0MzsJY3NzX3B1dCgmYW1wO2Jsa2NnLSZndDtjc3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMgLSBGbHVzaCBhIGJsb2NrIGNncm91cCYjMzk7cyBpbyBzdGF0aXN0aWNzCiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAKJiM0MzsgKgomIzQzOyAqIENhbGwgdGhpcyBiZWZvcmUgcmVhZGluZyBjb3VudGVycyBmb3IgdXAtdG8tZGF0ZSB2YWx1ZXMuIFNsZWVwYWJsZS4KJiM0MzsgKgomIzQzOyAqIEl0IGRvZXMgd2hhdCByZWFkaW5nIHRoZSBpby5zdGF0IGZpbGUgZG9lcywgd2hpY2ggZGlmZmVycyBieSBjZ3JvdXAuIEZvciBhCiYjNDM7ICogbm9uLXJvb3QgY2dyb3VwIGl0IGZvbGRzIHRoZSBwZXItY3B1IGRlbHRhcyBpbnRvIHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXMKJiM0MzsgKiBhbmQgdXAgdGhlIGNncm91cCB0cmVlLiBUaGUgcm9vdCBjZ3JvdXAgaXMgbm90IGFjY291bnRlZCB0aHJvdWdoIHJzdGF0IGF0CiYjNDM7ICogYWxsLCBzbyBmb3IgaXQgdGhlIHBlci1kZXZpY2UgYWdncmVnYXRlcyBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MmIzM5OwomIzQzOyAqIG93biBzdGF0aXN0aWNzLCB3aGljaCBjb3VudCBldmVyeSBjZ3JvdXAmIzM5O3MgSS9PLgomIzQzOyAqCiYjNDM7ICogVGhlIHJvb3QgYnJhbmNoIGlzIG5vdCBzZWxmLWxpbWl0aW5nIHRoZSB3YXkgdGhlIHJzdGF0IG9uZSBpczogaXQgcmVyZWFkcwomIzQzOyAqIGV2ZXJ5IGRpc2sgb24gZXZlcnkgY2FsbCwgd2hpbGUgYSBzZWNvbmQgcnN0YXQgZmx1c2ggZmluZHMgbm90aGluZyBsZWZ0IHRvCiYjNDM7ICogZm9sZC4gVGhlIG51bWJlcnMgaXQgcHJvZHVjZXMgYXJlIHRoZSBzYW1lIGZvciBldmVyeSBjZ3JvdXAsIHNvIHJlYWQgdGhlbQomIzQzOyAqIG9uY2UgcmF0aGVyIHRoYW4gb25jZSBwZXIgY2dyb3VwIG9mIGEgd2Fsay4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKQomIzQzO3sKJiM0MzsJaWYgKCFibGtjZy0mZ3Q7Y3NzLnBhcmVudCkKJiM0MzsJCWJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7CiYjNDM7CWVsc2UKJiM0MzsJCWNzc19yc3RhdF9mbHVzaCgmYW1wO2Jsa2NnLSZndDtjc3MpOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzJdOwomIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gewomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnOwomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0Mzt9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzCiYjNDM7ICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplCiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrCiYjNDM7ICoKJiM0MzsgKiBFYWNoIHlpZWxkZWQgYmxrZyBob2xkcyBvbmUgYmxvY2sgZGV2aWNlJiMzOTtzIGNvdW50ZXJzLCB0aGUgc2FtZSBvbmVzIGJlaGluZCBhCiYjNDM7ICogcGVyLWRldmljZSBsaW5lIG9mIHRoZSBpby5zdGF0IGZpbGUuIE9mZmxpbmUgYmxrZ3MgYXJlIHNraXBwZWQsIGFzIHRoZSBmaWxlCiYjNDM7ICogc2tpcHMgdGhlbS4gT25lIGNhc2UgZGlmZmVyczogdGhlIGZpbGUgcHJpbnRzIG5vIGxpbmUgZm9yIGEgYmxrZyB3aG9zZSBkaXNrCiYjNDM7ICogaXMgZ29uZSwgd2hpbGUgdGhlIHdhbGsgc3RpbGwgeWllbGRzIGl0LCBhbmQgYnBmX2Jsa2dfZGV2KCkgcmV0dXJucyAwIGZvcgomIzQzOyAqIGl0LiBNdXN0IGJlIHVzZWQgaW5zaWRlIGFuIFJDVSByZWFkIHNlY3Rpb24uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfYmxrZ19uZXcoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0LCBzdHJ1Y3QgYmxrY2cgKmJsa2NnKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAmZ3Q7IHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpOwomIzQzOwlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgIT0KJiM0MzsJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTsKJiM0MzsKJiM0MzsJa2l0LSZndDtibGtjZyA9IGJsa2NnOwomIzQzOwlraXQtJmd0O3BvcyA9IE5VTEw7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cAomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC0mZ3Q7cG9zOwomIzQzOwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKJiM0MzsKJiM0MzsJLyogQ2xlYXJlZCBvbmNlIHRoZSB3YWxrIGlzIGRvbmUsIHNlZSBiZWxvdy4gKi8KJiM0MzsJaWYgKCFraXQtJmd0O2Jsa2NnKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmICghYmxrZykKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KCZhbXA7a2l0LSZndDtibGtjZy0mZ3Q7YmxrZ19saXN0KSk7CiYjNDM7CWVsc2UKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CiYjNDM7CS8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi8KJiM0MzsJd2hpbGUgKG5vZGUpIHsKJiM0MzsJCWJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpOwomIzQzOwkJaWYgKGJsa2ctJmd0O29ubGluZSkgewomIzQzOwkJCWtpdC0mZ3Q7cG9zID0gYmxrZzsKJiM0MzsJCQlyZXR1cm4gYmxrZzsKJiM0MzsJCX0KJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRm9yZ2V0IHRoZSBsaXN0IGhlYWQgYXMgd2VsbC4gVGhlIHZlcmlmaWVyIGFzc3VtZXMgdGhhdCBhbiBpdGVyYXRvcgomIzQzOwkgKiB3aGljaCByZXR1cm5lZCBOVUxMIGtlZXBzIHJldHVybmluZyBOVUxMLCBhbmQgc3RvcHMgY2hlY2tpbmcgdGhlCiYjNDM7CSAqIGxvb3AgZm9yIHRlcm1pbmF0aW9uIG9uY2UgaXQgaGFzOyBzdGFydGluZyB0aGUgd2FsayBvdmVyIHdvdWxkIGxldAomIzQzOwkgKiBzdWNoIGEgbG9vcCBzcGluIGZvcmV2ZXIuCiYjNDM7CSAqLwomIzQzOwlraXQtJmd0O3BvcyA9IE5VTEw7CiYjNDM7CWtpdC0mZ3Q7YmxrY2cgPSBOVUxMOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvcgomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJiMzOTtzIGZsdXNoZWQgaW8uc3RhdCBhZ2dyZWdhdGUuIEBjb3VudGVycyBpcyBvbmUKJiM0MzsgKiBvZiB0aGUgdHdvIGFycmF5cyBpbiBibGtnLSZndDtpb3N0YXQuY3VyOyBib3RoIGFyZSBndWFyZGVkIGJ5IHRoYXQgc3RydWN0JiMzOTtzCiYjNDM7ICogc2VxbG9jaywgdGhlIG9uZSB0aGUgaW8uc3RhdCBmaWxlIHVzZXMuIFJldHVybnMgKHU2NCktMSBpZiB0aGUgY291bnRlcgomIzQzOyAqIGNhbm5vdCBiZSByZWFkLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1NjQgYmxrZ19pb3N0YXRfcmVhZChzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csIGNvbnN0IHU2NCAqY291bnRlcnMsCiYjNDM7CQkJICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibGtnX2lvc3RhdF9zZXQgKmJpcyA9ICZhbXA7YmxrZy0mZ3Q7aW9zdGF0OwomIzQzOwl1bnNpZ25lZCBpbnQgc2VxOwomIzQzOwl1NjQgdmFsOwomIzQzOwomIzQzOwlpZiAoKHVuc2lnbmVkIGludClydyAmZ3Q7PSBCTEtHX0lPU1RBVF9OUikKJiM0MzsJCXJldHVybiAodTY0KS0xOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPbiAzMi1iaXQgdGhlIGxvb3AgYmVsb3cgcmVhbGx5IGlzIGEgc2VxY291bnQgcmV0cnkgbG9vcC4gRXZlcnkKJiM0MzsJICogd3JpdGVyIG9mIGJsa2ctJmd0O2lvc3RhdCBrZWVwcyBpbnRlcnJ1cHRzIG9mZiwgc28gb25seSBhbiBOTUkgY2FuIGxhbmQKJiM0MzsJICogaW5zaWRlIGFuIHVwZGF0ZSwgYW5kIHRoZW4gdGhlIGxvb3Agd291bGQgbmV2ZXIgZW5kLiBUaGVzZSBrZnVuY3MKJiM0MzsJICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvCiYjNDM7CSAqIGdpdmUgdXAgcmF0aGVyIHRoYW4gc3Bpbi4gT24gNjQtYml0IHRoZSBsb29wIGNvbXBpbGVzIGF3YXkuCiYjNDM7CSAqLwomIzQzOwlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmYW1wOyZhbXA7IGluX25taSgpKQomIzQzOwkJcmV0dXJuICh1NjQpLTE7CiYjNDM7CiYjNDM7CWRvIHsKJiM0MzsJCXNlcSA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbigmYW1wO2Jpcy0mZ3Q7c3luYyk7CiYjNDM7CQl2YWwgPSBjb3VudGVyc1tyd107CiYjNDM7CX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeSgmYW1wO2Jpcy0mZ3Q7c3luYywgc2VxKSk7CiYjNDM7CiYjNDM7CXJldHVybiB2YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9ibGtnX2lvc3RhdF9ieXRlcyAtIFJlYWQgYSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBieXRlIGNvdW50ZXIKJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAgKG9uZSBkZXZpY2Ugb2YgYSBibG9jayBjZ3JvdXApCiYjNDM7ICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpCiYjNDM7ICoKJiM0MzsgKiBSZWFkcyB0aGUgZmx1c2hlZCBhZ2dyZWdhdGUsIHNvIGNhbGwgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkgZmlyc3QgZm9yCiYjNDM7ICogdXAtdG8tZGF0ZSB2YWx1ZXMuIFRoZSByZWFkIHVzZXMgdGhlIHU2NF9zdGF0cyBzZXFsb2NrLCBsaWtlIHRoZSBpby5zdGF0CiYjNDM7ICogZmlsZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG51bWJlciBvZiBieXRlcywgb3IgKHU2NCktMSBpZiBAcncgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZQomIzQzOyAqIGNvdW50ZXIgY2Fubm90IGJlIHJlYWQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdTY0IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csCiYjNDM7CQkJCSAgICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydykKJiM0Mzt7CiYjNDM7CXJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctJmd0O2lvc3RhdC5jdXIuYnl0ZXMsIHJ3KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2lvcyAtIFJlYWQgYSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBJL08gY291bnQKJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAgKG9uZSBkZXZpY2Ugb2YgYSBibG9jayBjZ3JvdXApCiYjNDM7ICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgSS9Pcywgb3IgKHU2NCktMSBpZiBAcncgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZQomIzQzOyAqIGNvdW50ZXIgY2Fubm90IGJlIHJlYWQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdTY0IGJwZl9ibGtnX2lvc3RhdF9pb3Moc3RydWN0IGJsa2NnX2dxICpibGtnLAomIzQzOwkJCQkgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KQomIzQzO3sKJiM0MzsJcmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5pb3MsIHJ3KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2dfZGV2IC0gUmV0dXJuIGEgYmxrZyYjMzk7cyBkZXZpY2UgaWQKJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIGRldmljZSYjMzk7cyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2cKJiM0MzsgKiBoYXMgbm8gZGlzay4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZykKJiM0Mzt7CiYjNDM7CWlmICghYmxrZy0mZ3Q7cSB8fCAhYmxrZy0mZ3Q7cS0mZ3Q7ZGlzaykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gYmxrZy0mZ3Q7cS0mZ3Q7ZGlzay0mZ3Q7cGFydDAtJmd0O2JkX2RldjsKJiM0Mzt9CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKJiM0MzsKJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wdXRfYmxrY2csIEtGX1JFTEVBU0UpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKQomIzQzOwomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSkKJiM0MzsKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfZGV2LCBLRl9SQ1UpCiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHsKJiM0MzsJLm93bmVyCQk9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0CQk9ICZhbXA7YnBmX2Jsa2NnX2tmdW5jcywKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLAomIzQzOwkJCQkJJmFtcDticGZfYmxrY2dfa2Z1bmNfc2V0KTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxuJiMzNDssIGVycik7CiYjNDM7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmgKQEAgLTAsMCAmIzQzOzEsMTcgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaWZuZGVmIF9fQ0dST1VQX0lURVJfSU9fSAomIzQzOyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHsKJiM0MzsJLyogb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzICovCiYjNDM7CV9fdTY0IHJieXRlczsKJiM0MzsJX191NjQgd2J5dGVzOwomIzQzOwlfX3U2NCByaW9zOwomIzQzOwlfX3U2NCB3aW9zOwomIzQzOwlfX3U2NCBkYnl0ZXM7CiYjNDM7CV9fdTY0IGRpb3M7CiYjNDM7CV9fdTY0IGRldjsJLyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovCiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwppbmRleCBlYTcwNDRmMzBhZGMzLi4yNzBlNmJmOTE5NGQyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKQEAgLTEsMyAmIzQzOzEsNCBAQAomIzQzO0NPTkZJR19CTEtfQ0dST1VQPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXkKIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQz0xCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zMmNkYTgyNDMzMTgzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSwzMTAgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2xpYmJwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9sb29wLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zeXNtYWNyb3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9pdGVyX2lvLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfc3RhdHMoc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJaW50IGZkLCByZXQgPSAwOwomIzQzOwlzc2l6ZV90IGJ5dGVzOwomIzQzOwomIzQzOwlmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZCwgJiMzNDticGZfaXRlcl9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogUmVzdWx0cyBsYW5kIGluIHNrZWwtJmd0O2RhdGFfcXVlcnk7IHRoZSByZWFkIGl0c2VsZiByZXR1cm5zIG5vIGRhdGEuICovCiYjNDM7CWJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCAmIzM0O3JlYWQgZmQmIzM0OykpCiYjNDM7CQlyZXQgPSAxOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQXR0YWNoIGEgbG9vcCBkZXZpY2UgdG8gYW4gYW5vbnltb3VzIHRlbXAgZmlsZSBzbyB3ZSBoYXZlIGEgcmVhbCBibG9jawomIzQzOyAqIGRldmljZSB0byBnZW5lcmF0ZSBjZ3JvdXAtY2hhcmdlZCBJL08gYWdhaW5zdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xCiYjNDM7ICogaWYgbG9vcCBkZXZpY2VzIGFyZSB1bmF2YWlsYWJsZSAobm9uLXJvb3QgLyBubyBDT05GSUdfQkxLX0RFVl9MT09QKSBzbyB0aGUKJiM0MzsgKiBjYWxsZXIgY2FuIHNraXAuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLAomIzQzOwkJICAgICAgaW50ICpiYWNrX2ZkKQomIzQzO3sKJiM0MzsJY2hhciBiYWNrX3BhdGhbXSA9ICYjMzQ7L3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFgmIzM0OzsKJiM0MzsJaW50IG5yOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gb3BlbigmIzM0Oy9kZXYvbG9vcC1jb250cm9sJiMzNDssIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqY3RsX2ZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbnIgPSBpb2N0bCgqY3RsX2ZkLCBMT09QX0NUTF9HRVRfRlJFRSk7CiYjNDM7CWlmIChuciAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJc25wcmludGYobG9vcF9wYXRoLCBzeiwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCBucik7CiYjNDM7CiYjNDM7CSpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpOwomIzQzOwlpZiAoKmJhY2tfZmQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CXVubGluayhiYWNrX3BhdGgpOwomIzQzOwlpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CSpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqbG9vcF9mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO2VycjoKJiM0MzsJaWYgKCpsb29wX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqbG9vcF9mZCk7CiYjNDM7CWlmICgqYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoKmJhY2tfZmQpOwomIzQzOwljbG9zZSgqY3RsX2ZkKTsKJiM0MzsJKmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBsb29wX3RlYXJkb3duKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCwgaW50IGN0bF9mZCwgaW50IGxvb3BfZmQsCiYjNDM7CQkJICBpbnQgYmFja19mZCkKJiM0Mzt7CiYjNDM7CWludCBuciA9IC0xOwomIzQzOwomIzQzOwlpZiAobG9vcF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpb2N0bChsb29wX2ZkLCBMT09QX0NMUl9GRCwgMCk7CiYjNDM7CQljbG9zZShsb29wX2ZkKTsKJiM0MzsJfQomIzQzOwlpZiAoYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoYmFja19mZCk7CiYjNDM7CWlmIChjdGxfZmQgJmd0Oz0gMCkgewomIzQzOwkJaWYgKHNzY2FuZihsb29wX3BhdGgsICYjMzQ7L2Rldi9sb29wJWQmIzM0OywgJmFtcDtucikgPT0gMSAmYW1wOyZhbXA7IG5yICZndDs9IDApCiYjNDM7CQkJaW9jdGwoY3RsX2ZkLCBMT09QX0NUTF9SRU1PVkUsIG5yKTsKJiM0MzsJCWNsb3NlKGN0bF9mZCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogT19ESVJFQ1QgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgY2hhcmdlZCB0byB0aGUgY3VycmVudCBjZ3JvdXAuICovCiYjNDM7c3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKQomIzQzO3sKJiM0MzsJdm9pZCAqYnVmOwomIzQzOwlpbnQgZmQsIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0RJUkVDVCB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWlmIChwb3NpeF9tZW1hbGlnbigmYW1wO2J1ZiwgNDA5NiwgSU9fU0laRSkpCiYjNDM7CQlnb3RvIG91dF9mZDsKJiM0MzsJbWVtc2V0KGJ1ZiwgMHhhYiwgSU9fU0laRSk7CiYjNDM7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJZnN5bmMoZmQpOwomIzQzOwlpZiAocHJlYWQoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJcmV0ID0gMDsKJiM0MztvdXRfYnVmOgomIzQzOwlmcmVlKGJ1Zik7CiYjNDM7b3V0X2ZkOgomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUGFyc2UgdGhlIGlvLnN0YXQgbGluZSBmb3IgZGV2aWNlIEBkZXYgb3V0IG9mIHRoZSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBmaWxlIGFuZAomIzQzOyAqIGZpbGwgQG91dC4gQGRldiBpcyBhIGtlcm5lbCBkZXZfdCAoYXMgcmV0dXJuZWQgYnkgYnBmX2Jsa2dfZGV2KSwgd2hvc2UKJiM0MzsgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlCiYjNDM7ICogZGV2aWNlJiMzOTtzIGxpbmUgd2FzIGZvdW5kLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcGFyc2VfaW9fc3RhdChpbnQgY2dyb3VwX2ZkLCBfX3U2NCBkZXYsIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2ICZndDsmZ3Q7IDIwLCB3YW50X21pbiA9IGRldiAmYW1wOyAoKDFVICZsdDsmbHQ7IDIwKSAtIDEpOwomIzQzOwljaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyOwomIzQzOwlpbnQgZmQsIG4sIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW5hdChjZ3JvdXBfZmQsICYjMzQ7aW8uc3RhdCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJaWYgKG4gJmx0Oz0gMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnVmW25dID0gJiMzOTtcMCYjMzk7OwomIzQzOwomIzQzOwlmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsICYjMzQ7XG4mIzM0OywgJmFtcDtzYXZlcHRyKTsgbGluZTsKJiM0MzsJICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgJiMzNDtcbiYjMzQ7LCAmYW1wO3NhdmVwdHIpKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGxvbmcgcmIgPSAwLCB3YiA9IDAsIHJpID0gMCwgd2kgPSAwLCBkYiA9IDAsIGRpID0gMDsKJiM0MzsJCXVuc2lnbmVkIGludCBtYWosIG1pbjsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGUgJiMzNDttYWo6bWluJiMzNDsgdG9rZW4gaXMgYWx3YXlzIHByZXNlbnQ7IHRoZSBmaWVsZCBibG9jayBpcwomIzQzOwkJICogb3B0aW9uYWwgKHRoZSBrZXJuZWwgb21pdHMgaXQgZm9yIGEgZGV2aWNlIHdpdGggbm8gcmVhZC93cml0ZQomIzQzOwkJICogSS9PKSwgc28gYSBtYXRjaCBvZiAmZ3Q7PSAyIGlzIGVub3VnaCBhbmQgYWJzZW50IGZpZWxkcyBzdGF5IDAuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChzc2NhbmYobGluZSwKJiM0MzsJCQkgICAmIzM0OyV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1JiMzNDssCiYjNDM7CQkJICAgJmFtcDttYWosICZhbXA7bWluLCAmYW1wO3JiLCAmYW1wO3diLCAmYW1wO3JpLCAmYW1wO3dpLCAmYW1wO2RiLCAmYW1wO2RpKSAmbHQ7IDIpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCW91dC0mZ3Q7cmJ5dGVzID0gcmI7CiYjNDM7CQlvdXQtJmd0O3dieXRlcyA9IHdiOwomIzQzOwkJb3V0LSZndDtyaW9zID0gcmk7CiYjNDM7CQlvdXQtJmd0O3dpb3MgPSB3aTsKJiM0MzsJCW91dC0mZ3Q7ZGJ5dGVzID0gZGI7CiYjNDM7CQlvdXQtJmd0O2Rpb3MgPSBkaTsKJiM0MzsJCXJldCA9IDA7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgKmNncm91cF9yZWxfcGF0aCA9ICYjMzQ7L2Nncm91cF9pdGVyX2lvX3Rlc3QmIzM0OzsKJiM0MzsJaW50IGN0bF9mZCA9IC0xLCBsb29wX2ZkID0gLTEsIGJhY2tfZmQgPSAtMTsKJiM0MzsJc3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDsKJiM0MzsJc3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDsKJiM0MzsJY2hhciBsb29wX3BhdGhbNjRdOwomIzQzOwlzdHJ1Y3QgaW9fcXVlcnkgKnE7CiYjNDM7CWludCBjZ3JvdXBfZmQ7CiYjNDM7CiYjNDM7CWNncm91cF9mZCA9IGNncm91cF9zZXR1cF9hbmRfam9pbihjZ3JvdXBfcmVsX3BhdGgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsICYjMzQ7Y2dyb3VwX3NldHVwX2FuZF9qb2luJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCAmYW1wO2N0bF9mZCwgJmFtcDtsb29wX2ZkLCAmYW1wO2JhY2tfZmQpKSB7CiYjNDM7CQl0ZXN0X19za2lwKCk7CS8qIG5lZWRzIHJvb3QgJiM0MzsgQ09ORklHX0JMS19ERVZfTE9PUCAqLwomIzQzOwkJZ290byBjbGVhbnVwX2Nncm91cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwlza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbG9vcDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUGluIHRoZSByZWFkIHRvIHRoZSBsb29wIGRldmljZSBzbyB0aGUgbWVhc3VyZWQgZGV2aWNlIGlzIHN0YWJsZSBhbmQKJiM0MzsJICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90CiYjNDM7CSAqIGVuY29kaW5nIChtYWpvciAmbHQ7Jmx0OyAyMCB8IG1pbm9yKSB0aGF0IGJwZl9ibGtnX2RldiByZXR1cm5zLgomIzQzOwkgKi8KJiM0MzsJewomIzQzOwkJc3RydWN0IHN0YXQgbHN0OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgJmFtcDtsc3QpLCAmIzM0O2ZzdGF0IGxvb3AmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CQlza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDt0YXJnZXRfZGV2ID0KJiM0MzsJCQkoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSAmbHQ7Jmx0OyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJREVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7CiYjNDM7CXVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHsKJiM0MzsJCS5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLAomIzQzOwkJLmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksCiYjNDM7CX07CiYjNDM7CW9wdHMubGlua19pbmZvID0gJmFtcDtsaW5mbzsKJiM0MzsJb3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTsKJiM0MzsKJiM0MzsJbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfaW9fcXVlcnksICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCAmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9za2VsOwomIzQzOwomIzQzOwkvKiBUaGlzIHByb2Nlc3MgaXMgaW4gdGhlIHRlc3QgY2dyb3VwLCBzbyB0aGUgbG9vcCBJL08gaXMgY2hhcmdlZCBoZXJlLiAqLwomIzQzOwlpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgJiMzNDtkb19kaXJlY3RfaW8mIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xpbms7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFdlYWsgY2hlY2s6IHdlIGRpZCBJL08sIHNvIHRoZSBudW1iZXJzIG11c3QgYmUgbm9uLXplcm8uIEZvbGxvd3MgdGhlCiYjNDM7CSAqIHBhdHRlcm4gaW4gY2dyb3VwX2l0ZXJfbWVtY2cuCiYjNDM7CSAqLwomIzQzOwlxID0gJmFtcDtza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtpb19xdWVyeTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fd3JpdGUmIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDt3Ynl0ZXMsIDAsICYjMzQ7d2J5dGVzJiMzNDspOwomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3dpb3MsIDAsICYjMzQ7d2lvcyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19yZWFkJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7cmJ5dGVzLCAwLCAmIzM0O3JieXRlcyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtyaW9zLCAwLCAmIzM0O3Jpb3MmIzM0Oyk7CiYjNDM7CX0KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fZGV2JiMzNDspKQomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O2RldiwgMCwgJiMzNDtkZXYmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFN0cm9uZ2VyIGNoZWNrOiB0aGUga2Z1bmMtcmVhZCB2YWx1ZXMgbXVzdCBlcXVhbCB3aGF0IHRoZSBpby5zdGF0CiYjNDM7CSAqIGZpbGUgcmVwb3J0cyBmb3IgdGhlIHNhbWUgZGV2aWNlLiBSZWZyZXNoIHZpYSB0aGUgcHJvZywgdGhlbiByZWFkCiYjNDM7CSAqIHRoZSBmaWxlIHdpdGggbm8gSS9PIGluIGJldHdlZW4sIHNvIGJvdGggZmx1c2hlZCBzbmFwc2hvdHMgbWF0Y2gKJiM0MzsJICogZXhhY3RseS4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX21hdGNoJiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgaW9fcXVlcnkgZmlsZXYgPSB7fTsKJiM0MzsKJiM0MzsJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJCSAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtJmd0O2RldiwgJmFtcDtmaWxldiksCiYjNDM7CQkJICAgICAgJiMzNDtwYXJzZSBpby5zdGF0JiMzNDspKSB7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3JieXRlcywgZmlsZXYucmJ5dGVzLCAmIzM0O3JieXRlcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2J5dGVzLCBmaWxldi53Ynl0ZXMsICYjMzQ7d2J5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtyaW9zLCBmaWxldi5yaW9zLCAmIzM0O3Jpb3MmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3dpb3MsIGZpbGV2Lndpb3MsICYjMzQ7d2lvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7ZGJ5dGVzLCBmaWxldi5kYnl0ZXMsICYjMzQ7ZGJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkaW9zLCBmaWxldi5kaW9zLCAmIzM0O2Rpb3MmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWUKJiM0MzsJICogZnJvbSByc3RhdCwgdGhleSBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcywgc28gdGhpcwomIzQzOwkgKiBjb3ZlcnMgdGhlIG90aGVyIGhhbGYgb2YgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZXkgY292ZXIgZXZlcnkKJiM0MzsJICogY2dyb3VwJiMzOTtzIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGFuZCBvbmx5IHRoaXMgdGVzdCB0b3VjaGVzIGl0LCBzbwomIzQzOwkgKiB0aGV5IG11c3QgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGUgdGVzdCBjZ3JvdXAgd2FzIGNoYXJnZWQuCiYjNDM7CSAqLwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19yb290JiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluazsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSAqcjsKJiM0MzsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2dvdF9yb290X2Jsa2NnID0gMDsKJiM0MzsJCXJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSwKJiM0MzsJCQkJCQkgICAgICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssICYjMzQ7YXR0YWNoIHJvb3QgaXRlciYjMzQ7KSkgewomIzQzOwkJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhyb290X2xpbmspLCAmIzM0O3JlYWQgcm9vdCBzdGF0cyYjMzQ7KSkgewomIzQzOwkJCQlyID0gJmFtcDtza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtyb290X3F1ZXJ5OwomIzQzOwkJCQlBU1NFUlRfRVEoc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfYmxrY2csIDEsCiYjNDM7CQkJCQkgICYjMzQ7Z290X3Jvb3RfYmxrY2cmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9FUShyLSZndDtkZXYsIHEtJmd0O2RldiwgJiMzNDtyb290IGRldiYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3dieXRlcywgcS0mZ3Q7d2J5dGVzLCAmIzM0O3Jvb3Qgd2J5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2lvcywgcS0mZ3Q7d2lvcywgJiMzNDtyb290IHdpb3MmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDtyYnl0ZXMsIHEtJmd0O3JieXRlcywgJiMzNDtyb290IHJieXRlcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3Jpb3MsIHEtJmd0O3Jpb3MsICYjMzQ7cm9vdCByaW9zJiMzNDspOwomIzQzOwkJCX0KJiM0MzsJCQlicGZfbGlua19fZGVzdHJveShyb290X2xpbmspOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7Y2xlYW51cF9saW5rOgomIzQzOwlicGZfbGlua19fZGVzdHJveShsaW5rKTsKJiM0MztjbGVhbnVwX3NrZWw6CiYjNDM7CWNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpOwomIzQzO2NsZWFudXBfbG9vcDoKJiM0MzsJbG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7CiYjNDM7Y2xlYW51cF9jZ3JvdXBfZmQ6CiYjNDM7CWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iODM5ZGVmOTQ1MDg2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMKQEAgLTAsMCAmIzQzOzEsMTA3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovCiYjNDM7I2luY2x1ZGUgJmx0O3ZtbGludXguaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfY29yZV9yZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uaCYjMzQ7CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwomIzQzOwomIzQzOy8qIFRoZSBjb3VudGVycyBvZiB0aGUgZGV2aWNlIG5hbWVkIGJ5IHRhcmdldF9kZXYgYXJlIHN0b3JlZCBoZXJlLiAqLwomIzQzO3N0cnVjdCBpb19xdWVyeSBpb19xdWVyeSBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBUaGUgc2FtZSBkZXZpY2UmIzM5O3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi8KJiM0MztzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBTZXQgdG8gMSBieSBjZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSB3aGVuIGJwZl9nZXRfcm9vdF9ibGtjZygpIHN1Y2NlZWRzLiAqLwomIzQzO19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIERldmljZSB0byByZWFkLCBzZXQgYnkgdXNlcnNwYWNlIChrZXJuZWwgZGV2X3QpLiBQaW5uaW5nIHRoZSBkZXZpY2Uga2VlcHMKJiM0MzsgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuCiYjNDM7ICovCiYjNDM7X191NjQgdGFyZ2V0X2RldiBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSYjMzk7cyBjb3VudGVycyBpbnRvIEBvdXQuIFJlYWRpbmcgb25seQomIzQzOyAqIHRoZSBvbmUgcGlubmVkIGRldmljZSBrZWVwcyB0aGUgcmVzdWx0IGRldGVybWluaXN0aWM6IHRoYXQgZGV2aWNlIGlzCiYjNDM7ICogcXVpZXNjZWQsIHNvIGl0cyBjb3VudGVycyBtYXRjaCBpby5zdGF0IGV4YWN0bHksIHdoaWxlIHBpY2tpbmcgJiMzNDthbnkgZGV2aWNlCiYjNDM7ICogd2l0aCBJL08mIzM0OyB3b3VsZCByYWNlIHdpdGggYmFja2luZy1zdG9yZSB3cml0ZWJhY2suCiYjNDM7ICovCiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgYmxrY2cgKmJsa2NnLAomIzQzOwkJCQkJICAgIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpwb3M7CiYjNDM7CiYjNDM7CS8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovCiYjNDM7CWJwZl9ibGtjZ19mbHVzaF9zdGF0cyhibGtjZyk7CiYjNDM7CiYjNDM7CS8qIFRoZSBwZXItZGV2aWNlIGJsa2cgd2FsayBuZWVkcyBhbiBSQ1Ugc2VjdGlvbi4gKi8KJiM0MzsJYnBmX3JjdV9yZWFkX2xvY2soKTsKJiM0MzsJYnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgYmxrY2cpIHsKJiM0MzsJCWlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJb3V0LSZndDtkZXYgPSBicGZfYmxrZ19kZXYocG9zKTsKJiM0MzsJCW91dC0mZ3Q7cmJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7CiYjNDM7CQlvdXQtJmd0O3dieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTsKJiM0MzsJCW91dC0mZ3Q7cmlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9XUklURSk7CiYjNDM7CQlvdXQtJmd0O2RieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpOwomIzQzOwkJb3V0LSZndDtkaW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJYnBmX3JjdV9yZWFkX3VubG9jaygpOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycCA9IGN0eC0mZ3Q7Y2dyb3VwOwomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnOwomIzQzOwomIzQzOwkvKiBUaGUgbGFzdCBpdGVyYXRpb24gaGFzIGEgTlVMTCBjZ3JvdXAsIHNraXAgaXQuICovCiYjNDM7CWlmICghY2dycCkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBTdGFydCBmcmVzaCBzbyBhIGRldmljZSB0aGF0IGlzIG5vdCBmb3VuZCBzdGF5cyBhbGwtemVyby4gKi8KJiM0MzsJX19idWlsdGluX21lbXNldCgmYW1wO2lvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTsKJiM0MzsKJiM0MzsJYmxrY2cgPSBicGZfZ2V0X2Jsa2NnKCZhbXA7Y2dycC0mZ3Q7c2VsZik7CiYjNDM7CWlmICghYmxrY2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmVhZF90YXJnZXRfZGV2KGJsa2NnLCAmYW1wO2lvX3F1ZXJ5KTsKJiM0MzsKJiM0MzsJYnBmX3B1dF9ibGtjZyhibGtjZyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LSZndDtjZ3JvdXA7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CiYjNDM7CS8qIFRoZSBsYXN0IGl0ZXJhdGlvbiBoYXMgYSBOVUxMIGNncm91cCwgc2tpcCBpdC4gKi8KJiM0MzsJaWYgKCFjZ3JwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CV9fYnVpbHRpbl9tZW1zZXQoJmFtcDtyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpOwomIzQzOwomIzQzOwlibGtjZyA9IGJwZl9nZXRfcm9vdF9ibGtjZygpOwomIzQzOwlpZiAoIWJsa2NnKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSByb290IGNncm91cCB0YWtlcyBpdHMgbnVtYmVycyBmcm9tIHRoZSBkaXNrcyB0aGVtc2VsdmVzIHJhdGhlcgomIzQzOwkgKiB0aGFuIGZyb20gcnN0YXQsIHNvIHRoaXMgYWxzbyBjb3ZlcnMgdGhlIHJvb3Qgc2lkZSBvZgomIzQzOwkgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhlIGNvdW50ZXJzIGNvdmVyIGV2ZXJ5IGNncm91cCYjMzk7cyBJL08sIHNvCiYjNDM7CSAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QmIzM5O3Mgb3duIGNncm91cCBkaWQuCiYjNDM7CSAqLwomIzQzOwlyZWFkX3RhcmdldF9kZXYoYmxrY2csICZhbXA7cm9vdF9xdWVyeSk7CiYjNDM7CiYjNDM7CWdvdF9yb290X2Jsa2NnID0gMTsKJiM0MzsJYnBmX3B1dF9ibGtjZyhibGtjZyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNDkxCgkJCQkJCQlvdXRwdXQ6IDE2OQoJCQkJCQkJdGhvdWdodHM6IDEzNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogQmxvY2sgQ2dyb3VwIEJQRiBLZnVuY3MqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIFRoZSBwYXRjaCBmb2N1c2VzIG9uIGludHJvZHVjaW5nIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgKGJsa2NnKSBJL08gc3RhdGlzdGljcywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuCgpGaXJzdCwgSSBuZWVkIHRvIGV2YWx1YXRlIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBXZSYjMzk7cmUgYWRkaW5nIGZ1bmN0aW9ucyBsaWtlIGBicGZfZ2V0X3Jvb3RfYmxrY2dgLCBgYnBmX2dldF9ibGtjZ2AsIGBicGZfcHV0X2Jsa2NnYCwgYW5kIG90aGVycywgYWxsIGRlYWxpbmcgd2l0aCByZWFkaW5nIGRhdGEgZnJvbSBleGlzdGluZyBrZXJuZWwgc3RydWN0dXJlcyBsaWtlIGBzdHJ1Y3QgYmxrY2dgLCBgc3RydWN0IGJsa2NnX2dxYCwgYW5kIGBzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0YC4gVGhlIGNyaXRpY2FsIHF1ZXN0aW9uIGlzLCBhcmUgdGhlc2Uga2Z1bmNzIHJldHVybmluZyB1bmluaXRpYWxpemVkIHZhbHVlcyB0byB0aGUgQlBGIHByb2dyYW1zPwoKVGhlIGtmdW5jcyByZXR1cm4gZWl0aGVyIGB1NjRgIHZhbHVlcyBvciBwb2ludGVycyB0byBrZXJuZWwgc3RydWN0dXJlcy4gQlBGIHByb2dyYW1zIHRoZW4gcmVhZCB0aGVzZSByZXR1cm5lZCB2YWx1ZXMuIEkgbmVlZCB0byBwaW5wb2ludCBpZiB0aGVyZSBhcmUgYW55IGluc3RhbmNlcyB3aGVyZSB0aGUga2Z1bmNzIGFyZSBwdWxsaW5nIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFuZCBwYXNzaW5nIHRoZW0gYmFjayB0byBCUEYgcHJvZ3JhbXMuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBsb29raW5nIGF0IGBicGZfYmxrZ19pb3N0YXRfYnl0ZXNgIGFuZCBgYnBmX2Jsa2dfaW9zdGF0X2lvc2AsIHdoaWNoIHJlYWQgZnJvbSBgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5ieXRlc2AgYW5kIGBibGtnLSZndDtpb3N0YXQuY3VyLmlvc2AsIGJvdGggYXJyYXlzIG9mIGB1NjRgLiBBbHNvLCBgYnBmX2Jsa2dfZGV2YCB0aGF0IHJldHVybnMgYGJsa2ctJmd0O3EtJmd0O2Rpc2stJmd0O3BhcnQwLSZndDtiZF9kZXZgIHdoaWNoIGlzIGEgYGRldl90YCDigJMgZWl0aGVyIGB1MzJgIG9yIGB1NjRgLgoKVGhlIHBhdGNoIGFsc28gaGFzIGEgc2VsZnRlc3QsIHNvIEkmIzM5O2xsIGNoZWNrIHRoYXQuCgpOb3csIGxldCYjMzk7cyBkaWcgaW50byBgYnBmX2l0ZXJfYmxrZ19uZXdgIGFuZCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gU3RhbmRhcmQgQlBGIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uLiBUaGUgdmVyaWZpZXIgaW4gQlBGIGVuc3VyZXMgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIGBicGZfaXRlcl9ibGtnX25ld2AuIEl0IGluaXRpYWxpemVzIGBraXQtJmd0O2Jsa2NnYCBhbmQgYGtpdC0mZ3Q7cG9zYC4gTm8gaXNzdWVzIGhlcmUgYXMgdGhlIGl0ZXJhdG9yIHN0YXRlIGlzIG1hbmFnZWQgYnkgdGhlIEJQRiBpbmZyYXN0cnVjdHVyZS4KCk9rYXksIG5leHQgY29uY2VybjogYXJlIHRoZXJlIGFueSBpbnN0YW5jZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgY29waWVkIHRvIHVzZXIgc3BhY2U/IEJQRiBwcm9ncmFtcyByZWFkIGNvdW50ZXJzIGFuZCBzdG9yZSB0aGVtIGluIGdsb2JhbCB2YXJpYWJsZXMgKGBpb19xdWVyeWAsIGByb290X3F1ZXJ5YCksIHdoaWNoIGFyZSB0aGVuIGFjY2Vzc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIHRoZSBCUEYgc2tlbGV0b24uIFRoZXNlIGNvdW50ZXJzIGFyZSBleHRyYWN0ZWQgZnJvbSBgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5ieXRlc2AgYW5kIGBibGtnLSZndDtpb3N0YXQuY3VyLmlvc2AsIGJ1dCB0aGVzZSBhcmUgdXBkYXRlZCBieSB0aGUgYmxvY2sgbGF5ZXIsIGFuZCBzaG91bGQgYmUgZnVsbHkgaW5pdGlhbGl6ZWQuCgpUaGVuLCBhcmUgdGhlcmUgYW55IGRpcmVjdCB0cmFuc21pc3Npb25zIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2U/IE5vLCB0aGlzIHBhdGNoIG9ubHkgZXhwb3NlcyBCUEYga2Z1bmNzLCB3aGljaCBhcmUgdGhlbiBjYWxsZWQgYnkgQlBGIHByb2dyYW1zLiBUaGVzZSBrZnVuY3MgcmV0dXJuIGB1NjRgIG9yIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gYGNvcHlfdG9fdXNlcmAgY2FsbHMsIGFuZCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIGFuZCBzZW50IGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UuIFRoZSBpdGVyYXRvciBzdGF0ZSBpcyBhIDE2LWJ5dGUgc3RydWN0dXJlLCB3aGljaCBpcyBmdWxseSBpbml0aWFsaXplZCBkdXJpbmcgYGJwZl9pdGVyX2Jsa2dfbmV3YC4KCkZ1cnRoZXJtb3JlLCBJIGhhdmUgdG8gY29uc2lkZXIgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBtaWdodCBkZXBlbmQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGJlY2F1c2UgdGhlIHZhcmlhYmxlcyBhcmUgZWl0aGVyIHBvaW50ZXJzIGZyb20gdGhlIEJQRiBjb250ZXh0IG9yIHJlYWQgZnJvbSBleGlzdGluZyBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4KClRoZXJlZm9yZSwgdGhlIGxpa2VsaWhvb2Qgb2YgdGhpcyBwYXRjaCBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvcm1hdGlvbiBsZWFrcyBpcyBleHRyZW1lbHkgbG93LiBLQVNBTiBhbmQgc3RhbmRhcmQgdG9vbHMgc2hvdWxkIHN1ZmZpY2UgdG8gZGV0ZWN0IGFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHN0ZW1taW5nIGZyb20gaW5jb3JyZWN0IGBjc3NfdHJ5Z2V0YCBvciBSQ1UgdXNhZ2UsIGlmIGFueS4gSSBzdGlsbCB3YW50IHRvIGRvdWJsZSBjaGVjayBgYmxrZ19pb3N0YXRfcmVhZGAgdGhvdWdoOgoKTG9va2luZyBhdCB0aGUgY29kZSwgaXQmIzM5O3MganVzdCByZWFkaW5nIGB1NjRgIHZhbHVlcyBmcm9tIGBjb3VudGVyc1tyd11gLiBUaGUgYm91bmRzIGFyZSBjaGVja2VkIGFnYWluc3QgYEJMS0dfSU9TVEFUX05SYCwgc28gaXQmIzM5O3Mgc2FmZS4KCk15IGNvbmNsdXNpb24/ICoqTmVlZHNLTVNBTiA9IGZhbHNlLioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIGJ1dCBpdCBkb2VzbiYjMzk7dCBkbyBhbnl0aGluZyB0aGF0IGNyZWF0ZXMgYSBzdHJvbmcgbmVlZCBmb3IgS01TQU4uIFRoZXJlJiMzOTtzIG5vIGNyZWF0aW9uIG9mIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIG5vIGRpcmVjdCBkYXRhIGNvcHkgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGxvZ2ljIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBTdGFuZGFyZCBtZW1vcnkgc2FmZXR5IHRvb2xzIHN1Y2ggYXMgS0FTQU4gYXJlIGVub3VnaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYga2Z1bmNzIHRvIHJlYWQgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzIChpby5zdGF0KS4gSXQgZG9lcyBub3QgYWxsb2NhdGUgbmV3IGNvbXBsZXggc3RydWN0dXJlcywgY29weSBkYXRhIGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UsIG9yIGludHJvZHVjZSBsb2dpYyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGtmdW5jcyByZXR1cm4gc2ltcGxlIHNjYWxhciB2YWx1ZXMgKHU2NCkgb3IgcG9pbnRlcnMgdG8gZXhpc3RpbmcsIGluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzLiBUaGUgQlBGIGl0ZXJhdG9yIHN0YXRlIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gUkNVIG9yIGNncm91cCByZWZlcmVuY2VzLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MgKGlvLnN0YXQpLiBJdCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgY29tcGxleCBzdHJ1Y3R1cmVzLCBjb3B5IGRhdGEgZGlyZWN0bHkgdG8gdXNlciBzcGFjZSwgb3IgaW50cm9kdWNlIGxvZ2ljIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUga2Z1bmNzIHJldHVybiBzaW1wbGUgc2NhbGFyIHZhbHVlcyAodTY0KSBvciBwb2ludGVycyB0byBleGlzdGluZywgaW5pdGlhbGl6ZWQga2VybmVsIHN0cnVjdHVyZXMuIFRoZSBCUEYgaXRlcmF0b3Igc3RhdGUgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcywgc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgcmVsYXRlZCB0byBSQ1Ugb3IgY2dyb3VwIHJlZmVyZW5jZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MDQuMTg2NzE0OTY0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQ2MjQ1MjEzMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJMS19DR1JPVVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfZ2V0X3Jvb3RfYmxrY2dcIixcbiAgICBcImJwZl9nZXRfYmxrY2dcIixcbiAgICBcImJwZl9wdXRfYmxrY2dcIixcbiAgICBcImJwZl9ibGtjZ19mbHVzaF9zdGF0c1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXdcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19kZXN0cm95XCIsXG4gICAgXCJicGZfYmxrZ19pb3N0YXRfYnl0ZXNcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9pb3NcIixcbiAgICBcImJwZl9ibGtnX2RldlwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIHRoZSBibG9jayBJL08gY29udHJvbGxlciAoYmxrY2cpIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzowNC4xODY3MTk4MDRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyMDU2MjI0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDJjYTE5YThhMjQ4ODcyODg4ZGUxYTViZTdkNjc4MzhhMmYyYTQyMTdcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXFxuaW5kZXggMmY5NDcyYzFhMDkwNy4uODdjNTZlOTU1NTc3MSAxMDA2NDRcXG4tLS0gYS9NQUlOVEFJTkVSU1xcbisrKyBiL01BSU5UQUlORVJTXFxuQEAgLTY2MTcsNiArNjYxNyw3IEBAIEY6XFx0YmxvY2svYmxrLWNncm91cC5jXFxuIEY6XFx0YmxvY2svYmxrLWlvY29zdC5jXFxuIEY6XFx0YmxvY2svYmxrLWlvbGF0ZW5jeS5jXFxuIEY6XFx0YmxvY2svYmxrLXRocm90dGxlLmNcXG4rRjpcXHRibG9jay9icGZfYmxrY2cuY1xcbiBGOlxcdGluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oXFxuIFxcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcXG5pbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NFxcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXFxuKysrIGIvYmxvY2svTWFrZWZpbGVcXG5AQCAtMTcsNiArMTcsOSBAQCBvYmotJChDT05GSUdfQkxLX0VSUk9SX0lOSkVDVElPTikgKz0gZXJyb3ItaW5qZWN0aW9uLm9cXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgKz0gYnNnLm9cXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKVxcdCs9IGJzZy1saWIub1xcbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUClcXHQrPSBibGstY2dyb3VwLm9cXG4raWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQKVxcdCs9IGJwZl9ibGtjZy5vXFxuK2VuZGlmXFxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcXHQrPSBibGstY2dyb3VwLXJ3c3RhdC5vXFxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX0ZDX0FQUElEKSArPSBibGstY2dyb3VwLWZjLWFwcGlkLm9cXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcXHQrPSBibGstdGhyb3R0bGUub1xcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmNcXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuY1xcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xcbkBAIC0xMDg2LDcgKzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxcbiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAncyBzdGF0cyBieSBleHBsaWNpdGx5IGZpbGxpbmcgaW4gdGhlIGlvc3RhdFxcbiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy5cXG4gICovXFxuLXN0YXRpYyB2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXFxuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcXG4ge1xcbiBcXHRzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjtcXG4gXFx0c3RydWN0IGRldmljZSAqZGV2O1xcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmhcXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaFxcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxcbkBAIC0yMDUsNiArMjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcXG4gXFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpO1xcbiBcXG4gY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpO1xcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpO1xcbiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csXFxuIFxcdFxcdCAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLFxcbiBcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBibGtnX3BvbGljeV9kYXRhICosIGludCksXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjQ4YTg2ZjA3ZTE5OGFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvYmxvY2svYnBmX2Jsa2NnLmNcXG5AQCAtMCwwICsxLDMxNSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxcbisvKlxcbisgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlLlxcbisgKlxcbisgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcXG4rICogY2dyb3VwJ3MgY3NzIGludG8gYSBzdHJ1Y3QgYmxrY2cgd2l0aCBicGZfZ2V0X2Jsa2NnKCksIGZsdXNoZXMgdGhlIHN0YXRzIHdpdGhcXG4rICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCksIHRoZW4gd2Fsa3MgdGhlIGNncm91cCdzIHBlci1kZXZpY2UgYmxrZ3Mgd2l0aCB0aGVcXG4rICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJ3MgY291bnRlcnMgd2l0aFxcbisgKiBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoKS9icGZfYmxrZ19pb3N0YXRfaW9zKCkuIEl0IG1pcnJvcnMgdGhlIG1lbW9yeVxcbisgKiBjb250cm9sbGVyIGtmdW5jcyBpbiBtbS9icGZfbWVtY29udHJvbC5jLCBidXQgYWRkcyBhIHBlci1kZXZpY2UgZGltZW5zaW9uOlxcbisgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cXG4rICpcXG4rICogVGhpcyBmaWxlIGxpdmVzIGluIGJsb2NrLyBiZWNhdXNlIHRoZSBibGtjZy9ibGtnIHN0cnVjdCBsYXlvdXRzIGFyZSBwcml2YXRlXFxuKyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXFwiYmxrLWNncm91cC5oXFxcIlxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJlZW1wdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcmN1bGlzdC5oXFx1MDAzZVxcbitcXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbitcXG4rLyoqXFxuKyAqIGJwZl9nZXRfcm9vdF9ibGtjZyAtIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cFxcbisgKlxcbisgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXNcXG4rICogbmV2ZXIgZGVzdHJveWVkIGFuZCBkb2Vzbid0IHJlcXVpcmUgcmVmZXJlbmNlIGNvdW50aW5nLiBJdCdzIHNhZmUgdG8gcGFzcyBpdFxcbisgKiB0byBicGZfcHV0X2Jsa2NnKCkuXFxuKyAqXFxuKyAqIE5vdGUgdGhhdCB0aGUgcm9vdCBjZ3JvdXAgaXMgc3BlY2lhbDogaXRzIGNvdW50ZXJzIGFyZSB0aGUgZGlza3MnIG93blxcbisgKiBzdGF0aXN0aWNzLCBzbyB0aGV5IGNvdmVyIGV2ZXJ5IGNncm91cCdzIEkvTyByYXRoZXIgdGhhbiBvbmx5IHRoZSByb290J3MuXFxuKyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuXFxuKyAqXFxuKyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cC5cXG4rICovXFxuK19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZyAqYnBmX2dldF9yb290X2Jsa2NnKHZvaWQpXFxuK3tcXG4rXFx0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cXG4rXFx0cmV0dXJuIFxcdTAwMjZibGtjZ19yb290O1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2dldF9ibGtjZyAtIEdldCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cFxcbisgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXFxuKyAqXFxuKyAqIEl0J3MgZmluZSB0byBwYXNzIGEgY3NzIHdoaWNoIGJlbG9uZ3MgdG8gYW55IGNncm91cCBjb250cm9sbGVyLFxcbisgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5J3MgbWFpbiBjc3MuXFxuKyAqXFxuKyAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXFxuKyAqXFxuKyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgYmxrY2cgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3NzJ3NcXG4rICogcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwgaWYgdGhlIGlvIGNvbnRyb2xsZXIgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNncm91cC5cXG4rICovXFxuK19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZyAqYnBmX2dldF9ibGtjZyhzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbit7XFxuK1xcdHN0cnVjdCBibGtjZyAqYmxrY2cgPSBOVUxMO1xcbitcXG4rXFx0aWYgKGNzcy1cXHUwMDNlc3MgPT0gXFx1MDAyNmlvX2NncnBfc3Vic3lzKVxcbitcXHRcXHRyZXR1cm4gY3NzX3RyeWdldChjc3MpID8gY3NzX3RvX2Jsa2NnKGNzcykgOiBOVUxMO1xcbitcXG4rXFx0LypcXG4rXFx0ICogU29tZSBvdGhlciBjb250cm9sbGVyJ3MgY3NzLCBvciB0aGUgY2dyb3VwJ3Mgb3duIG9uZS4gTG9vayB1cCB0aGUgaW9cXG4rXFx0ICogY29udHJvbGxlcidzIGNzczsgcmN1IGtlZXBzIGl0IGFsaXZlIGJldHdlZW4gdGhlIGxvYWQgYW5kIHRoZSB0cnlnZXQuXFxuK1xcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLydzIGxvY2tcXG4rXFx0ICogY29udGV4dCBhbmFseXNpcyBjYW4gZm9sbG93IGl0LlxcbitcXHQgKi9cXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNzcy1cXHUwMDNlY2dyb3VwLVxcdTAwM2VzdWJzeXNbaW9fY2dycF9pZF0pO1xcbitcXHRpZiAoY3NzIFxcdTAwMjZcXHUwMDI2IGNzc190cnlnZXQoY3NzKSlcXG4rXFx0XFx0YmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTtcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcbitcXHRyZXR1cm4gYmxrY2c7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfcHV0X2Jsa2NnIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgYmxvY2sgY2dyb3VwXFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcXG4rICpcXG4rICogUmVsZWFzZXMgYSBwcmV2aW91c2x5IGFjcXVpcmVkIGJsa2NnIHJlZmVyZW5jZS5cXG4rICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX3B1dF9ibGtjZyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKVxcbit7XFxuK1xcdGNzc19wdXQoXFx1MDAyNmJsa2NnLVxcdTAwM2Vjc3MpO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAncyBpbyBzdGF0aXN0aWNzXFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwXFxuKyAqXFxuKyAqIENhbGwgdGhpcyBiZWZvcmUgcmVhZGluZyBjb3VudGVycyBmb3IgdXAtdG8tZGF0ZSB2YWx1ZXMuIFNsZWVwYWJsZS5cXG4rICpcXG4rICogSXQgZG9lcyB3aGF0IHJlYWRpbmcgdGhlIGlvLnN0YXQgZmlsZSBkb2VzLCB3aGljaCBkaWZmZXJzIGJ5IGNncm91cC4gRm9yIGFcXG4rICogbm9uLXJvb3QgY2dyb3VwIGl0IGZvbGRzIHRoZSBwZXItY3B1IGRlbHRhcyBpbnRvIHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXNcXG4rICogYW5kIHVwIHRoZSBjZ3JvdXAgdHJlZS4gVGhlIHJvb3QgY2dyb3VwIGlzIG5vdCBhY2NvdW50ZWQgdGhyb3VnaCByc3RhdCBhdFxcbisgKiBhbGwsIHNvIGZvciBpdCB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzIGFyZSByZWZpbGxlZCBmcm9tIHRoZSBkaXNrcydcXG4rICogb3duIHN0YXRpc3RpY3MsIHdoaWNoIGNvdW50IGV2ZXJ5IGNncm91cCdzIEkvTy5cXG4rICpcXG4rICogVGhlIHJvb3QgYnJhbmNoIGlzIG5vdCBzZWxmLWxpbWl0aW5nIHRoZSB3YXkgdGhlIHJzdGF0IG9uZSBpczogaXQgcmVyZWFkc1xcbisgKiBldmVyeSBkaXNrIG9uIGV2ZXJ5IGNhbGwsIHdoaWxlIGEgc2Vjb25kIHJzdGF0IGZsdXNoIGZpbmRzIG5vdGhpbmcgbGVmdCB0b1xcbisgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXFxuKyAqIG9uY2UgcmF0aGVyIHRoYW4gb25jZSBwZXIgY2dyb3VwIG9mIGEgd2Fsay5cXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXFxuK3tcXG4rXFx0aWYgKCFibGtjZy1cXHUwMDNlY3NzLnBhcmVudClcXG4rXFx0XFx0YmxrY2dfZmlsbF9yb290X2lvc3RhdHMoKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRjc3NfcnN0YXRfZmx1c2goXFx1MDAyNmJsa2NnLVxcdTAwM2Vjc3MpO1xcbit9XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XFxuK1xcdF9fdTY0IF9fb3BhcXVlWzJdO1xcbit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcXG4rXFxuK3N0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4ge1xcbitcXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXFxuKyAqIEBpdDogaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZVxcbisgKiBAYmxrY2c6IGJsb2NrIGNncm91cCB3aG9zZSBkZXZpY2VzIHRvIHdhbGtcXG4rICpcXG4rICogRWFjaCB5aWVsZGVkIGJsa2cgaG9sZHMgb25lIGJsb2NrIGRldmljZSdzIGNvdW50ZXJzLCB0aGUgc2FtZSBvbmVzIGJlaGluZCBhXFxuKyAqIHBlci1kZXZpY2UgbGluZSBvZiB0aGUgaW8uc3RhdCBmaWxlLiBPZmZsaW5lIGJsa2dzIGFyZSBza2lwcGVkLCBhcyB0aGUgZmlsZVxcbisgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2tcXG4rICogaXMgZ29uZSwgd2hpbGUgdGhlIHdhbGsgc3RpbGwgeWllbGRzIGl0LCBhbmQgYnBmX2Jsa2dfZGV2KCkgcmV0dXJucyAwIGZvclxcbisgKiBpdC4gTXVzdCBiZSB1c2VkIGluc2lkZSBhbiBSQ1UgcmVhZCBzZWN0aW9uLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXFx1MDAzZSBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcXG4rXFx0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XFxuK1xcdFxcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcXG4rXFxuK1xcdGtpdC1cXHUwMDNlYmxrY2cgPSBibGtjZztcXG4rXFx0a2l0LVxcdTAwM2Vwb3MgPSBOVUxMO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXFxuKyAqIEBpdDogaXRlcmF0b3JcXG4rICpcXG4rICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFx0c3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LVxcdTAwM2Vwb3M7XFxuK1xcdHN0cnVjdCBobGlzdF9ub2RlICpub2RlO1xcbitcXG4rXFx0LyogQ2xlYXJlZCBvbmNlIHRoZSB3YWxrIGlzIGRvbmUsIHNlZSBiZWxvdy4gKi9cXG4rXFx0aWYgKCFraXQtXFx1MDAzZWJsa2NnKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdGlmICghYmxrZylcXG4rXFx0XFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoXFx1MDAyNmtpdC1cXHUwMDNlYmxrY2ctXFx1MDAzZWJsa2dfbGlzdCkpO1xcbitcXHRlbHNlXFxuK1xcdFxcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXFx1MDAyNmJsa2ctXFx1MDAzZWJsa2NnX25vZGUpKTtcXG4rXFxuK1xcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cXG4rXFx0d2hpbGUgKG5vZGUpIHtcXG4rXFx0XFx0YmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7XFxuK1xcdFxcdGlmIChibGtnLVxcdTAwM2VvbmxpbmUpIHtcXG4rXFx0XFx0XFx0a2l0LVxcdTAwM2Vwb3MgPSBibGtnO1xcbitcXHRcXHRcXHRyZXR1cm4gYmxrZztcXG4rXFx0XFx0fVxcbitcXHRcXHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFxcdTAwMjZibGtnLVxcdTAwM2VibGtjZ19ub2RlKSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvcmdldCB0aGUgbGlzdCBoZWFkIGFzIHdlbGwuIFRoZSB2ZXJpZmllciBhc3N1bWVzIHRoYXQgYW4gaXRlcmF0b3JcXG4rXFx0ICogd2hpY2ggcmV0dXJuZWQgTlVMTCBrZWVwcyByZXR1cm5pbmcgTlVMTCwgYW5kIHN0b3BzIGNoZWNraW5nIHRoZVxcbitcXHQgKiBsb29wIGZvciB0ZXJtaW5hdGlvbiBvbmNlIGl0IGhhczsgc3RhcnRpbmcgdGhlIHdhbGsgb3ZlciB3b3VsZCBsZXRcXG4rXFx0ICogc3VjaCBhIGxvb3Agc3BpbiBmb3JldmVyLlxcbitcXHQgKi9cXG4rXFx0a2l0LVxcdTAwM2Vwb3MgPSBOVUxMO1xcbitcXHRraXQtXFx1MDAzZWJsa2NnID0gTlVMTDtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yXFxuKyAqIEBpdDogaXRlcmF0b3JcXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcXG4re1xcbit9XFxuK1xcbisvKlxcbisgKiBSZWFkIG9uZSBjb3VudGVyIG91dCBvZiBAYmxrZydzIGZsdXNoZWQgaW8uc3RhdCBhZ2dyZWdhdGUuIEBjb3VudGVycyBpcyBvbmVcXG4rICogb2YgdGhlIHR3byBhcnJheXMgaW4gYmxrZy1cXHUwMDNlaW9zdGF0LmN1cjsgYm90aCBhcmUgZ3VhcmRlZCBieSB0aGF0IHN0cnVjdCdzXFxuKyAqIHNlcWxvY2ssIHRoZSBvbmUgdGhlIGlvLnN0YXQgZmlsZSB1c2VzLiBSZXR1cm5zICh1NjQpLTEgaWYgdGhlIGNvdW50ZXJcXG4rICogY2Fubm90IGJlIHJlYWQuXFxuKyAqL1xcbitzdGF0aWMgdTY0IGJsa2dfaW9zdGF0X3JlYWQoc3RydWN0IGJsa2NnX2dxICpibGtnLCBjb25zdCB1NjQgKmNvdW50ZXJzLFxcbitcXHRcXHRcXHQgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxcbit7XFxuK1xcdHN0cnVjdCBibGtnX2lvc3RhdF9zZXQgKmJpcyA9IFxcdTAwMjZibGtnLVxcdTAwM2Vpb3N0YXQ7XFxuK1xcdHVuc2lnbmVkIGludCBzZXE7XFxuK1xcdHU2NCB2YWw7XFxuK1xcbitcXHRpZiAoKHVuc2lnbmVkIGludClydyBcXHUwMDNlPSBCTEtHX0lPU1RBVF9OUilcXG4rXFx0XFx0cmV0dXJuICh1NjQpLTE7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPbiAzMi1iaXQgdGhlIGxvb3AgYmVsb3cgcmVhbGx5IGlzIGEgc2VxY291bnQgcmV0cnkgbG9vcC4gRXZlcnlcXG4rXFx0ICogd3JpdGVyIG9mIGJsa2ctXFx1MDAzZWlvc3RhdCBrZWVwcyBpbnRlcnJ1cHRzIG9mZiwgc28gb25seSBhbiBOTUkgY2FuIGxhbmRcXG4rXFx0ICogaW5zaWRlIGFuIHVwZGF0ZSwgYW5kIHRoZW4gdGhlIGxvb3Agd291bGQgbmV2ZXIgZW5kLiBUaGVzZSBrZnVuY3NcXG4rXFx0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXFxuK1xcdCAqIGdpdmUgdXAgcmF0aGVyIHRoYW4gc3Bpbi4gT24gNjQtYml0IHRoZSBsb29wIGNvbXBpbGVzIGF3YXkuXFxuK1xcdCAqL1xcbitcXHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcXHUwMDI2XFx1MDAyNiBpbl9ubWkoKSlcXG4rXFx0XFx0cmV0dXJuICh1NjQpLTE7XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdHNlcSA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbihcXHUwMDI2YmlzLVxcdTAwM2VzeW5jKTtcXG4rXFx0XFx0dmFsID0gY291bnRlcnNbcnddO1xcbitcXHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXFx1MDAyNmJpcy1cXHUwMDNlc3luYywgc2VxKSk7XFxuK1xcbitcXHRyZXR1cm4gdmFsO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgYnl0ZSBjb3VudGVyXFxuKyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cClcXG4rICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpXFxuKyAqXFxuKyAqIFJlYWRzIHRoZSBmbHVzaGVkIGFnZ3JlZ2F0ZSwgc28gY2FsbCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKSBmaXJzdCBmb3JcXG4rICogdXAtdG8tZGF0ZSB2YWx1ZXMuIFRoZSByZWFkIHVzZXMgdGhlIHU2NF9zdGF0cyBzZXFsb2NrLCBsaWtlIHRoZSBpby5zdGF0XFxuKyAqIGZpbGUuXFxuKyAqXFxuKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBieXRlcywgb3IgKHU2NCktMSBpZiBAcncgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZVxcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgdTY0IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csXFxuK1xcdFxcdFxcdFxcdCAgICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcXG4re1xcbitcXHRyZXR1cm4gYmxrZ19pb3N0YXRfcmVhZChibGtnLCBibGtnLVxcdTAwM2Vpb3N0YXQuY3VyLmJ5dGVzLCBydyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgSS9PIGNvdW50XFxuKyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cClcXG4rICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpXFxuKyAqXFxuKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBJL09zLCBvciAodTY0KS0xIGlmIEBydyBpcyBvdXQgb2YgcmFuZ2Ugb3IgdGhlXFxuKyAqIGNvdW50ZXIgY2Fubm90IGJlIHJlYWQuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfaW9zdGF0X2lvcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csXFxuK1xcdFxcdFxcdFxcdCAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpXFxuK3tcXG4rXFx0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cXHUwMDNlaW9zdGF0LmN1ci5pb3MsIHJ3KTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9ibGtnX2RldiAtIFJldHVybiBhIGJsa2cncyBkZXZpY2UgaWRcXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwXFxuKyAqXFxuKyAqIFJldHVybjogdGhlIGRldmljZSdzIGRldl90ICh1c2UgTUFKT1IoKS9NSU5PUigpIHRvIHNwbGl0KSwgb3IgMCBpZiB0aGUgYmxrZ1xcbisgKiBoYXMgbm8gZGlzay5cXG4rICovXFxuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19kZXYoc3RydWN0IGJsa2NnX2dxICpibGtnKVxcbit7XFxuK1xcdGlmICghYmxrZy1cXHUwMDNlcSB8fCAhYmxrZy1cXHUwMDNlcS1cXHUwMDNlZGlzaylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gYmxrZy1cXHUwMDNlcS1cXHUwMDNlZGlzay1cXHUwMDNlcGFydDAtXFx1MDAzZWJkX2RldjtcXG4rfVxcbitcXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4rXFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2dldF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMIHwgS0ZfUkNVKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3B1dF9ibGtjZywgS0ZfUkVMRUFTRSlcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxcbitcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXFxuK1xcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19pb3N0YXRfaW9zLCBLRl9SQ1UpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19kZXYsIEtGX1JDVSlcXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0ge1xcbitcXHQub3duZXJcXHRcXHQ9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0XFx0XFx0PSBcXHUwMDI2YnBmX2Jsa2NnX2tmdW5jcyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfd2FybihcXFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIGJsa2NnIGtmdW5jczogJWRcXFxcblxcXCIsIGVycik7XFxuK1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuK2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxuQEAgLTAsMCArMSwxNyBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXFxuKyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19IXFxuKyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19IXFxuK1xcbitzdHJ1Y3QgaW9fcXVlcnkge1xcbitcXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xcbitcXHRfX3U2NCByYnl0ZXM7XFxuK1xcdF9fdTY0IHdieXRlcztcXG4rXFx0X191NjQgcmlvcztcXG4rXFx0X191NjQgd2lvcztcXG4rXFx0X191NjQgZGJ5dGVzO1xcbitcXHRfX3U2NCBkaW9zO1xcbitcXHRfX3U2NCBkZXY7XFx0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXFxuK307XFxuK1xcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uMjcwZTZiZjkxOTRkMiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xcbkBAIC0xLDMgKzEsNCBAQFxcbitDT05GSUdfQkxLX0NHUk9VUD15XFxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxcbiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eVxcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzJjZGE4MjQzMzE4M1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXFxuQEAgLTAsMCArMSwzMTAgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvbGliYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbG9vcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zeXNtYWNyb3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImNncm91cF9pdGVyX2lvLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaXRlcl9pby5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNClcXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuK3tcXG4rXFx0aW50IGZkLCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IGJ5dGVzO1xcbitcXG4rXFx0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJicGZfaXRlcl9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cXG4rXFx0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsIFxcXCJyZWFkIGZkXFxcIikpXFxuK1xcdFxcdHJldCA9IDE7XFxuK1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcXG4rICogZGV2aWNlIHRvIGdlbmVyYXRlIGNncm91cC1jaGFyZ2VkIEkvTyBhZ2FpbnN0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTFcXG4rICogaWYgbG9vcCBkZXZpY2VzIGFyZSB1bmF2YWlsYWJsZSAobm9uLXJvb3QgLyBubyBDT05GSUdfQkxLX0RFVl9MT09QKSBzbyB0aGVcXG4rICogY2FsbGVyIGNhbiBza2lwLlxcbisgKi9cXG4rc3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLFxcbitcXHRcXHQgICAgICBpbnQgKmJhY2tfZmQpXFxuK3tcXG4rXFx0Y2hhciBiYWNrX3BhdGhbXSA9IFxcXCIvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWFxcXCI7XFxuK1xcdGludCBucjtcXG4rXFxuK1xcdCpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7XFxuK1xcbitcXHQqY3RsX2ZkID0gb3BlbihcXFwiL2Rldi9sb29wLWNvbnRyb2xcXFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoKmN0bF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xcbitcXHRpZiAobnIgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0c25wcmludGYobG9vcF9wYXRoLCBzeiwgXFxcIi9kZXYvbG9vcCVkXFxcIiwgbnIpO1xcbitcXG4rXFx0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XFxuK1xcdGlmICgqYmFja19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXHR1bmxpbmsoYmFja19wYXRoKTtcXG4rXFx0aWYgKGZ0cnVuY2F0ZSgqYmFja19mZCwgKG9mZl90KUlPX1NJWkUgKiA0KSlcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHQqbG9vcF9mZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoKmxvb3BfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitlcnI6XFxuK1xcdGlmICgqbG9vcF9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZSgqbG9vcF9mZCk7XFxuK1xcdGlmICgqYmFja19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZSgqYmFja19mZCk7XFxuK1xcdGNsb3NlKCpjdGxfZmQpO1xcbitcXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCxcXG4rXFx0XFx0XFx0ICBpbnQgYmFja19mZClcXG4re1xcbitcXHRpbnQgbnIgPSAtMTtcXG4rXFxuK1xcdGlmIChsb29wX2ZkIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xcbitcXHRcXHRjbG9zZShsb29wX2ZkKTtcXG4rXFx0fVxcbitcXHRpZiAoYmFja19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShiYWNrX2ZkKTtcXG4rXFx0aWYgKGN0bF9mZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGlmIChzc2NhbmYobG9vcF9wYXRoLCBcXFwiL2Rldi9sb29wJWRcXFwiLCBcXHUwMDI2bnIpID09IDEgXFx1MDAyNlxcdTAwMjYgbnIgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0aW9jdGwoY3RsX2ZkLCBMT09QX0NUTF9SRU1PVkUsIG5yKTtcXG4rXFx0XFx0Y2xvc2UoY3RsX2ZkKTtcXG4rXFx0fVxcbit9XFxuK1xcbisvKiBPX0RJUkVDVCBJL08gdG8gdGhlIGxvb3AgZGV2aWNlLCBjaGFyZ2VkIHRvIHRoZSBjdXJyZW50IGNncm91cC4gKi9cXG4rc3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKVxcbit7XFxuK1xcdHZvaWQgKmJ1ZjtcXG4rXFx0aW50IGZkLCByZXQgPSAtMTtcXG4rXFxuK1xcdGZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fRElSRUNUIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAocG9zaXhfbWVtYWxpZ24oXFx1MDAyNmJ1ZiwgNDA5NiwgSU9fU0laRSkpXFxuK1xcdFxcdGdvdG8gb3V0X2ZkO1xcbitcXHRtZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTtcXG4rXFxuK1xcdGlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcXG4rXFx0XFx0Z290byBvdXRfYnVmO1xcbitcXHRmc3luYyhmZCk7XFxuK1xcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxcbitcXHRcXHRnb3RvIG91dF9idWY7XFxuK1xcdHJldCA9IDA7XFxuK291dF9idWY6XFxuK1xcdGZyZWUoYnVmKTtcXG4rb3V0X2ZkOlxcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJ3MgaW8uc3RhdCBmaWxlIGFuZFxcbisgKiBmaWxsIEBvdXQuIEBkZXYgaXMgYSBrZXJuZWwgZGV2X3QgKGFzIHJldHVybmVkIGJ5IGJwZl9ibGtnX2RldiksIHdob3NlXFxuKyAqIG1ham9yOm1pbm9yIHNwbGl0IG1hdGNoZXMgaG93IGlvLnN0YXQgcHJpbnRzIHRoZSBkZXZpY2UuIFJldHVybnMgMCBpZiB0aGVcXG4rICogZGV2aWNlJ3MgbGluZSB3YXMgZm91bmQuXFxuKyAqL1xcbitzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgd2FudF9tYWogPSBkZXYgXFx1MDAzZVxcdTAwM2UgMjAsIHdhbnRfbWluID0gZGV2IFxcdTAwMjYgKCgxVSBcXHUwMDNjXFx1MDAzYyAyMCkgLSAxKTtcXG4rXFx0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcXG4rXFx0aW50IGZkLCBuLCByZXQgPSAtMTtcXG4rXFxuK1xcdGZkID0gb3BlbmF0KGNncm91cF9mZCwgXFxcImlvLnN0YXRcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0biA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRpZiAobiBcXHUwMDNjPSAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJ1ZltuXSA9ICdcXFxcMCc7XFxuK1xcbitcXHRmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsIFxcXCJcXFxcblxcXCIsIFxcdTAwMjZzYXZlcHRyKTsgbGluZTtcXG4rXFx0ICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgXFxcIlxcXFxuXFxcIiwgXFx1MDAyNnNhdmVwdHIpKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGUgXFxcIm1hajptaW5cXFwiIHRva2VuIGlzIGFsd2F5cyBwcmVzZW50OyB0aGUgZmllbGQgYmxvY2sgaXNcXG4rXFx0XFx0ICogb3B0aW9uYWwgKHRoZSBrZXJuZWwgb21pdHMgaXQgZm9yIGEgZGV2aWNlIHdpdGggbm8gcmVhZC93cml0ZVxcbitcXHRcXHQgKiBJL08pLCBzbyBhIG1hdGNoIG9mIFxcdTAwM2U9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChzc2NhbmYobGluZSxcXG4rXFx0XFx0XFx0ICAgXFxcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XFxcIixcXG4rXFx0XFx0XFx0ICAgXFx1MDAyNm1haiwgXFx1MDAyNm1pbiwgXFx1MDAyNnJiLCBcXHUwMDI2d2IsIFxcdTAwMjZyaSwgXFx1MDAyNndpLCBcXHUwMDI2ZGIsIFxcdTAwMjZkaSkgXFx1MDAzYyAyKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0aWYgKG1haiAhPSB3YW50X21haiB8fCBtaW4gIT0gd2FudF9taW4pXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0b3V0LVxcdTAwM2VyYnl0ZXMgPSByYjtcXG4rXFx0XFx0b3V0LVxcdTAwM2V3Ynl0ZXMgPSB3YjtcXG4rXFx0XFx0b3V0LVxcdTAwM2VyaW9zID0gcmk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2lvcyA9IHdpO1xcbitcXHRcXHRvdXQtXFx1MDAzZWRieXRlcyA9IGRiO1xcbitcXHRcXHRvdXQtXFx1MDAzZWRpb3MgPSBkaTtcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2Nncm91cF9pdGVyX2lvKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciAqY2dyb3VwX3JlbF9wYXRoID0gXFxcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XFxcIjtcXG4rXFx0aW50IGN0bF9mZCA9IC0xLCBsb29wX2ZkID0gLTEsIGJhY2tfZmQgPSAtMTtcXG4rXFx0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcXG4rXFx0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcXG4rXFx0Y2hhciBsb29wX3BhdGhbNjRdO1xcbitcXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XFxuK1xcdGludCBjZ3JvdXBfZmQ7XFxuK1xcbitcXHRjZ3JvdXBfZmQgPSBjZ3JvdXBfc2V0dXBfYW5kX2pvaW4oY2dyb3VwX3JlbF9wYXRoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoY2dyb3VwX2ZkLCBcXFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksIFxcdTAwMjZjdGxfZmQsIFxcdTAwMjZsb29wX2ZkLCBcXHUwMDI2YmFja19mZCkpIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdHNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9sb29wO1xcbitcXG4rXFx0LypcXG4rXFx0ICogUGluIHRoZSByZWFkIHRvIHRoZSBsb29wIGRldmljZSBzbyB0aGUgbWVhc3VyZWQgZGV2aWNlIGlzIHN0YWJsZSBhbmRcXG4rXFx0ICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90XFxuK1xcdCAqIGVuY29kaW5nIChtYWpvciBcXHUwMDNjXFx1MDAzYyAyMCB8IG1pbm9yKSB0aGF0IGJwZl9ibGtnX2RldiByZXR1cm5zLlxcbitcXHQgKi9cXG4rXFx0e1xcbitcXHRcXHRzdHJ1Y3Qgc3RhdCBsc3Q7XFxuK1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcXHUwMDI2bHN0KSwgXFxcImZzdGF0IGxvb3BcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBjbGVhbnVwX3NrZWw7XFxuK1xcdFxcdHNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZXRhcmdldF9kZXYgPVxcbitcXHRcXHRcXHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcXHUwMDNjXFx1MDAzYyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7XFxuK1xcdH1cXG4rXFxuK1xcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xcbitcXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XFxuK1xcdFxcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxcbitcXHRcXHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcXG4rXFx0fTtcXG4rXFx0b3B0cy5saW5rX2luZm8gPSBcXHUwMDI2bGluZm87XFxuK1xcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XFxuK1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXFx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXFxcImJwZl9wcm9ncmFtX19hdHRhY2hfaXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfc2tlbDtcXG4rXFxuK1xcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXFxuK1xcdGlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCBcXFwiZG9fZGlyZWN0X2lvXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9saW5rO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXFxcInJlYWQgc3RhdHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xpbms7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxcbitcXHQgKiBwYXR0ZXJuIGluIGNncm91cF9pdGVyX21lbWNnLlxcbitcXHQgKi9cXG4rXFx0cSA9IFxcdTAwMjZza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vpb19xdWVyeTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImNncm91cF9pdGVyX2lvX193cml0ZVxcXCIpKSB7XFxuK1xcdFxcdEFTU0VSVF9HVChxLVxcdTAwM2V3Ynl0ZXMsIDAsIFxcXCJ3Ynl0ZXNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0dUKHEtXFx1MDAzZXdpb3MsIDAsIFxcXCJ3aW9zXFxcIik7XFxuK1xcdH1cXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImNncm91cF9pdGVyX2lvX19yZWFkXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0dUKHEtXFx1MDAzZXJieXRlcywgMCwgXFxcInJieXRlc1xcXCIpO1xcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNlcmlvcywgMCwgXFxcInJpb3NcXFwiKTtcXG4rXFx0fVxcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX2RldlxcXCIpKVxcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNlZGV2LCAwLCBcXFwiZGV2XFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTdHJvbmdlciBjaGVjazogdGhlIGtmdW5jLXJlYWQgdmFsdWVzIG11c3QgZXF1YWwgd2hhdCB0aGUgaW8uc3RhdFxcbitcXHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxcbitcXHQgKiB0aGUgZmlsZSB3aXRoIG5vIEkvTyBpbiBiZXR3ZWVuLCBzbyBib3RoIGZsdXNoZWQgc25hcHNob3RzIG1hdGNoXFxuK1xcdCAqIGV4YWN0bHkuXFxuK1xcdCAqL1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX21hdGNoXFxcIikpIHtcXG4rXFx0XFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XFxuK1xcbitcXHRcXHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFxcXCJyZWFkIHN0YXRzXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS1cXHUwMDNlZGV2LCBcXHUwMDI2ZmlsZXYpLFxcbitcXHRcXHRcXHQgICAgICBcXFwicGFyc2UgaW8uc3RhdFxcXCIpKSB7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXFxcInJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFxcXCJ3Ynl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFxcXCJyaW9zXFxcIik7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcXFwid2lvc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFxcXCJkYnl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFxcXCJkaW9zXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWVcXG4rXFx0ICogZnJvbSByc3RhdCwgdGhleSBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcywgc28gdGhpc1xcbitcXHQgKiBjb3ZlcnMgdGhlIG90aGVyIGhhbGYgb2YgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZXkgY292ZXIgZXZlcnlcXG4rXFx0ICogY2dyb3VwJ3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXFxuK1xcdCAqIHRoZXkgbXVzdCBiZSBhdCBvciBhYm92ZSB3aGF0IHRoZSB0ZXN0IGNncm91cCB3YXMgY2hhcmdlZC5cXG4rXFx0ICovXFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjZ3JvdXBfaXRlcl9pb19fcm9vdFxcXCIpKSB7XFxuK1xcdFxcdHN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rO1xcbitcXHRcXHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XFxuK1xcbitcXHRcXHRza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vnb3Rfcm9vdF9ibGtjZyA9IDA7XFxuK1xcdFxcdHJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVxcdTAwM2Vwcm9ncy5jZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2b3B0cyk7XFxuK1xcdFxcdGlmIChBU1NFUlRfT0tfUFRSKHJvb3RfbGluaywgXFxcImF0dGFjaCByb290IGl0ZXJcXFwiKSkge1xcbitcXHRcXHRcXHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXFxcInJlYWQgcm9vdCBzdGF0c1xcXCIpKSB7XFxuK1xcdFxcdFxcdFxcdHIgPSBcXHUwMDI2c2tlbC1cXHUwMDNlZGF0YV9xdWVyeS1cXHUwMDNlcm9vdF9xdWVyeTtcXG4rXFx0XFx0XFx0XFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZWdvdF9yb290X2Jsa2NnLCAxLFxcbitcXHRcXHRcXHRcXHRcXHQgIFxcXCJnb3Rfcm9vdF9ibGtjZ1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfRVEoci1cXHUwMDNlZGV2LCBxLVxcdTAwM2VkZXYsIFxcXCJyb290IGRldlxcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2J5dGVzLCBxLVxcdTAwM2V3Ynl0ZXMsIFxcXCJyb290IHdieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2lvcywgcS1cXHUwMDNld2lvcywgXFxcInJvb3Qgd2lvc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmJ5dGVzLCBxLVxcdTAwM2VyYnl0ZXMsIFxcXCJyb290IHJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmlvcywgcS1cXHUwMDNlcmlvcywgXFxcInJvb3Qgcmlvc1xcXCIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rY2xlYW51cF9saW5rOlxcbitcXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcXG4rY2xlYW51cF9za2VsOlxcbitcXHRjZ3JvdXBfaXRlcl9pb19fZGVzdHJveShza2VsKTtcXG4rY2xlYW51cF9sb29wOlxcbitcXHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcXG4rY2xlYW51cF9jZ3JvdXBfZmQ6XFxuK1xcdGNsb3NlKGNncm91cF9mZCk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjgzOWRlZjk0NTA4Nlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbkBAIC0wLDAgKzEsMTA3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cXG4rI2luY2x1ZGUgXFx1MDAzY3ZtbGludXguaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImNncm91cF9pdGVyX2lvLmhcXFwiXFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG4rXFxuKy8qIFRoZSBjb3VudGVycyBvZiB0aGUgZGV2aWNlIG5hbWVkIGJ5IHRhcmdldF9kZXYgYXJlIHN0b3JlZCBoZXJlLiAqL1xcbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogVGhlIHNhbWUgZGV2aWNlJ3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cXG4rc3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogU2V0IHRvIDEgYnkgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkgd2hlbiBicGZfZ2V0X3Jvb3RfYmxrY2coKSBzdWNjZWVkcy4gKi9cXG4rX191NjQgZ290X3Jvb3RfYmxrY2cgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogRGV2aWNlIHRvIHJlYWQsIHNldCBieSB1c2Vyc3BhY2UgKGtlcm5lbCBkZXZfdCkuIFBpbm5pbmcgdGhlIGRldmljZSBrZWVwc1xcbisgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuXFxuKyAqL1xcbitfX3U2NCB0YXJnZXRfZGV2IFNFQyhcXFwiLmRhdGEucXVlcnlcXFwiKTtcXG4rXFxuKy8qXFxuKyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSdzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5XFxuKyAqIHRoZSBvbmUgcGlubmVkIGRldmljZSBrZWVwcyB0aGUgcmVzdWx0IGRldGVybWluaXN0aWM6IHRoYXQgZGV2aWNlIGlzXFxuKyAqIHF1aWVzY2VkLCBzbyBpdHMgY291bnRlcnMgbWF0Y2ggaW8uc3RhdCBleGFjdGx5LCB3aGlsZSBwaWNraW5nIFxcXCJhbnkgZGV2aWNlXFxuKyAqIHdpdGggSS9PXFxcIiB3b3VsZCByYWNlIHdpdGggYmFja2luZy1zdG9yZSB3cml0ZWJhY2suXFxuKyAqL1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcXG4re1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4rXFxuK1xcdC8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovXFxuK1xcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhibGtjZyk7XFxuK1xcbitcXHQvKiBUaGUgcGVyLWRldmljZSBibGtnIHdhbGsgbmVlZHMgYW4gUkNVIHNlY3Rpb24uICovXFxuK1xcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XFxuK1xcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XFxuK1xcdFxcdGlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFxuK1xcdFxcdG91dC1cXHUwMDNlZGV2ID0gYnBmX2Jsa2dfZGV2KHBvcyk7XFxuK1xcdFxcdG91dC1cXHUwMDNlcmJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2J5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfV1JJVEUpO1xcbitcXHRcXHRvdXQtXFx1MDAzZXJpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2lvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9XUklURSk7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9ESVNDQVJEKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFx0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIucy9jZ3JvdXBcXFwiKVxcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cXHUwMDNlY2dyb3VwO1xcbitcXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xcbitcXG4rXFx0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xcbitcXHRpZiAoIWNncnApXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXG4rXFx0LyogU3RhcnQgZnJlc2ggc28gYSBkZXZpY2UgdGhhdCBpcyBub3QgZm91bmQgc3RheXMgYWxsLXplcm8uICovXFxuK1xcdF9fYnVpbHRpbl9tZW1zZXQoXFx1MDAyNmlvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTtcXG4rXFxuK1xcdGJsa2NnID0gYnBmX2dldF9ibGtjZyhcXHUwMDI2Y2dycC1cXHUwMDNlc2VsZik7XFxuK1xcdGlmICghYmxrY2cpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcXHUwMDI2aW9fcXVlcnkpO1xcbitcXG4rXFx0YnBmX3B1dF9ibGtjZyhibGtjZyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIucy9jZ3JvdXBcXFwiKVxcbitpbnQgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LVxcdTAwM2VjZ3JvdXA7XFxuK1xcdHN0cnVjdCBibGtjZyAqYmxrY2c7XFxuK1xcbitcXHQvKiBUaGUgbGFzdCBpdGVyYXRpb24gaGFzIGEgTlVMTCBjZ3JvdXAsIHNraXAgaXQuICovXFxuK1xcdGlmICghY2dycClcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRfX2J1aWx0aW5fbWVtc2V0KFxcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xcbitcXG4rXFx0YmxrY2cgPSBicGZfZ2V0X3Jvb3RfYmxrY2coKTtcXG4rXFx0aWYgKCFibGtjZylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcXG4rXFx0ICogdGhhbiBmcm9tIHJzdGF0LCBzbyB0aGlzIGFsc28gY292ZXJzIHRoZSByb290IHNpZGUgb2ZcXG4rXFx0ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZSBjb3VudGVycyBjb3ZlciBldmVyeSBjZ3JvdXAncyBJL08sIHNvXFxuK1xcdCAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QncyBvd24gY2dyb3VwIGRpZC5cXG4rXFx0ICovXFxuK1xcdHJlYWRfdGFyZ2V0X2RldihibGtjZywgXFx1MDAyNnJvb3RfcXVlcnkpO1xcbitcXG4rXFx0Z290X3Jvb3RfYmxrY2cgPSAxO1xcbitcXHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MDQuNjA3OTc3NjZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjozNjk0OTYwNTQyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQkxLX0NHUk9VUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9nZXRfcm9vdF9ibGtjZ1wiLFxuICAgIFwiYnBmX2dldF9ibGtjZ1wiLFxuICAgIFwiYnBmX3B1dF9ibGtjZ1wiLFxuICAgIFwiYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzXCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXh0XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX2Rlc3Ryb3lcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9ieXRlc1wiLFxuICAgIFwiYnBmX2Jsa2dfaW9zdGF0X2lvc1wiLFxuICAgIFwiYnBmX2Jsa2dfZGV2XCIsXG4gICAgXCJibGtjZ19maWxsX3Jvb3RfaW9zdGF0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIHRoZSBibG9jayBJL08gY29udHJvbGxlciAoYmxrY2cpIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyY2ExOWE4YTI0ODg3Mjg4OGRlMWE1YmU3ZDY3ODM4YTJmMmE0MjE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuKysrIGIvTUFJTlRBSU5FUlNcbkBAIC02NjE3LDYgKzY2MTcsNyBAQCBGOlx0YmxvY2svYmxrLWNncm91cC5jXG4gRjpcdGJsb2NrL2Jsay1pb2Nvc3QuY1xuIEY6XHRibG9jay9ibGstaW9sYXRlbmN5LmNcbiBGOlx0YmxvY2svYmxrLXRocm90dGxlLmNcbitGOlx0YmxvY2svYnBmX2Jsa2NnLmNcbiBGOlx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcbiBcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4rKysgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTE3LDYgKzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICs9IGVycm9yLWluamVjdGlvbi5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgKz0gYnNnLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXHQrPSBic2ctbGliLm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJsay1jZ3JvdXAub1xuK2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYnBmX2Jsa2NnLm9cbitlbmRpZlxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcdCs9IGJsay1jZ3JvdXAtcndzdGF0Lm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgKz0gYmxrLWNncm91cC1mYy1hcHBpZC5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcdCs9IGJsay10aHJvdHRsZS5vXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmNcbkBAIC0xMDg2LDcgKzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxuICAqIGZsdXNoaW5nIHRoZSByb290IGNncm91cCdzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XG4gICogd2l0aCBkaXNrIGxldmVsIHN0YXRpc3RpY3MuXG4gICovXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4ge1xuIFx0c3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmhcbkBAIC0yMDUsNiArMjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcbiBcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBibGtjZ19wb2xpY3kgKnBvbCk7XG4gXG4gY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpO1xuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XG4gdm9pZCBibGtjZ19wcmludF9ibGtncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3QgYmxrY2cgKmJsa2NnLFxuIFx0XHQgICAgICAgdTY0ICgqcHJmaWxsKShzdHJ1Y3Qgc2VxX2ZpbGUgKixcbiBcdFx0XHRcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcbmRpZmYgLS1naXQgYS9ibG9jay9icGZfYmxrY2cuYyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDhhODZmMDdlMTk4YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvYmxvY2svYnBmX2Jsa2NnLmNcbkBAIC0wLDAgKzEsMzE1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbisvKlxuKyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuXG4rICpcbisgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcbisgKiBjZ3JvdXAncyBjc3MgaW50byBhIHN0cnVjdCBibGtjZyB3aXRoIGJwZl9nZXRfYmxrY2coKSwgZmx1c2hlcyB0aGUgc3RhdHMgd2l0aFxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzIHdpdGggdGhlXG4rICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJ3MgY291bnRlcnMgd2l0aFxuKyAqIGJwZl9ibGtnX2lvc3RhdF9ieXRlcygpL2JwZl9ibGtnX2lvc3RhdF9pb3MoKS4gSXQgbWlycm9ycyB0aGUgbWVtb3J5XG4rICogY29udHJvbGxlciBrZnVuY3MgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgYnV0IGFkZHMgYSBwZXItZGV2aWNlIGRpbWVuc2lvbjpcbisgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cbisgKlxuKyAqIFRoaXMgZmlsZSBsaXZlcyBpbiBibG9jay8gYmVjYXVzZSB0aGUgYmxrY2cvYmxrZyBzdHJ1Y3QgbGF5b3V0cyBhcmUgcHJpdmF0ZVxuKyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cbisgKi9cbitcbisjaW5jbHVkZSBcImJsay1jZ3JvdXAuaFwiXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwXG4rICpcbisgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXNcbisgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJ3QgcmVxdWlyZSByZWZlcmVuY2UgY291bnRpbmcuIEl0J3Mgc2FmZSB0byBwYXNzIGl0XG4rICogdG8gYnBmX3B1dF9ibGtjZygpLlxuKyAqXG4rICogTm90ZSB0aGF0IHRoZSByb290IGNncm91cCBpcyBzcGVjaWFsOiBpdHMgY291bnRlcnMgYXJlIHRoZSBkaXNrcycgb3duXG4rICogc3RhdGlzdGljcywgc28gdGhleSBjb3ZlciBldmVyeSBjZ3JvdXAncyBJL08gcmF0aGVyIHRoYW4gb25seSB0aGUgcm9vdCdzLlxuKyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuXG4rICpcbisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X3Jvb3RfYmxrY2codm9pZClcbit7XG4rXHQvKiBjc3NfZ2V0KCkgaXMgbm90IG5lZWRlZCAqL1xuK1x0cmV0dXJuIFx1MDAyNmJsa2NnX3Jvb3Q7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXBcbisgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXG4rICpcbisgKiBJdCdzIGZpbmUgdG8gcGFzcyBhIGNzcyB3aGljaCBiZWxvbmdzIHRvIGFueSBjZ3JvdXAgY29udHJvbGxlcixcbisgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5J3MgbWFpbiBjc3MuXG4rICpcbisgKiBJbXBsZW1lbnRzIEtGX0FDUVVJUkUgc2VtYW50aWNzLlxuKyAqXG4rICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gYSBibGtjZyBzdHJ1Y3R1cmUgYWZ0ZXIgYnVtcGluZyB0aGUgY29ycmVzcG9uZGluZyBjc3Mnc1xuKyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X2Jsa2NnKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4re1xuK1x0c3RydWN0IGJsa2NnICpibGtjZyA9IE5VTEw7XG4rXG4rXHRpZiAoY3NzLVx1MDAzZXNzID09IFx1MDAyNmlvX2NncnBfc3Vic3lzKVxuK1x0XHRyZXR1cm4gY3NzX3RyeWdldChjc3MpID8gY3NzX3RvX2Jsa2NnKGNzcykgOiBOVUxMO1xuK1xuK1x0LypcbitcdCAqIFNvbWUgb3RoZXIgY29udHJvbGxlcidzIGNzcywgb3IgdGhlIGNncm91cCdzIG93biBvbmUuIExvb2sgdXAgdGhlIGlvXG4rXHQgKiBjb250cm9sbGVyJ3MgY3NzOyByY3Uga2VlcHMgaXQgYWxpdmUgYmV0d2VlbiB0aGUgbG9hZCBhbmQgdGhlIHRyeWdldC5cbitcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLydzIGxvY2tcbitcdCAqIGNvbnRleHQgYW5hbHlzaXMgY2FuIGZvbGxvdyBpdC5cbitcdCAqL1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0Y3NzID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhjc3MtXHUwMDNlY2dyb3VwLVx1MDAzZXN1YnN5c1tpb19jZ3JwX2lkXSk7XG4rXHRpZiAoY3NzIFx1MDAyNlx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXG4rXHRcdGJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdHJldHVybiBibGtjZztcbit9XG4rXG4rLyoqXG4rICogYnBmX3B1dF9ibGtjZyAtIFB1dCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcbisgKlxuKyAqIFJlbGVhc2VzIGEgcHJldmlvdXNseSBhY3F1aXJlZCBibGtjZyByZWZlcmVuY2UuXG4rICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9wdXRfYmxrY2coc3RydWN0IGJsa2NnICpibGtjZylcbit7XG4rXHRjc3NfcHV0KFx1MDAyNmJsa2NnLVx1MDAzZWNzcyk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwXG4rICpcbisgKiBDYWxsIHRoaXMgYmVmb3JlIHJlYWRpbmcgY291bnRlcnMgZm9yIHVwLXRvLWRhdGUgdmFsdWVzLiBTbGVlcGFibGUuXG4rICpcbisgKiBJdCBkb2VzIHdoYXQgcmVhZGluZyB0aGUgaW8uc3RhdCBmaWxlIGRvZXMsIHdoaWNoIGRpZmZlcnMgYnkgY2dyb3VwLiBGb3IgYVxuKyAqIG5vbi1yb290IGNncm91cCBpdCBmb2xkcyB0aGUgcGVyLWNwdSBkZWx0YXMgaW50byB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzXG4rICogYW5kIHVwIHRoZSBjZ3JvdXAgdHJlZS4gVGhlIHJvb3QgY2dyb3VwIGlzIG5vdCBhY2NvdW50ZWQgdGhyb3VnaCByc3RhdCBhdFxuKyAqIGFsbCwgc28gZm9yIGl0IHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXMgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzJ1xuKyAqIG93biBzdGF0aXN0aWNzLCB3aGljaCBjb3VudCBldmVyeSBjZ3JvdXAncyBJL08uXG4rICpcbisgKiBUaGUgcm9vdCBicmFuY2ggaXMgbm90IHNlbGYtbGltaXRpbmcgdGhlIHdheSB0aGUgcnN0YXQgb25lIGlzOiBpdCByZXJlYWRzXG4rICogZXZlcnkgZGlzayBvbiBldmVyeSBjYWxsLCB3aGlsZSBhIHNlY29uZCByc3RhdCBmbHVzaCBmaW5kcyBub3RoaW5nIGxlZnQgdG9cbisgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXG4rICogb25jZSByYXRoZXIgdGhhbiBvbmNlIHBlciBjZ3JvdXAgb2YgYSB3YWxrLlxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0aWYgKCFibGtjZy1cdTAwM2Vjc3MucGFyZW50KVxuK1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuK1x0ZWxzZVxuK1x0XHRjc3NfcnN0YXRfZmx1c2goXHUwMDI2YmxrY2ctXHUwMDNlY3NzKTtcbit9XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuK1x0X191NjQgX19vcGFxdWVbMl07XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXG4rICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrXG4rICpcbisgKiBFYWNoIHlpZWxkZWQgYmxrZyBob2xkcyBvbmUgYmxvY2sgZGV2aWNlJ3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGFcbisgKiBwZXItZGV2aWNlIGxpbmUgb2YgdGhlIGlvLnN0YXQgZmlsZS4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZCwgYXMgdGhlIGZpbGVcbisgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2tcbisgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yXG4rICogaXQuIE11c3QgYmUgdXNlZCBpbnNpZGUgYW4gUkNVIHJlYWQgc2VjdGlvbi5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbitcbitcdGtpdC1cdTAwM2VibGtjZyA9IGJsa2NnO1xuK1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcbisgKiBAaXQ6IGl0ZXJhdG9yXG4rICpcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcbitcbitcdC8qIENsZWFyZWQgb25jZSB0aGUgd2FsayBpcyBkb25lLCBzZWUgYmVsb3cuICovXG4rXHRpZiAoIWtpdC1cdTAwM2VibGtjZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRpZiAoIWJsa2cpXG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbitcdGVsc2VcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcbitcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cbitcdHdoaWxlIChub2RlKSB7XG4rXHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuK1x0XHRpZiAoYmxrZy1cdTAwM2VvbmxpbmUpIHtcbitcdFx0XHRraXQtXHUwMDNlcG9zID0gYmxrZztcbitcdFx0XHRyZXR1cm4gYmxrZztcbitcdFx0fVxuK1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIEZvcmdldCB0aGUgbGlzdCBoZWFkIGFzIHdlbGwuIFRoZSB2ZXJpZmllciBhc3N1bWVzIHRoYXQgYW4gaXRlcmF0b3JcbitcdCAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGVcbitcdCAqIGxvb3AgZm9yIHRlcm1pbmF0aW9uIG9uY2UgaXQgaGFzOyBzdGFydGluZyB0aGUgd2FsayBvdmVyIHdvdWxkIGxldFxuK1x0ICogc3VjaCBhIGxvb3Agc3BpbiBmb3JldmVyLlxuK1x0ICovXG4rXHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbitcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxuKyAqIEBpdDogaXRlcmF0b3JcbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK31cbitcbisvKlxuKyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJ3MgZmx1c2hlZCBpby5zdGF0IGFnZ3JlZ2F0ZS4gQGNvdW50ZXJzIGlzIG9uZVxuKyAqIG9mIHRoZSB0d28gYXJyYXlzIGluIGJsa2ctXHUwMDNlaW9zdGF0LmN1cjsgYm90aCBhcmUgZ3VhcmRlZCBieSB0aGF0IHN0cnVjdCdzXG4rICogc2VxbG9jaywgdGhlIG9uZSB0aGUgaW8uc3RhdCBmaWxlIHVzZXMuIFJldHVybnMgKHU2NCktMSBpZiB0aGUgY291bnRlclxuKyAqIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK3N0YXRpYyB1NjQgYmxrZ19pb3N0YXRfcmVhZChzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csIGNvbnN0IHU2NCAqY291bnRlcnMsXG4rXHRcdFx0ICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcbit7XG4rXHRzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0ICpiaXMgPSBcdTAwMjZibGtnLVx1MDAzZWlvc3RhdDtcbitcdHVuc2lnbmVkIGludCBzZXE7XG4rXHR1NjQgdmFsO1xuK1xuK1x0aWYgKCh1bnNpZ25lZCBpbnQpcncgXHUwMDNlPSBCTEtHX0lPU1RBVF9OUilcbitcdFx0cmV0dXJuICh1NjQpLTE7XG4rXG4rXHQvKlxuK1x0ICogT24gMzItYml0IHRoZSBsb29wIGJlbG93IHJlYWxseSBpcyBhIHNlcWNvdW50IHJldHJ5IGxvb3AuIEV2ZXJ5XG4rXHQgKiB3cml0ZXIgb2YgYmxrZy1cdTAwM2Vpb3N0YXQga2VlcHMgaW50ZXJydXB0cyBvZmYsIHNvIG9ubHkgYW4gTk1JIGNhbiBsYW5kXG4rXHQgKiBpbnNpZGUgYW4gdXBkYXRlLCBhbmQgdGhlbiB0aGUgbG9vcCB3b3VsZCBuZXZlciBlbmQuIFRoZXNlIGtmdW5jc1xuK1x0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXG4rXHQgKiBnaXZlIHVwIHJhdGhlciB0aGFuIHNwaW4uIE9uIDY0LWJpdCB0aGUgbG9vcCBjb21waWxlcyBhd2F5LlxuK1x0ICovXG4rXHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcdTAwMjZcdTAwMjYgaW5fbm1pKCkpXG4rXHRcdHJldHVybiAodTY0KS0xO1xuK1xuK1x0ZG8ge1xuK1x0XHRzZXEgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW4oXHUwMDI2YmlzLVx1MDAzZXN5bmMpO1xuK1x0XHR2YWwgPSBjb3VudGVyc1tyd107XG4rXHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXHUwMDI2YmlzLVx1MDAzZXN5bmMsIHNlcSkpO1xuK1xuK1x0cmV0dXJuIHZhbDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgYnl0ZSBjb3VudGVyXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmVhZHMgdGhlIGZsdXNoZWQgYWdncmVnYXRlLCBzbyBjYWxsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpIGZpcnN0IGZvclxuKyAqIHVwLXRvLWRhdGUgdmFsdWVzLiBUaGUgcmVhZCB1c2VzIHRoZSB1NjRfc3RhdHMgc2VxbG9jaywgbGlrZSB0aGUgaW8uc3RhdFxuKyAqIGZpbGUuXG4rICpcbisgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoc3RydWN0IGJsa2NnX2dxICpibGtnLFxuK1x0XHRcdFx0ICAgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuK3tcbitcdHJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgSS9PIGNvdW50XG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIEkvT3MsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfaW9zKHN0cnVjdCBibGtjZ19ncSAqYmxrZyxcbitcdFx0XHRcdCAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpXG4re1xuK1x0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmlvcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19kZXYgLSBSZXR1cm4gYSBibGtnJ3MgZGV2aWNlIGlkXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwXG4rICpcbisgKiBSZXR1cm46IHRoZSBkZXZpY2UncyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2dcbisgKiBoYXMgbm8gZGlzay5cbisgKi9cbitfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZylcbit7XG4rXHRpZiAoIWJsa2ctXHUwMDNlcSB8fCAhYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2spXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIGJsa2ctXHUwMDNlcS1cdTAwM2VkaXNrLVx1MDAzZXBhcnQwLVx1MDAzZWJkX2Rldjtcbit9XG4rXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbitcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wdXRfYmxrY2csIEtGX1JFTEVBU0UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuK1xuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbitcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfZGV2LCBLRl9SQ1UpXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHtcbitcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbitcdGlmIChlcnIpXG4rXHRcdHByX3dhcm4oXCJlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwiLCBlcnIpO1xuK1xuK1x0cmV0dXJuIGVycjtcbit9XG4rbGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5AQCAtMCwwICsxLDE3IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbisjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuK1xuK3N0cnVjdCBpb19xdWVyeSB7XG4rXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xuK1x0X191NjQgcmJ5dGVzO1xuK1x0X191NjQgd2J5dGVzO1xuK1x0X191NjQgcmlvcztcbitcdF9fdTY0IHdpb3M7XG4rXHRfX3U2NCBkYnl0ZXM7XG4rXHRfX3U2NCBkaW9zO1xuK1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4rfTtcbitcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICsxLDQgQEBcbitDT05GSUdfQkxLX0NHUk9VUD15XG4gQ09ORklHX0JMS19ERVZfTE9PUD15XG4gQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXlcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzJjZGE4MjQzMzE4M1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSwzMTAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rc3RhdGljIGludCByZWFkX3N0YXRzKHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRpbnQgZmQsIHJldCA9IDA7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuK1x0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcInJlYWQgZmRcIikpXG4rXHRcdHJldCA9IDE7XG4rXG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcbisgKiBkZXZpY2UgdG8gZ2VuZXJhdGUgY2dyb3VwLWNoYXJnZWQgSS9PIGFnYWluc3QuIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMVxuKyAqIGlmIGxvb3AgZGV2aWNlcyBhcmUgdW5hdmFpbGFibGUgKG5vbi1yb290IC8gbm8gQ09ORklHX0JMS19ERVZfTE9PUCkgc28gdGhlXG4rICogY2FsbGVyIGNhbiBza2lwLlxuKyAqL1xuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcbitcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuK3tcbitcdGNoYXIgYmFja19wYXRoW10gPSBcIi90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCI7XG4rXHRpbnQgbnI7XG4rXG4rXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuK1xuK1x0KmN0bF9mZCA9IG9wZW4oXCIvZGV2L2xvb3AtY29udHJvbFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuK1x0aWYgKG5yIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwiL2Rldi9sb29wJWRcIiwgbnIpO1xuK1xuK1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0dW5saW5rKGJhY2tfcGF0aCk7XG4rXHRpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdCpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdHJldHVybiAwO1xuK2VycjpcbitcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpsb29wX2ZkKTtcbitcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpiYWNrX2ZkKTtcbitcdGNsb3NlKCpjdGxfZmQpO1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuK1x0XHRcdCAgaW50IGJhY2tfZmQpXG4re1xuK1x0aW50IG5yID0gLTE7XG4rXG4rXHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuK1x0XHRjbG9zZShsb29wX2ZkKTtcbitcdH1cbitcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoYmFja19mZCk7XG4rXHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuK1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCIvZGV2L2xvb3AlZFwiLCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuK1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4rXHRcdGNsb3NlKGN0bF9mZCk7XG4rXHR9XG4rfVxuK1xuKy8qIE9fRElSRUNUIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuK3N0YXRpYyBpbnQgZG9fZGlyZWN0X2lvKGNvbnN0IGNoYXIgKmxvb3BfcGF0aClcbit7XG4rXHR2b2lkICpidWY7XG4rXHRpbnQgZmQsIHJldCA9IC0xO1xuK1xuK1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbitcdFx0Z290byBvdXRfZmQ7XG4rXHRtZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTtcbitcbitcdGlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcbitcdFx0Z290byBvdXRfYnVmO1xuK1x0ZnN5bmMoZmQpO1xuK1x0aWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4rXHRcdGdvdG8gb3V0X2J1ZjtcbitcdHJldCA9IDA7XG4rb3V0X2J1ZjpcbitcdGZyZWUoYnVmKTtcbitvdXRfZmQ6XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJ3MgaW8uc3RhdCBmaWxlIGFuZFxuKyAqIGZpbGwgQG91dC4gQGRldiBpcyBhIGtlcm5lbCBkZXZfdCAoYXMgcmV0dXJuZWQgYnkgYnBmX2Jsa2dfZGV2KSwgd2hvc2VcbisgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlXG4rICogZGV2aWNlJ3MgbGluZSB3YXMgZm91bmQuXG4rICovXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuK1x0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcbitcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFwiaW8uc3RhdFwiLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4rXHRjbG9zZShmZCk7XG4rXHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdHJldHVybiAtMTtcbitcdGJ1ZltuXSA9ICdcXDAnO1xuK1xuK1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcIlxcblwiLCBcdTAwMjZzYXZlcHRyKTsgbGluZTtcbitcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuK1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBcIm1hajptaW5cIiB0b2tlbiBpcyBhbHdheXMgcHJlc2VudDsgdGhlIGZpZWxkIGJsb2NrIGlzXG4rXHRcdCAqIG9wdGlvbmFsICh0aGUga2VybmVsIG9taXRzIGl0IGZvciBhIGRldmljZSB3aXRoIG5vIHJlYWQvd3JpdGVcbitcdFx0ICogSS9PKSwgc28gYSBtYXRjaCBvZiBcdTAwM2U9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC5cbitcdFx0ICovXG4rXHRcdGlmIChzc2NhbmYobGluZSxcbitcdFx0XHQgICBcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCIsXG4rXHRcdFx0ICAgXHUwMDI2bWFqLCBcdTAwMjZtaW4sIFx1MDAyNnJiLCBcdTAwMjZ3YiwgXHUwMDI2cmksIFx1MDAyNndpLCBcdTAwMjZkYiwgXHUwMDI2ZGkpIFx1MDAzYyAyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gd2I7XG4rXHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBkYjtcbitcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbitcdFx0cmV0ID0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbit7XG4rXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XCI7XG4rXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuK1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4rXHRjaGFyIGxvb3BfcGF0aFs2NF07XG4rXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4rXHRpbnQgY2dyb3VwX2ZkO1xuK1xuK1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4rXHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4rXHR9XG4rXG4rXHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG9vcDtcbitcbitcdC8qXG4rXHQgKiBQaW4gdGhlIHJlYWQgdG8gdGhlIGxvb3AgZGV2aWNlIHNvIHRoZSBtZWFzdXJlZCBkZXZpY2UgaXMgc3RhYmxlIGFuZFxuK1x0ICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90XG4rXHQgKiBlbmNvZGluZyAobWFqb3IgXHUwMDNjXHUwMDNjIDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuXG4rXHQgKi9cbitcdHtcbitcdFx0c3RydWN0IHN0YXQgbHN0O1xuK1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcdTAwMjZsc3QpLCBcImZzdGF0IGxvb3BcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4rXHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2V0YXJnZXRfZGV2ID1cbitcdFx0XHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcdTAwM2NcdTAwM2MgMjApIHwgbWlub3IobHN0LnN0X3JkZXYpO1xuK1x0fVxuK1xuK1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4rXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XG4rXHRcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxuK1x0XHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcbitcdH07XG4rXHRvcHRzLmxpbmtfaW5mbyA9IFx1MDAyNmxpbmZvO1xuK1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbitcbitcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfaW9fcXVlcnksIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwiYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfc2tlbDtcbitcbitcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXG4rXHRpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgXCJkb19kaXJlY3RfaW9cIikpXG4rXHRcdGdvdG8gY2xlYW51cF9saW5rO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbGluaztcbitcbitcdC8qXG4rXHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxuK1x0ICogcGF0dGVybiBpbiBjZ3JvdXBfaXRlcl9tZW1jZy5cbitcdCAqL1xuK1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXCIpKSB7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCJ3Ynl0ZXNcIik7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwid2lvc1wiKTtcbitcdH1cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmJ5dGVzLCAwLCBcInJieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmlvcywgMCwgXCJyaW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fZGV2XCIpKVxuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwiZGV2XCIpO1xuK1xuK1x0LypcbitcdCAqIFN0cm9uZ2VyIGNoZWNrOiB0aGUga2Z1bmMtcmVhZCB2YWx1ZXMgbXVzdCBlcXVhbCB3aGF0IHRoZSBpby5zdGF0XG4rXHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxuK1x0ICogdGhlIGZpbGUgd2l0aCBubyBJL08gaW4gYmV0d2Vlbiwgc28gYm90aCBmbHVzaGVkIHNuYXBzaG90cyBtYXRjaFxuK1x0ICogZXhhY3RseS5cbitcdCAqL1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fbWF0Y2hcIikpIHtcbitcdFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XG4rXG4rXHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgQVNTRVJUX09LKHBhcnNlX2lvX3N0YXQoY2dyb3VwX2ZkLCBxLVx1MDAzZWRldiwgXHUwMDI2ZmlsZXYpLFxuK1x0XHRcdCAgICAgIFwicGFyc2UgaW8uc3RhdFwiKSkge1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJieXRlcywgZmlsZXYucmJ5dGVzLCBcInJieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3Ynl0ZXMsIGZpbGV2LndieXRlcywgXCJ3Ynl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmlvcywgZmlsZXYucmlvcywgXCJyaW9zXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdpb3MsIGZpbGV2Lndpb3MsIFwid2lvc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkYnl0ZXMsIGZpbGV2LmRieXRlcywgXCJkYnl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGlvcywgZmlsZXYuZGlvcywgXCJkaW9zXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWVcbitcdCAqIGZyb20gcnN0YXQsIHRoZXkgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMsIHNvIHRoaXNcbitcdCAqIGNvdmVycyB0aGUgb3RoZXIgaGFsZiBvZiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhleSBjb3ZlciBldmVyeVxuK1x0ICogY2dyb3VwJ3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXG4rXHQgKiB0aGV5IG11c3QgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGUgdGVzdCBjZ3JvdXAgd2FzIGNoYXJnZWQuXG4rXHQgKi9cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3Jvb3RcIikpIHtcbitcdFx0c3RydWN0IGJwZl9saW5rICpyb290X2xpbms7XG4rXHRcdHN0cnVjdCBpb19xdWVyeSAqcjtcbitcbitcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnID0gMDtcbitcdFx0cm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnksXG4rXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcImF0dGFjaCByb290IGl0ZXJcIikpIHtcbitcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCJyZWFkIHJvb3Qgc3RhdHNcIikpIHtcbitcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbitcdFx0XHRcdEFTU0VSVF9FUShza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfYmxrY2csIDEsXG4rXHRcdFx0XHRcdCAgXCJnb3Rfcm9vdF9ibGtjZ1wiKTtcbitcdFx0XHRcdEFTU0VSVF9FUShyLVx1MDAzZWRldiwgcS1cdTAwM2VkZXYsIFwicm9vdCBkZXZcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3Ynl0ZXMsIHEtXHUwMDNld2J5dGVzLCBcInJvb3Qgd2J5dGVzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2lvcywgcS1cdTAwM2V3aW9zLCBcInJvb3Qgd2lvc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJieXRlcywgcS1cdTAwM2VyYnl0ZXMsIFwicm9vdCByYnl0ZXNcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyaW9zLCBxLVx1MDAzZXJpb3MsIFwicm9vdCByaW9zXCIpO1xuK1x0XHRcdH1cbitcdFx0XHRicGZfbGlua19fZGVzdHJveShyb290X2xpbmspO1xuK1x0XHR9XG4rXHR9XG4rXG4rY2xlYW51cF9saW5rOlxuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kobGluayk7XG4rY2xlYW51cF9za2VsOlxuK1x0Y2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7XG4rY2xlYW51cF9sb29wOlxuK1x0bG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7XG4rY2xlYW51cF9jZ3JvdXBfZmQ6XG4rXHRjbG9zZShjZ3JvdXBfZmQpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmI4MzlkZWY5NDUwODZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICsxLDEwNyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLmhcIlxuK1xuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbitcbisvKiBUaGUgY291bnRlcnMgb2YgdGhlIGRldmljZSBuYW1lZCBieSB0YXJnZXRfZGV2IGFyZSBzdG9yZWQgaGVyZS4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rLyogVGhlIHNhbWUgZGV2aWNlJ3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBTZXQgdG8gMSBieSBjZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSB3aGVuIGJwZl9nZXRfcm9vdF9ibGtjZygpIHN1Y2NlZWRzLiAqL1xuK19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIERldmljZSB0byByZWFkLCBzZXQgYnkgdXNlcnNwYWNlIChrZXJuZWwgZGV2X3QpLiBQaW5uaW5nIHRoZSBkZXZpY2Uga2VlcHNcbisgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuXG4rICovXG4rX191NjQgdGFyZ2V0X2RldiBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKlxuKyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSdzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5XG4rICogdGhlIG9uZSBwaW5uZWQgZGV2aWNlIGtlZXBzIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYzogdGhhdCBkZXZpY2UgaXNcbisgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyBcImFueSBkZXZpY2VcbisgKiB3aXRoIEkvT1wiIHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay5cbisgKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csXG4rXHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbitcbitcdC8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovXG4rXHRicGZfYmxrY2dfZmx1c2hfc3RhdHMoYmxrY2cpO1xuK1xuK1x0LyogVGhlIHBlci1kZXZpY2UgYmxrZyB3YWxrIG5lZWRzIGFuIFJDVSBzZWN0aW9uLiAqL1xuK1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbitcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XG4rXHRcdGlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlZGV2ID0gYnBmX2Jsa2dfZGV2KHBvcyk7XG4rXHRcdG91dC1cdTAwM2VyYnl0ZXMgPSBicGZfYmxrZ19pb3N0YXRfYnl0ZXMocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTtcbitcdFx0b3V0LVx1MDAzZXdieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9ESVNDQVJEKTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rfVxuK1xuK1NFQyhcIml0ZXIucy9jZ3JvdXBcIilcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xuK1x0X19idWlsdGluX21lbXNldChcdTAwMjZpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7XG4rXG4rXHRibGtjZyA9IGJwZl9nZXRfYmxrY2coXHUwMDI2Y2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghYmxrY2cpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZpb19xdWVyeSk7XG4rXG4rXHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJpdGVyLnMvY2dyb3VwXCIpXG4raW50IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2cm9vdF9xdWVyeSwgMCwgc2l6ZW9mKHJvb3RfcXVlcnkpKTtcbitcbitcdGJsa2NnID0gYnBmX2dldF9yb290X2Jsa2NnKCk7XG4rXHRpZiAoIWJsa2NnKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdC8qXG4rXHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcbitcdCAqIHRoYW4gZnJvbSByc3RhdCwgc28gdGhpcyBhbHNvIGNvdmVycyB0aGUgcm9vdCBzaWRlIG9mXG4rXHQgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhlIGNvdW50ZXJzIGNvdmVyIGV2ZXJ5IGNncm91cCdzIEkvTywgc29cbitcdCAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QncyBvd24gY2dyb3VwIGRpZC5cbitcdCAqL1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZyb290X3F1ZXJ5KTtcbitcbitcdGdvdF9yb290X2Jsa2NnID0gMTtcbitcdGJwZl9wdXRfYmxrY2coYmxrY2cpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MDQuNjA3OTc4NzVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NjY0MzA3NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkJQRiBLZnVuY3MgZm9yIEJsb2NrIEkvTyBDb250cm9sbGVyOiBJbml0aWFsIFRob3VnaHRzKipcblxuT2theSwgc28gd2UndmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjaW5nIEJQRiBrZnVuY3Mgc3BlY2lmaWNhbGx5IGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIsIGJsa2NnLiBJbnRlcmVzdGluZy4gVGhlIG5ldyBgYmxvY2svYnBmX2Jsa2NnLmNgIGZpbGUgbGF5cyBvdXQgdGhlIGdyb3VuZHdvcmssIHByb3ZpZGluZyBrZnVuY3MgbGlrZSBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBhbmQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uczogYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgLiBQbHVzLCB3ZSBnZXQgYWNjZXNzIHRvIHRob3NlIGNydWNpYWwgYGJwZl9ibGtnX2lvc3RhdF9ieXRlc2AsIGBicGZfYmxrZ19pb3N0YXRfaW9zYCwgYW5kIGBicGZfYmxrZ19kZXZgIGZ1bmN0aW9ucy4gRXNzZW50aWFsbHksIEJQRiBwcm9ncmFtcyBjYW4gbm93IGRpcmVjdGx5IHJlYWQgYSBjZ3JvdXAncyBpby5zdGF0IGNvdW50ZXJzLiBUaGlzIGlzIGdvaW5nIHRvIGJlIHVzZWZ1bC4gVGhlIGNoYW5nZXMgdG91Y2ggYm90aCB0aGUgY29yZSBibG9jayBsYXllciBhbmQgdGhlIEJQRiBzdWJzeXN0ZW0sIHdoaWNoIG1lYW5zIHdlIHdpbGwgbmVlZCB0byB0ZXN0IGJvdGguXG5cbk5vdywgdGhpcyBzY3JlYW1zIFwiZnV6emluZyB0YXJnZXRcIiB0byBtZS4gR2V0dGluZyBCUEYgdG8gcmVsaWFibHkgcmVhZCBibGtjZyBkYXRhIHdpbGwgcmVxdWlyZSBzb21lIHNlcmlvdXMgdGVzdGluZy4gTGV0J3MgbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHJpZ2h0IHNvIHdlIGNhbiBidWlsZCB0aGlzLlxuXG5MZXQncyBmaW5kIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9ucy4uLiBPa2F5LCBgYmxvY2svTWFrZWZpbGVgIGdpdmVzIHVzIHRoZSBrZXk6XG5cbmBgYG1ha2VmaWxlXG5pZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbm9iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYnBmX2Jsa2NnLm9cbmVuZGlmXG5gYGBcblxuU28sIHdlJ3JlIGRlZmluaXRlbHkgbG9va2luZyBhdCBuZWVkaW5nIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX0JMS19DR1JPVVBgIGVuYWJsZWQuICBMZXQncyB2ZXJpZnkgdGhlcmUgYXJlIG5vIG90aGVyIGRlcGVuZGVuY2llcy4gSSBuZWVkIHRvIHJ1biBhIGBnaXQgZ3JlcGAgY2hlY2sgb24gYENPTkZJR19CTEtfQ0dST1VQYCBpbiBgYmxvY2svS2NvbmZpZ2AgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNDk0LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzI1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTEuMjcyMjg4MzMzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzNzA3MzM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBCTEtfQ0dST1VQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImJsb2NrL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJibG9jay9LY29uZmlnPTM5PWNvbmZpZyBCTEtfUlFfQUxMT0NfVElNRVxcbi0tXFxuYmxvY2svS2NvbmZpZy00MS1cXG5ibG9jay9LY29uZmlnOjQyOmNvbmZpZyBCTEtfQ0dST1VQX1JXU1RBVFxcbmJsb2NrL0tjb25maWctNDMtXFx0Ym9vbFxcbmJsb2NrL0tjb25maWctNDQtXFxuYmxvY2svS2NvbmZpZzo0NTpjb25maWcgQkxLX0NHUk9VUF9QVU5UX0JJT1xcbmJsb2NrL0tjb25maWctNDYtXFx0Ym9vbFxcbi0tXFxuYmxvY2svS2NvbmZpZz0xMjc9Y29uZmlnIEJMS19XQlRfTVFcXG4tLVxcbmJsb2NrL0tjb25maWctMTMzLVxcbmJsb2NrL0tjb25maWc6MTM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPTEFURU5DWVxcbmJsb2NrL0tjb25maWctMTM1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBsYXRlbmN5IGJhc2VkIGNncm91cCBJTyBwcm90ZWN0aW9uXFxcIlxcbi0tXFxuYmxvY2svS2NvbmZpZy0xNDQtXFxuYmxvY2svS2NvbmZpZzoxNDU6Y29uZmlnIEJMS19DR1JPVVBfRkNfQVBQSURcXG5ibG9jay9LY29uZmlnLTE0Ni1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCB0byB0cmFjayBGQyBJL08gVHJhZmZpYyBhY3Jvc3MgY2dyb3VwIGFwcGxpY2F0aW9uc1xcXCJcXG4tLVxcbmJsb2NrL0tjb25maWctMTUzLVxcbmJsb2NrL0tjb25maWc6MTU0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVFxcbmJsb2NrL0tjb25maWctMTU1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXFxcIlxcbi0tXFxuYmxvY2svS2NvbmZpZy0xNjMtXFxuYmxvY2svS2NvbmZpZzoxNjQ6Y29uZmlnIEJMS19DR1JPVVBfSU9QUklPXFxuYmxvY2svS2NvbmZpZy0xNjUtXFx0Ym9vbCBcXFwiQ2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzoxMS4zMTYwMDI2MDJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyNjUwMDYxMjI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUuIE15IGN1cnJlbnQgdHJhaW4gb2YgdGhvdWdodCBzZWVtcyB0byBiZSBzdHVjayBvbiBzb21ldGhpbmcuIEknbSBoaXR0aW5nIGEgcm9hZGJsb2NrIGFuZCBuZWVkIHRvIGZpbmQgYSB3YXkgYXJvdW5kIGl0LiAqKkludmVzdGlnYXRpbmcgS2VybmVsIENvbmZpZ3VyYXRpb24qKi4gXG5cbkkgbmVlZCB0byByZWZpbmUgbXkgc2VhcmNoLiBSaWdodCBub3csIEknbSB0aGlua2luZyBJIHNob3VsZCBmb2N1cyBvbiBrZXJuZWwgY29uZmlndXJhdGlvbiwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5IG9uIHNvbWV0aGluZyByZWxhdGVkIHRvIGJsb2NrIGNncm91cHMuIFRvIGJlIHByZWNpc2UsIEkgc2hvdWxkIHRyeSB0byBzZWFyY2ggZm9yIHRoZSBleGFjdCBzdHJpbmc6IGBjb25maWcgQkxLX0NHUk9VUGAuIEhvcGVmdWxseSwgdGhhdCB3aWxsIGxlYWQgbWUgdG8gdGhlIHJlbGV2YW50IHNldHRpbmdzIGFuZCBkb2N1bWVudGF0aW9uIEkgbmVlZC4gVGltZSB0byBnZXQgc3BlY2lmaWMhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjQwLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTMuOTY2MDY2MjI2WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NTE2OTk5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeY29uZmlnIEJMS19DR1JPVVAkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImJsb2NrL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTQuMDExNTkzMzI1WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM2NTg4NjkzMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHN1bW1hcnksIHByZXNlbnRlZCBhcyBhIHN0cmVhbSBvZiB0aG91Z2h0OlxuXG4qKkZvY3VzaW5nIEluIG9uIEJsb2NrIENHcm91cHMqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgYEJMS19DR1JPVVBgIGlzIGRlZmluZWQgb3IgY29uZmlndXJlZC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIGBibG9jay9LY29uZmlnYCBmaWxlLiBUaGF0J3MgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQg4oCTIGl0J3Mgd2hlcmUga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGJsb2NrIGRldmljZXMgdHlwaWNhbGx5IHJlc2lkZS4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIEl0J3MgdGltZSB0byBkZWx2ZSBpbnRvIHRoZSBLY29uZmlnLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGVzZSBvcHRpb25zIGFyZSBkZXNjcmliZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzODIwLCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTcuMzc3NDgyMzQ1WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzNDk1MDM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJMS19DR1JPVVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYmxvY2svS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJibG9jay9LY29uZmlnPTM5PWNvbmZpZyBCTEtfUlFfQUxMT0NfVElNRVxcbi0tXFxuYmxvY2svS2NvbmZpZy00MS1cXG5ibG9jay9LY29uZmlnOjQyOmNvbmZpZyBCTEtfQ0dST1VQX1JXU1RBVFxcbmJsb2NrL0tjb25maWctNDMtXFx0Ym9vbFxcbmJsb2NrL0tjb25maWctNDQtXFxuYmxvY2svS2NvbmZpZzo0NTpjb25maWcgQkxLX0NHUk9VUF9QVU5UX0JJT1xcbmJsb2NrL0tjb25maWctNDYtXFx0Ym9vbFxcbi0tXFxuYmxvY2svS2NvbmZpZz0xMDY9Y29uZmlnIEJMS19ERVZfVEhST1RUTElOR1xcbmJsb2NrL0tjb25maWctMTA3LVxcdGJvb2wgXFxcIkJsb2NrIGxheWVyIGJpbyB0aHJvdHRsaW5nIHN1cHBvcnRcXFwiXFxuYmxvY2svS2NvbmZpZzoxMDg6XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXFxuYmxvY2svS2NvbmZpZzoxMDk6XFx0c2VsZWN0IEJMS19DR1JPVVBfUldTVEFUXFxuYmxvY2svS2NvbmZpZy0xMTAtXFx0aGVscFxcbi0tXFxuYmxvY2svS2NvbmZpZz0xMjc9Y29uZmlnIEJMS19XQlRfTVFcXG4tLVxcbmJsb2NrL0tjb25maWctMTMzLVxcbmJsb2NrL0tjb25maWc6MTM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPTEFURU5DWVxcbmJsb2NrL0tjb25maWctMTM1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBsYXRlbmN5IGJhc2VkIGNncm91cCBJTyBwcm90ZWN0aW9uXFxcIlxcbmJsb2NrL0tjb25maWc6MTM2OlxcdGRlcGVuZHMgb24gQkxLX0NHUk9VUFxcbmJsb2NrL0tjb25maWctMTM3LVxcdGhlbHBcXG4tLVxcbmJsb2NrL0tjb25maWctMTQ0LVxcbmJsb2NrL0tjb25maWc6MTQ1OmNvbmZpZyBCTEtfQ0dST1VQX0ZDX0FQUElEXFxuYmxvY2svS2NvbmZpZy0xNDYtXFx0Ym9vbCBcXFwiRW5hYmxlIHN1cHBvcnQgdG8gdHJhY2sgRkMgSS9PIFRyYWZmaWMgYWNyb3NzIGNncm91cCBhcHBsaWNhdGlvbnNcXFwiXFxuYmxvY2svS2NvbmZpZzoxNDc6XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQIFxcdTAwMjZcXHUwMDI2IE5WTUVfRkNcXG5ibG9jay9LY29uZmlnLTE0OC1cXHRoZWxwXFxuLS1cXG5ibG9jay9LY29uZmlnLTE1My1cXG5ibG9jay9LY29uZmlnOjE1NDpjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcXG5ibG9jay9LY29uZmlnLTE1NS1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCBmb3IgY29zdCBtb2RlbCBiYXNlZCBjZ3JvdXAgSU8gY29udHJvbGxlclxcXCJcXG5ibG9jay9LY29uZmlnOjE1NjpcXHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcXG5ibG9jay9LY29uZmlnLTE1Ny1cXHRzZWxlY3QgQkxLX1JRX0FMTE9DX1RJTUVcXG4tLVxcbmJsb2NrL0tjb25maWctMTYzLVxcbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xcbmJsb2NrL0tjb25maWctMTY1LVxcdGJvb2wgXFxcIkNncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1xcXCJcXG5ibG9jay9LY29uZmlnOjE2NjpcXHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcXG5ibG9jay9LY29uZmlnLTE2Ny1cXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjE3LjQyMDk4MjUyM1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2OTA0NDI3MzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyBhIEtlcm5lbC1MZXZlbCBCbG9jayBJL08gSXNzdWUqKlxuXG5Pa2F5LCBzbyBJJ20ga25lZS1kZWVwIGluIHRoaXMgYmxvY2sgSS9PIHBlcmZvcm1hbmNlIGlzc3VlLCBhbmQgSSd2ZSBoaXQgYSBzbmFnLiBJJ20gbG9va2luZyBhdCB0aGUgcmVsZXZhbnQgY29kZSBwYXRoLCBhbmQgSSd2ZSBlbmNvdW50ZXJlZCBgQkxLX0NHUk9VUGAuIE5vdywgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBcIldhaXQgYSBtaW51dGUuLi4gd2hlcmUgKmV4YWN0bHkqIGlzIGBCTEtfQ0dST1VQYCBkZWZpbmVkP1wiIEl0J3MgYmVlbiBhIHdoaWxlIHNpbmNlIEkgbGFzdCBsb29rZWQgYXQgdGhpcyBwYXJ0IG9mIHRoZSBrZXJuZWwsIGFuZCB0aGUgY2dyb3VwIGJsb2NrIEkvTyBpbnRlZ3JhdGlvbiBjYW4gYmUgdHJpY2t5LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIG1hY3JvcyBhbmQgdmFyaWFibGVzIGluIHBsYXkuIEkgbmVlZCB0aGUgZGVmaW5pdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3cgaGVyZS4gSXMgaXQgYSBjb3JlIGNncm91cCBjb25zdGFudD8gSXMgaXQgYSBsb2NhbCBkZWZpbml0aW9uIHdpdGhpbiB0aGUgYmxvY2sgbGF5ZXIncyBjZ3JvdXAgaW1wbGVtZW50YXRpb24/IEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBoZWFkZXIgZmlsZSBvciBtb2R1bGUgdGhhdCBkZWNsYXJlcyB0aGlzIGNvbnN0YW50LiBXaXRob3V0IHRoYXQsIEknbSBlc3NlbnRpYWxseSBmbHlpbmcgYmxpbmQgYW5kIGNhbid0IGFjY3VyYXRlbHkgYXNzZXNzIGl0cyByb2xlIGluIHRoaXMgcGVyZm9ybWFuY2UgYm90dGxlbmVjay4gQmFjayB0byB0aGUgaW5jbHVkZSBwYXRocyFcblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1ODksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzoyMS4xMTE0Mjg1MDRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0NDc3MjA4LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJebWVudWNvbmZpZyBCTEtfQ0dST1VQJFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJibG9jay9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjIxLjE1NTkxMzc5MloiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyOTczMzMzNzc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgc3VtbWFyeSwgcHJlc2VudGVkIGFzIGEgc3RyZWFtIG9mIHRob3VnaHQ6XG5cbioqS2NvbmZpZyBLZXl3b3JkIEh1bnQ6IEJMS19DR1JPVVAqKlxuXG5SaWdodCwgdGltZSB0byBnZXQgdG8gd29yay4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGBCTEtfQ0dST1VQYCB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBJIGtub3cgaXQncyByZWxhdGVkIHRvIGNncm91cCBibG9jayBkZXZpY2UgY29udHJvbCwgYnV0IEkgbmVlZCBhIGRlZmluaXRpdmUgcGljdHVyZS4gU28sIEkgbmVlZCB0byBkbyBhIGZ1bGwgc2VhcmNoLiBJJ20gZ29pbmcgdG8gc2NhbiAqYWxsKiB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBtZWFucyBhIGNvbXByZWhlbnNpdmUgc2VhcmNoIGFjcm9zcyB0aGUgZW50aXJlIGtlcm5lbCBjb25maWd1cmF0aW9uIHNwYWNlLiBObyBjaGVycnktcGlja2luZywgSSB3YW50IHRoZSBmdWxsIGNvbnRleHQuIExldCdzIHNlZSB3aGF0IHRoZSBLY29uZmlnIGZpbGVzIGhhdmUgdG8gc2F5IGFib3V0IHRoaXMuIFRoYXQgc2VhcmNoIHNob3VsZCBnaXZlIG1lIHRoZSBpbmZvcm1hdGlvbiBJIG5lZWQuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIGRlcGVuZGVuY2llcyBhbmQgZGVmYXVsdCB2YWx1ZXMgb25jZSBJIGhhdmUgdGhlIHJlc3VsdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0ODc1LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MjQuMTI5MjQ5NjA2WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTEyOTA2ODk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5jb25maWcgQkxLX0NHUk9VUCRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDk5PWNvbmZpZyBNRU1DR19WMVxcbi0tXFxuaW5pdC9LY29uZmlnLTExMTUtXFxuaW5pdC9LY29uZmlnOjExMTY6Y29uZmlnIEJMS19DR1JPVVBcXG5pbml0L0tjb25maWctMTExNy1cXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzoyNi42NDIxNjA4MTRaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE0NzU5NzgxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyBhIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jeSoqXG5cblJpZ2h0LCBJJ20gb250byBzb21ldGhpbmcuLi50aGUgc2V0dGluZyBJJ20gYWZ0ZXIgaXMgcHJvYmFibHkgaW4gYGluaXQvS2NvbmZpZ2AuIENsYXNzaWMgcGxhY2UgZm9yIGNvcmUgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaW1lIHRvIGRpZyBpbiBhbmQgdW5kZXJzdGFuZCBpdHMgZGVwZW5kZW5jaWVzLiBObyBwb2ludCBqdXN0IGZsaXBwaW5nIGEgc3dpdGNoIGJsaW5kbHk7IGdvdHRhIGZpZ3VyZSBvdXQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgaXQgYmVpbmcgc2V0IHVwIHRoZSB3YXkgaXQgaXMuIEkgbmVlZCB0byBzZWUgKndoeSogaXQncyBjb25maWd1cmVkIHRoZSB3YXkgaXQgaXMgLSBhcmUgdGhlcmUgc3BlY2lmaWMgZmVhdHVyZXMsIGtlcm5lbCB2ZXJzaW9ucywgb3IgaGFyZHdhcmUgY29uZmlndXJhdGlvbnMgdGhhdCB0cmlnZ2VyIGl0cyBpbmNsdXNpb24/IElzIGl0IGdhdGVkIG9uIHNvbWUgZXNvdGVyaWMgbWVudSBwYXRoPyBJJ2xsIG5lZWQgdG8gcmV2ZXJzZS1lbmdpbmVlciBpdHMgaW1wbGljYXRpb25zIHdpdGhpbiB0aGUgYnJvYWRlciBhcmNoaXRlY3R1cmUuIE9rYXksIGxldCdzIGZpcmUgdXAgdGhlIGVkaXRvciBhbmQgc3RhcnQgdHJhY2luZy4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTE3MCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjMwLjc4OTc2MTM1OVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ2NTIzNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJMS19DR1JPVVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDk5PWNvbmZpZyBNRU1DR19WMVxcbi0tXFxuaW5pdC9LY29uZmlnLTExMTUtXFxuaW5pdC9LY29uZmlnOjExMTY6Y29uZmlnIEJMS19DR1JPVVBcXG5pbml0L0tjb25maWctMTExNy1cXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzozMC44MzQ0MTc5MDhaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzYzMjkwNDc0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKipcblxuT2theSwgc28gSSdtIHRyeWluZyB0byBnZXQgYSBoYW5kbGUgb24gdGhpcyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEknbSB0aGlua2luZywgYGluaXQvS2NvbmZpZ2AgaXMgdGhlIHBsYWNlIHRvIHN0YXJ0LCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTExNi4gVGhhdCBhcmVhIGxpa2VseSBkZWFscyB3aXRoIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb3IgYSBwYXJ0aWN1bGFyIG1vZHVsZSBJJ20gaW50ZXJlc3RlZCBpbi4gSSBzaG91bGQgY2hlY2sgdGhhdCBzZWN0aW9uIGZvciB0aGUgcmVsZXZhbnQgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gTGV0J3Mgc2VlIHdoYXQgZ2VtcyBsaWUgaW4gd2FpdCBpbiB0aGF0IHBvcnRpb24gb2YgYEtjb25maWdgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTQ1NCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjM0LjQ2NzMyNDYxWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NDg2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbml0L0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMTExMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTExMDpcXHRcXHQgIFBsZWFzZSBub3RlIHRoYXQgZmVhdHVyZSBzZXQgb2YgdGhlIGxlZ2FjeSBtZW1vcnkgY29udHJvbGxlciBpcyBsaWtlbHlcXG4xMTExOlxcdFxcdCAgZ29pbmcgdG8gc2hyaW5rIGR1ZSB0byBkZXByZWNhdGlvbiBwcm9jZXNzLiBOZXcgZGVwbG95bWVudHMgd2l0aCB2MVxcbjExMTI6XFx0XFx0ICBjb250cm9sbGVyIGFyZSBoaWdobHkgZGlzY291cmFnZWQuXFxuMTExMzpcXHRcXG4xMTE0OlxcdFxcdCAgU2F5IE4gaWYgdW5zdXJlLlxcbjExMTU6XFx0XFxuMTExNjpcXHRjb25maWcgQkxLX0NHUk9VUFxcbjExMTc6XFx0XFx0Ym9vbCBcXFwiSU8gY29udHJvbGxlclxcXCJcXG4xMTE4OlxcdFxcdGRlcGVuZHMgb24gQkxPQ0tcXG4xMTE5OlxcdFxcdGRlZmF1bHQgblxcbjExMjA6XFx0XFx0aGVscFxcbjExMjE6XFx0XFx0R2VuZXJpYyBibG9jayBJTyBjb250cm9sbGVyIGNncm91cCBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlIGNvbW1vblxcbjExMjI6XFx0XFx0Y2dyb3VwIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgdXNlZCBieSB2YXJpb3VzIElPIGNvbnRyb2xsaW5nXFxuMTEyMzpcXHRcXHRwb2xpY2llcy5cXG4xMTI0OlxcdFxcbjExMjU6XFx0XFx0Q3VycmVudGx5LCBDRlEgSU8gc2NoZWR1bGVyIHVzZXMgaXQgdG8gcmVjb2duaXplIHRhc2sgZ3JvdXBzIGFuZFxcbjExMjY6XFx0XFx0Y29udHJvbCBkaXNrIGJhbmR3aWR0aCBhbGxvY2F0aW9uIChwcm9wb3J0aW9uYWwgdGltZSBzbGljZSBhbGxvY2F0aW9uKVxcbjExMjc6XFx0XFx0dG8gc3VjaCB0YXNrIGdyb3Vwcy4gSXQgaXMgYWxzbyB1c2VkIGJ5IGJpbyB0aHJvdHRsaW5nIGxvZ2ljIGluXFxuMTEyODpcXHRcXHRibG9jayBsYXllciB0byBpbXBsZW1lbnQgdXBwZXIgbGltaXQgaW4gSU8gcmF0ZXMgb24gYSBkZXZpY2UuXFxuMTEyOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MzQuNDY3NTAwODdaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzAxMjA2NDY1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEJsb2NrIGNncm91cCBCUEYgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBCTEtfQ0dST1VQYCBzdHVmZiwgYW5kIGl0J3MgcHJldHR5IGNsZWFyIHRoYXQgaXQgaGFzIGEgZGVwZW5kZW5jeSBvbiBgQkxPQ0tgLiBUaGF0J3Mgbm90IHVuZXhwZWN0ZWQsIGJ1dCBnb29kIHRvIGtlZXAgaW4gbWluZC4gSSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBrZXJuZWwgY29uZmlnIGluY2x1ZGVzIGBCUEZfU1lTQ0FMTGAgYWxvbmcgd2l0aCBgQkxLX0NHUk9VUGAg4oCTIHRoZXNlIGFyZSBteSBiYXNlIHJlcXVpcmVtZW50cy5cblxuTm93LCBsZXQncyBuYWlsIGRvd24gdGhlIGNyaXRpY2FsIHBpZWNlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIG5ldyBhZGRpdGlvbnMgYW5kIGNoYW5nZXMuIE15IGZvY3VzIHJpZ2h0IG5vdyBpcyB0byBpZGVudGlmeSB0aGUgbWFpbiBzeW1ib2xzIHRoYXQgZGVmaW5lIHRoZSBCUEYgaW50ZWdyYXRpb24gZm9yIGJsb2NrIGNncm91cHMuXG5cbkZyb20gYGJsb2NrL2JwZl9ibGtjZy5jYCwgdGhlc2UgYXJlIHRoZSBrZXkgZnVuY3Rpb25zIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kOiBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAsIGBicGZfYmxrZ19pb3N0YXRfYnl0ZXNgLCBgYnBmX2Jsa2dfaW9zdGF0X2lvc2AsIGFuZCBgYnBmX2Jsa2dfZGV2YC4gVGhlc2UgY2xlYXJseSBoYW5kbGUgdGhpbmdzIGxpa2Ugcm9vdCBjZ3JvdXAgYWNjZXNzLCBjZ3JvdXAgbWFuYWdlbWVudCwgc3RhdHMgZmx1c2hpbmcsIGFuZCBpdGVyYXRpb24sIGFzIHdlbGwgYXMgYWNjZXNzaW5nIEkvTyBzdGF0aXN0aWNzIGFuZCB0aGUgZGV2aWNlIGl0c2VsZi5cblxuSXQgbG9va3MgbGlrZSB0aGUgYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYCBmdW5jdGlvbiBpbiBgYmxvY2svYmxrLWNncm91cC5jYCBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgdG8gYmUgbm9uLXN0YXRpYy4gSSBuZWVkIHRvIGNoZWNrIHRoaXMgb3V0LCBhcyBub24tc3RhdGljIGxpa2VseSBpbmRpY2F0ZXMgaXQncyB1c2VkIG1vcmUgYnJvYWRseSBub3cuXG5cbkknbGwgbWFrZSBzdXJlIHRvIGFkZCBhbGwgb2YgdGhlc2UgYXMgXCJGb2N1c1N5bWJvbHNcIiBpbiBteSBub3RlcywgdG8gdHJhY2sgdGhlbSBhcyBJIGRpdmUgZGVlcGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTkxNCwiT3V0cHV0VG9rZW5zIjoyMzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzo0MS40Nzk1Njg2NzJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3ODAxMTE0OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJMS19DR1JPVVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfZ2V0X3Jvb3RfYmxrY2dcIixcbiAgICBcImJwZl9nZXRfYmxrY2dcIixcbiAgICBcImJwZl9wdXRfYmxrY2dcIixcbiAgICBcImJwZl9ibGtjZ19mbHVzaF9zdGF0c1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXdcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19kZXN0cm95XCIsXG4gICAgXCJicGZfYmxrZ19pb3N0YXRfYnl0ZXNcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9pb3NcIixcbiAgICBcImJwZl9ibGtnX2RldlwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCdzIGlvLnN0YXQgY291bnRlcnMuIFRoZXNlIGtmdW5jcyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGhhbmRsZSB2YXJpb3VzIGlucHV0cyBhbmQgY29uY3VycmVudCBleGVjdXRpb25zIHNhZmVseS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQkxLX0NHUk9VUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9nZXRfcm9vdF9ibGtjZ1wiLFxuICAgIFwiYnBmX2dldF9ibGtjZ1wiLFxuICAgIFwiYnBmX3B1dF9ibGtjZ1wiLFxuICAgIFwiYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzXCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXh0XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX2Rlc3Ryb3lcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9ieXRlc1wiLFxuICAgIFwiYnBmX2Jsa2dfaW9zdGF0X2lvc1wiLFxuICAgIFwiYnBmX2Jsa2dfZGV2XCIsXG4gICAgXCJibGtjZ19maWxsX3Jvb3RfaW9zdGF0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIHRoZSBibG9jayBJL08gY29udHJvbGxlciAoYmxrY2cpIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzo0MS41NTc1ODc3NTlaIiwiU2VxIjoxOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjUzNjM5NjE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6NDEuNTU4MTQ0MDE5WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE3MjUzMDgwNjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MgKGlvLnN0YXQpLiBJdCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgY29tcGxleCBzdHJ1Y3R1cmVzLCBjb3B5IGRhdGEgZGlyZWN0bHkgdG8gdXNlciBzcGFjZSwgb3IgaW50cm9kdWNlIGxvZ2ljIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUga2Z1bmNzIHJldHVybiBzaW1wbGUgc2NhbGFyIHZhbHVlcyAodTY0KSBvciBwb2ludGVycyB0byBleGlzdGluZywgaW5pdGlhbGl6ZWQga2VybmVsIHN0cnVjdHVyZXMuIFRoZSBCUEYgaXRlcmF0b3Igc3RhdGUgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcywgc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgcmVsYXRlZCB0byBSQ1Ugb3IgY2dyb3VwIHJlZmVyZW5jZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyY2ExOWE4YTI0ODg3Mjg4OGRlMWE1YmU3ZDY3ODM4YTJmMmE0MjE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuKysrIGIvTUFJTlRBSU5FUlNcbkBAIC02NjE3LDYgKzY2MTcsNyBAQCBGOlx0YmxvY2svYmxrLWNncm91cC5jXG4gRjpcdGJsb2NrL2Jsay1pb2Nvc3QuY1xuIEY6XHRibG9jay9ibGstaW9sYXRlbmN5LmNcbiBGOlx0YmxvY2svYmxrLXRocm90dGxlLmNcbitGOlx0YmxvY2svYnBmX2Jsa2NnLmNcbiBGOlx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcbiBcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4rKysgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTE3LDYgKzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICs9IGVycm9yLWluamVjdGlvbi5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgKz0gYnNnLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXHQrPSBic2ctbGliLm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJsay1jZ3JvdXAub1xuK2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYnBmX2Jsa2NnLm9cbitlbmRpZlxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcdCs9IGJsay1jZ3JvdXAtcndzdGF0Lm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgKz0gYmxrLWNncm91cC1mYy1hcHBpZC5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcdCs9IGJsay10aHJvdHRsZS5vXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmNcbkBAIC0xMDg2LDcgKzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxuICAqIGZsdXNoaW5nIHRoZSByb290IGNncm91cCdzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XG4gICogd2l0aCBkaXNrIGxldmVsIHN0YXRpc3RpY3MuXG4gICovXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4ge1xuIFx0c3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmhcbkBAIC0yMDUsNiArMjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcbiBcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBibGtjZ19wb2xpY3kgKnBvbCk7XG4gXG4gY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpO1xuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XG4gdm9pZCBibGtjZ19wcmludF9ibGtncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3QgYmxrY2cgKmJsa2NnLFxuIFx0XHQgICAgICAgdTY0ICgqcHJmaWxsKShzdHJ1Y3Qgc2VxX2ZpbGUgKixcbiBcdFx0XHRcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcbmRpZmYgLS1naXQgYS9ibG9jay9icGZfYmxrY2cuYyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDhhODZmMDdlMTk4YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvYmxvY2svYnBmX2Jsa2NnLmNcbkBAIC0wLDAgKzEsMzE1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbisvKlxuKyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuXG4rICpcbisgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcbisgKiBjZ3JvdXAncyBjc3MgaW50byBhIHN0cnVjdCBibGtjZyB3aXRoIGJwZl9nZXRfYmxrY2coKSwgZmx1c2hlcyB0aGUgc3RhdHMgd2l0aFxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzIHdpdGggdGhlXG4rICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJ3MgY291bnRlcnMgd2l0aFxuKyAqIGJwZl9ibGtnX2lvc3RhdF9ieXRlcygpL2JwZl9ibGtnX2lvc3RhdF9pb3MoKS4gSXQgbWlycm9ycyB0aGUgbWVtb3J5XG4rICogY29udHJvbGxlciBrZnVuY3MgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgYnV0IGFkZHMgYSBwZXItZGV2aWNlIGRpbWVuc2lvbjpcbisgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cbisgKlxuKyAqIFRoaXMgZmlsZSBsaXZlcyBpbiBibG9jay8gYmVjYXVzZSB0aGUgYmxrY2cvYmxrZyBzdHJ1Y3QgbGF5b3V0cyBhcmUgcHJpdmF0ZVxuKyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cbisgKi9cbitcbisjaW5jbHVkZSBcImJsay1jZ3JvdXAuaFwiXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwXG4rICpcbisgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXNcbisgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJ3QgcmVxdWlyZSByZWZlcmVuY2UgY291bnRpbmcuIEl0J3Mgc2FmZSB0byBwYXNzIGl0XG4rICogdG8gYnBmX3B1dF9ibGtjZygpLlxuKyAqXG4rICogTm90ZSB0aGF0IHRoZSByb290IGNncm91cCBpcyBzcGVjaWFsOiBpdHMgY291bnRlcnMgYXJlIHRoZSBkaXNrcycgb3duXG4rICogc3RhdGlzdGljcywgc28gdGhleSBjb3ZlciBldmVyeSBjZ3JvdXAncyBJL08gcmF0aGVyIHRoYW4gb25seSB0aGUgcm9vdCdzLlxuKyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuXG4rICpcbisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X3Jvb3RfYmxrY2codm9pZClcbit7XG4rXHQvKiBjc3NfZ2V0KCkgaXMgbm90IG5lZWRlZCAqL1xuK1x0cmV0dXJuIFx1MDAyNmJsa2NnX3Jvb3Q7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXBcbisgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXG4rICpcbisgKiBJdCdzIGZpbmUgdG8gcGFzcyBhIGNzcyB3aGljaCBiZWxvbmdzIHRvIGFueSBjZ3JvdXAgY29udHJvbGxlcixcbisgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5J3MgbWFpbiBjc3MuXG4rICpcbisgKiBJbXBsZW1lbnRzIEtGX0FDUVVJUkUgc2VtYW50aWNzLlxuKyAqXG4rICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gYSBibGtjZyBzdHJ1Y3R1cmUgYWZ0ZXIgYnVtcGluZyB0aGUgY29ycmVzcG9uZGluZyBjc3Mnc1xuKyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X2Jsa2NnKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4re1xuK1x0c3RydWN0IGJsa2NnICpibGtjZyA9IE5VTEw7XG4rXG4rXHRpZiAoY3NzLVx1MDAzZXNzID09IFx1MDAyNmlvX2NncnBfc3Vic3lzKVxuK1x0XHRyZXR1cm4gY3NzX3RyeWdldChjc3MpID8gY3NzX3RvX2Jsa2NnKGNzcykgOiBOVUxMO1xuK1xuK1x0LypcbitcdCAqIFNvbWUgb3RoZXIgY29udHJvbGxlcidzIGNzcywgb3IgdGhlIGNncm91cCdzIG93biBvbmUuIExvb2sgdXAgdGhlIGlvXG4rXHQgKiBjb250cm9sbGVyJ3MgY3NzOyByY3Uga2VlcHMgaXQgYWxpdmUgYmV0d2VlbiB0aGUgbG9hZCBhbmQgdGhlIHRyeWdldC5cbitcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLydzIGxvY2tcbitcdCAqIGNvbnRleHQgYW5hbHlzaXMgY2FuIGZvbGxvdyBpdC5cbitcdCAqL1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0Y3NzID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhjc3MtXHUwMDNlY2dyb3VwLVx1MDAzZXN1YnN5c1tpb19jZ3JwX2lkXSk7XG4rXHRpZiAoY3NzIFx1MDAyNlx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXG4rXHRcdGJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdHJldHVybiBibGtjZztcbit9XG4rXG4rLyoqXG4rICogYnBmX3B1dF9ibGtjZyAtIFB1dCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcbisgKlxuKyAqIFJlbGVhc2VzIGEgcHJldmlvdXNseSBhY3F1aXJlZCBibGtjZyByZWZlcmVuY2UuXG4rICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9wdXRfYmxrY2coc3RydWN0IGJsa2NnICpibGtjZylcbit7XG4rXHRjc3NfcHV0KFx1MDAyNmJsa2NnLVx1MDAzZWNzcyk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwXG4rICpcbisgKiBDYWxsIHRoaXMgYmVmb3JlIHJlYWRpbmcgY291bnRlcnMgZm9yIHVwLXRvLWRhdGUgdmFsdWVzLiBTbGVlcGFibGUuXG4rICpcbisgKiBJdCBkb2VzIHdoYXQgcmVhZGluZyB0aGUgaW8uc3RhdCBmaWxlIGRvZXMsIHdoaWNoIGRpZmZlcnMgYnkgY2dyb3VwLiBGb3IgYVxuKyAqIG5vbi1yb290IGNncm91cCBpdCBmb2xkcyB0aGUgcGVyLWNwdSBkZWx0YXMgaW50byB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzXG4rICogYW5kIHVwIHRoZSBjZ3JvdXAgdHJlZS4gVGhlIHJvb3QgY2dyb3VwIGlzIG5vdCBhY2NvdW50ZWQgdGhyb3VnaCByc3RhdCBhdFxuKyAqIGFsbCwgc28gZm9yIGl0IHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXMgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzJ1xuKyAqIG93biBzdGF0aXN0aWNzLCB3aGljaCBjb3VudCBldmVyeSBjZ3JvdXAncyBJL08uXG4rICpcbisgKiBUaGUgcm9vdCBicmFuY2ggaXMgbm90IHNlbGYtbGltaXRpbmcgdGhlIHdheSB0aGUgcnN0YXQgb25lIGlzOiBpdCByZXJlYWRzXG4rICogZXZlcnkgZGlzayBvbiBldmVyeSBjYWxsLCB3aGlsZSBhIHNlY29uZCByc3RhdCBmbHVzaCBmaW5kcyBub3RoaW5nIGxlZnQgdG9cbisgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXG4rICogb25jZSByYXRoZXIgdGhhbiBvbmNlIHBlciBjZ3JvdXAgb2YgYSB3YWxrLlxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0aWYgKCFibGtjZy1cdTAwM2Vjc3MucGFyZW50KVxuK1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuK1x0ZWxzZVxuK1x0XHRjc3NfcnN0YXRfZmx1c2goXHUwMDI2YmxrY2ctXHUwMDNlY3NzKTtcbit9XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuK1x0X191NjQgX19vcGFxdWVbMl07XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXG4rICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrXG4rICpcbisgKiBFYWNoIHlpZWxkZWQgYmxrZyBob2xkcyBvbmUgYmxvY2sgZGV2aWNlJ3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGFcbisgKiBwZXItZGV2aWNlIGxpbmUgb2YgdGhlIGlvLnN0YXQgZmlsZS4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZCwgYXMgdGhlIGZpbGVcbisgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2tcbisgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yXG4rICogaXQuIE11c3QgYmUgdXNlZCBpbnNpZGUgYW4gUkNVIHJlYWQgc2VjdGlvbi5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbitcbitcdGtpdC1cdTAwM2VibGtjZyA9IGJsa2NnO1xuK1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcbisgKiBAaXQ6IGl0ZXJhdG9yXG4rICpcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcbitcbitcdC8qIENsZWFyZWQgb25jZSB0aGUgd2FsayBpcyBkb25lLCBzZWUgYmVsb3cuICovXG4rXHRpZiAoIWtpdC1cdTAwM2VibGtjZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRpZiAoIWJsa2cpXG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbitcdGVsc2VcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcbitcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cbitcdHdoaWxlIChub2RlKSB7XG4rXHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuK1x0XHRpZiAoYmxrZy1cdTAwM2VvbmxpbmUpIHtcbitcdFx0XHRraXQtXHUwMDNlcG9zID0gYmxrZztcbitcdFx0XHRyZXR1cm4gYmxrZztcbitcdFx0fVxuK1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIEZvcmdldCB0aGUgbGlzdCBoZWFkIGFzIHdlbGwuIFRoZSB2ZXJpZmllciBhc3N1bWVzIHRoYXQgYW4gaXRlcmF0b3JcbitcdCAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGVcbitcdCAqIGxvb3AgZm9yIHRlcm1pbmF0aW9uIG9uY2UgaXQgaGFzOyBzdGFydGluZyB0aGUgd2FsayBvdmVyIHdvdWxkIGxldFxuK1x0ICogc3VjaCBhIGxvb3Agc3BpbiBmb3JldmVyLlxuK1x0ICovXG4rXHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbitcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxuKyAqIEBpdDogaXRlcmF0b3JcbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK31cbitcbisvKlxuKyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJ3MgZmx1c2hlZCBpby5zdGF0IGFnZ3JlZ2F0ZS4gQGNvdW50ZXJzIGlzIG9uZVxuKyAqIG9mIHRoZSB0d28gYXJyYXlzIGluIGJsa2ctXHUwMDNlaW9zdGF0LmN1cjsgYm90aCBhcmUgZ3VhcmRlZCBieSB0aGF0IHN0cnVjdCdzXG4rICogc2VxbG9jaywgdGhlIG9uZSB0aGUgaW8uc3RhdCBmaWxlIHVzZXMuIFJldHVybnMgKHU2NCktMSBpZiB0aGUgY291bnRlclxuKyAqIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK3N0YXRpYyB1NjQgYmxrZ19pb3N0YXRfcmVhZChzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csIGNvbnN0IHU2NCAqY291bnRlcnMsXG4rXHRcdFx0ICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcbit7XG4rXHRzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0ICpiaXMgPSBcdTAwMjZibGtnLVx1MDAzZWlvc3RhdDtcbitcdHVuc2lnbmVkIGludCBzZXE7XG4rXHR1NjQgdmFsO1xuK1xuK1x0aWYgKCh1bnNpZ25lZCBpbnQpcncgXHUwMDNlPSBCTEtHX0lPU1RBVF9OUilcbitcdFx0cmV0dXJuICh1NjQpLTE7XG4rXG4rXHQvKlxuK1x0ICogT24gMzItYml0IHRoZSBsb29wIGJlbG93IHJlYWxseSBpcyBhIHNlcWNvdW50IHJldHJ5IGxvb3AuIEV2ZXJ5XG4rXHQgKiB3cml0ZXIgb2YgYmxrZy1cdTAwM2Vpb3N0YXQga2VlcHMgaW50ZXJydXB0cyBvZmYsIHNvIG9ubHkgYW4gTk1JIGNhbiBsYW5kXG4rXHQgKiBpbnNpZGUgYW4gdXBkYXRlLCBhbmQgdGhlbiB0aGUgbG9vcCB3b3VsZCBuZXZlciBlbmQuIFRoZXNlIGtmdW5jc1xuK1x0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXG4rXHQgKiBnaXZlIHVwIHJhdGhlciB0aGFuIHNwaW4uIE9uIDY0LWJpdCB0aGUgbG9vcCBjb21waWxlcyBhd2F5LlxuK1x0ICovXG4rXHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcdTAwMjZcdTAwMjYgaW5fbm1pKCkpXG4rXHRcdHJldHVybiAodTY0KS0xO1xuK1xuK1x0ZG8ge1xuK1x0XHRzZXEgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW4oXHUwMDI2YmlzLVx1MDAzZXN5bmMpO1xuK1x0XHR2YWwgPSBjb3VudGVyc1tyd107XG4rXHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXHUwMDI2YmlzLVx1MDAzZXN5bmMsIHNlcSkpO1xuK1xuK1x0cmV0dXJuIHZhbDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgYnl0ZSBjb3VudGVyXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmVhZHMgdGhlIGZsdXNoZWQgYWdncmVnYXRlLCBzbyBjYWxsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpIGZpcnN0IGZvclxuKyAqIHVwLXRvLWRhdGUgdmFsdWVzLiBUaGUgcmVhZCB1c2VzIHRoZSB1NjRfc3RhdHMgc2VxbG9jaywgbGlrZSB0aGUgaW8uc3RhdFxuKyAqIGZpbGUuXG4rICpcbisgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoc3RydWN0IGJsa2NnX2dxICpibGtnLFxuK1x0XHRcdFx0ICAgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuK3tcbitcdHJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgSS9PIGNvdW50XG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIEkvT3MsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfaW9zKHN0cnVjdCBibGtjZ19ncSAqYmxrZyxcbitcdFx0XHRcdCAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpXG4re1xuK1x0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmlvcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19kZXYgLSBSZXR1cm4gYSBibGtnJ3MgZGV2aWNlIGlkXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwXG4rICpcbisgKiBSZXR1cm46IHRoZSBkZXZpY2UncyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2dcbisgKiBoYXMgbm8gZGlzay5cbisgKi9cbitfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZylcbit7XG4rXHRpZiAoIWJsa2ctXHUwMDNlcSB8fCAhYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2spXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIGJsa2ctXHUwMDNlcS1cdTAwM2VkaXNrLVx1MDAzZXBhcnQwLVx1MDAzZWJkX2Rldjtcbit9XG4rXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbitcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wdXRfYmxrY2csIEtGX1JFTEVBU0UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuK1xuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbitcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfZGV2LCBLRl9SQ1UpXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHtcbitcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbitcdGlmIChlcnIpXG4rXHRcdHByX3dhcm4oXCJlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwiLCBlcnIpO1xuK1xuK1x0cmV0dXJuIGVycjtcbit9XG4rbGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5AQCAtMCwwICsxLDE3IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbisjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuK1xuK3N0cnVjdCBpb19xdWVyeSB7XG4rXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xuK1x0X191NjQgcmJ5dGVzO1xuK1x0X191NjQgd2J5dGVzO1xuK1x0X191NjQgcmlvcztcbitcdF9fdTY0IHdpb3M7XG4rXHRfX3U2NCBkYnl0ZXM7XG4rXHRfX3U2NCBkaW9zO1xuK1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4rfTtcbitcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICsxLDQgQEBcbitDT05GSUdfQkxLX0NHUk9VUD15XG4gQ09ORklHX0JMS19ERVZfTE9PUD15XG4gQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXlcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzJjZGE4MjQzMzE4M1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSwzMTAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rc3RhdGljIGludCByZWFkX3N0YXRzKHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRpbnQgZmQsIHJldCA9IDA7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuK1x0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcInJlYWQgZmRcIikpXG4rXHRcdHJldCA9IDE7XG4rXG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcbisgKiBkZXZpY2UgdG8gZ2VuZXJhdGUgY2dyb3VwLWNoYXJnZWQgSS9PIGFnYWluc3QuIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMVxuKyAqIGlmIGxvb3AgZGV2aWNlcyBhcmUgdW5hdmFpbGFibGUgKG5vbi1yb290IC8gbm8gQ09ORklHX0JMS19ERVZfTE9PUCkgc28gdGhlXG4rICogY2FsbGVyIGNhbiBza2lwLlxuKyAqL1xuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcbitcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuK3tcbitcdGNoYXIgYmFja19wYXRoW10gPSBcIi90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCI7XG4rXHRpbnQgbnI7XG4rXG4rXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuK1xuK1x0KmN0bF9mZCA9IG9wZW4oXCIvZGV2L2xvb3AtY29udHJvbFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuK1x0aWYgKG5yIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwiL2Rldi9sb29wJWRcIiwgbnIpO1xuK1xuK1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0dW5saW5rKGJhY2tfcGF0aCk7XG4rXHRpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdCpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdHJldHVybiAwO1xuK2VycjpcbitcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpsb29wX2ZkKTtcbitcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpiYWNrX2ZkKTtcbitcdGNsb3NlKCpjdGxfZmQpO1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuK1x0XHRcdCAgaW50IGJhY2tfZmQpXG4re1xuK1x0aW50IG5yID0gLTE7XG4rXG4rXHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuK1x0XHRjbG9zZShsb29wX2ZkKTtcbitcdH1cbitcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoYmFja19mZCk7XG4rXHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuK1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCIvZGV2L2xvb3AlZFwiLCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuK1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4rXHRcdGNsb3NlKGN0bF9mZCk7XG4rXHR9XG4rfVxuK1xuKy8qIE9fRElSRUNUIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuK3N0YXRpYyBpbnQgZG9fZGlyZWN0X2lvKGNvbnN0IGNoYXIgKmxvb3BfcGF0aClcbit7XG4rXHR2b2lkICpidWY7XG4rXHRpbnQgZmQsIHJldCA9IC0xO1xuK1xuK1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbitcdFx0Z290byBvdXRfZmQ7XG4rXHRtZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTtcbitcbitcdGlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcbitcdFx0Z290byBvdXRfYnVmO1xuK1x0ZnN5bmMoZmQpO1xuK1x0aWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4rXHRcdGdvdG8gb3V0X2J1ZjtcbitcdHJldCA9IDA7XG4rb3V0X2J1ZjpcbitcdGZyZWUoYnVmKTtcbitvdXRfZmQ6XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJ3MgaW8uc3RhdCBmaWxlIGFuZFxuKyAqIGZpbGwgQG91dC4gQGRldiBpcyBhIGtlcm5lbCBkZXZfdCAoYXMgcmV0dXJuZWQgYnkgYnBmX2Jsa2dfZGV2KSwgd2hvc2VcbisgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlXG4rICogZGV2aWNlJ3MgbGluZSB3YXMgZm91bmQuXG4rICovXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuK1x0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcbitcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFwiaW8uc3RhdFwiLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4rXHRjbG9zZShmZCk7XG4rXHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdHJldHVybiAtMTtcbitcdGJ1ZltuXSA9ICdcXDAnO1xuK1xuK1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcIlxcblwiLCBcdTAwMjZzYXZlcHRyKTsgbGluZTtcbitcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuK1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBcIm1hajptaW5cIiB0b2tlbiBpcyBhbHdheXMgcHJlc2VudDsgdGhlIGZpZWxkIGJsb2NrIGlzXG4rXHRcdCAqIG9wdGlvbmFsICh0aGUga2VybmVsIG9taXRzIGl0IGZvciBhIGRldmljZSB3aXRoIG5vIHJlYWQvd3JpdGVcbitcdFx0ICogSS9PKSwgc28gYSBtYXRjaCBvZiBcdTAwM2U9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC5cbitcdFx0ICovXG4rXHRcdGlmIChzc2NhbmYobGluZSxcbitcdFx0XHQgICBcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCIsXG4rXHRcdFx0ICAgXHUwMDI2bWFqLCBcdTAwMjZtaW4sIFx1MDAyNnJiLCBcdTAwMjZ3YiwgXHUwMDI2cmksIFx1MDAyNndpLCBcdTAwMjZkYiwgXHUwMDI2ZGkpIFx1MDAzYyAyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gd2I7XG4rXHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBkYjtcbitcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbitcdFx0cmV0ID0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbit7XG4rXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XCI7XG4rXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuK1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4rXHRjaGFyIGxvb3BfcGF0aFs2NF07XG4rXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4rXHRpbnQgY2dyb3VwX2ZkO1xuK1xuK1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4rXHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4rXHR9XG4rXG4rXHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG9vcDtcbitcbitcdC8qXG4rXHQgKiBQaW4gdGhlIHJlYWQgdG8gdGhlIGxvb3AgZGV2aWNlIHNvIHRoZSBtZWFzdXJlZCBkZXZpY2UgaXMgc3RhYmxlIGFuZFxuK1x0ICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90XG4rXHQgKiBlbmNvZGluZyAobWFqb3IgXHUwMDNjXHUwMDNjIDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuXG4rXHQgKi9cbitcdHtcbitcdFx0c3RydWN0IHN0YXQgbHN0O1xuK1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcdTAwMjZsc3QpLCBcImZzdGF0IGxvb3BcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4rXHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2V0YXJnZXRfZGV2ID1cbitcdFx0XHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcdTAwM2NcdTAwM2MgMjApIHwgbWlub3IobHN0LnN0X3JkZXYpO1xuK1x0fVxuK1xuK1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4rXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XG4rXHRcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxuK1x0XHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcbitcdH07XG4rXHRvcHRzLmxpbmtfaW5mbyA9IFx1MDAyNmxpbmZvO1xuK1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbitcbitcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfaW9fcXVlcnksIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwiYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfc2tlbDtcbitcbitcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXG4rXHRpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgXCJkb19kaXJlY3RfaW9cIikpXG4rXHRcdGdvdG8gY2xlYW51cF9saW5rO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbGluaztcbitcbitcdC8qXG4rXHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxuK1x0ICogcGF0dGVybiBpbiBjZ3JvdXBfaXRlcl9tZW1jZy5cbitcdCAqL1xuK1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXCIpKSB7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCJ3Ynl0ZXNcIik7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwid2lvc1wiKTtcbitcdH1cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmJ5dGVzLCAwLCBcInJieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmlvcywgMCwgXCJyaW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fZGV2XCIpKVxuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwiZGV2XCIpO1xuK1xuK1x0LypcbitcdCAqIFN0cm9uZ2VyIGNoZWNrOiB0aGUga2Z1bmMtcmVhZCB2YWx1ZXMgbXVzdCBlcXVhbCB3aGF0IHRoZSBpby5zdGF0XG4rXHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxuK1x0ICogdGhlIGZpbGUgd2l0aCBubyBJL08gaW4gYmV0d2Vlbiwgc28gYm90aCBmbHVzaGVkIHNuYXBzaG90cyBtYXRjaFxuK1x0ICogZXhhY3RseS5cbitcdCAqL1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fbWF0Y2hcIikpIHtcbitcdFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XG4rXG4rXHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgQVNTRVJUX09LKHBhcnNlX2lvX3N0YXQoY2dyb3VwX2ZkLCBxLVx1MDAzZWRldiwgXHUwMDI2ZmlsZXYpLFxuK1x0XHRcdCAgICAgIFwicGFyc2UgaW8uc3RhdFwiKSkge1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJieXRlcywgZmlsZXYucmJ5dGVzLCBcInJieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3Ynl0ZXMsIGZpbGV2LndieXRlcywgXCJ3Ynl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmlvcywgZmlsZXYucmlvcywgXCJyaW9zXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdpb3MsIGZpbGV2Lndpb3MsIFwid2lvc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkYnl0ZXMsIGZpbGV2LmRieXRlcywgXCJkYnl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGlvcywgZmlsZXYuZGlvcywgXCJkaW9zXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWVcbitcdCAqIGZyb20gcnN0YXQsIHRoZXkgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMsIHNvIHRoaXNcbitcdCAqIGNvdmVycyB0aGUgb3RoZXIgaGFsZiBvZiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhleSBjb3ZlciBldmVyeVxuK1x0ICogY2dyb3VwJ3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXG4rXHQgKiB0aGV5IG11c3QgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGUgdGVzdCBjZ3JvdXAgd2FzIGNoYXJnZWQuXG4rXHQgKi9cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3Jvb3RcIikpIHtcbitcdFx0c3RydWN0IGJwZl9saW5rICpyb290X2xpbms7XG4rXHRcdHN0cnVjdCBpb19xdWVyeSAqcjtcbitcbitcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnID0gMDtcbitcdFx0cm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnksXG4rXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcImF0dGFjaCByb290IGl0ZXJcIikpIHtcbitcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCJyZWFkIHJvb3Qgc3RhdHNcIikpIHtcbitcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbitcdFx0XHRcdEFTU0VSVF9FUShza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfYmxrY2csIDEsXG4rXHRcdFx0XHRcdCAgXCJnb3Rfcm9vdF9ibGtjZ1wiKTtcbitcdFx0XHRcdEFTU0VSVF9FUShyLVx1MDAzZWRldiwgcS1cdTAwM2VkZXYsIFwicm9vdCBkZXZcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3Ynl0ZXMsIHEtXHUwMDNld2J5dGVzLCBcInJvb3Qgd2J5dGVzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2lvcywgcS1cdTAwM2V3aW9zLCBcInJvb3Qgd2lvc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJieXRlcywgcS1cdTAwM2VyYnl0ZXMsIFwicm9vdCByYnl0ZXNcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyaW9zLCBxLVx1MDAzZXJpb3MsIFwicm9vdCByaW9zXCIpO1xuK1x0XHRcdH1cbitcdFx0XHRicGZfbGlua19fZGVzdHJveShyb290X2xpbmspO1xuK1x0XHR9XG4rXHR9XG4rXG4rY2xlYW51cF9saW5rOlxuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kobGluayk7XG4rY2xlYW51cF9za2VsOlxuK1x0Y2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7XG4rY2xlYW51cF9sb29wOlxuK1x0bG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7XG4rY2xlYW51cF9jZ3JvdXBfZmQ6XG4rXHRjbG9zZShjZ3JvdXBfZmQpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmI4MzlkZWY5NDUwODZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICsxLDEwNyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLmhcIlxuK1xuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbitcbisvKiBUaGUgY291bnRlcnMgb2YgdGhlIGRldmljZSBuYW1lZCBieSB0YXJnZXRfZGV2IGFyZSBzdG9yZWQgaGVyZS4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rLyogVGhlIHNhbWUgZGV2aWNlJ3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBTZXQgdG8gMSBieSBjZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSB3aGVuIGJwZl9nZXRfcm9vdF9ibGtjZygpIHN1Y2NlZWRzLiAqL1xuK19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIERldmljZSB0byByZWFkLCBzZXQgYnkgdXNlcnNwYWNlIChrZXJuZWwgZGV2X3QpLiBQaW5uaW5nIHRoZSBkZXZpY2Uga2VlcHNcbisgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuXG4rICovXG4rX191NjQgdGFyZ2V0X2RldiBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKlxuKyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSdzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5XG4rICogdGhlIG9uZSBwaW5uZWQgZGV2aWNlIGtlZXBzIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYzogdGhhdCBkZXZpY2UgaXNcbisgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyBcImFueSBkZXZpY2VcbisgKiB3aXRoIEkvT1wiIHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay5cbisgKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csXG4rXHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbitcbitcdC8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovXG4rXHRicGZfYmxrY2dfZmx1c2hfc3RhdHMoYmxrY2cpO1xuK1xuK1x0LyogVGhlIHBlci1kZXZpY2UgYmxrZyB3YWxrIG5lZWRzIGFuIFJDVSBzZWN0aW9uLiAqL1xuK1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbitcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XG4rXHRcdGlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlZGV2ID0gYnBmX2Jsa2dfZGV2KHBvcyk7XG4rXHRcdG91dC1cdTAwM2VyYnl0ZXMgPSBicGZfYmxrZ19pb3N0YXRfYnl0ZXMocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTtcbitcdFx0b3V0LVx1MDAzZXdieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9ESVNDQVJEKTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rfVxuK1xuK1NFQyhcIml0ZXIucy9jZ3JvdXBcIilcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xuK1x0X19idWlsdGluX21lbXNldChcdTAwMjZpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7XG4rXG4rXHRibGtjZyA9IGJwZl9nZXRfYmxrY2coXHUwMDI2Y2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghYmxrY2cpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZpb19xdWVyeSk7XG4rXG4rXHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJpdGVyLnMvY2dyb3VwXCIpXG4raW50IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2cm9vdF9xdWVyeSwgMCwgc2l6ZW9mKHJvb3RfcXVlcnkpKTtcbitcbitcdGJsa2NnID0gYnBmX2dldF9yb290X2Jsa2NnKCk7XG4rXHRpZiAoIWJsa2NnKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdC8qXG4rXHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcbitcdCAqIHRoYW4gZnJvbSByc3RhdCwgc28gdGhpcyBhbHNvIGNvdmVycyB0aGUgcm9vdCBzaWRlIG9mXG4rXHQgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhlIGNvdW50ZXJzIGNvdmVyIGV2ZXJ5IGNncm91cCdzIEkvTywgc29cbitcdCAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QncyBvd24gY2dyb3VwIGRpZC5cbitcdCAqL1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZyb290X3F1ZXJ5KTtcbitcbitcdGdvdF9yb290X2Jsa2NnID0gMTtcbitcdGJwZl9wdXRfYmxrY2coYmxrY2cpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6NDEuNTU4MTQ0ODQ5WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3MjUzMDYyMjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IEJsb2NrIENncm91cCBCUEYgS2Z1bmNzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggc2VyaWVzIHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gVGhlIHBhdGNoIGZvY3VzZXMgb24gaW50cm9kdWNpbmcgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCAoYmxrY2cpIEkvTyBzdGF0aXN0aWNzLCB3aGljaCBpcyBpbnRlcmVzdGluZy5cblxuRmlyc3QsIEkgbmVlZCB0byBldmFsdWF0ZSB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gV2UncmUgYWRkaW5nIGZ1bmN0aW9ucyBsaWtlIGBicGZfZ2V0X3Jvb3RfYmxrY2dgLCBgYnBmX2dldF9ibGtjZ2AsIGBicGZfcHV0X2Jsa2NnYCwgYW5kIG90aGVycywgYWxsIGRlYWxpbmcgd2l0aCByZWFkaW5nIGRhdGEgZnJvbSBleGlzdGluZyBrZXJuZWwgc3RydWN0dXJlcyBsaWtlIGBzdHJ1Y3QgYmxrY2dgLCBgc3RydWN0IGJsa2NnX2dxYCwgYW5kIGBzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0YC4gVGhlIGNyaXRpY2FsIHF1ZXN0aW9uIGlzLCBhcmUgdGhlc2Uga2Z1bmNzIHJldHVybmluZyB1bmluaXRpYWxpemVkIHZhbHVlcyB0byB0aGUgQlBGIHByb2dyYW1zP1xuXG5UaGUga2Z1bmNzIHJldHVybiBlaXRoZXIgYHU2NGAgdmFsdWVzIG9yIHBvaW50ZXJzIHRvIGtlcm5lbCBzdHJ1Y3R1cmVzLiBCUEYgcHJvZ3JhbXMgdGhlbiByZWFkIHRoZXNlIHJldHVybmVkIHZhbHVlcy4gSSBuZWVkIHRvIHBpbnBvaW50IGlmIHRoZXJlIGFyZSBhbnkgaW5zdGFuY2VzIHdoZXJlIHRoZSBrZnVuY3MgYXJlIHB1bGxpbmcgdW5pbml0aWFsaXplZCBmaWVsZHMgYW5kIHBhc3NpbmcgdGhlbSBiYWNrIHRvIEJQRiBwcm9ncmFtcy4gU3BlY2lmaWNhbGx5LCBJJ20gbG9va2luZyBhdCBgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzYCBhbmQgYGJwZl9ibGtnX2lvc3RhdF9pb3NgLCB3aGljaCByZWFkIGZyb20gYGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlc2AgYW5kIGBibGtnLVx1MDAzZWlvc3RhdC5jdXIuaW9zYCwgYm90aCBhcnJheXMgb2YgYHU2NGAuIEFsc28sIGBicGZfYmxrZ19kZXZgIHRoYXQgcmV0dXJucyBgYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2stXHUwMDNlcGFydDAtXHUwMDNlYmRfZGV2YCB3aGljaCBpcyBhIGBkZXZfdGAg4oCTIGVpdGhlciBgdTMyYCBvciBgdTY0YC5cblxuVGhlIHBhdGNoIGFsc28gaGFzIGEgc2VsZnRlc3QsIHNvIEknbGwgY2hlY2sgdGhhdC5cblxuTm93LCBsZXQncyBkaWcgaW50byBgYnBmX2l0ZXJfYmxrZ19uZXdgIGFuZCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gU3RhbmRhcmQgQlBGIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uLiBUaGUgdmVyaWZpZXIgaW4gQlBGIGVuc3VyZXMgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIGBicGZfaXRlcl9ibGtnX25ld2AuIEl0IGluaXRpYWxpemVzIGBraXQtXHUwMDNlYmxrY2dgIGFuZCBga2l0LVx1MDAzZXBvc2AuIE5vIGlzc3VlcyBoZXJlIGFzIHRoZSBpdGVyYXRvciBzdGF0ZSBpcyBtYW5hZ2VkIGJ5IHRoZSBCUEYgaW5mcmFzdHJ1Y3R1cmUuXG5cbk9rYXksIG5leHQgY29uY2VybjogYXJlIHRoZXJlIGFueSBpbnN0YW5jZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgY29waWVkIHRvIHVzZXIgc3BhY2U/IEJQRiBwcm9ncmFtcyByZWFkIGNvdW50ZXJzIGFuZCBzdG9yZSB0aGVtIGluIGdsb2JhbCB2YXJpYWJsZXMgKGBpb19xdWVyeWAsIGByb290X3F1ZXJ5YCksIHdoaWNoIGFyZSB0aGVuIGFjY2Vzc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIHRoZSBCUEYgc2tlbGV0b24uIFRoZXNlIGNvdW50ZXJzIGFyZSBleHRyYWN0ZWQgZnJvbSBgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmJ5dGVzYCBhbmQgYGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5pb3NgLCBidXQgdGhlc2UgYXJlIHVwZGF0ZWQgYnkgdGhlIGJsb2NrIGxheWVyLCBhbmQgc2hvdWxkIGJlIGZ1bGx5IGluaXRpYWxpemVkLlxuXG5UaGVuLCBhcmUgdGhlcmUgYW55IGRpcmVjdCB0cmFuc21pc3Npb25zIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2U/IE5vLCB0aGlzIHBhdGNoIG9ubHkgZXhwb3NlcyBCUEYga2Z1bmNzLCB3aGljaCBhcmUgdGhlbiBjYWxsZWQgYnkgQlBGIHByb2dyYW1zLiBUaGVzZSBrZnVuY3MgcmV0dXJuIGB1NjRgIG9yIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gYGNvcHlfdG9fdXNlcmAgY2FsbHMsIGFuZCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIGFuZCBzZW50IGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UuIFRoZSBpdGVyYXRvciBzdGF0ZSBpcyBhIDE2LWJ5dGUgc3RydWN0dXJlLCB3aGljaCBpcyBmdWxseSBpbml0aWFsaXplZCBkdXJpbmcgYGJwZl9pdGVyX2Jsa2dfbmV3YC5cblxuRnVydGhlcm1vcmUsIEkgaGF2ZSB0byBjb25zaWRlciBjb25kaXRpb25hbCBsb2dpYyB0aGF0IG1pZ2h0IGRlcGVuZCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gVGhpcyBpcyBub3QgdGhlIGNhc2UgYmVjYXVzZSB0aGUgdmFyaWFibGVzIGFyZSBlaXRoZXIgcG9pbnRlcnMgZnJvbSB0aGUgQlBGIGNvbnRleHQgb3IgcmVhZCBmcm9tIGV4aXN0aW5nIGluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzLlxuXG5UaGVyZWZvcmUsIHRoZSBsaWtlbGlob29kIG9mIHRoaXMgcGF0Y2ggaW50cm9kdWNpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgaXMgZXh0cmVtZWx5IGxvdy4gS0FTQU4gYW5kIHN0YW5kYXJkIHRvb2xzIHNob3VsZCBzdWZmaWNlIHRvIGRldGVjdCBhbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBzdGVtbWluZyBmcm9tIGluY29ycmVjdCBgY3NzX3RyeWdldGAgb3IgUkNVIHVzYWdlLCBpZiBhbnkuIEkgc3RpbGwgd2FudCB0byBkb3VibGUgY2hlY2sgYGJsa2dfaW9zdGF0X3JlYWRgIHRob3VnaDpcblxuTG9va2luZyBhdCB0aGUgY29kZSwgaXQncyBqdXN0IHJlYWRpbmcgYHU2NGAgdmFsdWVzIGZyb20gYGNvdW50ZXJzW3J3XWAuIFRoZSBib3VuZHMgYXJlIGNoZWNrZWQgYWdhaW5zdCBgQkxLR19JT1NUQVRfTlJgLCBzbyBpdCdzIHNhZmUuXG5cbk15IGNvbmNsdXNpb24/ICoqTmVlZHNLTVNBTiA9IGZhbHNlLioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIGJ1dCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nIHRoYXQgY3JlYXRlcyBhIHN0cm9uZyBuZWVkIGZvciBLTVNBTi4gVGhlcmUncyBubyBjcmVhdGlvbiBvZiBuZXcgY29tcGxleCBzdHJ1Y3R1cmVzLCBubyBkaXJlY3QgZGF0YSBjb3B5IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBsb2dpYyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gU3RhbmRhcmQgbWVtb3J5IHNhZmV0eSB0b29scyBzdWNoIGFzIEtBU0FOIGFyZSBlbm91Z2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNDkxLCJPdXRwdXRUb2tlbnMiOjE2OSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNjQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzo1OC44MTEyMDk4ODlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-07 20:46:15 +0000 UTC FinishedAt: 2026-08-07 21:03:59 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "5cbef379a94b161726c5f504598bf4791d45cedc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BLK_CGROUP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "5cbef379a94b161726c5f504598bf4791d45cedc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BLK_CGROUP" ], "series_id": "ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "fs" ], "focus_symbols": [ "bpf_get_root_blkcg", "bpf_get_blkcg", "bpf_put_blkcg", "bpf_blkcg_flush_stats", "bpf_iter_blkg_new", "bpf_iter_blkg_next", "bpf_iter_blkg_destroy", "bpf_blkg_iostat_bytes", "bpf_blkg_iostat_ios", "bpf_blkg_dev", "blkcg_fill_root_iostats" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfZ2V0X3Jvb3RfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX2dldF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfcHV0X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2lvc3RhdF9ieXRlcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfaW9zJiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2RldiYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBUaGVzZSBrZnVuY3MgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBoYW5kbGUgdmFyaW91cyBpbnB1dHMgYW5kIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBzYWZlbHkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyY2ExOWE4YTI0ODg3Mjg4OGRlMWE1YmU3ZDY3ODM4YTJmMmE0MjE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTXG5AQCAtNjYxNyw2ICYjNDM7NjYxNyw3IEBAIEY6XHRibG9jay9ibGstY2dyb3VwLmNcbiBGOlx0YmxvY2svYmxrLWlvY29zdC5jXG4gRjpcdGJsb2NrL2Jsay1pb2xhdGVuY3kuY1xuIEY6XHRibG9jay9ibGstdGhyb3R0bGUuY1xuJiM0MztGOlx0YmxvY2svYnBmX2Jsa2NnLmNcbiBGOlx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcbiBcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTE3LDYgJiM0MzsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSAmIzQzOz0gZXJyb3ItaW5qZWN0aW9uLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dfQ09NTU9OKSAmIzQzOz0gYnNnLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXHQmIzQzOz0gYnNnLWxpYi5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQmIzQzOz0gYmxrLWNncm91cC5vXG4mIzQzO2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuJiM0MztvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCYjNDM7PSBicGZfYmxrY2cub1xuJiM0MztlbmRpZlxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcdCYjNDM7PSBibGstY2dyb3VwLXJ3c3RhdC5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICYjNDM7PSBibGstY2dyb3VwLWZjLWFwcGlkLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HKVx0JiM0Mzs9IGJsay10aHJvdHRsZS5vXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmNcbkBAIC0xMDg2LDcgJiM0MzsxMDg2LDcgQEAgc3RhdGljIHZvaWQgYmxrY2dfcnN0YXRfZmx1c2goc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcywgaW50IGNwdSlcbiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAmIzM5O3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXRcbiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuJiM0Mzt2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4ge1xuIFx0c3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmhcbkBAIC0yMDUsNiAmIzQzOzIwNSw3IEBAIHZvaWQgYmxrY2dfZGVhY3RpdmF0ZV9wb2xpY3koc3RydWN0IGdlbmRpc2sgKmRpc2ssXG4gXHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpO1xuIFxuIGNvbnN0IGNoYXIgKmJsa2dfZGV2X25hbWUoc3RydWN0IGJsa2NnX2dxICpibGtnKTtcbiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTtcbiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csXG4gXHRcdCAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLFxuIFx0XHRcdFx0ICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40OGE4NmYwN2UxOThhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9icGZfYmxrY2cuY1xuQEAgLTAsMCAmIzQzOzEsMzE1IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4mIzQzOy8qXG4mIzQzOyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZXNlIGxldCBhIEJQRiBwcm9ncmFtIHJlYWQgYSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcbiYjNDM7ICogY2dyb3VwJiMzOTtzIGNzcyBpbnRvIGEgc3RydWN0IGJsa2NnIHdpdGggYnBmX2dldF9ibGtjZygpLCBmbHVzaGVzIHRoZSBzdGF0cyB3aXRoXG4mIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtncyB3aXRoIHRoZVxuJiM0MzsgKiBicGZfaXRlcl9ibGtnIG9wZW4tY29kZWQgaXRlcmF0b3IsIHJlYWRpbmcgZWFjaCBkZXZpY2UmIzM5O3MgY291bnRlcnMgd2l0aFxuJiM0MzsgKiBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoKS9icGZfYmxrZ19pb3N0YXRfaW9zKCkuIEl0IG1pcnJvcnMgdGhlIG1lbW9yeVxuJiM0MzsgKiBjb250cm9sbGVyIGtmdW5jcyBpbiBtbS9icGZfbWVtY29udHJvbC5jLCBidXQgYWRkcyBhIHBlci1kZXZpY2UgZGltZW5zaW9uOlxuJiM0MzsgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBmaWxlIGxpdmVzIGluIGJsb2NrLyBiZWNhdXNlIHRoZSBibGtjZy9ibGtnIHN0cnVjdCBsYXlvdXRzIGFyZSBwcml2YXRlXG4mIzQzOyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibGstY2dyb3VwLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBmdW5jdGlvbiBoYXMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MsIGV2ZW4gdGhvdWdoIHRoZSByb290IGJsb2NrIGNncm91cCBpc1xuJiM0MzsgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJiMzOTt0IHJlcXVpcmUgcmVmZXJlbmNlIGNvdW50aW5nLiBJdCYjMzk7cyBzYWZlIHRvIHBhc3MgaXRcbiYjNDM7ICogdG8gYnBmX3B1dF9ibGtjZygpLlxuJiM0MzsgKlxuJiM0MzsgKiBOb3RlIHRoYXQgdGhlIHJvb3QgY2dyb3VwIGlzIHNwZWNpYWw6IGl0cyBjb3VudGVycyBhcmUgdGhlIGRpc2tzJiMzOTsgb3duXG4mIzQzOyAqIHN0YXRpc3RpY3MsIHNvIHRoZXkgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTyByYXRoZXIgdGhhbiBvbmx5IHRoZSByb290JiMzOTtzLlxuJiM0MzsgKiBUaGlzIG1hdGNoZXMgd2hhdCB0aGUgcm9vdCBpby5zdGF0IGZpbGUgcHJpbnRzLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfcm9vdF9ibGtjZyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cbiYjNDM7XHRyZXR1cm4gXHUwMDI2YmxrY2dfcm9vdDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXBcbiYjNDM7ICogQGNzczogcG9pbnRlciB0byB0aGUgY3NzIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBJdCYjMzk7cyBmaW5lIHRvIHBhc3MgYSBjc3Mgd2hpY2ggYmVsb25ncyB0byBhbnkgY2dyb3VwIGNvbnRyb2xsZXIsXG4mIzQzOyAqIGUuZy4gdW5pZmllZCBoaWVyYXJjaHkmIzM5O3MgbWFpbiBjc3MuXG4mIzQzOyAqXG4mIzQzOyAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgYmxrY2cgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3NzJiMzOTtzXG4mIzQzOyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfYmxrY2coc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibGtjZyAqYmxrY2cgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRpZiAoY3NzLVx1MDAzZXNzID09IFx1MDAyNmlvX2NncnBfc3Vic3lzKVxuJiM0MztcdFx0cmV0dXJuIGNzc190cnlnZXQoY3NzKSA/IGNzc190b19ibGtjZyhjc3MpIDogTlVMTDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTb21lIG90aGVyIGNvbnRyb2xsZXImIzM5O3MgY3NzLCBvciB0aGUgY2dyb3VwJiMzOTtzIG93biBvbmUuIExvb2sgdXAgdGhlIGlvXG4mIzQzO1x0ICogY29udHJvbGxlciYjMzk7cyBjc3M7IHJjdSBrZWVwcyBpdCBhbGl2ZSBiZXR3ZWVuIHRoZSBsb2FkIGFuZCB0aGUgdHJ5Z2V0LlxuJiM0MztcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLyYjMzk7cyBsb2NrXG4mIzQzO1x0ICogY29udGV4dCBhbmFseXNpcyBjYW4gZm9sbG93IGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNzcy1cdTAwM2VjZ3JvdXAtXHUwMDNlc3Vic3lzW2lvX2NncnBfaWRdKTtcbiYjNDM7XHRpZiAoY3NzIFx1MDAyNlx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXG4mIzQzO1x0XHRibGtjZyA9IGNzc190b19ibGtjZyhjc3MpO1xuJiM0MztcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYmxrY2c7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHV0X2Jsa2NnIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgYmxvY2sgY2dyb3VwXG4mIzQzOyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcbiYjNDM7ICpcbiYjNDM7ICogUmVsZWFzZXMgYSBwcmV2aW91c2x5IGFjcXVpcmVkIGJsa2NnIHJlZmVyZW5jZS5cbiYjNDM7ICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX3B1dF9ibGtjZyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKVxuJiM0Mzt7XG4mIzQzO1x0Y3NzX3B1dChcdTAwMjZibGtjZy1cdTAwM2Vjc3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljc1xuJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cFxuJiM0MzsgKlxuJiM0MzsgKiBDYWxsIHRoaXMgYmVmb3JlIHJlYWRpbmcgY291bnRlcnMgZm9yIHVwLXRvLWRhdGUgdmFsdWVzLiBTbGVlcGFibGUuXG4mIzQzOyAqXG4mIzQzOyAqIEl0IGRvZXMgd2hhdCByZWFkaW5nIHRoZSBpby5zdGF0IGZpbGUgZG9lcywgd2hpY2ggZGlmZmVycyBieSBjZ3JvdXAuIEZvciBhXG4mIzQzOyAqIG5vbi1yb290IGNncm91cCBpdCBmb2xkcyB0aGUgcGVyLWNwdSBkZWx0YXMgaW50byB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzXG4mIzQzOyAqIGFuZCB1cCB0aGUgY2dyb3VwIHRyZWUuIFRoZSByb290IGNncm91cCBpcyBub3QgYWNjb3VudGVkIHRocm91Z2ggcnN0YXQgYXRcbiYjNDM7ICogYWxsLCBzbyBmb3IgaXQgdGhlIHBlci1kZXZpY2UgYWdncmVnYXRlcyBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MmIzM5O1xuJiM0MzsgKiBvd24gc3RhdGlzdGljcywgd2hpY2ggY291bnQgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHJvb3QgYnJhbmNoIGlzIG5vdCBzZWxmLWxpbWl0aW5nIHRoZSB3YXkgdGhlIHJzdGF0IG9uZSBpczogaXQgcmVyZWFkc1xuJiM0MzsgKiBldmVyeSBkaXNrIG9uIGV2ZXJ5IGNhbGwsIHdoaWxlIGEgc2Vjb25kIHJzdGF0IGZsdXNoIGZpbmRzIG5vdGhpbmcgbGVmdCB0b1xuJiM0MzsgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXG4mIzQzOyAqIG9uY2UgcmF0aGVyIHRoYW4gb25jZSBwZXIgY2dyb3VwIG9mIGEgd2Fsay5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXG4mIzQzO3tcbiYjNDM7XHRpZiAoIWJsa2NnLVx1MDAzZWNzcy5wYXJlbnQpXG4mIzQzO1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGNzc19yc3RhdF9mbHVzaChcdTAwMjZibGtjZy1cdTAwM2Vjc3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XG4mIzQzO1x0X191NjQgX19vcGFxdWVbMl07XG4mIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4mIzQzO1x0c3RydWN0IGJsa2NnICpibGtjZztcbiYjNDM7XHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtnc1xuJiM0MzsgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemVcbiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrXG4mIzQzOyAqXG4mIzQzOyAqIEVhY2ggeWllbGRlZCBibGtnIGhvbGRzIG9uZSBibG9jayBkZXZpY2UmIzM5O3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGFcbiYjNDM7ICogcGVyLWRldmljZSBsaW5lIG9mIHRoZSBpby5zdGF0IGZpbGUuIE9mZmxpbmUgYmxrZ3MgYXJlIHNraXBwZWQsIGFzIHRoZSBmaWxlXG4mIzQzOyAqIHNraXBzIHRoZW0uIE9uZSBjYXNlIGRpZmZlcnM6IHRoZSBmaWxlIHByaW50cyBubyBsaW5lIGZvciBhIGJsa2cgd2hvc2UgZGlza1xuJiM0MzsgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yXG4mIzQzOyAqIGl0LiBNdXN0IGJlIHVzZWQgaW5zaWRlIGFuIFJDVSByZWFkIHNlY3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCwgc3RydWN0IGJsa2NnICpibGtjZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuJiM0MztcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPVxuJiM0MztcdFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuJiM0MztcbiYjNDM7XHRraXQtXHUwMDNlYmxrY2cgPSBibGtjZztcbiYjNDM7XHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXG4mIzQzOyAqIEBpdDogaXRlcmF0b3JcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XG4mIzQzO1xuJiM0MztcdC8qIENsZWFyZWQgb25jZSB0aGUgd2FsayBpcyBkb25lLCBzZWUgYmVsb3cuICovXG4mIzQzO1x0aWYgKCFraXQtXHUwMDNlYmxrY2cpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFibGtnKVxuJiM0MztcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoXHUwMDI2a2l0LVx1MDAzZWJsa2NnLVx1MDAzZWJsa2dfbGlzdCkpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4mIzQzO1xuJiM0MztcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cbiYjNDM7XHR3aGlsZSAobm9kZSkge1xuJiM0MztcdFx0YmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7XG4mIzQzO1x0XHRpZiAoYmxrZy1cdTAwM2VvbmxpbmUpIHtcbiYjNDM7XHRcdFx0a2l0LVx1MDAzZXBvcyA9IGJsa2c7XG4mIzQzO1x0XHRcdHJldHVybiBibGtnO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yZ2V0IHRoZSBsaXN0IGhlYWQgYXMgd2VsbC4gVGhlIHZlcmlmaWVyIGFzc3VtZXMgdGhhdCBhbiBpdGVyYXRvclxuJiM0MztcdCAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGVcbiYjNDM7XHQgKiBsb29wIGZvciB0ZXJtaW5hdGlvbiBvbmNlIGl0IGhhczsgc3RhcnRpbmcgdGhlIHdhbGsgb3ZlciB3b3VsZCBsZXRcbiYjNDM7XHQgKiBzdWNoIGEgbG9vcCBzcGluIGZvcmV2ZXIuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4mIzQzO1x0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSAtIFRlYXIgZG93biBhIGJsa2cgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBpdGVyYXRvclxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJiMzOTtzIGZsdXNoZWQgaW8uc3RhdCBhZ2dyZWdhdGUuIEBjb3VudGVycyBpcyBvbmVcbiYjNDM7ICogb2YgdGhlIHR3byBhcnJheXMgaW4gYmxrZy1cdTAwM2Vpb3N0YXQuY3VyOyBib3RoIGFyZSBndWFyZGVkIGJ5IHRoYXQgc3RydWN0JiMzOTtzXG4mIzQzOyAqIHNlcWxvY2ssIHRoZSBvbmUgdGhlIGlvLnN0YXQgZmlsZSB1c2VzLiBSZXR1cm5zICh1NjQpLTEgaWYgdGhlIGNvdW50ZXJcbiYjNDM7ICogY2Fubm90IGJlIHJlYWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdTY0IGJsa2dfaW9zdGF0X3JlYWQoc3RydWN0IGJsa2NnX2dxICpibGtnLCBjb25zdCB1NjQgKmNvdW50ZXJzLFxuJiM0MztcdFx0XHQgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJsa2dfaW9zdGF0X3NldCAqYmlzID0gXHUwMDI2YmxrZy1cdTAwM2Vpb3N0YXQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlcTtcbiYjNDM7XHR1NjQgdmFsO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVuc2lnbmVkIGludClydyBcdTAwM2U9IEJMS0dfSU9TVEFUX05SKVxuJiM0MztcdFx0cmV0dXJuICh1NjQpLTE7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogT24gMzItYml0IHRoZSBsb29wIGJlbG93IHJlYWxseSBpcyBhIHNlcWNvdW50IHJldHJ5IGxvb3AuIEV2ZXJ5XG4mIzQzO1x0ICogd3JpdGVyIG9mIGJsa2ctXHUwMDNlaW9zdGF0IGtlZXBzIGludGVycnVwdHMgb2ZmLCBzbyBvbmx5IGFuIE5NSSBjYW4gbGFuZFxuJiM0MztcdCAqIGluc2lkZSBhbiB1cGRhdGUsIGFuZCB0aGVuIHRoZSBsb29wIHdvdWxkIG5ldmVyIGVuZC4gVGhlc2Uga2Z1bmNzXG4mIzQzO1x0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXG4mIzQzO1x0ICogZ2l2ZSB1cCByYXRoZXIgdGhhbiBzcGluLiBPbiA2NC1iaXQgdGhlIGxvb3AgY29tcGlsZXMgYXdheS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcdTAwMjZcdTAwMjYgaW5fbm1pKCkpXG4mIzQzO1x0XHRyZXR1cm4gKHU2NCktMTtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0c2VxID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKFx1MDAyNmJpcy1cdTAwM2VzeW5jKTtcbiYjNDM7XHRcdHZhbCA9IGNvdW50ZXJzW3J3XTtcbiYjNDM7XHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXHUwMDI2YmlzLVx1MDAzZXN5bmMsIHNlcSkpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdmFsO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSYjMzk7cyBpby5zdGF0IGJ5dGUgY291bnRlclxuJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAgKG9uZSBkZXZpY2Ugb2YgYSBibG9jayBjZ3JvdXApXG4mIzQzOyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuJiM0MzsgKlxuJiM0MzsgKiBSZWFkcyB0aGUgZmx1c2hlZCBhZ2dyZWdhdGUsIHNvIGNhbGwgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkgZmlyc3QgZm9yXG4mIzQzOyAqIHVwLXRvLWRhdGUgdmFsdWVzLiBUaGUgcmVhZCB1c2VzIHRoZSB1NjRfc3RhdHMgc2VxbG9jaywgbGlrZSB0aGUgaW8uc3RhdFxuJiM0MzsgKiBmaWxlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoc3RydWN0IGJsa2NnX2dxICpibGtnLFxuJiM0MztcdFx0XHRcdCAgICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlcywgcncpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2lvcyAtIFJlYWQgYSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBJL08gY291bnRcbiYjNDM7ICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuJiM0MzsgKiBAcnc6IHdoaWNoIGNvdW50ZXIgKEJMS0dfSU9TVEFUX1JFQUQgLyBfV1JJVEUgLyBfRElTQ0FSRClcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIEkvT3MsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfaW9zKHN0cnVjdCBibGtjZ19ncSAqYmxrZyxcbiYjNDM7XHRcdFx0XHQgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmlvcywgcncpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2dfZGV2IC0gUmV0dXJuIGEgYmxrZyYjMzk7cyBkZXZpY2UgaWRcbiYjNDM7ICogQGJsa2c6IGJsb2NrIGdyb3VwXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogdGhlIGRldmljZSYjMzk7cyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2dcbiYjNDM7ICogaGFzIG5vIGRpc2suXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZylcbiYjNDM7e1xuJiM0MztcdGlmICghYmxrZy1cdTAwM2VxIHx8ICFibGtnLVx1MDAzZXEtXHUwMDNlZGlzaylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2stXHUwMDNlcGFydDAtXHUwMDNlYmRfZGV2O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuJiM0MztcbiYjNDM7QlRGX0tGVU5DU19TVEFSVChicGZfYmxrY2dfa2Z1bmNzKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2dldF9yb290X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHV0X2Jsa2NnLCBLRl9SRUxFQVNFKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4mIzQzO1xuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXcsIEtGX0lURVJfTkVXIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbiYjNDM7XG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMsIEtGX1JDVSlcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSlcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2RldiwgS0ZfUkNVKVxuJiM0MztCVEZfS0ZVTkNTX0VORChicGZfYmxrY2dfa2Z1bmNzKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9ibGtjZ19rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyXHRcdD0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNmJwZl9ibGtjZ19rZnVuY19zZXQpO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRwcl93YXJuKFwmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBibGtjZyBrZnVuY3M6ICVkXFxuXCYjMzQ7LCBlcnIpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxuQEAgLTAsMCAmIzQzOzEsMTcgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuJiM0MzsjaWZuZGVmIF9fQ0dST1VQX0lURVJfSU9fSFxuJiM0MzsjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuJiM0MztcbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHtcbiYjNDM7XHQvKiBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMgKi9cbiYjNDM7XHRfX3U2NCByYnl0ZXM7XG4mIzQzO1x0X191NjQgd2J5dGVzO1xuJiM0MztcdF9fdTY0IHJpb3M7XG4mIzQzO1x0X191NjQgd2lvcztcbiYjNDM7XHRfX3U2NCBkYnl0ZXM7XG4mIzQzO1x0X191NjQgZGlvcztcbiYjNDM7XHRfX3U2NCBkZXY7XHQvKiBkZXZfdCBvZiB0aGUgZGV2aWNlIHRoZSBjb3VudGVycyBiZWxvbmcgdG8gKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfX0NHUk9VUF9JVEVSX0lPX0ggKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uMjcwZTZiZjkxOTRkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbkBAIC0xLDMgJiM0MzsxLDQgQEBcbiYjNDM7Q09ORklHX0JMS19DR1JPVVA9eVxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxuIENPTkZJR19CT09UUEFSQU1fSEFSRExPQ0tVUF9QQU5JQz15XG4gQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTFcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjMyY2RhODI0MzMxODNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmNcbkBAIC0wLDAgJiM0MzsxLDMxMCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9saWJicGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNtYWNyb3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaGVscGVycy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9pdGVyX2lvLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2l0ZXJfaW8uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNClcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQsIHJldCA9IDA7XG4mIzQzO1x0c3NpemVfdCBieXRlcztcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7YnBmX2l0ZXJfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuJiM0MztcdGJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsIFwmIzM0O3JlYWQgZmRcJiMzNDspKVxuJiM0MztcdFx0cmV0ID0gMTtcbiYjNDM7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcbiYjNDM7ICogZGV2aWNlIHRvIGdlbmVyYXRlIGNncm91cC1jaGFyZ2VkIEkvTyBhZ2FpbnN0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTFcbiYjNDM7ICogaWYgbG9vcCBkZXZpY2VzIGFyZSB1bmF2YWlsYWJsZSAobm9uLXJvb3QgLyBubyBDT05GSUdfQkxLX0RFVl9MT09QKSBzbyB0aGVcbiYjNDM7ICogY2FsbGVyIGNhbiBza2lwLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLFxuJiM0MztcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBiYWNrX3BhdGhbXSA9IFwmIzM0Oy90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCYjMzQ7O1xuJiM0MztcdGludCBucjtcbiYjNDM7XG4mIzQzO1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0KmN0bF9mZCA9IG9wZW4oXCYjMzQ7L2Rldi9sb29wLWNvbnRyb2xcJiMzNDssIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4mIzQzO1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuJiM0MztcdGlmIChuciBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwmIzM0Oy9kZXYvbG9vcCVkXCYjMzQ7LCBucik7XG4mIzQzO1xuJiM0MztcdCpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpO1xuJiM0MztcdGlmICgqYmFja19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcdHVubGluayhiYWNrX3BhdGgpO1xuJiM0MztcdGlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0Kmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XHRpZiAoaW9jdGwoKmxvb3BfZmQsIExPT1BfU0VUX0ZELCAqYmFja19mZCkpXG4mIzQzO1x0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO2VycjpcbiYjNDM7XHRpZiAoKmxvb3BfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoKmxvb3BfZmQpO1xuJiM0MztcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZSgqYmFja19mZCk7XG4mIzQzO1x0Y2xvc2UoKmN0bF9mZCk7XG4mIzQzO1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCxcbiYjNDM7XHRcdFx0ICBpbnQgYmFja19mZClcbiYjNDM7e1xuJiM0MztcdGludCBuciA9IC0xO1xuJiM0MztcbiYjNDM7XHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdGlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTtcbiYjNDM7XHRcdGNsb3NlKGxvb3BfZmQpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoYmFja19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShiYWNrX2ZkKTtcbiYjNDM7XHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0aWYgKHNzY2FuZihsb29wX3BhdGgsIFwmIzM0Oy9kZXYvbG9vcCVkXCYjMzQ7LCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpO1xuJiM0MztcdFx0Y2xvc2UoY3RsX2ZkKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIE9fRElSRUNUIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuJiM0MztzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpidWY7XG4mIzQzO1x0aW50IGZkLCByZXQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbiYjNDM7XHRcdGdvdG8gb3V0X2ZkO1xuJiM0MztcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4mIzQzO1x0XHRnb3RvIG91dF9idWY7XG4mIzQzO1x0ZnN5bmMoZmQpO1xuJiM0MztcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuJiM0MztcdFx0Z290byBvdXRfYnVmO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO291dF9idWY6XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0MztvdXRfZmQ6XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJiMzOTtzIGlvLnN0YXQgZmlsZSBhbmRcbiYjNDM7ICogZmlsbCBAb3V0LiBAZGV2IGlzIGEga2VybmVsIGRldl90IChhcyByZXR1cm5lZCBieSBicGZfYmxrZ19kZXYpLCB3aG9zZVxuJiM0MzsgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlXG4mIzQzOyAqIGRldmljZSYjMzk7cyBsaW5lIHdhcyBmb3VuZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcGFyc2VfaW9fc3RhdChpbnQgY2dyb3VwX2ZkLCBfX3U2NCBkZXYsIHN0cnVjdCBpb19xdWVyeSAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuJiM0MztcdGNoYXIgYnVmWzQwOTZdLCAqbGluZSwgKnNhdmVwdHI7XG4mIzQzO1x0aW50IGZkLCBuLCByZXQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuYXQoY2dyb3VwX2ZkLCBcJiMzNDtpby5zdGF0XCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdGlmIChuIFx1MDAzYz0gMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRidWZbbl0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcbiYjNDM7XHRmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsIFwmIzM0O1xcblwmIzM0OywgXHUwMDI2c2F2ZXB0cik7IGxpbmU7XG4mIzQzO1x0ICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgXCYjMzQ7XFxuXCYjMzQ7LCBcdTAwMjZzYXZlcHRyKSkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBsb25nIHJiID0gMCwgd2IgPSAwLCByaSA9IDAsIHdpID0gMCwgZGIgPSAwLCBkaSA9IDA7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBcJiMzNDttYWo6bWluXCYjMzQ7IHRva2VuIGlzIGFsd2F5cyBwcmVzZW50OyB0aGUgZmllbGQgYmxvY2sgaXNcbiYjNDM7XHRcdCAqIG9wdGlvbmFsICh0aGUga2VybmVsIG9taXRzIGl0IGZvciBhIGRldmljZSB3aXRoIG5vIHJlYWQvd3JpdGVcbiYjNDM7XHRcdCAqIEkvTyksIHNvIGEgbWF0Y2ggb2YgXHUwMDNlPSAyIGlzIGVub3VnaCBhbmQgYWJzZW50IGZpZWxkcyBzdGF5IDAuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChzc2NhbmYobGluZSxcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7JXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHVcJiMzNDssXG4mIzQzO1x0XHRcdCAgIFx1MDAyNm1haiwgXHUwMDI2bWluLCBcdTAwMjZyYiwgXHUwMDI2d2IsIFx1MDAyNnJpLCBcdTAwMjZ3aSwgXHUwMDI2ZGIsIFx1MDAyNmRpKSBcdTAwM2MgMilcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdieXRlcyA9IHdiO1xuJiM0MztcdFx0b3V0LVx1MDAzZXJpb3MgPSByaTtcbiYjNDM7XHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4mIzQzO1x0XHRvdXQtXHUwMDNlZGJ5dGVzID0gZGI7XG4mIzQzO1x0XHRvdXQtXHUwMDNlZGlvcyA9IGRpO1xuJiM0MztcdFx0cmV0ID0gMDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKmNncm91cF9yZWxfcGF0aCA9IFwmIzM0Oy9jZ3JvdXBfaXRlcl9pb190ZXN0XCYjMzQ7O1xuJiM0MztcdGludCBjdGxfZmQgPSAtMSwgbG9vcF9mZCA9IC0xLCBiYWNrX2ZkID0gLTE7XG4mIzQzO1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMO1xuJiM0MztcdGNoYXIgbG9vcF9wYXRoWzY0XTtcbiYjNDM7XHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4mIzQzO1x0aW50IGNncm91cF9mZDtcbiYjNDM7XG4mIzQzO1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoY2dyb3VwX2ZkLCBcJiMzNDtjZ3JvdXBfc2V0dXBfYW5kX2pvaW5cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4mIzQzO1x0XHR0ZXN0X19za2lwKCk7XHQvKiBuZWVkcyByb290ICYjNDM7IENPTkZJR19CTEtfREVWX0xPT1AgKi9cbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvb3A7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUGluIHRoZSByZWFkIHRvIHRoZSBsb29wIGRldmljZSBzbyB0aGUgbWVhc3VyZWQgZGV2aWNlIGlzIHN0YWJsZSBhbmRcbiYjNDM7XHQgKiBxdWllc2NlZC4gQ29udmVydCB0aGUgZ2xpYmMtZW5jb2RlZCBzdF9yZGV2IHRvIHRoZSBrZXJuZWwgZGV2X3RcbiYjNDM7XHQgKiBlbmNvZGluZyAobWFqb3IgXHUwMDNjXHUwMDNjIDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0e1xuJiM0MztcdFx0c3RydWN0IHN0YXQgbHN0O1xuJiM0MztcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGZzdGF0KGxvb3BfZmQsIFx1MDAyNmxzdCksIFwmIzM0O2ZzdGF0IGxvb3BcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXBfc2tlbDtcbiYjNDM7XHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2V0YXJnZXRfZGV2ID1cbiYjNDM7XHRcdFx0KChfX3U2NCltYWpvcihsc3Quc3RfcmRldikgXHUwMDNjXHUwMDNjIDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xuJiM0MztcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHtcbiYjNDM7XHRcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxuJiM0MztcdFx0LmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksXG4mIzQzO1x0fTtcbiYjNDM7XHRvcHRzLmxpbmtfaW5mbyA9IFx1MDAyNmxpbmZvO1xuJiM0MztcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XG4mIzQzO1xuJiM0MztcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfaW9fcXVlcnksIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihsaW5rLCBcJiMzNDticGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4mIzQzO1xuJiM0MztcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZG9fZGlyZWN0X2lvKGxvb3BfcGF0aCksIFwmIzM0O2RvX2RpcmVjdF9pb1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbGluaztcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCYjMzQ7cmVhZCBzdGF0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbGluaztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxuJiM0MztcdCAqIHBhdHRlcm4gaW4gY2dyb3VwX2l0ZXJfbWVtY2cuXG4mIzQzO1x0ICovXG4mIzQzO1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjZ3JvdXBfaXRlcl9pb19fd3JpdGVcJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2V3Ynl0ZXMsIDAsIFwmIzM0O3dieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2V3aW9zLCAwLCBcJiMzNDt3aW9zXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3JlYWRcJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyYnl0ZXMsIDAsIFwmIzM0O3JieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyaW9zLCAwLCBcJiMzNDtyaW9zXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX2RldlwmIzM0OykpXG4mIzQzO1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwmIzM0O2RldlwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU3Ryb25nZXIgY2hlY2s6IHRoZSBrZnVuYy1yZWFkIHZhbHVlcyBtdXN0IGVxdWFsIHdoYXQgdGhlIGlvLnN0YXRcbiYjNDM7XHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxuJiM0MztcdCAqIHRoZSBmaWxlIHdpdGggbm8gSS9PIGluIGJldHdlZW4sIHNvIGJvdGggZmx1c2hlZCBzbmFwc2hvdHMgbWF0Y2hcbiYjNDM7XHQgKiBleGFjdGx5LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2Nncm91cF9pdGVyX2lvX19tYXRjaFwmIzM0OykpIHtcbiYjNDM7XHRcdHN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9O1xuJiM0MztcbiYjNDM7XHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCYjMzQ7cmVhZCBzdGF0c1wmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgQVNTRVJUX09LKHBhcnNlX2lvX3N0YXQoY2dyb3VwX2ZkLCBxLVx1MDAzZWRldiwgXHUwMDI2ZmlsZXYpLFxuJiM0MztcdFx0XHQgICAgICBcJiMzNDtwYXJzZSBpby5zdGF0XCYjMzQ7KSkge1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXCYjMzQ7cmJ5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFwmIzM0O3dieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFwmIzM0O3Jpb3NcJiMzNDspO1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcJiMzNDt3aW9zXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFwmIzM0O2RieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFwmIzM0O2Rpb3NcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTZXBhcmF0ZSBwcm9ncmFtIGZvciB0aGUgcm9vdCBibG9jayBjZ3JvdXAuIEl0cyBjb3VudGVycyBkbyBub3QgY29tZVxuJiM0MztcdCAqIGZyb20gcnN0YXQsIHRoZXkgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMsIHNvIHRoaXNcbiYjNDM7XHQgKiBjb3ZlcnMgdGhlIG90aGVyIGhhbGYgb2YgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZXkgY292ZXIgZXZlcnlcbiYjNDM7XHQgKiBjZ3JvdXAmIzM5O3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXG4mIzQzO1x0ICogdGhleSBtdXN0IGJlIGF0IG9yIGFib3ZlIHdoYXQgdGhlIHRlc3QgY2dyb3VwIHdhcyBjaGFyZ2VkLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2Nncm91cF9pdGVyX2lvX19yb290XCYjMzQ7KSkge1xuJiM0MztcdFx0c3RydWN0IGJwZl9saW5rICpyb290X2xpbms7XG4mIzQzO1x0XHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XG4mIzQzO1xuJiM0MztcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnID0gMDtcbiYjNDM7XHRcdHJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9yb290X2Jsa2NnX3F1ZXJ5LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcJiMzNDthdHRhY2ggcm9vdCBpdGVyXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCYjMzQ7cmVhZCByb290IHN0YXRzXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnLCAxLFxuJiM0MztcdFx0XHRcdFx0ICBcJiMzNDtnb3Rfcm9vdF9ibGtjZ1wmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0VRKHItXHUwMDNlZGV2LCBxLVx1MDAzZWRldiwgXCYjMzQ7cm9vdCBkZXZcJiMzNDspO1xuJiM0MztcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdieXRlcywgcS1cdTAwM2V3Ynl0ZXMsIFwmIzM0O3Jvb3Qgd2J5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3aW9zLCBxLVx1MDAzZXdpb3MsIFwmIzM0O3Jvb3Qgd2lvc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmJ5dGVzLCBxLVx1MDAzZXJieXRlcywgXCYjMzQ7cm9vdCByYnl0ZXNcJiMzNDspO1xuJiM0MztcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJpb3MsIHEtXHUwMDNlcmlvcywgXCYjMzQ7cm9vdCByaW9zXCYjMzQ7KTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRicGZfbGlua19fZGVzdHJveShyb290X2xpbmspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO2NsZWFudXBfbGluazpcbiYjNDM7XHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbiYjNDM7Y2xlYW51cF9za2VsOlxuJiM0MztcdGNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpO1xuJiM0MztjbGVhbnVwX2xvb3A6XG4mIzQzO1x0bG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7XG4mIzQzO2NsZWFudXBfY2dyb3VwX2ZkOlxuJiM0MztcdGNsb3NlKGNncm91cF9mZCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iODM5ZGVmOTQ1MDg2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCAmIzQzOzEsMTA3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7I2luY2x1ZGUgXHUwMDNjdm1saW51eC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9pdGVyX2lvLmhcJiMzNDtcbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzQzO1xuJiM0MzsvKiBUaGUgY291bnRlcnMgb2YgdGhlIGRldmljZSBuYW1lZCBieSB0YXJnZXRfZGV2IGFyZSBzdG9yZWQgaGVyZS4gKi9cbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKiBUaGUgc2FtZSBkZXZpY2UmIzM5O3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKFwmIzM0Oy5kYXRhLnF1ZXJ5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qIFNldCB0byAxIGJ5IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5IHdoZW4gYnBmX2dldF9yb290X2Jsa2NnKCkgc3VjY2VlZHMuICovXG4mIzQzO19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKiBEZXZpY2UgdG8gcmVhZCwgc2V0IGJ5IHVzZXJzcGFjZSAoa2VybmVsIGRldl90KS4gUGlubmluZyB0aGUgZGV2aWNlIGtlZXBzXG4mIzQzOyAqIHRoZSByZWFkIGRldGVybWluaXN0aWMgYW5kIGxldHMgdGhlIHZhbHVlIGJlIGNvbXBhcmVkIHRvIGlvLnN0YXQgZXhhY3RseS5cbiYjNDM7ICovXG4mIzQzO19fdTY0IHRhcmdldF9kZXYgU0VDKFwmIzM0Oy5kYXRhLnF1ZXJ5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSYjMzk7cyBjb3VudGVycyBpbnRvIEBvdXQuIFJlYWRpbmcgb25seVxuJiM0MzsgKiB0aGUgb25lIHBpbm5lZCBkZXZpY2Uga2VlcHMgdGhlIHJlc3VsdCBkZXRlcm1pbmlzdGljOiB0aGF0IGRldmljZSBpc1xuJiM0MzsgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyBcJiMzNDthbnkgZGV2aWNlXG4mIzQzOyAqIHdpdGggSS9PXCYjMzQ7IHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGJsa2NnICpibGtjZyxcbiYjNDM7XHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xuJiM0MztcbiYjNDM7XHQvKiBpby5zdGF0IG5lZWRzIGEgZmx1c2ggYmVmb3JlIGl0IGNhbiBiZSByZWFkIChzbGVlcGFibGUpLiAqL1xuJiM0MztcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhibGtjZyk7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBwZXItZGV2aWNlIGJsa2cgd2FsayBuZWVkcyBhbiBSQ1Ugc2VjdGlvbi4gKi9cbiYjNDM7XHRicGZfcmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XG4mIzQzO1x0XHRpZiAoYnBmX2Jsa2dfZGV2KHBvcykgIT0gdGFyZ2V0X2RldilcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRldiA9IGJwZl9ibGtnX2Rldihwb3MpO1xuJiM0MztcdFx0b3V0LVx1MDAzZXJieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1JFQUQpO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbiYjNDM7XHRcdG91dC1cdTAwM2VyaW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1JFQUQpO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfV1JJVEUpO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1x0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci5zL2Nncm91cFwmIzM0OylcbiYjNDM7aW50IGNncm91cF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4mIzQzO1x0c3RydWN0IGJsa2NnICpibGtjZztcbiYjNDM7XG4mIzQzO1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuJiM0MztcdGlmICghY2dycClcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHQvKiBTdGFydCBmcmVzaCBzbyBhIGRldmljZSB0aGF0IGlzIG5vdCBmb3VuZCBzdGF5cyBhbGwtemVyby4gKi9cbiYjNDM7XHRfX2J1aWx0aW5fbWVtc2V0KFx1MDAyNmlvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTtcbiYjNDM7XG4mIzQzO1x0YmxrY2cgPSBicGZfZ2V0X2Jsa2NnKFx1MDAyNmNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFibGtjZylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZWFkX3RhcmdldF9kZXYoYmxrY2csIFx1MDAyNmlvX3F1ZXJ5KTtcbiYjNDM7XG4mIzQzO1x0YnBmX3B1dF9ibGtjZyhibGtjZyk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtpdGVyLnMvY2dyb3VwXCYjMzQ7KVxuJiM0MztpbnQgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjdHgtXHUwMDNlY2dyb3VwO1xuJiM0MztcdHN0cnVjdCBibGtjZyAqYmxrY2c7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBsYXN0IGl0ZXJhdGlvbiBoYXMgYSBOVUxMIGNncm91cCwgc2tpcCBpdC4gKi9cbiYjNDM7XHRpZiAoIWNncnApXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0X19idWlsdGluX21lbXNldChcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xuJiM0MztcbiYjNDM7XHRibGtjZyA9IGJwZl9nZXRfcm9vdF9ibGtjZygpO1xuJiM0MztcdGlmICghYmxrY2cpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcbiYjNDM7XHQgKiB0aGFuIGZyb20gcnN0YXQsIHNvIHRoaXMgYWxzbyBjb3ZlcnMgdGhlIHJvb3Qgc2lkZSBvZlxuJiM0MztcdCAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLiBUaGUgY291bnRlcnMgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTywgc29cbiYjNDM7XHQgKiB0aGV5IGNhbiBvbmx5IGJlIGF0IG9yIGFib3ZlIHdoYXQgdGhpcyB0ZXN0JiMzOTtzIG93biBjZ3JvdXAgZGlkLlxuJiM0MztcdCAqL1xuJiM0MztcdHJlYWRfdGFyZ2V0X2RldihibGtjZywgXHUwMDI2cm9vdF9xdWVyeSk7XG4mIzQzO1xuJiM0MztcdGdvdF9yb290X2Jsa2NnID0gMTtcbiYjNDM7XHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2dldF9yb290X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9nZXRfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX3B1dF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfYmxrY2dfZmx1c2hfc3RhdHMmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX2Jsa2dfZGVzdHJveSYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfYnl0ZXMmIzM0OywKICAgICYjMzQ7YnBmX2Jsa2dfaW9zdGF0X2lvcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19kZXYmIzM0OywKICAgICYjMzQ7YmxrY2dfZmlsbF9yb290X2lvc3RhdHMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgQlBGIGtmdW5jcyBmb3IgdGhlIGJsb2NrIEkvTyBjb250cm9sbGVyIChibGtjZykgdG8gYWxsb3cgQlBGIHByb2dyYW1zIHRvIHJlYWQgYSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMmNhMTlhOGEyNDg4NzI4ODhkZTFhNWJlN2Q2NzgzOGEyZjJhNDIxNwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMjE6MDM6MDMgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTCkBAIC02NjE3LDYgJiM0Mzs2NjE3LDcgQEAgRjoJYmxvY2svYmxrLWNncm91cC5jCiBGOglibG9jay9ibGstaW9jb3N0LmMKIEY6CWJsb2NrL2Jsay1pb2xhdGVuY3kuYwogRjoJYmxvY2svYmxrLXRocm90dGxlLmMKJiM0MztGOglibG9jay9icGZfYmxrY2cuYwogRjoJaW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmgKIAogQ09OVFJPTCBHUk9VUCAtIENQVVNFVApkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMTcsNiAmIzQzOzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICYjNDM7PSBlcnJvci1pbmplY3Rpb24ubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgJiM0Mzs9IGJzZy5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpCSYjNDM7PSBic2ctbGliLm8KIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYmxrLWNncm91cC5vCiYjNDM7aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCiYjNDM7b2JqLSQoQ09ORklHX0JMS19DR1JPVVApCSYjNDM7PSBicGZfYmxrY2cubwomIzQzO2VuZGlmCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpCSYjNDM7PSBibGstY2dyb3VwLXJ3c3RhdC5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgJiM0Mzs9IGJsay1jZ3JvdXAtZmMtYXBwaWQubwogb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORykJJiM0Mzs9IGJsay10aHJvdHRsZS5vCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmMKaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5jCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwpAQCAtMTA4Niw3ICYjNDM7MTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpCiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAmIzM5O3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXQKICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLgogICovCi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKQomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmgKaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5oCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaApAQCAtMjA1LDYgJiM0MzsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpOwogCiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7CiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTsKIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZywKIAkJICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosCiAJCQkJICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLApkaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi40OGE4NmYwN2UxOThhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYnBmX2Jsa2NnLmMKQEAgLTAsMCAmIzQzOzEsMzE1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKJiM0MzsvKgomIzQzOyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuCiYjNDM7ICoKJiM0MzsgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJiMzOTtzIGlvLnN0YXQgY291bnRlcnMuIEEgcHJvZ3JhbSB0dXJucyBhCiYjNDM7ICogY2dyb3VwJiMzOTtzIGNzcyBpbnRvIGEgc3RydWN0IGJsa2NnIHdpdGggYnBmX2dldF9ibGtjZygpLCBmbHVzaGVzIHRoZSBzdGF0cyB3aXRoCiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCksIHRoZW4gd2Fsa3MgdGhlIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzIHdpdGggdGhlCiYjNDM7ICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJiMzOTtzIGNvdW50ZXJzIHdpdGgKJiM0MzsgKiBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoKS9icGZfYmxrZ19pb3N0YXRfaW9zKCkuIEl0IG1pcnJvcnMgdGhlIG1lbW9yeQomIzQzOyAqIGNvbnRyb2xsZXIga2Z1bmNzIGluIG1tL2JwZl9tZW1jb250cm9sLmMsIGJ1dCBhZGRzIGEgcGVyLWRldmljZSBkaW1lbnNpb246CiYjNDM7ICogdW5saWtlIG1lbWNnLCBibGtjZyBrZWVwcyBvbmUgYmxrZyAoYW5kIG9uZSBpby5zdGF0IGxpbmUpIHBlciBibG9jayBkZXZpY2UuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYmxvY2svIGJlY2F1c2UgdGhlIGJsa2NnL2Jsa2cgc3RydWN0IGxheW91dHMgYXJlIHByaXZhdGUKJiM0MzsgKiB0byBibG9jay9ibGstY2dyb3VwLmguCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtibGstY2dyb3VwLmgmIzM0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmX2lkcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcmVlbXB0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JjdWxpc3QuaCZndDsKJiM0MzsKJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwCiYjNDM7ICoKJiM0MzsgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXMKJiM0MzsgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJiMzOTt0IHJlcXVpcmUgcmVmZXJlbmNlIGNvdW50aW5nLiBJdCYjMzk7cyBzYWZlIHRvIHBhc3MgaXQKJiM0MzsgKiB0byBicGZfcHV0X2Jsa2NnKCkuCiYjNDM7ICoKJiM0MzsgKiBOb3RlIHRoYXQgdGhlIHJvb3QgY2dyb3VwIGlzIHNwZWNpYWw6IGl0cyBjb3VudGVycyBhcmUgdGhlIGRpc2tzJiMzOTsgb3duCiYjNDM7ICogc3RhdGlzdGljcywgc28gdGhleSBjb3ZlciBldmVyeSBjZ3JvdXAmIzM5O3MgSS9PIHJhdGhlciB0aGFuIG9ubHkgdGhlIHJvb3QmIzM5O3MuCiYjNDM7ICogVGhpcyBtYXRjaGVzIHdoYXQgdGhlIHJvb3QgaW8uc3RhdCBmaWxlIHByaW50cy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfcm9vdF9ibGtjZyh2b2lkKQomIzQzO3sKJiM0MzsJLyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi8KJiM0MzsJcmV0dXJuICZhbXA7YmxrY2dfcm9vdDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2dldF9ibGtjZyAtIEdldCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cAomIzQzOyAqIEBjc3M6IHBvaW50ZXIgdG8gdGhlIGNzcyBzdHJ1Y3R1cmUKJiM0MzsgKgomIzQzOyAqIEl0JiMzOTtzIGZpbmUgdG8gcGFzcyBhIGNzcyB3aGljaCBiZWxvbmdzIHRvIGFueSBjZ3JvdXAgY29udHJvbGxlciwKJiM0MzsgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5JiMzOTtzIG1haW4gY3NzLgomIzQzOyAqCiYjNDM7ICogSW1wbGVtZW50cyBLRl9BQ1FVSVJFIHNlbWFudGljcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgYmxrY2cgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3NzJiMzOTtzCiYjNDM7ICogcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwgaWYgdGhlIGlvIGNvbnRyb2xsZXIgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNncm91cC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2cgKmJwZl9nZXRfYmxrY2coc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2cgPSBOVUxMOwomIzQzOwomIzQzOwlpZiAoY3NzLSZndDtzcyA9PSAmYW1wO2lvX2NncnBfc3Vic3lzKQomIzQzOwkJcmV0dXJuIGNzc190cnlnZXQoY3NzKSA/IGNzc190b19ibGtjZyhjc3MpIDogTlVMTDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU29tZSBvdGhlciBjb250cm9sbGVyJiMzOTtzIGNzcywgb3IgdGhlIGNncm91cCYjMzk7cyBvd24gb25lLiBMb29rIHVwIHRoZSBpbwomIzQzOwkgKiBjb250cm9sbGVyJiMzOTtzIGNzczsgcmN1IGtlZXBzIGl0IGFsaXZlIGJldHdlZW4gdGhlIGxvYWQgYW5kIHRoZSB0cnlnZXQuCiYjNDM7CSAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLyYjMzk7cyBsb2NrCiYjNDM7CSAqIGNvbnRleHQgYW5hbHlzaXMgY2FuIGZvbGxvdyBpdC4KJiM0MzsJICovCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJY3NzID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhjc3MtJmd0O2Nncm91cC0mZ3Q7c3Vic3lzW2lvX2NncnBfaWRdKTsKJiM0MzsJaWYgKGNzcyAmYW1wOyZhbXA7IGNzc190cnlnZXQoY3NzKSkKJiM0MzsJCWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwomIzQzOwlyZXR1cm4gYmxrY2c7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9wdXRfYmxrY2cgLSBQdXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXAKJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cCB0byByZWxlYXNlCiYjNDM7ICoKJiM0MzsgKiBSZWxlYXNlcyBhIHByZXZpb3VzbHkgYWNxdWlyZWQgYmxrY2cgcmVmZXJlbmNlLgomIzQzOyAqIEltcGxlbWVudHMgS0ZfUkVMRUFTRSBzZW1hbnRpY3MuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfcHV0X2Jsa2NnKHN0cnVjdCBibGtjZyAqYmxrY2cpCiYjNDM7ewomIzQzOwljc3NfcHV0KCZhbXA7YmxrY2ctJmd0O2Nzcyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJiMzOTtzIGlvIHN0YXRpc3RpY3MKJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cAomIzQzOyAqCiYjNDM7ICogQ2FsbCB0aGlzIGJlZm9yZSByZWFkaW5nIGNvdW50ZXJzIGZvciB1cC10by1kYXRlIHZhbHVlcy4gU2xlZXBhYmxlLgomIzQzOyAqCiYjNDM7ICogSXQgZG9lcyB3aGF0IHJlYWRpbmcgdGhlIGlvLnN0YXQgZmlsZSBkb2VzLCB3aGljaCBkaWZmZXJzIGJ5IGNncm91cC4gRm9yIGEKJiM0MzsgKiBub24tcm9vdCBjZ3JvdXAgaXQgZm9sZHMgdGhlIHBlci1jcHUgZGVsdGFzIGludG8gdGhlIHBlci1kZXZpY2UgYWdncmVnYXRlcwomIzQzOyAqIGFuZCB1cCB0aGUgY2dyb3VwIHRyZWUuIFRoZSByb290IGNncm91cCBpcyBub3QgYWNjb3VudGVkIHRocm91Z2ggcnN0YXQgYXQKJiM0MzsgKiBhbGwsIHNvIGZvciBpdCB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzIGFyZSByZWZpbGxlZCBmcm9tIHRoZSBkaXNrcyYjMzk7CiYjNDM7ICogb3duIHN0YXRpc3RpY3MsIHdoaWNoIGNvdW50IGV2ZXJ5IGNncm91cCYjMzk7cyBJL08uCiYjNDM7ICoKJiM0MzsgKiBUaGUgcm9vdCBicmFuY2ggaXMgbm90IHNlbGYtbGltaXRpbmcgdGhlIHdheSB0aGUgcnN0YXQgb25lIGlzOiBpdCByZXJlYWRzCiYjNDM7ICogZXZlcnkgZGlzayBvbiBldmVyeSBjYWxsLCB3aGlsZSBhIHNlY29uZCByc3RhdCBmbHVzaCBmaW5kcyBub3RoaW5nIGxlZnQgdG8KJiM0MzsgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtCiYjNDM7ICogb25jZSByYXRoZXIgdGhhbiBvbmNlIHBlciBjZ3JvdXAgb2YgYSB3YWxrLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpCiYjNDM7ewomIzQzOwlpZiAoIWJsa2NnLSZndDtjc3MucGFyZW50KQomIzQzOwkJYmxrY2dfZmlsbF9yb290X2lvc3RhdHMoKTsKJiM0MzsJZWxzZQomIzQzOwkJY3NzX3JzdGF0X2ZsdXNoKCZhbXA7YmxrY2ctJmd0O2Nzcyk7CiYjNDM7fQomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnIHsKJiM0MzsJX191NjQgX19vcGFxdWVbMl07CiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqcG9zOwomIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV3IC0gU3RhcnQgaXRlcmF0aW5nIGEgYmxvY2sgY2dyb3VwJiMzOTtzIHBlci1kZXZpY2UgYmxrZ3MKJiM0MzsgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKJiM0MzsgKiBAYmxrY2c6IGJsb2NrIGNncm91cCB3aG9zZSBkZXZpY2VzIHRvIHdhbGsKJiM0MzsgKgomIzQzOyAqIEVhY2ggeWllbGRlZCBibGtnIGhvbGRzIG9uZSBibG9jayBkZXZpY2UmIzM5O3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGEKJiM0MzsgKiBwZXItZGV2aWNlIGxpbmUgb2YgdGhlIGlvLnN0YXQgZmlsZS4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZCwgYXMgdGhlIGZpbGUKJiM0MzsgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2sKJiM0MzsgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yCiYjNDM7ICogaXQuIE11c3QgYmUgdXNlZCBpbnNpZGUgYW4gUkNVIHJlYWQgc2VjdGlvbi4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0OwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICZndDsgc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7CiYjNDM7CUJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPQomIzQzOwkJICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpOwomIzQzOwomIzQzOwlraXQtJmd0O2Jsa2NnID0gYmxrY2c7CiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnX2dxICpicGZfaXRlcl9ibGtnX25leHQoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LSZndDtwb3M7CiYjNDM7CXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwomIzQzOwomIzQzOwkvKiBDbGVhcmVkIG9uY2UgdGhlIHdhbGsgaXMgZG9uZSwgc2VlIGJlbG93LiAqLwomIzQzOwlpZiAoIWtpdC0mZ3Q7YmxrY2cpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKCFibGtnKQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoJmFtcDtraXQtJmd0O2Jsa2NnLSZndDtibGtnX2xpc3QpKTsKJiM0MzsJZWxzZQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsKJiM0MzsJLyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyB0aGUgaW8uc3RhdCBmaWxlLiAqLwomIzQzOwl3aGlsZSAobm9kZSkgewomIzQzOwkJYmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7CiYjNDM7CQlpZiAoYmxrZy0mZ3Q7b25saW5lKSB7CiYjNDM7CQkJa2l0LSZndDtwb3MgPSBibGtnOwomIzQzOwkJCXJldHVybiBibGtnOwomIzQzOwkJfQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGb3JnZXQgdGhlIGxpc3QgaGVhZCBhcyB3ZWxsLiBUaGUgdmVyaWZpZXIgYXNzdW1lcyB0aGF0IGFuIGl0ZXJhdG9yCiYjNDM7CSAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGUKJiM0MzsJICogbG9vcCBmb3IgdGVybWluYXRpb24gb25jZSBpdCBoYXM7IHN0YXJ0aW5nIHRoZSB3YWxrIG92ZXIgd291bGQgbGV0CiYjNDM7CSAqIHN1Y2ggYSBsb29wIHNwaW4gZm9yZXZlci4KJiM0MzsJICovCiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsJa2l0LSZndDtibGtjZyA9IE5VTEw7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVhZCBvbmUgY291bnRlciBvdXQgb2YgQGJsa2cmIzM5O3MgZmx1c2hlZCBpby5zdGF0IGFnZ3JlZ2F0ZS4gQGNvdW50ZXJzIGlzIG9uZQomIzQzOyAqIG9mIHRoZSB0d28gYXJyYXlzIGluIGJsa2ctJmd0O2lvc3RhdC5jdXI7IGJvdGggYXJlIGd1YXJkZWQgYnkgdGhhdCBzdHJ1Y3QmIzM5O3MKJiM0MzsgKiBzZXFsb2NrLCB0aGUgb25lIHRoZSBpby5zdGF0IGZpbGUgdXNlcy4gUmV0dXJucyAodTY0KS0xIGlmIHRoZSBjb3VudGVyCiYjNDM7ICogY2Fubm90IGJlIHJlYWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCBibGtnX2lvc3RhdF9yZWFkKHN0cnVjdCBibGtjZ19ncSAqYmxrZywgY29uc3QgdTY0ICpjb3VudGVycywKJiM0MzsJCQkgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KQomIzQzO3sKJiM0MzsJc3RydWN0IGJsa2dfaW9zdGF0X3NldCAqYmlzID0gJmFtcDtibGtnLSZndDtpb3N0YXQ7CiYjNDM7CXVuc2lnbmVkIGludCBzZXE7CiYjNDM7CXU2NCB2YWw7CiYjNDM7CiYjNDM7CWlmICgodW5zaWduZWQgaW50KXJ3ICZndDs9IEJMS0dfSU9TVEFUX05SKQomIzQzOwkJcmV0dXJuICh1NjQpLTE7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE9uIDMyLWJpdCB0aGUgbG9vcCBiZWxvdyByZWFsbHkgaXMgYSBzZXFjb3VudCByZXRyeSBsb29wLiBFdmVyeQomIzQzOwkgKiB3cml0ZXIgb2YgYmxrZy0mZ3Q7aW9zdGF0IGtlZXBzIGludGVycnVwdHMgb2ZmLCBzbyBvbmx5IGFuIE5NSSBjYW4gbGFuZAomIzQzOwkgKiBpbnNpZGUgYW4gdXBkYXRlLCBhbmQgdGhlbiB0aGUgbG9vcCB3b3VsZCBuZXZlciBlbmQuIFRoZXNlIGtmdW5jcwomIzQzOwkgKiBhcmUgcmVhY2hhYmxlIGZyb20gYSBwZXJmIGV2ZW50IHByb2dyYW0sIHdoaWNoIGRvZXMgcnVuIGluIE5NSSwgc28KJiM0MzsJICogZ2l2ZSB1cCByYXRoZXIgdGhhbiBzcGluLiBPbiA2NC1iaXQgdGhlIGxvb3AgY29tcGlsZXMgYXdheS4KJiM0MzsJICovCiYjNDM7CWlmIChCSVRTX1BFUl9MT05HID09IDMyICZhbXA7JmFtcDsgaW5fbm1pKCkpCiYjNDM7CQlyZXR1cm4gKHU2NCktMTsKJiM0MzsKJiM0MzsJZG8gewomIzQzOwkJc2VxID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZhbXA7YmlzLSZndDtzeW5jKTsKJiM0MzsJCXZhbCA9IGNvdW50ZXJzW3J3XTsKJiM0MzsJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KCZhbXA7YmlzLSZndDtzeW5jLCBzZXEpKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSYjMzk7cyBpby5zdGF0IGJ5dGUgY291bnRlcgomIzQzOyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cCkKJiM0MzsgKiBAcnc6IHdoaWNoIGNvdW50ZXIgKEJMS0dfSU9TVEFUX1JFQUQgLyBfV1JJVEUgLyBfRElTQ0FSRCkKJiM0MzsgKgomIzQzOyAqIFJlYWRzIHRoZSBmbHVzaGVkIGFnZ3JlZ2F0ZSwgc28gY2FsbCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKSBmaXJzdCBmb3IKJiM0MzsgKiB1cC10by1kYXRlIHZhbHVlcy4gVGhlIHJlYWQgdXNlcyB0aGUgdTY0X3N0YXRzIHNlcWxvY2ssIGxpa2UgdGhlIGlvLnN0YXQKJiM0MzsgKiBmaWxlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBvciAodTY0KS0xIGlmIEBydyBpcyBvdXQgb2YgcmFuZ2Ugb3IgdGhlCiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHN0cnVjdCBibGtjZ19ncSAqYmxrZywKJiM0MzsJCQkJICAgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KQomIzQzO3sKJiM0MzsJcmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5ieXRlcywgcncpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSYjMzk7cyBpby5zdGF0IEkvTyBjb3VudAomIzQzOyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cCkKJiM0MzsgKiBAcnc6IHdoaWNoIGNvdW50ZXIgKEJMS0dfSU9TVEFUX1JFQUQgLyBfV1JJVEUgLyBfRElTQ0FSRCkKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG51bWJlciBvZiBJL09zLCBvciAodTY0KS0xIGlmIEBydyBpcyBvdXQgb2YgcmFuZ2Ugb3IgdGhlCiYjNDM7ICogY291bnRlciBjYW5ub3QgYmUgcmVhZC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfaW9zdGF0X2lvcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csCiYjNDM7CQkJCSAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpCiYjNDM7ewomIzQzOwlyZXR1cm4gYmxrZ19pb3N0YXRfcmVhZChibGtnLCBibGtnLSZndDtpb3N0YXQuY3VyLmlvcywgcncpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfYmxrZ19kZXYgLSBSZXR1cm4gYSBibGtnJiMzOTtzIGRldmljZSBpZAomIzQzOyAqIEBibGtnOiBibG9jayBncm91cAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgZGV2aWNlJiMzOTtzIGRldl90ICh1c2UgTUFKT1IoKS9NSU5PUigpIHRvIHNwbGl0KSwgb3IgMCBpZiB0aGUgYmxrZwomIzQzOyAqIGhhcyBubyBkaXNrLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19kZXYoc3RydWN0IGJsa2NnX2dxICpibGtnKQomIzQzO3sKJiM0MzsJaWYgKCFibGtnLSZndDtxIHx8ICFibGtnLSZndDtxLSZndDtkaXNrKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiBibGtnLSZndDtxLSZndDtkaXNrLSZndDtwYXJ0MC0mZ3Q7YmRfZGV2OwomIzQzO30KJiM0MzsKJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpOwomIzQzOwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2dldF9yb290X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfYmxrY2csIEtGX0FDUVVJUkUgfCBLRl9SRVRfTlVMTCB8IEtGX1JDVSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3B1dF9ibGtjZywgS0ZfUkVMRUFTRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKQomIzQzOwomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMsIEtGX1JDVSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2lvcywgS0ZfUkNVKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19kZXYsIEtGX1JDVSkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfYmxrY2dfa2Z1bmNzKQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiYjNDM7CS5zZXQJCT0gJmFtcDticGZfYmxrY2dfa2Z1bmNzLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiYjNDM7CQkJCQkmYW1wO2JwZl9ibGtjZ19rZnVuY19zZXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcHJfd2FybigmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBibGtjZyBrZnVuY3M6ICVkXG4mIzM0OywgZXJyKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApAQCAtMCwwICYjNDM7MSwxNyBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7I2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0gKJiM0MzsKJiM0MztzdHJ1Y3QgaW9fcXVlcnkgewomIzQzOwkvKiBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMgKi8KJiM0MzsJX191NjQgcmJ5dGVzOwomIzQzOwlfX3U2NCB3Ynl0ZXM7CiYjNDM7CV9fdTY0IHJpb3M7CiYjNDM7CV9fdTY0IHdpb3M7CiYjNDM7CV9fdTY0IGRieXRlczsKJiM0MzsJX191NjQgZGlvczsKJiM0MzsJX191NjQgZGV2OwkvKiBkZXZfdCBvZiB0aGUgZGV2aWNlIHRoZSBjb3VudGVycyBiZWxvbmcgdG8gKi8KJiM0Mzt9OwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NHUk9VUF9JVEVSX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtMSwzICYjNDM7MSw0IEBACiYjNDM7Q09ORklHX0JMS19DR1JPVVA9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eQogQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTEKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjMyY2RhODI0MzMxODMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCkBAIC0wLDAgJiM0MzsxLDMxMCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvbGliYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xvb3AuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c21hY3Jvcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgSU9fU0laRSAoNCAqIDEwMjQgKiAxMDI0KQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlpbnQgZmQsIHJldCA9IDA7CiYjNDM7CXNzaXplX3QgYnl0ZXM7CiYjNDM7CiYjNDM7CWZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkLCAmIzM0O2JwZl9pdGVyX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC0mZ3Q7ZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi8KJiM0MzsJYnl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsICYjMzQ7cmVhZCBmZCYjMzQ7KSkKJiM0MzsJCXJldCA9IDE7CiYjNDM7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBdHRhY2ggYSBsb29wIGRldmljZSB0byBhbiBhbm9ueW1vdXMgdGVtcCBmaWxlIHNvIHdlIGhhdmUgYSByZWFsIGJsb2NrCiYjNDM7ICogZGV2aWNlIHRvIGdlbmVyYXRlIGNncm91cC1jaGFyZ2VkIEkvTyBhZ2FpbnN0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEKJiM0MzsgKiBpZiBsb29wIGRldmljZXMgYXJlIHVuYXZhaWxhYmxlIChub24tcm9vdCAvIG5vIENPTkZJR19CTEtfREVWX0xPT1ApIHNvIHRoZQomIzQzOyAqIGNhbGxlciBjYW4gc2tpcC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsCiYjNDM7CQkgICAgICBpbnQgKmJhY2tfZmQpCiYjNDM7ewomIzQzOwljaGFyIGJhY2tfcGF0aFtdID0gJiMzNDsvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWCYjMzQ7OwomIzQzOwlpbnQgbnI7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSBvcGVuKCYjMzQ7L2Rldi9sb29wLWNvbnRyb2wmIzM0OywgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpjdGxfZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwluciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTsKJiM0MzsJaWYgKG5yICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlzbnByaW50Zihsb29wX3BhdGgsIHN6LCAmIzM0Oy9kZXYvbG9vcCVkJiMzNDssIG5yKTsKJiM0MzsKJiM0MzsJKmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7CiYjNDM7CWlmICgqYmFja19mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJdW5saW5rKGJhY2tfcGF0aCk7CiYjNDM7CWlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJKmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpsb29wX2ZkICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAoaW9jdGwoKmxvb3BfZmQsIExPT1BfU0VUX0ZELCAqYmFja19mZCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7ZXJyOgomIzQzOwlpZiAoKmxvb3BfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKCpsb29wX2ZkKTsKJiM0MzsJaWYgKCpiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqYmFja19mZCk7CiYjNDM7CWNsb3NlKCpjdGxfZmQpOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCwKJiM0MzsJCQkgIGludCBiYWNrX2ZkKQomIzQzO3sKJiM0MzsJaW50IG5yID0gLTE7CiYjNDM7CiYjNDM7CWlmIChsb29wX2ZkICZndDs9IDApIHsKJiM0MzsJCWlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTsKJiM0MzsJCWNsb3NlKGxvb3BfZmQpOwomIzQzOwl9CiYjNDM7CWlmIChiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShiYWNrX2ZkKTsKJiM0MzsJaWYgKGN0bF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpZiAoc3NjYW5mKGxvb3BfcGF0aCwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCAmYW1wO25yKSA9PSAxICZhbXA7JmFtcDsgbnIgJmd0Oz0gMCkKJiM0MzsJCQlpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpOwomIzQzOwkJY2xvc2UoY3RsX2ZkKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBPX0RJUkVDVCBJL08gdG8gdGhlIGxvb3AgZGV2aWNlLCBjaGFyZ2VkIHRvIHRoZSBjdXJyZW50IGNncm91cC4gKi8KJiM0MztzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpCiYjNDM7ewomIzQzOwl2b2lkICpidWY7CiYjNDM7CWludCBmZCwgcmV0ID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fRElSRUNUIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKHBvc2l4X21lbWFsaWduKCZhbXA7YnVmLCA0MDk2LCBJT19TSVpFKSkKJiM0MzsJCWdvdG8gb3V0X2ZkOwomIzQzOwltZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTsKJiM0MzsKJiM0MzsJaWYgKHB3cml0ZShmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKQomIzQzOwkJZ290byBvdXRfYnVmOwomIzQzOwlmc3luYyhmZCk7CiYjNDM7CWlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKQomIzQzOwkJZ290byBvdXRfYnVmOwomIzQzOwlyZXQgPSAwOwomIzQzO291dF9idWY6CiYjNDM7CWZyZWUoYnVmKTsKJiM0MztvdXRfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBQYXJzZSB0aGUgaW8uc3RhdCBsaW5lIGZvciBkZXZpY2UgQGRldiBvdXQgb2YgdGhlIGNncm91cCYjMzk7cyBpby5zdGF0IGZpbGUgYW5kCiYjNDM7ICogZmlsbCBAb3V0LiBAZGV2IGlzIGEga2VybmVsIGRldl90IChhcyByZXR1cm5lZCBieSBicGZfYmxrZ19kZXYpLCB3aG9zZQomIzQzOyAqIG1ham9yOm1pbm9yIHNwbGl0IG1hdGNoZXMgaG93IGlvLnN0YXQgcHJpbnRzIHRoZSBkZXZpY2UuIFJldHVybnMgMCBpZiB0aGUKJiM0MzsgKiBkZXZpY2UmIzM5O3MgbGluZSB3YXMgZm91bmQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgd2FudF9tYWogPSBkZXYgJmd0OyZndDsgMjAsIHdhbnRfbWluID0gZGV2ICZhbXA7ICgoMVUgJmx0OyZsdDsgMjApIC0gMSk7CiYjNDM7CWNoYXIgYnVmWzQwOTZdLCAqbGluZSwgKnNhdmVwdHI7CiYjNDM7CWludCBmZCwgbiwgcmV0ID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gb3BlbmF0KGNncm91cF9mZCwgJiMzNDtpby5zdGF0JiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlpZiAobiAmbHQ7PSAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlidWZbbl0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CiYjNDM7CWZvciAobGluZSA9IHN0cnRva19yKGJ1ZiwgJiMzNDtcbiYjMzQ7LCAmYW1wO3NhdmVwdHIpOyBsaW5lOwomIzQzOwkgICAgIGxpbmUgPSBzdHJ0b2tfcihOVUxMLCAmIzM0O1xuJiMzNDssICZhbXA7c2F2ZXB0cikpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwOwomIzQzOwkJdW5zaWduZWQgaW50IG1haiwgbWluOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSAmIzM0O21hajptaW4mIzM0OyB0b2tlbiBpcyBhbHdheXMgcHJlc2VudDsgdGhlIGZpZWxkIGJsb2NrIGlzCiYjNDM7CQkgKiBvcHRpb25hbCAodGhlIGtlcm5lbCBvbWl0cyBpdCBmb3IgYSBkZXZpY2Ugd2l0aCBubyByZWFkL3dyaXRlCiYjNDM7CQkgKiBJL08pLCBzbyBhIG1hdGNoIG9mICZndDs9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHNzY2FuZihsaW5lLAomIzQzOwkJCSAgICYjMzQ7JXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHUmIzM0OywKJiM0MzsJCQkgICAmYW1wO21haiwgJmFtcDttaW4sICZhbXA7cmIsICZhbXA7d2IsICZhbXA7cmksICZhbXA7d2ksICZhbXA7ZGIsICZhbXA7ZGkpICZsdDsgMikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWlmIChtYWogIT0gd2FudF9tYWogfHwgbWluICE9IHdhbnRfbWluKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSByYjsKJiM0MzsJCW91dC0mZ3Q7d2J5dGVzID0gd2I7CiYjNDM7CQlvdXQtJmd0O3Jpb3MgPSByaTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IHdpOwomIzQzOwkJb3V0LSZndDtkYnl0ZXMgPSBkYjsKJiM0MzsJCW91dC0mZ3Q7ZGlvcyA9IGRpOwomIzQzOwkJcmV0ID0gMDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9jZ3JvdXBfaXRlcl9pbyh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciAqY2dyb3VwX3JlbF9wYXRoID0gJiMzNDsvY2dyb3VwX2l0ZXJfaW9fdGVzdCYjMzQ7OwomIzQzOwlpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xOwomIzQzOwlzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMOwomIzQzOwljaGFyIGxvb3BfcGF0aFs2NF07CiYjNDM7CXN0cnVjdCBpb19xdWVyeSAqcTsKJiM0MzsJaW50IGNncm91cF9mZDsKJiM0MzsKJiM0MzsJY2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgJiMzNDtjZ3JvdXBfc2V0dXBfYW5kX2pvaW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksICZhbXA7Y3RsX2ZkLCAmYW1wO2xvb3BfZmQsICZhbXA7YmFja19mZCkpIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsJLyogbmVlZHMgcm9vdCAmIzQzOyBDT05GSUdfQkxLX0RFVl9MT09QICovCiYjNDM7CQlnb3RvIGNsZWFudXBfY2dyb3VwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb29wOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBQaW4gdGhlIHJlYWQgdG8gdGhlIGxvb3AgZGV2aWNlIHNvIHRoZSBtZWFzdXJlZCBkZXZpY2UgaXMgc3RhYmxlIGFuZAomIzQzOwkgKiBxdWllc2NlZC4gQ29udmVydCB0aGUgZ2xpYmMtZW5jb2RlZCBzdF9yZGV2IHRvIHRoZSBrZXJuZWwgZGV2X3QKJiM0MzsJICogZW5jb2RpbmcgKG1ham9yICZsdDsmbHQ7IDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuCiYjNDM7CSAqLwomIzQzOwl7CiYjNDM7CQlzdHJ1Y3Qgc3RhdCBsc3Q7CiYjNDM7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCAmYW1wO2xzdCksICYjMzQ7ZnN0YXQgbG9vcCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXBfc2tlbDsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O3RhcmdldF9kZXYgPQomIzQzOwkJCSgoX191NjQpbWFqb3IobHN0LnN0X3JkZXYpICZsdDsmbHQ7IDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTsKJiM0MzsJfQomIzQzOwomIzQzOwlERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTsKJiM0MzsJdW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0gewomIzQzOwkJLmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsCiYjNDM7CQkuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSwKJiM0MzsJfTsKJiM0MzsJb3B0cy5saW5rX2luZm8gPSAmYW1wO2xpbmZvOwomIzQzOwlvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pOwomIzQzOwomIzQzOwlsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmNncm91cF9pb19xdWVyeSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssICYjMzQ7YnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CiYjNDM7CS8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovCiYjNDM7CWlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCAmIzM0O2RvX2RpcmVjdF9pbyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9saW5rOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogV2VhayBjaGVjazogd2UgZGlkIEkvTywgc28gdGhlIG51bWJlcnMgbXVzdCBiZSBub24temVyby4gRm9sbG93cyB0aGUKJiM0MzsJICogcGF0dGVybiBpbiBjZ3JvdXBfaXRlcl9tZW1jZy4KJiM0MzsJICovCiYjNDM7CXEgPSAmYW1wO3NrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2lvX3F1ZXJ5OwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX193cml0ZSYjMzQ7KSkgewomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3dieXRlcywgMCwgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7d2lvcywgMCwgJiMzNDt3aW9zJiMzNDspOwomIzQzOwl9CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3JlYWQmIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtyYnl0ZXMsIDAsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3Jpb3MsIDAsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19kZXYmIzM0OykpCiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7ZGV2LCAwLCAmIzM0O2RldiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU3Ryb25nZXIgY2hlY2s6IHRoZSBrZnVuYy1yZWFkIHZhbHVlcyBtdXN0IGVxdWFsIHdoYXQgdGhlIGlvLnN0YXQKJiM0MzsJICogZmlsZSByZXBvcnRzIGZvciB0aGUgc2FtZSBkZXZpY2UuIFJlZnJlc2ggdmlhIHRoZSBwcm9nLCB0aGVuIHJlYWQKJiM0MzsJICogdGhlIGZpbGUgd2l0aCBubyBJL08gaW4gYmV0d2Vlbiwgc28gYm90aCBmbHVzaGVkIHNuYXBzaG90cyBtYXRjaAomIzQzOwkgKiBleGFjdGx5LgomIzQzOwkgKi8KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fbWF0Y2gmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9OwomIzQzOwomIzQzOwkJaWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkJICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS0mZ3Q7ZGV2LCAmYW1wO2ZpbGV2KSwKJiM0MzsJCQkgICAgICAmIzM0O3BhcnNlIGlvLnN0YXQmIzM0OykpIHsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7cmJ5dGVzLCBmaWxldi5yYnl0ZXMsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDt3Ynl0ZXMsIGZpbGV2LndieXRlcywgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3Jpb3MsIGZpbGV2LnJpb3MsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2lvcywgZmlsZXYud2lvcywgJiMzNDt3aW9zJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkYnl0ZXMsIGZpbGV2LmRieXRlcywgJiMzNDtkYnl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O2Rpb3MsIGZpbGV2LmRpb3MsICYjMzQ7ZGlvcyYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTZXBhcmF0ZSBwcm9ncmFtIGZvciB0aGUgcm9vdCBibG9jayBjZ3JvdXAuIEl0cyBjb3VudGVycyBkbyBub3QgY29tZQomIzQzOwkgKiBmcm9tIHJzdGF0LCB0aGV5IGFyZSByZWZpbGxlZCBmcm9tIHRoZSBkaXNrcyB0aGVtc2VsdmVzLCBzbyB0aGlzCiYjNDM7CSAqIGNvdmVycyB0aGUgb3RoZXIgaGFsZiBvZiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhleSBjb3ZlciBldmVyeQomIzQzOwkgKiBjZ3JvdXAmIzM5O3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvCiYjNDM7CSAqIHRoZXkgbXVzdCBiZSBhdCBvciBhYm92ZSB3aGF0IHRoZSB0ZXN0IGNncm91cCB3YXMgY2hhcmdlZC4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3Jvb3QmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rOwomIzQzOwkJc3RydWN0IGlvX3F1ZXJ5ICpyOwomIzQzOwomIzQzOwkJc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfYmxrY2cgPSAwOwomIzQzOwkJcm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmNncm91cF9yb290X2Jsa2NnX3F1ZXJ5LAomIzQzOwkJCQkJCSAgICAgJmFtcDtvcHRzKTsKJiM0MzsJCWlmIChBU1NFUlRfT0tfUFRSKHJvb3RfbGluaywgJiMzNDthdHRhY2ggcm9vdCBpdGVyJiMzNDspKSB7CiYjNDM7CQkJaWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKHJvb3RfbGluayksICYjMzQ7cmVhZCByb290IHN0YXRzJiMzNDspKSB7CiYjNDM7CQkJCXIgPSAmYW1wO3NrZWwtJmd0O2RhdGFfcXVlcnktJmd0O3Jvb3RfcXVlcnk7CiYjNDM7CQkJCUFTU0VSVF9FUShza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtnb3Rfcm9vdF9ibGtjZywgMSwKJiM0MzsJCQkJCSAgJiMzNDtnb3Rfcm9vdF9ibGtjZyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0VRKHItJmd0O2RldiwgcS0mZ3Q7ZGV2LCAmIzM0O3Jvb3QgZGV2JiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2J5dGVzLCBxLSZndDt3Ynl0ZXMsICYjMzQ7cm9vdCB3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDt3aW9zLCBxLSZndDt3aW9zLCAmIzM0O3Jvb3Qgd2lvcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3JieXRlcywgcS0mZ3Q7cmJ5dGVzLCAmIzM0O3Jvb3QgcmJ5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7cmlvcywgcS0mZ3Q7cmlvcywgJiMzNDtyb290IHJpb3MmIzM0Oyk7CiYjNDM7CQkJfQomIzQzOwkJCWJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MztjbGVhbnVwX2xpbms6CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGxpbmspOwomIzQzO2NsZWFudXBfc2tlbDoKJiM0MzsJY2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7Y2xlYW51cF9sb29wOgomIzQzOwlsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTsKJiM0MztjbGVhbnVwX2Nncm91cF9mZDoKJiM0MzsJY2xvc2UoY2dyb3VwX2ZkKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmI4MzlkZWY5NDUwODYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSwxMDcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaW5jbHVkZSAmbHQ7dm1saW51eC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5oJiMzNDsKJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CiYjNDM7CiYjNDM7LyogVGhlIGNvdW50ZXJzIG9mIHRoZSBkZXZpY2UgbmFtZWQgYnkgdGFyZ2V0X2RldiBhcmUgc3RvcmVkIGhlcmUuICovCiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIFRoZSBzYW1lIGRldmljZSYjMzk7cyBjb3VudGVycyByZWFkIHRocm91Z2ggdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiAqLwomIzQzO3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIFNldCB0byAxIGJ5IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5IHdoZW4gYnBmX2dldF9yb290X2Jsa2NnKCkgc3VjY2VlZHMuICovCiYjNDM7X191NjQgZ290X3Jvb3RfYmxrY2cgU0VDKCYjMzQ7LmRhdGEucXVlcnkmIzM0Oyk7CiYjNDM7CiYjNDM7LyogRGV2aWNlIHRvIHJlYWQsIHNldCBieSB1c2Vyc3BhY2UgKGtlcm5lbCBkZXZfdCkuIFBpbm5pbmcgdGhlIGRldmljZSBrZWVwcwomIzQzOyAqIHRoZSByZWFkIGRldGVybWluaXN0aWMgYW5kIGxldHMgdGhlIHZhbHVlIGJlIGNvbXBhcmVkIHRvIGlvLnN0YXQgZXhhY3RseS4KJiM0MzsgKi8KJiM0MztfX3U2NCB0YXJnZXRfZGV2IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogRmx1c2ggQGJsa2NnIGFuZCBjb3B5IHRoZSB0YXJnZXQgZGV2aWNlJiMzOTtzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5CiYjNDM7ICogdGhlIG9uZSBwaW5uZWQgZGV2aWNlIGtlZXBzIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYzogdGhhdCBkZXZpY2UgaXMKJiM0MzsgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyAmIzM0O2FueSBkZXZpY2UKJiM0MzsgKiB3aXRoIEkvTyYjMzQ7IHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay4KJiM0MzsgKi8KJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csCiYjNDM7CQkJCQkgICAgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0MzsKJiM0MzsJLyogaW8uc3RhdCBuZWVkcyBhIGZsdXNoIGJlZm9yZSBpdCBjYW4gYmUgcmVhZCAoc2xlZXBhYmxlKS4gKi8KJiM0MzsJYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKGJsa2NnKTsKJiM0MzsKJiM0MzsJLyogVGhlIHBlci1kZXZpY2UgYmxrZyB3YWxrIG5lZWRzIGFuIFJDVSBzZWN0aW9uLiAqLwomIzQzOwlicGZfcmN1X3JlYWRfbG9jaygpOwomIzQzOwlicGZfZm9yX2VhY2goYmxrZywgcG9zLCBibGtjZykgewomIzQzOwkJaWYgKGJwZl9ibGtnX2Rldihwb3MpICE9IHRhcmdldF9kZXYpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlvdXQtJmd0O2RldiA9IGJwZl9ibGtnX2Rldihwb3MpOwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSBicGZfYmxrZ19pb3N0YXRfYnl0ZXMocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTsKJiM0MzsJCW91dC0mZ3Q7d2J5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfV1JJVEUpOwomIzQzOwkJb3V0LSZndDtyaW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1JFQUQpOwomIzQzOwkJb3V0LSZndDt3aW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTsKJiM0MzsJCW91dC0mZ3Q7ZGJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7CiYjNDM7CQlvdXQtJmd0O2Rpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIucy9jZ3JvdXAmIzM0OykKJiM0MztpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LSZndDtjZ3JvdXA7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CiYjNDM7CS8qIFRoZSBsYXN0IGl0ZXJhdGlvbiBoYXMgYSBOVUxMIGNncm91cCwgc2tpcCBpdC4gKi8KJiM0MzsJaWYgKCFjZ3JwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CS8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqLwomIzQzOwlfX2J1aWx0aW5fbWVtc2V0KCZhbXA7aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpOwomIzQzOwomIzQzOwlibGtjZyA9IGJwZl9nZXRfYmxrY2coJmFtcDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFibGtjZykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWFkX3RhcmdldF9kZXYoYmxrY2csICZhbXA7aW9fcXVlcnkpOwomIzQzOwomIzQzOwlicGZfcHV0X2Jsa2NnKGJsa2NnKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIucy9jZ3JvdXAmIzM0OykKJiM0MztpbnQgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjdHgtJmd0O2Nncm91cDsKJiM0MzsJc3RydWN0IGJsa2NnICpibGtjZzsKJiM0MzsKJiM0MzsJLyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqLwomIzQzOwlpZiAoIWNncnApCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJX19idWlsdGluX21lbXNldCgmYW1wO3Jvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7CiYjNDM7CiYjNDM7CWJsa2NnID0gYnBmX2dldF9yb290X2Jsa2NnKCk7CiYjNDM7CWlmICghYmxrY2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHJvb3QgY2dyb3VwIHRha2VzIGl0cyBudW1iZXJzIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMgcmF0aGVyCiYjNDM7CSAqIHRoYW4gZnJvbSByc3RhdCwgc28gdGhpcyBhbHNvIGNvdmVycyB0aGUgcm9vdCBzaWRlIG9mCiYjNDM7CSAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLiBUaGUgY291bnRlcnMgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTywgc28KJiM0MzsJICogdGhleSBjYW4gb25seSBiZSBhdCBvciBhYm92ZSB3aGF0IHRoaXMgdGVzdCYjMzk7cyBvd24gY2dyb3VwIGRpZC4KJiM0MzsJICovCiYjNDM7CXJlYWRfdGFyZ2V0X2RldihibGtjZywgJmFtcDtyb290X3F1ZXJ5KTsKJiM0MzsKJiM0MzsJZ290X3Jvb3RfYmxrY2cgPSAxOwomIzQzOwlicGZfcHV0X2Jsa2NnKGJsa2NnKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjQ5NAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDMyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipCUEYgS2Z1bmNzIGZvciBCbG9jayBJL08gQ29udHJvbGxlcjogSW5pdGlhbCBUaG91Z2h0cyoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjaW5nIEJQRiBrZnVuY3Mgc3BlY2lmaWNhbGx5IGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIsIGJsa2NnLiBJbnRlcmVzdGluZy4gVGhlIG5ldyBgYmxvY2svYnBmX2Jsa2NnLmNgIGZpbGUgbGF5cyBvdXQgdGhlIGdyb3VuZHdvcmssIHByb3ZpZGluZyBrZnVuY3MgbGlrZSBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBhbmQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uczogYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgLiBQbHVzLCB3ZSBnZXQgYWNjZXNzIHRvIHRob3NlIGNydWNpYWwgYGJwZl9ibGtnX2lvc3RhdF9ieXRlc2AsIGBicGZfYmxrZ19pb3N0YXRfaW9zYCwgYW5kIGBicGZfYmxrZ19kZXZgIGZ1bmN0aW9ucy4gRXNzZW50aWFsbHksIEJQRiBwcm9ncmFtcyBjYW4gbm93IGRpcmVjdGx5IHJlYWQgYSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gVGhpcyBpcyBnb2luZyB0byBiZSB1c2VmdWwuIFRoZSBjaGFuZ2VzIHRvdWNoIGJvdGggdGhlIGNvcmUgYmxvY2sgbGF5ZXIgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLCB3aGljaCBtZWFucyB3ZSB3aWxsIG5lZWQgdG8gdGVzdCBib3RoLgoKTm93LCB0aGlzIHNjcmVhbXMgJiMzNDtmdXp6aW5nIHRhcmdldCYjMzQ7IHRvIG1lLiBHZXR0aW5nIEJQRiB0byByZWxpYWJseSByZWFkIGJsa2NnIGRhdGEgd2lsbCByZXF1aXJlIHNvbWUgc2VyaW91cyB0ZXN0aW5nLiBMZXQmIzM5O3MgbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHJpZ2h0IHNvIHdlIGNhbiBidWlsZCB0aGlzLgoKTGV0JiMzOTtzIGZpbmQgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zLi4uIE9rYXksIGBibG9jay9NYWtlZmlsZWAgZ2l2ZXMgdXMgdGhlIGtleToKCmBgYG1ha2VmaWxlCmlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTApvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJwZl9ibGtjZy5vCmVuZGlmCmBgYAoKU28sIHdlJiMzOTtyZSBkZWZpbml0ZWx5IGxvb2tpbmcgYXQgbmVlZGluZyBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19CTEtfQ0dST1VQYCBlbmFibGVkLiAgTGV0JiMzOTtzIHZlcmlmeSB0aGVyZSBhcmUgbm8gb3RoZXIgZGVwZW5kZW5jaWVzLiBJIG5lZWQgdG8gcnVuIGEgYGdpdCBncmVwYCBjaGVjayBvbiBgQ09ORklHX0JMS19DR1JPVVBgIGluIGBibG9jay9LY29uZmlnYCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQkxLX0NHUk9VUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2Jsb2NrLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtibG9jay9LY29uZmlnPTM5PWNvbmZpZyBCTEtfUlFfQUxMT0NfVElNRVxuLS1cbmJsb2NrL0tjb25maWctNDEtXG5ibG9jay9LY29uZmlnOjQyOmNvbmZpZyBCTEtfQ0dST1VQX1JXU1RBVFxuYmxvY2svS2NvbmZpZy00My1cdGJvb2xcbmJsb2NrL0tjb25maWctNDQtXG5ibG9jay9LY29uZmlnOjQ1OmNvbmZpZyBCTEtfQ0dST1VQX1BVTlRfQklPXG5ibG9jay9LY29uZmlnLTQ2LVx0Ym9vbFxuLS1cbmJsb2NrL0tjb25maWc9MTI3PWNvbmZpZyBCTEtfV0JUX01RXG4tLVxuYmxvY2svS2NvbmZpZy0xMzMtXG5ibG9jay9LY29uZmlnOjEzNDpjb25maWcgQkxLX0NHUk9VUF9JT0xBVEVOQ1lcbmJsb2NrL0tjb25maWctMTM1LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCBmb3IgbGF0ZW5jeSBiYXNlZCBjZ3JvdXAgSU8gcHJvdGVjdGlvblwmIzM0O1xuLS1cbmJsb2NrL0tjb25maWctMTQ0LVxuYmxvY2svS2NvbmZpZzoxNDU6Y29uZmlnIEJMS19DR1JPVVBfRkNfQVBQSURcbmJsb2NrL0tjb25maWctMTQ2LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCB0byB0cmFjayBGQyBJL08gVHJhZmZpYyBhY3Jvc3MgY2dyb3VwIGFwcGxpY2F0aW9uc1wmIzM0O1xuLS1cbmJsb2NrL0tjb25maWctMTUzLVxuYmxvY2svS2NvbmZpZzoxNTQ6Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUXG5ibG9jay9LY29uZmlnLTE1NS1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgZm9yIGNvc3QgbW9kZWwgYmFzZWQgY2dyb3VwIElPIGNvbnRyb2xsZXJcJiMzNDtcbi0tXG5ibG9jay9LY29uZmlnLTE2My1cbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xuYmxvY2svS2NvbmZpZy0xNjUtXHRib29sIFwmIzM0O0Nncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjQwCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUuIE15IGN1cnJlbnQgdHJhaW4gb2YgdGhvdWdodCBzZWVtcyB0byBiZSBzdHVjayBvbiBzb21ldGhpbmcuIEkmIzM5O20gaGl0dGluZyBhIHJvYWRibG9jayBhbmQgbmVlZCB0byBmaW5kIGEgd2F5IGFyb3VuZCBpdC4gKipJbnZlc3RpZ2F0aW5nIEtlcm5lbCBDb25maWd1cmF0aW9uKiouIAoKSSBuZWVkIHRvIHJlZmluZSBteSBzZWFyY2guIFJpZ2h0IG5vdywgSSYjMzk7bSB0aGlua2luZyBJIHNob3VsZCBmb2N1cyBvbiBrZXJuZWwgY29uZmlndXJhdGlvbiwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5IG9uIHNvbWV0aGluZyByZWxhdGVkIHRvIGJsb2NrIGNncm91cHMuIFRvIGJlIHByZWNpc2UsIEkgc2hvdWxkIHRyeSB0byBzZWFyY2ggZm9yIHRoZSBleGFjdCBzdHJpbmc6IGBjb25maWcgQkxLX0NHUk9VUGAuIEhvcGVmdWxseSwgdGhhdCB3aWxsIGxlYWQgbWUgdG8gdGhlIHJlbGV2YW50IHNldHRpbmdzIGFuZCBkb2N1bWVudGF0aW9uIEkgbmVlZC4gVGltZSB0byBnZXQgc3BlY2lmaWMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteY29uZmlnIEJMS19DR1JPVVAkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzgyMAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHN1bW1hcnksIHByZXNlbnRlZCBhcyBhIHN0cmVhbSBvZiB0aG91Z2h0OgoKKipGb2N1c2luZyBJbiBvbiBCbG9jayBDR3JvdXBzKioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBgQkxLX0NHUk9VUGAgaXMgZGVmaW5lZCBvciBjb25maWd1cmVkLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBjaGVjayB0aGUgYGJsb2NrL0tjb25maWdgIGZpbGUuIFRoYXQmIzM5O3MgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQg4oCTIGl0JiMzOTtzIHdoZXJlIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBibG9jayBkZXZpY2VzIHR5cGljYWxseSByZXNpZGUuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSXQmIzM5O3MgdGltZSB0byBkZWx2ZSBpbnRvIHRoZSBLY29uZmlnLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGVzZSBvcHRpb25zIGFyZSBkZXNjcmliZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QkxLX0NHUk9VUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2Jsb2NrL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YmxvY2svS2NvbmZpZz0zOT1jb25maWcgQkxLX1JRX0FMTE9DX1RJTUVcbi0tXG5ibG9jay9LY29uZmlnLTQxLVxuYmxvY2svS2NvbmZpZzo0Mjpjb25maWcgQkxLX0NHUk9VUF9SV1NUQVRcbmJsb2NrL0tjb25maWctNDMtXHRib29sXG5ibG9jay9LY29uZmlnLTQ0LVxuYmxvY2svS2NvbmZpZzo0NTpjb25maWcgQkxLX0NHUk9VUF9QVU5UX0JJT1xuYmxvY2svS2NvbmZpZy00Ni1cdGJvb2xcbi0tXG5ibG9jay9LY29uZmlnPTEwNj1jb25maWcgQkxLX0RFVl9USFJPVFRMSU5HXG5ibG9jay9LY29uZmlnLTEwNy1cdGJvb2wgXCYjMzQ7QmxvY2sgbGF5ZXIgYmlvIHRocm90dGxpbmcgc3VwcG9ydFwmIzM0O1xuYmxvY2svS2NvbmZpZzoxMDg6XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbmJsb2NrL0tjb25maWc6MTA5Olx0c2VsZWN0IEJMS19DR1JPVVBfUldTVEFUXG5ibG9jay9LY29uZmlnLTExMC1cdGhlbHBcbi0tXG5ibG9jay9LY29uZmlnPTEyNz1jb25maWcgQkxLX1dCVF9NUVxuLS1cbmJsb2NrL0tjb25maWctMTMzLVxuYmxvY2svS2NvbmZpZzoxMzQ6Y29uZmlnIEJMS19DR1JPVVBfSU9MQVRFTkNZXG5ibG9jay9LY29uZmlnLTEzNS1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgZm9yIGxhdGVuY3kgYmFzZWQgY2dyb3VwIElPIHByb3RlY3Rpb25cJiMzNDtcbmJsb2NrL0tjb25maWc6MTM2Olx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXG5ibG9jay9LY29uZmlnLTEzNy1cdGhlbHBcbi0tXG5ibG9jay9LY29uZmlnLTE0NC1cbmJsb2NrL0tjb25maWc6MTQ1OmNvbmZpZyBCTEtfQ0dST1VQX0ZDX0FQUElEXG5ibG9jay9LY29uZmlnLTE0Ni1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgdG8gdHJhY2sgRkMgSS9PIFRyYWZmaWMgYWNyb3NzIGNncm91cCBhcHBsaWNhdGlvbnNcJiMzNDtcbmJsb2NrL0tjb25maWc6MTQ3Olx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQIFx1MDAyNlx1MDAyNiBOVk1FX0ZDXG5ibG9jay9LY29uZmlnLTE0OC1cdGhlbHBcbi0tXG5ibG9jay9LY29uZmlnLTE1My1cbmJsb2NrL0tjb25maWc6MTU0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVFxuYmxvY2svS2NvbmZpZy0xNTUtXHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXCYjMzQ7XG5ibG9jay9LY29uZmlnOjE1NjpcdGRlcGVuZHMgb24gQkxLX0NHUk9VUFxuYmxvY2svS2NvbmZpZy0xNTctXHRzZWxlY3QgQkxLX1JRX0FMTE9DX1RJTUVcbi0tXG5ibG9jay9LY29uZmlnLTE2My1cbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xuYmxvY2svS2NvbmZpZy0xNjUtXHRib29sIFwmIzM0O0Nncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1wmIzM0O1xuYmxvY2svS2NvbmZpZzoxNjY6XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbmJsb2NrL0tjb25maWctMTY3LVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0NTg5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGVidWdnaW5nIGEgS2VybmVsLUxldmVsIEJsb2NrIEkvTyBJc3N1ZSoqCgpPa2F5LCBzbyBJJiMzOTttIGtuZWUtZGVlcCBpbiB0aGlzIGJsb2NrIEkvTyBwZXJmb3JtYW5jZSBpc3N1ZSwgYW5kIEkmIzM5O3ZlIGhpdCBhIHNuYWcuIEkmIzM5O20gbG9va2luZyBhdCB0aGUgcmVsZXZhbnQgY29kZSBwYXRoLCBhbmQgSSYjMzk7dmUgZW5jb3VudGVyZWQgYEJMS19DR1JPVVBgLiBOb3csIG15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtXYWl0IGEgbWludXRlLi4uIHdoZXJlICpleGFjdGx5KiBpcyBgQkxLX0NHUk9VUGAgZGVmaW5lZD8mIzM0OyBJdCYjMzk7cyBiZWVuIGEgd2hpbGUgc2luY2UgSSBsYXN0IGxvb2tlZCBhdCB0aGlzIHBhcnQgb2YgdGhlIGtlcm5lbCwgYW5kIHRoZSBjZ3JvdXAgYmxvY2sgSS9PIGludGVncmF0aW9uIGNhbiBiZSB0cmlja3kuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgbWFjcm9zIGFuZCB2YXJpYWJsZXMgaW4gcGxheS4gSSBuZWVkIHRoZSBkZWZpbml0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyBoZXJlLiBJcyBpdCBhIGNvcmUgY2dyb3VwIGNvbnN0YW50PyBJcyBpdCBhIGxvY2FsIGRlZmluaXRpb24gd2l0aGluIHRoZSBibG9jayBsYXllciYjMzk7cyBjZ3JvdXAgaW1wbGVtZW50YXRpb24/IEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBoZWFkZXIgZmlsZSBvciBtb2R1bGUgdGhhdCBkZWNsYXJlcyB0aGlzIGNvbnN0YW50LiBXaXRob3V0IHRoYXQsIEkmIzM5O20gZXNzZW50aWFsbHkgZmx5aW5nIGJsaW5kIGFuZCBjYW4mIzM5O3QgYWNjdXJhdGVseSBhc3Nlc3MgaXRzIHJvbGUgaW4gdGhpcyBwZXJmb3JtYW5jZSBib3R0bGVuZWNrLiBCYWNrIHRvIHRoZSBpbmNsdWRlIHBhdGhzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15tZW51Y29uZmlnIEJMS19DR1JPVVAkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ4NzUKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBwcmVzZW50ZWQgYXMgYSBzdHJlYW0gb2YgdGhvdWdodDoKCioqS2NvbmZpZyBLZXl3b3JkIEh1bnQ6IEJMS19DR1JPVVAqKgoKUmlnaHQsIHRpbWUgdG8gZ2V0IHRvIHdvcmsuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBgQkxLX0NHUk9VUGAgd2l0aGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gSSBrbm93IGl0JiMzOTtzIHJlbGF0ZWQgdG8gY2dyb3VwIGJsb2NrIGRldmljZSBjb250cm9sLCBidXQgSSBuZWVkIGEgZGVmaW5pdGl2ZSBwaWN0dXJlLiBTbywgSSBuZWVkIHRvIGRvIGEgZnVsbCBzZWFyY2guIEkmIzM5O20gZ29pbmcgdG8gc2NhbiAqYWxsKiB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBtZWFucyBhIGNvbXByZWhlbnNpdmUgc2VhcmNoIGFjcm9zcyB0aGUgZW50aXJlIGtlcm5lbCBjb25maWd1cmF0aW9uIHNwYWNlLiBObyBjaGVycnktcGlja2luZywgSSB3YW50IHRoZSBmdWxsIGNvbnRleHQuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlcyBoYXZlIHRvIHNheSBhYm91dCB0aGlzLiBUaGF0IHNlYXJjaCBzaG91bGQgZ2l2ZSBtZSB0aGUgaW5mb3JtYXRpb24gSSBuZWVkLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gZGVwZW5kZW5jaWVzIGFuZCBkZWZhdWx0IHZhbHVlcyBvbmNlIEkgaGF2ZSB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XmNvbmZpZyBCTEtfQ0dST1VQJCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTA5OT1jb25maWcgTUVNQ0dfVjFcbi0tXG5pbml0L0tjb25maWctMTExNS1cbmluaXQvS2NvbmZpZzoxMTE2OmNvbmZpZyBCTEtfQ0dST1VQXG5pbml0L0tjb25maWctMTExNy1cdGJvb2wgXCYjMzQ7SU8gY29udHJvbGxlclwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTE3MAoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKlRyYWNpbmcgYSBDb25maWd1cmF0aW9uIERlcGVuZGVuY3kqKgoKUmlnaHQsIEkmIzM5O20gb250byBzb21ldGhpbmcuLi50aGUgc2V0dGluZyBJJiMzOTttIGFmdGVyIGlzIHByb2JhYmx5IGluIGBpbml0L0tjb25maWdgLiBDbGFzc2ljIHBsYWNlIGZvciBjb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gVGltZSB0byBkaWcgaW4gYW5kIHVuZGVyc3RhbmQgaXRzIGRlcGVuZGVuY2llcy4gTm8gcG9pbnQganVzdCBmbGlwcGluZyBhIHN3aXRjaCBibGluZGx5OyBnb3R0YSBmaWd1cmUgb3V0IHRoZSByYXRpb25hbGUgYmVoaW5kIGl0IGJlaW5nIHNldCB1cCB0aGUgd2F5IGl0IGlzLiBJIG5lZWQgdG8gc2VlICp3aHkqIGl0JiMzOTtzIGNvbmZpZ3VyZWQgdGhlIHdheSBpdCBpcyAtIGFyZSB0aGVyZSBzcGVjaWZpYyBmZWF0dXJlcywga2VybmVsIHZlcnNpb25zLCBvciBoYXJkd2FyZSBjb25maWd1cmF0aW9ucyB0aGF0IHRyaWdnZXIgaXRzIGluY2x1c2lvbj8gSXMgaXQgZ2F0ZWQgb24gc29tZSBlc290ZXJpYyBtZW51IHBhdGg/IEkmIzM5O2xsIG5lZWQgdG8gcmV2ZXJzZS1lbmdpbmVlciBpdHMgaW1wbGljYXRpb25zIHdpdGhpbiB0aGUgYnJvYWRlciBhcmNoaXRlY3R1cmUuIE9rYXksIGxldCYjMzk7cyBmaXJlIHVwIHRoZSBlZGl0b3IgYW5kIHN0YXJ0IHRyYWNpbmcuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJMS19DR1JPVVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTEwOTk9Y29uZmlnIE1FTUNHX1YxXG4tLVxuaW5pdC9LY29uZmlnLTExMTUtXG5pbml0L0tjb25maWc6MTExNjpjb25maWcgQkxLX0NHUk9VUFxuaW5pdC9LY29uZmlnLTExMTctXHRib29sIFwmIzM0O0lPIGNvbnRyb2xsZXJcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU0NTQKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKgoKT2theSwgc28gSSYjMzk7bSB0cnlpbmcgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMgcGFydGljdWxhciBhc3BlY3Qgb2YgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBJJiMzOTttIHRoaW5raW5nLCBgaW5pdC9LY29uZmlnYCBpcyB0aGUgcGxhY2UgdG8gc3RhcnQsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMTE2LiBUaGF0IGFyZWEgbGlrZWx5IGRlYWxzIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvciBhIHBhcnRpY3VsYXIgbW9kdWxlIEkmIzM5O20gaW50ZXJlc3RlZCBpbi4gSSBzaG91bGQgY2hlY2sgdGhhdCBzZWN0aW9uIGZvciB0aGUgcmVsZXZhbnQgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gTGV0JiMzOTtzIHNlZSB3aGF0IGdlbXMgbGllIGluIHdhaXQgaW4gdGhhdCBwb3J0aW9uIG9mIGBLY29uZmlnYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTEwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExMTA6XHRcdCAgUGxlYXNlIG5vdGUgdGhhdCBmZWF0dXJlIHNldCBvZiB0aGUgbGVnYWN5IG1lbW9yeSBjb250cm9sbGVyIGlzIGxpa2VseVxuMTExMTpcdFx0ICBnb2luZyB0byBzaHJpbmsgZHVlIHRvIGRlcHJlY2F0aW9uIHByb2Nlc3MuIE5ldyBkZXBsb3ltZW50cyB3aXRoIHYxXG4xMTEyOlx0XHQgIGNvbnRyb2xsZXIgYXJlIGhpZ2hseSBkaXNjb3VyYWdlZC5cbjExMTM6XHRcbjExMTQ6XHRcdCAgU2F5IE4gaWYgdW5zdXJlLlxuMTExNTpcdFxuMTExNjpcdGNvbmZpZyBCTEtfQ0dST1VQXG4xMTE3Olx0XHRib29sIFwmIzM0O0lPIGNvbnRyb2xsZXJcJiMzNDtcbjExMTg6XHRcdGRlcGVuZHMgb24gQkxPQ0tcbjExMTk6XHRcdGRlZmF1bHQgblxuMTEyMDpcdFx0aGVscFxuMTEyMTpcdFx0R2VuZXJpYyBibG9jayBJTyBjb250cm9sbGVyIGNncm91cCBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlIGNvbW1vblxuMTEyMjpcdFx0Y2dyb3VwIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgdXNlZCBieSB2YXJpb3VzIElPIGNvbnRyb2xsaW5nXG4xMTIzOlx0XHRwb2xpY2llcy5cbjExMjQ6XHRcbjExMjU6XHRcdEN1cnJlbnRseSwgQ0ZRIElPIHNjaGVkdWxlciB1c2VzIGl0IHRvIHJlY29nbml6ZSB0YXNrIGdyb3VwcyBhbmRcbjExMjY6XHRcdGNvbnRyb2wgZGlzayBiYW5kd2lkdGggYWxsb2NhdGlvbiAocHJvcG9ydGlvbmFsIHRpbWUgc2xpY2UgYWxsb2NhdGlvbilcbjExMjc6XHRcdHRvIHN1Y2ggdGFzayBncm91cHMuIEl0IGlzIGFsc28gdXNlZCBieSBiaW8gdGhyb3R0bGluZyBsb2dpYyBpblxuMTEyODpcdFx0YmxvY2sgbGF5ZXIgdG8gaW1wbGVtZW50IHVwcGVyIGxpbWl0IGluIElPIHJhdGVzIG9uIGEgZGV2aWNlLlxuMTEyOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTkxNAoJCQkJCQkJb3V0cHV0OiAyMzcKCQkJCQkJCXRob3VnaHRzOiAyMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBCbG9jayBjZ3JvdXAgQlBGIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBCTEtfQ0dST1VQYCBzdHVmZiwgYW5kIGl0JiMzOTtzIHByZXR0eSBjbGVhciB0aGF0IGl0IGhhcyBhIGRlcGVuZGVuY3kgb24gYEJMT0NLYC4gVGhhdCYjMzk7cyBub3QgdW5leHBlY3RlZCwgYnV0IGdvb2QgdG8ga2VlcCBpbiBtaW5kLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCBjb25maWcgaW5jbHVkZXMgYEJQRl9TWVNDQUxMYCBhbG9uZyB3aXRoIGBCTEtfQ0dST1VQYCDigJMgdGhlc2UgYXJlIG15IGJhc2UgcmVxdWlyZW1lbnRzLgoKTm93LCBsZXQmIzM5O3MgbmFpbCBkb3duIHRoZSBjcml0aWNhbCBwaWVjZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBuZXcgYWRkaXRpb25zIGFuZCBjaGFuZ2VzLiBNeSBmb2N1cyByaWdodCBub3cgaXMgdG8gaWRlbnRpZnkgdGhlIG1haW4gc3ltYm9scyB0aGF0IGRlZmluZSB0aGUgQlBGIGludGVncmF0aW9uIGZvciBibG9jayBjZ3JvdXBzLgoKRnJvbSBgYmxvY2svYnBmX2Jsa2NnLmNgLCB0aGVzZSBhcmUgdGhlIGtleSBmdW5jdGlvbnMgSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kOiBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAsIGBicGZfYmxrZ19pb3N0YXRfYnl0ZXNgLCBgYnBmX2Jsa2dfaW9zdGF0X2lvc2AsIGFuZCBgYnBmX2Jsa2dfZGV2YC4gVGhlc2UgY2xlYXJseSBoYW5kbGUgdGhpbmdzIGxpa2Ugcm9vdCBjZ3JvdXAgYWNjZXNzLCBjZ3JvdXAgbWFuYWdlbWVudCwgc3RhdHMgZmx1c2hpbmcsIGFuZCBpdGVyYXRpb24sIGFzIHdlbGwgYXMgYWNjZXNzaW5nIEkvTyBzdGF0aXN0aWNzIGFuZCB0aGUgZGV2aWNlIGl0c2VsZi4KCkl0IGxvb2tzIGxpa2UgdGhlIGBibGtjZ19maWxsX3Jvb3RfaW9zdGF0c2AgZnVuY3Rpb24gaW4gYGJsb2NrL2Jsay1jZ3JvdXAuY2AgaGFzIGFsc28gYmVlbiBjaGFuZ2VkIHRvIGJlIG5vbi1zdGF0aWMuIEkgbmVlZCB0byBjaGVjayB0aGlzIG91dCwgYXMgbm9uLXN0YXRpYyBsaWtlbHkgaW5kaWNhdGVzIGl0JiMzOTtzIHVzZWQgbW9yZSBicm9hZGx5IG5vdy4KCkkmIzM5O2xsIG1ha2Ugc3VyZSB0byBhZGQgYWxsIG9mIHRoZXNlIGFzICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDsgaW4gbXkgbm90ZXMsIHRvIHRyYWNrIHRoZW0gYXMgSSBkaXZlIGRlZXBlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfZ2V0X3Jvb3RfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX2dldF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfcHV0X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2lvc3RhdF9ieXRlcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfaW9zJiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2RldiYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBUaGVzZSBrZnVuY3MgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBoYW5kbGUgdmFyaW91cyBpbnB1dHMgYW5kIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBzYWZlbHkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfZ2V0X3Jvb3RfYmxrY2cmIzM0OywKICAgICYjMzQ7YnBmX2dldF9ibGtjZyYjMzQ7LAogICAgJiMzNDticGZfcHV0X2Jsa2NnJiMzNDssCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2lvc3RhdF9ieXRlcyYjMzQ7LAogICAgJiMzNDticGZfYmxrZ19pb3N0YXRfaW9zJiMzNDssCiAgICAmIzM0O2JwZl9ibGtnX2RldiYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBUaGVzZSBrZnVuY3MgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBoYW5kbGUgdmFyaW91cyBpbnB1dHMgYW5kIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBzYWZlbHkuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYga2Z1bmNzIHRvIHJlYWQgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzIChpby5zdGF0KS4gSXQgZG9lcyBub3QgYWxsb2NhdGUgbmV3IGNvbXBsZXggc3RydWN0dXJlcywgY29weSBkYXRhIGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UsIG9yIGludHJvZHVjZSBsb2dpYyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGtmdW5jcyByZXR1cm4gc2ltcGxlIHNjYWxhciB2YWx1ZXMgKHU2NCkgb3IgcG9pbnRlcnMgdG8gZXhpc3RpbmcsIGluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzLiBUaGUgQlBGIGl0ZXJhdG9yIHN0YXRlIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gUkNVIG9yIGNncm91cCByZWZlcmVuY2VzLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDJjYTE5YThhMjQ4ODcyODg4ZGUxYTViZTdkNjc4MzhhMmYyYTQyMTcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIxOjAzOjAzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtNjYxNyw2ICYjNDM7NjYxNyw3IEBAIEY6CWJsb2NrL2Jsay1jZ3JvdXAuYwogRjoJYmxvY2svYmxrLWlvY29zdC5jCiBGOglibG9jay9ibGstaW9sYXRlbmN5LmMKIEY6CWJsb2NrL2Jsay10aHJvdHRsZS5jCiYjNDM7RjoJYmxvY2svYnBmX2Jsa2NnLmMKIEY6CWluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oCiAKIENPTlRST0wgR1JPVVAgLSBDUFVTRVQKZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGUKaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDQKLS0tIGEvYmxvY2svTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svTWFrZWZpbGUKQEAgLTE3LDYgJiM0MzsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSAmIzQzOz0gZXJyb3ItaW5qZWN0aW9uLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0JTR19DT01NT04pICYjNDM7PSBic2cubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKQkmIzQzOz0gYnNnLWxpYi5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJsay1jZ3JvdXAubwomIzQzO2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTAomIzQzO29iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYnBmX2Jsa2NnLm8KJiM0MztlbmRpZgogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKQkmIzQzOz0gYmxrLWNncm91cC1yd3N0YXQubwogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICYjNDM7PSBibGstY2dyb3VwLWZjLWFwcGlkLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcpCSYjNDM7PSBibGstdGhyb3R0bGUubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jCmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuYwomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmMKQEAgLTEwODYsNyAmIzQzOzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KQogICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJiMzOTtzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0CiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy4KICAqLwotc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKJiM0Mzt2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpCiB7CiAJc3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7CiAJc3RydWN0IGRldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oCmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaAomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmgKQEAgLTIwNSw2ICYjNDM7MjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKIAkJCSAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTsKIAogY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpOwomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7CiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csCiAJCSAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLAogCQkJCSAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSwKZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNDhhODZmMDdlMTk4YQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2JwZl9ibGtjZy5jCkBAIC0wLDAgJiM0MzsxLDMxNSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7LyoKJiM0MzsgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlLgomIzQzOyAqCiYjNDM7ICogVGhlc2UgbGV0IGEgQlBGIHByb2dyYW0gcmVhZCBhIGNncm91cCYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBBIHByb2dyYW0gdHVybnMgYQomIzQzOyAqIGNncm91cCYjMzk7cyBjc3MgaW50byBhIHN0cnVjdCBibGtjZyB3aXRoIGJwZl9nZXRfYmxrY2coKSwgZmx1c2hlcyB0aGUgc3RhdHMgd2l0aAomIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtncyB3aXRoIHRoZQomIzQzOyAqIGJwZl9pdGVyX2Jsa2cgb3Blbi1jb2RlZCBpdGVyYXRvciwgcmVhZGluZyBlYWNoIGRldmljZSYjMzk7cyBjb3VudGVycyB3aXRoCiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKCkvYnBmX2Jsa2dfaW9zdGF0X2lvcygpLiBJdCBtaXJyb3JzIHRoZSBtZW1vcnkKJiM0MzsgKiBjb250cm9sbGVyIGtmdW5jcyBpbiBtbS9icGZfbWVtY29udHJvbC5jLCBidXQgYWRkcyBhIHBlci1kZXZpY2UgZGltZW5zaW9uOgomIzQzOyAqIHVubGlrZSBtZW1jZywgYmxrY2cga2VlcHMgb25lIGJsa2cgKGFuZCBvbmUgaW8uc3RhdCBsaW5lKSBwZXIgYmxvY2sgZGV2aWNlLgomIzQzOyAqCiYjNDM7ICogVGhpcyBmaWxlIGxpdmVzIGluIGJsb2NrLyBiZWNhdXNlIHRoZSBibGtjZy9ibGtnIHN0cnVjdCBsYXlvdXRzIGFyZSBwcml2YXRlCiYjNDM7ICogdG8gYmxvY2svYmxrLWNncm91cC5oLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7YmxrLWNncm91cC5oJiMzNDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJlZW1wdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9yY3VsaXN0LmgmZ3Q7CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9nZXRfcm9vdF9ibGtjZyAtIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cAomIzQzOyAqCiYjNDM7ICogVGhlIGZ1bmN0aW9uIGhhcyBLRl9BQ1FVSVJFIHNlbWFudGljcywgZXZlbiB0aG91Z2ggdGhlIHJvb3QgYmxvY2sgY2dyb3VwIGlzCiYjNDM7ICogbmV2ZXIgZGVzdHJveWVkIGFuZCBkb2VzbiYjMzk7dCByZXF1aXJlIHJlZmVyZW5jZSBjb3VudGluZy4gSXQmIzM5O3Mgc2FmZSB0byBwYXNzIGl0CiYjNDM7ICogdG8gYnBmX3B1dF9ibGtjZygpLgomIzQzOyAqCiYjNDM7ICogTm90ZSB0aGF0IHRoZSByb290IGNncm91cCBpcyBzcGVjaWFsOiBpdHMgY291bnRlcnMgYXJlIHRoZSBkaXNrcyYjMzk7IG93bgomIzQzOyAqIHN0YXRpc3RpY3MsIHNvIHRoZXkgY292ZXIgZXZlcnkgY2dyb3VwJiMzOTtzIEkvTyByYXRoZXIgdGhhbiBvbmx5IHRoZSByb290JiMzOTtzLgomIzQzOyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X3Jvb3RfYmxrY2codm9pZCkKJiM0Mzt7CiYjNDM7CS8qIGNzc19nZXQoKSBpcyBub3QgbmVlZGVkICovCiYjNDM7CXJldHVybiAmYW1wO2Jsa2NnX3Jvb3Q7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXAKJiM0MzsgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBJdCYjMzk7cyBmaW5lIHRvIHBhc3MgYSBjc3Mgd2hpY2ggYmVsb25ncyB0byBhbnkgY2dyb3VwIGNvbnRyb2xsZXIsCiYjNDM7ICogZS5nLiB1bmlmaWVkIGhpZXJhcmNoeSYjMzk7cyBtYWluIGNzcy4KJiM0MzsgKgomIzQzOyAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IEEgcG9pbnRlciB0byBhIGJsa2NnIHN0cnVjdHVyZSBhZnRlciBidW1waW5nIHRoZSBjb3JyZXNwb25kaW5nIGNzcyYjMzk7cwomIzQzOyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X2Jsa2NnKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnID0gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKGNzcy0mZ3Q7c3MgPT0gJmFtcDtpb19jZ3JwX3N1YnN5cykKJiM0MzsJCXJldHVybiBjc3NfdHJ5Z2V0KGNzcykgPyBjc3NfdG9fYmxrY2coY3NzKSA6IE5VTEw7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFNvbWUgb3RoZXIgY29udHJvbGxlciYjMzk7cyBjc3MsIG9yIHRoZSBjZ3JvdXAmIzM5O3Mgb3duIG9uZS4gTG9vayB1cCB0aGUgaW8KJiM0MzsJICogY29udHJvbGxlciYjMzk7cyBjc3M7IHJjdSBrZWVwcyBpdCBhbGl2ZSBiZXR3ZWVuIHRoZSBsb2FkIGFuZCB0aGUgdHJ5Z2V0LgomIzQzOwkgKiBBY3F1aXJlIGFuZCByZWxlYXNlIHJjdSBvbiBvbmUgc3RyYWlnaHQgcGF0aCwgc28gdGhhdCBibG9jay8mIzM5O3MgbG9jawomIzQzOwkgKiBjb250ZXh0IGFuYWx5c2lzIGNhbiBmb2xsb3cgaXQuCiYjNDM7CSAqLwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CWNzcyA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoY3NzLSZndDtjZ3JvdXAtJmd0O3N1YnN5c1tpb19jZ3JwX2lkXSk7CiYjNDM7CWlmIChjc3MgJmFtcDsmYW1wOyBjc3NfdHJ5Z2V0KGNzcykpCiYjNDM7CQlibGtjZyA9IGNzc190b19ibGtjZyhjc3MpOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGJsa2NnOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHV0X2Jsa2NnIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgYmxvY2sgY2dyb3VwCiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAgdG8gcmVsZWFzZQomIzQzOyAqCiYjNDM7ICogUmVsZWFzZXMgYSBwcmV2aW91c2x5IGFjcXVpcmVkIGJsa2NnIHJlZmVyZW5jZS4KJiM0MzsgKiBJbXBsZW1lbnRzIEtGX1JFTEVBU0Ugc2VtYW50aWNzLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX3B1dF9ibGtjZyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKQomIzQzO3sKJiM0MzsJY3NzX3B1dCgmYW1wO2Jsa2NnLSZndDtjc3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMgLSBGbHVzaCBhIGJsb2NrIGNncm91cCYjMzk7cyBpbyBzdGF0aXN0aWNzCiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAKJiM0MzsgKgomIzQzOyAqIENhbGwgdGhpcyBiZWZvcmUgcmVhZGluZyBjb3VudGVycyBmb3IgdXAtdG8tZGF0ZSB2YWx1ZXMuIFNsZWVwYWJsZS4KJiM0MzsgKgomIzQzOyAqIEl0IGRvZXMgd2hhdCByZWFkaW5nIHRoZSBpby5zdGF0IGZpbGUgZG9lcywgd2hpY2ggZGlmZmVycyBieSBjZ3JvdXAuIEZvciBhCiYjNDM7ICogbm9uLXJvb3QgY2dyb3VwIGl0IGZvbGRzIHRoZSBwZXItY3B1IGRlbHRhcyBpbnRvIHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXMKJiM0MzsgKiBhbmQgdXAgdGhlIGNncm91cCB0cmVlLiBUaGUgcm9vdCBjZ3JvdXAgaXMgbm90IGFjY291bnRlZCB0aHJvdWdoIHJzdGF0IGF0CiYjNDM7ICogYWxsLCBzbyBmb3IgaXQgdGhlIHBlci1kZXZpY2UgYWdncmVnYXRlcyBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MmIzM5OwomIzQzOyAqIG93biBzdGF0aXN0aWNzLCB3aGljaCBjb3VudCBldmVyeSBjZ3JvdXAmIzM5O3MgSS9PLgomIzQzOyAqCiYjNDM7ICogVGhlIHJvb3QgYnJhbmNoIGlzIG5vdCBzZWxmLWxpbWl0aW5nIHRoZSB3YXkgdGhlIHJzdGF0IG9uZSBpczogaXQgcmVyZWFkcwomIzQzOyAqIGV2ZXJ5IGRpc2sgb24gZXZlcnkgY2FsbCwgd2hpbGUgYSBzZWNvbmQgcnN0YXQgZmx1c2ggZmluZHMgbm90aGluZyBsZWZ0IHRvCiYjNDM7ICogZm9sZC4gVGhlIG51bWJlcnMgaXQgcHJvZHVjZXMgYXJlIHRoZSBzYW1lIGZvciBldmVyeSBjZ3JvdXAsIHNvIHJlYWQgdGhlbQomIzQzOyAqIG9uY2UgcmF0aGVyIHRoYW4gb25jZSBwZXIgY2dyb3VwIG9mIGEgd2Fsay4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKQomIzQzO3sKJiM0MzsJaWYgKCFibGtjZy0mZ3Q7Y3NzLnBhcmVudCkKJiM0MzsJCWJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7CiYjNDM7CWVsc2UKJiM0MzsJCWNzc19yc3RhdF9mbHVzaCgmYW1wO2Jsa2NnLSZndDtjc3MpOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzJdOwomIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gewomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnOwomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0Mzt9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzCiYjNDM7ICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplCiYjNDM7ICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrCiYjNDM7ICoKJiM0MzsgKiBFYWNoIHlpZWxkZWQgYmxrZyBob2xkcyBvbmUgYmxvY2sgZGV2aWNlJiMzOTtzIGNvdW50ZXJzLCB0aGUgc2FtZSBvbmVzIGJlaGluZCBhCiYjNDM7ICogcGVyLWRldmljZSBsaW5lIG9mIHRoZSBpby5zdGF0IGZpbGUuIE9mZmxpbmUgYmxrZ3MgYXJlIHNraXBwZWQsIGFzIHRoZSBmaWxlCiYjNDM7ICogc2tpcHMgdGhlbS4gT25lIGNhc2UgZGlmZmVyczogdGhlIGZpbGUgcHJpbnRzIG5vIGxpbmUgZm9yIGEgYmxrZyB3aG9zZSBkaXNrCiYjNDM7ICogaXMgZ29uZSwgd2hpbGUgdGhlIHdhbGsgc3RpbGwgeWllbGRzIGl0LCBhbmQgYnBmX2Jsa2dfZGV2KCkgcmV0dXJucyAwIGZvcgomIzQzOyAqIGl0LiBNdXN0IGJlIHVzZWQgaW5zaWRlIGFuIFJDVSByZWFkIHNlY3Rpb24uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfYmxrZ19uZXcoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0LCBzdHJ1Y3QgYmxrY2cgKmJsa2NnKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAmZ3Q7IHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpOwomIzQzOwlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgIT0KJiM0MzsJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTsKJiM0MzsKJiM0MzsJa2l0LSZndDtibGtjZyA9IGJsa2NnOwomIzQzOwlraXQtJmd0O3BvcyA9IE5VTEw7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cAomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC0mZ3Q7cG9zOwomIzQzOwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKJiM0MzsKJiM0MzsJLyogQ2xlYXJlZCBvbmNlIHRoZSB3YWxrIGlzIGRvbmUsIHNlZSBiZWxvdy4gKi8KJiM0MzsJaWYgKCFraXQtJmd0O2Jsa2NnKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmICghYmxrZykKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KCZhbXA7a2l0LSZndDtibGtjZy0mZ3Q7YmxrZ19saXN0KSk7CiYjNDM7CWVsc2UKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CiYjNDM7CS8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi8KJiM0MzsJd2hpbGUgKG5vZGUpIHsKJiM0MzsJCWJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpOwomIzQzOwkJaWYgKGJsa2ctJmd0O29ubGluZSkgewomIzQzOwkJCWtpdC0mZ3Q7cG9zID0gYmxrZzsKJiM0MzsJCQlyZXR1cm4gYmxrZzsKJiM0MzsJCX0KJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRm9yZ2V0IHRoZSBsaXN0IGhlYWQgYXMgd2VsbC4gVGhlIHZlcmlmaWVyIGFzc3VtZXMgdGhhdCBhbiBpdGVyYXRvcgomIzQzOwkgKiB3aGljaCByZXR1cm5lZCBOVUxMIGtlZXBzIHJldHVybmluZyBOVUxMLCBhbmQgc3RvcHMgY2hlY2tpbmcgdGhlCiYjNDM7CSAqIGxvb3AgZm9yIHRlcm1pbmF0aW9uIG9uY2UgaXQgaGFzOyBzdGFydGluZyB0aGUgd2FsayBvdmVyIHdvdWxkIGxldAomIzQzOwkgKiBzdWNoIGEgbG9vcCBzcGluIGZvcmV2ZXIuCiYjNDM7CSAqLwomIzQzOwlraXQtJmd0O3BvcyA9IE5VTEw7CiYjNDM7CWtpdC0mZ3Q7YmxrY2cgPSBOVUxMOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvcgomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJiMzOTtzIGZsdXNoZWQgaW8uc3RhdCBhZ2dyZWdhdGUuIEBjb3VudGVycyBpcyBvbmUKJiM0MzsgKiBvZiB0aGUgdHdvIGFycmF5cyBpbiBibGtnLSZndDtpb3N0YXQuY3VyOyBib3RoIGFyZSBndWFyZGVkIGJ5IHRoYXQgc3RydWN0JiMzOTtzCiYjNDM7ICogc2VxbG9jaywgdGhlIG9uZSB0aGUgaW8uc3RhdCBmaWxlIHVzZXMuIFJldHVybnMgKHU2NCktMSBpZiB0aGUgY291bnRlcgomIzQzOyAqIGNhbm5vdCBiZSByZWFkLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1NjQgYmxrZ19pb3N0YXRfcmVhZChzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csIGNvbnN0IHU2NCAqY291bnRlcnMsCiYjNDM7CQkJICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibGtnX2lvc3RhdF9zZXQgKmJpcyA9ICZhbXA7YmxrZy0mZ3Q7aW9zdGF0OwomIzQzOwl1bnNpZ25lZCBpbnQgc2VxOwomIzQzOwl1NjQgdmFsOwomIzQzOwomIzQzOwlpZiAoKHVuc2lnbmVkIGludClydyAmZ3Q7PSBCTEtHX0lPU1RBVF9OUikKJiM0MzsJCXJldHVybiAodTY0KS0xOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPbiAzMi1iaXQgdGhlIGxvb3AgYmVsb3cgcmVhbGx5IGlzIGEgc2VxY291bnQgcmV0cnkgbG9vcC4gRXZlcnkKJiM0MzsJICogd3JpdGVyIG9mIGJsa2ctJmd0O2lvc3RhdCBrZWVwcyBpbnRlcnJ1cHRzIG9mZiwgc28gb25seSBhbiBOTUkgY2FuIGxhbmQKJiM0MzsJICogaW5zaWRlIGFuIHVwZGF0ZSwgYW5kIHRoZW4gdGhlIGxvb3Agd291bGQgbmV2ZXIgZW5kLiBUaGVzZSBrZnVuY3MKJiM0MzsJICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvCiYjNDM7CSAqIGdpdmUgdXAgcmF0aGVyIHRoYW4gc3Bpbi4gT24gNjQtYml0IHRoZSBsb29wIGNvbXBpbGVzIGF3YXkuCiYjNDM7CSAqLwomIzQzOwlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmYW1wOyZhbXA7IGluX25taSgpKQomIzQzOwkJcmV0dXJuICh1NjQpLTE7CiYjNDM7CiYjNDM7CWRvIHsKJiM0MzsJCXNlcSA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbigmYW1wO2Jpcy0mZ3Q7c3luYyk7CiYjNDM7CQl2YWwgPSBjb3VudGVyc1tyd107CiYjNDM7CX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeSgmYW1wO2Jpcy0mZ3Q7c3luYywgc2VxKSk7CiYjNDM7CiYjNDM7CXJldHVybiB2YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9ibGtnX2lvc3RhdF9ieXRlcyAtIFJlYWQgYSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBieXRlIGNvdW50ZXIKJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAgKG9uZSBkZXZpY2Ugb2YgYSBibG9jayBjZ3JvdXApCiYjNDM7ICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpCiYjNDM7ICoKJiM0MzsgKiBSZWFkcyB0aGUgZmx1c2hlZCBhZ2dyZWdhdGUsIHNvIGNhbGwgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkgZmlyc3QgZm9yCiYjNDM7ICogdXAtdG8tZGF0ZSB2YWx1ZXMuIFRoZSByZWFkIHVzZXMgdGhlIHU2NF9zdGF0cyBzZXFsb2NrLCBsaWtlIHRoZSBpby5zdGF0CiYjNDM7ICogZmlsZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG51bWJlciBvZiBieXRlcywgb3IgKHU2NCktMSBpZiBAcncgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZQomIzQzOyAqIGNvdW50ZXIgY2Fubm90IGJlIHJlYWQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdTY0IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csCiYjNDM7CQkJCSAgICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydykKJiM0Mzt7CiYjNDM7CXJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctJmd0O2lvc3RhdC5jdXIuYnl0ZXMsIHJ3KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2dfaW9zdGF0X2lvcyAtIFJlYWQgYSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBJL08gY291bnQKJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAgKG9uZSBkZXZpY2Ugb2YgYSBibG9jayBjZ3JvdXApCiYjNDM7ICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgSS9Pcywgb3IgKHU2NCktMSBpZiBAcncgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZQomIzQzOyAqIGNvdW50ZXIgY2Fubm90IGJlIHJlYWQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdTY0IGJwZl9ibGtnX2lvc3RhdF9pb3Moc3RydWN0IGJsa2NnX2dxICpibGtnLAomIzQzOwkJCQkgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KQomIzQzO3sKJiM0MzsJcmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5pb3MsIHJ3KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2dfZGV2IC0gUmV0dXJuIGEgYmxrZyYjMzk7cyBkZXZpY2UgaWQKJiM0MzsgKiBAYmxrZzogYmxvY2sgZ3JvdXAKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIGRldmljZSYjMzk7cyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2cKJiM0MzsgKiBoYXMgbm8gZGlzay4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZykKJiM0Mzt7CiYjNDM7CWlmICghYmxrZy0mZ3Q7cSB8fCAhYmxrZy0mZ3Q7cS0mZ3Q7ZGlzaykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gYmxrZy0mZ3Q7cS0mZ3Q7ZGlzay0mZ3Q7cGFydDAtJmd0O2JkX2RldjsKJiM0Mzt9CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKJiM0MzsKJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wdXRfYmxrY2csIEtGX1JFTEVBU0UpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKQomIzQzOwomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSkKJiM0MzsKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfZGV2LCBLRl9SQ1UpCiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHsKJiM0MzsJLm93bmVyCQk9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0CQk9ICZhbXA7YnBmX2Jsa2NnX2tmdW5jcywKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLAomIzQzOwkJCQkJJmFtcDticGZfYmxrY2dfa2Z1bmNfc2V0KTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxuJiMzNDssIGVycik7CiYjNDM7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmgKQEAgLTAsMCAmIzQzOzEsMTcgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaWZuZGVmIF9fQ0dST1VQX0lURVJfSU9fSAomIzQzOyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHsKJiM0MzsJLyogb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzICovCiYjNDM7CV9fdTY0IHJieXRlczsKJiM0MzsJX191NjQgd2J5dGVzOwomIzQzOwlfX3U2NCByaW9zOwomIzQzOwlfX3U2NCB3aW9zOwomIzQzOwlfX3U2NCBkYnl0ZXM7CiYjNDM7CV9fdTY0IGRpb3M7CiYjNDM7CV9fdTY0IGRldjsJLyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovCiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwppbmRleCBlYTcwNDRmMzBhZGMzLi4yNzBlNmJmOTE5NGQyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKQEAgLTEsMyAmIzQzOzEsNCBAQAomIzQzO0NPTkZJR19CTEtfQ0dST1VQPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXkKIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQz0xCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zMmNkYTgyNDMzMTgzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSwzMTAgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2xpYmJwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9sb29wLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zeXNtYWNyb3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9pdGVyX2lvLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfc3RhdHMoc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJaW50IGZkLCByZXQgPSAwOwomIzQzOwlzc2l6ZV90IGJ5dGVzOwomIzQzOwomIzQzOwlmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZCwgJiMzNDticGZfaXRlcl9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogUmVzdWx0cyBsYW5kIGluIHNrZWwtJmd0O2RhdGFfcXVlcnk7IHRoZSByZWFkIGl0c2VsZiByZXR1cm5zIG5vIGRhdGEuICovCiYjNDM7CWJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCAmIzM0O3JlYWQgZmQmIzM0OykpCiYjNDM7CQlyZXQgPSAxOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQXR0YWNoIGEgbG9vcCBkZXZpY2UgdG8gYW4gYW5vbnltb3VzIHRlbXAgZmlsZSBzbyB3ZSBoYXZlIGEgcmVhbCBibG9jawomIzQzOyAqIGRldmljZSB0byBnZW5lcmF0ZSBjZ3JvdXAtY2hhcmdlZCBJL08gYWdhaW5zdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xCiYjNDM7ICogaWYgbG9vcCBkZXZpY2VzIGFyZSB1bmF2YWlsYWJsZSAobm9uLXJvb3QgLyBubyBDT05GSUdfQkxLX0RFVl9MT09QKSBzbyB0aGUKJiM0MzsgKiBjYWxsZXIgY2FuIHNraXAuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLAomIzQzOwkJICAgICAgaW50ICpiYWNrX2ZkKQomIzQzO3sKJiM0MzsJY2hhciBiYWNrX3BhdGhbXSA9ICYjMzQ7L3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFgmIzM0OzsKJiM0MzsJaW50IG5yOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gb3BlbigmIzM0Oy9kZXYvbG9vcC1jb250cm9sJiMzNDssIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqY3RsX2ZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbnIgPSBpb2N0bCgqY3RsX2ZkLCBMT09QX0NUTF9HRVRfRlJFRSk7CiYjNDM7CWlmIChuciAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJc25wcmludGYobG9vcF9wYXRoLCBzeiwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCBucik7CiYjNDM7CiYjNDM7CSpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpOwomIzQzOwlpZiAoKmJhY2tfZmQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CXVubGluayhiYWNrX3BhdGgpOwomIzQzOwlpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CSpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqbG9vcF9mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO2VycjoKJiM0MzsJaWYgKCpsb29wX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqbG9vcF9mZCk7CiYjNDM7CWlmICgqYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoKmJhY2tfZmQpOwomIzQzOwljbG9zZSgqY3RsX2ZkKTsKJiM0MzsJKmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBsb29wX3RlYXJkb3duKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCwgaW50IGN0bF9mZCwgaW50IGxvb3BfZmQsCiYjNDM7CQkJICBpbnQgYmFja19mZCkKJiM0Mzt7CiYjNDM7CWludCBuciA9IC0xOwomIzQzOwomIzQzOwlpZiAobG9vcF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpb2N0bChsb29wX2ZkLCBMT09QX0NMUl9GRCwgMCk7CiYjNDM7CQljbG9zZShsb29wX2ZkKTsKJiM0MzsJfQomIzQzOwlpZiAoYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoYmFja19mZCk7CiYjNDM7CWlmIChjdGxfZmQgJmd0Oz0gMCkgewomIzQzOwkJaWYgKHNzY2FuZihsb29wX3BhdGgsICYjMzQ7L2Rldi9sb29wJWQmIzM0OywgJmFtcDtucikgPT0gMSAmYW1wOyZhbXA7IG5yICZndDs9IDApCiYjNDM7CQkJaW9jdGwoY3RsX2ZkLCBMT09QX0NUTF9SRU1PVkUsIG5yKTsKJiM0MzsJCWNsb3NlKGN0bF9mZCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogT19ESVJFQ1QgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgY2hhcmdlZCB0byB0aGUgY3VycmVudCBjZ3JvdXAuICovCiYjNDM7c3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKQomIzQzO3sKJiM0MzsJdm9pZCAqYnVmOwomIzQzOwlpbnQgZmQsIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0RJUkVDVCB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWlmIChwb3NpeF9tZW1hbGlnbigmYW1wO2J1ZiwgNDA5NiwgSU9fU0laRSkpCiYjNDM7CQlnb3RvIG91dF9mZDsKJiM0MzsJbWVtc2V0KGJ1ZiwgMHhhYiwgSU9fU0laRSk7CiYjNDM7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJZnN5bmMoZmQpOwomIzQzOwlpZiAocHJlYWQoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJcmV0ID0gMDsKJiM0MztvdXRfYnVmOgomIzQzOwlmcmVlKGJ1Zik7CiYjNDM7b3V0X2ZkOgomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUGFyc2UgdGhlIGlvLnN0YXQgbGluZSBmb3IgZGV2aWNlIEBkZXYgb3V0IG9mIHRoZSBjZ3JvdXAmIzM5O3MgaW8uc3RhdCBmaWxlIGFuZAomIzQzOyAqIGZpbGwgQG91dC4gQGRldiBpcyBhIGtlcm5lbCBkZXZfdCAoYXMgcmV0dXJuZWQgYnkgYnBmX2Jsa2dfZGV2KSwgd2hvc2UKJiM0MzsgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlCiYjNDM7ICogZGV2aWNlJiMzOTtzIGxpbmUgd2FzIGZvdW5kLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcGFyc2VfaW9fc3RhdChpbnQgY2dyb3VwX2ZkLCBfX3U2NCBkZXYsIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2ICZndDsmZ3Q7IDIwLCB3YW50X21pbiA9IGRldiAmYW1wOyAoKDFVICZsdDsmbHQ7IDIwKSAtIDEpOwomIzQzOwljaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyOwomIzQzOwlpbnQgZmQsIG4sIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW5hdChjZ3JvdXBfZmQsICYjMzQ7aW8uc3RhdCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJaWYgKG4gJmx0Oz0gMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnVmW25dID0gJiMzOTtcMCYjMzk7OwomIzQzOwomIzQzOwlmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsICYjMzQ7XG4mIzM0OywgJmFtcDtzYXZlcHRyKTsgbGluZTsKJiM0MzsJICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgJiMzNDtcbiYjMzQ7LCAmYW1wO3NhdmVwdHIpKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGxvbmcgcmIgPSAwLCB3YiA9IDAsIHJpID0gMCwgd2kgPSAwLCBkYiA9IDAsIGRpID0gMDsKJiM0MzsJCXVuc2lnbmVkIGludCBtYWosIG1pbjsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGUgJiMzNDttYWo6bWluJiMzNDsgdG9rZW4gaXMgYWx3YXlzIHByZXNlbnQ7IHRoZSBmaWVsZCBibG9jayBpcwomIzQzOwkJICogb3B0aW9uYWwgKHRoZSBrZXJuZWwgb21pdHMgaXQgZm9yIGEgZGV2aWNlIHdpdGggbm8gcmVhZC93cml0ZQomIzQzOwkJICogSS9PKSwgc28gYSBtYXRjaCBvZiAmZ3Q7PSAyIGlzIGVub3VnaCBhbmQgYWJzZW50IGZpZWxkcyBzdGF5IDAuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChzc2NhbmYobGluZSwKJiM0MzsJCQkgICAmIzM0OyV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1JiMzNDssCiYjNDM7CQkJICAgJmFtcDttYWosICZhbXA7bWluLCAmYW1wO3JiLCAmYW1wO3diLCAmYW1wO3JpLCAmYW1wO3dpLCAmYW1wO2RiLCAmYW1wO2RpKSAmbHQ7IDIpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCW91dC0mZ3Q7cmJ5dGVzID0gcmI7CiYjNDM7CQlvdXQtJmd0O3dieXRlcyA9IHdiOwomIzQzOwkJb3V0LSZndDtyaW9zID0gcmk7CiYjNDM7CQlvdXQtJmd0O3dpb3MgPSB3aTsKJiM0MzsJCW91dC0mZ3Q7ZGJ5dGVzID0gZGI7CiYjNDM7CQlvdXQtJmd0O2Rpb3MgPSBkaTsKJiM0MzsJCXJldCA9IDA7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgKmNncm91cF9yZWxfcGF0aCA9ICYjMzQ7L2Nncm91cF9pdGVyX2lvX3Rlc3QmIzM0OzsKJiM0MzsJaW50IGN0bF9mZCA9IC0xLCBsb29wX2ZkID0gLTEsIGJhY2tfZmQgPSAtMTsKJiM0MzsJc3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDsKJiM0MzsJc3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDsKJiM0MzsJY2hhciBsb29wX3BhdGhbNjRdOwomIzQzOwlzdHJ1Y3QgaW9fcXVlcnkgKnE7CiYjNDM7CWludCBjZ3JvdXBfZmQ7CiYjNDM7CiYjNDM7CWNncm91cF9mZCA9IGNncm91cF9zZXR1cF9hbmRfam9pbihjZ3JvdXBfcmVsX3BhdGgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsICYjMzQ7Y2dyb3VwX3NldHVwX2FuZF9qb2luJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCAmYW1wO2N0bF9mZCwgJmFtcDtsb29wX2ZkLCAmYW1wO2JhY2tfZmQpKSB7CiYjNDM7CQl0ZXN0X19za2lwKCk7CS8qIG5lZWRzIHJvb3QgJiM0MzsgQ09ORklHX0JMS19ERVZfTE9PUCAqLwomIzQzOwkJZ290byBjbGVhbnVwX2Nncm91cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwlza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbG9vcDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUGluIHRoZSByZWFkIHRvIHRoZSBsb29wIGRldmljZSBzbyB0aGUgbWVhc3VyZWQgZGV2aWNlIGlzIHN0YWJsZSBhbmQKJiM0MzsJICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90CiYjNDM7CSAqIGVuY29kaW5nIChtYWpvciAmbHQ7Jmx0OyAyMCB8IG1pbm9yKSB0aGF0IGJwZl9ibGtnX2RldiByZXR1cm5zLgomIzQzOwkgKi8KJiM0MzsJewomIzQzOwkJc3RydWN0IHN0YXQgbHN0OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgJmFtcDtsc3QpLCAmIzM0O2ZzdGF0IGxvb3AmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CQlza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDt0YXJnZXRfZGV2ID0KJiM0MzsJCQkoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSAmbHQ7Jmx0OyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJREVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7CiYjNDM7CXVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHsKJiM0MzsJCS5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLAomIzQzOwkJLmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksCiYjNDM7CX07CiYjNDM7CW9wdHMubGlua19pbmZvID0gJmFtcDtsaW5mbzsKJiM0MzsJb3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTsKJiM0MzsKJiM0MzsJbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfaW9fcXVlcnksICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCAmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9za2VsOwomIzQzOwomIzQzOwkvKiBUaGlzIHByb2Nlc3MgaXMgaW4gdGhlIHRlc3QgY2dyb3VwLCBzbyB0aGUgbG9vcCBJL08gaXMgY2hhcmdlZCBoZXJlLiAqLwomIzQzOwlpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgJiMzNDtkb19kaXJlY3RfaW8mIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xpbms7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFdlYWsgY2hlY2s6IHdlIGRpZCBJL08sIHNvIHRoZSBudW1iZXJzIG11c3QgYmUgbm9uLXplcm8uIEZvbGxvd3MgdGhlCiYjNDM7CSAqIHBhdHRlcm4gaW4gY2dyb3VwX2l0ZXJfbWVtY2cuCiYjNDM7CSAqLwomIzQzOwlxID0gJmFtcDtza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtpb19xdWVyeTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fd3JpdGUmIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDt3Ynl0ZXMsIDAsICYjMzQ7d2J5dGVzJiMzNDspOwomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3dpb3MsIDAsICYjMzQ7d2lvcyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19yZWFkJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7cmJ5dGVzLCAwLCAmIzM0O3JieXRlcyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtyaW9zLCAwLCAmIzM0O3Jpb3MmIzM0Oyk7CiYjNDM7CX0KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fZGV2JiMzNDspKQomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O2RldiwgMCwgJiMzNDtkZXYmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFN0cm9uZ2VyIGNoZWNrOiB0aGUga2Z1bmMtcmVhZCB2YWx1ZXMgbXVzdCBlcXVhbCB3aGF0IHRoZSBpby5zdGF0CiYjNDM7CSAqIGZpbGUgcmVwb3J0cyBmb3IgdGhlIHNhbWUgZGV2aWNlLiBSZWZyZXNoIHZpYSB0aGUgcHJvZywgdGhlbiByZWFkCiYjNDM7CSAqIHRoZSBmaWxlIHdpdGggbm8gSS9PIGluIGJldHdlZW4sIHNvIGJvdGggZmx1c2hlZCBzbmFwc2hvdHMgbWF0Y2gKJiM0MzsJICogZXhhY3RseS4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX21hdGNoJiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgaW9fcXVlcnkgZmlsZXYgPSB7fTsKJiM0MzsKJiM0MzsJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJCSAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtJmd0O2RldiwgJmFtcDtmaWxldiksCiYjNDM7CQkJICAgICAgJiMzNDtwYXJzZSBpby5zdGF0JiMzNDspKSB7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3JieXRlcywgZmlsZXYucmJ5dGVzLCAmIzM0O3JieXRlcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2J5dGVzLCBmaWxldi53Ynl0ZXMsICYjMzQ7d2J5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtyaW9zLCBmaWxldi5yaW9zLCAmIzM0O3Jpb3MmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3dpb3MsIGZpbGV2Lndpb3MsICYjMzQ7d2lvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7ZGJ5dGVzLCBmaWxldi5kYnl0ZXMsICYjMzQ7ZGJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkaW9zLCBmaWxldi5kaW9zLCAmIzM0O2Rpb3MmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWUKJiM0MzsJICogZnJvbSByc3RhdCwgdGhleSBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcywgc28gdGhpcwomIzQzOwkgKiBjb3ZlcnMgdGhlIG90aGVyIGhhbGYgb2YgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZXkgY292ZXIgZXZlcnkKJiM0MzsJICogY2dyb3VwJiMzOTtzIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGFuZCBvbmx5IHRoaXMgdGVzdCB0b3VjaGVzIGl0LCBzbwomIzQzOwkgKiB0aGV5IG11c3QgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGUgdGVzdCBjZ3JvdXAgd2FzIGNoYXJnZWQuCiYjNDM7CSAqLwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19yb290JiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluazsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSAqcjsKJiM0MzsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2dvdF9yb290X2Jsa2NnID0gMDsKJiM0MzsJCXJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSwKJiM0MzsJCQkJCQkgICAgICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssICYjMzQ7YXR0YWNoIHJvb3QgaXRlciYjMzQ7KSkgewomIzQzOwkJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhyb290X2xpbmspLCAmIzM0O3JlYWQgcm9vdCBzdGF0cyYjMzQ7KSkgewomIzQzOwkJCQlyID0gJmFtcDtza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtyb290X3F1ZXJ5OwomIzQzOwkJCQlBU1NFUlRfRVEoc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfYmxrY2csIDEsCiYjNDM7CQkJCQkgICYjMzQ7Z290X3Jvb3RfYmxrY2cmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9FUShyLSZndDtkZXYsIHEtJmd0O2RldiwgJiMzNDtyb290IGRldiYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3dieXRlcywgcS0mZ3Q7d2J5dGVzLCAmIzM0O3Jvb3Qgd2J5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2lvcywgcS0mZ3Q7d2lvcywgJiMzNDtyb290IHdpb3MmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDtyYnl0ZXMsIHEtJmd0O3JieXRlcywgJiMzNDtyb290IHJieXRlcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3Jpb3MsIHEtJmd0O3Jpb3MsICYjMzQ7cm9vdCByaW9zJiMzNDspOwomIzQzOwkJCX0KJiM0MzsJCQlicGZfbGlua19fZGVzdHJveShyb290X2xpbmspOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7Y2xlYW51cF9saW5rOgomIzQzOwlicGZfbGlua19fZGVzdHJveShsaW5rKTsKJiM0MztjbGVhbnVwX3NrZWw6CiYjNDM7CWNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpOwomIzQzO2NsZWFudXBfbG9vcDoKJiM0MzsJbG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7CiYjNDM7Y2xlYW51cF9jZ3JvdXBfZmQ6CiYjNDM7CWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iODM5ZGVmOTQ1MDg2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMKQEAgLTAsMCAmIzQzOzEsMTA3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovCiYjNDM7I2luY2x1ZGUgJmx0O3ZtbGludXguaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfY29yZV9yZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uaCYjMzQ7CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwomIzQzOwomIzQzOy8qIFRoZSBjb3VudGVycyBvZiB0aGUgZGV2aWNlIG5hbWVkIGJ5IHRhcmdldF9kZXYgYXJlIHN0b3JlZCBoZXJlLiAqLwomIzQzO3N0cnVjdCBpb19xdWVyeSBpb19xdWVyeSBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBUaGUgc2FtZSBkZXZpY2UmIzM5O3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi8KJiM0MztzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBTZXQgdG8gMSBieSBjZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSB3aGVuIGJwZl9nZXRfcm9vdF9ibGtjZygpIHN1Y2NlZWRzLiAqLwomIzQzO19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIERldmljZSB0byByZWFkLCBzZXQgYnkgdXNlcnNwYWNlIChrZXJuZWwgZGV2X3QpLiBQaW5uaW5nIHRoZSBkZXZpY2Uga2VlcHMKJiM0MzsgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuCiYjNDM7ICovCiYjNDM7X191NjQgdGFyZ2V0X2RldiBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSYjMzk7cyBjb3VudGVycyBpbnRvIEBvdXQuIFJlYWRpbmcgb25seQomIzQzOyAqIHRoZSBvbmUgcGlubmVkIGRldmljZSBrZWVwcyB0aGUgcmVzdWx0IGRldGVybWluaXN0aWM6IHRoYXQgZGV2aWNlIGlzCiYjNDM7ICogcXVpZXNjZWQsIHNvIGl0cyBjb3VudGVycyBtYXRjaCBpby5zdGF0IGV4YWN0bHksIHdoaWxlIHBpY2tpbmcgJiMzNDthbnkgZGV2aWNlCiYjNDM7ICogd2l0aCBJL08mIzM0OyB3b3VsZCByYWNlIHdpdGggYmFja2luZy1zdG9yZSB3cml0ZWJhY2suCiYjNDM7ICovCiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgYmxrY2cgKmJsa2NnLAomIzQzOwkJCQkJICAgIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpwb3M7CiYjNDM7CiYjNDM7CS8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovCiYjNDM7CWJwZl9ibGtjZ19mbHVzaF9zdGF0cyhibGtjZyk7CiYjNDM7CiYjNDM7CS8qIFRoZSBwZXItZGV2aWNlIGJsa2cgd2FsayBuZWVkcyBhbiBSQ1Ugc2VjdGlvbi4gKi8KJiM0MzsJYnBmX3JjdV9yZWFkX2xvY2soKTsKJiM0MzsJYnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgYmxrY2cpIHsKJiM0MzsJCWlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJb3V0LSZndDtkZXYgPSBicGZfYmxrZ19kZXYocG9zKTsKJiM0MzsJCW91dC0mZ3Q7cmJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7CiYjNDM7CQlvdXQtJmd0O3dieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTsKJiM0MzsJCW91dC0mZ3Q7cmlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9XUklURSk7CiYjNDM7CQlvdXQtJmd0O2RieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpOwomIzQzOwkJb3V0LSZndDtkaW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJYnBmX3JjdV9yZWFkX3VubG9jaygpOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycCA9IGN0eC0mZ3Q7Y2dyb3VwOwomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnOwomIzQzOwomIzQzOwkvKiBUaGUgbGFzdCBpdGVyYXRpb24gaGFzIGEgTlVMTCBjZ3JvdXAsIHNraXAgaXQuICovCiYjNDM7CWlmICghY2dycCkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBTdGFydCBmcmVzaCBzbyBhIGRldmljZSB0aGF0IGlzIG5vdCBmb3VuZCBzdGF5cyBhbGwtemVyby4gKi8KJiM0MzsJX19idWlsdGluX21lbXNldCgmYW1wO2lvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTsKJiM0MzsKJiM0MzsJYmxrY2cgPSBicGZfZ2V0X2Jsa2NnKCZhbXA7Y2dycC0mZ3Q7c2VsZik7CiYjNDM7CWlmICghYmxrY2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmVhZF90YXJnZXRfZGV2KGJsa2NnLCAmYW1wO2lvX3F1ZXJ5KTsKJiM0MzsKJiM0MzsJYnBmX3B1dF9ibGtjZyhibGtjZyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LSZndDtjZ3JvdXA7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CiYjNDM7CS8qIFRoZSBsYXN0IGl0ZXJhdGlvbiBoYXMgYSBOVUxMIGNncm91cCwgc2tpcCBpdC4gKi8KJiM0MzsJaWYgKCFjZ3JwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CV9fYnVpbHRpbl9tZW1zZXQoJmFtcDtyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpOwomIzQzOwomIzQzOwlibGtjZyA9IGJwZl9nZXRfcm9vdF9ibGtjZygpOwomIzQzOwlpZiAoIWJsa2NnKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSByb290IGNncm91cCB0YWtlcyBpdHMgbnVtYmVycyBmcm9tIHRoZSBkaXNrcyB0aGVtc2VsdmVzIHJhdGhlcgomIzQzOwkgKiB0aGFuIGZyb20gcnN0YXQsIHNvIHRoaXMgYWxzbyBjb3ZlcnMgdGhlIHJvb3Qgc2lkZSBvZgomIzQzOwkgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhlIGNvdW50ZXJzIGNvdmVyIGV2ZXJ5IGNncm91cCYjMzk7cyBJL08sIHNvCiYjNDM7CSAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QmIzM5O3Mgb3duIGNncm91cCBkaWQuCiYjNDM7CSAqLwomIzQzOwlyZWFkX3RhcmdldF9kZXYoYmxrY2csICZhbXA7cm9vdF9xdWVyeSk7CiYjNDM7CiYjNDM7CWdvdF9yb290X2Jsa2NnID0gMTsKJiM0MzsJYnBmX3B1dF9ibGtjZyhibGtjZyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNDkxCgkJCQkJCQlvdXRwdXQ6IDE2OQoJCQkJCQkJdGhvdWdodHM6IDEzNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogQmxvY2sgQ2dyb3VwIEJQRiBLZnVuY3MqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIFRoZSBwYXRjaCBmb2N1c2VzIG9uIGludHJvZHVjaW5nIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgKGJsa2NnKSBJL08gc3RhdGlzdGljcywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuCgpGaXJzdCwgSSBuZWVkIHRvIGV2YWx1YXRlIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBXZSYjMzk7cmUgYWRkaW5nIGZ1bmN0aW9ucyBsaWtlIGBicGZfZ2V0X3Jvb3RfYmxrY2dgLCBgYnBmX2dldF9ibGtjZ2AsIGBicGZfcHV0X2Jsa2NnYCwgYW5kIG90aGVycywgYWxsIGRlYWxpbmcgd2l0aCByZWFkaW5nIGRhdGEgZnJvbSBleGlzdGluZyBrZXJuZWwgc3RydWN0dXJlcyBsaWtlIGBzdHJ1Y3QgYmxrY2dgLCBgc3RydWN0IGJsa2NnX2dxYCwgYW5kIGBzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0YC4gVGhlIGNyaXRpY2FsIHF1ZXN0aW9uIGlzLCBhcmUgdGhlc2Uga2Z1bmNzIHJldHVybmluZyB1bmluaXRpYWxpemVkIHZhbHVlcyB0byB0aGUgQlBGIHByb2dyYW1zPwoKVGhlIGtmdW5jcyByZXR1cm4gZWl0aGVyIGB1NjRgIHZhbHVlcyBvciBwb2ludGVycyB0byBrZXJuZWwgc3RydWN0dXJlcy4gQlBGIHByb2dyYW1zIHRoZW4gcmVhZCB0aGVzZSByZXR1cm5lZCB2YWx1ZXMuIEkgbmVlZCB0byBwaW5wb2ludCBpZiB0aGVyZSBhcmUgYW55IGluc3RhbmNlcyB3aGVyZSB0aGUga2Z1bmNzIGFyZSBwdWxsaW5nIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFuZCBwYXNzaW5nIHRoZW0gYmFjayB0byBCUEYgcHJvZ3JhbXMuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBsb29raW5nIGF0IGBicGZfYmxrZ19pb3N0YXRfYnl0ZXNgIGFuZCBgYnBmX2Jsa2dfaW9zdGF0X2lvc2AsIHdoaWNoIHJlYWQgZnJvbSBgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5ieXRlc2AgYW5kIGBibGtnLSZndDtpb3N0YXQuY3VyLmlvc2AsIGJvdGggYXJyYXlzIG9mIGB1NjRgLiBBbHNvLCBgYnBmX2Jsa2dfZGV2YCB0aGF0IHJldHVybnMgYGJsa2ctJmd0O3EtJmd0O2Rpc2stJmd0O3BhcnQwLSZndDtiZF9kZXZgIHdoaWNoIGlzIGEgYGRldl90YCDigJMgZWl0aGVyIGB1MzJgIG9yIGB1NjRgLgoKVGhlIHBhdGNoIGFsc28gaGFzIGEgc2VsZnRlc3QsIHNvIEkmIzM5O2xsIGNoZWNrIHRoYXQuCgpOb3csIGxldCYjMzk7cyBkaWcgaW50byBgYnBmX2l0ZXJfYmxrZ19uZXdgIGFuZCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gU3RhbmRhcmQgQlBGIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uLiBUaGUgdmVyaWZpZXIgaW4gQlBGIGVuc3VyZXMgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIGBicGZfaXRlcl9ibGtnX25ld2AuIEl0IGluaXRpYWxpemVzIGBraXQtJmd0O2Jsa2NnYCBhbmQgYGtpdC0mZ3Q7cG9zYC4gTm8gaXNzdWVzIGhlcmUgYXMgdGhlIGl0ZXJhdG9yIHN0YXRlIGlzIG1hbmFnZWQgYnkgdGhlIEJQRiBpbmZyYXN0cnVjdHVyZS4KCk9rYXksIG5leHQgY29uY2VybjogYXJlIHRoZXJlIGFueSBpbnN0YW5jZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgY29waWVkIHRvIHVzZXIgc3BhY2U/IEJQRiBwcm9ncmFtcyByZWFkIGNvdW50ZXJzIGFuZCBzdG9yZSB0aGVtIGluIGdsb2JhbCB2YXJpYWJsZXMgKGBpb19xdWVyeWAsIGByb290X3F1ZXJ5YCksIHdoaWNoIGFyZSB0aGVuIGFjY2Vzc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIHRoZSBCUEYgc2tlbGV0b24uIFRoZXNlIGNvdW50ZXJzIGFyZSBleHRyYWN0ZWQgZnJvbSBgYmxrZy0mZ3Q7aW9zdGF0LmN1ci5ieXRlc2AgYW5kIGBibGtnLSZndDtpb3N0YXQuY3VyLmlvc2AsIGJ1dCB0aGVzZSBhcmUgdXBkYXRlZCBieSB0aGUgYmxvY2sgbGF5ZXIsIGFuZCBzaG91bGQgYmUgZnVsbHkgaW5pdGlhbGl6ZWQuCgpUaGVuLCBhcmUgdGhlcmUgYW55IGRpcmVjdCB0cmFuc21pc3Npb25zIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2U/IE5vLCB0aGlzIHBhdGNoIG9ubHkgZXhwb3NlcyBCUEYga2Z1bmNzLCB3aGljaCBhcmUgdGhlbiBjYWxsZWQgYnkgQlBGIHByb2dyYW1zLiBUaGVzZSBrZnVuY3MgcmV0dXJuIGB1NjRgIG9yIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gYGNvcHlfdG9fdXNlcmAgY2FsbHMsIGFuZCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIGFuZCBzZW50IGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UuIFRoZSBpdGVyYXRvciBzdGF0ZSBpcyBhIDE2LWJ5dGUgc3RydWN0dXJlLCB3aGljaCBpcyBmdWxseSBpbml0aWFsaXplZCBkdXJpbmcgYGJwZl9pdGVyX2Jsa2dfbmV3YC4KCkZ1cnRoZXJtb3JlLCBJIGhhdmUgdG8gY29uc2lkZXIgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBtaWdodCBkZXBlbmQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGJlY2F1c2UgdGhlIHZhcmlhYmxlcyBhcmUgZWl0aGVyIHBvaW50ZXJzIGZyb20gdGhlIEJQRiBjb250ZXh0IG9yIHJlYWQgZnJvbSBleGlzdGluZyBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4KClRoZXJlZm9yZSwgdGhlIGxpa2VsaWhvb2Qgb2YgdGhpcyBwYXRjaCBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvcm1hdGlvbiBsZWFrcyBpcyBleHRyZW1lbHkgbG93LiBLQVNBTiBhbmQgc3RhbmRhcmQgdG9vbHMgc2hvdWxkIHN1ZmZpY2UgdG8gZGV0ZWN0IGFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHN0ZW1taW5nIGZyb20gaW5jb3JyZWN0IGBjc3NfdHJ5Z2V0YCBvciBSQ1UgdXNhZ2UsIGlmIGFueS4gSSBzdGlsbCB3YW50IHRvIGRvdWJsZSBjaGVjayBgYmxrZ19pb3N0YXRfcmVhZGAgdGhvdWdoOgoKTG9va2luZyBhdCB0aGUgY29kZSwgaXQmIzM5O3MganVzdCByZWFkaW5nIGB1NjRgIHZhbHVlcyBmcm9tIGBjb3VudGVyc1tyd11gLiBUaGUgYm91bmRzIGFyZSBjaGVja2VkIGFnYWluc3QgYEJMS0dfSU9TVEFUX05SYCwgc28gaXQmIzM5O3Mgc2FmZS4KCk15IGNvbmNsdXNpb24/ICoqTmVlZHNLTVNBTiA9IGZhbHNlLioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIGJ1dCBpdCBkb2VzbiYjMzk7dCBkbyBhbnl0aGluZyB0aGF0IGNyZWF0ZXMgYSBzdHJvbmcgbmVlZCBmb3IgS01TQU4uIFRoZXJlJiMzOTtzIG5vIGNyZWF0aW9uIG9mIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIG5vIGRpcmVjdCBkYXRhIGNvcHkgdG8gdXNlciBzcGFjZSwgYW5kIG5vIGxvZ2ljIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBTdGFuZGFyZCBtZW1vcnkgc2FmZXR5IHRvb2xzIHN1Y2ggYXMgS0FTQU4gYXJlIGVub3VnaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYga2Z1bmNzIHRvIHJlYWQgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzIChpby5zdGF0KS4gSXQgZG9lcyBub3QgYWxsb2NhdGUgbmV3IGNvbXBsZXggc3RydWN0dXJlcywgY29weSBkYXRhIGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UsIG9yIGludHJvZHVjZSBsb2dpYyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGtmdW5jcyByZXR1cm4gc2ltcGxlIHNjYWxhciB2YWx1ZXMgKHU2NCkgb3IgcG9pbnRlcnMgdG8gZXhpc3RpbmcsIGluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzLiBUaGUgQlBGIGl0ZXJhdG9yIHN0YXRlIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gUkNVIG9yIGNncm91cCByZWZlcmVuY2VzLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MgKGlvLnN0YXQpLiBJdCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgY29tcGxleCBzdHJ1Y3R1cmVzLCBjb3B5IGRhdGEgZGlyZWN0bHkgdG8gdXNlciBzcGFjZSwgb3IgaW50cm9kdWNlIGxvZ2ljIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUga2Z1bmNzIHJldHVybiBzaW1wbGUgc2NhbGFyIHZhbHVlcyAodTY0KSBvciBwb2ludGVycyB0byBleGlzdGluZywgaW5pdGlhbGl6ZWQga2VybmVsIHN0cnVjdHVyZXMuIFRoZSBCUEYgaXRlcmF0b3Igc3RhdGUgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcywgc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgcmVsYXRlZCB0byBSQ1Ugb3IgY2dyb3VwIHJlZmVyZW5jZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MDQuMTg2NzE0OTY0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQ2MjQ1MjEzMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJMS19DR1JPVVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfZ2V0X3Jvb3RfYmxrY2dcIixcbiAgICBcImJwZl9nZXRfYmxrY2dcIixcbiAgICBcImJwZl9wdXRfYmxrY2dcIixcbiAgICBcImJwZl9ibGtjZ19mbHVzaF9zdGF0c1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXdcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19kZXN0cm95XCIsXG4gICAgXCJicGZfYmxrZ19pb3N0YXRfYnl0ZXNcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9pb3NcIixcbiAgICBcImJwZl9ibGtnX2RldlwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIHRoZSBibG9jayBJL08gY29udHJvbGxlciAoYmxrY2cpIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzowNC4xODY3MTk4MDRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyMDU2MjI0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDJjYTE5YThhMjQ4ODcyODg4ZGUxYTViZTdkNjc4MzhhMmYyYTQyMTdcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXFxuaW5kZXggMmY5NDcyYzFhMDkwNy4uODdjNTZlOTU1NTc3MSAxMDA2NDRcXG4tLS0gYS9NQUlOVEFJTkVSU1xcbisrKyBiL01BSU5UQUlORVJTXFxuQEAgLTY2MTcsNiArNjYxNyw3IEBAIEY6XFx0YmxvY2svYmxrLWNncm91cC5jXFxuIEY6XFx0YmxvY2svYmxrLWlvY29zdC5jXFxuIEY6XFx0YmxvY2svYmxrLWlvbGF0ZW5jeS5jXFxuIEY6XFx0YmxvY2svYmxrLXRocm90dGxlLmNcXG4rRjpcXHRibG9jay9icGZfYmxrY2cuY1xcbiBGOlxcdGluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oXFxuIFxcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcXG5pbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NFxcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXFxuKysrIGIvYmxvY2svTWFrZWZpbGVcXG5AQCAtMTcsNiArMTcsOSBAQCBvYmotJChDT05GSUdfQkxLX0VSUk9SX0lOSkVDVElPTikgKz0gZXJyb3ItaW5qZWN0aW9uLm9cXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgKz0gYnNnLm9cXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKVxcdCs9IGJzZy1saWIub1xcbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUClcXHQrPSBibGstY2dyb3VwLm9cXG4raWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQKVxcdCs9IGJwZl9ibGtjZy5vXFxuK2VuZGlmXFxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcXHQrPSBibGstY2dyb3VwLXJ3c3RhdC5vXFxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX0ZDX0FQUElEKSArPSBibGstY2dyb3VwLWZjLWFwcGlkLm9cXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcXHQrPSBibGstdGhyb3R0bGUub1xcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmNcXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuY1xcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xcbkBAIC0xMDg2LDcgKzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxcbiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAncyBzdGF0cyBieSBleHBsaWNpdGx5IGZpbGxpbmcgaW4gdGhlIGlvc3RhdFxcbiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy5cXG4gICovXFxuLXN0YXRpYyB2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXFxuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcXG4ge1xcbiBcXHRzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjtcXG4gXFx0c3RydWN0IGRldmljZSAqZGV2O1xcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmhcXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaFxcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxcbkBAIC0yMDUsNiArMjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcXG4gXFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpO1xcbiBcXG4gY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpO1xcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpO1xcbiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csXFxuIFxcdFxcdCAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLFxcbiBcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBibGtnX3BvbGljeV9kYXRhICosIGludCksXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjQ4YTg2ZjA3ZTE5OGFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvYmxvY2svYnBmX2Jsa2NnLmNcXG5AQCAtMCwwICsxLDMxNSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxcbisvKlxcbisgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlLlxcbisgKlxcbisgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcXG4rICogY2dyb3VwJ3MgY3NzIGludG8gYSBzdHJ1Y3QgYmxrY2cgd2l0aCBicGZfZ2V0X2Jsa2NnKCksIGZsdXNoZXMgdGhlIHN0YXRzIHdpdGhcXG4rICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCksIHRoZW4gd2Fsa3MgdGhlIGNncm91cCdzIHBlci1kZXZpY2UgYmxrZ3Mgd2l0aCB0aGVcXG4rICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJ3MgY291bnRlcnMgd2l0aFxcbisgKiBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoKS9icGZfYmxrZ19pb3N0YXRfaW9zKCkuIEl0IG1pcnJvcnMgdGhlIG1lbW9yeVxcbisgKiBjb250cm9sbGVyIGtmdW5jcyBpbiBtbS9icGZfbWVtY29udHJvbC5jLCBidXQgYWRkcyBhIHBlci1kZXZpY2UgZGltZW5zaW9uOlxcbisgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cXG4rICpcXG4rICogVGhpcyBmaWxlIGxpdmVzIGluIGJsb2NrLyBiZWNhdXNlIHRoZSBibGtjZy9ibGtnIHN0cnVjdCBsYXlvdXRzIGFyZSBwcml2YXRlXFxuKyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXFwiYmxrLWNncm91cC5oXFxcIlxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJlZW1wdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcmN1bGlzdC5oXFx1MDAzZVxcbitcXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbitcXG4rLyoqXFxuKyAqIGJwZl9nZXRfcm9vdF9ibGtjZyAtIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cFxcbisgKlxcbisgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXNcXG4rICogbmV2ZXIgZGVzdHJveWVkIGFuZCBkb2Vzbid0IHJlcXVpcmUgcmVmZXJlbmNlIGNvdW50aW5nLiBJdCdzIHNhZmUgdG8gcGFzcyBpdFxcbisgKiB0byBicGZfcHV0X2Jsa2NnKCkuXFxuKyAqXFxuKyAqIE5vdGUgdGhhdCB0aGUgcm9vdCBjZ3JvdXAgaXMgc3BlY2lhbDogaXRzIGNvdW50ZXJzIGFyZSB0aGUgZGlza3MnIG93blxcbisgKiBzdGF0aXN0aWNzLCBzbyB0aGV5IGNvdmVyIGV2ZXJ5IGNncm91cCdzIEkvTyByYXRoZXIgdGhhbiBvbmx5IHRoZSByb290J3MuXFxuKyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuXFxuKyAqXFxuKyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSByb290IGJsb2NrIGNncm91cC5cXG4rICovXFxuK19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZyAqYnBmX2dldF9yb290X2Jsa2NnKHZvaWQpXFxuK3tcXG4rXFx0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cXG4rXFx0cmV0dXJuIFxcdTAwMjZibGtjZ19yb290O1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2dldF9ibGtjZyAtIEdldCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cFxcbisgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXFxuKyAqXFxuKyAqIEl0J3MgZmluZSB0byBwYXNzIGEgY3NzIHdoaWNoIGJlbG9uZ3MgdG8gYW55IGNncm91cCBjb250cm9sbGVyLFxcbisgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5J3MgbWFpbiBjc3MuXFxuKyAqXFxuKyAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXFxuKyAqXFxuKyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgYmxrY2cgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3NzJ3NcXG4rICogcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwgaWYgdGhlIGlvIGNvbnRyb2xsZXIgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNncm91cC5cXG4rICovXFxuK19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZyAqYnBmX2dldF9ibGtjZyhzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbit7XFxuK1xcdHN0cnVjdCBibGtjZyAqYmxrY2cgPSBOVUxMO1xcbitcXG4rXFx0aWYgKGNzcy1cXHUwMDNlc3MgPT0gXFx1MDAyNmlvX2NncnBfc3Vic3lzKVxcbitcXHRcXHRyZXR1cm4gY3NzX3RyeWdldChjc3MpID8gY3NzX3RvX2Jsa2NnKGNzcykgOiBOVUxMO1xcbitcXG4rXFx0LypcXG4rXFx0ICogU29tZSBvdGhlciBjb250cm9sbGVyJ3MgY3NzLCBvciB0aGUgY2dyb3VwJ3Mgb3duIG9uZS4gTG9vayB1cCB0aGUgaW9cXG4rXFx0ICogY29udHJvbGxlcidzIGNzczsgcmN1IGtlZXBzIGl0IGFsaXZlIGJldHdlZW4gdGhlIGxvYWQgYW5kIHRoZSB0cnlnZXQuXFxuK1xcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLydzIGxvY2tcXG4rXFx0ICogY29udGV4dCBhbmFseXNpcyBjYW4gZm9sbG93IGl0LlxcbitcXHQgKi9cXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNzcy1cXHUwMDNlY2dyb3VwLVxcdTAwM2VzdWJzeXNbaW9fY2dycF9pZF0pO1xcbitcXHRpZiAoY3NzIFxcdTAwMjZcXHUwMDI2IGNzc190cnlnZXQoY3NzKSlcXG4rXFx0XFx0YmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTtcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcbitcXHRyZXR1cm4gYmxrY2c7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfcHV0X2Jsa2NnIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgYmxvY2sgY2dyb3VwXFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcXG4rICpcXG4rICogUmVsZWFzZXMgYSBwcmV2aW91c2x5IGFjcXVpcmVkIGJsa2NnIHJlZmVyZW5jZS5cXG4rICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX3B1dF9ibGtjZyhzdHJ1Y3QgYmxrY2cgKmJsa2NnKVxcbit7XFxuK1xcdGNzc19wdXQoXFx1MDAyNmJsa2NnLVxcdTAwM2Vjc3MpO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAncyBpbyBzdGF0aXN0aWNzXFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwXFxuKyAqXFxuKyAqIENhbGwgdGhpcyBiZWZvcmUgcmVhZGluZyBjb3VudGVycyBmb3IgdXAtdG8tZGF0ZSB2YWx1ZXMuIFNsZWVwYWJsZS5cXG4rICpcXG4rICogSXQgZG9lcyB3aGF0IHJlYWRpbmcgdGhlIGlvLnN0YXQgZmlsZSBkb2VzLCB3aGljaCBkaWZmZXJzIGJ5IGNncm91cC4gRm9yIGFcXG4rICogbm9uLXJvb3QgY2dyb3VwIGl0IGZvbGRzIHRoZSBwZXItY3B1IGRlbHRhcyBpbnRvIHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXNcXG4rICogYW5kIHVwIHRoZSBjZ3JvdXAgdHJlZS4gVGhlIHJvb3QgY2dyb3VwIGlzIG5vdCBhY2NvdW50ZWQgdGhyb3VnaCByc3RhdCBhdFxcbisgKiBhbGwsIHNvIGZvciBpdCB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzIGFyZSByZWZpbGxlZCBmcm9tIHRoZSBkaXNrcydcXG4rICogb3duIHN0YXRpc3RpY3MsIHdoaWNoIGNvdW50IGV2ZXJ5IGNncm91cCdzIEkvTy5cXG4rICpcXG4rICogVGhlIHJvb3QgYnJhbmNoIGlzIG5vdCBzZWxmLWxpbWl0aW5nIHRoZSB3YXkgdGhlIHJzdGF0IG9uZSBpczogaXQgcmVyZWFkc1xcbisgKiBldmVyeSBkaXNrIG9uIGV2ZXJ5IGNhbGwsIHdoaWxlIGEgc2Vjb25kIHJzdGF0IGZsdXNoIGZpbmRzIG5vdGhpbmcgbGVmdCB0b1xcbisgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXFxuKyAqIG9uY2UgcmF0aGVyIHRoYW4gb25jZSBwZXIgY2dyb3VwIG9mIGEgd2Fsay5cXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXFxuK3tcXG4rXFx0aWYgKCFibGtjZy1cXHUwMDNlY3NzLnBhcmVudClcXG4rXFx0XFx0YmxrY2dfZmlsbF9yb290X2lvc3RhdHMoKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRjc3NfcnN0YXRfZmx1c2goXFx1MDAyNmJsa2NnLVxcdTAwM2Vjc3MpO1xcbit9XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XFxuK1xcdF9fdTY0IF9fb3BhcXVlWzJdO1xcbit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcXG4rXFxuK3N0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4ge1xcbitcXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXFxuKyAqIEBpdDogaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZVxcbisgKiBAYmxrY2c6IGJsb2NrIGNncm91cCB3aG9zZSBkZXZpY2VzIHRvIHdhbGtcXG4rICpcXG4rICogRWFjaCB5aWVsZGVkIGJsa2cgaG9sZHMgb25lIGJsb2NrIGRldmljZSdzIGNvdW50ZXJzLCB0aGUgc2FtZSBvbmVzIGJlaGluZCBhXFxuKyAqIHBlci1kZXZpY2UgbGluZSBvZiB0aGUgaW8uc3RhdCBmaWxlLiBPZmZsaW5lIGJsa2dzIGFyZSBza2lwcGVkLCBhcyB0aGUgZmlsZVxcbisgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2tcXG4rICogaXMgZ29uZSwgd2hpbGUgdGhlIHdhbGsgc3RpbGwgeWllbGRzIGl0LCBhbmQgYnBmX2Jsa2dfZGV2KCkgcmV0dXJucyAwIGZvclxcbisgKiBpdC4gTXVzdCBiZSB1c2VkIGluc2lkZSBhbiBSQ1UgcmVhZCBzZWN0aW9uLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXFx1MDAzZSBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcXG4rXFx0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XFxuK1xcdFxcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcXG4rXFxuK1xcdGtpdC1cXHUwMDNlYmxrY2cgPSBibGtjZztcXG4rXFx0a2l0LVxcdTAwM2Vwb3MgPSBOVUxMO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXFxuKyAqIEBpdDogaXRlcmF0b3JcXG4rICpcXG4rICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFx0c3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LVxcdTAwM2Vwb3M7XFxuK1xcdHN0cnVjdCBobGlzdF9ub2RlICpub2RlO1xcbitcXG4rXFx0LyogQ2xlYXJlZCBvbmNlIHRoZSB3YWxrIGlzIGRvbmUsIHNlZSBiZWxvdy4gKi9cXG4rXFx0aWYgKCFraXQtXFx1MDAzZWJsa2NnKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdGlmICghYmxrZylcXG4rXFx0XFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoXFx1MDAyNmtpdC1cXHUwMDNlYmxrY2ctXFx1MDAzZWJsa2dfbGlzdCkpO1xcbitcXHRlbHNlXFxuK1xcdFxcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXFx1MDAyNmJsa2ctXFx1MDAzZWJsa2NnX25vZGUpKTtcXG4rXFxuK1xcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cXG4rXFx0d2hpbGUgKG5vZGUpIHtcXG4rXFx0XFx0YmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7XFxuK1xcdFxcdGlmIChibGtnLVxcdTAwM2VvbmxpbmUpIHtcXG4rXFx0XFx0XFx0a2l0LVxcdTAwM2Vwb3MgPSBibGtnO1xcbitcXHRcXHRcXHRyZXR1cm4gYmxrZztcXG4rXFx0XFx0fVxcbitcXHRcXHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFxcdTAwMjZibGtnLVxcdTAwM2VibGtjZ19ub2RlKSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvcmdldCB0aGUgbGlzdCBoZWFkIGFzIHdlbGwuIFRoZSB2ZXJpZmllciBhc3N1bWVzIHRoYXQgYW4gaXRlcmF0b3JcXG4rXFx0ICogd2hpY2ggcmV0dXJuZWQgTlVMTCBrZWVwcyByZXR1cm5pbmcgTlVMTCwgYW5kIHN0b3BzIGNoZWNraW5nIHRoZVxcbitcXHQgKiBsb29wIGZvciB0ZXJtaW5hdGlvbiBvbmNlIGl0IGhhczsgc3RhcnRpbmcgdGhlIHdhbGsgb3ZlciB3b3VsZCBsZXRcXG4rXFx0ICogc3VjaCBhIGxvb3Agc3BpbiBmb3JldmVyLlxcbitcXHQgKi9cXG4rXFx0a2l0LVxcdTAwM2Vwb3MgPSBOVUxMO1xcbitcXHRraXQtXFx1MDAzZWJsa2NnID0gTlVMTDtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yXFxuKyAqIEBpdDogaXRlcmF0b3JcXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcXG4re1xcbit9XFxuK1xcbisvKlxcbisgKiBSZWFkIG9uZSBjb3VudGVyIG91dCBvZiBAYmxrZydzIGZsdXNoZWQgaW8uc3RhdCBhZ2dyZWdhdGUuIEBjb3VudGVycyBpcyBvbmVcXG4rICogb2YgdGhlIHR3byBhcnJheXMgaW4gYmxrZy1cXHUwMDNlaW9zdGF0LmN1cjsgYm90aCBhcmUgZ3VhcmRlZCBieSB0aGF0IHN0cnVjdCdzXFxuKyAqIHNlcWxvY2ssIHRoZSBvbmUgdGhlIGlvLnN0YXQgZmlsZSB1c2VzLiBSZXR1cm5zICh1NjQpLTEgaWYgdGhlIGNvdW50ZXJcXG4rICogY2Fubm90IGJlIHJlYWQuXFxuKyAqL1xcbitzdGF0aWMgdTY0IGJsa2dfaW9zdGF0X3JlYWQoc3RydWN0IGJsa2NnX2dxICpibGtnLCBjb25zdCB1NjQgKmNvdW50ZXJzLFxcbitcXHRcXHRcXHQgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxcbit7XFxuK1xcdHN0cnVjdCBibGtnX2lvc3RhdF9zZXQgKmJpcyA9IFxcdTAwMjZibGtnLVxcdTAwM2Vpb3N0YXQ7XFxuK1xcdHVuc2lnbmVkIGludCBzZXE7XFxuK1xcdHU2NCB2YWw7XFxuK1xcbitcXHRpZiAoKHVuc2lnbmVkIGludClydyBcXHUwMDNlPSBCTEtHX0lPU1RBVF9OUilcXG4rXFx0XFx0cmV0dXJuICh1NjQpLTE7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPbiAzMi1iaXQgdGhlIGxvb3AgYmVsb3cgcmVhbGx5IGlzIGEgc2VxY291bnQgcmV0cnkgbG9vcC4gRXZlcnlcXG4rXFx0ICogd3JpdGVyIG9mIGJsa2ctXFx1MDAzZWlvc3RhdCBrZWVwcyBpbnRlcnJ1cHRzIG9mZiwgc28gb25seSBhbiBOTUkgY2FuIGxhbmRcXG4rXFx0ICogaW5zaWRlIGFuIHVwZGF0ZSwgYW5kIHRoZW4gdGhlIGxvb3Agd291bGQgbmV2ZXIgZW5kLiBUaGVzZSBrZnVuY3NcXG4rXFx0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXFxuK1xcdCAqIGdpdmUgdXAgcmF0aGVyIHRoYW4gc3Bpbi4gT24gNjQtYml0IHRoZSBsb29wIGNvbXBpbGVzIGF3YXkuXFxuK1xcdCAqL1xcbitcXHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcXHUwMDI2XFx1MDAyNiBpbl9ubWkoKSlcXG4rXFx0XFx0cmV0dXJuICh1NjQpLTE7XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdHNlcSA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbihcXHUwMDI2YmlzLVxcdTAwM2VzeW5jKTtcXG4rXFx0XFx0dmFsID0gY291bnRlcnNbcnddO1xcbitcXHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXFx1MDAyNmJpcy1cXHUwMDNlc3luYywgc2VxKSk7XFxuK1xcbitcXHRyZXR1cm4gdmFsO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgYnl0ZSBjb3VudGVyXFxuKyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cClcXG4rICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpXFxuKyAqXFxuKyAqIFJlYWRzIHRoZSBmbHVzaGVkIGFnZ3JlZ2F0ZSwgc28gY2FsbCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKSBmaXJzdCBmb3JcXG4rICogdXAtdG8tZGF0ZSB2YWx1ZXMuIFRoZSByZWFkIHVzZXMgdGhlIHU2NF9zdGF0cyBzZXFsb2NrLCBsaWtlIHRoZSBpby5zdGF0XFxuKyAqIGZpbGUuXFxuKyAqXFxuKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBieXRlcywgb3IgKHU2NCktMSBpZiBAcncgaXMgb3V0IG9mIHJhbmdlIG9yIHRoZVxcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgdTY0IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csXFxuK1xcdFxcdFxcdFxcdCAgICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcXG4re1xcbitcXHRyZXR1cm4gYmxrZ19pb3N0YXRfcmVhZChibGtnLCBibGtnLVxcdTAwM2Vpb3N0YXQuY3VyLmJ5dGVzLCBydyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgSS9PIGNvdW50XFxuKyAqIEBibGtnOiBibG9jayBncm91cCAob25lIGRldmljZSBvZiBhIGJsb2NrIGNncm91cClcXG4rICogQHJ3OiB3aGljaCBjb3VudGVyIChCTEtHX0lPU1RBVF9SRUFEIC8gX1dSSVRFIC8gX0RJU0NBUkQpXFxuKyAqXFxuKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBJL09zLCBvciAodTY0KS0xIGlmIEBydyBpcyBvdXQgb2YgcmFuZ2Ugb3IgdGhlXFxuKyAqIGNvdW50ZXIgY2Fubm90IGJlIHJlYWQuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfaW9zdGF0X2lvcyhzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csXFxuK1xcdFxcdFxcdFxcdCAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpXFxuK3tcXG4rXFx0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cXHUwMDNlaW9zdGF0LmN1ci5pb3MsIHJ3KTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9ibGtnX2RldiAtIFJldHVybiBhIGJsa2cncyBkZXZpY2UgaWRcXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwXFxuKyAqXFxuKyAqIFJldHVybjogdGhlIGRldmljZSdzIGRldl90ICh1c2UgTUFKT1IoKS9NSU5PUigpIHRvIHNwbGl0KSwgb3IgMCBpZiB0aGUgYmxrZ1xcbisgKiBoYXMgbm8gZGlzay5cXG4rICovXFxuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19kZXYoc3RydWN0IGJsa2NnX2dxICpibGtnKVxcbit7XFxuK1xcdGlmICghYmxrZy1cXHUwMDNlcSB8fCAhYmxrZy1cXHUwMDNlcS1cXHUwMDNlZGlzaylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gYmxrZy1cXHUwMDNlcS1cXHUwMDNlZGlzay1cXHUwMDNlcGFydDAtXFx1MDAzZWJkX2RldjtcXG4rfVxcbitcXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4rXFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2dldF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMIHwgS0ZfUkNVKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3B1dF9ibGtjZywgS0ZfUkVMRUFTRSlcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxcbitcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXFxuK1xcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19pb3N0YXRfaW9zLCBLRl9SQ1UpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrZ19kZXYsIEtGX1JDVSlcXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0ge1xcbitcXHQub3duZXJcXHRcXHQ9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0XFx0XFx0PSBcXHUwMDI2YnBmX2Jsa2NnX2tmdW5jcyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfd2FybihcXFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIGJsa2NnIGtmdW5jczogJWRcXFxcblxcXCIsIGVycik7XFxuK1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuK2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxuQEAgLTAsMCArMSwxNyBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXFxuKyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19IXFxuKyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19IXFxuK1xcbitzdHJ1Y3QgaW9fcXVlcnkge1xcbitcXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xcbitcXHRfX3U2NCByYnl0ZXM7XFxuK1xcdF9fdTY0IHdieXRlcztcXG4rXFx0X191NjQgcmlvcztcXG4rXFx0X191NjQgd2lvcztcXG4rXFx0X191NjQgZGJ5dGVzO1xcbitcXHRfX3U2NCBkaW9zO1xcbitcXHRfX3U2NCBkZXY7XFx0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXFxuK307XFxuK1xcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uMjcwZTZiZjkxOTRkMiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xcbkBAIC0xLDMgKzEsNCBAQFxcbitDT05GSUdfQkxLX0NHUk9VUD15XFxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxcbiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eVxcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzJjZGE4MjQzMzE4M1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXFxuQEAgLTAsMCArMSwzMTAgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvbGliYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbG9vcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zeXNtYWNyb3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImNncm91cF9pdGVyX2lvLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaXRlcl9pby5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNClcXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuK3tcXG4rXFx0aW50IGZkLCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IGJ5dGVzO1xcbitcXG4rXFx0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJicGZfaXRlcl9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cXG4rXFx0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsIFxcXCJyZWFkIGZkXFxcIikpXFxuK1xcdFxcdHJldCA9IDE7XFxuK1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcXG4rICogZGV2aWNlIHRvIGdlbmVyYXRlIGNncm91cC1jaGFyZ2VkIEkvTyBhZ2FpbnN0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTFcXG4rICogaWYgbG9vcCBkZXZpY2VzIGFyZSB1bmF2YWlsYWJsZSAobm9uLXJvb3QgLyBubyBDT05GSUdfQkxLX0RFVl9MT09QKSBzbyB0aGVcXG4rICogY2FsbGVyIGNhbiBza2lwLlxcbisgKi9cXG4rc3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLFxcbitcXHRcXHQgICAgICBpbnQgKmJhY2tfZmQpXFxuK3tcXG4rXFx0Y2hhciBiYWNrX3BhdGhbXSA9IFxcXCIvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWFxcXCI7XFxuK1xcdGludCBucjtcXG4rXFxuK1xcdCpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7XFxuK1xcbitcXHQqY3RsX2ZkID0gb3BlbihcXFwiL2Rldi9sb29wLWNvbnRyb2xcXFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoKmN0bF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xcbitcXHRpZiAobnIgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0c25wcmludGYobG9vcF9wYXRoLCBzeiwgXFxcIi9kZXYvbG9vcCVkXFxcIiwgbnIpO1xcbitcXG4rXFx0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XFxuK1xcdGlmICgqYmFja19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXHR1bmxpbmsoYmFja19wYXRoKTtcXG4rXFx0aWYgKGZ0cnVuY2F0ZSgqYmFja19mZCwgKG9mZl90KUlPX1NJWkUgKiA0KSlcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHQqbG9vcF9mZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoKmxvb3BfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitlcnI6XFxuK1xcdGlmICgqbG9vcF9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZSgqbG9vcF9mZCk7XFxuK1xcdGlmICgqYmFja19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZSgqYmFja19mZCk7XFxuK1xcdGNsb3NlKCpjdGxfZmQpO1xcbitcXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCxcXG4rXFx0XFx0XFx0ICBpbnQgYmFja19mZClcXG4re1xcbitcXHRpbnQgbnIgPSAtMTtcXG4rXFxuK1xcdGlmIChsb29wX2ZkIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xcbitcXHRcXHRjbG9zZShsb29wX2ZkKTtcXG4rXFx0fVxcbitcXHRpZiAoYmFja19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShiYWNrX2ZkKTtcXG4rXFx0aWYgKGN0bF9mZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGlmIChzc2NhbmYobG9vcF9wYXRoLCBcXFwiL2Rldi9sb29wJWRcXFwiLCBcXHUwMDI2bnIpID09IDEgXFx1MDAyNlxcdTAwMjYgbnIgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0aW9jdGwoY3RsX2ZkLCBMT09QX0NUTF9SRU1PVkUsIG5yKTtcXG4rXFx0XFx0Y2xvc2UoY3RsX2ZkKTtcXG4rXFx0fVxcbit9XFxuK1xcbisvKiBPX0RJUkVDVCBJL08gdG8gdGhlIGxvb3AgZGV2aWNlLCBjaGFyZ2VkIHRvIHRoZSBjdXJyZW50IGNncm91cC4gKi9cXG4rc3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKVxcbit7XFxuK1xcdHZvaWQgKmJ1ZjtcXG4rXFx0aW50IGZkLCByZXQgPSAtMTtcXG4rXFxuK1xcdGZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fRElSRUNUIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAocG9zaXhfbWVtYWxpZ24oXFx1MDAyNmJ1ZiwgNDA5NiwgSU9fU0laRSkpXFxuK1xcdFxcdGdvdG8gb3V0X2ZkO1xcbitcXHRtZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTtcXG4rXFxuK1xcdGlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcXG4rXFx0XFx0Z290byBvdXRfYnVmO1xcbitcXHRmc3luYyhmZCk7XFxuK1xcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxcbitcXHRcXHRnb3RvIG91dF9idWY7XFxuK1xcdHJldCA9IDA7XFxuK291dF9idWY6XFxuK1xcdGZyZWUoYnVmKTtcXG4rb3V0X2ZkOlxcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJ3MgaW8uc3RhdCBmaWxlIGFuZFxcbisgKiBmaWxsIEBvdXQuIEBkZXYgaXMgYSBrZXJuZWwgZGV2X3QgKGFzIHJldHVybmVkIGJ5IGJwZl9ibGtnX2RldiksIHdob3NlXFxuKyAqIG1ham9yOm1pbm9yIHNwbGl0IG1hdGNoZXMgaG93IGlvLnN0YXQgcHJpbnRzIHRoZSBkZXZpY2UuIFJldHVybnMgMCBpZiB0aGVcXG4rICogZGV2aWNlJ3MgbGluZSB3YXMgZm91bmQuXFxuKyAqL1xcbitzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgd2FudF9tYWogPSBkZXYgXFx1MDAzZVxcdTAwM2UgMjAsIHdhbnRfbWluID0gZGV2IFxcdTAwMjYgKCgxVSBcXHUwMDNjXFx1MDAzYyAyMCkgLSAxKTtcXG4rXFx0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcXG4rXFx0aW50IGZkLCBuLCByZXQgPSAtMTtcXG4rXFxuK1xcdGZkID0gb3BlbmF0KGNncm91cF9mZCwgXFxcImlvLnN0YXRcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0biA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRpZiAobiBcXHUwMDNjPSAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJ1ZltuXSA9ICdcXFxcMCc7XFxuK1xcbitcXHRmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsIFxcXCJcXFxcblxcXCIsIFxcdTAwMjZzYXZlcHRyKTsgbGluZTtcXG4rXFx0ICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgXFxcIlxcXFxuXFxcIiwgXFx1MDAyNnNhdmVwdHIpKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGUgXFxcIm1hajptaW5cXFwiIHRva2VuIGlzIGFsd2F5cyBwcmVzZW50OyB0aGUgZmllbGQgYmxvY2sgaXNcXG4rXFx0XFx0ICogb3B0aW9uYWwgKHRoZSBrZXJuZWwgb21pdHMgaXQgZm9yIGEgZGV2aWNlIHdpdGggbm8gcmVhZC93cml0ZVxcbitcXHRcXHQgKiBJL08pLCBzbyBhIG1hdGNoIG9mIFxcdTAwM2U9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChzc2NhbmYobGluZSxcXG4rXFx0XFx0XFx0ICAgXFxcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XFxcIixcXG4rXFx0XFx0XFx0ICAgXFx1MDAyNm1haiwgXFx1MDAyNm1pbiwgXFx1MDAyNnJiLCBcXHUwMDI2d2IsIFxcdTAwMjZyaSwgXFx1MDAyNndpLCBcXHUwMDI2ZGIsIFxcdTAwMjZkaSkgXFx1MDAzYyAyKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0aWYgKG1haiAhPSB3YW50X21haiB8fCBtaW4gIT0gd2FudF9taW4pXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0b3V0LVxcdTAwM2VyYnl0ZXMgPSByYjtcXG4rXFx0XFx0b3V0LVxcdTAwM2V3Ynl0ZXMgPSB3YjtcXG4rXFx0XFx0b3V0LVxcdTAwM2VyaW9zID0gcmk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2lvcyA9IHdpO1xcbitcXHRcXHRvdXQtXFx1MDAzZWRieXRlcyA9IGRiO1xcbitcXHRcXHRvdXQtXFx1MDAzZWRpb3MgPSBkaTtcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2Nncm91cF9pdGVyX2lvKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciAqY2dyb3VwX3JlbF9wYXRoID0gXFxcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XFxcIjtcXG4rXFx0aW50IGN0bF9mZCA9IC0xLCBsb29wX2ZkID0gLTEsIGJhY2tfZmQgPSAtMTtcXG4rXFx0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcXG4rXFx0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcXG4rXFx0Y2hhciBsb29wX3BhdGhbNjRdO1xcbitcXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XFxuK1xcdGludCBjZ3JvdXBfZmQ7XFxuK1xcbitcXHRjZ3JvdXBfZmQgPSBjZ3JvdXBfc2V0dXBfYW5kX2pvaW4oY2dyb3VwX3JlbF9wYXRoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoY2dyb3VwX2ZkLCBcXFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksIFxcdTAwMjZjdGxfZmQsIFxcdTAwMjZsb29wX2ZkLCBcXHUwMDI2YmFja19mZCkpIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdHNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9sb29wO1xcbitcXG4rXFx0LypcXG4rXFx0ICogUGluIHRoZSByZWFkIHRvIHRoZSBsb29wIGRldmljZSBzbyB0aGUgbWVhc3VyZWQgZGV2aWNlIGlzIHN0YWJsZSBhbmRcXG4rXFx0ICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90XFxuK1xcdCAqIGVuY29kaW5nIChtYWpvciBcXHUwMDNjXFx1MDAzYyAyMCB8IG1pbm9yKSB0aGF0IGJwZl9ibGtnX2RldiByZXR1cm5zLlxcbitcXHQgKi9cXG4rXFx0e1xcbitcXHRcXHRzdHJ1Y3Qgc3RhdCBsc3Q7XFxuK1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcXHUwMDI2bHN0KSwgXFxcImZzdGF0IGxvb3BcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBjbGVhbnVwX3NrZWw7XFxuK1xcdFxcdHNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZXRhcmdldF9kZXYgPVxcbitcXHRcXHRcXHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcXHUwMDNjXFx1MDAzYyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7XFxuK1xcdH1cXG4rXFxuK1xcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xcbitcXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XFxuK1xcdFxcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxcbitcXHRcXHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcXG4rXFx0fTtcXG4rXFx0b3B0cy5saW5rX2luZm8gPSBcXHUwMDI2bGluZm87XFxuK1xcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XFxuK1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXFx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXFxcImJwZl9wcm9ncmFtX19hdHRhY2hfaXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfc2tlbDtcXG4rXFxuK1xcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXFxuK1xcdGlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCBcXFwiZG9fZGlyZWN0X2lvXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9saW5rO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXFxcInJlYWQgc3RhdHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xpbms7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxcbitcXHQgKiBwYXR0ZXJuIGluIGNncm91cF9pdGVyX21lbWNnLlxcbitcXHQgKi9cXG4rXFx0cSA9IFxcdTAwMjZza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vpb19xdWVyeTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImNncm91cF9pdGVyX2lvX193cml0ZVxcXCIpKSB7XFxuK1xcdFxcdEFTU0VSVF9HVChxLVxcdTAwM2V3Ynl0ZXMsIDAsIFxcXCJ3Ynl0ZXNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0dUKHEtXFx1MDAzZXdpb3MsIDAsIFxcXCJ3aW9zXFxcIik7XFxuK1xcdH1cXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImNncm91cF9pdGVyX2lvX19yZWFkXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0dUKHEtXFx1MDAzZXJieXRlcywgMCwgXFxcInJieXRlc1xcXCIpO1xcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNlcmlvcywgMCwgXFxcInJpb3NcXFwiKTtcXG4rXFx0fVxcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX2RldlxcXCIpKVxcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNlZGV2LCAwLCBcXFwiZGV2XFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTdHJvbmdlciBjaGVjazogdGhlIGtmdW5jLXJlYWQgdmFsdWVzIG11c3QgZXF1YWwgd2hhdCB0aGUgaW8uc3RhdFxcbitcXHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxcbitcXHQgKiB0aGUgZmlsZSB3aXRoIG5vIEkvTyBpbiBiZXR3ZWVuLCBzbyBib3RoIGZsdXNoZWQgc25hcHNob3RzIG1hdGNoXFxuK1xcdCAqIGV4YWN0bHkuXFxuK1xcdCAqL1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX21hdGNoXFxcIikpIHtcXG4rXFx0XFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XFxuK1xcbitcXHRcXHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFxcXCJyZWFkIHN0YXRzXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS1cXHUwMDNlZGV2LCBcXHUwMDI2ZmlsZXYpLFxcbitcXHRcXHRcXHQgICAgICBcXFwicGFyc2UgaW8uc3RhdFxcXCIpKSB7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXFxcInJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFxcXCJ3Ynl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFxcXCJyaW9zXFxcIik7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcXFwid2lvc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFxcXCJkYnl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFxcXCJkaW9zXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWVcXG4rXFx0ICogZnJvbSByc3RhdCwgdGhleSBhcmUgcmVmaWxsZWQgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcywgc28gdGhpc1xcbitcXHQgKiBjb3ZlcnMgdGhlIG90aGVyIGhhbGYgb2YgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZXkgY292ZXIgZXZlcnlcXG4rXFx0ICogY2dyb3VwJ3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXFxuK1xcdCAqIHRoZXkgbXVzdCBiZSBhdCBvciBhYm92ZSB3aGF0IHRoZSB0ZXN0IGNncm91cCB3YXMgY2hhcmdlZC5cXG4rXFx0ICovXFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjZ3JvdXBfaXRlcl9pb19fcm9vdFxcXCIpKSB7XFxuK1xcdFxcdHN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rO1xcbitcXHRcXHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XFxuK1xcbitcXHRcXHRza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vnb3Rfcm9vdF9ibGtjZyA9IDA7XFxuK1xcdFxcdHJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVxcdTAwM2Vwcm9ncy5jZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2b3B0cyk7XFxuK1xcdFxcdGlmIChBU1NFUlRfT0tfUFRSKHJvb3RfbGluaywgXFxcImF0dGFjaCByb290IGl0ZXJcXFwiKSkge1xcbitcXHRcXHRcXHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXFxcInJlYWQgcm9vdCBzdGF0c1xcXCIpKSB7XFxuK1xcdFxcdFxcdFxcdHIgPSBcXHUwMDI2c2tlbC1cXHUwMDNlZGF0YV9xdWVyeS1cXHUwMDNlcm9vdF9xdWVyeTtcXG4rXFx0XFx0XFx0XFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZWdvdF9yb290X2Jsa2NnLCAxLFxcbitcXHRcXHRcXHRcXHRcXHQgIFxcXCJnb3Rfcm9vdF9ibGtjZ1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfRVEoci1cXHUwMDNlZGV2LCBxLVxcdTAwM2VkZXYsIFxcXCJyb290IGRldlxcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2J5dGVzLCBxLVxcdTAwM2V3Ynl0ZXMsIFxcXCJyb290IHdieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2lvcywgcS1cXHUwMDNld2lvcywgXFxcInJvb3Qgd2lvc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmJ5dGVzLCBxLVxcdTAwM2VyYnl0ZXMsIFxcXCJyb290IHJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmlvcywgcS1cXHUwMDNlcmlvcywgXFxcInJvb3Qgcmlvc1xcXCIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rY2xlYW51cF9saW5rOlxcbitcXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcXG4rY2xlYW51cF9za2VsOlxcbitcXHRjZ3JvdXBfaXRlcl9pb19fZGVzdHJveShza2VsKTtcXG4rY2xlYW51cF9sb29wOlxcbitcXHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcXG4rY2xlYW51cF9jZ3JvdXBfZmQ6XFxuK1xcdGNsb3NlKGNncm91cF9mZCk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjgzOWRlZjk0NTA4Nlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbkBAIC0wLDAgKzEsMTA3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cXG4rI2luY2x1ZGUgXFx1MDAzY3ZtbGludXguaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImNncm91cF9pdGVyX2lvLmhcXFwiXFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG4rXFxuKy8qIFRoZSBjb3VudGVycyBvZiB0aGUgZGV2aWNlIG5hbWVkIGJ5IHRhcmdldF9kZXYgYXJlIHN0b3JlZCBoZXJlLiAqL1xcbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogVGhlIHNhbWUgZGV2aWNlJ3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cXG4rc3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogU2V0IHRvIDEgYnkgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkgd2hlbiBicGZfZ2V0X3Jvb3RfYmxrY2coKSBzdWNjZWVkcy4gKi9cXG4rX191NjQgZ290X3Jvb3RfYmxrY2cgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogRGV2aWNlIHRvIHJlYWQsIHNldCBieSB1c2Vyc3BhY2UgKGtlcm5lbCBkZXZfdCkuIFBpbm5pbmcgdGhlIGRldmljZSBrZWVwc1xcbisgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuXFxuKyAqL1xcbitfX3U2NCB0YXJnZXRfZGV2IFNFQyhcXFwiLmRhdGEucXVlcnlcXFwiKTtcXG4rXFxuKy8qXFxuKyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSdzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5XFxuKyAqIHRoZSBvbmUgcGlubmVkIGRldmljZSBrZWVwcyB0aGUgcmVzdWx0IGRldGVybWluaXN0aWM6IHRoYXQgZGV2aWNlIGlzXFxuKyAqIHF1aWVzY2VkLCBzbyBpdHMgY291bnRlcnMgbWF0Y2ggaW8uc3RhdCBleGFjdGx5LCB3aGlsZSBwaWNraW5nIFxcXCJhbnkgZGV2aWNlXFxuKyAqIHdpdGggSS9PXFxcIiB3b3VsZCByYWNlIHdpdGggYmFja2luZy1zdG9yZSB3cml0ZWJhY2suXFxuKyAqL1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcXG4re1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4rXFxuK1xcdC8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovXFxuK1xcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhibGtjZyk7XFxuK1xcbitcXHQvKiBUaGUgcGVyLWRldmljZSBibGtnIHdhbGsgbmVlZHMgYW4gUkNVIHNlY3Rpb24uICovXFxuK1xcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XFxuK1xcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XFxuK1xcdFxcdGlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFxuK1xcdFxcdG91dC1cXHUwMDNlZGV2ID0gYnBmX2Jsa2dfZGV2KHBvcyk7XFxuK1xcdFxcdG91dC1cXHUwMDNlcmJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2J5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfV1JJVEUpO1xcbitcXHRcXHRvdXQtXFx1MDAzZXJpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2lvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9XUklURSk7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGJ5dGVzID0gYnBmX2Jsa2dfaW9zdGF0X2J5dGVzKHBvcywgQkxLR19JT1NUQVRfRElTQ0FSRCk7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9ESVNDQVJEKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFx0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIucy9jZ3JvdXBcXFwiKVxcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cXHUwMDNlY2dyb3VwO1xcbitcXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xcbitcXG4rXFx0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xcbitcXHRpZiAoIWNncnApXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXG4rXFx0LyogU3RhcnQgZnJlc2ggc28gYSBkZXZpY2UgdGhhdCBpcyBub3QgZm91bmQgc3RheXMgYWxsLXplcm8uICovXFxuK1xcdF9fYnVpbHRpbl9tZW1zZXQoXFx1MDAyNmlvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTtcXG4rXFxuK1xcdGJsa2NnID0gYnBmX2dldF9ibGtjZyhcXHUwMDI2Y2dycC1cXHUwMDNlc2VsZik7XFxuK1xcdGlmICghYmxrY2cpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcXHUwMDI2aW9fcXVlcnkpO1xcbitcXG4rXFx0YnBmX3B1dF9ibGtjZyhibGtjZyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIucy9jZ3JvdXBcXFwiKVxcbitpbnQgY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LVxcdTAwM2VjZ3JvdXA7XFxuK1xcdHN0cnVjdCBibGtjZyAqYmxrY2c7XFxuK1xcbitcXHQvKiBUaGUgbGFzdCBpdGVyYXRpb24gaGFzIGEgTlVMTCBjZ3JvdXAsIHNraXAgaXQuICovXFxuK1xcdGlmICghY2dycClcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRfX2J1aWx0aW5fbWVtc2V0KFxcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xcbitcXG4rXFx0YmxrY2cgPSBicGZfZ2V0X3Jvb3RfYmxrY2coKTtcXG4rXFx0aWYgKCFibGtjZylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcXG4rXFx0ICogdGhhbiBmcm9tIHJzdGF0LCBzbyB0aGlzIGFsc28gY292ZXJzIHRoZSByb290IHNpZGUgb2ZcXG4rXFx0ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKCkuIFRoZSBjb3VudGVycyBjb3ZlciBldmVyeSBjZ3JvdXAncyBJL08sIHNvXFxuK1xcdCAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QncyBvd24gY2dyb3VwIGRpZC5cXG4rXFx0ICovXFxuK1xcdHJlYWRfdGFyZ2V0X2RldihibGtjZywgXFx1MDAyNnJvb3RfcXVlcnkpO1xcbitcXG4rXFx0Z290X3Jvb3RfYmxrY2cgPSAxO1xcbitcXHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MDQuNjA3OTc3NjZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjozNjk0OTYwNTQyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQkxLX0NHUk9VUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9nZXRfcm9vdF9ibGtjZ1wiLFxuICAgIFwiYnBmX2dldF9ibGtjZ1wiLFxuICAgIFwiYnBmX3B1dF9ibGtjZ1wiLFxuICAgIFwiYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzXCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXh0XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX2Rlc3Ryb3lcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9ieXRlc1wiLFxuICAgIFwiYnBmX2Jsa2dfaW9zdGF0X2lvc1wiLFxuICAgIFwiYnBmX2Jsa2dfZGV2XCIsXG4gICAgXCJibGtjZ19maWxsX3Jvb3RfaW9zdGF0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIHRoZSBibG9jayBJL08gY29udHJvbGxlciAoYmxrY2cpIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyY2ExOWE4YTI0ODg3Mjg4OGRlMWE1YmU3ZDY3ODM4YTJmMmE0MjE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuKysrIGIvTUFJTlRBSU5FUlNcbkBAIC02NjE3LDYgKzY2MTcsNyBAQCBGOlx0YmxvY2svYmxrLWNncm91cC5jXG4gRjpcdGJsb2NrL2Jsay1pb2Nvc3QuY1xuIEY6XHRibG9jay9ibGstaW9sYXRlbmN5LmNcbiBGOlx0YmxvY2svYmxrLXRocm90dGxlLmNcbitGOlx0YmxvY2svYnBmX2Jsa2NnLmNcbiBGOlx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcbiBcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4rKysgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTE3LDYgKzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICs9IGVycm9yLWluamVjdGlvbi5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgKz0gYnNnLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXHQrPSBic2ctbGliLm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJsay1jZ3JvdXAub1xuK2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYnBmX2Jsa2NnLm9cbitlbmRpZlxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcdCs9IGJsay1jZ3JvdXAtcndzdGF0Lm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgKz0gYmxrLWNncm91cC1mYy1hcHBpZC5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcdCs9IGJsay10aHJvdHRsZS5vXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmNcbkBAIC0xMDg2LDcgKzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxuICAqIGZsdXNoaW5nIHRoZSByb290IGNncm91cCdzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XG4gICogd2l0aCBkaXNrIGxldmVsIHN0YXRpc3RpY3MuXG4gICovXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4ge1xuIFx0c3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmhcbkBAIC0yMDUsNiArMjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcbiBcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBibGtjZ19wb2xpY3kgKnBvbCk7XG4gXG4gY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpO1xuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XG4gdm9pZCBibGtjZ19wcmludF9ibGtncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3QgYmxrY2cgKmJsa2NnLFxuIFx0XHQgICAgICAgdTY0ICgqcHJmaWxsKShzdHJ1Y3Qgc2VxX2ZpbGUgKixcbiBcdFx0XHRcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcbmRpZmYgLS1naXQgYS9ibG9jay9icGZfYmxrY2cuYyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDhhODZmMDdlMTk4YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvYmxvY2svYnBmX2Jsa2NnLmNcbkBAIC0wLDAgKzEsMzE1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbisvKlxuKyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuXG4rICpcbisgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcbisgKiBjZ3JvdXAncyBjc3MgaW50byBhIHN0cnVjdCBibGtjZyB3aXRoIGJwZl9nZXRfYmxrY2coKSwgZmx1c2hlcyB0aGUgc3RhdHMgd2l0aFxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzIHdpdGggdGhlXG4rICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJ3MgY291bnRlcnMgd2l0aFxuKyAqIGJwZl9ibGtnX2lvc3RhdF9ieXRlcygpL2JwZl9ibGtnX2lvc3RhdF9pb3MoKS4gSXQgbWlycm9ycyB0aGUgbWVtb3J5XG4rICogY29udHJvbGxlciBrZnVuY3MgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgYnV0IGFkZHMgYSBwZXItZGV2aWNlIGRpbWVuc2lvbjpcbisgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cbisgKlxuKyAqIFRoaXMgZmlsZSBsaXZlcyBpbiBibG9jay8gYmVjYXVzZSB0aGUgYmxrY2cvYmxrZyBzdHJ1Y3QgbGF5b3V0cyBhcmUgcHJpdmF0ZVxuKyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cbisgKi9cbitcbisjaW5jbHVkZSBcImJsay1jZ3JvdXAuaFwiXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwXG4rICpcbisgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXNcbisgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJ3QgcmVxdWlyZSByZWZlcmVuY2UgY291bnRpbmcuIEl0J3Mgc2FmZSB0byBwYXNzIGl0XG4rICogdG8gYnBmX3B1dF9ibGtjZygpLlxuKyAqXG4rICogTm90ZSB0aGF0IHRoZSByb290IGNncm91cCBpcyBzcGVjaWFsOiBpdHMgY291bnRlcnMgYXJlIHRoZSBkaXNrcycgb3duXG4rICogc3RhdGlzdGljcywgc28gdGhleSBjb3ZlciBldmVyeSBjZ3JvdXAncyBJL08gcmF0aGVyIHRoYW4gb25seSB0aGUgcm9vdCdzLlxuKyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuXG4rICpcbisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X3Jvb3RfYmxrY2codm9pZClcbit7XG4rXHQvKiBjc3NfZ2V0KCkgaXMgbm90IG5lZWRlZCAqL1xuK1x0cmV0dXJuIFx1MDAyNmJsa2NnX3Jvb3Q7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXBcbisgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXG4rICpcbisgKiBJdCdzIGZpbmUgdG8gcGFzcyBhIGNzcyB3aGljaCBiZWxvbmdzIHRvIGFueSBjZ3JvdXAgY29udHJvbGxlcixcbisgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5J3MgbWFpbiBjc3MuXG4rICpcbisgKiBJbXBsZW1lbnRzIEtGX0FDUVVJUkUgc2VtYW50aWNzLlxuKyAqXG4rICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gYSBibGtjZyBzdHJ1Y3R1cmUgYWZ0ZXIgYnVtcGluZyB0aGUgY29ycmVzcG9uZGluZyBjc3Mnc1xuKyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X2Jsa2NnKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4re1xuK1x0c3RydWN0IGJsa2NnICpibGtjZyA9IE5VTEw7XG4rXG4rXHRpZiAoY3NzLVx1MDAzZXNzID09IFx1MDAyNmlvX2NncnBfc3Vic3lzKVxuK1x0XHRyZXR1cm4gY3NzX3RyeWdldChjc3MpID8gY3NzX3RvX2Jsa2NnKGNzcykgOiBOVUxMO1xuK1xuK1x0LypcbitcdCAqIFNvbWUgb3RoZXIgY29udHJvbGxlcidzIGNzcywgb3IgdGhlIGNncm91cCdzIG93biBvbmUuIExvb2sgdXAgdGhlIGlvXG4rXHQgKiBjb250cm9sbGVyJ3MgY3NzOyByY3Uga2VlcHMgaXQgYWxpdmUgYmV0d2VlbiB0aGUgbG9hZCBhbmQgdGhlIHRyeWdldC5cbitcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLydzIGxvY2tcbitcdCAqIGNvbnRleHQgYW5hbHlzaXMgY2FuIGZvbGxvdyBpdC5cbitcdCAqL1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0Y3NzID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhjc3MtXHUwMDNlY2dyb3VwLVx1MDAzZXN1YnN5c1tpb19jZ3JwX2lkXSk7XG4rXHRpZiAoY3NzIFx1MDAyNlx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXG4rXHRcdGJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdHJldHVybiBibGtjZztcbit9XG4rXG4rLyoqXG4rICogYnBmX3B1dF9ibGtjZyAtIFB1dCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcbisgKlxuKyAqIFJlbGVhc2VzIGEgcHJldmlvdXNseSBhY3F1aXJlZCBibGtjZyByZWZlcmVuY2UuXG4rICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9wdXRfYmxrY2coc3RydWN0IGJsa2NnICpibGtjZylcbit7XG4rXHRjc3NfcHV0KFx1MDAyNmJsa2NnLVx1MDAzZWNzcyk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwXG4rICpcbisgKiBDYWxsIHRoaXMgYmVmb3JlIHJlYWRpbmcgY291bnRlcnMgZm9yIHVwLXRvLWRhdGUgdmFsdWVzLiBTbGVlcGFibGUuXG4rICpcbisgKiBJdCBkb2VzIHdoYXQgcmVhZGluZyB0aGUgaW8uc3RhdCBmaWxlIGRvZXMsIHdoaWNoIGRpZmZlcnMgYnkgY2dyb3VwLiBGb3IgYVxuKyAqIG5vbi1yb290IGNncm91cCBpdCBmb2xkcyB0aGUgcGVyLWNwdSBkZWx0YXMgaW50byB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzXG4rICogYW5kIHVwIHRoZSBjZ3JvdXAgdHJlZS4gVGhlIHJvb3QgY2dyb3VwIGlzIG5vdCBhY2NvdW50ZWQgdGhyb3VnaCByc3RhdCBhdFxuKyAqIGFsbCwgc28gZm9yIGl0IHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXMgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzJ1xuKyAqIG93biBzdGF0aXN0aWNzLCB3aGljaCBjb3VudCBldmVyeSBjZ3JvdXAncyBJL08uXG4rICpcbisgKiBUaGUgcm9vdCBicmFuY2ggaXMgbm90IHNlbGYtbGltaXRpbmcgdGhlIHdheSB0aGUgcnN0YXQgb25lIGlzOiBpdCByZXJlYWRzXG4rICogZXZlcnkgZGlzayBvbiBldmVyeSBjYWxsLCB3aGlsZSBhIHNlY29uZCByc3RhdCBmbHVzaCBmaW5kcyBub3RoaW5nIGxlZnQgdG9cbisgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXG4rICogb25jZSByYXRoZXIgdGhhbiBvbmNlIHBlciBjZ3JvdXAgb2YgYSB3YWxrLlxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0aWYgKCFibGtjZy1cdTAwM2Vjc3MucGFyZW50KVxuK1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuK1x0ZWxzZVxuK1x0XHRjc3NfcnN0YXRfZmx1c2goXHUwMDI2YmxrY2ctXHUwMDNlY3NzKTtcbit9XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuK1x0X191NjQgX19vcGFxdWVbMl07XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXG4rICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrXG4rICpcbisgKiBFYWNoIHlpZWxkZWQgYmxrZyBob2xkcyBvbmUgYmxvY2sgZGV2aWNlJ3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGFcbisgKiBwZXItZGV2aWNlIGxpbmUgb2YgdGhlIGlvLnN0YXQgZmlsZS4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZCwgYXMgdGhlIGZpbGVcbisgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2tcbisgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yXG4rICogaXQuIE11c3QgYmUgdXNlZCBpbnNpZGUgYW4gUkNVIHJlYWQgc2VjdGlvbi5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbitcbitcdGtpdC1cdTAwM2VibGtjZyA9IGJsa2NnO1xuK1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcbisgKiBAaXQ6IGl0ZXJhdG9yXG4rICpcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcbitcbitcdC8qIENsZWFyZWQgb25jZSB0aGUgd2FsayBpcyBkb25lLCBzZWUgYmVsb3cuICovXG4rXHRpZiAoIWtpdC1cdTAwM2VibGtjZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRpZiAoIWJsa2cpXG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbitcdGVsc2VcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcbitcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cbitcdHdoaWxlIChub2RlKSB7XG4rXHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuK1x0XHRpZiAoYmxrZy1cdTAwM2VvbmxpbmUpIHtcbitcdFx0XHRraXQtXHUwMDNlcG9zID0gYmxrZztcbitcdFx0XHRyZXR1cm4gYmxrZztcbitcdFx0fVxuK1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIEZvcmdldCB0aGUgbGlzdCBoZWFkIGFzIHdlbGwuIFRoZSB2ZXJpZmllciBhc3N1bWVzIHRoYXQgYW4gaXRlcmF0b3JcbitcdCAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGVcbitcdCAqIGxvb3AgZm9yIHRlcm1pbmF0aW9uIG9uY2UgaXQgaGFzOyBzdGFydGluZyB0aGUgd2FsayBvdmVyIHdvdWxkIGxldFxuK1x0ICogc3VjaCBhIGxvb3Agc3BpbiBmb3JldmVyLlxuK1x0ICovXG4rXHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbitcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxuKyAqIEBpdDogaXRlcmF0b3JcbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK31cbitcbisvKlxuKyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJ3MgZmx1c2hlZCBpby5zdGF0IGFnZ3JlZ2F0ZS4gQGNvdW50ZXJzIGlzIG9uZVxuKyAqIG9mIHRoZSB0d28gYXJyYXlzIGluIGJsa2ctXHUwMDNlaW9zdGF0LmN1cjsgYm90aCBhcmUgZ3VhcmRlZCBieSB0aGF0IHN0cnVjdCdzXG4rICogc2VxbG9jaywgdGhlIG9uZSB0aGUgaW8uc3RhdCBmaWxlIHVzZXMuIFJldHVybnMgKHU2NCktMSBpZiB0aGUgY291bnRlclxuKyAqIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK3N0YXRpYyB1NjQgYmxrZ19pb3N0YXRfcmVhZChzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csIGNvbnN0IHU2NCAqY291bnRlcnMsXG4rXHRcdFx0ICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcbit7XG4rXHRzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0ICpiaXMgPSBcdTAwMjZibGtnLVx1MDAzZWlvc3RhdDtcbitcdHVuc2lnbmVkIGludCBzZXE7XG4rXHR1NjQgdmFsO1xuK1xuK1x0aWYgKCh1bnNpZ25lZCBpbnQpcncgXHUwMDNlPSBCTEtHX0lPU1RBVF9OUilcbitcdFx0cmV0dXJuICh1NjQpLTE7XG4rXG4rXHQvKlxuK1x0ICogT24gMzItYml0IHRoZSBsb29wIGJlbG93IHJlYWxseSBpcyBhIHNlcWNvdW50IHJldHJ5IGxvb3AuIEV2ZXJ5XG4rXHQgKiB3cml0ZXIgb2YgYmxrZy1cdTAwM2Vpb3N0YXQga2VlcHMgaW50ZXJydXB0cyBvZmYsIHNvIG9ubHkgYW4gTk1JIGNhbiBsYW5kXG4rXHQgKiBpbnNpZGUgYW4gdXBkYXRlLCBhbmQgdGhlbiB0aGUgbG9vcCB3b3VsZCBuZXZlciBlbmQuIFRoZXNlIGtmdW5jc1xuK1x0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXG4rXHQgKiBnaXZlIHVwIHJhdGhlciB0aGFuIHNwaW4uIE9uIDY0LWJpdCB0aGUgbG9vcCBjb21waWxlcyBhd2F5LlxuK1x0ICovXG4rXHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcdTAwMjZcdTAwMjYgaW5fbm1pKCkpXG4rXHRcdHJldHVybiAodTY0KS0xO1xuK1xuK1x0ZG8ge1xuK1x0XHRzZXEgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW4oXHUwMDI2YmlzLVx1MDAzZXN5bmMpO1xuK1x0XHR2YWwgPSBjb3VudGVyc1tyd107XG4rXHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXHUwMDI2YmlzLVx1MDAzZXN5bmMsIHNlcSkpO1xuK1xuK1x0cmV0dXJuIHZhbDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgYnl0ZSBjb3VudGVyXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmVhZHMgdGhlIGZsdXNoZWQgYWdncmVnYXRlLCBzbyBjYWxsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpIGZpcnN0IGZvclxuKyAqIHVwLXRvLWRhdGUgdmFsdWVzLiBUaGUgcmVhZCB1c2VzIHRoZSB1NjRfc3RhdHMgc2VxbG9jaywgbGlrZSB0aGUgaW8uc3RhdFxuKyAqIGZpbGUuXG4rICpcbisgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoc3RydWN0IGJsa2NnX2dxICpibGtnLFxuK1x0XHRcdFx0ICAgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuK3tcbitcdHJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgSS9PIGNvdW50XG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIEkvT3MsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfaW9zKHN0cnVjdCBibGtjZ19ncSAqYmxrZyxcbitcdFx0XHRcdCAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpXG4re1xuK1x0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmlvcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19kZXYgLSBSZXR1cm4gYSBibGtnJ3MgZGV2aWNlIGlkXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwXG4rICpcbisgKiBSZXR1cm46IHRoZSBkZXZpY2UncyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2dcbisgKiBoYXMgbm8gZGlzay5cbisgKi9cbitfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZylcbit7XG4rXHRpZiAoIWJsa2ctXHUwMDNlcSB8fCAhYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2spXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIGJsa2ctXHUwMDNlcS1cdTAwM2VkaXNrLVx1MDAzZXBhcnQwLVx1MDAzZWJkX2Rldjtcbit9XG4rXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbitcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wdXRfYmxrY2csIEtGX1JFTEVBU0UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuK1xuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbitcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfZGV2LCBLRl9SQ1UpXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHtcbitcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbitcdGlmIChlcnIpXG4rXHRcdHByX3dhcm4oXCJlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwiLCBlcnIpO1xuK1xuK1x0cmV0dXJuIGVycjtcbit9XG4rbGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5AQCAtMCwwICsxLDE3IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbisjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuK1xuK3N0cnVjdCBpb19xdWVyeSB7XG4rXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xuK1x0X191NjQgcmJ5dGVzO1xuK1x0X191NjQgd2J5dGVzO1xuK1x0X191NjQgcmlvcztcbitcdF9fdTY0IHdpb3M7XG4rXHRfX3U2NCBkYnl0ZXM7XG4rXHRfX3U2NCBkaW9zO1xuK1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4rfTtcbitcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICsxLDQgQEBcbitDT05GSUdfQkxLX0NHUk9VUD15XG4gQ09ORklHX0JMS19ERVZfTE9PUD15XG4gQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXlcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzJjZGE4MjQzMzE4M1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSwzMTAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rc3RhdGljIGludCByZWFkX3N0YXRzKHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRpbnQgZmQsIHJldCA9IDA7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuK1x0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcInJlYWQgZmRcIikpXG4rXHRcdHJldCA9IDE7XG4rXG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcbisgKiBkZXZpY2UgdG8gZ2VuZXJhdGUgY2dyb3VwLWNoYXJnZWQgSS9PIGFnYWluc3QuIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMVxuKyAqIGlmIGxvb3AgZGV2aWNlcyBhcmUgdW5hdmFpbGFibGUgKG5vbi1yb290IC8gbm8gQ09ORklHX0JMS19ERVZfTE9PUCkgc28gdGhlXG4rICogY2FsbGVyIGNhbiBza2lwLlxuKyAqL1xuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcbitcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuK3tcbitcdGNoYXIgYmFja19wYXRoW10gPSBcIi90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCI7XG4rXHRpbnQgbnI7XG4rXG4rXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuK1xuK1x0KmN0bF9mZCA9IG9wZW4oXCIvZGV2L2xvb3AtY29udHJvbFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuK1x0aWYgKG5yIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwiL2Rldi9sb29wJWRcIiwgbnIpO1xuK1xuK1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0dW5saW5rKGJhY2tfcGF0aCk7XG4rXHRpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdCpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdHJldHVybiAwO1xuK2VycjpcbitcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpsb29wX2ZkKTtcbitcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpiYWNrX2ZkKTtcbitcdGNsb3NlKCpjdGxfZmQpO1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuK1x0XHRcdCAgaW50IGJhY2tfZmQpXG4re1xuK1x0aW50IG5yID0gLTE7XG4rXG4rXHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuK1x0XHRjbG9zZShsb29wX2ZkKTtcbitcdH1cbitcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoYmFja19mZCk7XG4rXHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuK1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCIvZGV2L2xvb3AlZFwiLCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuK1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4rXHRcdGNsb3NlKGN0bF9mZCk7XG4rXHR9XG4rfVxuK1xuKy8qIE9fRElSRUNUIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuK3N0YXRpYyBpbnQgZG9fZGlyZWN0X2lvKGNvbnN0IGNoYXIgKmxvb3BfcGF0aClcbit7XG4rXHR2b2lkICpidWY7XG4rXHRpbnQgZmQsIHJldCA9IC0xO1xuK1xuK1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbitcdFx0Z290byBvdXRfZmQ7XG4rXHRtZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTtcbitcbitcdGlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcbitcdFx0Z290byBvdXRfYnVmO1xuK1x0ZnN5bmMoZmQpO1xuK1x0aWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4rXHRcdGdvdG8gb3V0X2J1ZjtcbitcdHJldCA9IDA7XG4rb3V0X2J1ZjpcbitcdGZyZWUoYnVmKTtcbitvdXRfZmQ6XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJ3MgaW8uc3RhdCBmaWxlIGFuZFxuKyAqIGZpbGwgQG91dC4gQGRldiBpcyBhIGtlcm5lbCBkZXZfdCAoYXMgcmV0dXJuZWQgYnkgYnBmX2Jsa2dfZGV2KSwgd2hvc2VcbisgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlXG4rICogZGV2aWNlJ3MgbGluZSB3YXMgZm91bmQuXG4rICovXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuK1x0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcbitcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFwiaW8uc3RhdFwiLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4rXHRjbG9zZShmZCk7XG4rXHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdHJldHVybiAtMTtcbitcdGJ1ZltuXSA9ICdcXDAnO1xuK1xuK1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcIlxcblwiLCBcdTAwMjZzYXZlcHRyKTsgbGluZTtcbitcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuK1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBcIm1hajptaW5cIiB0b2tlbiBpcyBhbHdheXMgcHJlc2VudDsgdGhlIGZpZWxkIGJsb2NrIGlzXG4rXHRcdCAqIG9wdGlvbmFsICh0aGUga2VybmVsIG9taXRzIGl0IGZvciBhIGRldmljZSB3aXRoIG5vIHJlYWQvd3JpdGVcbitcdFx0ICogSS9PKSwgc28gYSBtYXRjaCBvZiBcdTAwM2U9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC5cbitcdFx0ICovXG4rXHRcdGlmIChzc2NhbmYobGluZSxcbitcdFx0XHQgICBcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCIsXG4rXHRcdFx0ICAgXHUwMDI2bWFqLCBcdTAwMjZtaW4sIFx1MDAyNnJiLCBcdTAwMjZ3YiwgXHUwMDI2cmksIFx1MDAyNndpLCBcdTAwMjZkYiwgXHUwMDI2ZGkpIFx1MDAzYyAyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gd2I7XG4rXHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBkYjtcbitcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbitcdFx0cmV0ID0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbit7XG4rXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XCI7XG4rXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuK1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4rXHRjaGFyIGxvb3BfcGF0aFs2NF07XG4rXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4rXHRpbnQgY2dyb3VwX2ZkO1xuK1xuK1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4rXHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4rXHR9XG4rXG4rXHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG9vcDtcbitcbitcdC8qXG4rXHQgKiBQaW4gdGhlIHJlYWQgdG8gdGhlIGxvb3AgZGV2aWNlIHNvIHRoZSBtZWFzdXJlZCBkZXZpY2UgaXMgc3RhYmxlIGFuZFxuK1x0ICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90XG4rXHQgKiBlbmNvZGluZyAobWFqb3IgXHUwMDNjXHUwMDNjIDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuXG4rXHQgKi9cbitcdHtcbitcdFx0c3RydWN0IHN0YXQgbHN0O1xuK1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcdTAwMjZsc3QpLCBcImZzdGF0IGxvb3BcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4rXHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2V0YXJnZXRfZGV2ID1cbitcdFx0XHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcdTAwM2NcdTAwM2MgMjApIHwgbWlub3IobHN0LnN0X3JkZXYpO1xuK1x0fVxuK1xuK1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4rXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XG4rXHRcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxuK1x0XHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcbitcdH07XG4rXHRvcHRzLmxpbmtfaW5mbyA9IFx1MDAyNmxpbmZvO1xuK1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbitcbitcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfaW9fcXVlcnksIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwiYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfc2tlbDtcbitcbitcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXG4rXHRpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgXCJkb19kaXJlY3RfaW9cIikpXG4rXHRcdGdvdG8gY2xlYW51cF9saW5rO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbGluaztcbitcbitcdC8qXG4rXHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxuK1x0ICogcGF0dGVybiBpbiBjZ3JvdXBfaXRlcl9tZW1jZy5cbitcdCAqL1xuK1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXCIpKSB7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCJ3Ynl0ZXNcIik7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwid2lvc1wiKTtcbitcdH1cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmJ5dGVzLCAwLCBcInJieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmlvcywgMCwgXCJyaW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fZGV2XCIpKVxuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwiZGV2XCIpO1xuK1xuK1x0LypcbitcdCAqIFN0cm9uZ2VyIGNoZWNrOiB0aGUga2Z1bmMtcmVhZCB2YWx1ZXMgbXVzdCBlcXVhbCB3aGF0IHRoZSBpby5zdGF0XG4rXHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxuK1x0ICogdGhlIGZpbGUgd2l0aCBubyBJL08gaW4gYmV0d2Vlbiwgc28gYm90aCBmbHVzaGVkIHNuYXBzaG90cyBtYXRjaFxuK1x0ICogZXhhY3RseS5cbitcdCAqL1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fbWF0Y2hcIikpIHtcbitcdFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XG4rXG4rXHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgQVNTRVJUX09LKHBhcnNlX2lvX3N0YXQoY2dyb3VwX2ZkLCBxLVx1MDAzZWRldiwgXHUwMDI2ZmlsZXYpLFxuK1x0XHRcdCAgICAgIFwicGFyc2UgaW8uc3RhdFwiKSkge1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJieXRlcywgZmlsZXYucmJ5dGVzLCBcInJieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3Ynl0ZXMsIGZpbGV2LndieXRlcywgXCJ3Ynl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmlvcywgZmlsZXYucmlvcywgXCJyaW9zXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdpb3MsIGZpbGV2Lndpb3MsIFwid2lvc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkYnl0ZXMsIGZpbGV2LmRieXRlcywgXCJkYnl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGlvcywgZmlsZXYuZGlvcywgXCJkaW9zXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWVcbitcdCAqIGZyb20gcnN0YXQsIHRoZXkgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMsIHNvIHRoaXNcbitcdCAqIGNvdmVycyB0aGUgb3RoZXIgaGFsZiBvZiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhleSBjb3ZlciBldmVyeVxuK1x0ICogY2dyb3VwJ3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXG4rXHQgKiB0aGV5IG11c3QgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGUgdGVzdCBjZ3JvdXAgd2FzIGNoYXJnZWQuXG4rXHQgKi9cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3Jvb3RcIikpIHtcbitcdFx0c3RydWN0IGJwZl9saW5rICpyb290X2xpbms7XG4rXHRcdHN0cnVjdCBpb19xdWVyeSAqcjtcbitcbitcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnID0gMDtcbitcdFx0cm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnksXG4rXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcImF0dGFjaCByb290IGl0ZXJcIikpIHtcbitcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCJyZWFkIHJvb3Qgc3RhdHNcIikpIHtcbitcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbitcdFx0XHRcdEFTU0VSVF9FUShza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfYmxrY2csIDEsXG4rXHRcdFx0XHRcdCAgXCJnb3Rfcm9vdF9ibGtjZ1wiKTtcbitcdFx0XHRcdEFTU0VSVF9FUShyLVx1MDAzZWRldiwgcS1cdTAwM2VkZXYsIFwicm9vdCBkZXZcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3Ynl0ZXMsIHEtXHUwMDNld2J5dGVzLCBcInJvb3Qgd2J5dGVzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2lvcywgcS1cdTAwM2V3aW9zLCBcInJvb3Qgd2lvc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJieXRlcywgcS1cdTAwM2VyYnl0ZXMsIFwicm9vdCByYnl0ZXNcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyaW9zLCBxLVx1MDAzZXJpb3MsIFwicm9vdCByaW9zXCIpO1xuK1x0XHRcdH1cbitcdFx0XHRicGZfbGlua19fZGVzdHJveShyb290X2xpbmspO1xuK1x0XHR9XG4rXHR9XG4rXG4rY2xlYW51cF9saW5rOlxuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kobGluayk7XG4rY2xlYW51cF9za2VsOlxuK1x0Y2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7XG4rY2xlYW51cF9sb29wOlxuK1x0bG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7XG4rY2xlYW51cF9jZ3JvdXBfZmQ6XG4rXHRjbG9zZShjZ3JvdXBfZmQpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmI4MzlkZWY5NDUwODZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICsxLDEwNyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLmhcIlxuK1xuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbitcbisvKiBUaGUgY291bnRlcnMgb2YgdGhlIGRldmljZSBuYW1lZCBieSB0YXJnZXRfZGV2IGFyZSBzdG9yZWQgaGVyZS4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rLyogVGhlIHNhbWUgZGV2aWNlJ3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBTZXQgdG8gMSBieSBjZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSB3aGVuIGJwZl9nZXRfcm9vdF9ibGtjZygpIHN1Y2NlZWRzLiAqL1xuK19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIERldmljZSB0byByZWFkLCBzZXQgYnkgdXNlcnNwYWNlIChrZXJuZWwgZGV2X3QpLiBQaW5uaW5nIHRoZSBkZXZpY2Uga2VlcHNcbisgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuXG4rICovXG4rX191NjQgdGFyZ2V0X2RldiBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKlxuKyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSdzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5XG4rICogdGhlIG9uZSBwaW5uZWQgZGV2aWNlIGtlZXBzIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYzogdGhhdCBkZXZpY2UgaXNcbisgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyBcImFueSBkZXZpY2VcbisgKiB3aXRoIEkvT1wiIHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay5cbisgKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csXG4rXHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbitcbitcdC8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovXG4rXHRicGZfYmxrY2dfZmx1c2hfc3RhdHMoYmxrY2cpO1xuK1xuK1x0LyogVGhlIHBlci1kZXZpY2UgYmxrZyB3YWxrIG5lZWRzIGFuIFJDVSBzZWN0aW9uLiAqL1xuK1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbitcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XG4rXHRcdGlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlZGV2ID0gYnBmX2Jsa2dfZGV2KHBvcyk7XG4rXHRcdG91dC1cdTAwM2VyYnl0ZXMgPSBicGZfYmxrZ19pb3N0YXRfYnl0ZXMocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTtcbitcdFx0b3V0LVx1MDAzZXdieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9ESVNDQVJEKTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rfVxuK1xuK1NFQyhcIml0ZXIucy9jZ3JvdXBcIilcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xuK1x0X19idWlsdGluX21lbXNldChcdTAwMjZpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7XG4rXG4rXHRibGtjZyA9IGJwZl9nZXRfYmxrY2coXHUwMDI2Y2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghYmxrY2cpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZpb19xdWVyeSk7XG4rXG4rXHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJpdGVyLnMvY2dyb3VwXCIpXG4raW50IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2cm9vdF9xdWVyeSwgMCwgc2l6ZW9mKHJvb3RfcXVlcnkpKTtcbitcbitcdGJsa2NnID0gYnBmX2dldF9yb290X2Jsa2NnKCk7XG4rXHRpZiAoIWJsa2NnKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdC8qXG4rXHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcbitcdCAqIHRoYW4gZnJvbSByc3RhdCwgc28gdGhpcyBhbHNvIGNvdmVycyB0aGUgcm9vdCBzaWRlIG9mXG4rXHQgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhlIGNvdW50ZXJzIGNvdmVyIGV2ZXJ5IGNncm91cCdzIEkvTywgc29cbitcdCAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QncyBvd24gY2dyb3VwIGRpZC5cbitcdCAqL1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZyb290X3F1ZXJ5KTtcbitcbitcdGdvdF9yb290X2Jsa2NnID0gMTtcbitcdGJwZl9wdXRfYmxrY2coYmxrY2cpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MDQuNjA3OTc4NzVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NjY0MzA3NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkJQRiBLZnVuY3MgZm9yIEJsb2NrIEkvTyBDb250cm9sbGVyOiBJbml0aWFsIFRob3VnaHRzKipcblxuT2theSwgc28gd2UndmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjaW5nIEJQRiBrZnVuY3Mgc3BlY2lmaWNhbGx5IGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIsIGJsa2NnLiBJbnRlcmVzdGluZy4gVGhlIG5ldyBgYmxvY2svYnBmX2Jsa2NnLmNgIGZpbGUgbGF5cyBvdXQgdGhlIGdyb3VuZHdvcmssIHByb3ZpZGluZyBrZnVuY3MgbGlrZSBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBhbmQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uczogYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgLiBQbHVzLCB3ZSBnZXQgYWNjZXNzIHRvIHRob3NlIGNydWNpYWwgYGJwZl9ibGtnX2lvc3RhdF9ieXRlc2AsIGBicGZfYmxrZ19pb3N0YXRfaW9zYCwgYW5kIGBicGZfYmxrZ19kZXZgIGZ1bmN0aW9ucy4gRXNzZW50aWFsbHksIEJQRiBwcm9ncmFtcyBjYW4gbm93IGRpcmVjdGx5IHJlYWQgYSBjZ3JvdXAncyBpby5zdGF0IGNvdW50ZXJzLiBUaGlzIGlzIGdvaW5nIHRvIGJlIHVzZWZ1bC4gVGhlIGNoYW5nZXMgdG91Y2ggYm90aCB0aGUgY29yZSBibG9jayBsYXllciBhbmQgdGhlIEJQRiBzdWJzeXN0ZW0sIHdoaWNoIG1lYW5zIHdlIHdpbGwgbmVlZCB0byB0ZXN0IGJvdGguXG5cbk5vdywgdGhpcyBzY3JlYW1zIFwiZnV6emluZyB0YXJnZXRcIiB0byBtZS4gR2V0dGluZyBCUEYgdG8gcmVsaWFibHkgcmVhZCBibGtjZyBkYXRhIHdpbGwgcmVxdWlyZSBzb21lIHNlcmlvdXMgdGVzdGluZy4gTGV0J3MgbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHJpZ2h0IHNvIHdlIGNhbiBidWlsZCB0aGlzLlxuXG5MZXQncyBmaW5kIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9ucy4uLiBPa2F5LCBgYmxvY2svTWFrZWZpbGVgIGdpdmVzIHVzIHRoZSBrZXk6XG5cbmBgYG1ha2VmaWxlXG5pZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbm9iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYnBmX2Jsa2NnLm9cbmVuZGlmXG5gYGBcblxuU28sIHdlJ3JlIGRlZmluaXRlbHkgbG9va2luZyBhdCBuZWVkaW5nIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX0JMS19DR1JPVVBgIGVuYWJsZWQuICBMZXQncyB2ZXJpZnkgdGhlcmUgYXJlIG5vIG90aGVyIGRlcGVuZGVuY2llcy4gSSBuZWVkIHRvIHJ1biBhIGBnaXQgZ3JlcGAgY2hlY2sgb24gYENPTkZJR19CTEtfQ0dST1VQYCBpbiBgYmxvY2svS2NvbmZpZ2AgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNDk0LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzI1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTEuMjcyMjg4MzMzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzNzA3MzM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBCTEtfQ0dST1VQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImJsb2NrL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJibG9jay9LY29uZmlnPTM5PWNvbmZpZyBCTEtfUlFfQUxMT0NfVElNRVxcbi0tXFxuYmxvY2svS2NvbmZpZy00MS1cXG5ibG9jay9LY29uZmlnOjQyOmNvbmZpZyBCTEtfQ0dST1VQX1JXU1RBVFxcbmJsb2NrL0tjb25maWctNDMtXFx0Ym9vbFxcbmJsb2NrL0tjb25maWctNDQtXFxuYmxvY2svS2NvbmZpZzo0NTpjb25maWcgQkxLX0NHUk9VUF9QVU5UX0JJT1xcbmJsb2NrL0tjb25maWctNDYtXFx0Ym9vbFxcbi0tXFxuYmxvY2svS2NvbmZpZz0xMjc9Y29uZmlnIEJMS19XQlRfTVFcXG4tLVxcbmJsb2NrL0tjb25maWctMTMzLVxcbmJsb2NrL0tjb25maWc6MTM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPTEFURU5DWVxcbmJsb2NrL0tjb25maWctMTM1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBsYXRlbmN5IGJhc2VkIGNncm91cCBJTyBwcm90ZWN0aW9uXFxcIlxcbi0tXFxuYmxvY2svS2NvbmZpZy0xNDQtXFxuYmxvY2svS2NvbmZpZzoxNDU6Y29uZmlnIEJMS19DR1JPVVBfRkNfQVBQSURcXG5ibG9jay9LY29uZmlnLTE0Ni1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCB0byB0cmFjayBGQyBJL08gVHJhZmZpYyBhY3Jvc3MgY2dyb3VwIGFwcGxpY2F0aW9uc1xcXCJcXG4tLVxcbmJsb2NrL0tjb25maWctMTUzLVxcbmJsb2NrL0tjb25maWc6MTU0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVFxcbmJsb2NrL0tjb25maWctMTU1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXFxcIlxcbi0tXFxuYmxvY2svS2NvbmZpZy0xNjMtXFxuYmxvY2svS2NvbmZpZzoxNjQ6Y29uZmlnIEJMS19DR1JPVVBfSU9QUklPXFxuYmxvY2svS2NvbmZpZy0xNjUtXFx0Ym9vbCBcXFwiQ2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzoxMS4zMTYwMDI2MDJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyNjUwMDYxMjI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUuIE15IGN1cnJlbnQgdHJhaW4gb2YgdGhvdWdodCBzZWVtcyB0byBiZSBzdHVjayBvbiBzb21ldGhpbmcuIEknbSBoaXR0aW5nIGEgcm9hZGJsb2NrIGFuZCBuZWVkIHRvIGZpbmQgYSB3YXkgYXJvdW5kIGl0LiAqKkludmVzdGlnYXRpbmcgS2VybmVsIENvbmZpZ3VyYXRpb24qKi4gXG5cbkkgbmVlZCB0byByZWZpbmUgbXkgc2VhcmNoLiBSaWdodCBub3csIEknbSB0aGlua2luZyBJIHNob3VsZCBmb2N1cyBvbiBrZXJuZWwgY29uZmlndXJhdGlvbiwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5IG9uIHNvbWV0aGluZyByZWxhdGVkIHRvIGJsb2NrIGNncm91cHMuIFRvIGJlIHByZWNpc2UsIEkgc2hvdWxkIHRyeSB0byBzZWFyY2ggZm9yIHRoZSBleGFjdCBzdHJpbmc6IGBjb25maWcgQkxLX0NHUk9VUGAuIEhvcGVmdWxseSwgdGhhdCB3aWxsIGxlYWQgbWUgdG8gdGhlIHJlbGV2YW50IHNldHRpbmdzIGFuZCBkb2N1bWVudGF0aW9uIEkgbmVlZC4gVGltZSB0byBnZXQgc3BlY2lmaWMhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjQwLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTMuOTY2MDY2MjI2WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NTE2OTk5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeY29uZmlnIEJMS19DR1JPVVAkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImJsb2NrL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTQuMDExNTkzMzI1WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM2NTg4NjkzMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHN1bW1hcnksIHByZXNlbnRlZCBhcyBhIHN0cmVhbSBvZiB0aG91Z2h0OlxuXG4qKkZvY3VzaW5nIEluIG9uIEJsb2NrIENHcm91cHMqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgYEJMS19DR1JPVVBgIGlzIGRlZmluZWQgb3IgY29uZmlndXJlZC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIGBibG9jay9LY29uZmlnYCBmaWxlLiBUaGF0J3MgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQg4oCTIGl0J3Mgd2hlcmUga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGJsb2NrIGRldmljZXMgdHlwaWNhbGx5IHJlc2lkZS4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIEl0J3MgdGltZSB0byBkZWx2ZSBpbnRvIHRoZSBLY29uZmlnLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGVzZSBvcHRpb25zIGFyZSBkZXNjcmliZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzODIwLCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MTcuMzc3NDgyMzQ1WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzNDk1MDM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJMS19DR1JPVVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYmxvY2svS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJibG9jay9LY29uZmlnPTM5PWNvbmZpZyBCTEtfUlFfQUxMT0NfVElNRVxcbi0tXFxuYmxvY2svS2NvbmZpZy00MS1cXG5ibG9jay9LY29uZmlnOjQyOmNvbmZpZyBCTEtfQ0dST1VQX1JXU1RBVFxcbmJsb2NrL0tjb25maWctNDMtXFx0Ym9vbFxcbmJsb2NrL0tjb25maWctNDQtXFxuYmxvY2svS2NvbmZpZzo0NTpjb25maWcgQkxLX0NHUk9VUF9QVU5UX0JJT1xcbmJsb2NrL0tjb25maWctNDYtXFx0Ym9vbFxcbi0tXFxuYmxvY2svS2NvbmZpZz0xMDY9Y29uZmlnIEJMS19ERVZfVEhST1RUTElOR1xcbmJsb2NrL0tjb25maWctMTA3LVxcdGJvb2wgXFxcIkJsb2NrIGxheWVyIGJpbyB0aHJvdHRsaW5nIHN1cHBvcnRcXFwiXFxuYmxvY2svS2NvbmZpZzoxMDg6XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXFxuYmxvY2svS2NvbmZpZzoxMDk6XFx0c2VsZWN0IEJMS19DR1JPVVBfUldTVEFUXFxuYmxvY2svS2NvbmZpZy0xMTAtXFx0aGVscFxcbi0tXFxuYmxvY2svS2NvbmZpZz0xMjc9Y29uZmlnIEJMS19XQlRfTVFcXG4tLVxcbmJsb2NrL0tjb25maWctMTMzLVxcbmJsb2NrL0tjb25maWc6MTM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPTEFURU5DWVxcbmJsb2NrL0tjb25maWctMTM1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBsYXRlbmN5IGJhc2VkIGNncm91cCBJTyBwcm90ZWN0aW9uXFxcIlxcbmJsb2NrL0tjb25maWc6MTM2OlxcdGRlcGVuZHMgb24gQkxLX0NHUk9VUFxcbmJsb2NrL0tjb25maWctMTM3LVxcdGhlbHBcXG4tLVxcbmJsb2NrL0tjb25maWctMTQ0LVxcbmJsb2NrL0tjb25maWc6MTQ1OmNvbmZpZyBCTEtfQ0dST1VQX0ZDX0FQUElEXFxuYmxvY2svS2NvbmZpZy0xNDYtXFx0Ym9vbCBcXFwiRW5hYmxlIHN1cHBvcnQgdG8gdHJhY2sgRkMgSS9PIFRyYWZmaWMgYWNyb3NzIGNncm91cCBhcHBsaWNhdGlvbnNcXFwiXFxuYmxvY2svS2NvbmZpZzoxNDc6XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQIFxcdTAwMjZcXHUwMDI2IE5WTUVfRkNcXG5ibG9jay9LY29uZmlnLTE0OC1cXHRoZWxwXFxuLS1cXG5ibG9jay9LY29uZmlnLTE1My1cXG5ibG9jay9LY29uZmlnOjE1NDpjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcXG5ibG9jay9LY29uZmlnLTE1NS1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCBmb3IgY29zdCBtb2RlbCBiYXNlZCBjZ3JvdXAgSU8gY29udHJvbGxlclxcXCJcXG5ibG9jay9LY29uZmlnOjE1NjpcXHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcXG5ibG9jay9LY29uZmlnLTE1Ny1cXHRzZWxlY3QgQkxLX1JRX0FMTE9DX1RJTUVcXG4tLVxcbmJsb2NrL0tjb25maWctMTYzLVxcbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xcbmJsb2NrL0tjb25maWctMTY1LVxcdGJvb2wgXFxcIkNncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1xcXCJcXG5ibG9jay9LY29uZmlnOjE2NjpcXHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcXG5ibG9jay9LY29uZmlnLTE2Ny1cXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjE3LjQyMDk4MjUyM1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2OTA0NDI3MzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyBhIEtlcm5lbC1MZXZlbCBCbG9jayBJL08gSXNzdWUqKlxuXG5Pa2F5LCBzbyBJJ20ga25lZS1kZWVwIGluIHRoaXMgYmxvY2sgSS9PIHBlcmZvcm1hbmNlIGlzc3VlLCBhbmQgSSd2ZSBoaXQgYSBzbmFnLiBJJ20gbG9va2luZyBhdCB0aGUgcmVsZXZhbnQgY29kZSBwYXRoLCBhbmQgSSd2ZSBlbmNvdW50ZXJlZCBgQkxLX0NHUk9VUGAuIE5vdywgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBcIldhaXQgYSBtaW51dGUuLi4gd2hlcmUgKmV4YWN0bHkqIGlzIGBCTEtfQ0dST1VQYCBkZWZpbmVkP1wiIEl0J3MgYmVlbiBhIHdoaWxlIHNpbmNlIEkgbGFzdCBsb29rZWQgYXQgdGhpcyBwYXJ0IG9mIHRoZSBrZXJuZWwsIGFuZCB0aGUgY2dyb3VwIGJsb2NrIEkvTyBpbnRlZ3JhdGlvbiBjYW4gYmUgdHJpY2t5LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIG1hY3JvcyBhbmQgdmFyaWFibGVzIGluIHBsYXkuIEkgbmVlZCB0aGUgZGVmaW5pdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3cgaGVyZS4gSXMgaXQgYSBjb3JlIGNncm91cCBjb25zdGFudD8gSXMgaXQgYSBsb2NhbCBkZWZpbml0aW9uIHdpdGhpbiB0aGUgYmxvY2sgbGF5ZXIncyBjZ3JvdXAgaW1wbGVtZW50YXRpb24/IEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBoZWFkZXIgZmlsZSBvciBtb2R1bGUgdGhhdCBkZWNsYXJlcyB0aGlzIGNvbnN0YW50LiBXaXRob3V0IHRoYXQsIEknbSBlc3NlbnRpYWxseSBmbHlpbmcgYmxpbmQgYW5kIGNhbid0IGFjY3VyYXRlbHkgYXNzZXNzIGl0cyByb2xlIGluIHRoaXMgcGVyZm9ybWFuY2UgYm90dGxlbmVjay4gQmFjayB0byB0aGUgaW5jbHVkZSBwYXRocyFcblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1ODksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzoyMS4xMTE0Mjg1MDRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0NDc3MjA4LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJebWVudWNvbmZpZyBCTEtfQ0dST1VQJFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJibG9jay9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjIxLjE1NTkxMzc5MloiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyOTczMzMzNzc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgc3VtbWFyeSwgcHJlc2VudGVkIGFzIGEgc3RyZWFtIG9mIHRob3VnaHQ6XG5cbioqS2NvbmZpZyBLZXl3b3JkIEh1bnQ6IEJMS19DR1JPVVAqKlxuXG5SaWdodCwgdGltZSB0byBnZXQgdG8gd29yay4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGBCTEtfQ0dST1VQYCB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBJIGtub3cgaXQncyByZWxhdGVkIHRvIGNncm91cCBibG9jayBkZXZpY2UgY29udHJvbCwgYnV0IEkgbmVlZCBhIGRlZmluaXRpdmUgcGljdHVyZS4gU28sIEkgbmVlZCB0byBkbyBhIGZ1bGwgc2VhcmNoLiBJJ20gZ29pbmcgdG8gc2NhbiAqYWxsKiB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBtZWFucyBhIGNvbXByZWhlbnNpdmUgc2VhcmNoIGFjcm9zcyB0aGUgZW50aXJlIGtlcm5lbCBjb25maWd1cmF0aW9uIHNwYWNlLiBObyBjaGVycnktcGlja2luZywgSSB3YW50IHRoZSBmdWxsIGNvbnRleHQuIExldCdzIHNlZSB3aGF0IHRoZSBLY29uZmlnIGZpbGVzIGhhdmUgdG8gc2F5IGFib3V0IHRoaXMuIFRoYXQgc2VhcmNoIHNob3VsZCBnaXZlIG1lIHRoZSBpbmZvcm1hdGlvbiBJIG5lZWQuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIGRlcGVuZGVuY2llcyBhbmQgZGVmYXVsdCB2YWx1ZXMgb25jZSBJIGhhdmUgdGhlIHJlc3VsdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0ODc1LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MjQuMTI5MjQ5NjA2WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTEyOTA2ODk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5jb25maWcgQkxLX0NHUk9VUCRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDk5PWNvbmZpZyBNRU1DR19WMVxcbi0tXFxuaW5pdC9LY29uZmlnLTExMTUtXFxuaW5pdC9LY29uZmlnOjExMTY6Y29uZmlnIEJMS19DR1JPVVBcXG5pbml0L0tjb25maWctMTExNy1cXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzoyNi42NDIxNjA4MTRaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE0NzU5NzgxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyBhIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jeSoqXG5cblJpZ2h0LCBJJ20gb250byBzb21ldGhpbmcuLi50aGUgc2V0dGluZyBJJ20gYWZ0ZXIgaXMgcHJvYmFibHkgaW4gYGluaXQvS2NvbmZpZ2AuIENsYXNzaWMgcGxhY2UgZm9yIGNvcmUgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaW1lIHRvIGRpZyBpbiBhbmQgdW5kZXJzdGFuZCBpdHMgZGVwZW5kZW5jaWVzLiBObyBwb2ludCBqdXN0IGZsaXBwaW5nIGEgc3dpdGNoIGJsaW5kbHk7IGdvdHRhIGZpZ3VyZSBvdXQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgaXQgYmVpbmcgc2V0IHVwIHRoZSB3YXkgaXQgaXMuIEkgbmVlZCB0byBzZWUgKndoeSogaXQncyBjb25maWd1cmVkIHRoZSB3YXkgaXQgaXMgLSBhcmUgdGhlcmUgc3BlY2lmaWMgZmVhdHVyZXMsIGtlcm5lbCB2ZXJzaW9ucywgb3IgaGFyZHdhcmUgY29uZmlndXJhdGlvbnMgdGhhdCB0cmlnZ2VyIGl0cyBpbmNsdXNpb24/IElzIGl0IGdhdGVkIG9uIHNvbWUgZXNvdGVyaWMgbWVudSBwYXRoPyBJJ2xsIG5lZWQgdG8gcmV2ZXJzZS1lbmdpbmVlciBpdHMgaW1wbGljYXRpb25zIHdpdGhpbiB0aGUgYnJvYWRlciBhcmNoaXRlY3R1cmUuIE9rYXksIGxldCdzIGZpcmUgdXAgdGhlIGVkaXRvciBhbmQgc3RhcnQgdHJhY2luZy4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTE3MCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjMwLjc4OTc2MTM1OVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ2NTIzNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJMS19DR1JPVVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDk5PWNvbmZpZyBNRU1DR19WMVxcbi0tXFxuaW5pdC9LY29uZmlnLTExMTUtXFxuaW5pdC9LY29uZmlnOjExMTY6Y29uZmlnIEJMS19DR1JPVVBcXG5pbml0L0tjb25maWctMTExNy1cXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzozMC44MzQ0MTc5MDhaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzYzMjkwNDc0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKipcblxuT2theSwgc28gSSdtIHRyeWluZyB0byBnZXQgYSBoYW5kbGUgb24gdGhpcyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEknbSB0aGlua2luZywgYGluaXQvS2NvbmZpZ2AgaXMgdGhlIHBsYWNlIHRvIHN0YXJ0LCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTExNi4gVGhhdCBhcmVhIGxpa2VseSBkZWFscyB3aXRoIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb3IgYSBwYXJ0aWN1bGFyIG1vZHVsZSBJJ20gaW50ZXJlc3RlZCBpbi4gSSBzaG91bGQgY2hlY2sgdGhhdCBzZWN0aW9uIGZvciB0aGUgcmVsZXZhbnQgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gTGV0J3Mgc2VlIHdoYXQgZ2VtcyBsaWUgaW4gd2FpdCBpbiB0aGF0IHBvcnRpb24gb2YgYEtjb25maWdgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTQ1NCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjAzOjM0LjQ2NzMyNDYxWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NDg2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbml0L0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMTExMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTExMDpcXHRcXHQgIFBsZWFzZSBub3RlIHRoYXQgZmVhdHVyZSBzZXQgb2YgdGhlIGxlZ2FjeSBtZW1vcnkgY29udHJvbGxlciBpcyBsaWtlbHlcXG4xMTExOlxcdFxcdCAgZ29pbmcgdG8gc2hyaW5rIGR1ZSB0byBkZXByZWNhdGlvbiBwcm9jZXNzLiBOZXcgZGVwbG95bWVudHMgd2l0aCB2MVxcbjExMTI6XFx0XFx0ICBjb250cm9sbGVyIGFyZSBoaWdobHkgZGlzY291cmFnZWQuXFxuMTExMzpcXHRcXG4xMTE0OlxcdFxcdCAgU2F5IE4gaWYgdW5zdXJlLlxcbjExMTU6XFx0XFxuMTExNjpcXHRjb25maWcgQkxLX0NHUk9VUFxcbjExMTc6XFx0XFx0Ym9vbCBcXFwiSU8gY29udHJvbGxlclxcXCJcXG4xMTE4OlxcdFxcdGRlcGVuZHMgb24gQkxPQ0tcXG4xMTE5OlxcdFxcdGRlZmF1bHQgblxcbjExMjA6XFx0XFx0aGVscFxcbjExMjE6XFx0XFx0R2VuZXJpYyBibG9jayBJTyBjb250cm9sbGVyIGNncm91cCBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlIGNvbW1vblxcbjExMjI6XFx0XFx0Y2dyb3VwIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgdXNlZCBieSB2YXJpb3VzIElPIGNvbnRyb2xsaW5nXFxuMTEyMzpcXHRcXHRwb2xpY2llcy5cXG4xMTI0OlxcdFxcbjExMjU6XFx0XFx0Q3VycmVudGx5LCBDRlEgSU8gc2NoZWR1bGVyIHVzZXMgaXQgdG8gcmVjb2duaXplIHRhc2sgZ3JvdXBzIGFuZFxcbjExMjY6XFx0XFx0Y29udHJvbCBkaXNrIGJhbmR3aWR0aCBhbGxvY2F0aW9uIChwcm9wb3J0aW9uYWwgdGltZSBzbGljZSBhbGxvY2F0aW9uKVxcbjExMjc6XFx0XFx0dG8gc3VjaCB0YXNrIGdyb3Vwcy4gSXQgaXMgYWxzbyB1c2VkIGJ5IGJpbyB0aHJvdHRsaW5nIGxvZ2ljIGluXFxuMTEyODpcXHRcXHRibG9jayBsYXllciB0byBpbXBsZW1lbnQgdXBwZXIgbGltaXQgaW4gSU8gcmF0ZXMgb24gYSBkZXZpY2UuXFxuMTEyOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6MzQuNDY3NTAwODdaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzAxMjA2NDY1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEJsb2NrIGNncm91cCBCUEYgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBCTEtfQ0dST1VQYCBzdHVmZiwgYW5kIGl0J3MgcHJldHR5IGNsZWFyIHRoYXQgaXQgaGFzIGEgZGVwZW5kZW5jeSBvbiBgQkxPQ0tgLiBUaGF0J3Mgbm90IHVuZXhwZWN0ZWQsIGJ1dCBnb29kIHRvIGtlZXAgaW4gbWluZC4gSSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBrZXJuZWwgY29uZmlnIGluY2x1ZGVzIGBCUEZfU1lTQ0FMTGAgYWxvbmcgd2l0aCBgQkxLX0NHUk9VUGAg4oCTIHRoZXNlIGFyZSBteSBiYXNlIHJlcXVpcmVtZW50cy5cblxuTm93LCBsZXQncyBuYWlsIGRvd24gdGhlIGNyaXRpY2FsIHBpZWNlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIG5ldyBhZGRpdGlvbnMgYW5kIGNoYW5nZXMuIE15IGZvY3VzIHJpZ2h0IG5vdyBpcyB0byBpZGVudGlmeSB0aGUgbWFpbiBzeW1ib2xzIHRoYXQgZGVmaW5lIHRoZSBCUEYgaW50ZWdyYXRpb24gZm9yIGJsb2NrIGNncm91cHMuXG5cbkZyb20gYGJsb2NrL2JwZl9ibGtjZy5jYCwgdGhlc2UgYXJlIHRoZSBrZXkgZnVuY3Rpb25zIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kOiBgYnBmX2dldF9yb290X2Jsa2NnYCwgYGJwZl9nZXRfYmxrY2dgLCBgYnBmX3B1dF9ibGtjZ2AsIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAsIGBicGZfYmxrZ19pb3N0YXRfYnl0ZXNgLCBgYnBmX2Jsa2dfaW9zdGF0X2lvc2AsIGFuZCBgYnBmX2Jsa2dfZGV2YC4gVGhlc2UgY2xlYXJseSBoYW5kbGUgdGhpbmdzIGxpa2Ugcm9vdCBjZ3JvdXAgYWNjZXNzLCBjZ3JvdXAgbWFuYWdlbWVudCwgc3RhdHMgZmx1c2hpbmcsIGFuZCBpdGVyYXRpb24sIGFzIHdlbGwgYXMgYWNjZXNzaW5nIEkvTyBzdGF0aXN0aWNzIGFuZCB0aGUgZGV2aWNlIGl0c2VsZi5cblxuSXQgbG9va3MgbGlrZSB0aGUgYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYCBmdW5jdGlvbiBpbiBgYmxvY2svYmxrLWNncm91cC5jYCBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgdG8gYmUgbm9uLXN0YXRpYy4gSSBuZWVkIHRvIGNoZWNrIHRoaXMgb3V0LCBhcyBub24tc3RhdGljIGxpa2VseSBpbmRpY2F0ZXMgaXQncyB1c2VkIG1vcmUgYnJvYWRseSBub3cuXG5cbkknbGwgbWFrZSBzdXJlIHRvIGFkZCBhbGwgb2YgdGhlc2UgYXMgXCJGb2N1c1N5bWJvbHNcIiBpbiBteSBub3RlcywgdG8gdHJhY2sgdGhlbSBhcyBJIGRpdmUgZGVlcGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTkxNCwiT3V0cHV0VG9rZW5zIjoyMzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzo0MS40Nzk1Njg2NzJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3ODAxMTE0OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJMS19DR1JPVVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfZ2V0X3Jvb3RfYmxrY2dcIixcbiAgICBcImJwZl9nZXRfYmxrY2dcIixcbiAgICBcImJwZl9wdXRfYmxrY2dcIixcbiAgICBcImJwZl9ibGtjZ19mbHVzaF9zdGF0c1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXdcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19kZXN0cm95XCIsXG4gICAgXCJicGZfYmxrZ19pb3N0YXRfYnl0ZXNcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9pb3NcIixcbiAgICBcImJwZl9ibGtnX2RldlwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciB0aGUgYmxvY2sgSS9PIGNvbnRyb2xsZXIgKGJsa2NnKSB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcmVhZCBhIGNncm91cCdzIGlvLnN0YXQgY291bnRlcnMuIFRoZXNlIGtmdW5jcyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGhhbmRsZSB2YXJpb3VzIGlucHV0cyBhbmQgY29uY3VycmVudCBleGVjdXRpb25zIHNhZmVseS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQkxLX0NHUk9VUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9nZXRfcm9vdF9ibGtjZ1wiLFxuICAgIFwiYnBmX2dldF9ibGtjZ1wiLFxuICAgIFwiYnBmX3B1dF9ibGtjZ1wiLFxuICAgIFwiYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzXCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXh0XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX2Rlc3Ryb3lcIixcbiAgICBcImJwZl9ibGtnX2lvc3RhdF9ieXRlc1wiLFxuICAgIFwiYnBmX2Jsa2dfaW9zdGF0X2lvc1wiLFxuICAgIFwiYnBmX2Jsa2dfZGV2XCIsXG4gICAgXCJibGtjZ19maWxsX3Jvb3RfaW9zdGF0c1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIHRoZSBibG9jayBJL08gY29udHJvbGxlciAoYmxrY2cpIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gVGhlc2Uga2Z1bmNzIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgaGFuZGxlIHZhcmlvdXMgaW5wdXRzIGFuZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgc2FmZWx5LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzo0MS41NTc1ODc3NTlaIiwiU2VxIjoxOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjUzNjM5NjE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6NDEuNTU4MTQ0MDE5WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE3MjUzMDgwNjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MgKGlvLnN0YXQpLiBJdCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgY29tcGxleCBzdHJ1Y3R1cmVzLCBjb3B5IGRhdGEgZGlyZWN0bHkgdG8gdXNlciBzcGFjZSwgb3IgaW50cm9kdWNlIGxvZ2ljIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUga2Z1bmNzIHJldHVybiBzaW1wbGUgc2NhbGFyIHZhbHVlcyAodTY0KSBvciBwb2ludGVycyB0byBleGlzdGluZywgaW5pdGlhbGl6ZWQga2VybmVsIHN0cnVjdHVyZXMuIFRoZSBCUEYgaXRlcmF0b3Igc3RhdGUgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcywgc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgcmVsYXRlZCB0byBSQ1Ugb3IgY2dyb3VwIHJlZmVyZW5jZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyY2ExOWE4YTI0ODg3Mjg4OGRlMWE1YmU3ZDY3ODM4YTJmMmE0MjE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTowMzowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuKysrIGIvTUFJTlRBSU5FUlNcbkBAIC02NjE3LDYgKzY2MTcsNyBAQCBGOlx0YmxvY2svYmxrLWNncm91cC5jXG4gRjpcdGJsb2NrL2Jsay1pb2Nvc3QuY1xuIEY6XHRibG9jay9ibGstaW9sYXRlbmN5LmNcbiBGOlx0YmxvY2svYmxrLXRocm90dGxlLmNcbitGOlx0YmxvY2svYnBmX2Jsa2NnLmNcbiBGOlx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcbiBcbiBDT05UUk9MIEdST1VQIC0gQ1BVU0VUXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4rKysgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTE3LDYgKzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICs9IGVycm9yLWluamVjdGlvbi5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgKz0gYnNnLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXHQrPSBic2ctbGliLm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJsay1jZ3JvdXAub1xuK2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYnBmX2Jsa2NnLm9cbitlbmRpZlxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX1JXU1RBVClcdCs9IGJsay1jZ3JvdXAtcndzdGF0Lm9cbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgKz0gYmxrLWNncm91cC1mYy1hcHBpZC5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcdCs9IGJsay10aHJvdHRsZS5vXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jXG5pbmRleCBkOTY3NjEyNmM1YjVkLi44ZDUzOGFkNGU4NjFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmNcbkBAIC0xMDg2LDcgKzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxuICAqIGZsdXNoaW5nIHRoZSByb290IGNncm91cCdzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XG4gICogd2l0aCBkaXNrIGxldmVsIHN0YXRpc3RpY3MuXG4gICovXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4ge1xuIFx0c3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG5kaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oXG5pbmRleCA2MTUzOTBmNzUxYWEyLi44YzljMmExYWRmYWE0IDEwMDY0NFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXG4rKysgYi9ibG9jay9ibGstY2dyb3VwLmhcbkBAIC0yMDUsNiArMjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcbiBcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBibGtjZ19wb2xpY3kgKnBvbCk7XG4gXG4gY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpO1xuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XG4gdm9pZCBibGtjZ19wcmludF9ibGtncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3QgYmxrY2cgKmJsa2NnLFxuIFx0XHQgICAgICAgdTY0ICgqcHJmaWxsKShzdHJ1Y3Qgc2VxX2ZpbGUgKixcbiBcdFx0XHRcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcbmRpZmYgLS1naXQgYS9ibG9jay9icGZfYmxrY2cuYyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDhhODZmMDdlMTk4YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvYmxvY2svYnBmX2Jsa2NnLmNcbkBAIC0wLDAgKzEsMzE1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbisvKlxuKyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUuXG4rICpcbisgKiBUaGVzZSBsZXQgYSBCUEYgcHJvZ3JhbSByZWFkIGEgY2dyb3VwJ3MgaW8uc3RhdCBjb3VudGVycy4gQSBwcm9ncmFtIHR1cm5zIGFcbisgKiBjZ3JvdXAncyBjc3MgaW50byBhIHN0cnVjdCBibGtjZyB3aXRoIGJwZl9nZXRfYmxrY2coKSwgZmx1c2hlcyB0aGUgc3RhdHMgd2l0aFxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpLCB0aGVuIHdhbGtzIHRoZSBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzIHdpdGggdGhlXG4rICogYnBmX2l0ZXJfYmxrZyBvcGVuLWNvZGVkIGl0ZXJhdG9yLCByZWFkaW5nIGVhY2ggZGV2aWNlJ3MgY291bnRlcnMgd2l0aFxuKyAqIGJwZl9ibGtnX2lvc3RhdF9ieXRlcygpL2JwZl9ibGtnX2lvc3RhdF9pb3MoKS4gSXQgbWlycm9ycyB0aGUgbWVtb3J5XG4rICogY29udHJvbGxlciBrZnVuY3MgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgYnV0IGFkZHMgYSBwZXItZGV2aWNlIGRpbWVuc2lvbjpcbisgKiB1bmxpa2UgbWVtY2csIGJsa2NnIGtlZXBzIG9uZSBibGtnIChhbmQgb25lIGlvLnN0YXQgbGluZSkgcGVyIGJsb2NrIGRldmljZS5cbisgKlxuKyAqIFRoaXMgZmlsZSBsaXZlcyBpbiBibG9jay8gYmVjYXVzZSB0aGUgYmxrY2cvYmxrZyBzdHJ1Y3QgbGF5b3V0cyBhcmUgcHJpdmF0ZVxuKyAqIHRvIGJsb2NrL2Jsay1jZ3JvdXAuaC5cbisgKi9cbitcbisjaW5jbHVkZSBcImJsay1jZ3JvdXAuaFwiXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2dldF9yb290X2Jsa2NnIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgYmxvY2sgY2dyb3VwXG4rICpcbisgKiBUaGUgZnVuY3Rpb24gaGFzIEtGX0FDUVVJUkUgc2VtYW50aWNzLCBldmVuIHRob3VnaCB0aGUgcm9vdCBibG9jayBjZ3JvdXAgaXNcbisgKiBuZXZlciBkZXN0cm95ZWQgYW5kIGRvZXNuJ3QgcmVxdWlyZSByZWZlcmVuY2UgY291bnRpbmcuIEl0J3Mgc2FmZSB0byBwYXNzIGl0XG4rICogdG8gYnBmX3B1dF9ibGtjZygpLlxuKyAqXG4rICogTm90ZSB0aGF0IHRoZSByb290IGNncm91cCBpcyBzcGVjaWFsOiBpdHMgY291bnRlcnMgYXJlIHRoZSBkaXNrcycgb3duXG4rICogc3RhdGlzdGljcywgc28gdGhleSBjb3ZlciBldmVyeSBjZ3JvdXAncyBJL08gcmF0aGVyIHRoYW4gb25seSB0aGUgcm9vdCdzLlxuKyAqIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSByb290IGlvLnN0YXQgZmlsZSBwcmludHMuXG4rICpcbisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBibG9jayBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X3Jvb3RfYmxrY2codm9pZClcbit7XG4rXHQvKiBjc3NfZ2V0KCkgaXMgbm90IG5lZWRlZCAqL1xuK1x0cmV0dXJuIFx1MDAyNmJsa2NnX3Jvb3Q7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9nZXRfYmxrY2cgLSBHZXQgYSByZWZlcmVuY2UgdG8gYSBibG9jayBjZ3JvdXBcbisgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXG4rICpcbisgKiBJdCdzIGZpbmUgdG8gcGFzcyBhIGNzcyB3aGljaCBiZWxvbmdzIHRvIGFueSBjZ3JvdXAgY29udHJvbGxlcixcbisgKiBlLmcuIHVuaWZpZWQgaGllcmFyY2h5J3MgbWFpbiBjc3MuXG4rICpcbisgKiBJbXBsZW1lbnRzIEtGX0FDUVVJUkUgc2VtYW50aWNzLlxuKyAqXG4rICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gYSBibGtjZyBzdHJ1Y3R1cmUgYWZ0ZXIgYnVtcGluZyB0aGUgY29ycmVzcG9uZGluZyBjc3Mnc1xuKyAqIHJlZmVyZW5jZSBjb3VudGVyLCBvciBOVUxMIGlmIHRoZSBpbyBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjZ3JvdXAuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnICpicGZfZ2V0X2Jsa2NnKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4re1xuK1x0c3RydWN0IGJsa2NnICpibGtjZyA9IE5VTEw7XG4rXG4rXHRpZiAoY3NzLVx1MDAzZXNzID09IFx1MDAyNmlvX2NncnBfc3Vic3lzKVxuK1x0XHRyZXR1cm4gY3NzX3RyeWdldChjc3MpID8gY3NzX3RvX2Jsa2NnKGNzcykgOiBOVUxMO1xuK1xuK1x0LypcbitcdCAqIFNvbWUgb3RoZXIgY29udHJvbGxlcidzIGNzcywgb3IgdGhlIGNncm91cCdzIG93biBvbmUuIExvb2sgdXAgdGhlIGlvXG4rXHQgKiBjb250cm9sbGVyJ3MgY3NzOyByY3Uga2VlcHMgaXQgYWxpdmUgYmV0d2VlbiB0aGUgbG9hZCBhbmQgdGhlIHRyeWdldC5cbitcdCAqIEFjcXVpcmUgYW5kIHJlbGVhc2UgcmN1IG9uIG9uZSBzdHJhaWdodCBwYXRoLCBzbyB0aGF0IGJsb2NrLydzIGxvY2tcbitcdCAqIGNvbnRleHQgYW5hbHlzaXMgY2FuIGZvbGxvdyBpdC5cbitcdCAqL1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0Y3NzID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhjc3MtXHUwMDNlY2dyb3VwLVx1MDAzZXN1YnN5c1tpb19jZ3JwX2lkXSk7XG4rXHRpZiAoY3NzIFx1MDAyNlx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXG4rXHRcdGJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdHJldHVybiBibGtjZztcbit9XG4rXG4rLyoqXG4rICogYnBmX3B1dF9ibGtjZyAtIFB1dCBhIHJlZmVyZW5jZSB0byBhIGJsb2NrIGNncm91cFxuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwIHRvIHJlbGVhc2VcbisgKlxuKyAqIFJlbGVhc2VzIGEgcHJldmlvdXNseSBhY3F1aXJlZCBibGtjZyByZWZlcmVuY2UuXG4rICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9wdXRfYmxrY2coc3RydWN0IGJsa2NnICpibGtjZylcbit7XG4rXHRjc3NfcHV0KFx1MDAyNmJsa2NnLVx1MDAzZWNzcyk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xuKyAqIEBibGtjZzogYmxvY2sgY2dyb3VwXG4rICpcbisgKiBDYWxsIHRoaXMgYmVmb3JlIHJlYWRpbmcgY291bnRlcnMgZm9yIHVwLXRvLWRhdGUgdmFsdWVzLiBTbGVlcGFibGUuXG4rICpcbisgKiBJdCBkb2VzIHdoYXQgcmVhZGluZyB0aGUgaW8uc3RhdCBmaWxlIGRvZXMsIHdoaWNoIGRpZmZlcnMgYnkgY2dyb3VwLiBGb3IgYVxuKyAqIG5vbi1yb290IGNncm91cCBpdCBmb2xkcyB0aGUgcGVyLWNwdSBkZWx0YXMgaW50byB0aGUgcGVyLWRldmljZSBhZ2dyZWdhdGVzXG4rICogYW5kIHVwIHRoZSBjZ3JvdXAgdHJlZS4gVGhlIHJvb3QgY2dyb3VwIGlzIG5vdCBhY2NvdW50ZWQgdGhyb3VnaCByc3RhdCBhdFxuKyAqIGFsbCwgc28gZm9yIGl0IHRoZSBwZXItZGV2aWNlIGFnZ3JlZ2F0ZXMgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzJ1xuKyAqIG93biBzdGF0aXN0aWNzLCB3aGljaCBjb3VudCBldmVyeSBjZ3JvdXAncyBJL08uXG4rICpcbisgKiBUaGUgcm9vdCBicmFuY2ggaXMgbm90IHNlbGYtbGltaXRpbmcgdGhlIHdheSB0aGUgcnN0YXQgb25lIGlzOiBpdCByZXJlYWRzXG4rICogZXZlcnkgZGlzayBvbiBldmVyeSBjYWxsLCB3aGlsZSBhIHNlY29uZCByc3RhdCBmbHVzaCBmaW5kcyBub3RoaW5nIGxlZnQgdG9cbisgKiBmb2xkLiBUaGUgbnVtYmVycyBpdCBwcm9kdWNlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNncm91cCwgc28gcmVhZCB0aGVtXG4rICogb25jZSByYXRoZXIgdGhhbiBvbmNlIHBlciBjZ3JvdXAgb2YgYSB3YWxrLlxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0aWYgKCFibGtjZy1cdTAwM2Vjc3MucGFyZW50KVxuK1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuK1x0ZWxzZVxuK1x0XHRjc3NfcnN0YXRfZmx1c2goXHUwMDI2YmxrY2ctXHUwMDNlY3NzKTtcbit9XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuK1x0X191NjQgX19vcGFxdWVbMl07XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXG4rICogQGJsa2NnOiBibG9jayBjZ3JvdXAgd2hvc2UgZGV2aWNlcyB0byB3YWxrXG4rICpcbisgKiBFYWNoIHlpZWxkZWQgYmxrZyBob2xkcyBvbmUgYmxvY2sgZGV2aWNlJ3MgY291bnRlcnMsIHRoZSBzYW1lIG9uZXMgYmVoaW5kIGFcbisgKiBwZXItZGV2aWNlIGxpbmUgb2YgdGhlIGlvLnN0YXQgZmlsZS4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZCwgYXMgdGhlIGZpbGVcbisgKiBza2lwcyB0aGVtLiBPbmUgY2FzZSBkaWZmZXJzOiB0aGUgZmlsZSBwcmludHMgbm8gbGluZSBmb3IgYSBibGtnIHdob3NlIGRpc2tcbisgKiBpcyBnb25lLCB3aGlsZSB0aGUgd2FsayBzdGlsbCB5aWVsZHMgaXQsIGFuZCBicGZfYmxrZ19kZXYoKSByZXR1cm5zIDAgZm9yXG4rICogaXQuIE11c3QgYmUgdXNlZCBpbnNpZGUgYW4gUkNVIHJlYWQgc2VjdGlvbi5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsIHN0cnVjdCBibGtjZyAqYmxrY2cpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbitcbitcdGtpdC1cdTAwM2VibGtjZyA9IGJsa2NnO1xuK1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcbisgKiBAaXQ6IGl0ZXJhdG9yXG4rICpcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcbitcbitcdC8qIENsZWFyZWQgb25jZSB0aGUgd2FsayBpcyBkb25lLCBzZWUgYmVsb3cuICovXG4rXHRpZiAoIWtpdC1cdTAwM2VibGtjZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRpZiAoIWJsa2cpXG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbitcdGVsc2VcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcbitcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgdGhlIGlvLnN0YXQgZmlsZS4gKi9cbitcdHdoaWxlIChub2RlKSB7XG4rXHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuK1x0XHRpZiAoYmxrZy1cdTAwM2VvbmxpbmUpIHtcbitcdFx0XHRraXQtXHUwMDNlcG9zID0gYmxrZztcbitcdFx0XHRyZXR1cm4gYmxrZztcbitcdFx0fVxuK1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIEZvcmdldCB0aGUgbGlzdCBoZWFkIGFzIHdlbGwuIFRoZSB2ZXJpZmllciBhc3N1bWVzIHRoYXQgYW4gaXRlcmF0b3JcbitcdCAqIHdoaWNoIHJldHVybmVkIE5VTEwga2VlcHMgcmV0dXJuaW5nIE5VTEwsIGFuZCBzdG9wcyBjaGVja2luZyB0aGVcbitcdCAqIGxvb3AgZm9yIHRlcm1pbmF0aW9uIG9uY2UgaXQgaGFzOyBzdGFydGluZyB0aGUgd2FsayBvdmVyIHdvdWxkIGxldFxuK1x0ICogc3VjaCBhIGxvb3Agc3BpbiBmb3JldmVyLlxuK1x0ICovXG4rXHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbitcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxuKyAqIEBpdDogaXRlcmF0b3JcbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK31cbitcbisvKlxuKyAqIFJlYWQgb25lIGNvdW50ZXIgb3V0IG9mIEBibGtnJ3MgZmx1c2hlZCBpby5zdGF0IGFnZ3JlZ2F0ZS4gQGNvdW50ZXJzIGlzIG9uZVxuKyAqIG9mIHRoZSB0d28gYXJyYXlzIGluIGJsa2ctXHUwMDNlaW9zdGF0LmN1cjsgYm90aCBhcmUgZ3VhcmRlZCBieSB0aGF0IHN0cnVjdCdzXG4rICogc2VxbG9jaywgdGhlIG9uZSB0aGUgaW8uc3RhdCBmaWxlIHVzZXMuIFJldHVybnMgKHU2NCktMSBpZiB0aGUgY291bnRlclxuKyAqIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK3N0YXRpYyB1NjQgYmxrZ19pb3N0YXRfcmVhZChzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2csIGNvbnN0IHU2NCAqY291bnRlcnMsXG4rXHRcdFx0ICAgIGVudW0gYmxrZ19pb3N0YXRfdHlwZSBydylcbit7XG4rXHRzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0ICpiaXMgPSBcdTAwMjZibGtnLVx1MDAzZWlvc3RhdDtcbitcdHVuc2lnbmVkIGludCBzZXE7XG4rXHR1NjQgdmFsO1xuK1xuK1x0aWYgKCh1bnNpZ25lZCBpbnQpcncgXHUwMDNlPSBCTEtHX0lPU1RBVF9OUilcbitcdFx0cmV0dXJuICh1NjQpLTE7XG4rXG4rXHQvKlxuK1x0ICogT24gMzItYml0IHRoZSBsb29wIGJlbG93IHJlYWxseSBpcyBhIHNlcWNvdW50IHJldHJ5IGxvb3AuIEV2ZXJ5XG4rXHQgKiB3cml0ZXIgb2YgYmxrZy1cdTAwM2Vpb3N0YXQga2VlcHMgaW50ZXJydXB0cyBvZmYsIHNvIG9ubHkgYW4gTk1JIGNhbiBsYW5kXG4rXHQgKiBpbnNpZGUgYW4gdXBkYXRlLCBhbmQgdGhlbiB0aGUgbG9vcCB3b3VsZCBuZXZlciBlbmQuIFRoZXNlIGtmdW5jc1xuK1x0ICogYXJlIHJlYWNoYWJsZSBmcm9tIGEgcGVyZiBldmVudCBwcm9ncmFtLCB3aGljaCBkb2VzIHJ1biBpbiBOTUksIHNvXG4rXHQgKiBnaXZlIHVwIHJhdGhlciB0aGFuIHNwaW4uIE9uIDY0LWJpdCB0aGUgbG9vcCBjb21waWxlcyBhd2F5LlxuK1x0ICovXG4rXHRpZiAoQklUU19QRVJfTE9ORyA9PSAzMiBcdTAwMjZcdTAwMjYgaW5fbm1pKCkpXG4rXHRcdHJldHVybiAodTY0KS0xO1xuK1xuK1x0ZG8ge1xuK1x0XHRzZXEgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW4oXHUwMDI2YmlzLVx1MDAzZXN5bmMpO1xuK1x0XHR2YWwgPSBjb3VudGVyc1tyd107XG4rXHR9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoXHUwMDI2YmlzLVx1MDAzZXN5bmMsIHNlcSkpO1xuK1xuK1x0cmV0dXJuIHZhbDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2Jsa2dfaW9zdGF0X2J5dGVzIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgYnl0ZSBjb3VudGVyXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmVhZHMgdGhlIGZsdXNoZWQgYWdncmVnYXRlLCBzbyBjYWxsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cygpIGZpcnN0IGZvclxuKyAqIHVwLXRvLWRhdGUgdmFsdWVzLiBUaGUgcmVhZCB1c2VzIHRoZSB1NjRfc3RhdHMgc2VxbG9jaywgbGlrZSB0aGUgaW8uc3RhdFxuKyAqIGZpbGUuXG4rICpcbisgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfYnl0ZXMoc3RydWN0IGJsa2NnX2dxICpibGtnLFxuK1x0XHRcdFx0ICAgICAgZW51bSBibGtnX2lvc3RhdF90eXBlIHJ3KVxuK3tcbitcdHJldHVybiBibGtnX2lvc3RhdF9yZWFkKGJsa2csIGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19pb3N0YXRfaW9zIC0gUmVhZCBhIGRldmljZSdzIGlvLnN0YXQgSS9PIGNvdW50XG4rICogQGJsa2c6IGJsb2NrIGdyb3VwIChvbmUgZGV2aWNlIG9mIGEgYmxvY2sgY2dyb3VwKVxuKyAqIEBydzogd2hpY2ggY291bnRlciAoQkxLR19JT1NUQVRfUkVBRCAvIF9XUklURSAvIF9ESVNDQVJEKVxuKyAqXG4rICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIEkvT3MsIG9yICh1NjQpLTEgaWYgQHJ3IGlzIG91dCBvZiByYW5nZSBvciB0aGVcbisgKiBjb3VudGVyIGNhbm5vdCBiZSByZWFkLlxuKyAqL1xuK19fYnBmX2tmdW5jIHU2NCBicGZfYmxrZ19pb3N0YXRfaW9zKHN0cnVjdCBibGtjZ19ncSAqYmxrZyxcbitcdFx0XHRcdCAgICBlbnVtIGJsa2dfaW9zdGF0X3R5cGUgcncpXG4re1xuK1x0cmV0dXJuIGJsa2dfaW9zdGF0X3JlYWQoYmxrZywgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmlvcywgcncpO1xuK31cbitcbisvKipcbisgKiBicGZfYmxrZ19kZXYgLSBSZXR1cm4gYSBibGtnJ3MgZGV2aWNlIGlkXG4rICogQGJsa2c6IGJsb2NrIGdyb3VwXG4rICpcbisgKiBSZXR1cm46IHRoZSBkZXZpY2UncyBkZXZfdCAodXNlIE1BSk9SKCkvTUlOT1IoKSB0byBzcGxpdCksIG9yIDAgaWYgdGhlIGJsa2dcbisgKiBoYXMgbm8gZGlzay5cbisgKi9cbitfX2JwZl9rZnVuYyB1NjQgYnBmX2Jsa2dfZGV2KHN0cnVjdCBibGtjZ19ncSAqYmxrZylcbit7XG4rXHRpZiAoIWJsa2ctXHUwMDNlcSB8fCAhYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2spXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIGJsa2ctXHUwMDNlcS1cdTAwM2VkaXNrLVx1MDAzZXBhcnQwLVx1MDAzZWJkX2Rldjtcbit9XG4rXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbitcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9ibGtjZywgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X2Jsa2NnLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wdXRfYmxrY2csIEtGX1JFTEVBU0UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuK1xuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbitcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzLCBLRl9SQ1UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtnX2lvc3RhdF9pb3MsIEtGX1JDVSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2dfZGV2LCBLRl9SQ1UpXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHtcbitcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbitcdGlmIChlcnIpXG4rXHRcdHByX3dhcm4oXCJlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwiLCBlcnIpO1xuK1xuK1x0cmV0dXJuIGVycjtcbit9XG4rbGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5AQCAtMCwwICsxLDE3IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbisjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuK1xuK3N0cnVjdCBpb19xdWVyeSB7XG4rXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xuK1x0X191NjQgcmJ5dGVzO1xuK1x0X191NjQgd2J5dGVzO1xuK1x0X191NjQgcmlvcztcbitcdF9fdTY0IHdpb3M7XG4rXHRfX3U2NCBkYnl0ZXM7XG4rXHRfX3U2NCBkaW9zO1xuK1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4rfTtcbitcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICsxLDQgQEBcbitDT05GSUdfQkxLX0NHUk9VUD15XG4gQ09ORklHX0JMS19ERVZfTE9PUD15XG4gQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXlcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzJjZGE4MjQzMzE4M1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSwzMTAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rc3RhdGljIGludCByZWFkX3N0YXRzKHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRpbnQgZmQsIHJldCA9IDA7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuK1x0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcInJlYWQgZmRcIikpXG4rXHRcdHJldCA9IDE7XG4rXG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIEF0dGFjaCBhIGxvb3AgZGV2aWNlIHRvIGFuIGFub255bW91cyB0ZW1wIGZpbGUgc28gd2UgaGF2ZSBhIHJlYWwgYmxvY2tcbisgKiBkZXZpY2UgdG8gZ2VuZXJhdGUgY2dyb3VwLWNoYXJnZWQgSS9PIGFnYWluc3QuIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMVxuKyAqIGlmIGxvb3AgZGV2aWNlcyBhcmUgdW5hdmFpbGFibGUgKG5vbi1yb290IC8gbm8gQ09ORklHX0JMS19ERVZfTE9PUCkgc28gdGhlXG4rICogY2FsbGVyIGNhbiBza2lwLlxuKyAqL1xuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcbitcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuK3tcbitcdGNoYXIgYmFja19wYXRoW10gPSBcIi90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCI7XG4rXHRpbnQgbnI7XG4rXG4rXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuK1xuK1x0KmN0bF9mZCA9IG9wZW4oXCIvZGV2L2xvb3AtY29udHJvbFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuK1x0aWYgKG5yIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwiL2Rldi9sb29wJWRcIiwgbnIpO1xuK1xuK1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0dW5saW5rKGJhY2tfcGF0aCk7XG4rXHRpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdCpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdHJldHVybiAwO1xuK2VycjpcbitcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpsb29wX2ZkKTtcbitcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpiYWNrX2ZkKTtcbitcdGNsb3NlKCpjdGxfZmQpO1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuK1x0XHRcdCAgaW50IGJhY2tfZmQpXG4re1xuK1x0aW50IG5yID0gLTE7XG4rXG4rXHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuK1x0XHRjbG9zZShsb29wX2ZkKTtcbitcdH1cbitcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoYmFja19mZCk7XG4rXHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuK1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCIvZGV2L2xvb3AlZFwiLCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuK1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4rXHRcdGNsb3NlKGN0bF9mZCk7XG4rXHR9XG4rfVxuK1xuKy8qIE9fRElSRUNUIEkvTyB0byB0aGUgbG9vcCBkZXZpY2UsIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuK3N0YXRpYyBpbnQgZG9fZGlyZWN0X2lvKGNvbnN0IGNoYXIgKmxvb3BfcGF0aClcbit7XG4rXHR2b2lkICpidWY7XG4rXHRpbnQgZmQsIHJldCA9IC0xO1xuK1xuK1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbitcdFx0Z290byBvdXRfZmQ7XG4rXHRtZW1zZXQoYnVmLCAweGFiLCBJT19TSVpFKTtcbitcbitcdGlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcbitcdFx0Z290byBvdXRfYnVmO1xuK1x0ZnN5bmMoZmQpO1xuK1x0aWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4rXHRcdGdvdG8gb3V0X2J1ZjtcbitcdHJldCA9IDA7XG4rb3V0X2J1ZjpcbitcdGZyZWUoYnVmKTtcbitvdXRfZmQ6XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIFBhcnNlIHRoZSBpby5zdGF0IGxpbmUgZm9yIGRldmljZSBAZGV2IG91dCBvZiB0aGUgY2dyb3VwJ3MgaW8uc3RhdCBmaWxlIGFuZFxuKyAqIGZpbGwgQG91dC4gQGRldiBpcyBhIGtlcm5lbCBkZXZfdCAoYXMgcmV0dXJuZWQgYnkgYnBmX2Jsa2dfZGV2KSwgd2hvc2VcbisgKiBtYWpvcjptaW5vciBzcGxpdCBtYXRjaGVzIGhvdyBpby5zdGF0IHByaW50cyB0aGUgZGV2aWNlLiBSZXR1cm5zIDAgaWYgdGhlXG4rICogZGV2aWNlJ3MgbGluZSB3YXMgZm91bmQuXG4rICovXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuK1x0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcbitcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFwiaW8uc3RhdFwiLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4rXHRjbG9zZShmZCk7XG4rXHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdHJldHVybiAtMTtcbitcdGJ1ZltuXSA9ICdcXDAnO1xuK1xuK1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcIlxcblwiLCBcdTAwMjZzYXZlcHRyKTsgbGluZTtcbitcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuK1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBcIm1hajptaW5cIiB0b2tlbiBpcyBhbHdheXMgcHJlc2VudDsgdGhlIGZpZWxkIGJsb2NrIGlzXG4rXHRcdCAqIG9wdGlvbmFsICh0aGUga2VybmVsIG9taXRzIGl0IGZvciBhIGRldmljZSB3aXRoIG5vIHJlYWQvd3JpdGVcbitcdFx0ICogSS9PKSwgc28gYSBtYXRjaCBvZiBcdTAwM2U9IDIgaXMgZW5vdWdoIGFuZCBhYnNlbnQgZmllbGRzIHN0YXkgMC5cbitcdFx0ICovXG4rXHRcdGlmIChzc2NhbmYobGluZSxcbitcdFx0XHQgICBcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCIsXG4rXHRcdFx0ICAgXHUwMDI2bWFqLCBcdTAwMjZtaW4sIFx1MDAyNnJiLCBcdTAwMjZ3YiwgXHUwMDI2cmksIFx1MDAyNndpLCBcdTAwMjZkYiwgXHUwMDI2ZGkpIFx1MDAzYyAyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gd2I7XG4rXHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBkYjtcbitcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbitcdFx0cmV0ID0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbit7XG4rXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XCI7XG4rXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuK1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4rXHRjaGFyIGxvb3BfcGF0aFs2NF07XG4rXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4rXHRpbnQgY2dyb3VwX2ZkO1xuK1xuK1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4rXHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4rXHR9XG4rXG4rXHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG9vcDtcbitcbitcdC8qXG4rXHQgKiBQaW4gdGhlIHJlYWQgdG8gdGhlIGxvb3AgZGV2aWNlIHNvIHRoZSBtZWFzdXJlZCBkZXZpY2UgaXMgc3RhYmxlIGFuZFxuK1x0ICogcXVpZXNjZWQuIENvbnZlcnQgdGhlIGdsaWJjLWVuY29kZWQgc3RfcmRldiB0byB0aGUga2VybmVsIGRldl90XG4rXHQgKiBlbmNvZGluZyAobWFqb3IgXHUwMDNjXHUwMDNjIDIwIHwgbWlub3IpIHRoYXQgYnBmX2Jsa2dfZGV2IHJldHVybnMuXG4rXHQgKi9cbitcdHtcbitcdFx0c3RydWN0IHN0YXQgbHN0O1xuK1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcdTAwMjZsc3QpLCBcImZzdGF0IGxvb3BcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4rXHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2V0YXJnZXRfZGV2ID1cbitcdFx0XHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcdTAwM2NcdTAwM2MgMjApIHwgbWlub3IobHN0LnN0X3JkZXYpO1xuK1x0fVxuK1xuK1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4rXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XG4rXHRcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxuK1x0XHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcbitcdH07XG4rXHRvcHRzLmxpbmtfaW5mbyA9IFx1MDAyNmxpbmZvO1xuK1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbitcbitcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfaW9fcXVlcnksIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwiYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfc2tlbDtcbitcbitcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXG4rXHRpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgXCJkb19kaXJlY3RfaW9cIikpXG4rXHRcdGdvdG8gY2xlYW51cF9saW5rO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbGluaztcbitcbitcdC8qXG4rXHQgKiBXZWFrIGNoZWNrOiB3ZSBkaWQgSS9PLCBzbyB0aGUgbnVtYmVycyBtdXN0IGJlIG5vbi16ZXJvLiBGb2xsb3dzIHRoZVxuK1x0ICogcGF0dGVybiBpbiBjZ3JvdXBfaXRlcl9tZW1jZy5cbitcdCAqL1xuK1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXCIpKSB7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCJ3Ynl0ZXNcIik7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwid2lvc1wiKTtcbitcdH1cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmJ5dGVzLCAwLCBcInJieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmlvcywgMCwgXCJyaW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fZGV2XCIpKVxuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwiZGV2XCIpO1xuK1xuK1x0LypcbitcdCAqIFN0cm9uZ2VyIGNoZWNrOiB0aGUga2Z1bmMtcmVhZCB2YWx1ZXMgbXVzdCBlcXVhbCB3aGF0IHRoZSBpby5zdGF0XG4rXHQgKiBmaWxlIHJlcG9ydHMgZm9yIHRoZSBzYW1lIGRldmljZS4gUmVmcmVzaCB2aWEgdGhlIHByb2csIHRoZW4gcmVhZFxuK1x0ICogdGhlIGZpbGUgd2l0aCBubyBJL08gaW4gYmV0d2Vlbiwgc28gYm90aCBmbHVzaGVkIHNuYXBzaG90cyBtYXRjaFxuK1x0ICogZXhhY3RseS5cbitcdCAqL1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fbWF0Y2hcIikpIHtcbitcdFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XG4rXG4rXHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXCJyZWFkIHN0YXRzXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgQVNTRVJUX09LKHBhcnNlX2lvX3N0YXQoY2dyb3VwX2ZkLCBxLVx1MDAzZWRldiwgXHUwMDI2ZmlsZXYpLFxuK1x0XHRcdCAgICAgIFwicGFyc2UgaW8uc3RhdFwiKSkge1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJieXRlcywgZmlsZXYucmJ5dGVzLCBcInJieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3Ynl0ZXMsIGZpbGV2LndieXRlcywgXCJ3Ynl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmlvcywgZmlsZXYucmlvcywgXCJyaW9zXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdpb3MsIGZpbGV2Lndpb3MsIFwid2lvc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkYnl0ZXMsIGZpbGV2LmRieXRlcywgXCJkYnl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGlvcywgZmlsZXYuZGlvcywgXCJkaW9zXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogU2VwYXJhdGUgcHJvZ3JhbSBmb3IgdGhlIHJvb3QgYmxvY2sgY2dyb3VwLiBJdHMgY291bnRlcnMgZG8gbm90IGNvbWVcbitcdCAqIGZyb20gcnN0YXQsIHRoZXkgYXJlIHJlZmlsbGVkIGZyb20gdGhlIGRpc2tzIHRoZW1zZWx2ZXMsIHNvIHRoaXNcbitcdCAqIGNvdmVycyB0aGUgb3RoZXIgaGFsZiBvZiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhleSBjb3ZlciBldmVyeVxuK1x0ICogY2dyb3VwJ3MgSS9PIHRvIHRoZSBsb29wIGRldmljZSwgYW5kIG9ubHkgdGhpcyB0ZXN0IHRvdWNoZXMgaXQsIHNvXG4rXHQgKiB0aGV5IG11c3QgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGUgdGVzdCBjZ3JvdXAgd2FzIGNoYXJnZWQuXG4rXHQgKi9cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3Jvb3RcIikpIHtcbitcdFx0c3RydWN0IGJwZl9saW5rICpyb290X2xpbms7XG4rXHRcdHN0cnVjdCBpb19xdWVyeSAqcjtcbitcbitcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2Jsa2NnID0gMDtcbitcdFx0cm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfYmxrY2dfcXVlcnksXG4rXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcImF0dGFjaCByb290IGl0ZXJcIikpIHtcbitcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCJyZWFkIHJvb3Qgc3RhdHNcIikpIHtcbitcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbitcdFx0XHRcdEFTU0VSVF9FUShza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfYmxrY2csIDEsXG4rXHRcdFx0XHRcdCAgXCJnb3Rfcm9vdF9ibGtjZ1wiKTtcbitcdFx0XHRcdEFTU0VSVF9FUShyLVx1MDAzZWRldiwgcS1cdTAwM2VkZXYsIFwicm9vdCBkZXZcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3Ynl0ZXMsIHEtXHUwMDNld2J5dGVzLCBcInJvb3Qgd2J5dGVzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2lvcywgcS1cdTAwM2V3aW9zLCBcInJvb3Qgd2lvc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJieXRlcywgcS1cdTAwM2VyYnl0ZXMsIFwicm9vdCByYnl0ZXNcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyaW9zLCBxLVx1MDAzZXJpb3MsIFwicm9vdCByaW9zXCIpO1xuK1x0XHRcdH1cbitcdFx0XHRicGZfbGlua19fZGVzdHJveShyb290X2xpbmspO1xuK1x0XHR9XG4rXHR9XG4rXG4rY2xlYW51cF9saW5rOlxuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kobGluayk7XG4rY2xlYW51cF9za2VsOlxuK1x0Y2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7XG4rY2xlYW51cF9sb29wOlxuK1x0bG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7XG4rY2xlYW51cF9jZ3JvdXBfZmQ6XG4rXHRjbG9zZShjZ3JvdXBfZmQpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmI4MzlkZWY5NDUwODZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICsxLDEwNyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLmhcIlxuK1xuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbitcbisvKiBUaGUgY291bnRlcnMgb2YgdGhlIGRldmljZSBuYW1lZCBieSB0YXJnZXRfZGV2IGFyZSBzdG9yZWQgaGVyZS4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rLyogVGhlIHNhbWUgZGV2aWNlJ3MgY291bnRlcnMgcmVhZCB0aHJvdWdoIHRoZSByb290IGJsb2NrIGNncm91cC4gKi9cbitzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBTZXQgdG8gMSBieSBjZ3JvdXBfcm9vdF9ibGtjZ19xdWVyeSB3aGVuIGJwZl9nZXRfcm9vdF9ibGtjZygpIHN1Y2NlZWRzLiAqL1xuK19fdTY0IGdvdF9yb290X2Jsa2NnIFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIERldmljZSB0byByZWFkLCBzZXQgYnkgdXNlcnNwYWNlIChrZXJuZWwgZGV2X3QpLiBQaW5uaW5nIHRoZSBkZXZpY2Uga2VlcHNcbisgKiB0aGUgcmVhZCBkZXRlcm1pbmlzdGljIGFuZCBsZXRzIHRoZSB2YWx1ZSBiZSBjb21wYXJlZCB0byBpby5zdGF0IGV4YWN0bHkuXG4rICovXG4rX191NjQgdGFyZ2V0X2RldiBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKlxuKyAqIEZsdXNoIEBibGtjZyBhbmQgY29weSB0aGUgdGFyZ2V0IGRldmljZSdzIGNvdW50ZXJzIGludG8gQG91dC4gUmVhZGluZyBvbmx5XG4rICogdGhlIG9uZSBwaW5uZWQgZGV2aWNlIGtlZXBzIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYzogdGhhdCBkZXZpY2UgaXNcbisgKiBxdWllc2NlZCwgc28gaXRzIGNvdW50ZXJzIG1hdGNoIGlvLnN0YXQgZXhhY3RseSwgd2hpbGUgcGlja2luZyBcImFueSBkZXZpY2VcbisgKiB3aXRoIEkvT1wiIHdvdWxkIHJhY2Ugd2l0aCBiYWNraW5nLXN0b3JlIHdyaXRlYmFjay5cbisgKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmVhZF90YXJnZXRfZGV2KHN0cnVjdCBibGtjZyAqYmxrY2csXG4rXHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbitcbitcdC8qIGlvLnN0YXQgbmVlZHMgYSBmbHVzaCBiZWZvcmUgaXQgY2FuIGJlIHJlYWQgKHNsZWVwYWJsZSkuICovXG4rXHRicGZfYmxrY2dfZmx1c2hfc3RhdHMoYmxrY2cpO1xuK1xuK1x0LyogVGhlIHBlci1kZXZpY2UgYmxrZyB3YWxrIG5lZWRzIGFuIFJDVSBzZWN0aW9uLiAqL1xuK1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbitcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGJsa2NnKSB7XG4rXHRcdGlmIChicGZfYmxrZ19kZXYocG9zKSAhPSB0YXJnZXRfZGV2KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlZGV2ID0gYnBmX2Jsa2dfZGV2KHBvcyk7XG4rXHRcdG91dC1cdTAwM2VyYnl0ZXMgPSBicGZfYmxrZ19pb3N0YXRfYnl0ZXMocG9zLCBCTEtHX0lPU1RBVF9SRUFEKTtcbitcdFx0b3V0LVx1MDAzZXdieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSBicGZfYmxrZ19pb3N0YXRfaW9zKHBvcywgQkxLR19JT1NUQVRfUkVBRCk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gYnBmX2Jsa2dfaW9zdGF0X2lvcyhwb3MsIEJMS0dfSU9TVEFUX1dSSVRFKTtcbitcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGJwZl9ibGtnX2lvc3RhdF9ieXRlcyhwb3MsIEJMS0dfSU9TVEFUX0RJU0NBUkQpO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IGJwZl9ibGtnX2lvc3RhdF9pb3MocG9zLCBCTEtHX0lPU1RBVF9ESVNDQVJEKTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rfVxuK1xuK1NFQyhcIml0ZXIucy9jZ3JvdXBcIilcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xuK1x0X19idWlsdGluX21lbXNldChcdTAwMjZpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7XG4rXG4rXHRibGtjZyA9IGJwZl9nZXRfYmxrY2coXHUwMDI2Y2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghYmxrY2cpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZpb19xdWVyeSk7XG4rXG4rXHRicGZfcHV0X2Jsa2NnKGJsa2NnKTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJpdGVyLnMvY2dyb3VwXCIpXG4raW50IGNncm91cF9yb290X2Jsa2NnX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1xuK1x0LyogVGhlIGxhc3QgaXRlcmF0aW9uIGhhcyBhIE5VTEwgY2dyb3VwLCBza2lwIGl0LiAqL1xuK1x0aWYgKCFjZ3JwKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2cm9vdF9xdWVyeSwgMCwgc2l6ZW9mKHJvb3RfcXVlcnkpKTtcbitcbitcdGJsa2NnID0gYnBmX2dldF9yb290X2Jsa2NnKCk7XG4rXHRpZiAoIWJsa2NnKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdC8qXG4rXHQgKiBUaGUgcm9vdCBjZ3JvdXAgdGFrZXMgaXRzIG51bWJlcnMgZnJvbSB0aGUgZGlza3MgdGhlbXNlbHZlcyByYXRoZXJcbitcdCAqIHRoYW4gZnJvbSByc3RhdCwgc28gdGhpcyBhbHNvIGNvdmVycyB0aGUgcm9vdCBzaWRlIG9mXG4rXHQgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMoKS4gVGhlIGNvdW50ZXJzIGNvdmVyIGV2ZXJ5IGNncm91cCdzIEkvTywgc29cbitcdCAqIHRoZXkgY2FuIG9ubHkgYmUgYXQgb3IgYWJvdmUgd2hhdCB0aGlzIHRlc3QncyBvd24gY2dyb3VwIGRpZC5cbitcdCAqL1xuK1x0cmVhZF90YXJnZXRfZGV2KGJsa2NnLCBcdTAwMjZyb290X3F1ZXJ5KTtcbitcbitcdGdvdF9yb290X2Jsa2NnID0gMTtcbitcdGJwZl9wdXRfYmxrY2coYmxrY2cpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6MDM6NDEuNTU4MTQ0ODQ5WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3MjUzMDYyMjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IEJsb2NrIENncm91cCBCUEYgS2Z1bmNzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggc2VyaWVzIHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gVGhlIHBhdGNoIGZvY3VzZXMgb24gaW50cm9kdWNpbmcgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCAoYmxrY2cpIEkvTyBzdGF0aXN0aWNzLCB3aGljaCBpcyBpbnRlcmVzdGluZy5cblxuRmlyc3QsIEkgbmVlZCB0byBldmFsdWF0ZSB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gV2UncmUgYWRkaW5nIGZ1bmN0aW9ucyBsaWtlIGBicGZfZ2V0X3Jvb3RfYmxrY2dgLCBgYnBmX2dldF9ibGtjZ2AsIGBicGZfcHV0X2Jsa2NnYCwgYW5kIG90aGVycywgYWxsIGRlYWxpbmcgd2l0aCByZWFkaW5nIGRhdGEgZnJvbSBleGlzdGluZyBrZXJuZWwgc3RydWN0dXJlcyBsaWtlIGBzdHJ1Y3QgYmxrY2dgLCBgc3RydWN0IGJsa2NnX2dxYCwgYW5kIGBzdHJ1Y3QgYmxrZ19pb3N0YXRfc2V0YC4gVGhlIGNyaXRpY2FsIHF1ZXN0aW9uIGlzLCBhcmUgdGhlc2Uga2Z1bmNzIHJldHVybmluZyB1bmluaXRpYWxpemVkIHZhbHVlcyB0byB0aGUgQlBGIHByb2dyYW1zP1xuXG5UaGUga2Z1bmNzIHJldHVybiBlaXRoZXIgYHU2NGAgdmFsdWVzIG9yIHBvaW50ZXJzIHRvIGtlcm5lbCBzdHJ1Y3R1cmVzLiBCUEYgcHJvZ3JhbXMgdGhlbiByZWFkIHRoZXNlIHJldHVybmVkIHZhbHVlcy4gSSBuZWVkIHRvIHBpbnBvaW50IGlmIHRoZXJlIGFyZSBhbnkgaW5zdGFuY2VzIHdoZXJlIHRoZSBrZnVuY3MgYXJlIHB1bGxpbmcgdW5pbml0aWFsaXplZCBmaWVsZHMgYW5kIHBhc3NpbmcgdGhlbSBiYWNrIHRvIEJQRiBwcm9ncmFtcy4gU3BlY2lmaWNhbGx5LCBJJ20gbG9va2luZyBhdCBgYnBmX2Jsa2dfaW9zdGF0X2J5dGVzYCBhbmQgYGJwZl9ibGtnX2lvc3RhdF9pb3NgLCB3aGljaCByZWFkIGZyb20gYGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5ieXRlc2AgYW5kIGBibGtnLVx1MDAzZWlvc3RhdC5jdXIuaW9zYCwgYm90aCBhcnJheXMgb2YgYHU2NGAuIEFsc28sIGBicGZfYmxrZ19kZXZgIHRoYXQgcmV0dXJucyBgYmxrZy1cdTAwM2VxLVx1MDAzZWRpc2stXHUwMDNlcGFydDAtXHUwMDNlYmRfZGV2YCB3aGljaCBpcyBhIGBkZXZfdGAg4oCTIGVpdGhlciBgdTMyYCBvciBgdTY0YC5cblxuVGhlIHBhdGNoIGFsc28gaGFzIGEgc2VsZnRlc3QsIHNvIEknbGwgY2hlY2sgdGhhdC5cblxuTm93LCBsZXQncyBkaWcgaW50byBgYnBmX2l0ZXJfYmxrZ19uZXdgIGFuZCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gU3RhbmRhcmQgQlBGIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uLiBUaGUgdmVyaWZpZXIgaW4gQlBGIGVuc3VyZXMgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIGBicGZfaXRlcl9ibGtnX25ld2AuIEl0IGluaXRpYWxpemVzIGBraXQtXHUwMDNlYmxrY2dgIGFuZCBga2l0LVx1MDAzZXBvc2AuIE5vIGlzc3VlcyBoZXJlIGFzIHRoZSBpdGVyYXRvciBzdGF0ZSBpcyBtYW5hZ2VkIGJ5IHRoZSBCUEYgaW5mcmFzdHJ1Y3R1cmUuXG5cbk9rYXksIG5leHQgY29uY2VybjogYXJlIHRoZXJlIGFueSBpbnN0YW5jZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgY29waWVkIHRvIHVzZXIgc3BhY2U/IEJQRiBwcm9ncmFtcyByZWFkIGNvdW50ZXJzIGFuZCBzdG9yZSB0aGVtIGluIGdsb2JhbCB2YXJpYWJsZXMgKGBpb19xdWVyeWAsIGByb290X3F1ZXJ5YCksIHdoaWNoIGFyZSB0aGVuIGFjY2Vzc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIHRoZSBCUEYgc2tlbGV0b24uIFRoZXNlIGNvdW50ZXJzIGFyZSBleHRyYWN0ZWQgZnJvbSBgYmxrZy1cdTAwM2Vpb3N0YXQuY3VyLmJ5dGVzYCBhbmQgYGJsa2ctXHUwMDNlaW9zdGF0LmN1ci5pb3NgLCBidXQgdGhlc2UgYXJlIHVwZGF0ZWQgYnkgdGhlIGJsb2NrIGxheWVyLCBhbmQgc2hvdWxkIGJlIGZ1bGx5IGluaXRpYWxpemVkLlxuXG5UaGVuLCBhcmUgdGhlcmUgYW55IGRpcmVjdCB0cmFuc21pc3Npb25zIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2U/IE5vLCB0aGlzIHBhdGNoIG9ubHkgZXhwb3NlcyBCUEYga2Z1bmNzLCB3aGljaCBhcmUgdGhlbiBjYWxsZWQgYnkgQlBGIHByb2dyYW1zLiBUaGVzZSBrZnVuY3MgcmV0dXJuIGB1NjRgIG9yIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gYGNvcHlfdG9fdXNlcmAgY2FsbHMsIGFuZCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIGFuZCBzZW50IGRpcmVjdGx5IHRvIHVzZXIgc3BhY2UuIFRoZSBpdGVyYXRvciBzdGF0ZSBpcyBhIDE2LWJ5dGUgc3RydWN0dXJlLCB3aGljaCBpcyBmdWxseSBpbml0aWFsaXplZCBkdXJpbmcgYGJwZl9pdGVyX2Jsa2dfbmV3YC5cblxuRnVydGhlcm1vcmUsIEkgaGF2ZSB0byBjb25zaWRlciBjb25kaXRpb25hbCBsb2dpYyB0aGF0IG1pZ2h0IGRlcGVuZCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gVGhpcyBpcyBub3QgdGhlIGNhc2UgYmVjYXVzZSB0aGUgdmFyaWFibGVzIGFyZSBlaXRoZXIgcG9pbnRlcnMgZnJvbSB0aGUgQlBGIGNvbnRleHQgb3IgcmVhZCBmcm9tIGV4aXN0aW5nIGluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzLlxuXG5UaGVyZWZvcmUsIHRoZSBsaWtlbGlob29kIG9mIHRoaXMgcGF0Y2ggaW50cm9kdWNpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgaXMgZXh0cmVtZWx5IGxvdy4gS0FTQU4gYW5kIHN0YW5kYXJkIHRvb2xzIHNob3VsZCBzdWZmaWNlIHRvIGRldGVjdCBhbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBzdGVtbWluZyBmcm9tIGluY29ycmVjdCBgY3NzX3RyeWdldGAgb3IgUkNVIHVzYWdlLCBpZiBhbnkuIEkgc3RpbGwgd2FudCB0byBkb3VibGUgY2hlY2sgYGJsa2dfaW9zdGF0X3JlYWRgIHRob3VnaDpcblxuTG9va2luZyBhdCB0aGUgY29kZSwgaXQncyBqdXN0IHJlYWRpbmcgYHU2NGAgdmFsdWVzIGZyb20gYGNvdW50ZXJzW3J3XWAuIFRoZSBib3VuZHMgYXJlIGNoZWNrZWQgYWdhaW5zdCBgQkxLR19JT1NUQVRfTlJgLCBzbyBpdCdzIHNhZmUuXG5cbk15IGNvbmNsdXNpb24/ICoqTmVlZHNLTVNBTiA9IGZhbHNlLioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gcmVhZCBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIGJ1dCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nIHRoYXQgY3JlYXRlcyBhIHN0cm9uZyBuZWVkIGZvciBLTVNBTi4gVGhlcmUncyBubyBjcmVhdGlvbiBvZiBuZXcgY29tcGxleCBzdHJ1Y3R1cmVzLCBubyBkaXJlY3QgZGF0YSBjb3B5IHRvIHVzZXIgc3BhY2UsIGFuZCBubyBsb2dpYyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gU3RhbmRhcmQgbWVtb3J5IHNhZmV0eSB0b29scyBzdWNoIGFzIEtBU0FOIGFyZSBlbm91Z2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNDkxLCJPdXRwdXRUb2tlbnMiOjE2OSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNjQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTowMzo1OC44MTEyMDk4ODlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIGtmdW5jcyB0byByZWFkIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcyAoaW8uc3RhdCkuIEl0IGRvZXMgbm90IGFsbG9jYXRlIG5ldyBjb21wbGV4IHN0cnVjdHVyZXMsIGNvcHkgZGF0YSBkaXJlY3RseSB0byB1c2VyIHNwYWNlLCBvciBpbnRyb2R1Y2UgbG9naWMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBrZnVuY3MgcmV0dXJuIHNpbXBsZSBzY2FsYXIgdmFsdWVzICh1NjQpIG9yIHBvaW50ZXJzIHRvIGV4aXN0aW5nLCBpbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcy4gVGhlIEJQRiBpdGVyYXRvciBzdGF0ZSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIFJDVSBvciBjZ3JvdXAgcmVmZXJlbmNlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[1] Phase: Succeeded StartedAt: 2026-08-07 21:04:09 +0000 UTC FinishedAt: 2026-08-07 21:04:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-07 21:04:09 +0000 UTC FinishedAt: 2026-08-07 21:04:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2] Phase: Succeeded StartedAt: 2026-08-07 21:04:09 +0000 UTC FinishedAt: 2026-08-08 00:46:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-07 21:04:09 +0000 UTC FinishedAt: 2026-08-08 00:46:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-07 21:04:09 +0000 UTC FinishedAt: 2026-08-07 21:04:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-07 21:04:09 +0000 UTC FinishedAt: 2026-08-07 21:04:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-610774020/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-07 21:04:20 +0000 UTC FinishedAt: 2026-08-07 21:21:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-07 21:04:20 +0000 UTC FinishedAt: 2026-08-07 21:21:03 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*cef4d860-2231-4580-b0a8-df09e694701f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-610774020/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "0ac22e6f-7640-4e7f-910e-04f37f283bd7", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-795570498/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-07 21:04:20 +0000 UTC FinishedAt: 2026-08-07 21:20:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*cef4d860-2231-4580-b0a8-df09e694701f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-610774020/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "0ac22e6f-7640-4e7f-910e-04f37f283bd7", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-795570498/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-07 21:21:03 +0000 UTC FinishedAt: 2026-08-07 21:21:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-07 21:21:03 +0000 UTC FinishedAt: 2026-08-07 21:21:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-07 21:21:03 +0000 UTC FinishedAt: 2026-08-07 21:21:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-07 21:21:03 +0000 UTC FinishedAt: 2026-08-07 21:21:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-1422286211/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-07 21:21:13 +0000 UTC FinishedAt: 2026-08-07 21:22:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-07 21:21:13 +0000 UTC FinishedAt: 2026-08-07 21:22:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*0ac22e6f-7640-4e7f-910e-04f37f283bd7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-795570498/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-07 21:22:57 +0000 UTC FinishedAt: 2026-08-07 21:22:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-07 21:22:57 +0000 UTC FinishedAt: 2026-08-07 21:22:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-07 21:22:57 +0000 UTC FinishedAt: 2026-08-07 21:39:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-07 21:22:57 +0000 UTC FinishedAt: 2026-08-07 21:39:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*cef4d860-2231-4580-b0a8-df09e694701f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-1422286211/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "06af3c4d-2049-4fc2-b4db-41fe5e630d65", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-1622608951/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-07 21:22:57 +0000 UTC FinishedAt: 2026-08-07 21:39:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*cef4d860-2231-4580-b0a8-df09e694701f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-1422286211/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "06af3c4d-2049-4fc2-b4db-41fe5e630d65", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-1622608951/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-07 21:39:23 +0000 UTC FinishedAt: 2026-08-07 21:39:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-07 21:39:23 +0000 UTC FinishedAt: 2026-08-07 21:39:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-07 21:39:23 +0000 UTC FinishedAt: 2026-08-07 21:41:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-07 21:39:23 +0000 UTC FinishedAt: 2026-08-07 21:41:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*06af3c4d-2049-4fc2-b4db-41fe5e630d65,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-1622608951/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-07 21:41:17 +0000 UTC FinishedAt: 2026-08-08 00:46:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-07 21:41:17 +0000 UTC FinishedAt: 2026-08-08 00:46:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*0ac22e6f-7640-4e7f-910e-04f37f283bd7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*06af3c4d-2049-4fc2-b4db-41fe5e630d65,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-795570498/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-1622608951/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-07 21:41:17 +0000 UTC FinishedAt: 2026-08-07 21:41:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-07 21:41:17 +0000 UTC FinishedAt: 2026-08-07 21:41:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-1252627868/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-07 21:41:17 +0000 UTC FinishedAt: 2026-08-07 21:41:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-07 21:41:17 +0000 UTC FinishedAt: 2026-08-07 21:41:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-07 21:41:17 +0000 UTC FinishedAt: 2026-08-07 21:41:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-07 21:41:27 +0000 UTC FinishedAt: 2026-08-08 00:46:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgbf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_get_root_blkcg","bpf_get_blkcg","bpf_put_blkcg","bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","bpf_blkg_iostat_bytes","bpf_blkg_iostat_ios","bpf_blkg_dev","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5cbef379a94b161726c5f504598bf4791d45cedc","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BLK_CGROUP"],"series_id":"ac84c2c6-2fe6-4bbd-92c7-58d5e95769b1","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-07 21:41:27 +0000 UTC FinishedAt: 2026-08-08 00:46:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*0ac22e6f-7640-4e7f-910e-04f37f283bd7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*06af3c4d-2049-4fc2-b4db-41fe5e630d65,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-795570498/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-build-action-1622608951/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgbf/series-workflowrfgbf-convert-artifact-1252627868/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}