ZGlmZiAtLWdpdCBhL2ZsYXNoL1JFQURNRSBiL2ZsYXNoL1JFQURNRQppbmRleCAzMDQzNjBjLi45Zjc3ZGQ1IDEwMDY0NAotLS0gYS9mbGFzaC9SRUFETUUKKysrIGIvZmxhc2gvUkVBRE1FCkBAIC0xICsxLDcgQEAKLVJlYWRtZQorKGMpIDIwMDMgYnkgSvZyZyBIb2hlbnNvaG4KKworU291cmNlY29kZSBmb3IgdGhlIGZsYXNoICJpbmZyYXN0cnVjdHVyZSIKK1BsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCB0aGVzZSBhcmUgcG93ZXJmdWwgdG9vbHMsIGRvbid0IGZvb2wgd2l0aCB0aGVtIQorCitGb3IgbW9zdCB1cC10by1kYXRlIGluZm8gYWJvdXQgZmxhc2hpbmcgc2VlOgoraHR0cDovL3JvY2tib3guaGF4eC5zZS9kb2NzL2ZsYXNoLmh0bWwKZGlmZiAtLWdpdCBhL2ZsYXNoL2Jvb3Rsb2FkZXIvTWFrZWZpbGUgYi9mbGFzaC9ib290bG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTZjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC9ib290bG9hZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsNzggQEAKKyMgICAgICAgICAgICAgX19fX19fX19fXyAgICAgICAgICAgICAgIF9fICAgX19fLgorIyAgIE9wZW4gICAgICBcX19fX19fICAgXCBfX19fICAgX19fXyB8ICB8IF9cXyB8X18gICBfX19fX19fICBfX18KKyMgICBTb3VyY2UgICAgIHwgICAgICAgXy8vICBfIFxfLyBfX19cfCAgfC8gL3wgX18gXCAvICBfIFwgIFwvICAvCisjICAgSnVrZWJveCAgICB8ICAgIHwgICAoICA8Xz4gKSAgXF9fX3wgICAgPCB8IFxfXCAoICA8Xz4gPiA8ICA8CisjICAgRmlybXdhcmUgICB8X19fX3xfICAvXF9fX18vIFxfX18gID5fX3xfIFx8X19fICAvXF9fX18vX18vXF8gXAorIyAgICAgICAgICAgICAgICAgICAgIFwvICAgICAgICAgICAgXC8gICAgIFwvICAgIFwvICAgICAgICAgICAgXC8KKyMgJElkJAorIworCitDQyA9IHNoLWVsZi1nY2MgCitMRCA9IHNoLWVsZi1sZAorQVIgPSBzaC1lbGYtYXIKK0FTID0gc2gtZWxmLWFzCitPQyA9IHNoLWVsZi1vYmpjb3B5CisKK0ZJUk1XQVJFIDo9IC4uLy4uL2Zpcm13YXJlCitUT09MU0RJUj0uLi8uLi90b29scworCitUQVJHRVQgPSBib290bG9hZGVyCitMRFMgOj0gJChUQVJHRVQpLmxkcworCisKK2lmbmRlZiBQTEFURk9STSAKK25vdF9jb25maWd1cmVkOgorCUBlY2hvICJObyBwbGF0Zm9ybSBnaXZlbi4iCisJQGVjaG8gIlVzZSBtYWtlIFBMQVRGT1JNPVBMQVlFUnxSRUNPUkRFUnxSRUNPUkRFUnxGTSB7Tk9fUk9NPTF9IgorIyNlbHNlCisjI2NvbmZpZ3VyZWQ6CisjIwlAZWNobyAiQnVpbGRpbmcgYm9vdGxvYWRlciBmb3IgcGxhdGZvcm0gIiQoUExBVEZPUk0pCitlbmRpZgorCisKK0lOQ0xVREVTPSAtSSQoRklSTVdBUkUpL2V4cG9ydCAtSS4gLUkkKE9CSkRJUikKK0RFRklORVM9IC1EUExBVEZPUk1fJChQTEFURk9STSkKKworT0JKRElSIDo9IC4KKworQ0ZMQUdTID0gLU8gLVcgLVdhbGwgLW0xIC1ub3N0ZGxpYiAtZmZyZWVzdGFuZGluZyAtV3N0cmljdC1wcm90b3R5cGVzIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mc2NoZWR1bGUtaW5zbnMgJChJTkNMVURFUykgJChERUZJTkVTKQorQUZMQUdTICs9IC1zbWFsbCAtcmVsYXgKKworCitpZmRlZiBERUJVRworCURFRklORVMgOj0gLURERUJVRworCUNGTEFHUyArPSAtZworZW5kaWYKKworU1JDIDo9ICQod2lsZGNhcmQgKi5jKQorCitPQkpTIDo9ICQoU1JDOiUuYz0kKE9CSkRJUikvJS5vKQorCitpZmRlZiBOT19ST00KK0xJTktGSUxFID0gJChPQkpESVIpL25vX3JvbS5sZHMKK09SSUdJTiA9IDAKK0RFRklORVMgKz0gLUROT19ST00KK2Vsc2UKK0xJTktGSUxFID0gJChPQkpESVIpLyQoVEFSR0VUKS5sZHMKK09SSUdJTiA9IEZGRkY1MDAKK2VuZGlmCisKKyQoT0JKRElSKS8kKFRBUkdFVCkuYmluIDogJChPQkpESVIpLyQoVEFSR0VUKS5lbGYKKwkkKE9DKSAtTyBiaW5hcnkgJChPQkpESVIpLyQoVEFSR0VUKS5lbGYgJChPQkpESVIpLyQoVEFSR0VUKS5iaW4KKwkkKFRPT0xTRElSKS9zaDJkICQoT0JKRElSKS8kKFRBUkdFVCkuYmluIC1vICQoT1JJR0lOKSA+ICQoT0JKRElSKS8kKFRBUkdFVCkuYXNtCitpZm5kZWYgTk9fUk9NCisJJChUT09MU0RJUikvc2NyYW1ibGUgJChPQkpESVIpLyQoVEFSR0VUKS5iaW4gJChPQkpESVIpLyQoVEFSR0VUKS5hanoKK2VuZGlmCisKKyQoT0JKRElSKS8kKFRBUkdFVCkuZWxmIDogJChPQkpTKSAKKwkkKENDKSAtT3MgLW5vc3RkbGliIC1vICQoT0JKRElSKS8kKFRBUkdFVCkuZWxmIC1MJChPQkpESVIpIC1UJChMSU5LRklMRSkgLVdsLC1NYXAsJChPQkpESVIpLyQoVEFSR0VUKS5tYXAKKworCitjbGVhbjoKKwktcm0gLWYgXAorCSQoT0JKUykgXAorCSQoT0JKRElSKS8kKFRBUkdFVCkuYXNtIFwKKwkkKE9CSkRJUikvJChUQVJHRVQpLmJpbiBcCisJJChPQkpESVIpLyQoVEFSR0VUKS5hanogXAorCSQoT0JKRElSKS8kKFRBUkdFVCkuZWxmIFwKKwkkKE9CSkRJUikvJChUQVJHRVQpLm1hcApkaWZmIC0tZ2l0IGEvZmxhc2gvYm9vdGxvYWRlci9SRUFETUUgYi9mbGFzaC9ib290bG9hZGVyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMyN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvYm9vdGxvYWRlci9SRUFETUUKQEAgLTAsMCArMSw0IEBACisoYykgMjAwMyBieSBK9nJnIEhvaGVuc29obgorCitUaGlzIGlzIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGZsYXNoIGJvb3Rsb2FkZXIuCitJdCBnaXZlIHRoZSBkdWFsIGJvb3QgZmVhdHVyZSwgZGVjb21wcmVzc2VzIG9uZSBvZiB0d28gc29mdHdhcmUgaW1hZ2VzLgpkaWZmIC0tZ2l0IGEvZmxhc2gvYm9vdGxvYWRlci9ib290bG9hZGVyLmMgYi9mbGFzaC9ib290bG9hZGVyL2Jvb3Rsb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc5YmJlCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvYm9vdGxvYWRlci9ib290bG9hZGVyLmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIF9fX19fX19fX18gICAgICAgICAgICAgICBfXyAgIF9fXy4KKyAqICAgT3BlbiAgICAgIFxfX19fX18gICBcIF9fX18gICBfX19fIHwgIHwgX1xfIHxfXyAgIF9fX19fX18gIF9fXworICogICBTb3VyY2UgICAgIHwgICAgICAgXy8vICBfIFxfLyBfX19cfCAgfC8gL3wgX18gXCAvICBfIFwgIFwvICAvCisgKiAgIEp1a2Vib3ggICAgfCAgICB8ICAgKCAgPF8+ICkgIFxfX198ICAgIDwgfCBcX1wgKCAgPF8+ID4gPCAgPAorICogICBGaXJtd2FyZSAgIHxfX19ffF8gIC9cX19fXy8gXF9fXyAgPl9ffF8gXHxfX18gIC9cX19fXy9fXy9cXyBcCisgKiAgICAgICAgICAgICAgICAgICAgIFwvICAgICAgICAgICAgXC8gICAgIFwvICAgIFwvICAgICAgICAgICAgXC8KKyAqICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgSvZyZyBIb2hlbnNvaG4gCisgKiAKKyAqIFNlY29uZC1sZXZlbCBib290bG9hZGVyLCB3aXRoIGR1YWwtYm9vdCBmZWF0dXJlIGJ5IGhvbGRpbmcgRjEvTWVudQorICogVGhpcyBpcyB0aGUgaW1hZ2UgYmVpbmcgZGVzY3JhbWJsZWQgYW5kIGV4ZWN1dGVkIGJ5IHRoZSBib290IFJPTS4KKyAqIEl0J3MgdGFzayBpcyB0byBjb3B5IFJvY2tib3ggZnJvbSBGbGFzaCB0byBEUkFNLgorICogVGhlIGltYWdlKHMpIGluIGZsYXNoIG1heSBvcHRpb25hbGx5IGJlIGNvbXByZXNzZWQgd2l0aCBVQ0wgMmUKKyAqCisgKiBBbGwgZmlsZXMgaW4gdGhpcyBhcmNoaXZlIGFyZSBzdWJqZWN0IHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBzb3VyY2UgdHJlZSByb290IGZvciBmdWxsIGxpY2Vuc2UgYWdyZWVtZW50LgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzaDcwMzQuaCIKKyNpbmNsdWRlICJib290bG9hZGVyLmgiCisKKworI2lmZGVmIE5PX1JPTQorLy8gc3RhcnQgd2l0aCB0aGUgdmVjdG9yIHRhYmxlCitVSU5UMzIgdmVjdG9yc1tdIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLnZlY3RvcnMiKSkpID0gCit7CisJKFVJTlQzMilfbWFpbiwgLy8gZW50cnkgcG9pbnQsIHRoZSBjb3B5IHJvdXRpbmUKKwkoVUlOVDMyKShlbmRfc3RhY2sgLSAxKSwgLy8gaW5pdGlhbCBzdGFjayBwb2ludGVyCisJRkxBU0hfQkFTRSArIDB4MjAwLCAvLyBzb3VyY2Ugb2YgaW1hZ2UgaW4gZmxhc2gKKwkoVUlOVDMyKXRvdGFsX3NpemUsIC8vIHNpemUgb2YgaW1hZ2UKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMHgwMzAyMDA4MCAvLyBtYXNrIGFuZCB2ZXJzaW9uIChqdXN0IGFzIGEgc3VnZ2VzdGlvbikKK307CisjZWxzZQorLy8gb3VyIGJpbmFyeSBoYXMgdG8gc3RhcnQgd2l0aCBhIHZlY3RvciB0byB0aGUgZW50cnkgcG9pbnQKK3RwTWFpbiBzdGFydF92ZWN0b3JbXSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5zdGFydHZlY3RvciIpKSkgPSB7bWFpbn07CisjZW5kaWYKKworI2lmZGVmIE5PX1JPTSAvLyBzb21lIGNvZGUgd2hpY2ggaXMgb25seSBuZWVkZWQgZm9yIHRoZSByb21sZXNzIHZhcmlhbnQKK3ZvaWQgX21haW4odm9pZCkKK3sKKwlVSU5UMzIqIHBTcmM7CisJVUlOVDMyKiBwRGVzdDsKKwlVSU5UMzIqIHBFbmQ7CisvKgorCWFzbSB2b2xhdGlsZSAoImxkYyAlMCxzciIgOiA6ICJyIigweEYwKSk7IC8vIGRpc2FibGUgaW50ZXJydXB0cworCWFzbSB2b2xhdGlsZSAoIm1vdi5sIEAlMCxyMTUiIDogOiAiciIoNCkpOyAvLyBsb2FkIHN0YWNrCisJYXNtIHZvbGF0aWxlICgibGRjICUwLHZiciIgOiA6ICJyIigwKSk7IC8vIGxvYWQgdmVjdG9yIGJhc2UKKyovCisJLy8gY29weSBldmVyeXRoaW5nIHRvIElSQU0gYW5kIGNvbnRpbnVlIHRoZXJlCisJcFNyYyA9IGJlZ2luX2lyYW1jb3B5OworCXBEZXN0ID0gYmVnaW5fdGV4dDsKKwlwRW5kID0gcERlc3QgKyAoYmVnaW5fc3RhY2sgLSBiZWdpbl90ZXh0KTsKKworCWRvCisJeworCQkqcERlc3QrKyA9ICpwU3JjKys7CisJfQorCXdoaWxlIChwRGVzdCA8IHBFbmQpOworCisJbWFpbigpOyAvLyBqdW1wIHRvIHRoZSByZWFsIG1haW4oKQorfQorCisKK3ZvaWQgQm9vdEluaXQodm9pZCkKK3sKKwkvLyBpbml0cyBmcm9tIHRoZSBib290IFJPTSwgd2hldGhlciB0aGV5IG1ha2Ugc2Vuc2Ugb3Igbm90CisJUEJEUiAmPSAweEZGQkY7IC8vIExFRCBvZmYgKDB4MTMxRSkKKwlQQkNSMiA9IDA7IC8vIGFsbCBHUElPCisJUEJJT1IgfD0gMHg0MDsgLy8gTEVEIG91dHB1dAorCVBCSU9SICY9IDB4RkZGMTsgLy8gTENEIGxpbmVzIGlucHV0CisKKwkvLyBpbml0IERSQU0gbGlrZSB0aGUgYm9vdCBST00gZG9lcworCVBBQ1IyICY9IDB4RkZGQjsKKwlQQUNSMiB8PSAweDAwMDg7CisJQ0FTQ1IgID0gMHhBRjsKKwlCQ1IgICB8PSAweDgwMDA7CisJV0NSMSAgJj0gMHhGREZEOworCURDUiAgICA9IDB4MEUwMDsKKwlSQ1IgICAgPSAweDVBQjA7CisJUlRDT1IgID0gMHg5NjA1OworCVJUQ1NSICA9IDB4QTUxODsKK30KKyNlbmRpZiAvLyAjaWZkZWYgTk9fUk9NCisKKworaW50IG1haW4odm9pZCkKK3sKKwlpbnQgbkJ1dHRvbjsKKworCVBsYXRmb3JtSW5pdCgpOyAvLyBtb2RlbC1zcGVjaWZpYyBpbml0cworCisJbkJ1dHRvbiA9IEJ1dHRvblByZXNzZWQoKTsKKworCWlmIChuQnV0dG9uID09IDMpCisJewkvLyBGMyBtZWFucyBzdGFydCBtb25pdG9yCisJCU1pbmlNb24oKTsKKwl9CisJZWxzZQorCXsKKwkJdEltYWdlKiBwSW1hZ2U7CisJCXBJbWFnZSA9IEdldFN0YXJ0SW1hZ2UobkJ1dHRvbik7IC8vIHdoaWNoIGltYWdlCisJCURlY29tcHJlc3NTdGFydChwSW1hZ2UpOyAvLyBtb3ZlIGludG8gcGxhY2UgYW5kIHN0YXJ0IGl0CisJfQorCisJcmV0dXJuIDA7IC8vIEkgZ3Vlc3Mgd2Ugd29uJ3QgcmV0dXJuICA7LSkKK30KKworCisvLyBpbml0IGNvZGUgdGhhdCBpcyBzcGVjaWZpYyB0byBjZXJ0YWluIHBsYXRmb3JtCit2b2lkIFBsYXRmb3JtSW5pdCh2b2lkKQoreworI2lmZGVmIE5PX1JPTQorCUJvb3RJbml0KCk7IC8vIGlmIG5vdCBzdGFydGVkIGJ5IGJvb3QgUk9NLCB3ZSBuZWVkIHRvIGluaXQgd2hhdCBpdCBkaWQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBQTEFURk9STV9QTEFZRVIKKwlCUlIxICA9ICAweDAwMTk7IC8vIDE0NDAwIEJhdWQgZm9yIG1vbml0b3IKKwlpZiAoRldfVkVSU0lPTiA+IDQ1MSkgLy8gIm5ldyIgUGxheWVyPworCXsKKwkJUEJEUiAmPSB+MHgxMDsgLy8gc2V0IFBCNCB0byAwIHRvIHBvd2VyLXVwIHRoZSBoYXJkZGlzayBlYXJseQorCQlQQklPUiB8PSAweDEwOyAvLyBtYWtlIFBCNCBhbiBvdXRwdXQKKwl9CisjZWxpZiBkZWZpbmVkIFBMQVRGT1JNX1JFQ09SREVSCisJQlJSMSAgPSAgMHgwMDAyOyAvLyAxMTUyMDAgQmF1ZCBmb3IgbW9uaXRvcgorCWlmIChSZWFkQURDKDcpID4gMHgxMDApIC8vIGNoYXJnZXIgcGx1Z2dlZD8KKwl7CS8vIHN3aXRjaCBvZmYgdGhlIEhELCBlbHNlIGEgZmxhdCBiYXR0ZXJ5IG1heSBub3Qgc3RhcnQKKwkJUEFDUjIgJj0gMHhGQkZGOyAvLyBHUElPIGZvciBQQTUKKwkJUEFJT1IgfD0gMHgyMDsJIC8vIG1ha2UgUEE1IGFuIG91dHB1dCAobG93IGJ5IGRlZmF1bHQpCisJfQorI2VsaWYgZGVmaW5lZCBQTEFURk9STV9GTQorCUJSUjEgID0gIDB4MDAwMjsgLy8gMTE1MjAwIEJhdWQgZm9yIG1vbml0b3IKKwlQQkRSIHw9IDB4MjA7IC8vIHNldCBQQjUgdG8ga2VlcCBwb3dlciAoZml4ZXMgdGhlIE9OLWhvbGRpbmcgcHJvYmxlbSkKKwlQQklPUiB8PSAweDIwOyAvLyBtYWtlIFBCNSBhbiBvdXRwdXQKKwlpZiAoUmVhZEFEQygwKSA8IDB4MUZGKSAvLyBjaGFyZ2VyIHBsdWdnZWQ/CisJeworCQkvLyBob3cgZG8gd2Ugc3dpdGNoIHRoaXMgb2ZmPworCX0KKyNlbmRpZgorCisJLy8gcGxhdGZvcm0taW5kZXBlbmRlbnQgaW5pdHMKKwlEQ1IgfD0gMHgxMDAwOyAvLyBlbmFibGUgYnVyc3QgbW9kZSBvbiBEUkFNCisJQkNSIHw9IDB4MjAwMDsgLy8gYWN0aXZhdGUgV2FycCBtb2RlIChzaW11bHRhbmVvdXMgaW50ZXJuYWwgYW5kIGV4dGVybmFsIG1lbSBhY2Nlc3MpCit9CisKKworLy8gVGhpbm5lZCBvdXQgdmVyc2lvbiBvZiB0aGUgVUNMIDJlIGRlY29tcHJlc3Npb24gc291cmNlY29kZQorLy8gT3JpZ2luYWwgKEMpIE1hcmt1cyBGLlguSiBPYmVyaHVtZXIgdW5kZXIgR05VIEdQTCBsaWNlbnNlCisjZGVmaW5lIEdFVEJJVChiYiwgc3JjLCBpbGVuKSBcCisJKCgoYmIgPSBiYiAmIDB4N2YgPyBiYioyIDogKCh1bnNpZ25lZClzcmNbaWxlbisrXSoyKzEpKSA+PiA4KSAmIDEpIAorCitpbnQgdWNsX25ydjJlX2RlY29tcHJlc3NfOCgKKwljb25zdCBVSU5UOCAqc3JjLCBVSU5UOCAqZHN0LCBVSU5UMzIqIGRzdF9sZW4pCit7IAorCVVJTlQzMiBiYiA9IDA7CisJdW5zaWduZWQgaWxlbiA9IDAsIG9sZW4gPSAwLCBsYXN0X21fb2ZmID0gMTsKKworCWZvciAoOzspCisJeworCQl1bnNpZ25lZCBtX29mZiwgbV9sZW47CisKKwkJd2hpbGUgKEdFVEJJVChiYixzcmMsaWxlbikpCisJCXsKKwkJCWRzdFtvbGVuKytdID0gc3JjW2lsZW4rK107CisJCX0KKwkJbV9vZmYgPSAxOworCQlmb3IgKDs7KQorCQl7CisJCQltX29mZiA9IG1fb2ZmKjIgKyBHRVRCSVQoYmIsc3JjLGlsZW4pOworCQkJaWYgKEdFVEJJVChiYixzcmMsaWxlbikpIGJyZWFrOworCQkJbV9vZmYgPSAobV9vZmYtMSkqMiArIEdFVEJJVChiYixzcmMsaWxlbik7CisJCX0KKwkJaWYgKG1fb2ZmID09IDIpCisJCXsKKwkJCW1fb2ZmID0gbGFzdF9tX29mZjsKKwkJCW1fbGVuID0gR0VUQklUKGJiLHNyYyxpbGVuKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1fb2ZmID0gKG1fb2ZmLTMpKjI1NiArIHNyY1tpbGVuKytdOworCQkJaWYgKG1fb2ZmID09IDB4ZmZmZmZmZmYpCisJCQkJYnJlYWs7CisJCQltX2xlbiA9IChtX29mZiBeIDB4ZmZmZmZmZmYpICYgMTsKKwkJCW1fb2ZmID4+PSAxOworCQkJbGFzdF9tX29mZiA9ICsrbV9vZmY7CisJCX0KKwkJaWYgKG1fbGVuKQorCQkJbV9sZW4gPSAxICsgR0VUQklUKGJiLHNyYyxpbGVuKTsKKwkJZWxzZSBpZiAoR0VUQklUKGJiLHNyYyxpbGVuKSkKKwkJCW1fbGVuID0gMyArIEdFVEJJVChiYixzcmMsaWxlbik7CisJCWVsc2UKKwkJeworCQkJbV9sZW4rKzsKKwkJCWRvIHsKKwkJCQltX2xlbiA9IG1fbGVuKjIgKyBHRVRCSVQoYmIsc3JjLGlsZW4pOworCQkJfSB3aGlsZSAoIUdFVEJJVChiYixzcmMsaWxlbikpOworCQkJbV9sZW4gKz0gMzsKKwkJfQorCQltX2xlbiArPSAobV9vZmYgPiAweDUwMCk7CisJCXsKKwkJCWNvbnN0IFVJTlQ4ICptX3BvczsKKwkJCW1fcG9zID0gZHN0ICsgb2xlbiAtIG1fb2ZmOworCQkJZHN0W29sZW4rK10gPSAqbV9wb3MrKzsKKwkJCWRvIGRzdFtvbGVuKytdID0gKm1fcG9zKys7IHdoaWxlICgtLW1fbGVuID4gMCk7CisJCX0KKwl9CisJKmRzdF9sZW4gPSBvbGVuOworCisJcmV0dXJuIGlsZW47Cit9CisKKworLy8gbW92ZSB0aGUgaW1hZ2UgaW50byBwbGFjZSBhbmQgc3RhcnQgaXQKK3ZvaWQgRGVjb21wcmVzc1N0YXJ0KHRJbWFnZSogcEltYWdlKQoreworCVVJTlQzMiogcFNyYzsKKwlVSU5UMzIqIHBEZXN0OworCisJcFNyYyA9IHBJbWFnZS0+aW1hZ2U7CisJcERlc3QgPSBwSW1hZ2UtPnBEZXN0aW5hdGlvbjsKKworCWlmIChwU3JjICE9IHBEZXN0KSAvLyBpZiBub3QgbGlua2VkIHRvIHRoYXQgZmxhc2ggYWRkcmVzcworCXsKKwkJaWYgKHBJbWFnZS0+ZmxhZ3MgJiBJRl9VQ0xfMkUpCisJCXsJLy8gVUNMIGNvbXByZXNzZWQsIGFsZ29yaXRobSAyZQorCQkJVUlOVDMyIGRzdF9sZW47IC8vIGR1bW15CisJCQl1Y2xfbnJ2MmVfZGVjb21wcmVzc184KChVSU5UOCopcFNyYywgKFVJTlQ4KilwRGVzdCwgJmRzdF9sZW4pOworCQl9CisJCWVsc2UKKwkJewkvLyB1bmNvbXByZXNzZWQsIGNvcHkgaXQKKwkJCVVJTlQzMiBzaXplID0gcEltYWdlLT5zaXplOworCQkJVUlOVDMyKiBwRW5kOworCQkJc2l6ZSA9IChzaXplICsgMykgLyA0OyAvLyByb3VuZCB1cCB0byAzMmJpdC13b3JkcworCQkJcEVuZCA9IHBEZXN0ICsgc2l6ZTsKKworCQkJZG8KKwkJCXsKKwkJCQkqcERlc3QrKyA9ICpwU3JjKys7CisJCQl9CisJCQl3aGlsZSAocERlc3QgPCBwRW5kKTsKKwkJfQorCX0KKworCXBJbWFnZS0+cEV4ZWN1dGUoKTsKK30KKworCitpbnQgUmVhZEFEQyhpbnQgY2hhbm5lbCkKK3sKKwkvLyBhZnRlciBjaGFubmVsIDMsIHRoZSBwb3J0cyB3cmFwIGFuZCBnZXQgcmUtdXNlZAorCXZvbGF0aWxlIFVJTlQxNiogcFJlc3VsdCA9IChVSU5UMTYqKShBRERSQUhfQUREUiArIDIgKiAoY2hhbm5lbCAmIDB4MDMpKTsgCisJaW50IHRpbWVvdXQgPSAyNjY7IC8vIGNvbnZlcnNpb24gdGFrZXMgMjY2IGNsb2NrIGN5Y2xlcworCisJQURDU1IgPSAweDIwIHwgY2hhbm5lbDsgLy8gc3RhcnQgc2luZ2xlIGNvbnZlcnNpb24KKwl3aGlsZSAoKChBRENTUiAmIDB4ODApID09IDApICYmICgtLXRpbWVvdXQpKTsgLy8gNiBpbnN0cnVjdGlvbnMgcGVyIHJvdW5kCisKKwlyZXR1cm4gKHRpbWVvdXQgPT0gMCkgPyAtMSA6ICpwUmVzdWx0Pj42OworfQorCisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgcGxhdGZvcm0tZGVwZW5kZW50LCAKKy8vCXVudGlsIEkgZmlndXJlIG91dCBob3cgdG8gZGlzdGluZ3Vpc2ggYXQgcnVudGltZS4KK2ludCBCdXR0b25QcmVzc2VkKHZvaWQpIC8vIHJldHVybiAxLDIsMyBmb3IgRjEsRjIsRjMsIDAgaWYgbm9uZSBwcmVzc2VkCit7CisJaW50IHZhbHVlID0gUmVhZEFEQyhDSEFOTkVMKTsKKworCWlmICh2YWx1ZSA+PSBGMV9MT1dFUiAmJiB2YWx1ZSA8PSBGMV9VUFBFUikgLy8gaW4gcmFuZ2UKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAodmFsdWUgPj0gRjJfTE9XRVIgJiYgdmFsdWUgPD0gRjJfVVBQRVIpIC8vIGluIHJhbmdlCisJCXJldHVybiAyOworCWVsc2UgaWYgKHZhbHVlID49IEYzX0xPV0VSICYmIHZhbHVlIDw9IEYzX1VQUEVSKSAvLyBpbiByYW5nZQorCQlyZXR1cm4gMzsKKwkKKwlyZXR1cm4gMDsKK30KKworCisvLyBEZXRlcm1pbmUgdGhlIGltYWdlIHRvIGJlIHN0YXJ0ZWQKK3RJbWFnZSogR2V0U3RhcnRJbWFnZShpbnQgblByZWZlcnJlZCkKK3sKKwl0SW1hZ2UqIHBJbWFnZTE7CisJdEltYWdlKiBwSW1hZ2UyID0gTlVMTDsgLy8gZGVmYXVsdCB0byBub3QgcHJlc2VudAorCVVJTlQzMiBwb3M7CisJVUlOVDMyKiBwRmxhc2ggPSAoVUlOVDMyKilGTEFTSF9CQVNFOworCisJLy8gZGV0ZXJtaW5lIHRoZSBmaXJzdCBpbWFnZSBwb3NpdGlvbgorCXBvcyA9IHBGbGFzaFsyXSArIHBGbGFzaFszXTsgLy8gcG9zaXRpb24gKyBzaXplIG9mIHRoZSBib290bG9hZGVyID0gYWZ0ZXIgaXQKKwlwb3MgPSAocG9zICsgMykgJiB+MzsgLy8gYmUgc2h1cmUgaXQncyAzMiBiaXQgYWxpZ25lZAorCisJcEltYWdlMSA9ICh0SW1hZ2UqKXBvczsKKworCWlmIChwSW1hZ2UxLT5zaXplICE9IDApCisJewkvLyBjaGVjayBmb3Igc2Vjb25kIGltYWdlCisJCXBvcyA9IChVSU5UMzIpKCZwSW1hZ2UxLT5pbWFnZSkgKyBwSW1hZ2UxLT5zaXplOworCQlwSW1hZ2UyID0gKHRJbWFnZSopcG9zOworCisJCS8vIGRvZXMgaXQgbWFrZSBzZW5zZT8gKG5vdCBpbiBGRiBvciAwMCBlcmF6ZWQgc3BhY2UpCisJCWlmIChwSW1hZ2UyLT5wRGVzdGluYXRpb24gPT0gKHZvaWQqKTB4RkZGRkZGRkYKKwkJIHx8IHBJbWFnZTItPnNpemUgPT0gMHhGRkZGRkZGRgorCQkgfHwgcEltYWdlMi0+cEV4ZWN1dGUgPT0gKHZvaWQqKTB4RkZGRkZGRkYKKwkJIHx8IHBJbWFnZTItPmZsYWdzID09IDB4RkZGRkZGRkYKKwkJIHx8IHBJbWFnZTItPnBEZXN0aW5hdGlvbiA9PSBOVUxMKSAvLyBzaXplLCBleGVjdXRlIGFuZCBmbGFncyBjYW4gbGVnYWxseSBiZSAwCQkKKwkJeworCQkJcEltYWdlMiA9IE5VTEw7IC8vIGludmFsaWRhdGUKKwkJfQorCX0KKworCWlmIChwSW1hZ2UyID09IE5VTEwgfHwgblByZWZlcnJlZCA9PSAxKQorCXsJLy8gbm8gc2Vjb25kIGltYWdlIG9yIG92ZXJyaWRkZW46IHJldHVybiB0aGUgZmlyc3QKKwkJcmV0dXJuIHBJbWFnZTE7CisJfQorCisJcmV0dXJuIHBJbWFnZTI7IC8vIHJldHVybiBzZWNvbmQgaW1hZ2UKK30KKworLy8gZGlhZ25vc3RpYyBmdW5jdGlvbnMKKwordm9pZCBTZXRMZWQoQk9PTCBiT24pCit7CisJaWYgKGJPbikKKwkJUEJEUiB8PSAweDQwOworCWVsc2UKKwkJUEJEUiAmPSB+MHg0MDsKK30KKworCit2b2lkIFVhcnRJbml0KHZvaWQpCit7CisJUEJJT1IgJj0gMHhGQkZGOyAvLyBpbnB1dDogUlhEMSByZW1vdGUgcGluCisJUEJDUjEgfD0gMHgwMEEwOyAvLyBzZXQgUEIzK1BCMiB0byBVQVJUCisJUEJDUjEgJj0gMHhGRkFGOyAvLyBjbGVhciBiaXRzIDYsIDQgLT4gVUFSVAorCVNNUjEgID0gIDB4MDAwMDsgLy8gYXN5bmMgZm9ybWF0IDhOMSwgYmF1ZCBnZW5lcmF0b3IgaW5wdXQgaXMgQ1BVIGNsb2NrCisJU0NSMSAgPSAgMHgwMDMwOyAvLyB0cmFuc21pdCtyZWNlaXZlIGVuYWJsZQorCVBCQ1IxICY9IDB4MDBGRjsgLy8gc2V0IGJpdCAxMi4uLjE1IGFzIEdQSU8KKwlTU1IxICAmPSAweDAwQkY7IC8vIGNsZWFyIGJpdCA2IChSRFJGLCByZWNlaXZlIGRhdGEgcmVnaXN0ZXIgZnVsbCkKK30KKworCitVSU5UOCBVYXJ0UmVhZCh2b2lkKQoreworCVVJTlQ4IGJ5dGU7CisJd2hpbGUgKCEoU1NSMSAmIFNDSV9SRFJGKSk7IC8vIHdhaXQgZm9yIGNoYXIgdG8gYmUgYXZhaWxhYmxlCisJYnl0ZSA9IFJEUjE7CisJU1NSMSAmPSB+U0NJX1JEUkY7CisJcmV0dXJuIGJ5dGU7Cit9CisKKwordm9pZCBVYXJ0V3JpdGUoVUlOVDggYnl0ZSkKK3sKKwl3aGlsZSAoIShTU1IxICYgU0NJX1REUkUpKTsgLy8gd2FpdCBmb3IgdHJhbnNtaXQgYnVmZmVyIGVtcHR5CisJVERSMSA9IGJ5dGU7CisJU1NSMSAmPSB+U0NJX1REUkU7Cit9CisKKworLy8gaW5jbHVkZSB0aGUgbWluaSBtb25pdG9yIGFzIGEgcmVzY3VlIGZlYXR1cmUsIHN0YXJ0ZWQgd2l0aCBGMwordm9pZCBNaW5pTW9uKHZvaWQpCit7CisJVUlOVDggY21kOworCVVJTlQzMiBhZGRyOworCVVJTlQzMiBzaXplOworCVVJTlQzMiBjb250ZW50OworCXZvbGF0aWxlIFVJTlQ4KiBwYWRkciA9IE5VTEw7CisJdm9sYXRpbGUgVUlOVDgqIHBmbGFzaCA9IE5VTEw7IC8vIGZsYXNoIGJhc2UgYWRkcmVzcworCisJVWFydEluaXQoKTsKKworCXdoaWxlICgxKQorCXsKKwkJY21kID0gVWFydFJlYWQoKTsKKwkJc3dpdGNoIChjbWQpCisJCXsKKwkJY2FzZSBCQVVEUkFURToKKwkJCWNvbnRlbnQgPSBVYXJ0UmVhZCgpOworCQkJVWFydFdyaXRlKGNtZCk7IC8vIGFja25vd2xlZGdlIGJ5IHJldHVybmluZyB0aGUgY29tbWFuZCB2YWx1ZQorCQkJd2hpbGUgKCEoU1NSMSAmIFNDSV9URU5EKSk7IC8vIHdhaXQgZm9yIGVtcHR5IHNoaWZ0IHJlZ2lzdGVyLCBiZWZvcmUgY2hhbmdpbmcgYmF1ZHJhdGUKKwkJCUJSUjEgPSBjb250ZW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBBRERSRVNTOgorCQkJYWRkciA9IChVYXJ0UmVhZCgpIDw8IDI0KSB8IChVYXJ0UmVhZCgpIDw8IDE2KSB8IChVYXJ0UmVhZCgpIDw8IDgpIHwgVWFydFJlYWQoKTsKKwkJCXBhZGRyID0gKFVJTlQ4KilhZGRyOworCQkJcGZsYXNoID0gKFVJTlQ4KikoYWRkciAmIDB4RkZGODAwMDApOyAvLyByb3VuZCBkb3duIHRvIDUxMmsgYWxpZ24KKwkJCVVhcnRXcml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCWJyZWFrOworCisJCWNhc2UgQllURV9SRUFEOgorCQkJY29udGVudCA9ICpwYWRkcisrOworCQkJVWFydFdyaXRlKGNvbnRlbnQpOyAvLyB0aGUgY29udGVudCBpcyB0aGUgYWNrCQorCQkJYnJlYWs7CisKKwkJY2FzZSBCWVRFX1dSSVRFOgorCQkJY29udGVudCA9IFVhcnRSZWFkKCk7CisJCQkqcGFkZHIrKyA9IGNvbnRlbnQ7CisJCQlVYXJ0V3JpdGUoY21kKTsgLy8gYWNrbm93bGVkZ2UgYnkgcmV0dXJuaW5nIHRoZSBjb21tYW5kIHZhbHVlCisJCQlicmVhazsKKworCQljYXNlIEJZVEVfUkVBRDE2OgorCQkJc2l6ZSA9IDE2OworCQkJd2hpbGUgKHNpemUtLSkKKwkJCXsKKwkJCQljb250ZW50ID0gKnBhZGRyKys7CisJCQkJVWFydFdyaXRlKGNvbnRlbnQpOyAvLyB0aGUgY29udGVudCBpcyB0aGUgYWNrCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEJZVEVfV1JJVEUxNjoKKwkJCXNpemUgPSAxNjsKKwkJCXdoaWxlIChzaXplLS0pCisJCQl7CisJCQkJY29udGVudCA9IFVhcnRSZWFkKCk7CisJCQkJKnBhZGRyKysgPSBjb250ZW50OworCQkJfQorCQkJVWFydFdyaXRlKGNtZCk7IC8vIGFja25vd2xlZGdlIGJ5IHJldHVybmluZyB0aGUgY29tbWFuZCB2YWx1ZQorCQkJYnJlYWs7CisKKwkJY2FzZSBCWVRFX0ZMQVNIOgorCQkJY29udGVudCA9IFVhcnRSZWFkKCk7CisJCQlwZmxhc2hbMHg1NTU1XSA9IDB4QUE7IC8vIHNldCBmbGFzaCB0byBjb21tYW5kIG1vZGUKKwkJCXBmbGFzaFsweDJBQUFdID0gMHg1NTsKKwkJCXBmbGFzaFsweDU1NTVdID0gMHhBMDsgLy8gYnl0ZSBwcm9ncmFtIGNvbW1hbmQKKwkJCSpwYWRkcisrID0gY29udGVudDsKKwkJCVVhcnRXcml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCWJyZWFrOworCisJCWNhc2UgQllURV9GTEFTSDE2OgorCQkJc2l6ZSA9IDE2OworCQkJd2hpbGUgKHNpemUtLSkKKwkJCXsKKwkJCQljb250ZW50ID0gVWFydFJlYWQoKTsKKwkJCQlwZmxhc2hbMHg1NTU1XSA9IDB4QUE7IC8vIHNldCBmbGFzaCB0byBjb21tYW5kIG1vZGUKKwkJCQlwZmxhc2hbMHgyQUFBXSA9IDB4NTU7CisJCQkJcGZsYXNoWzB4NTU1NV0gPSAweEEwOyAvLyBieXRlIHByb2dyYW0gY29tbWFuZAorCQkJCSpwYWRkcisrID0gY29udGVudDsKKwkJCX0KKwkJCVVhcnRXcml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCWJyZWFrOworCisJCWNhc2UgSEFMRldPUkRfUkVBRDoKKwkJCWNvbnRlbnQgPSAqKFVJTlQxNiopcGFkZHI7CisJCQlwYWRkciArPSAyOworCQkJVWFydFdyaXRlKGNvbnRlbnQgPj4gOCk7IC8vIGhpZ2hieXRlCisJCQlVYXJ0V3JpdGUoY29udGVudCAmIDB4RkYpOyAvLyBsb3dieXRlCisJCQlicmVhazsKKwkJCisJCWNhc2UgSEFMRldPUkRfV1JJVEU6CisJCQljb250ZW50ID0gVWFydFJlYWQoKSA8PCA4IHwgVWFydFJlYWQoKTsKKwkJCSooVUlOVDE2KilwYWRkciA9IGNvbnRlbnQ7CisJCQlwYWRkciArPSAyOworCQkJVWFydFdyaXRlKGNtZCk7IC8vIGFja25vd2xlZGdlIGJ5IHJldHVybmluZyB0aGUgY29tbWFuZCB2YWx1ZQorCQkJYnJlYWs7CisJCQorCQljYXNlIEVYRUNVVEU6CisJCQl7CisJCQkJdHBGdW5jIHBGdW5jID0gKHRwRnVuYylwYWRkcjsKKwkJCQlwRnVuYygpOworCQkJCVVhcnRXcml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVkVSU0lPTjoKKwkJCVVhcnRXcml0ZSgxKTsgLy8gcmV0dXJuIG91ciB2ZXJzaW9uIG51bWJlcgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlTZXRMZWQoVFJVRSk7CisJCQkJVWFydFdyaXRlKH5jbWQpOyAvLyBlcnJvciBhY2tub3dsZWRnZQorCQkJfQorCisJCX0gLy8gY2FzZQorCX0gLy8gd2hpbGUgKDEpCit9CmRpZmYgLS1naXQgYS9mbGFzaC9ib290bG9hZGVyL2Jvb3Rsb2FkZXIuaCBiL2ZsYXNoL2Jvb3Rsb2FkZXIvYm9vdGxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTYxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC9ib290bG9hZGVyL2Jvb3Rsb2FkZXIuaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorI2VuZGlmCisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKworLy8gc2NhbGFyIHR5cGVzCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIFVJTlQzMjsKK3R5cGVkZWYgaW50IEJPT0w7CisKK3R5cGVkZWYgdm9pZCgqdHBGdW5jKSh2b2lkKTsgLy8gdHlwZSBmb3IgZXhlY3V0ZQordHlwZWRlZiBpbnQoKnRwTWFpbikodm9pZCk7IC8vIHR5cGUgZm9yIHN0YXJ0IHZlY3RvciB0byBtYWluKCkKKworCisvLyBzdHJ1Y3R1cmUgb2YgYW4gaW1hZ2UgaW4gdGhlIGZsYXNoCit0eXBlZGVmIHN0cnVjdCAKK3sKKwlVSU5UMzIqIHBEZXN0aW5hdGlvbjsgLy8gYWRkcmVzcyB0byBjb3B5IGl0IHRvCisJVUlOVDMyIHNpemU7ICAgICAgICAgIC8vIGhvdyBtYW55IGJ5dGVzIG9mIHBheWxvYWQgKHRvIHRoZSBuZXh0IGhlYWRlcikKKwl0cEZ1bmMgcEV4ZWN1dGU7ICAgICAgLy8gZW50cnkgcG9pbnQKKwlVSU5UMzIgZmxhZ3M7ICAgICAgICAgLy8gdW5jb21wcmVzc2VkIG9yIGNvbXByZXNzZWQKKwkvLyBlbmQgb2YgaGVhZGVyLCBub3cgY29tZXMgdGhlIHBheWxvYWQKKwlVSU5UMzIgaW1hZ2VbXTsgICAgICAgLy8gdGhlIGJpbmFyeSBpbWFnZSBzdGFydHMgaGVyZQorCS8vIGFmdGVyIHRoZSBwYXlsb2FkLCB0aGUgbmV4dCBoZWFkZXIgbWF5IGZvbGxvdywgYWxsIDB4RkYgaWYgbm9uZQorfSB0SW1hZ2U7CisKKy8vIGZsYWdzIHZhbGlkIGZvciBpbWFnZSBoZWFkZXIKKyNkZWZpbmUgSUZfTk9ORSAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSUZfVUNMXzJFIDB4MDAwMDAwMDEgLy8gaW1hZ2UgaXMgY29tcHJlc3NlZCB3aXRoIFVDTCwgYWxnb3JpdGhtIDJlCisKKworLy8gcmVzb2x2ZSBwbGF0Zm9ybSBkZXBlbmRlbmN5IG9mIEYxIGJ1dHRvbiBjaGVjaworI2lmIGRlZmluZWQgUExBVEZPUk1fUExBWUVSCisjZGVmaW5lIENIQU5ORUwgMQorI2RlZmluZSBGMV9MT1dFUiAwICAvLyB0aGlzIGlzIHRoZSAiTWVudSIga2V5CisjZGVmaW5lIEYxX1VQUEVSIDM4NAorI2RlZmluZSBGMl9MT1dFUiAxMDI0IC8vIG5vdCBwcmVzZW50CisjZGVmaW5lIEYyX1VQUEVSIDEwMjQKKyNkZWZpbmUgRjNfTE9XRVIgMTAyNAorI2RlZmluZSBGM19VUFBFUiAxMDI0CisjZWxpZiBkZWZpbmVkIFBMQVRGT1JNX1JFQ09SREVSCisjZGVmaW5lIENIQU5ORUwgNAorI2RlZmluZSBGMV9MT1dFUiAyNTAKKyNkZWZpbmUgRjFfVVBQRVIgNDk5CisjZGVmaW5lIEYyX0xPV0VSIDUwMAorI2RlZmluZSBGMl9VUFBFUiA2OTkKKyNkZWZpbmUgRjNfTE9XRVIgOTAwCisjZGVmaW5lIEYzX1VQUEVSIDEwMjMKKyNlbGlmIGRlZmluZWQgUExBVEZPUk1fRk0KKyNkZWZpbmUgQ0hBTk5FTCA0CisjZGVmaW5lIEYxX0xPV0VSIDE1MAorI2RlZmluZSBGMV9VUFBFUiAzODQKKyNkZWZpbmUgRjJfTE9XRVIgMzg1CisjZGVmaW5lIEYyX1VQUEVSIDU0NAorI2RlZmluZSBGM19MT1dFUiA3MDAKKyNkZWZpbmUgRjNfVVBQRVIgMTAyMworI2Vsc2UKKyNlcnJvciAoIk5vIHBsYXRmb3JtIGdpdmVuISIpCisjZW5kaWYKKworI2RlZmluZSBGTEFTSF9CQVNFIDB4MDIwMDAwMDAgLy8gc3RhcnQgb2YgdGhlIGZsYXNoIG1lbW9yeQorI2RlZmluZSBGV19WRVJTSU9OICoodW5zaWduZWQgc2hvcnQqKShGTEFTSF9CQVNFICsgMHhGRSkgLy8gZmlybXdhcmUgdmVyc2lvbgorCisKKy8vIHByb3RvdHlwZXMKK3ZvaWQgX21haW4odm9pZCkgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuc3RhcnR1cCIpKSk7CitpbnQgbWFpbih2b2lkKTsKK3ZvaWQgUGxhdGZvcm1Jbml0KHZvaWQpOwordm9pZCBEcmFtSW5pdCh2b2lkKTsKK2ludCB1Y2xfbnJ2MmVfZGVjb21wcmVzc184KGNvbnN0IFVJTlQ4ICpzcmMsIFVJTlQ4ICpkc3QsIFVJTlQzMiogZHN0X2xlbik7Cit2b2lkIERlY29tcHJlc3NTdGFydCh0SW1hZ2UqIHBJbWFnZSk7CitpbnQgUmVhZEFEQyhpbnQgY2hhbm5lbCk7CitpbnQgQnV0dG9uUHJlc3NlZCh2b2lkKTsKK3RJbWFnZSogR2V0U3RhcnRJbWFnZShpbnQgblByZWZlcnJlZCk7CisvLyB0ZXN0IGZ1bmN0aW9ucwordm9pZCBTZXRMZWQoQk9PTCBiT24pOwordm9pZCBVYXJ0SW5pdCh2b2lkKTsKK1VJTlQ4IFVhcnRSZWFkKHZvaWQpOwordm9pZCBVYXJ0V3JpdGUoVUlOVDggYnl0ZSk7Cit2b2lkIE1pbmlNb24odm9pZCk7CisKKworLy8gbWluaW1vbiBjb21tYW5kcworI2RlZmluZSBCQVVEUkFURSAgICAgICAweDAwIC8vIGZvbGxvd2VkIGJ5IEJSUiB2YWx1ZTsgcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZQorI2RlZmluZSBBRERSRVNTICAgICAgICAweDAxIC8vIGZvbGxvd2VkIGJ5IDQgYnl0ZXMgYWRkcmVzczsgcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZQorI2RlZmluZSBCWVRFX1JFQUQgICAgICAweDAyIC8vIHJlc3BvbnNlOiAxIGJ5dGUgY29udGVudAorI2RlZmluZSBCWVRFX1dSSVRFICAgICAweDAzIC8vIGZvbGxvd2VkIGJ5IDEgYnl0ZSBjb250ZW50OyByZXNwb25zZTogY29tbWFuZCBieXRlCisjZGVmaW5lIEJZVEVfUkVBRDE2ICAgIDB4MDQgLy8gcmVzcG9uc2U6IDE2IGJ5dGVzIGNvbnRlbnQKKyNkZWZpbmUgQllURV9XUklURTE2ICAgMHgwNSAvLyBmb2xsb3dlZCBieSAxNiBieXRlczsgcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZQorI2RlZmluZSBCWVRFX0ZMQVNIICAgICAweDA2IC8vIGZvbGxvd2VkIGJ5IDEgYnl0ZSBjb250ZW50OyByZXNwb25zZTogY29tbWFuZCBieXRlCisjZGVmaW5lIEJZVEVfRkxBU0gxNiAgIDB4MDcgLy8gZm9sbG93ZWQgYnkgMTYgYnl0ZXM7IHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgSEFMRldPUkRfUkVBRCAgMHgwOCAvLyByZXNwb25zZTogMiBieXRlIGNvbnRlbnQKKyNkZWZpbmUgSEFMRldPUkRfV1JJVEUgMHgwOSAvLyBmb2xsb3dlZCBieSAyIGJ5dGUgY29udGVudDsgcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZQorI2RlZmluZSBFWEVDVVRFICAgICAgICAweDBBIC8vIHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUgaWYgY2FsbCByZXR1cm5zCisjZGVmaW5lIFZFUlNJT04gICAgICAgIDB4MEIgLy8gcmVzcG9uc2U6IHZlcnNpb24KKworCisvLyBsaW5rZXIgc3ltYm9scworZXh0ZXJuIFVJTlQzMiBiZWdpbl90ZXh0W107CitleHRlcm4gVUlOVDMyIGVuZF90ZXh0W107CitleHRlcm4gVUlOVDMyIGJlZ2luX2RhdGFbXTsKK2V4dGVybiBVSU5UMzIgZW5kX2RhdGFbXTsKK2V4dGVybiBVSU5UMzIgYmVnaW5fYnNzW107CitleHRlcm4gVUlOVDMyIGVuZF9ic3NbXTsKK2V4dGVybiBVSU5UMzIgYmVnaW5fc3RhY2tbXTsKK2V4dGVybiBVSU5UMzIgZW5kX3N0YWNrW107CitleHRlcm4gVUlOVDMyIGJlZ2luX2lyYW1jb3B5W107CitleHRlcm4gVUlOVDMyIHRvdGFsX3NpemVbXTsKZGlmZiAtLWdpdCBhL2ZsYXNoL2Jvb3Rsb2FkZXIvYm9vdGxvYWRlci5sZHMgYi9mbGFzaC9ib290bG9hZGVyL2Jvb3Rsb2FkZXIubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2Q4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC9ib290bG9hZGVyL2Jvb3Rsb2FkZXIubGRzCkBAIC0wLDAgKzEsMzQgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItc2gpCitJTlBVVChib290bG9hZGVyLm8pCisKK01FTU9SWQoreworCS8qIHRoZSBib290IFJPTSB1c2VzIElSQU0gYXQgNDAwLTQzMCwgc3RheSBhd2F5IGFuZCBzdGFydCBhdCA1MDAgKi8KKwlJUkFNIDogT1JJR0lOID0gMHgwRkZGRjUwMCwgTEVOR1RIID0gMHhBMDAKKwkvKiBhbmQgbGVhdmUgc29tZSByb29tIGZvciBzdGFjayBhdCB0aGUgZW5kICovCit9CisKK1NFQ1RJT05TCit7CisJLnN0YXJ0dmVjdG9yIDoKKwl7CisJCSooLnN0YXJ0dmVjdG9yKQorCQkuID0gQUxJR04oMHg0KTsKKwl9ID4gSVJBTQorCisJLnRleHQgOgorCXsJIAorCQkqKC50ZXh0KQkKKwkJLiA9IEFMSUdOKDB4NCk7CisJfSA+IElSQU0KKwkKKwkuZGF0YSA6CisJeworCQkqKC5kYXRhKQorCX0gPiBJUkFNCisKKwkuYnNzIDoKKwl7CisJICAgKiguYnNzKQorCX0gPiBJUkFNCit9CmRpZmYgLS1naXQgYS9mbGFzaC9ib290bG9hZGVyL25vX3JvbS5sZHMgYi9mbGFzaC9ib290bG9hZGVyL25vX3JvbS5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1ZTdmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL2Jvb3Rsb2FkZXIvbm9fcm9tLmxkcwpAQCAtMCwwICsxLDYyIEBACisvKiBUaGlzIGlzIGZvciB0aGUgdmFyaWFudCB3aXRob3V0IGJvb3QgUk9NLAorICAgd2hlcmUgdGhlIGZsYXNoIFJPTSBpcyBtaXJyb3JlZCB0byBhZGRyZXNzIHplcm8gKi8KKworT1VUUFVUX0ZPUk1BVChlbGYzMi1zaCkKK0lOUFVUKGJvb3Rsb2FkZXIubykKKworTUVNT1JZCit7CisJSVJBTSA6IE9SSUdJTiA9IDB4MEZGRkYwMDAsIExFTkdUSCA9IDB4MTAwMAorCUZMQVNIIDogT1JJR0lOID0gMHgwMDAwMDAwMCwgTEVOR1RIID0gMHg0MDAwMAorfQorCitTRUNUSU9OUworeworCS52ZWN0b3JzIDoKKwl7CisJCSooLnZlY3RvcnMpCisJCS4gPSBBTElHTigweDIwMCk7CisJfSA+IEZMQVNICisKKwkuc3RhcnR1cCA6CisJeworCQkqKC5zdGFydHVwKQorCQkuID0gQUxJR04oMHg0KTsKKwkJX2JlZ2luX2lyYW1jb3B5ID0gLjsKKwl9ID4gRkxBU0gKKworCS50ZXh0IDogQVQgKCBfYmVnaW5faXJhbWNvcHkgKQorCXsJIAorCQlfYmVnaW5fdGV4dCA9IC47CisJCSooLnRleHQpCQorCQkuID0gQUxJR04oMHg0KTsKKwkJX2VuZF90ZXh0ID0gLjsKKwl9ID4gSVJBTQorCQorCS5kYXRhIDogQVQgKCBfZW5kX3RleHQgKQorCXsKKwkJX2JlZ2luX2RhdGEgPSAuOworCQkqKC5kYXRhKQorCQkuID0gQUxJR04oMHg0KTsKKwkJX2VuZF9kYXRhID0gLjsKKwl9ID4gSVJBTQorCisJLmJzcyA6IEFUICggX2VuZF9kYXRhICkKKwl7CisJCV9iZWdpbl9ic3MgPSAuOworCQkqKC5ic3MpCisJCS4gPSBBTElHTigweDQpOworCQlfZW5kX2JzcyA9IC47CisJfSA+IElSQU0KKworCS5zdGFjayA6CisJeworCQlfYmVnaW5fc3RhY2sgPSAuOworCQkqKC5zdGFjaykKKwkJLiA9IEFMSUdOKDB4MTAwMCk7CisJCV9lbmRfc3RhY2sgPSAuOworCX0gPiBJUkFNCisKKwkvKiBzaXplIG9mIHRoZSBwcm9ncmFtICh3aXRob3V0IHZlY3RvcnMpICovCisJX3RvdGFsX3NpemUgPSBTSVpFT0YoLnN0YXJ0dXApICsgU0laRU9GKC50ZXh0KSArIFNJWkVPRiguZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9mbGFzaC9leHRyYWN0L1JFQURNRSBiL2ZsYXNoL2V4dHJhY3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjQ0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC9leHRyYWN0L1JFQURNRQpAQCAtMCwwICsxLDUgQEAKKyhjKSAyMDAzIGJ5IEr2cmcgSG9oZW5zb2huCisKK1RoaXMgdG9vbCBleHRyYWN0cyB0aGUgZmlybXdhcmUgaW1hZ2Ugb3V0IG9mIGFuIG9yaWdpbmFsIEFyY2hvcyBST00gZHVtcCwKK2xpa2UgY3JlYXRlZCB3aXRoIHRoZSBSb2NrYm94IGRlYnVnLT5kdW1wIGZlYXR1cmUuCitUaGUgZXh0cmFjdGVkIGltYWdlIGNhbiB0aGVuIGJlIHVzZWQgdG8gY29tcG9zZSBhIGR1YWwtYm9vdCBmaXJtd2FyZS4KZGlmZiAtLWdpdCBhL2ZsYXNoL2V4dHJhY3QvZXh0cmFjdC5jIGIvZmxhc2gvZXh0cmFjdC9leHRyYWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlMjIzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL2V4dHJhY3QvZXh0cmFjdC5jCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBfX19fX19fX19fICAgICAgICAgICAgICAgX18gICBfX18uCisgKiAgIE9wZW4gICAgICBcX19fX19fICAgXCBfX19fICAgX19fXyB8ICB8IF9cXyB8X18gICBfX19fX19fICBfX18KKyAqICAgU291cmNlICAgICB8ICAgICAgIF8vLyAgXyBcXy8gX19fXHwgIHwvIC98IF9fIFwgLyAgXyBcICBcLyAgLworICogICBKdWtlYm94ICAgIHwgICAgfCAgICggIDxfPiApICBcX19ffCAgICA8IHwgXF9cICggIDxfPiA+IDwgIDwKKyAqICAgRmlybXdhcmUgICB8X19fX3xfICAvXF9fX18vIFxfX18gID5fX3xfIFx8X19fICAvXF9fX18vX18vXF8gXAorICogICAgICAgICAgICAgICAgICAgICBcLyAgICAgICAgICAgIFwvICAgICBcLyAgICBcLyAgICAgICAgICAgIFwvCisgKiAkSWQkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEr2cmcgSG9oZW5zb2huIAorICogCisgKiBUb29sIHRvIGV4dHJhY3QgdGhlIHNjcmFtYmxlZCBpbWFnZSBvdXQgb2YgYW4gQXJjaG9zIGZsYXNoIFJPTSBkdW1wCisgKgorICogQWxsIGZpbGVzIGluIHRoaXMgYXJjaGl2ZSBhcmUgc3ViamVjdCB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlIHRyZWUgcm9vdCBmb3IgZnVsbCBsaWNlbnNlIGFncmVlbWVudC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworI2RlZmluZSBVSU5UOCB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIFVJTlQxNiB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSBVSU5UMzIgdW5zaWduZWQgbG9uZworCisjZGVmaW5lIElNQUdFX0hFQURFUiAweDYwMDAgLy8gYSAzMiBieXRlIGhlYWRlciBpbiBmcm9udCBvZiB0aGUgc29mdHdhcmUgaW1hZ2UKKyNkZWZpbmUgSU1BR0VfU1RBUlQgIDB4NjAyMAkvLyBzb2Z0d2FyZSBpbWFnZSBwb3NpdGlvbiBpbiBGbGFzaAorCisKKy8vIHBsYWNlIGEgMzIgYml0IHZhbHVlIGludG8gbWVtb3J5LCBiaWcgZW5kaWFuCit2b2lkIFdyaXRlMzIoVUlOVDgqIHBCeXRlLCBVSU5UMzIgdmFsdWUpCit7CisJcEJ5dGVbMF0gPSAoVUlOVDgpKHZhbHVlID4+IDI0KTsJCisJcEJ5dGVbMV0gPSAoVUlOVDgpKHZhbHVlID4+IDE2KTsJCisJcEJ5dGVbMl0gPSAoVUlOVDgpKHZhbHVlID4+IDgpOwkKKwlwQnl0ZVszXSA9IChVSU5UOCkodmFsdWUpOwkKK30KKworCisvLyByZWFkIGEgMzIgYml0IHZhbHVlIGZyb20gbWVtb3J5LCBiaWcgZW5kaWFuCitVSU5UMzIgUmVhZDMyKFVJTlQ4KiBwQnl0ZSkKK3sKKwlVSU5UMzIgdmFsdWUgPSAwOworCisJdmFsdWUgfD0gKFVJTlQzMilwQnl0ZVswXSA8PCAyNDsKKwl2YWx1ZSB8PSAoVUlOVDMyKXBCeXRlWzFdIDw8IDE2OworCXZhbHVlIHw9IChVSU5UMzIpcEJ5dGVbMl0gPDwgODsKKwl2YWx1ZSB8PSAoVUlOVDMyKXBCeXRlWzNdOworCisJcmV0dXJuIHZhbHVlOworfQorCisKKy8vIGVudHJ5IHBvaW50CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworCUZJTEUqIHBJbkZpbGU7CisJRklMRSogcE91dEZpbGU7CisJVUlOVDggYUhlYWRlcls2XTsKKwlVSU5UOCBhSW1hZ2VbMjU2KjEwMjRdOworCVVJTlQzMiBpOworCVVJTlQzMiB1aVNpemUsIHVpU3RhcnQ7CisJVUlOVDE2IHVzQ2hlY2tzdW0gPSAwOworCQorCWlmIChhcmdjIDwgMikKKwl7CisJCXByaW50ZigiRXh0cmFjdCB0aGUgc29mdHdhcmUgaW1hZ2Ugb3V0IG9mIGFuIG9yaWdpbmFsIEFyY2hvcyBGbGFzaCBST00gZHVtcC5cbiIpOworCQlwcmludGYoIlJlc3VsdCBpcyBhIHNjcmFtYmxlZCBmaWxlLCB1c2UgdGhlIGRlc2NyYW1ibGUgdG9vbCB0byBnZXQgdGhlIGJpbmFyeSxcbiIpOworCQlwcmludGYoIiBhbHdheXMgd2l0aG91dCB0aGUgLWZtIG9wdGlvbiwgZXZlbiBpZiBwcm9jZXNzaW5nIGFuIEZNIHNvZnR3YXJlLlxuXG4iKTsKKwkJcHJpbnRmKCJVc2FnZTogZXh0cmFjdCA8Zmxhc2ggZHVtcCBmaWxlPiA8b3V0cHV0IGZpbGU+XG4iKTsKKwkJcHJpbnRmKCJFeGFtcGxlOiBleHRyYWN0IGludGVybmFsX3JvbV8yMDAwMDAwLTIwM0ZGRkYuYmluIGFyY2hvcy5hanpcbiIpOworCQlleGl0KDApOworCX0KKwkKKwlwSW5GaWxlID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisJaWYgKHBJbkZpbGUgPT0gTlVMTCkKKwl7CisJCXByaW50ZigiRXJyb3Igb3BlbmluZyBpbnB1dCBmaWxlICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoZnJlYWQoYUltYWdlLCAxLCBzaXplb2YoYUltYWdlKSwgcEluRmlsZSkgIT0gc2l6ZW9mKGFJbWFnZSkpCisJeworCQlwcmludGYoIkVycm9yIHJlYWRpbmcgaW5wdXQgZmlsZSAlcywgbXVzdCBiZSAyNTZrQiBpbiBzaXplLlxuIiwgYXJndlsxXSk7CisJCWZjbG9zZShwSW5GaWxlKTsKKwkJZXhpdCgyKTsKKwl9CisJZmNsb3NlKHBJbkZpbGUpOworCisJLy8gZmluZCBvdXQgYWJvdXQgdGhlIHR5cGUKKwl1aVN0YXJ0ID0gUmVhZDMyKGFJbWFnZSArIDgpOworCXVpU2l6ZSA9IFJlYWQzMihhSW1hZ2UgKyAxMik7IC8vIGJvb3RlZCBST00gaW1hZ2UKKwlpZiAodWlTdGFydCA9PSAweDAyMDAwMTAwICYmIHVpU2l6ZSA+IDIwMDAwKQorCXsJLy8gUGxheWVyIGhhcyBubyBsb2FkZXIsIHN0YXJ0cyBkaXJlY3RseSB3aXRoIHRoZSBpbWFnZQorCQl1aVN0YXJ0ID0gMHgwMTAwOworCX0KKwllbHNlCisJewkvLyBSZWNvcmRlciAvIEZNIC8gVjIgUmVjb3JkZXIKKwkJdWlTdGFydCA9IElNQUdFX1NUQVJUOworCQl1aVNpemUgPSBSZWFkMzIoYUltYWdlICsgSU1BR0VfSEVBREVSICsgNCk7IC8vIHNpemUgcmVjb3JkIG9mIGhlYWRlcgorCX0KKworCS8vIHNhbml0eSBjaGVjaworCWlmICh1aVNpemUgPiBzaXplb2YoYUltYWdlKSAtIHVpU3RhcnQgfHwgdWlTaXplIDwgNDAwMDApCisJewkKKwkJcHJpbnRmKCJFcnJvcjogSW1wb3NzaWJsZSBpbWFnZSBzaXplICZkIGJ5dGVzLlxuIiwgdWlTaXplKTsKKwkJZXhpdCgzKTsKKwl9CisKKwkvLyBnZW5lcmF0ZSBjaGVja3N1bQorCWZvciAoaT0wOyBpPHVpU2l6ZTsgaSsrKQorCQl1c0NoZWNrc3VtICs9IGFJbWFnZVt1aVN0YXJ0ICsgaV07CisKKwkvLyBtYWtlIGhlYWRlcgorCVdyaXRlMzIoYUhlYWRlciArIDIsIHVzQ2hlY2tzdW0pOyAvLyBjaGVja3N1bSBpbiA1dGggYW5kIDZ0aCBieXRlCisJV3JpdGUzMihhSGVhZGVyLCB1aVNpemUpOyAvLyBzaXplIGluIGZpcnN0IDQgYnl0ZXMKKworCXBPdXRGaWxlID0gZm9wZW4oYXJndlsyXSwgIndiIik7CisJaWYgKHBPdXRGaWxlID09IE5VTEwpCisJeworCQlwcmludGYoIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOworCQlleGl0KDQpOworCX0KKworCWlmIChmd3JpdGUoYUhlYWRlciwgMSwgc2l6ZW9mKGFIZWFkZXIpLCBwT3V0RmlsZSkgIT0gc2l6ZW9mKGFIZWFkZXIpCisJIHx8IGZ3cml0ZShhSW1hZ2UgKyB1aVN0YXJ0LCAxLCB1aVNpemUsIHBPdXRGaWxlKSAhPSB1aVNpemUpCisJeworCQlwcmludGYoIldyaXRlIGVycm9yXG4iKTsKKwkJZmNsb3NlKHBPdXRGaWxlKTsKKwkJZXhpdCg1KTsKKwl9CisKKwlmY2xvc2UocE91dEZpbGUpOworCisJcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmxhc2gvZXh0cmFjdC9leHRyYWN0LmRzcCBiL2ZsYXNoL2V4dHJhY3QvZXh0cmFjdC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwMjgxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL2V4dHJhY3QvZXh0cmFjdC5kc3AKQEAgLTAsMCArMSwxMDAgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZXh0cmFjdCIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKKworQ0ZHPWV4dHJhY3QgLSBXaW4zMiBEZWJ1ZworIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJleHRyYWN0Lm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiZXh0cmFjdC5tYWsiIENGRz0iZXh0cmFjdCAtIFdpbjMyIERlYnVnIgorIU1FU1NBR0UgCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgImV4dHJhY3QgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImV4dHJhY3QgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorCishSUYgICIkKENGRykiID09ICJleHRyYWN0IC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA3IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDcgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4dHJhY3QgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwNyAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA3IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJleHRyYWN0IC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAiZXh0cmFjdCAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGV4dHJhY3QuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9mbGFzaC9tYWtlX2Zpcm13YXJlL1JFQURNRSBiL2ZsYXNoL21ha2VfZmlybXdhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTA2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC9tYWtlX2Zpcm13YXJlL1JFQURNRQpAQCAtMCwwICsxLDE0IEBACisoYykgMjAwMyBieSBK9nJnIEhvaGVuc29obgorCitUaGlzIHRvb2wgY29tcG9zZXMgYSBmaXJtd2FyZSBmaWxlLCBvdXQgb2Y6CisxLiBUZW1wbGF0ZSBmb3IgdGhlIGZpcnN0IEZsYXNoIHBhZ2UKKzIuIEJvb3Rsb2FkZXIKKzMuIEFyY2hvcyBpbWFnZQorNC4gUm9ja2JveCBpbWFnZQorCitVc2Ugd2l0aCBleHRyZW1lIGNhdXRpb24sIHRoZSBjb21wb25lbnRzIGhhdmUgdG8gbWF0Y2ghCitUaGUgYXNwZWN0cyBhcmU6CistIE1vZGVsIChQbGF5ZXIsIFJlY29yZGVyLCBGTSwgVjIpCistIGJvb3QgdHlwZSAoc3RhbmRhcmQgYm9vdCBST00gb3IgUk9NbGVzcykKKworU3VjaCBhIGZpcm13YXJlIGZpbGUgY2FuIHRoZW4gYmUgcHJvZ3JhbW1lZCB3aXRoICJmaXJtd2FyZV9mbGFzaC5yb2NrIi4KZGlmZiAtLWdpdCBhL2ZsYXNoL21ha2VfZmlybXdhcmUvbWFrZV9maXJtd2FyZS5jIGIvZmxhc2gvbWFrZV9maXJtd2FyZS9tYWtlX2Zpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwZGI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL21ha2VfZmlybXdhcmUvbWFrZV9maXJtd2FyZS5jCkBAIC0wLDAgKzEsMzM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBfX19fX19fX19fICAgICAgICAgICAgICAgX18gICBfX18uCisgKiAgIE9wZW4gICAgICBcX19fX19fICAgXCBfX19fICAgX19fXyB8ICB8IF9cXyB8X18gICBfX19fX19fICBfX18KKyAqICAgU291cmNlICAgICB8ICAgICAgIF8vLyAgXyBcXy8gX19fXHwgIHwvIC98IF9fIFwgLyAgXyBcICBcLyAgLworICogICBKdWtlYm94ICAgIHwgICAgfCAgICggIDxfPiApICBcX19ffCAgICA8IHwgXF9cICggIDxfPiA+IDwgIDwKKyAqICAgRmlybXdhcmUgICB8X19fX3xfICAvXF9fX18vIFxfX18gID5fX3xfIFx8X19fICAvXF9fX18vX18vXF8gXAorICogICAgICAgICAgICAgICAgICAgICBcLyAgICAgICAgICAgIFwvICAgICBcLyAgICBcLyAgICAgICAgICAgIFwvCisgKiAkSWQkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEr2cmcgSG9oZW5zb2huIAorICogCisgKiBBdXRvcmluZyB0b29sIGZvciB0aGUgZmlybXdhcmUgaW1hZ2UgdG8gYmUgcHJvZ3JhbW1lZCBpbnRvIEZsYXNoIFJPTQorICogSXQgY29tcG9zZXMgdGhlIGZsYXNoIGNvbnRlbnQgd2l0aCBoZWFkZXIsIGJvb3Rsb2FkZXIgYW5kIGltYWdlKHMpCisgKgorICogQWxsIGZpbGVzIGluIHRoaXMgYXJjaGl2ZSBhcmUgc3ViamVjdCB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlIHRyZWUgcm9vdCBmb3IgZnVsbCBsaWNlbnNlIGFncmVlbWVudC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFVJTlQ4IHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgVUlOVDE2IHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIFVJTlQzMiB1bnNpZ25lZCBsb25nCisjZGVmaW5lIEJPT0wgaW50CisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisKKy8vIHNpemUgb2Ygb25lIGZsYXNoIHNlY3RvciwgdGhlIGdyYW51bGFyaXR5IHdpdGggd2hpY2ggaXQgY2FuIGJlIGVyYXNlZAorI2RlZmluZSBTRUNUT1JTSVpFIDQwOTYgCisKKyNkZWZpbmUgQk9PVExPQURfREVTVCAweDBGRkZGNTAwIC8vIGZvciB0aGUgIm5vcm1hbCIgb25lCisjZGVmaW5lIEJPT1RMT0FEX1NDUiAweDAyMDAwMTAwCisjZGVmaW5lIFJPQ0tCT1hfREVTVCAweDA5MDAwMDAwCisjZGVmaW5lIFJPQ0tCT1hfRVhFQyAweDA5MDAwMjAwCisKKworLy8gcGxhY2UgYSAzMiBiaXQgdmFsdWUgaW50byBtZW1vcnksIGJpZyBlbmRpYW4KK3ZvaWQgV3JpdGUzMihVSU5UOCogcEJ5dGUsIFVJTlQzMiB2YWx1ZSkKK3sKKwlwQnl0ZVswXSA9IChVSU5UOCkodmFsdWUgPj4gMjQpOwkKKwlwQnl0ZVsxXSA9IChVSU5UOCkodmFsdWUgPj4gMTYpOwkKKwlwQnl0ZVsyXSA9IChVSU5UOCkodmFsdWUgPj4gOCk7CisJcEJ5dGVbM10gPSAoVUlOVDgpKHZhbHVlKTsJCit9CisKKworLy8gcmVhZCBhIDMyIGJpdCB2YWx1ZSBmcm9tIG1lbW9yeSwgYmlnIGVuZGlhbgorVUlOVDMyIFJlYWQzMihVSU5UOCogcEJ5dGUpCit7CisJVUlOVDMyIHZhbHVlID0gMDsKKworCXZhbHVlIHw9IChVSU5UMzIpcEJ5dGVbMF0gPDwgMjQ7CisJdmFsdWUgfD0gKFVJTlQzMilwQnl0ZVsxXSA8PCAxNjsKKwl2YWx1ZSB8PSAoVUlOVDMyKXBCeXRlWzJdIDw8IDg7CisJdmFsdWUgfD0gKFVJTlQzMilwQnl0ZVszXTsKKworCXJldHVybiB2YWx1ZTsKK30KKworCitVSU5UMzIgQ2FsY0NSQzMyIChjb25zdCBVSU5UOCogYnVmLCBVSU5UMzIgbGVuKSAKK3sgCisJc3RhdGljIGNvbnN0IFVJTlQzMiBjcmNfdGFibGVbMjU2XSA9IAorCXsJLy8gQ1JDMzIgbG9va3VwIHRhYmxlIGZvciBwb2x5bm9taWFsIDB4MDRDMTFEQjcKKwkJMHgwMDAwMDAwMCwgMHgwNEMxMURCNywgMHgwOTgyM0I2RSwgMHgwRDQzMjZEOSwgMHgxMzA0NzZEQywgMHgxN0M1NkI2QiwgCisJCTB4MUE4NjREQjIsIDB4MUU0NzUwMDUsIDB4MjYwOEVEQjgsIDB4MjJDOUYwMEYsIDB4MkY4QUQ2RDYsIDB4MkI0QkNCNjEsIAorCQkweDM1MEM5QjY0LCAweDMxQ0Q4NkQzLCAweDNDOEVBMDBBLCAweDM4NEZCREJELCAweDRDMTFEQjcwLCAweDQ4RDBDNkM3LCAKKwkJMHg0NTkzRTAxRSwgMHg0MTUyRkRBOSwgMHg1RjE1QURBQywgMHg1QkQ0QjAxQiwgMHg1Njk3OTZDMiwgMHg1MjU2OEI3NSwgCisJCTB4NkExOTM2QzgsIDB4NkVEODJCN0YsIDB4NjM5QjBEQTYsIDB4Njc1QTEwMTEsIDB4NzkxRDQwMTQsIDB4N0REQzVEQTMsIAorCQkweDcwOUY3QjdBLCAweDc0NUU2NkNELCAweDk4MjNCNkUwLCAweDlDRTJBQjU3LCAweDkxQTE4RDhFLCAweDk1NjA5MDM5LCAKKwkJMHg4QjI3QzAzQywgMHg4RkU2REQ4QiwgMHg4MkE1RkI1MiwgMHg4NjY0RTZFNSwgMHhCRTJCNUI1OCwgMHhCQUVBNDZFRiwgCisJCTB4QjdBOTYwMzYsIDB4QjM2ODdEODEsIDB4QUQyRjJEODQsIDB4QTlFRTMwMzMsIDB4QTRBRDE2RUEsIDB4QTA2QzBCNUQsIAorCQkweEQ0MzI2RDkwLCAweEQwRjM3MDI3LCAweEREQjA1NkZFLCAweEQ5NzE0QjQ5LCAweEM3MzYxQjRDLCAweEMzRjcwNkZCLCAKKwkJMHhDRUI0MjAyMiwgMHhDQTc1M0Q5NSwgMHhGMjNBODAyOCwgMHhGNkZCOUQ5RiwgMHhGQkI4QkI0NiwgMHhGRjc5QTZGMSwgCisJCTB4RTEzRUY2RjQsIDB4RTVGRkVCNDMsIDB4RThCQ0NEOUEsIDB4RUM3REQwMkQsIDB4MzQ4NjcwNzcsIDB4MzA0NzZEQzAsIAorCQkweDNEMDQ0QjE5LCAweDM5QzU1NkFFLCAweDI3ODIwNkFCLCAweDIzNDMxQjFDLCAweDJFMDAzREM1LCAweDJBQzEyMDcyLCAKKwkJMHgxMjhFOURDRiwgMHgxNjRGODA3OCwgMHgxQjBDQTZBMSwgMHgxRkNEQkIxNiwgMHgwMThBRUIxMywgMHgwNTRCRjZBNCwgCisJCTB4MDgwOEQwN0QsIDB4MENDOUNEQ0EsIDB4Nzg5N0FCMDcsIDB4N0M1NkI2QjAsIDB4NzExNTkwNjksIDB4NzVENDhEREUsIAorCQkweDZCOTNERERCLCAweDZGNTJDMDZDLCAweDYyMTFFNkI1LCAweDY2RDBGQjAyLCAweDVFOUY0NkJGLCAweDVBNUU1QjA4LCAKKwkJMHg1NzFEN0REMSwgMHg1M0RDNjA2NiwgMHg0RDlCMzA2MywgMHg0OTVBMkRENCwgMHg0NDE5MEIwRCwgMHg0MEQ4MTZCQSwgCisJCTB4QUNBNUM2OTcsIDB4QTg2NERCMjAsIDB4QTUyN0ZERjksIDB4QTFFNkUwNEUsIDB4QkZBMUIwNEIsIDB4QkI2MEFERkMsIAorCQkweEI2MjM4QjI1LCAweEIyRTI5NjkyLCAweDhBQUQyQjJGLCAweDhFNkMzNjk4LCAweDgzMkYxMDQxLCAweDg3RUUwREY2LCAKKwkJMHg5OUE5NURGMywgMHg5RDY4NDA0NCwgMHg5MDJCNjY5RCwgMHg5NEVBN0IyQSwgMHhFMEI0MURFNywgMHhFNDc1MDA1MCwgCisJCTB4RTkzNjI2ODksIDB4RURGNzNCM0UsIDB4RjNCMDZCM0IsIDB4Rjc3MTc2OEMsIDB4RkEzMjUwNTUsIDB4RkVGMzRERTIsIAorCQkweEM2QkNGMDVGLCAweEMyN0RFREU4LCAweENGM0VDQjMxLCAweENCRkZENjg2LCAweEQ1Qjg4NjgzLCAweEQxNzk5QjM0LCAKKwkJMHhEQzNBQkRFRCwgMHhEOEZCQTA1QSwgMHg2OTBDRTBFRSwgMHg2RENERkQ1OSwgMHg2MDhFREI4MCwgMHg2NDRGQzYzNywgCisJCTB4N0EwODk2MzIsIDB4N0VDOThCODUsIDB4NzM4QUFENUMsIDB4Nzc0QkIwRUIsIDB4NEYwNDBENTYsIDB4NEJDNTEwRTEsIAorCQkweDQ2ODYzNjM4LCAweDQyNDcyQjhGLCAweDVDMDA3QjhBLCAweDU4QzE2NjNELCAweDU1ODI0MEU0LCAweDUxNDM1RDUzLCAKKwkJMHgyNTFEM0I5RSwgMHgyMURDMjYyOSwgMHgyQzlGMDBGMCwgMHgyODVFMUQ0NywgMHgzNjE5NEQ0MiwgMHgzMkQ4NTBGNSwgCisJCTB4M0Y5Qjc2MkMsIDB4M0I1QTZCOUIsIDB4MDMxNUQ2MjYsIDB4MDdENENCOTEsIDB4MEE5N0VENDgsIDB4MEU1NkYwRkYsIAorCQkweDEwMTFBMEZBLCAweDE0RDBCRDRELCAweDE5OTM5Qjk0LCAweDFENTI4NjIzLCAweEYxMkY1NjBFLCAweEY1RUU0QkI5LCAKKwkJMHhGOEFENkQ2MCwgMHhGQzZDNzBENywgMHhFMjJCMjBEMiwgMHhFNkVBM0Q2NSwgMHhFQkE5MUJCQywgMHhFRjY4MDYwQiwgCisJCTB4RDcyN0JCQjYsIDB4RDNFNkE2MDEsIDB4REVBNTgwRDgsIDB4REE2NDlENkYsIDB4QzQyM0NENkEsIDB4QzBFMkQwREQsIAorCQkweENEQTFGNjA0LCAweEM5NjBFQkIzLCAweEJEM0U4RDdFLCAweEI5RkY5MEM5LCAweEI0QkNCNjEwLCAweEIwN0RBQkE3LCAKKwkJMHhBRTNBRkJBMiwgMHhBQUZCRTYxNSwgMHhBN0I4QzBDQywgMHhBMzc5REQ3QiwgMHg5QjM2NjBDNiwgMHg5RkY3N0Q3MSwgCisJCTB4OTJCNDVCQTgsIDB4OTY3NTQ2MUYsIDB4ODgzMjE2MUEsIDB4OENGMzBCQUQsIDB4ODFCMDJENzQsIDB4ODU3MTMwQzMsIAorCQkweDVEOEE5MDk5LCAweDU5NEI4RDJFLCAweDU0MDhBQkY3LCAweDUwQzlCNjQwLCAweDRFOEVFNjQ1LCAweDRBNEZGQkYyLCAKKwkJMHg0NzBDREQyQiwgMHg0M0NEQzA5QywgMHg3QjgyN0QyMSwgMHg3RjQzNjA5NiwgMHg3MjAwNDY0RiwgMHg3NkMxNUJGOCwgCisJCTB4Njg4NjBCRkQsIDB4NkM0NzE2NEEsIDB4NjEwNDMwOTMsIDB4NjVDNTJEMjQsIDB4MTE5QjRCRTksIDB4MTU1QTU2NUUsIAorCQkweDE4MTk3MDg3LCAweDFDRDg2RDMwLCAweDAyOUYzRDM1LCAweDA2NUUyMDgyLCAweDBCMUQwNjVCLCAweDBGREMxQkVDLCAKKwkJMHgzNzkzQTY1MSwgMHgzMzUyQkJFNiwgMHgzRTExOUQzRiwgMHgzQUQwODA4OCwgMHgyNDk3RDA4RCwgMHgyMDU2Q0QzQSwgCisJCTB4MkQxNUVCRTMsIDB4MjlENEY2NTQsIDB4QzVBOTI2NzksIDB4QzE2ODNCQ0UsIDB4Q0MyQjFEMTcsIDB4QzhFQTAwQTAsIAorCQkweEQ2QUQ1MEE1LCAweEQyNkM0RDEyLCAweERGMkY2QkNCLCAweERCRUU3NjdDLCAweEUzQTFDQkMxLCAweEU3NjBENjc2LCAKKwkJMHhFQTIzRjBBRiwgMHhFRUUyRUQxOCwgMHhGMEE1QkQxRCwgMHhGNDY0QTBBQSwgMHhGOTI3ODY3MywgMHhGREU2OUJDNCwgCisJCTB4ODlCOEZEMDksIDB4OEQ3OUUwQkUsIDB4ODAzQUM2NjcsIDB4ODRGQkRCRDAsIDB4OUFCQzhCRDUsIDB4OUU3RDk2NjIsIAorCQkweDkzM0VCMEJCLCAweDk3RkZBRDBDLCAweEFGQjAxMEIxLCAweEFCNzEwRDA2LCAweEE2MzIyQkRGLCAweEEyRjMzNjY4LCAKKwkJMHhCQ0I0NjY2RCwgMHhCODc1N0JEQSwgMHhCNTM2NUQwMywgMHhCMUY3NDBCNCAKKwl9OworCVVJTlQzMiBpOworCVVJTlQzMiBjcmMgPSAweGZmZmZmZmZmOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQljcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDI0KSBeICpidWYrKykgJiAweEZGXTsKKworCXJldHVybiBjcmM7IAorfSAKKworCitVSU5UMzIgUGxhY2VJbWFnZShjaGFyKiBmaWxlbmFtZSwgVUlOVDMyIHBvcywgVUlOVDgqIHBGaXJtd2FyZSwgVUlOVDMyIGxpbWl0KQoreworCVVJTlQzMiBzaXplLCByZWFkOworCUZJTEUqIHBGaWxlOworCVVJTlQzMiBhbGlnbjsKKwlVSU5UMzIgZmxhZ3M7CisKKwkvLyBtYWdpYyBmaWxlIGhlYWRlciBmb3IgY29tcHJlc3NlZCBmaWxlcworCXN0YXRpYyBjb25zdCBVSU5UOCBtYWdpY1s4XSA9IHsgMHgwMCwweGU5LDB4NTUsMHg0MywweDRjLDB4ZmYsMHgwMSwweDFhIH07CisJVUlOVDggdWNsX2hlYWRlclsyNl07CisKKwlwRmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsgLy8gb3BlbiB0aGUgY3VycmVudCBpbWFnZQorCWlmIChwRmlsZSA9PSBOVUxMKQorCXsKKwkJcHJpbnRmKCJJbWFnZSBmaWxlICVzIG5vdCBmb3VuZCFcbiIsIGZpbGVuYW1lKTsKKwkJZXhpdCg1KTsKKwl9CisKKwlmc2VlayhwRmlsZSwgMCwgU0VFS19FTkQpOworCXNpemUgPSBmdGVsbChwRmlsZSk7CisJZnNlZWsocEZpbGUsIDAsIFNFRUtfU0VUKTsKKworCS8vIGRldGVybWluZSBpZiBjb21wcmVzc2VkCisJZmxhZ3MgPSAweDAwMDAwMDAwOyAvLyBkZWZhdWx0OiBmbGFncyBmb3IgdW5jb21wcmVzc2VkCisJZnJlYWQodWNsX2hlYWRlciwgMSwgc2l6ZW9mKHVjbF9oZWFkZXIpLCBwRmlsZSk7CisJaWYgKG1lbWNtcChtYWdpYywgdWNsX2hlYWRlciwgc2l6ZW9mKG1hZ2ljKSkgPT0gMCkKKwl7CisJCWlmICh1Y2xfaGVhZGVyWzEyXSAhPSAweDJFKSAvLyBjaGVjayBhbGdvcml0aG0KKwkJeworCQkJcHJpbnRmKCJVQ0wgY29tcHJlc3NlZCBmaWxlcyBtdXN0IHVzZSBhbGdvcml0aG0gMmUsIG5vdCAlZFxuIiwgdWNsX2hlYWRlclsxMl0pOworCQkJcHJpbnRmKCJHZW5lcmF0ZSB3aXRoOiB1Y2xwYWNrIC0tYmVzdCAtLTJlIHJvY2tib3guYmluICVzXG4iLCBmaWxlbmFtZSk7CisJCQlleGl0KDYpOworCQl9CisJCQorCQlzaXplID0gUmVhZDMyKHVjbF9oZWFkZXIgKyAyMik7IC8vIGNvbXByZXNzZWQgc2l6ZQorCQlpZiAoUmVhZDMyKHVjbF9oZWFkZXIgKyAxOCkgPiBzaXplKSAvLyBjb21wYXJlIHdpdGggdW5jb21wcmVzc2VkIHNpemUKKwkJewkvLyBub3JtYWwgY2FzZQorCQkJZmxhZ3MgPSAweDAwMDAwMDAxOyAvLyBmbGFncyBmb3IgVUNMIGNvbXByZXNzZWQKKwkJfQorCX0KKwllbHNlCisJeworCQlmc2VlayhwRmlsZSwgMCwgU0VFS19TRVQpOyAvLyBnbyBiYWNrCisJfQorCisJaWYgKHBvcyArIDE2ICsgc2l6ZSA+IGxpbWl0KSAvLyBlbm91Z2ggc3BhY2UgZm9yIGFsbCB0aGF0PworCXsKKwkJcHJpbnRmKCJFeGNlZWRpbmcgbWF4aW11bSBpbWFnZSBzaXplICVkXG4iLCBsaW1pdCk7CisJCWV4aXQoNyk7CisJfQorCQorCS8vIHdyaXRlIGhlYWRlcgorCWFsaWduID0gKHBvcyArIDE2ICsgc2l6ZSArIFNFQ1RPUlNJWkUtMSkgJiB+KFNFQ1RPUlNJWkUtMSk7IC8vIHJvdW5kIHVwIHRvIG5leHQgZmxhc2ggc2VjdG9yCisJV3JpdGUzMihwRmlybXdhcmUgKyBwb3MsIFJPQ0tCT1hfREVTVCk7IC8vIGxvYWQgYWRkcmVzcworCVdyaXRlMzIocEZpcm13YXJlICsgcG9zICsgNCwgYWxpZ24gLSAocG9zICsgMTYpKTsgLy8gaW1hZ2Ugc2l6ZQorCVdyaXRlMzIocEZpcm13YXJlICsgcG9zICsgOCwgUk9DS0JPWF9FWEVDKTsgLy8gZXhlY3V0aW9uIGFkZHJlc3MKKwlXcml0ZTMyKHBGaXJtd2FyZSArIHBvcyArIDEyLCBmbGFncyk7IC8vIGNvbXByZXNzZWQgb3Igbm90CisJcG9zICs9IDE2OworCisJLy8gbG9hZCBpbWFnZQorCXJlYWQgPSBmcmVhZChwRmlybXdhcmUgKyBwb3MsIDEsIHNpemUsIHBGaWxlKTsKKwlpZiAocmVhZCAhPSBzaXplKQorCXsKKwkJcHJpbnRmKCJSZWFkIGVycm9yLCBleHBlY3RpbmcgJWQgYnl0ZXMsIGdvdCBvbmx5ICVkXG4iLCBzaXplLCByZWFkKTsKKwkJZXhpdCg4KTsKKwl9CisJZmNsb3NlIChwRmlsZSk7CisKKwlwb3MgKz0gc2l6ZTsKKworCXJldHVybiBwb3M7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKwlzdGF0aWMgVUlOVDggYUZpcm13YXJlWzUxMioxMDI0XTsgLy8gbWF4aW11bSB3aXRoIGV4Y2hhbmdlZCBjaGlwCisJRklMRSogcEZpbGU7CisJVUlOVDMyIHNpemU7IC8vIHNpemUgb2YgbG9hZGVkIGl0ZW0KKwlVSU5UMzIgcG9zOyAvLyBjdXJyZW50IHBvc2l0aW9uIGluIGZpcm13YXJlCisJVUlOVDMyIGNyYzMyOyAvLyBjaGVja3N1bSBvZiAicGF5bG9hZCIKKwlCT09MIGhhc0Jvb3RSb207IC8vIGZsYWcgaWYgcmVndWxhciBib290IFJPTSBvciBkaXJlY3RseSBzdGFydHMgZnJvbSBmbGFzaAorCVVJTlQzMiB0ZW1wbGF0ZV9GOCwgdGVtcGxhdGVfRkM7IC8vIG15IHBsYXRmb3JtIElELCBtYXNrIGFuZCB2ZXJzaW9uCisKKwlpbnQgaTsKKwkKKwlpZiAoYXJnYyA8PSA0KQorCXsKKwkJcHJpbnRmKCJVc2FnZTpcbiIpOworCQlwcmludGYoIm1ha2VfZmlybXdhcmUgPG91dHB1dD4gPHRlbXBsYXRlLmJpbj4gPGJvb3Rsb2FkZXIuYWp6PiA8aW1hZ2UxLnVjbD4ge2ltYWdlMi51Y2x9XG4iKTsKKwkJcHJpbnRmKCI8dGVtcGxhdGUuYmluPiBpcyB0aGUgb3JpZ2luYWwgZmlybXdhcmUgZnJvbSB5b3VyIGJveFxuIik7CisJCXByaW50ZigiPGJvb3Rsb2FkZXIuYWp6PiBpcyB0aGUgc2NyYW1ibGVkIGJvb3Rsb2FkZXJcbiIpOworCQlwcmludGYoIjxpbWFnZTEudWNsPiBpcyB0aGUgZmlyc3QgaW1hZ2UsIGNvbXByZXNzZWQgKHJlY29tbWVuZGVkKSBvciB1bmNvbXByZXNzZWRcbiIpOworCQlwcmludGYoIjxpbWFnZTEudWNsPiBpcyB0aGUgc2Vjb25kIGltYWdlLCBjb21wcmVzc2VkIChyZWNvbW1lbmRlZCkgb3IgdW5jb21wcmVzc2VkXG4iKTsKKwkJcHJpbnRmKCJNb3JlIGltYWdlcyBtYXkgZm9sbG93LCBidXQga2VlcCB0aGUgZmxhc2ggc2l6ZSBpbiBtaW5kIVxuIik7CisJCXByaW50ZigiQ29tcHJlc3Npb24gbXVzdCBiZSBVQ0wsIGFsZ29yaXRobSAyZS5cbiIpOworCQlwcmludGYoIkdlbmVyYXRlZCB3aXRoOiB1Y2xwYWNrIC0tYmVzdCAtLTJlIHJvY2tib3guYmluIGltYWdlTi51Y2xcbiIpOworCQlleGl0KDApOworCX0KKwkKKwltZW1zZXQoYUZpcm13YXJlLCAweEZGLCBzaXplb2YoYUZpcm13YXJlKSk7CisJCisJLyoqKioqKiogcHJvY2VzcyB0ZW1wbGF0ZSAqKioqKioqLworCQorCXBGaWxlID0gZm9wZW4oYXJndlsyXSwgInJiIik7IC8vIG9wZW4gdGhlIHRlbXBsYXRlCisJaWYgKHBGaWxlID09IE5VTEwpCisJeworCQlwcmludGYoIlRlbXBsYXRlIGZpbGUgJXMgbm90IGZvdW5kIVxuIiwgYXJndlsyXSk7CisJCWV4aXQoMSk7CisJfQorCXNpemUgPSBmcmVhZChhRmlybXdhcmUsIDEsIDI1NiwgcEZpbGUpOyAvLyBuZWVkIG9ubHkgdGhlIGhlYWRlcgorCWZjbG9zZShwRmlsZSk7CisJaWYgKHNpemUgPCAyNTYpIC8vIG5lZWQgYXQgbGVhc3QgdGhlIGZpcm13YXJlIGhlYWRlcgorCXsKKwkJcHJpbnRmKCJUZW1wbGF0ZSBmaWxlICVzIHRvbyBzbWFsbCwgbmVlZCBhdCBsZWFzdCB0aGUgaGVhZGVyIVxuIiwgYXJndlsyXSk7CisJCWV4aXQoMik7CisJfQorCisJaWYgKHN0cm5jbXAoYUZpcm13YXJlLCAiQVJDSCIsIDQpID09IDApCisJeworCQloYXNCb290Um9tID0gVFJVRTsKKwkJcG9zID0gMjU2OyAvLyBwbGFjZSBib290bG9hZGVyIGFmdGVyIHRoaXMgImJvb3QgYmxvY2siCisJfQorCWVsc2UgaWYgKFJlYWQzMihhRmlybXdhcmUpID09IDB4MDIwMCkKKwl7CisJCWhhc0Jvb3RSb20gPSBGQUxTRTsKKwkJcG9zID0gMDsgLy8gZGlyZWN0bHkgc3RhcnQgd2l0aCB0aGUgYm9vdGxvYWRlcgorCQl0ZW1wbGF0ZV9GOCA9IFJlYWQzMihhRmlybXdhcmUgKyAweEY4KTsgLy8gbXkgcGxhdGZvcm0gSUQgYW5kIGZ1dHVyZSBpbmZvCisJCXRlbXBsYXRlX0ZDID0gUmVhZDMyKGFGaXJtd2FyZSArIDB4RkMpOyAvLyB1c2UgbWFzayt2ZXJzaW9uIGZyb20gdGVtcGxhdGUKKwl9CisJZWxzZQorCXsKKwkJcHJpbnRmKCJUZW1wbGF0ZSBmaWxlICVzIGludmFsaWQhXG4iLCBhcmd2WzJdKTsKKwkJZXhpdCgzKTsKKwl9CisJCisJLyoqKioqKiogcHJvY2VzcyBib290bG9hZGVyICoqKioqKiovCisKKwlwRmlsZSA9IGZvcGVuKGFyZ3ZbM10sICJyYiIpOyAvLyBvcGVuIHRoZSBib290bG9hZGVyCisJaWYgKHBGaWxlID09IE5VTEwpCisJeworCQlwcmludGYoIkJvb3Rsb2FkZXIgZmlsZSAlcyBub3QgZm91bmQhXG4iLCBhcmd2WzNdKTsKKwkJZXhpdCg0KTsKKwl9CisJaWYgKGhhc0Jvb3RSb20gJiYgZnNlZWsocEZpbGUsIDYsIFNFRUtfU0VUKSkgLy8gc2tpcCB0aGUgYWp6IGhlYWRlcgorCXsKKwkJcHJpbnRmKCJCb290bG9hZGVyIGZpbGUgJXMgdG9vIHNob3J0IVxuIiwgYXJndlszXSk7CisJCWV4aXQoNSk7CisJfQorCisJLy8gcGxhY2UgYm9vdGxvYWRlciBhZnRlciBoZWFkZXIKKwlzaXplID0gZnJlYWQoYUZpcm13YXJlICsgcG9zLCAxLCBzaXplb2YoYUZpcm13YXJlKSAtIHBvcywgcEZpbGUpOworCWZjbG9zZShwRmlsZSk7CisKKwlpZiAoaGFzQm9vdFJvbSkKKwl7CisJCVdyaXRlMzIoYUZpcm13YXJlICsgNCwgQk9PVExPQURfREVTVCk7IC8vIGJvb3QgY29kZSBkZXN0aW5hdGlvbiBhZGRyZXNzCisJCQorCQlmb3IgKGk9MHgwODsgaTw9MHgyODsgaSs9OCkKKwkJeworCQkJV3JpdGUzMihhRmlybXdhcmUgKyBpLCBCT09UTE9BRF9TQ1IpOyAvLyBib290IGNvZGUgc291cmNlIGFkZHJlc3MKKwkJCVdyaXRlMzIoYUZpcm13YXJlICsgaSArIDQsIHNpemUpOyAvLyBib290IGNvZGUgc2l6ZQorCQl9CisJfQorCWVsc2UKKwl7CisJCVdyaXRlMzIoYUZpcm13YXJlICsgMHhGOCwgdGVtcGxhdGVfRjgpOyAvLyB2YWx1ZXMgZnJvbSB0ZW1wbGF0ZQorCQlXcml0ZTMyKGFGaXJtd2FyZSArIDB4RkMsIHRlbXBsYXRlX0ZDKTsgLy8gbWFzayBhbmQgdmVyc2lvbgorCX0KKworCXNpemUgPSAoc2l6ZSArIDMpICYgfjM7IC8vIG1ha2Ugc2h1cmUgaXQncyAzMiBiaXQgYWxpZ25lZAorCXBvcyArPSBzaXplOyAvLyBwcmVwYXJlIHBvc2l0aW9uIGZvciBmaXJzdCBpbWFnZQorCisJLyoqKioqKiogcHJvY2VzcyBpbWFnZXMgKioqKioqKi8KKwlmb3IgKGkgPSA0OyBpIDwgYXJnYzsgaSsrKQorCXsKKwkJcG9zID0gUGxhY2VJbWFnZShhcmd2W2ldLCBwb3MsIGFGaXJtd2FyZSwgc2l6ZW9mKGFGaXJtd2FyZSkpOworCisJCWlmIChpIDwgYXJnYy0xKQorCQl7CS8vIG5vdCB0aGUgbGFzdDogcm91bmQgdXAgdG8gbmV4dCBmbGFzaCBzZWN0b3IKKwkJCXBvcyA9IChwb3MgKyBTRUNUT1JTSVpFLTEpICYgfihTRUNUT1JTSVpFLTEpOworCQl9CisJfQorCQorCisJLyoqKioqKiogYXBwZW5kIENSQzMyIGNoZWNrc3VtICoqKioqKiovCisJY3JjMzIgPSBDYWxjQ1JDMzIoYUZpcm13YXJlLCBwb3MpOworCVdyaXRlMzIoYUZpcm13YXJlICsgcG9zLCBjcmMzMik7CisJcG9zICs9IHNpemVvZihjcmMzMik7IC8vIDQgYnl0ZXMKKwkKKwkKKwkvKioqKioqKiBzYXZlIHJlc3VsdCB0byBvdXRwdXQgZmlsZSAqKioqKioqLworCisJcEZpbGUgPSBmb3Blbihhcmd2WzFdLCAid2IiKTsgLy8gb3BlbiB0aGUgb3V0cHV0IGZpbGUKKwlpZiAocEZpbGUgPT0gTlVMTCkKKwl7CisJCXByaW50ZigiT3V0cHV0IGZpbGUgJXMgY2Fubm90IGJlIGNyZWF0ZWQhXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCg5KTsKKwl9CisJc2l6ZSA9IGZ3cml0ZShhRmlybXdhcmUsIDEsIHBvcywgcEZpbGUpOworCWZjbG9zZShwRmlsZSk7CisJCisJaWYgKHNpemUgIT0gcG9zKQorCXsKKwkJcHJpbnRmKCJFcnJvciB3cml0aW5nICVkIGJ5dGVzIHRvIG91dHB1dCBmaWxlICVzIVxuIiwgcG9zLCBhcmd2WzFdKTsKKwkJZXhpdCgxMCk7CisJfQorCisJcHJpbnRmKCJGaXJtd2FyZSBmaWxlIGdlbmVyYXRlZCB3aXRoICVkIGJ5dGVzLlxuIiwgcG9zKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmxhc2gvbWFrZV9maXJtd2FyZS9tYWtlX2Zpcm13YXJlLmRzcCBiL2ZsYXNoL21ha2VfZmlybXdhcmUvbWFrZV9maXJtd2FyZS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhNmY1MwotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL21ha2VfZmlybXdhcmUvbWFrZV9maXJtd2FyZS5kc3AKQEAgLTAsMCArMSw5NiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtYWtlX2Zpcm13YXJlIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCitDRkc9bWFrZV9maXJtd2FyZSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgIm1ha2VfZmlybXdhcmUubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJtYWtlX2Zpcm13YXJlLm1hayIgQ0ZHPSJtYWtlX2Zpcm13YXJlIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAibWFrZV9maXJtd2FyZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAibWFrZV9maXJtd2FyZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIm1ha2VfZmlybXdhcmUgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1l1InN0ZGFmeC5oIiAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCJzdGRhZnguaCIgL0ZEIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwNyAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA3IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJtYWtlX2Zpcm13YXJlIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWXUic3RkYWZ4LmgiIC9GRCAvR1ogL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0ZSIC9ZWCJzdGRhZnguaCIgL0ZEIC9HWiAvYworIyBBREQgQkFTRSBSU0MgL2wgMHg0MDcgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwNyAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAibWFrZV9maXJtd2FyZSAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgIm1ha2VfZmlybXdhcmUgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxtYWtlX2Zpcm13YXJlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9mbGFzaC9taW5pbW9uL01ha2VmaWxlIGIvZmxhc2gvbWluaW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2FlMTNlCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvbWluaW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDUzIEBACisjICAgICAgICAgICAgIF9fX19fX19fX18gICAgICAgICAgICAgICBfXyAgIF9fXy4KKyMgICBPcGVuICAgICAgXF9fX19fXyAgIFwgX19fXyAgIF9fX18gfCAgfCBfXF8gfF9fICAgX19fX19fXyAgX19fCisjICAgU291cmNlICAgICB8ICAgICAgIF8vLyAgXyBcXy8gX19fXHwgIHwvIC98IF9fIFwgLyAgXyBcICBcLyAgLworIyAgIEp1a2Vib3ggICAgfCAgICB8ICAgKCAgPF8+ICkgIFxfX198ICAgIDwgfCBcX1wgKCAgPF8+ID4gPCAgPAorIyAgIEZpcm13YXJlICAgfF9fX198XyAgL1xfX19fLyBcX19fICA+X198XyBcfF9fXyAgL1xfX19fL19fL1xfIFwKKyMgICAgICAgICAgICAgICAgICAgICBcLyAgICAgICAgICAgIFwvICAgICBcLyAgICBcLyAgICAgICAgICAgIFwvCisjICRJZCQKKyMKKworQ0MgICAgPSBzaC1lbGYtZ2NjIAorTEQgICAgPSBzaC1lbGYtbGQKK0FSICAgID0gc2gtZWxmLWFyCitBUyAgICA9IHNoLWVsZi1hcworT0MgICAgPSBzaC1lbGYtb2JqY29weQorCitGSVJNV0FSRSA6PSAuLi8uLi9maXJtd2FyZQorVE9PTFNESVI9Li4vLi4vdG9vbHMKKworVEFSR0VUID0gbWluaW1vbgorTERTIDo9ICQoVEFSR0VUKS5sZHMKKworSU5DTFVERVM9IC1JJChGSVJNV0FSRSkvZXhwb3J0IC1JLiAtSSQoT0JKRElSKQorT0JKRElSIDo9IC4KKworQ0ZMQUdTID0gLWZwaWMgLU8gLVcgLVdhbGwgLW0xIC1ub3N0ZGxpYiAtZmZyZWVzdGFuZGluZyAtV3N0cmljdC1wcm90b3R5cGVzIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mc2NoZWR1bGUtaW5zbnMgJChJTkNMVURFUykgJChERUZJTkVTKQorQUZMQUdTICs9IC1zbWFsbCAtcmVsYXgKKworCitpZmRlZiBERUJVRworICAgIERFRklORVMgOj0gLURERUJVRworICAgIENGTEFHUyArPSAtZworZW5kaWYKKworU1JDIDo9ICQod2lsZGNhcmQgKi5jKQorCitPQkpTIDo9ICQoU1JDOiUuYz0kKE9CSkRJUikvJS5vKQorCitMSU5LRklMRSA9ICQoT0JKRElSKS8kKFRBUkdFVCkubGRzCisKKworJChPQkpESVIpLyQoVEFSR0VUKS5iaW4gOiAkKE9CSkRJUikvJChUQVJHRVQpLmVsZgorCSQoT0MpIC1PIGJpbmFyeSAkKE9CSkRJUikvJChUQVJHRVQpLmVsZiAkKE9CSkRJUikvJChUQVJHRVQpLmJpbgorCSQoVE9PTFNESVIpL3NoMmQgJChPQkpESVIpLyQoVEFSR0VUKS5iaW4gLW8gMDkwMDAwMCA+ICQoT0JKRElSKS8kKFRBUkdFVCkuYXNtCisKKyQoT0JKRElSKS8kKFRBUkdFVCkuZWxmIDogJChPQkpTKSAKKwkkKENDKSAtT3MgLW5vc3RkbGliIC1vICQoT0JKRElSKS8kKFRBUkdFVCkuZWxmIC1MJChPQkpESVIpIC1UJChMSU5LRklMRSkgLVdsLC1NYXAsJChPQkpESVIpLyQoVEFSR0VUKS5tYXAKKworCitjbGVhbjoKKwktcm0gLWYgJChPQkpTKSAkKE9CSkRJUikvJChUQVJHRVQpLmFzbSBcCisJJChPQkpESVIpLyQoVEFSR0VUKS5iaW4gXAorCSQoT0JKRElSKS8kKFRBUkdFVCkuZWxmIFwKKwkkKE9CSkRJUikvJChUQVJHRVQpLm1hcApkaWZmIC0tZ2l0IGEvZmxhc2gvbWluaW1vbi9SRUFETUUgYi9mbGFzaC9taW5pbW9uL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODBlZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvbWluaW1vbi9SRUFETUUKQEAgLTAsMCArMSw2IEBACisoYykgMjAwMyBieSBK9nJnIEhvaGVuc29obgorCitNaW5pTW9uIGlzIHRoZSB0aW55IGJ1dCBwb3dlcmZ1bC1lbm91Z2ggcGllY2Ugb2YgY29kZSB0aGF0IGNhbiBiZSBsb2FkZWQKK3dpdGggdGhlIFVBUlQgYm9vdCBtb2QuIAorSXQgYWxsb3dzIHRvIHJlYWQgYW5kIHdyaXRlIG1lbW9yeSwgZmxhc2ggcHJvZ3JhbSwgZXhlY3V0ZSBjb2RlLgorVGhpcyBpcyBzdWl0YWJsZSB0byByZWZsYXNoIHRoZSBib3gsIGxvYWQgUm9ja2JveCBvciB0aGUgZ2RiIHN0dWIsIGV0Yy4KZGlmZiAtLWdpdCBhL2ZsYXNoL21pbmltb24vbWluaW1vbi5jIGIvZmxhc2gvbWluaW1vbi9taW5pbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ODFmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL21pbmltb24vbWluaW1vbi5jCkBAIC0wLDAgKzEsMTU2IEBACisvLyBtaW5pbWFsaXN0aWMgbW9uaXRvcgorLy8gdG8gYmUgbG9hZGVkIHdpdGggdGhlIFVBUlQgYm9vdCBmZWF0dXJlCisvLyBjYXBhYmxlIG9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgYnl0ZXMsIGNvbW1hbmRlZCBieSBVQVJUCisKKyNpbmNsdWRlICJzaDcwMzQuaCIKKyNpbmNsdWRlICJtaW5pbW9uLmgiCisKKy8vIHNjYWxhciB0eXBlcwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBVSU5UMzI7CisKK3R5cGVkZWYgdm9pZCgqdHBGdW5jKSh2b2lkKTsgLy8gdHlwZSBmb3IgZXhlYwordHlwZWRlZiBpbnQoKnRwTWFpbikodm9pZCk7IC8vIHR5cGUgZm9yIHN0YXJ0IHZlY3RvciB0byBtYWluKCkKKworCisvLyBwcm90b3R5cGVzCitpbnQgbWFpbih2b2lkKTsKKworLy8gb3VyIGJpbmFyeSBoYXMgdG8gc3RhcnQgd2l0aCBhIHZlY3RvciB0byB0aGUgZW50cnkgcG9pbnQKK3RwTWFpbiBzdGFydF92ZWN0b3JbXSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5zdGFydHZlY3RvciIpKSkgPSB7bWFpbn07CisKKworVUlOVDggdWFydF9yZWFkKHZvaWQpCit7CisJVUlOVDggYnl0ZTsKKwl3aGlsZSAoIShTU1IxICYgU0NJX1JEUkYpKTsgLy8gd2FpdCBmb3IgY2hhciB0byBiZSBhdmFpbGFibGUKKwlieXRlID0gUkRSMTsKKwlTU1IxICY9IH5TQ0lfUkRSRjsKKwlyZXR1cm4gYnl0ZTsKK30KKworCit2b2lkIHVhcnRfd3JpdGUoVUlOVDggYnl0ZSkKK3sKKwl3aGlsZSAoIShTU1IxICYgU0NJX1REUkUpKTsgLy8gd2FpdCBmb3IgdHJhbnNtaXQgYnVmZmVyIGVtcHR5CisJVERSMSA9IGJ5dGU7CisJU1NSMSAmPSB+U0NJX1REUkU7Cit9CisKKworaW50IG1haW4odm9pZCkKK3sKKwlVSU5UOCBjbWQ7CisJVUlOVDMyIGFkZHI7CisJVUlOVDMyIHNpemU7CisJVUlOVDMyIGNvbnRlbnQ7CisJdm9sYXRpbGUgVUlOVDgqIHBhZGRyID0gMDsKKwl2b2xhdGlsZSBVSU5UOCogcGZsYXNoOyAvLyBmbGFzaCBiYXNlIGFkZHJlc3MKKworCXdoaWxlICgxKQorCXsKKwkJY21kID0gdWFydF9yZWFkKCk7CisJCXN3aXRjaCAoY21kKQorCQl7CisJCWNhc2UgQkFVRFJBVEU6CisJCQljb250ZW50ID0gdWFydF9yZWFkKCk7CisJCQl1YXJ0X3dyaXRlKGNtZCk7IC8vIGFja25vd2xlZGdlIGJ5IHJldHVybmluZyB0aGUgY29tbWFuZCB2YWx1ZQorCQkJd2hpbGUgKCEoU1NSMSAmIFNDSV9URU5EKSk7IC8vIHdhaXQgZm9yIGVtcHR5IHNoaWZ0IHJlZ2lzdGVyLCBiZWZvcmUgY2hhbmdpbmcgYmF1ZHJhdGUKKwkJCUJSUjEgPSBjb250ZW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBBRERSRVNTOgorCQkJYWRkciA9ICh1YXJ0X3JlYWQoKSA8PCAyNCkgfCAodWFydF9yZWFkKCkgPDwgMTYpIHwgKHVhcnRfcmVhZCgpIDw8IDgpIHwgdWFydF9yZWFkKCk7CisJCQlwYWRkciA9IChVSU5UOCopYWRkcjsKKwkJCXBmbGFzaCA9IChVSU5UOCopKGFkZHIgJiAweEZGRjgwMDAwKTsgLy8gcm91bmQgZG93biB0byA1MTJrIGFsaWduCisJCQl1YXJ0X3dyaXRlKGNtZCk7IC8vIGFja25vd2xlZGdlIGJ5IHJldHVybmluZyB0aGUgY29tbWFuZCB2YWx1ZQorCQkJYnJlYWs7CisKKwkJY2FzZSBCWVRFX1JFQUQ6CisJCQljb250ZW50ID0gKnBhZGRyKys7CisJCQl1YXJ0X3dyaXRlKGNvbnRlbnQpOyAvLyB0aGUgY29udGVudCBpcyB0aGUgYWNrCQorCQkJYnJlYWs7CisKKwkJY2FzZSBCWVRFX1dSSVRFOgorCQkJY29udGVudCA9IHVhcnRfcmVhZCgpOworCQkJKnBhZGRyKysgPSBjb250ZW50OwkJCQkJCQorCQkJdWFydF93cml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCWJyZWFrOworCisJCWNhc2UgQllURV9SRUFEMTY6CisJCQlzaXplID0gMTY7CisJCQl3aGlsZSAoc2l6ZS0tKQorCQkJeworCQkJCWNvbnRlbnQgPSAqcGFkZHIrKzsKKwkJCQl1YXJ0X3dyaXRlKGNvbnRlbnQpOyAvLyB0aGUgY29udGVudCBpcyB0aGUgYWNrCQkKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQllURV9XUklURTE2OgorCQkJc2l6ZSA9IDE2OworCQkJd2hpbGUgKHNpemUtLSkKKwkJCXsKKwkJCQljb250ZW50ID0gdWFydF9yZWFkKCk7CisJCQkJKnBhZGRyKysgPSBjb250ZW50OwkJCQkJCQorCQkJfQorCQkJdWFydF93cml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCWJyZWFrOworCisJCWNhc2UgQllURV9GTEFTSDoKKwkJCWNvbnRlbnQgPSB1YXJ0X3JlYWQoKTsKKwkJCXBmbGFzaFsweDU1NTVdID0gMHhBQTsgLy8gc2V0IGZsYXNoIHRvIGNvbW1hbmQgbW9kZQorCQkJcGZsYXNoWzB4MkFBQV0gPSAweDU1OworCQkJcGZsYXNoWzB4NTU1NV0gPSAweEEwOyAvLyBieXRlIHByb2dyYW0gY29tbWFuZAorCQkJKnBhZGRyKysgPSBjb250ZW50OwkJCQkJCQorCQkJdWFydF93cml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCWJyZWFrOworCisJCWNhc2UgQllURV9GTEFTSDE2OgorCQkJc2l6ZSA9IDE2OworCQkJd2hpbGUgKHNpemUtLSkKKwkJCXsKKwkJCQljb250ZW50ID0gdWFydF9yZWFkKCk7CisJCQkJcGZsYXNoWzB4NTU1NV0gPSAweEFBOyAvLyBzZXQgZmxhc2ggdG8gY29tbWFuZCBtb2RlCisJCQkJcGZsYXNoWzB4MkFBQV0gPSAweDU1OworCQkJCXBmbGFzaFsweDU1NTVdID0gMHhBMDsgLy8gYnl0ZSBwcm9ncmFtIGNvbW1hbmQKKwkJCQkqcGFkZHIrKyA9IGNvbnRlbnQ7CQkJCQkJCisJCQl9CisJCQl1YXJ0X3dyaXRlKGNtZCk7IC8vIGFja25vd2xlZGdlIGJ5IHJldHVybmluZyB0aGUgY29tbWFuZCB2YWx1ZQorCQkJYnJlYWs7CisKKwkJY2FzZSBIQUxGV09SRF9SRUFEOgorCQkJY29udGVudCA9ICooVUlOVDE2KilwYWRkcjsKKwkJCXBhZGRyICs9IDI7CisJCQl1YXJ0X3dyaXRlKGNvbnRlbnQgPj4gOCk7IC8vIGhpZ2hieXRlCisJCQl1YXJ0X3dyaXRlKGNvbnRlbnQgJiAweEZGKTsgLy8gbG93Ynl0ZQorCQkJYnJlYWs7CisJCQorCQljYXNlIEhBTEZXT1JEX1dSSVRFOgorCQkJY29udGVudCA9IHVhcnRfcmVhZCgpIDw8IDggfCB1YXJ0X3JlYWQoKTsKKwkJCSooVUlOVDE2KilwYWRkciA9IGNvbnRlbnQ7CisJCQlwYWRkciArPSAyOworCQkJdWFydF93cml0ZShjbWQpOyAvLyBhY2tub3dsZWRnZSBieSByZXR1cm5pbmcgdGhlIGNvbW1hbmQgdmFsdWUKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBFWEVDVVRFOgorCQkJeworCQkJCXRwRnVuYyBwRnVuYyA9ICh0cEZ1bmMpcGFkZHI7CisJCQkJcEZ1bmMoKTsKKwkJCQl1YXJ0X3dyaXRlKGNtZCk7IC8vIGFja25vd2xlZGdlIGJ5IHJldHVybmluZyB0aGUgY29tbWFuZCB2YWx1ZQorCQkJfQorCQkJYnJlYWs7CisKKworCQlkZWZhdWx0OgorCQkJeworCQkJCXZvbGF0aWxlIFVJTlQxNiogcFBvcnRCID0gKFVJTlQxNiopMHgwNUZGRkZDMjsKKwkJCQkqcFBvcnRCIHw9IDEgPDwgNjsgLy8gYml0IDYgaXMgcmVkIExFRCBvbgorCQkJCXVhcnRfd3JpdGUofmNtZCk7IC8vIGVycm9yIGFja25vd2xlZGdlCisJCQl9CisKKwkJfSAvLyBjYXNlCisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mbGFzaC9taW5pbW9uL21pbmltb24uaCBiL2ZsYXNoL21pbmltb24vbWluaW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTk4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC9taW5pbW9uL21pbmltb24uaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9NSU5JTU9OX0gKKyNkZWZpbmUgX01JTklNT05fSAorCisKKy8vIENvbW1hbmRzCisvLyBhbGwgbXVsdGlieXRlIHZhbHVlcyAoYWRkcmVzcywgaGFsZndvcmRzKSBhcmUgcGFzc2VkIGFzIGJpZyBlbmRpYW4gCisvLyAgKG1vc3Qgc2lnbmlmaWNhbnQgb2YgdGhlIGJ5dGVzIGZpcnN0KQorCisvLyBzZXQgdGhlIGFkZHJlc3MgKGFsbCByZWFkL3dyaXRlIGNvbW1hbmRzIHdpbGwgYXV0by1pbmNyZW1lbnQgaXQpCisjZGVmaW5lIEJBVURSQVRFICAgICAgIDB4MDAgLy8gZm9sbG93ZWQgYnkgQlJSIHZhbHVlOyByZXNwb25zZTogY29tbWFuZCBieXRlCisjZGVmaW5lIEFERFJFU1MgICAgICAgIDB4MDEgLy8gZm9sbG93ZWQgYnkgNCBieXRlcyBhZGRyZXNzOyByZXNwb25zZTogY29tbWFuZCBieXRlCisjZGVmaW5lIEJZVEVfUkVBRCAgICAgIDB4MDIgLy8gcmVzcG9uc2U6IDEgYnl0ZSBjb250ZW50CisjZGVmaW5lIEJZVEVfV1JJVEUgICAgIDB4MDMgLy8gZm9sbG93ZWQgYnkgMSBieXRlIGNvbnRlbnQ7IHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgQllURV9SRUFEMTYgICAgMHgwNCAvLyByZXNwb25zZTogMTYgYnl0ZXMgY29udGVudAorI2RlZmluZSBCWVRFX1dSSVRFMTYgICAweDA1IC8vIGZvbGxvd2VkIGJ5IDE2IGJ5dGVzOyByZXNwb25zZTogY29tbWFuZCBieXRlCisjZGVmaW5lIEJZVEVfRkxBU0ggICAgIDB4MDYgLy8gZm9sbG93ZWQgYnkgMSBieXRlIGNvbnRlbnQ7IHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgQllURV9GTEFTSDE2ICAgMHgwNyAvLyBmb2xsb3dlZCBieSAxNiBieXRlczsgcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZQorI2RlZmluZSBIQUxGV09SRF9SRUFEICAweDA4IC8vIHJlc3BvbnNlOiAyIGJ5dGUgY29udGVudAorI2RlZmluZSBIQUxGV09SRF9XUklURSAweDA5IC8vIGZvbGxvd2VkIGJ5IDIgYnl0ZSBjb250ZW50OyByZXNwb25zZTogY29tbWFuZCBieXRlCisjZGVmaW5lIEVYRUNVVEUgICAgICAgIDB4MEEgLy8gcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZSBpZiBjYWxsIHJldHVybnMKKyNkZWZpbmUgVkVSU0lPTiAgICAgICAgMHgwQiAvLyByZXNwb25zZTogdmVyc2lvbgorCisKKyNlbmRpZiAvLyBfTUlOSU1PTl9ICmRpZmYgLS1naXQgYS9mbGFzaC9taW5pbW9uL21pbmltb24ubGRzIGIvZmxhc2gvbWluaW1vbi9taW5pbW9uLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRiZGMzCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvbWluaW1vbi9taW5pbW9uLmxkcwpAQCAtMCwwICsxLDYwIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLXNoKQorSU5QVVQobWluaW1vbi5vKQorCitNRU1PUlkKK3sKKwlEUkFNIDogT1JJR0lOID0gMHgwOTAwMDAwMCwgTEVOR1RIID0gMHgyMDAwMDAKK30KKworU0VDVElPTlMKK3sKKwkuc3RhcnR2ZWN0b3IgOgorCXsKKwkJKiguc3RhcnR2ZWN0b3IpICAgIAorCQkuID0gQUxJR04oMHg0KTsKKwl9ID4gRFJBTQorCisJLmdvdCA6CisJeworCSAgICooLmdvdCkKKwl9ID4gRFJBTQorCisJLmdvdC5wbHQgOgorCXsKKwkgICAqKC5nb3QucGx0KQorCX0gPiBEUkFNCisKKwkucmVsYS5nb3QgOgorCXsKKwkgICAqKC5yZWxhLmdvdCkKKwl9ID4gRFJBTQorCisJLnRleHQgOiAgICAKKwl7CSAKKwkJLiA9IEFMSUdOKDB4MjAwKTsKKwkJKiguZW50cnkpCisJCSooLnRleHQpCQorCQkuID0gQUxJR04oMHg0KTsKKwl9ID4gRFJBTQorCQorCS5kYXRhIDoKKwl7CisJCSooLmRhdGEpCisJfSA+IERSQU0KKworCS5yb2RhdGEgOgorCXsKKwkJKigucm9kYXRhKQorCQkuID0gQUxJR04oMHg0KTsKKwl9ID4gRFJBTQorCisJLmJzcyA6CisJeworCSAgICooLmJzcykKKwl9ID4gRFJBTQorCisJLnN0YWNrIDoKKwl7CisJICAgKiguc3RhY2spCisJfSA+IERSQU0KK30KZGlmZiAtLWdpdCBhL2ZsYXNoL3VhcnRfYm9vdC9SRUFETUUgYi9mbGFzaC91YXJ0X2Jvb3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZmEyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC91YXJ0X2Jvb3QvUkVBRE1FCkBAIC0wLDAgKzEsOCBAQAorKGMpIDIwMDMgYnkgSvZyZyBIb2hlbnNvaG4KKworVGhpcyBpcyB0aGUgY2xpZW50IHNpZGUgZm9yIE1pbmlNb24sIGEgY29tbWFuZCBsaW5lIHByb2dyYW0gdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBpdC4KK0l0IGNhbiBiZSB1c2VkIHRvIHJlZmxhc2ggYSBib3ggZnJvbSBncm91bmQgdXAsIGxvYWQgYSBwcm9ncmFtIGxpa2UgZ2RiIHN0dWIgb3IgUm9ja2JveCwgCithbmQgb3RoZXIgZGlhZ25vc3RpY3MuCisKK0N1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgZm9yIFdpbmRvd3MsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IFVBUlQgaW1wbGVtZW50YXRpb24KK2l0IHNob3VsZCB3b3JrIGZvciBvdGhlciBwbGF0Zm9ybXMgKExpbnV4KSBhcyB3ZWxsLgpkaWZmIC0tZ2l0IGEvZmxhc2gvdWFydF9ib290L2NsaWVudC5jIGIvZmxhc2gvdWFydF9ib290L2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGVkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC91YXJ0X2Jvb3QvY2xpZW50LmMKQEAgLTAsMCArMSw3MzggQEAKKy8vIGNsaWVudC5jcHAgOiBmdW5jdGlvbnMgZm9yIG1vbml0b3IgZG93bmxvYWQgYW5kIGNvbW11bmljYXRpb24uCisvLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzY2FsYXJfdHlwZXMuaCIgLy8gKFUpSU5UOC8xNi8zMgorI2luY2x1ZGUgIlVhcnQuaCIgLy8gcGxhdGZvcm0gYWJzdHJhY3Rpb24gZm9yIFVBUlQKKyNpbmNsdWRlICJtaW5pbW9uLmgiIC8vIHByb3RvY29sIG9mIG15IGxpdHRsZSBtb25pdG9yCisKKy8vIGRvIHRoZSBiYXVkcmF0ZSBjb25maWd1cmF0aW9uIGZvciB0aGUgUGxheWVyCitpbnQgQ29uZmlnRmlyc3RsZXZlbFBsYXllciAodFVhcnRIYW5kbGUgc2VyaWFsX2hhbmRsZSkKK3sKKwlVSU5UMzIgcmVzdWx0X25icjsKKworCWlmKCFVYXJ0Q29uZmlnKHNlcmlhbF9oYW5kbGUsIDQ4MDAsIGVNQVJLUEFSSVRZLCBlVFdPU1RPUEJJVFMsIDgpKQorCXsKKwkJVUlOVDMyIGR3RXJyID0gR0VUX0xBU1RfRVJSKCk7CisJCXByaW50ZigiRXJyb3IgJWQgc2V0dGluZyB1cCBDT00gcGFyYW1zIGZvciBiYXVkcmF0ZSBieXRlXG4iLCBkd0Vycik7CisJCWV4aXQoMSk7CisJfQorCisJLy8gdGhpcyB3aWxsIHJlYWQgYXMgMHgxOSB3aGVuIHZpZXdlZCB3aXRoIDIzMDAgYmF1ZCBsaWtlIHRoZSBwbGF5ZXIgZG9lcworCXJlc3VsdF9uYnIgPSBVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgKFVJTlQ4KikiXHg4Nlx4QzAiLCAyKTsKKwlpZiAocmVzdWx0X25iciAhPSAyKQorCXsKKwkJVUlOVDMyIGR3RXJyID0gR0VUX0xBU1RfRVJSKCk7CisJCXByaW50ZigiRXJyb3IgJWQgc2V0dGluZyB1cCBDT00gcGFyYW1zIGZvciBiYXVkcmF0ZSBieXRlXG4iLCBkd0Vycik7CisJfQorCisJU0xFRVAoMTAwKTsgLy8gd2FpdCBmb3IgdGhlIGNoYXJzIHRvIGJlIHNlbnQsIGlzIHRoZXJlIGEgYmV0dGVyIHdheT8KKworCS8vIHRoZSByZWFkIDB4MTkgbWVhbnMgMTQ0MjMgYmF1ZCB3aXRoIDEyIE1IegorCWlmKCFVYXJ0Q29uZmlnKHNlcmlhbF9oYW5kbGUsIDE0NDAwLCBlTk9QQVJJVFksIGVPTkVTVE9QQklULCA4KSkKKwl7CisJCXByaW50ZigiRXJyb3Igc2V0dGluZyB1cCBDT00gcGFyYW1zIGZvciAxc3QgbGV2ZWwgbG9hZGVyXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvLyBkbyB0aGUgYmF1ZHJhdGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIFJlY29kZXIvRk0KK2ludCBDb25maWdGaXJzdGxldmVsUmVjb3JkZXIgKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUpCit7CisJVUlOVDMyIHJlc3VsdF9uYnI7CisKKwlpZighVWFydENvbmZpZyhzZXJpYWxfaGFuZGxlLCA0ODAwLCBlTk9QQVJJVFksIGVUV09TVE9QQklUUywgOCkpCisJeworCQlVSU5UMzIgZHdFcnIgPSBHRVRfTEFTVF9FUlIoKTsKKwkJcHJpbnRmKCJFcnJvciAlZCBzZXR0aW5nIHVwIENPTSBwYXJhbXMgZm9yIGJhdWRyYXRlIGJ5dGVcbiIsIGR3RXJyKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvLyB0aGlzIHdpbGwgcmVhZCBhcyAweDA4IHdoZW4gdmlld2VkIHdpdGggMjEyMCBiYXVkIGxpa2UgdGhlIHJlY29yZGVyIGRvZXMKKwlyZXN1bHRfbmJyID0gVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsIChVSU5UOCopIlx4MDBceDAwIiwgMik7CisJaWYocmVzdWx0X25iciAhPSAyKQorCXsKKwkJcHJpbnRmKCJFcnJvciB0cmFuc21pdHRpbmcgYmF1ZHJhdGUgYnl0ZVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJU0xFRVAoMTAwKTsgLy8gd2FpdCBmb3IgdGhlIGNoYXJzIHRvIGJlIHNlbnQsIGlzIHRoZXJlIGEgYmV0dGVyIHdheT8KKworCS8vIHRoZSByZWFkIDB4MDggbWVhbnMgMzg0MDAgYmF1ZCB3aXRoIDExLjA1OTIgTUh6CisJaWYoIVVhcnRDb25maWcoc2VyaWFsX2hhbmRsZSwgMzg0MDAsIGVOT1BBUklUWSwgZU9ORVNUT1BCSVQsIDgpKQorCXsKKwkJVUlOVDMyIGR3RXJyID0gR0VUX0xBU1RfRVJSKCk7CisJCXByaW50ZigiRXJyb3IgJWQgc2V0dGluZyB1cCBDT00gcGFyYW1zIGZvciAxc3QgbGV2ZWwgbG9hZGVyXG4iLCBkd0Vycik7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLy8gdHJhbnNmZXIgYSBieXRlIGZvciB0aGUgbW9uaXRvciBkb3dubG9hZCwgd2l0aCBvciB3aXRob3V0IGFja25vd2xlZGdlCitpbnQgRG93bmxvYWRCeXRlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIHVuc2lnbmVkIGNoYXIgYnl0ZSwgYm9vbCBiQWNrKQoreworCXVuc2lnbmVkIGNoYXIgcmVjZWl2ZWQ7CisJYm9vbCBiUmVjb3JkZXIgPSB0cnVlOyAvLyBmYWxzZSBmb3IgcGxheWVyCisKKwl3aGlsZSAoMSkKKwl7CisJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmYnl0ZSwgMSk7CisJCWlmIChiQWNrKQorCQl7CisJCQlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOworCQkJaWYgKHJlY2VpdmVkID09IGJ5dGUpCisJCQl7CisJCQkJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsIChVSU5UOCopIlx4MDEiLCAxKTsgLy8gYWNrIHN1Y2Nlc3MKKwkJCQlicmVhazsgLy8gZXhpdCB0aGUgbG9vcAorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXByaW50ZigiRXJyb3IgdHJhbnNtaXR0aW5nIG1vbml0b3IgYnl0ZSAweCUwMlgsIGdvdCAweCUwWFxuIiwgYnl0ZSwgcmVjZWl2ZWQpOworCQkJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAoVUlOVDgqKSJceDAwIiwgMSk7IC8vIGFjayBmYWlsLCB0cnkgYWdhaW4KKwkJCX0KKwkJfQorCQllbHNlCisJCQlicmVhazsgLy8gbm8gbG9vcAorCX0KKwlyZXR1cm4gMTsKK30KKworCisvLyBkb3dubG9hZCBvdXIgbGl0dGxlIG1vbml0b3IsIHRoZSBib3ggbXVzdCBoYXZlIGJlZW4ganVzdCBmcmVzaGx5IHN3aXRjaGVkIG9uIGZvciB0aGlzIHRvIHdvcmsKK2ludCBEb3dubG9hZE1vbml0b3IodFVhcnRIYW5kbGUgc2VyaWFsX2hhbmRsZSwgYm9vbCBiUmVjb3JkZXIsIGNoYXIqIHN6RmlsZW5hbWUpCit7CisJRklMRSogcEZpbGU7CisJc2l6ZV90IGZpbGVzaXplOworCVVJTlQ4IGJ5dGU7CisJdW5zaWduZWQgaTsKKworCS8vIGhhcmQtY29kZWQgcGFyYW1ldGVycworCWJvb2wgYkFjayA9IHRydWU7IC8vIGNvbmZpZ3VyZSBpZiBhY2tub3dsZWRnZWQgZG93bmxvYWQgKHdpdGhvdXQgdXNlZnVsIGZvciByZW1vdGUgcGluIGJvb3QpCisJVUlOVDMyIFRhcmdldExvYWQgPSAweDBGRkZGMDAwOyAvLyB0YXJnZXQgbG9hZCBhZGRyZXNzCisKKwlwRmlsZSA9IGZvcGVuKHN6RmlsZW5hbWUsICJyYiIpOworCWlmIChwRmlsZSA9PSBOVUxMKQorCXsKKwkJcHJpbnRmKCJcbk1vbml0b3IgZmlsZSAlcyBub3QgZm91bmQsIGV4aXRpbmdcbiIsIHN6RmlsZW5hbWUpOworCQlleGl0KDEpOworCX0KKworCS8vIGRldGVybWluZSBmaWxlIHNpemUKKwlmc2VlayhwRmlsZSwgMCwgU0VFS19FTkQpOworCWZpbGVzaXplID0gZnRlbGwocEZpbGUpOworCWZzZWVrKHBGaWxlLCAwLCBTRUVLX1NFVCk7CisKKwkvLyBUaGlzIGlzIF9yZWFsbHlfIHRyaWNreSEgVGhlIGJveCBleHBlY3RzIGEgQlJSIHZhbHVlIGluIGEgbm9uc3RhbmRhcmQgYmF1ZHJhdGUsCisJLy8Jd2hpY2ggYSBQQyBjYW4ndCBnZW5lcmF0ZS4gSSdtIHVzaW5nIGEgaGlnaGVyIG9uZSB3aXRoIHNvbWUgd2lsZCBzZXR0aW5ncworCS8vCXRvIGdlbmVyYXRlIGEgcHVsc2Ugc2VyaWVzIHRoYXQ6CisJLy8JMSkgbG9va3MgbGlrZSBhIHN0YWJsZSBieXRlIHdoZW4gc2FtcGxlZCB3aXRoIHRoZSBub25zdGFuZGFyZCBiYXVkcmF0ZQorCS8vCTIpIGdpdmVzIGEgQlJSIHZhbHVlIHRvIHRoZSBib3ggd2hpY2ggcmVzdWx0cyBpbiBhIGJhdWRyYXRlIHRoZSBQQyBjYW4gYWxzbyB1c2UKKwlpZiAoYlJlY29yZGVyKQorCXsKKwkJQ29uZmlnRmlyc3RsZXZlbFJlY29yZGVyKHNlcmlhbF9oYW5kbGUpOworCX0KKwllbHNlCisJeworCQlDb25maWdGaXJzdGxldmVsUGxheWVyKHNlcmlhbF9oYW5kbGUpOworCX0KKworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCBiQWNrID8gKFVJTlQ4KikiXHgwMSIgOiAoVUlOVDgqKSJceDAwIiwgMSk7IC8vIEFDSyBtb2RlCisKKwkvLyB0cmFuc21pdCB0aGUgc2l6ZSwgbGl0dGxlIGVuZGlhbgorCURvd25sb2FkQnl0ZShzZXJpYWxfaGFuZGxlLCAoVUlOVDgpKCBmaWxlc2l6ZQkgICAmIDB4RkYpLCBiQWNrKTsKKwlEb3dubG9hZEJ5dGUoc2VyaWFsX2hhbmRsZSwgKFVJTlQ4KSgoZmlsZXNpemU+PjgpICAmIDB4RkYpLCBiQWNrKTsKKwlEb3dubG9hZEJ5dGUoc2VyaWFsX2hhbmRsZSwgKFVJTlQ4KSgoZmlsZXNpemU+PjE2KSAmIDB4RkYpLCBiQWNrKTsKKwlEb3dubG9hZEJ5dGUoc2VyaWFsX2hhbmRsZSwgKFVJTlQ4KSgoZmlsZXNpemU+PjI0KSAmIDB4RkYpLCBiQWNrKTsKKworCS8vIHRyYW5zbWl0IHRoZSBsb2FkIGFkZHJlc3MsIGxpdHRsZSBlbmRpYW4KKwlEb3dubG9hZEJ5dGUoc2VyaWFsX2hhbmRsZSwgKFVJTlQ4KSggVGFyZ2V0TG9hZCAJICYgMHhGRiksIGJBY2spOworCURvd25sb2FkQnl0ZShzZXJpYWxfaGFuZGxlLCAoVUlOVDgpKChUYXJnZXRMb2FkPj44KSAgJiAweEZGKSwgYkFjayk7CisJRG93bmxvYWRCeXRlKHNlcmlhbF9oYW5kbGUsIChVSU5UOCkoKFRhcmdldExvYWQ+PjE2KSAmIDB4RkYpLCBiQWNrKTsKKwlEb3dubG9hZEJ5dGUoc2VyaWFsX2hhbmRsZSwgKFVJTlQ4KSgoVGFyZ2V0TG9hZD4+MjQpICYgMHhGRiksIGJBY2spOworCisJLy8gdHJhbnNtaXQgdGhlIGNvbW1hbmQgYnl0ZQorCURvd25sb2FkQnl0ZShzZXJpYWxfaGFuZGxlLCAweEZGLCBiQWNrKTsgLy8gMHhGRiBtZWFucyBleGVjdXRlIHRoZSB0cmFuc2ZlcnJlZCBpbWFnZQorCisJLy8gdHJhbnNtaXQgdGhlIGltYWdlCisJZm9yIChpPTA7IGk8ZmlsZXNpemU7IGkrKykKKwl7CisJCWZyZWFkKCZieXRlLCAxLCAxLCBwRmlsZSk7CisJCURvd25sb2FkQnl0ZShzZXJpYWxfaGFuZGxlLCBieXRlLCBiQWNrKTsKKwl9CisKKwlmY2xvc2UgKHBGaWxlKTsKKworCS8vIG5vdyB0aGUgaW1hZ2Ugc2hvdWxkIGhhdmUgYmVlbiBzdGFydGVkLCByZWQgTEVEIG9mZgorCisJcmV0dXJuIDA7Cit9CisKKworLy8gd2FpdCBmb3IgYSBmaXhlZCBzdHJpbmcgdG8gYmUgcmVjZWl2ZWQgKG5vIGZvb2xwcm9vZiBhbGdvcml0aG0sCisvLwltYXkgb3Zlcmxvb2sgaWYgdGhlIHNlYXJjaGVkIHN0cmluZyBjb250YWlucyByZXBlYXRpdGlvbnMpCitpbnQgV2FpdEZvclN0cmluZyh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBjaGFyKiBwc3pXYWl0KQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyIHJlY2VpdmVkOworCQorCXdoaWxlKHBzeldhaXRbaV0gIT0gJ1wwJykKKwl7CisJCVVhcnRSZWFkKHNlcmlhbF9oYW5kbGUsICZyZWNlaXZlZCwgMSk7CisKKwkJcHJpbnRmKCIlYyIsIHJlY2VpdmVkKTsgLy8gZGVidWcKKworCQlpZiAocmVjZWl2ZWQgPT0gcHN6V2FpdFtpXSkKKwkJCWkrKzsgLy8gY29udGludWUKKwkJZWxzZSAKKwkJCWk9MDsgLy8gbWlzbWF0Y2gsIHN0YXJ0IG92ZXIKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLy8gc2VuZCBhIHN0aW5nIGFuZCBjaGVjayB0aGUgZWNobworaW50IFNlbmRXaXRoRWNobyh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBjaGFyKiBwc3pTZW5kKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyIHJlY2VpdmVkOworCQorCXdoaWxlKHBzelNlbmRbaV0gIT0gJ1wwJykKKwl7CisJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAodW5zaWduZWQgY2hhciopKHBzelNlbmQgKyBpKSwgMSk7IC8vIHNlbmQgY2hhcgorCQlkbworCQl7CisJCQlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOyAvLyByZWNlaXZlIGVjaG8KKwkJCXByaW50ZigiJWMiLCByZWNlaXZlZCk7IC8vIGRlYnVnCisJCX0KKwkJd2hpbGUgKHJlY2VpdmVkICE9IHBzelNlbmRbaV0pOyAvLyBzaG91bGQgbm9ybWFsbHkgYmUgZXF1YWwKKwkJaSsrOyAvLyBuZXh0IGNoYXIKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLy8gcmFyZWx5IHVzZWQgdmFyaWFudDogZG93bmxvYWQgb3VyIG1vbml0b3IgdXNpbmcgdGhlIGJ1aWx0LWluIEFyY2hvcyBtb25pdG9yCitpbnQgRG93bmxvYWRBcmNob3NNb25pdG9yKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIGNoYXIqIHN6RmlsZW5hbWUpCit7CisJRklMRSogcEZpbGU7CisJc2l6ZV90IGZpbGVzaXplOworCVVJTlQ4IGJ5dGU7CisJVUlOVDE2IGNoZWNrc3VtID0gMDsKKwl1bnNpZ25lZCBpOworCisJLy8gdGhlIG9uYm9hcmQgbW9uaXRvciB1c2VzIDExNTIwMCBiYXVkCisJaWYoIVVhcnRDb25maWcoc2VyaWFsX2hhbmRsZSwgMTE1MjAwLCBlTk9QQVJJVFksIGVPTkVTVE9QQklULCA4KSkKKwl7CisJCVVJTlQzMiBkd0VyciA9IEdFVF9MQVNUX0VSUigpOworCQlwcmludGYoIkVycm9yICVkIHNldHRpbmcgdXAgQ09NIHBhcmFtcyBmb3IgYmF1ZHJhdGUgJWRcbiIsIGR3RXJyLCAxMTUyMDApOworCQlleGl0KDEpOworCX0KKworCS8vIHdhaXQgZm9yIHJlY2VpdmluZyAiI1NFUklBTCMiCisJV2FpdEZvclN0cmluZyhzZXJpYWxfaGFuZGxlLCAiI1NFUklBTCMiKTsKKwkKKwkvLyBzZW5kIG1hZ2ljICJTUkwiIGNvbW1hbmQgdG8gZ2V0IGludGVyYWN0aXZlIG1vZGUKKwlTZW5kV2l0aEVjaG8oc2VyaWFsX2hhbmRsZSwgIlNSTFxyIik7CisJCisJLy8gd2FpdCBmb3IgbWVudSBjb21wbGV0aW9uOiAiUk9PVD4iIGF0IHRoZSBlbmQKKwlXYWl0Rm9yU3RyaW5nKHNlcmlhbF9oYW5kbGUsICJST09UPiIpOworCQorCS8vIHNlbmQgdXBsb2FkIGNvbW1hbmQgIlVQIgorCVNlbmRXaXRoRWNobyhzZXJpYWxfaGFuZGxlLCAiVVBcciIpOworCQorCXBGaWxlID0gZm9wZW4oc3pGaWxlbmFtZSwgInJiIik7CisJaWYgKHBGaWxlID09IE5VTEwpCisJeworCQlwcmludGYoIlxuTW9uaXRvciBmaWxlICVzIG5vdCBmb3VuZCwgZXhpdGluZ1xuIiwgc3pGaWxlbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJLy8gZGV0ZXJtaW5lIGZpbGUgc2l6ZQorCWZzZWVrKHBGaWxlLCAwLCBTRUVLX0VORCk7CisJZmlsZXNpemUgPSBmdGVsbChwRmlsZSk7CisJZnNlZWsocEZpbGUsIDAsIFNFRUtfU0VUKTsKKwkKKwkvLyBjYWxjdWxhdGUgY2hlY2tzdW0KKwlmb3IgKGk9MDsgaTxmaWxlc2l6ZTsgaSsrKQorCXsKKwkJZnJlYWQoJmJ5dGUsIDEsIDEsIHBGaWxlKTsKKwkJY2hlY2tzdW0gKz0gYnl0ZTsKKwl9CisJZnNlZWsocEZpbGUsIDAsIFNFRUtfU0VUKTsKKwkKKwkvLyBzZW5kIGhlYWRlcgorCisJLy8gc2l6ZSBhcyAzMiBiaXQgbGl0dGxlIGVuZGlhbgorCWJ5dGUgPSAoVUlOVDgpKCBmaWxlc2l6ZQkgICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZieXRlLCAxKTsKKwlieXRlID0gKFVJTlQ4KSgoZmlsZXNpemU+PjgpICAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmYnl0ZSwgMSk7CisJYnl0ZSA9IChVSU5UOCkoKGZpbGVzaXplPj4xNikgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJmJ5dGUsIDEpOworCWJ5dGUgPSAoVUlOVDgpKChmaWxlc2l6ZT4+MjQpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZieXRlLCAxKTsKKworCS8vIGNoZWNrc3VtIGFzIDE2IGJpdCBsaXR0bGUgZW5kaWFuCisJYnl0ZSA9IChVSU5UOCkoIGNoZWNrc3VtCSAgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJmJ5dGUsIDEpOworCWJ5dGUgPSAoVUlOVDgpKChjaGVja3N1bT4+OCkgICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZieXRlLCAxKTsKKwkKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgKHVuc2lnbmVkIGNoYXIqKSJceDAwIiwgMSk7IC8vIGtpbmQgKDMgbWVhbnMgZmxhc2gpCisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICh1bnNpZ25lZCBjaGFyKikiXHgwMCIsIDEpOyAvLyBpZ25vcmVkIGJ5dGUKKworCS8vIHdhaXQgZm9yIG1vbml0b3IgdG8gYWNjZXB0IGRhdGEKKwlXYWl0Rm9yU3RyaW5nKHNlcmlhbF9oYW5kbGUsICIjT0tDVFJMIyIpOworCQorCS8vIHRyYW5zbWl0IHRoZSBpbWFnZQorCWZvciAoaT0wOyBpPGZpbGVzaXplOyBpKyspCisJeworCQlmcmVhZCgmYnl0ZSwgMSwgMSwgcEZpbGUpOworCQlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJmJ5dGUsIDEpOyAvLyBwYXlsb2FkCisJfQorCWZjbG9zZSAocEZpbGUpOworCQorCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAodW5zaWduZWQgY2hhciopIlx4MDAiLCAxKTsgLy8gaWdub3JlZCBieXRlCisKKwkvLyB3YWl0IGZvciBtZW51IGNvbXBsZXRpb246ICJST09UPiIgYXQgdGhlIGVuZAorCVdhaXRGb3JTdHJpbmcoc2VyaWFsX2hhbmRsZSwgIlJPT1Q+Iik7CisKKwkvLyBzZW5kIHN0YXJ0IHByb2dyYW0gY29tbWFuZCAiU1BSTyIKKwlTZW5kV2l0aEVjaG8oc2VyaWFsX2hhbmRsZSwgIlNQUk9cciIpOworCisJU0xFRVAoMTAwKTsgLy8gd2FpdCBhIGxpdHRsZSB3aGlsZSBmb3Igc3RhcnR1cAorCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKiogVGFyZ2V0IGZ1bmN0aW9ucyB1c2luZyB0aGUgTW9uaXRvciBQcm90b2NvbCAqKioqKioqKioqLworCisvLyByZWFkIGEgYnl0ZSB1c2luZyB0aGUgdGFyZ2V0IG1vbml0b3IKK1VJTlQ4IFJlYWRCeXRlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyKQoreworCVVJTlQ4IHNlbmQ7CisJVUlOVDggcmVjZWl2ZWQ7CisKKwkvLyBzZW5kIHRoZSBhZGRyZXNzIGNvbW1hbmQKKwlzZW5kID0gQUREUkVTUzsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJLy8gdHJhbnNtaXQgdGhlIGFkZHJlc3MsIGJpZyBlbmRpYW4KKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+MjQpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+MTYpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+OCkgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCXNlbmQgPSAoVUlOVDgpKGFkZHIgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsgLy8gcmVzcG9uc2UKKwlpZiAocmVjZWl2ZWQgIT0gQUREUkVTUykKKwl7CisJCXByaW50ZigiUHJvdG9jb2wgZXJyb3IhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLy8gc2VuZCB0aGUgcmVhZCBjb21tYW5kCisJc2VuZCA9IEJZVEVfUkVBRDsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsgLy8gcmVzcG9uc2UKKworCXJldHVybiByZWNlaXZlZDsKK30KKworCisvLyB3cml0ZSBhIGJ5dGUgdXNpbmcgdGhlIHRhcmdldCBtb25pdG9yCitpbnQgV3JpdGVCeXRlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyLCBVSU5UOCBieXRlKQoreworCVVJTlQ4IHNlbmQ7CisJVUlOVDggcmVjZWl2ZWQ7CisKKwkvLyBzZW5kIHRoZSBhZGRyZXNzIGNvbW1hbmQKKwlzZW5kID0gQUREUkVTUzsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJLy8gdHJhbnNtaXQgdGhlIGFkZHJlc3MsIGJpZyBlbmRpYW4KKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+MjQpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+MTYpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+OCkgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCXNlbmQgPSAoVUlOVDgpKGFkZHIgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsgLy8gcmVzcG9uc2UKKwlpZiAocmVjZWl2ZWQgIT0gQUREUkVTUykKKwl7CisJCXByaW50ZigiUHJvdG9jb2wgZXJyb3IsIHJlY2VpY2VkIDB4JTAyWCFcbiIsIHJlY2VpdmVkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLy8gc2VuZCB0aGUgd3JpdGUgY29tbWFuZAorCXNlbmQgPSBCWVRFX1dSSVRFOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisKKwkvLyB0cmFuc21pdCB0aGUgZGF0YQorCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmYnl0ZSwgMSk7CisJCisJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsgLy8gcmVzcG9uc2UKKworCWlmIChyZWNlaXZlZCAhPSBCWVRFX1dSSVRFKQorCXsKKwkJcHJpbnRmKCJQcm90b2NvbCBlcnJvciFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvLyByZWFkIG1hbnkgYnl0ZXMgdXNpbmcgdGhlIHRhcmdldCBtb25pdG9yCitpbnQgUmVhZEJ5dGVNdWx0aXBsZSh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkciwgVUlOVDMyIHNpemUsIFVJTlQ4KiBwQnVmZmVyKQoreworCVVJTlQ4IHNlbmQsIHJlY2VpdmVkOworCisJLy8gc2VuZCB0aGUgYWRkcmVzcyBjb21tYW5kCisJc2VuZCA9IEFERFJFU1M7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCS8vIHRyYW5zbWl0IHRoZSBhZGRyZXNzLCBiaWcgZW5kaWFuCisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjI0KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjE2KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjgpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KShhZGRyICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCVVhcnRSZWFkKHNlcmlhbF9oYW5kbGUsICZyZWNlaXZlZCwgMSk7IC8vIHJlc3BvbnNlCisJaWYgKHJlY2VpdmVkICE9IEFERFJFU1MpCisJeworCQlwcmludGYoIlByb3RvY29sIGVycm9yIVxuIik7CisJCXJldHVybiAxOworCX0KKworCXdoaWxlIChzaXplKQorCXsKKwkJaWYgKHNpemUgPj0gMTYpCisJCXsJLy8gd2UgY2FuIHVzZSBhICJidXJzdCIgY29tbWFuZAorCQkJc2VuZCA9IEJZVEVfUkVBRDE2OworCQkJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsgLy8gc2VuZCB0aGUgcmVhZCBjb21tYW5kCisJCQlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCBwQnVmZmVyLCAxNik7IC8vIGRhdGEgcmVzcG9uc2UKKwkJCXBCdWZmZXIgKz0gMTY7CisJCQlzaXplIC09IDE2OworCQl9CisJCWVsc2UKKwkJewkvLyB1c2Ugc2luZ2xlIGJ5dGUgY29tbWFuZAorCQkJc2VuZCA9IEJZVEVfUkVBRDsKKwkJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7IC8vIHNlbmQgdGhlIHJlYWQgY29tbWFuZAorCQkJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgcEJ1ZmZlcisrLCAxKTsgLy8gZGF0YSByZXNwb25zZQorCQkJc2l6ZS0tOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLy8gd3JpdGUgbWFueSBieXRlcyB1c2luZyB0aGUgdGFyZ2V0IG1vbml0b3IKK2ludCBXcml0ZUJ5dGVNdWx0aXBsZSh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkciwgVUlOVDMyIHNpemUsIFVJTlQ4KiBwQnVmZmVyKQoreworCVVJTlQ4IHNlbmQsIHJlY2VpdmVkOworCisJLy8gc2VuZCB0aGUgYWRkcmVzcyBjb21tYW5kCisJc2VuZCA9IEFERFJFU1M7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCS8vIHRyYW5zbWl0IHRoZSBhZGRyZXNzLCBiaWcgZW5kaWFuCisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjI0KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjE2KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjgpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KShhZGRyICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCVVhcnRSZWFkKHNlcmlhbF9oYW5kbGUsICZyZWNlaXZlZCwgMSk7IC8vIHJlc3BvbnNlCisJaWYgKHJlY2VpdmVkICE9IEFERFJFU1MpCisJeworCQlwcmludGYoIlByb3RvY29sIGVycm9yIVxuIik7CisJCXJldHVybiAxOworCX0KKworCXdoaWxlIChzaXplKQorCXsKKwkJaWYgKHNpemUgPj0gMTYpCisJCXsJLy8gd2UgY2FuIHVzZSBhICJidXJzdCIgY29tbWFuZAorCQkJc2VuZCA9IEJZVEVfV1JJVEUxNjsKKwkJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7IC8vIHNlbmQgdGhlIHdyaXRlIGNvbW1hbmQKKwkJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCBwQnVmZmVyLCAxNik7IC8vIHRyYW5zbWl0IHRoZSBkYXRhCisJCQlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOyAvLyByZXNwb25zZQorCQkJaWYgKHJlY2VpdmVkICE9IEJZVEVfV1JJVEUxNikKKwkJCXsKKwkJCQlwcmludGYoIlByb3RvY29sIGVycm9yIVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlwQnVmZmVyICs9IDE2OworCQkJc2l6ZSAtPSAxNjsKKwkJfQorCQllbHNlCisJCXsJLy8gdXNlIHNpbmdsZSBieXRlIGNvbW1hbmQKKwkJCXNlbmQgPSBCWVRFX1dSSVRFOworCQkJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsgLy8gc2VuZCB0aGUgd3JpdGUgY29tbWFuZAorCQkJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsIHBCdWZmZXIrKywgMSk7IC8vIHRyYW5zbWl0IHRoZSBkYXRhCisJCQlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOyAvLyByZXNwb25zZQorCQkJaWYgKHJlY2VpdmVkICE9IEJZVEVfV1JJVEUpCisJCQl7CisJCQkJcHJpbnRmKCJQcm90b2NvbCBlcnJvciFcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJc2l6ZS0tOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLy8gd3JpdGUgbWFueSBieXRlcyB1c2luZyB0aGUgdGFyZ2V0IG1vbml0b3IKK2ludCBGbGFzaEJ5dGVNdWx0aXBsZSh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkciwgVUlOVDMyIHNpemUsIFVJTlQ4KiBwQnVmZmVyKQoreworCVVJTlQ4IHNlbmQsIHJlY2VpdmVkOworCisJLy8gc2VuZCB0aGUgYWRkcmVzcyBjb21tYW5kCisJc2VuZCA9IEFERFJFU1M7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCS8vIHRyYW5zbWl0IHRoZSBhZGRyZXNzLCBiaWcgZW5kaWFuCisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjI0KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjE2KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjgpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KShhZGRyICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCVVhcnRSZWFkKHNlcmlhbF9oYW5kbGUsICZyZWNlaXZlZCwgMSk7IC8vIHJlc3BvbnNlCisJaWYgKHJlY2VpdmVkICE9IEFERFJFU1MpCisJeworCQlwcmludGYoIlByb3RvY29sIGVycm9yIVxuIik7CisJCXJldHVybiAxOworCX0KKworCXdoaWxlIChzaXplKQorCXsKKwkJaWYgKHNpemUgPj0gMTYpCisJCXsJLy8gd2UgY2FuIHVzZSBhICJidXJzdCIgY29tbWFuZAorCQkJc2VuZCA9IEJZVEVfRkxBU0gxNjsKKwkJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7IC8vIHNlbmQgdGhlIHdyaXRlIGNvbW1hbmQKKwkJCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCBwQnVmZmVyLCAxNik7IC8vIHRyYW5zbWl0IHRoZSBkYXRhCisJCQlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOyAvLyByZXNwb25zZQorCQkJaWYgKHJlY2VpdmVkICE9IEJZVEVfRkxBU0gxNikKKwkJCXsKKwkJCQlwcmludGYoIlByb3RvY29sIGVycm9yIVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlwQnVmZmVyICs9IDE2OworCQkJc2l6ZSAtPSAxNjsKKwkJfQorCQllbHNlCisJCXsJLy8gdXNlIHNpbmdsZSBieXRlIGNvbW1hbmQKKwkJCXNlbmQgPSBCWVRFX0ZMQVNIOworCQkJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsgLy8gc2VuZCB0aGUgd3JpdGUgY29tbWFuZAorCQkJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsIHBCdWZmZXIrKywgMSk7IC8vIHRyYW5zbWl0IHRoZSBkYXRhCisJCQlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOyAvLyByZXNwb25zZQorCQkJaWYgKHJlY2VpdmVkICE9IEJZVEVfRkxBU0gpCisJCQl7CisJCQkJcHJpbnRmKCJQcm90b2NvbCBlcnJvciFcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJc2l6ZS0tOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLy8gcmVhZCBhIDE2Yml0IGhhbGZ3b3JkIHVzaW5nIHRoZSB0YXJnZXQgbW9uaXRvcgorVUlOVDE2IFJlYWRIYWxmd29yZCh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkcikKK3sKKwlVSU5UOCBzZW5kOworCVVJTlQ4IHJlY2VpdmVkOworCVVJTlQxNiBoYWxmd29yZDsKKworCS8vIHNlbmQgdGhlIGFkZHJlc3MgY29tbWFuZAorCXNlbmQgPSBBRERSRVNTOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisKKwkvLyB0cmFuc21pdCB0aGUgYWRkcmVzcywgYmlnIGVuZGlhbgorCXNlbmQgPSAoVUlOVDgpKChhZGRyPj4yNCkgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCXNlbmQgPSAoVUlOVDgpKChhZGRyPj4xNikgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCXNlbmQgPSAoVUlOVDgpKChhZGRyPj44KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoYWRkciAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisKKwlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOyAvLyByZXNwb25zZQorCWlmIChyZWNlaXZlZCAhPSBBRERSRVNTKQorCXsKKwkJcHJpbnRmKCJQcm90b2NvbCBlcnJvciFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvLyBzZW5kIHRoZSByZWFkIGNvbW1hbmQKKwlzZW5kID0gSEFMRldPUkRfUkVBRDsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsgLy8gcmVzcG9uc2UKKwloYWxmd29yZCA9IHJlY2VpdmVkIDw8IDg7IC8vIGhpZ2hieXRlCisJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsKKwloYWxmd29yZCB8PSByZWNlaXZlZDsgLy8gbG93Ynl0ZQorCisJcmV0dXJuIGhhbGZ3b3JkOworfQorCisKKy8vIHdyaXRlIGEgMTZiaXQgaGFsZndvcmQgdXNpbmcgdGhlIHRhcmdldCBtb25pdG9yCitpbnQgV3JpdGVIYWxmd29yZCh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkciwgVUlOVDE2IGhhbGZ3b3JkKQoreworCVVJTlQ4IHNlbmQ7CisJVUlOVDggcmVjZWl2ZWQ7CisKKwkvLyBzZW5kIHRoZSBhZGRyZXNzIGNvbW1hbmQKKwlzZW5kID0gQUREUkVTUzsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJLy8gdHJhbnNtaXQgdGhlIGFkZHJlc3MsIGJpZyBlbmRpYW4KKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+MjQpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+MTYpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KSgoYWRkcj4+OCkgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCXNlbmQgPSAoVUlOVDgpKGFkZHIgJiAweEZGKTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsgLy8gcmVzcG9uc2UKKwlpZiAocmVjZWl2ZWQgIT0gQUREUkVTUykKKwl7CisJCXByaW50ZigiUHJvdG9jb2wgZXJyb3IhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLy8gc2VuZCB0aGUgd3JpdGUgY29tbWFuZAorCXNlbmQgPSBIQUxGV09SRF9XUklURTsKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCisJLy8gdHJhbnNtaXQgdGhlIGRhdGEKKwlzZW5kID0gaGFsZndvcmQgPj4gODsgLy8gaGlnaGJ5dGUKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCXNlbmQgPSBoYWxmd29yZCAmIDB4RkY7IC8vIGxvd2J5dGUKKwlVYXJ0V3JpdGUoc2VyaWFsX2hhbmRsZSwgJnNlbmQsIDEpOworCQorCVVhcnRSZWFkKHNlcmlhbF9oYW5kbGUsICZyZWNlaXZlZCwgMSk7IC8vIHJlc3BvbnNlCisKKwlpZiAocmVjZWl2ZWQgIT0gSEFMRldPUkRfV1JJVEUpCisJeworCQlwcmludGYoIlByb3RvY29sIGVycm9yIVxuIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKKy8vIGNoYW5nZSBiYXVkcmF0ZSB1c2luZyB0YXJnZXQgbW9uaXRvcgoraW50IFNldFRhcmdldEJhdWRyYXRlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIGxvbmcgbENsb2NrLCBsb25nIGxCYXVkcmF0ZSkKK3sKKwlVSU5UOCBzZW5kOworCVVJTlQ4IHJlY2VpdmVkOworCVVJTlQ4IGJycjsKKwlsb25nIGxCUlI7CisKKwlsQlJSID0gbENsb2NrIC8gbEJhdWRyYXRlOworCWxCUlIgPSAoKGxCUlIgKyAxNikgLyAzMikgLSAxOyAvLyB3aXRoIHJvdW5kaW5nCisJYnJyID0gKFVJTlQ4KWxCUlI7CisKKwkvLyBzZW5kIHRoZSBjb21tYW5kCisJc2VuZCA9IEJBVURSQVRFOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZicnIsIDEpOyAvLyBzZW5kIHRoZSBCUlIgdmFsdWUKKwlVYXJ0UmVhZChzZXJpYWxfaGFuZGxlLCAmcmVjZWl2ZWQsIDEpOyAvLyByZXNwb25zZSBhY2sKKworCWlmIChyZWNlaXZlZCAhPSBCQVVEUkFURSkKKwl7CS8vIGJhZCBzaXR1YXRpb24sIG5vdyB3ZSdyZSB1bmNsZWFyIGFib3V0IHRoZSBiYXVkcmF0ZSBvZiB0aGUgdGFyZ2V0CisJCXByaW50ZigiUHJvdG9jb2wgZXJyb3IhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJU0xFRVAoMTAwKTsgLy8gZ2l2ZSBpdCBzb21lIHRpbWUgdG8gc2V0dGxlCisKKwkvLyBjaGFuZ2Ugb3VyIGJhdWRyYXRlLCB0b28KKwlVYXJ0Q29uZmlnKHNlcmlhbF9oYW5kbGUsIGxCYXVkcmF0ZSwgZU5PUEFSSVRZLCBlT05FU1RPUEJJVCwgOCk7IAorCisJcmV0dXJuIDA7Cit9CisKKworLy8gY2FsbCBhIHN1YnJvdXRpbmUgdXNpbmcgdGhlIHRhcmdldCBtb25pdG9yCitpbnQgRXhlY3V0ZSh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkciwgYm9vbCBiUmV0dXJucykKK3sKKwlVSU5UOCBzZW5kOworCVVJTlQ4IHJlY2VpdmVkOworCisJLy8gc2VuZCB0aGUgYWRkcmVzcyBjb21tYW5kCisJc2VuZCA9IEFERFJFU1M7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCS8vIHRyYW5zbWl0IHRoZSBhZGRyZXNzLCBiaWcgZW5kaWFuCisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjI0KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjE2KSAmIDB4RkYpOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJc2VuZCA9IChVSU5UOCkoKGFkZHI+PjgpICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKwlzZW5kID0gKFVJTlQ4KShhZGRyICYgMHhGRik7CisJVWFydFdyaXRlKHNlcmlhbF9oYW5kbGUsICZzZW5kLCAxKTsKKworCVVhcnRSZWFkKHNlcmlhbF9oYW5kbGUsICZyZWNlaXZlZCwgMSk7IC8vIHJlc3BvbnNlCisJaWYgKHJlY2VpdmVkICE9IEFERFJFU1MpCisJeworCQlwcmludGYoIlByb3RvY29sIGVycm9yIVxuIik7CisJCXJldHVybiAxOworCX0KKworCS8vIHNlbmQgdGhlIGV4ZWN1dGUgY29tbWFuZAorCXNlbmQgPSBFWEVDVVRFOworCVVhcnRXcml0ZShzZXJpYWxfaGFuZGxlLCAmc2VuZCwgMSk7CisJaWYgKGJSZXR1cm5zKQorCXsJLy8gd2UgZXhwZWN0IHRoZSBjYWxsIHRvIHJldHVybiBjb250cm9sIHRvIG1pbmltb24KKwkJVWFydFJlYWQoc2VyaWFsX2hhbmRsZSwgJnJlY2VpdmVkLCAxKTsgLy8gcmVzcG9uc2UKKworCQlpZiAocmVjZWl2ZWQgIT0gRVhFQ1VURSkKKwkJeworCQkJcHJpbnRmKCJQcm90b2NvbCBlcnJvciFcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9mbGFzaC91YXJ0X2Jvb3QvY2xpZW50LmggYi9mbGFzaC91YXJ0X2Jvb3QvY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlZjI5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL3VhcnRfYm9vdC9jbGllbnQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9DTElFTlRfSAorI2RlZmluZSBfQ0xJRU5UX0gKKworCisvLyBzZXR1cCBmdW5jdGlvbiBmb3IgbW9uaXRvciBkb3dubG9hZAoraW50IERvd25sb2FkTW9uaXRvcih0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBib29sIGJSZWNvcmRlciwgY2hhciogc3pGaWxlbmFtZSk7CitpbnQgRG93bmxvYWRBcmNob3NNb25pdG9yKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIGNoYXIqIHN6RmlsZW5hbWUpOworCisvLyB0YXJnZXQgZnVuY3Rpb25zIHVzaW5nIHRoZSBNb25pdG9yIFByb3RvY29sCitVSU5UOCBSZWFkQnl0ZSh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkcik7CitpbnQgV3JpdGVCeXRlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyLCBVSU5UOCBieXRlKTsKK2ludCBSZWFkQnl0ZU11bHRpcGxlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyLCBVSU5UMzIgc2l6ZSwgVUlOVDgqIHBCdWZmZXIpOworaW50IFdyaXRlQnl0ZU11bHRpcGxlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyLCBVSU5UMzIgc2l6ZSwgVUlOVDgqIHBCdWZmZXIpOworaW50IEZsYXNoQnl0ZU11bHRpcGxlKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyLCBVSU5UMzIgc2l6ZSwgVUlOVDgqIHBCdWZmZXIpOworVUlOVDE2IFJlYWRIYWxmd29yZCh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkcik7CitpbnQgV3JpdGVIYWxmd29yZCh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkciwgVUlOVDE2IGhhbGZ3b3JkKTsKK2ludCBTZXRUYXJnZXRCYXVkcmF0ZSh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBsb25nIGxDbG9jaywgbG9uZyBsQmF1ZHJhdGUpOworaW50IEV4ZWN1dGUodFVhcnRIYW5kbGUgc2VyaWFsX2hhbmRsZSwgVUlOVDMyIGFkZHIsIGJvb2wgYlJldHVybnMpOworCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZsYXNoL3VhcnRfYm9vdC9mbGFzaC5jIGIvZmxhc2gvdWFydF9ib290L2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3YmI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL3VhcnRfYm9vdC9mbGFzaC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8vIGZsYXNoLmNwcCA6IGhpZ2hlci1sZXZlbCBmdW5jdGlvbnMgZm9yIGZsYXNoaW5nIHRoZSBjaGlwCisvLworCisjaW5jbHVkZSAic2NhbGFyX3R5cGVzLmgiIC8vIChVKUlOVDgvMTYvMzIKKyNpbmNsdWRlICJVYXJ0LmgiIC8vIHBsYXRmb3JtIGFic3RyYWN0aW9uIGZvciBVQVJUCisjaW5jbHVkZSAiY2xpZW50LmgiIC8vIGNsaWVudCBmdW5jdGlvbnMKKworCisvLyByZWFkIHRoZSBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRAoraW50IFJlYWRJRCh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYmFzZSwgVUlOVDgqIHBNYW51ZmFjdHVyZXJJRCwgVUlOVDgqIHBEZXZpY2VJRCkKK3sKKwliYXNlICY9IDB4RkZGODAwMDA7IC8vIHJvdW5kIGRvd24gdG8gNTEyayBhbGlnbiwgdG8gbWFrZSBzaHVyZQorCisJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGJhc2UgKyAweDU1NTUsIDB4QUEpOyAvLyBlbnRlciBjb21tYW5kIG1vZGUKKwlXcml0ZUJ5dGUoc2VyaWFsX2hhbmRsZSwgYmFzZSArIDB4MkFBQSwgMHg1NSk7CisJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGJhc2UgKyAweDU1NTUsIDB4OTApOyAvLyBJRCBjb21tYW5kCisJU0xFRVAoMjApOyAvLyBBdG1lbCB3YW50cyAyMG1zIHBhdXNlIGhlcmUKKworCSpwTWFudWZhY3R1cmVySUQgPSBSZWFkQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMCk7CisJKnBEZXZpY2VJRAkJID0gUmVhZEJ5dGUoc2VyaWFsX2hhbmRsZSwgYmFzZSArIDEpOworCisJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGJhc2UgKyAwLCAweEYwKTsJLy8gcmVzZXQgZmxhc2ggKGJhY2sgdG8gbm9ybWFsIHJlYWQgbW9kZSkKKwlTTEVFUCgyMCk7IC8vIEF0bWVsIHdhbnRzIDIwbXMgcGF1c2UgaGVyZQorCisJcmV0dXJuIDA7Cit9CisKKworLy8gZXJhc2UgdGhlIHNlY3RvciB3aGljaCBjb250YWlucyB0aGUgZ2l2ZW4gYWRkcmVzcworaW50IEVyYXNlU2VjdG9yKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyZXNzKQoreworCVVJTlQzMiBiYXNlID0gYWRkcmVzcyAmIDB4RkZGODAwMDA7IC8vIHJvdW5kIGRvd24gdG8gNTEyayBhbGlnbgorCQorCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweEFBKTsgLy8gZW50ZXIgY29tbWFuZCBtb2RlCisJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGJhc2UgKyAweDJBQUEsIDB4NTUpOworCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweDgwKTsgLy8gZXJhemUgY29tbWFuZAorCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweEFBKTsgLy8gZW50ZXIgY29tbWFuZCBtb2RlCisJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGJhc2UgKyAweDJBQUEsIDB4NTUpOworCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBhZGRyZXNzLCAweDMwKTsgLy8gZXJhemUgdGhlIHNlY3RvcgorCVNMRUVQKDI1KTsgLy8gc2VjdG9yIGVyYXplIHRpbWU6IDI1bXMKKworCXJldHVybiAwOworfQorCisKKy8vIGVyYXNlIHRoZSB3aG9sZSBmbGFzaAoraW50IEVyYXNlQ2hpcCh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYmFzZSkKK3sKKwliYXNlICY9IDB4RkZGODAwMDA7IC8vIHJvdW5kIGRvd24gdG8gNTEyayBhbGlnbiwgdG8gbWFrZSBzaHVyZQorCQorCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweEFBKTsgLy8gZW50ZXIgY29tbWFuZCBtb2RlCisJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGJhc2UgKyAweDJBQUEsIDB4NTUpOworCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweDgwKTsgLy8gZXJhemUgY29tbWFuZAorCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweEFBKTsgLy8gZW50ZXIgY29tbWFuZCBtb2RlCisJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGJhc2UgKyAweDJBQUEsIDB4NTUpOworCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweDEwKTsgLy8gY2hpcCBlcmF6ZSBjb21tYW5kCisJU0xFRVAoMTAwKTsgLy8gY2hpcCBlcmF6ZSB0aW1lOiAxMDBtcworCisJcmV0dXJuIDA7Cit9CisKKworLy8gcHJvZ3JhbSBhIGJ1bmNoIG9mIGJ5dGVzICJieSBoYW5kIgoraW50IFByb2dyYW1CeXRlcyh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkcmVzcywgVUlOVDgqIHBEYXRhLCBVSU5UMzIgc2l6ZSkKK3sKKwlVSU5UMzIgYmFzZSA9IGFkZHJlc3MgJiAweEZGRjgwMDAwOyAvLyByb3VuZCBkb3duIHRvIDUxMmsgYWxpZ24KKworCXdoaWxlIChzaXplLS0pCisJeworCQlXcml0ZUJ5dGUoc2VyaWFsX2hhbmRsZSwgYmFzZSArIDB4NTU1NSwgMHhBQSk7IC8vIGVudGVyIGNvbW1hbmQgbW9kZQorCQlXcml0ZUJ5dGUoc2VyaWFsX2hhbmRsZSwgYmFzZSArIDB4MkFBQSwgMHg1NSk7CisJCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCBiYXNlICsgMHg1NTU1LCAweEEwKTsgLy8gYnl0ZSBwcm9ncmFtIGNvbW1hbmQKKwkJV3JpdGVCeXRlKHNlcmlhbF9oYW5kbGUsIGFkZHJlc3MrKywgKnBEYXRhKyspOworCQkvLyBVQVJUIHByb3RvY29sIGlzIHNsb3cgZW5vdWdoIHN1Y2ggdGhhdCBJIGRvbid0IGhhdmUgdG8gd2FpdCAyMHVzIGhlcmUKKwl9CisJcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmxhc2gvdWFydF9ib290L2ZsYXNoLmggYi9mbGFzaC91YXJ0X2Jvb3QvZmxhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGM2MjAxCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvdWFydF9ib290L2ZsYXNoLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9GTEFTSF9ICisjZGVmaW5lIF9GTEFTSF9ICisKK2ludCBSZWFkSUQodFVhcnRIYW5kbGUgc2VyaWFsX2hhbmRsZSwgVUlOVDMyIGJhc2UsIFVJTlQ4KiBwTWFudWZhY3R1cmVySUQsIFVJTlQ4KiBwRGV2aWNlSUQpOworaW50IEVyYXNlU2VjdG9yKHRVYXJ0SGFuZGxlIHNlcmlhbF9oYW5kbGUsIFVJTlQzMiBhZGRyZXNzKTsKK2ludCBFcmFzZUNoaXAodFVhcnRIYW5kbGUgc2VyaWFsX2hhbmRsZSwgVUlOVDMyIGJhc2UpOworaW50IFByb2dyYW1CeXRlcyh0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlLCBVSU5UMzIgYWRkcmVzcywgVUlOVDgqIHBEYXRhLCBVSU5UMzIgc2l6ZSk7CisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZsYXNoL3VhcnRfYm9vdC9taW5pbW9uLmggYi9mbGFzaC91YXJ0X2Jvb3QvbWluaW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDA2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9mbGFzaC91YXJ0X2Jvb3QvbWluaW1vbi5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX01JTklNT05fSAorI2RlZmluZSBfTUlOSU1PTl9ICisKKworLy8gQ29tbWFuZHMKKy8vIGFsbCBtdWx0aWJ5dGUgdmFsdWVzIChhZGRyZXNzLCBoYWxmd29yZHMpIGFyZSBwYXNzZWQgYXMgYmlnIGVuZGlhbiAKKy8vICAobW9zdCBzaWduaWZpY2FudCBvZiB0aGUgYnl0ZXMgZmlyc3QpCisKKy8vIHNldCB0aGUgYWRkcmVzcyAoYWxsIHJlYWQvd3JpdGUgY29tbWFuZHMgd2lsbCBhdXRvLWluY3JlbWVudCBpdCkKKyNkZWZpbmUgQkFVRFJBVEUgICAgICAgMHgwMCAvLyBmb2xsb3dlZCBieSBCUlIgdmFsdWU7IHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgQUREUkVTUyAgICAgICAgMHgwMSAvLyBmb2xsb3dlZCBieSA0IGJ5dGVzIGFkZHJlc3M7IHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgQllURV9SRUFEICAgICAgMHgwMiAvLyByZXNwb25zZTogMSBieXRlIGNvbnRlbnQKKyNkZWZpbmUgQllURV9XUklURSAgICAgMHgwMyAvLyBmb2xsb3dlZCBieSAxIGJ5dGUgY29udGVudDsgcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZQorI2RlZmluZSBCWVRFX1JFQUQxNiAgICAweDA0IC8vIHJlc3BvbnNlOiAxNiBieXRlcyBjb250ZW50CisjZGVmaW5lIEJZVEVfV1JJVEUxNiAgIDB4MDUgLy8gZm9sbG93ZWQgYnkgMTYgYnl0ZXM7IHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgQllURV9GTEFTSCAgICAgMHgwNiAvLyBmb2xsb3dlZCBieSAxIGJ5dGUgY29udGVudDsgcmVzcG9uc2U6IGNvbW1hbmQgYnl0ZQorI2RlZmluZSBCWVRFX0ZMQVNIMTYgICAweDA3IC8vIGZvbGxvd2VkIGJ5IDE2IGJ5dGVzOyByZXNwb25zZTogY29tbWFuZCBieXRlCisjZGVmaW5lIEhBTEZXT1JEX1JFQUQgIDB4MDggLy8gcmVzcG9uc2U6IDIgYnl0ZSBjb250ZW50CisjZGVmaW5lIEhBTEZXT1JEX1dSSVRFIDB4MDkgLy8gZm9sbG93ZWQgYnkgMiBieXRlIGNvbnRlbnQ7IHJlc3BvbnNlOiBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgRVhFQ1VURSAgICAgICAgMHgwQSAvLyByZXNwb25zZTogY29tbWFuZCBieXRlIGlmIGNhbGwgcmV0dXJucworCisKKyNlbmRpZiAvLyBfTUlOSU1PTl9ICmRpZmYgLS1naXQgYS9mbGFzaC91YXJ0X2Jvb3Qvc2NhbGFyX3R5cGVzLmggYi9mbGFzaC91YXJ0X2Jvb3Qvc2NhbGFyX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkODJjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZsYXNoL3VhcnRfYm9vdC9zY2FsYXJfdHlwZXMuaApAQCAtMCwwICsxLDQ0IEBACisvLyB0aGlzIGlzIG1lYW50IHRvIHJlc29sdmUgcGxhdGZvcm0gZGVwZW5kZW5jeQorCisjaWZuZGVmIF9TQ0FMQVJfVFlQRVNfSAorI2RlZmluZSBfU0NBTEFSX1RZUEVTX0gKKworCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIFNMRUVQIFNsZWVwCisjZGVmaW5lIEdFVF9MQVNUX0VSUiBHZXRMYXN0RXJyb3IKKyNlbmRpZgorLy8gVG9EbzogYWRkIHN0dWZmIGZvciBMaW51eAorCisKKworI2lmbmRlZiBVSU5UOAorI2RlZmluZSBVSU5UOCB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKworI2lmbmRlZiBVSU5UMTYKKyNkZWZpbmUgVUlOVDE2IHVuc2lnbmVkIHNob3J0CisjZW5kaWYKKworI2lmbmRlZiBVSU5UMzIKKyNkZWZpbmUgVUlOVDMyIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCisjaWZuZGVmIGJvb2wKKyNkZWZpbmUgYm9vbCBpbnQKKyNlbmRpZgorCisjaWZuZGVmIHRydWUKKyNkZWZpbmUgdHJ1ZSAxCisjZW5kaWYKKworI2lmbmRlZiBmYWxzZQorI2RlZmluZSBmYWxzZSAwCisjZW5kaWYKKworCisKKworCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mbGFzaC91YXJ0X2Jvb3QvdWFydC5oIGIvZmxhc2gvdWFydF9ib290L3VhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmIwODJjCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvdWFydF9ib290L3VhcnQuaApAQCAtMCwwICsxLDU2IEBACisvLyBBIGdlbmVyYWwgZGVmaW5pdGlvbiBmb3IgdGhlIHJlcXVpcmVkIFVBUlQgZnVuY3Rpb25hbGl0eS4KKy8vIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdhaW4gcGxhdGZvcm0gYWJzdHJhY3Rpb24uCisKKyNpZm5kZWYgX1VBUlRfSAorI2RlZmluZSBfVUFSVF9ICisKKy8vIGRhdGEgdHlwZXMKKwordHlwZWRlZiB2b2lkKiB0VWFydEhhbmRsZTsKKyNkZWZpbmUgSU5WQUxJRF9VQVJUX0hBTkRMRSAodFVhcnRIYW5kbGUpLTEKKwordHlwZWRlZiBlbnVtCit7CisJZU5PUEFSSVRZLAorCWVPRERQQVJJVFksIAorCWVFVkVOUEFSSVRZLAorCWVNQVJLUEFSSVRZLAorCWVTUEFDRVBBUklUWSwKK30gdFBhcml0eTsKKwordHlwZWRlZiBlbnVtCit7CisJZU9ORVNUT1BCSVQsCisJZU9ORTVTVE9QQklUUywKKwllVFdPU1RPUEJJVFMsCit9IHRTdG9wQml0czsKKworCisvLyBwcm90b3R5cGVzCisKK3RVYXJ0SGFuZGxlIFVhcnRPcGVuKCAgIC8vIHJldHVybnMgTlVMTCBvbiBlcnJvcgorCWNoYXIqIHN6UG9ydE5hbWUpOyAgLy8gQ09NeCBmb3Igd2luZG93cworCitib29sIFVhcnRDb25maWcoICAgICAgICAgLy8gcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGVycm9yCisJdFVhcnRIYW5kbGUgaGFuZGxlLCAgLy8gdGhlIGhhbmRsZSByZXR1cm5lZCBmcm9tIFVhcnRPcGVuKCkKKwlsb25nIGxCYXVkUmF0ZSwgICAgICAvLyBtdXN0IGJlIG9uZSBvZiB0aGUgInN0YW5kYXJkIiBiYXVkcmF0ZXMKKwl0UGFyaXR5IG5QYXJpdHksICAgICAvLyB3aGF0IGtpbmQgb2YgcGFyaXR5CisJdFN0b3BCaXRzIG5TdG9wQml0cywgLy8gaG93IG1hbnkgc3RvcCBiaXRzCisJaW50IG5CeXRlU2l6ZSk7ICAgICAgLy8gc2l6ZSBvZiB0aGUgInBheWxvYWQiLCBjYW4gYmUgNSB0byA4CisKK2xvbmcgVWFydFdyaXRlKCAgICAgICAgICAgLy8gcmV0dXJucyBob3cgbXVjaCBkYXRhIHdhcyBhY3R1YWxseSB0cmFuc21pdHRlZAorCXRVYXJ0SGFuZGxlIGhhbmRsZSwgICAvLyB0aGUgaGFuZGxlIHJldHVybmVkIGZyb20gVWFydE9wZW4oKQorCXVuc2lnbmVkIGNoYXIqIHBEYXRhLCAvLyBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkCisJbG9uZyBsU2l6ZSk7ICAgICAgICAgIC8vIGhvdyBtYW55IGJ5dGVzCisKK2xvbmcgVWFydFJlYWQoICAgICAgICAgICAgICAvLyByZXR1cm5zIGhvdyBtdWNoIGRhdGEgd2FzIGFjdHVhbGx5IHJlY2VpdmVkCisJdFVhcnRIYW5kbGUgaGFuZGxlLCAgICAgLy8gdGhlIGhhbmRsZSByZXR1cm5lZCBmcm9tIFVhcnRPcGVuKCkKKwl1bnNpZ25lZCBjaGFyKiBwQnVmZmVyLCAvLyBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbgorCWxvbmcgbFNpemUpOyAgICAgICAgICAgIC8vIGhvdyBtYW55IGJ5dGVzIHRvIHJlYWQgKHBCdWZmZXIgbXVzdCBoYXZlIGVub3VnaCByb29tKQorCisKK3ZvaWQgVWFydENsb3NlKHRVYXJ0SGFuZGxlIGhhbmRsZSk7CisKKworCisjZW5kaWYgLy8gX1VBUlRfSApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZsYXNoL3VhcnRfYm9vdC91YXJ0X2Jvb3QuYyBiL2ZsYXNoL3VhcnRfYm9vdC91YXJ0X2Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTEwZTliCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvdWFydF9ib290L3VhcnRfYm9vdC5jCkBAIC0wLDAgKzEsMzM3IEBACisvLyB1YXJ0X2Jvb3QuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgorLy8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic2NhbGFyX3R5cGVzLmgiIC8vIChVKUlOVDgvMTYvMzIKKyNpbmNsdWRlICJVYXJ0LmgiIC8vIHBsYXRmb3JtIGFic3RyYWN0aW9uIGZvciBVQVJUCisjaW5jbHVkZSAiY2xpZW50LmgiIC8vIGNsaWVudCBmdW5jdGlvbnMKKyNpbmNsdWRlICJmbGFzaC5oIiAvLyBmbGFzaCBoaWdoIGxldmVsIGZ1bmN0aW9ucworCisvLyBjb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbjogd2hhdCBzaGFsbCB3ZSBkbz8KK3N0cnVjdAoreworCWNoYXIqIHN6UG9ydDsgLy8gQ09NIHBvcnQgdG8gdXNlCisJYm9vbCBiUmVjb3JkZXI7IC8vIGl0J3MgYSByZWNvcmRlcgorCWJvb2wgYkFyY2hvczsgLy8gdXNlIHRoZSBBcmNob3MgbW9uaXRvciB0byBsb2FkLCBpbnN0ZWFkIG9mIFVBUlQgYm9vdAorCWJvb2wgYlNwaW5kb3duOyAvLyBzcGluZG93biB0aGUgaGFyZGRpc2sKKwlib29sIGJSZWFkSUQ7IC8vIHJlYWQgbWFudWZhY3R1cmVyK2RldmljZSBJRAorCWNoYXIqIHN6Rmxhc2hmaWxlOyAvLyBmaWxlIHRvIGJlIHByb2dyYW1tZWQKKwljaGFyKiBzekR1bXBmaWxlOyAvLyBmaWxlIHRvIGR1bXAgaW50bworCWNoYXIqIHN6RXhlY2ZpbGU7IC8vIGZpbGUgd2l0aCB0aGUgZXhlY3V0YWJsZQorCWJvb2wgYlRlc3Q7IC8vIGRlYnVnIGFjdGlvbgorCWJvb2wgYkJsaW5rOyAvLyBibGluayByZWQgTEVECisJYm9vbCBiTm9Eb3dubG9hZDsKK30gZ0NtZDsKKworCitpbnQgUHJvY2Vzc0NtZExpbmUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKwlhcmdjLS07IC8vIGV4Y2x1ZGUgb3VyIG5hbWUKKwlhcmd2Kys7CisKKwltZW1zZXQoJmdDbWQsIDAsIHNpemVvZihnQ21kKSk7CisKKwlpZiAoYXJnYyA9PSAwKQorCXsKKwkJcHJpbnRmKCJVc2FnZTogdWFydF9ib290IFstb3B0aW9uIHtmaWxlbmFtZX1dXG4iKTsKKwkJcHJpbnRmKCIgIHVzZXMgYWN0aXZhdGVkIFVBUlQgYm9vdCBtb2QsIGJveCBoYXMgdG8gYmUgZnJlc2ggc3RhcnRlZFxuIik7CisJCXByaW50ZigiVGhlIG9yZGVyIG9mIHRoZSBvcHRpb25zIGRvZXMgbm90IG1hdHRlciwgb25lIGxldHRlciBpcyBzdWZmaWNpZW50LlxuIik7CisJCXByaW50ZigiUG9zc2libGUgb3B0aW9ucyBhcmUgKGluIHRoZSBvcmRlciBvZiBsYXRlciBwcm9jZXNzaW5nKTpcbiIpOworCQlwcmludGYoIi1wb3J0IDxuYW1lIG9mIENPTSBwb3J0IHRvIHVzZT5cbiIpOworCQlwcmludGYoIi1yZWNvcmRlciAgKHRoaXMgaXMgYSByZWNvcmRlci9GTSwgZGVmYXVsdCBpcyBwbGF5ZXIgaWYgbm90IHNwZWNpZmllZClcbiIpOworCQlwcmludGYoIi1hcmNob3MgICh1c2UgQXJjaG9zIGJvb3Rsb2FkZXIsIHRoaXMgb25lIG5lZWRzIHBvd2VydXAgd2hpbGUgcHJvZ3JhbSB3YWl0cylcbiIpOworCQlwcmludGYoIi1ub2Rvd25sb2FkICAobm8gTWluaU1vbiBkb3dubG9hZCwgaXQncyBhbHJlYWR5IGFjdGl2ZSlcbiIpOworCQlwcmludGYoIi1zcGluZG93biAgKHNwaW5kb3duIHRoZSBoYXJkZGlzaywgZWxzZSBpdCBzdGF5cyBvbiBieSBkZWZhdWx0KVxuIik7CisJCXByaW50ZigiLWlkICAocmVhZCBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRCBvZiBmbGFzaCwgbm8gY2hlY2tzKVxuIik7CisJCXByaW50ZigiLWZsYXNoIDxmaWxlbmFtZSBvZiBiaW5hcnkgdG8gcHJvZ3JhbSBpbnRvIGZsYXNoPlxuIik7CisJCXByaW50ZigiLWR1bXAgPGZpbGVuYW1lIHRvIHdyaXRlIGZsYXNoIGNvbnRlbnQgdG8+XG4iKTsKKwkJcHJpbnRmKCItZXhlYyA8ZmlsZW5hbWUgb2YgZXhlY3V0YWJsZSBmb3IgMHgwOTAwMDAwMDoweDA5MDAwMjAwPlxuIik7CisJCXByaW50ZigiLXRlc3QgIChzb21lIHRlc3QgYWN0aW9uIGN1cnJlbnRseSB1bmRlciBkZXZlbG9wbWVudCwgZG9uJ3QgdXNlISlcbiIpOworCQlwcmludGYoIi1ibGluayAoYmxpbmsgcmVkIExFRCBmb3JldmVyLCBtZWFudCBhcyBkaWFnbm9zdGljcylcbiIpOworCQlwcmludGYoIlxuIik7CisJCXByaW50ZigiRXhhbXBsZXM6XG4iKTsKKwkJcHJpbnRmKCJ1YXJ0X2Jvb3QgLXIgLXAgQ09NMSAtcyAtZiBmbGFzaGZpbGUuYmluIC1kIGR1bXBmaWxlLmJpblxuIik7CisJCXByaW50ZigiICByZWNvcmRlciBvbiBDT00xLCBzcGluZG93biBIRCwgcHJvZ3JhbSBhbmQgZHVtcCAoZm9yIGUuZy4gb2ZmbGluZSB2ZXJpZnkpXG4iKTsKKwkJcHJpbnRmKCJ1YXJ0X2Jvb3QgLXIgLXAgQ09NMiAtZSByb2NrYm94LmJpblxuIik7CisJCXByaW50ZigiICByZWNvcmRlciBvbiBDT00yLCBsb2FkIFJvY2tib3ggZnJvbSBmaWxlIGFuZCBzdGFydCBpdFxuIik7CisJCWV4aXQgKDApOworCX0KKworCisJd2hpbGUgKGFyZ2MpCisJeworCQlpZiAoIXN0cm5jbXAoIi1wb3J0IiwgKmFyZ3YsIDIpKQorCQl7CisJCQlnQ21kLnN6UG9ydCA9ICorK2FyZ3Y7CisJCQlpZiAoLS1hcmdjIDw9IDAgfHwgKiphcmd2ID09ICctJykKKwkJCXsJCisJCQkJcHJpbnRmKCJObyBhcmd1bWVudCBnaXZlbiBmb3Igb3B0aW9uICVzLCBhYm9ydGluZy5cbiIsIGFyZ3ZbLTFdKTsKKwkJCQlleGl0ICgtMik7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoIi1yZWNvcmRlciIsICphcmd2LCAyKSkKKwkJeworCQkJZ0NtZC5iUmVjb3JkZXIgPSB0cnVlOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKCItYXJjaG9zIiwgKmFyZ3YsIDIpKQorCQl7CisJCQlnQ21kLmJBcmNob3MgPSB0cnVlOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKCItbm9kb3dubG9hZCIsICphcmd2LCAyKSkKKwkJeworCQkJZ0NtZC5iTm9Eb3dubG9hZCA9IHRydWU7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoIi1zcGluZG93biIsICphcmd2LCAyKSkKKwkJeworCQkJZ0NtZC5iU3BpbmRvd24gPSB0cnVlOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKCItaWQiLCAqYXJndiwgMikpCisJCXsKKwkJCWdDbWQuYlJlYWRJRCA9IHRydWU7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoIi1mbGFzaCIsICphcmd2LCAyKSkKKwkJeworCQkJZ0NtZC5zekZsYXNoZmlsZSA9ICorK2FyZ3Y7CisJCQlpZiAoLS1hcmdjIDw9IDAgfHwgKiphcmd2ID09ICctJykKKwkJCXsJCisJCQkJcHJpbnRmKCJObyBhcmd1bWVudCBnaXZlbiBmb3Igb3B0aW9uICVzLCBhYm9ydGluZy5cbiIsIGFyZ3ZbLTFdKTsKKwkJCQlleGl0ICgtMik7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoIi1kdW1wIiwgKmFyZ3YsIDIpKQorCQl7CisJCQlnQ21kLnN6RHVtcGZpbGUgPSAqKythcmd2OworCQkJaWYgKC0tYXJnYyA8PSAwIHx8ICoqYXJndiA9PSAnLScpCisJCQl7CQorCQkJCXByaW50ZigiTm8gYXJndW1lbnQgZ2l2ZW4gZm9yIG9wdGlvbiAlcywgYWJvcnRpbmcuXG4iLCBhcmd2Wy0xXSk7CisJCQkJZXhpdCAoLTMpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKCItZXhlYyIsICphcmd2LCAyKSkKKwkJeworCQkJZ0NtZC5zekV4ZWNmaWxlID0gKisrYXJndjsKKwkJCWlmICgtLWFyZ2MgPD0gMCB8fCAqKmFyZ3YgPT0gJy0nKQorCQkJewkKKwkJCQlwcmludGYoIk5vIGFyZ3VtZW50IGdpdmVuIGZvciBvcHRpb24gJXMsIGFib3J0aW5nLlxuIiwgYXJndlstMV0pOworCQkJCWV4aXQgKC00KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghc3RybmNtcCgiLXRlc3QiLCAqYXJndiwgMikpCisJCXsKKwkJCWdDbWQuYlRlc3QgPSB0cnVlOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKCItYmxpbmsiLCAqYXJndiwgMikpCisJCXsKKwkJCWdDbWQuYkJsaW5rID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ZigiVW5rbm93biBvcHRpb24gJXMsIGFib3J0aW5nLiBVc2UgJ3VhcnRfYm9vdCcgd2l0aG91dCBvcHRpb25zIGZvciBoZWxwLlxuIiwgKmFyZ3YpOworCQkJZXhpdCgtMSk7CisJCX0KKworCQlhcmd2Kys7CisJCWFyZ2MtLTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKwl0VWFydEhhbmRsZSBzZXJpYWxfaGFuZGxlOworCVVJTlQxNiByZWc7CisJRklMRSogcEZpbGU7CisJc2l6ZV90IHNpemU7CisJVUlOVDggYWJGaXJtd2FyZVs1MTIqMTAyNF07IC8vIGJsb2Nrc2l6ZQorCW1lbXNldChhYkZpcm13YXJlLCAweEZGLCBzaXplb2YoYWJGaXJtd2FyZSkpOworCisJUHJvY2Vzc0NtZExpbmUoYXJnYywgYXJndik7IC8vIHdoYXQgdG8gZG8KKworCWlmICghZ0NtZC5zelBvcnQpCisJeworCQlwcmludGYoIk5vIHNlcmlhbCBwb3J0IGdpdmVuLCB1c2UgJ3VhcnRfYm9vdCcgd2l0aG91dCBwYXJhbWV0ZXJzIGZvciBvcHRpb25zLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCXNlcmlhbF9oYW5kbGUgPSBVYXJ0T3BlbihnQ21kLnN6UG9ydCk7IC8vIG9wZW5pbmcgc2VyaWFsIHBvcnQKKwlpZiAoc2VyaWFsX2hhbmRsZSA9PSBOVUxMKQorCXsKKwkJcHJpbnRmKCJDYW5ub3Qgb3BlbiBwb3J0ICVzXG4iLCBnQ21kLnN6UG9ydCk7CisJCXJldHVybiAtMTsKKwl9CisJCQorCWlmIChnQ21kLmJOb0Rvd25sb2FkKQorCXsJLy8ganVzdCBzZXQgb3VyIHNwZWVkCisJCWlmICghVWFydENvbmZpZyhzZXJpYWxfaGFuZGxlLCBnQ21kLmJSZWNvcmRlciA/IDExNTIwMCA6IDE0NDAwLCBlTk9QQVJJVFksIGVPTkVTVE9QQklULCA4KSkKKwkJeworCQkJcHJpbnRmKCJFcnJvciBzZXR0aW5nIHVwIENPTSBwYXJhbXNcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwllbHNlCisJewkvLyBkb3dubG9hZCB0aGUgbW9uaXRvciBwcm9ncmFtCisJCWlmIChnQ21kLmJBcmNob3MpCisJCXsKKwkJCXByaW50ZigiV2FpdGluZyBmb3IgYm94IHN0YXJ0dXAgdG8gZG93bmxvYWQgbW9uaXRvci4uLiIpOworCQkJRG93bmxvYWRBcmNob3NNb25pdG9yKHNlcmlhbF9oYW5kbGUsICJtaW5pbW9uX3YyLmJpbiIpOyAvLyBsb2FkIHRoZSBtb25pdG9yIGltYWdlCisJCQlwcmludGYoIlxiXGJcYiBkb25lLlxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGYoIkRvd25sb2FkaW5nIG1vbml0b3IuLi4iKTsKKwkJCURvd25sb2FkTW9uaXRvcihzZXJpYWxfaGFuZGxlLCBnQ21kLmJSZWNvcmRlciwgIm1pbmltb24uYmluIik7IC8vIGxvYWQgdGhlIG1vbml0b3IgaW1hZ2UKKwkJCS8vIEZyb20gbm93IG9uLCB3ZSBjYW4gdGFsayB0byB0aGUgYm94LgorCQkJcHJpbnRmKCJcYlxiXGIgZG9uZS5cbiIpOworCisJCQlpZiAoZ0NtZC5iUmVjb3JkZXIpCisJCQl7CS8vIHdlIGNhbiBiZSBmYXN0ZXIKKwkJCQlTZXRUYXJnZXRCYXVkcmF0ZShzZXJpYWxfaGFuZGxlLCAxMTA1OTIwMCwgMTE1MjAwKTsgLy8gc2V0IHRvIDExNTIwMAorCQkJfQorCQl9CisJfQorCisJLy8gZG8gdGhlIGFjdGlvbgorCisJaWYgKGdDbWQuYlNwaW5kb3duKQorCXsKKwkJLy8gc3BpbmRvd24gdGhlIGRpc2sgKHdvcmtzIG9ubHkgZm9yIG1hc3RlcikKKwkJVUlOVDMyIGF0YTsgLy8gYWRkcmVzcyBvZiBBVEFfQUxUX1NUQVRVUworCQlwcmludGYoIkhhcmRkaXNrIHNwaW5kb3duLi4uIik7CisJCWF0YSA9IChnQ21kLmJSZWNvcmRlciAmJiAoUmVhZEhhbGZ3b3JkKHNlcmlhbF9oYW5kbGUsIDB4MDIwMDAwRkMpICYgMHgwMTAwKSkgPyAweDA2MjAwMjA2IDogMHgwNjIwMDMwNjsKKwkJV3JpdGVIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkNBLCAweEJGOTkpOyAvLyBQQUNSMiAod2FzIDB4RkY5OSkKKwkJV3JpdGVIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkM0LCAweDAyODApOyAvLyBQQUlPUiAod2FzIDB4MDAwMCkKKwkJV3JpdGVIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkMwLCAweEEyN0YpOyAvLyBQQURSICAod2FzIDB4QTBGRikKKwkJd2hpbGUgKFJlYWRCeXRlKHNlcmlhbF9oYW5kbGUsIGF0YSkgJiAweDgwKTsgLy8gQVRBX0FMVF9TVEFUVVMgJiBTVEFUVVNfQlNZCisJCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCAweDA2MTAwMTA3LCAweEUwKTsgLy8gQVRBX0NPTU1BTkQgPSBDTURfU1RBTkRCWV9JTU1FRElBVEU7CisJCS8vd2hpbGUgKFJlYWRCeXRlKHNlcmlhbF9oYW5kbGUsIGF0YSkgJiAweDgwKTsgLy8gQVRBX0FMVF9TVEFUVVMgJiBTVEFUVVNfQlNZCisJCXByaW50ZigiXGJcYlxiIGRvbmUuXG4iKTsKKwl9CisKKworCWlmIChnQ21kLmJSZWFkSUQpCisJeworCQlVSU5UOCBiTWFuLCBiSUQ7CisJCVJlYWRJRChzZXJpYWxfaGFuZGxlLCAweDAyMDAwMDAwLCAmYk1hbiwgJmJJRCk7CisJCXByaW50ZigiTWFudWZhY3R1cmVyIElEID0gMHglMDJYLCBEZXZpY2UgSUQgPSAweCUwMlhcbiIsIGJNYW4sIGJJRCk7CisJfQorCisKKwlpZiAoZ0NtZC5zekZsYXNoZmlsZSkKKwl7CisJCS8vIGZsYXNoIGEgZmlybXdhcmUgZmlsZQorCQlwcmludGYoIkZsYXNoaW5nIGZpbGUgJXMuLi4iLCBnQ21kLnN6Rmxhc2hmaWxlKTsKKwkJcEZpbGUgPSBmb3BlbihnQ21kLnN6Rmxhc2hmaWxlLCAicmIiKTsKKwkJaWYgKHBGaWxlID09IE5VTEwpCisJCXsKKwkJCXByaW50ZigiXG5GbGFzaCBmaWxlICVzIG5vdCBmb3VuZCwgZXhpdGluZy5cbiIsIGdDbWQuc3pGbGFzaGZpbGUpOworCQkJcmV0dXJuIC0yOworCQl9CisJCXNpemUgPSBmcmVhZChhYkZpcm13YXJlLCAxLCBzaXplb2YoYWJGaXJtd2FyZSksIHBGaWxlKTsKKwkJZmNsb3NlIChwRmlsZSk7CisJCQorCQlFcmFzZUNoaXAoc2VyaWFsX2hhbmRsZSwgMHgwMjAwMDAwMCk7CisJCUZsYXNoQnl0ZU11bHRpcGxlKHNlcmlhbF9oYW5kbGUsIDB4MDIwMDAwMDAsIHNpemUsIGFiRmlybXdhcmUpOworCQlwcmludGYoIlxiXGJcYiBkb25lLlxuIik7CisJfQorCisKKwlpZiAoZ0NtZC5zekR1bXBmaWxlKQorCXsKKwkJLy8gZHVtcCB0aGUgZmxhc2ggY29udGVudAorCQlwcmludGYoIldyaXRpbmcgZmxhc2ggZHVtcCBpbnRvIGZpbGUgJXMuLi4iLCBnQ21kLnN6RHVtcGZpbGUpOworCQlSZWFkQnl0ZU11bHRpcGxlKHNlcmlhbF9oYW5kbGUsIDB4MDIwMDAwMDAsIHNpemVvZihhYkZpcm13YXJlKSwgYWJGaXJtd2FyZSk7CisJCXBGaWxlID0gZm9wZW4oZ0NtZC5zekR1bXBmaWxlLCAid2IiKTsKKwkJaWYgKHBGaWxlID09IE5VTEwpCisJCXsKKwkJCXByaW50ZigiXG5EdW1wIGZpbGUgJXMgY2Fubm90IGJlIG9wZW5lZCwgZXhpdGluZy5cbiIsIGdDbWQuc3pEdW1wZmlsZSk7CisJCQlyZXR1cm4gLTM7CisJCX0KKwkJZndyaXRlKGFiRmlybXdhcmUsIDEsIHNpemVvZihhYkZpcm13YXJlKSwgcEZpbGUpOworCQlmY2xvc2UgKHBGaWxlKTsKKwkJcHJpbnRmKCJcYlxiXGIgZG9uZS5cbiIpOworCX0KKworCisJaWYgKGdDbWQuc3pFeGVjZmlsZSkKKwl7CisJCVVJTlQzMiBzaXplOworCQkKKwkJcHJpbnRmKCJEb3dubG9hZGluZyBwcm9ncmFtLi4uIik7CisKKwkJLy8gaW5pdCB0aGUgRFJBTSBjb250cm9sbGVyIGxpa2UgdGhlIGZsYXNoIGJvb3QgZG9lcworCQlyZWcgPSBSZWFkSGFsZndvcmQoc2VyaWFsX2hhbmRsZSwgMHgwNUZGRkZDQSk7IC8vIFBBQ1IyCisJCXJlZyAmPSAweEZGRkI7IC8vIFBBMSBjb25maWc6IC9SQVMKKwkJcmVnIHw9IDB4MDAwODsKKwkJV3JpdGVIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkNBLCByZWcpOyAvLyBQQUNSMgorCQlyZWcgPSAweEFGRkY7IC8vIENTMSwgQ1MzIGNvbmZpZzogL0NBU0guIC9DQVNMCisJCVdyaXRlSGFsZndvcmQoc2VyaWFsX2hhbmRsZSwgMHgwNUZGRkZFRSwgcmVnKTsgLy8gQ0FTQ1IKKwkJcmVnID0gUmVhZEhhbGZ3b3JkKHNlcmlhbF9oYW5kbGUsIDB4MDVGRkZGQTApOyAvLyBCQ1IgIAorCQlyZWcgfD0gMHg4MDAwOyAvLyBEUkFNIGVuYWJsZSwgZGVmYXVsdCBidXMgCisJCVdyaXRlSGFsZndvcmQoc2VyaWFsX2hhbmRsZSwgMHgwNUZGRkZBMCwgcmVnKTsgLy8gQkNSIAorCQlyZWcgPSBSZWFkSGFsZndvcmQoc2VyaWFsX2hhbmRsZSwgMHgwNUZGRkZBMik7IC8vIFdDUjEJIAorCQlyZWcgJj0gMHhGREZEOyAvLyAxLWN5Y2xlIENBUyAKKwkJV3JpdGVIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkEyLCByZWcpOyAvLyBXQ1IxCQorCQlyZWcgPSAweDBFMDA7IC8vIENBUyAzNSUsIG11bHRpcGxleGVkLCAxMCBiaXQgcm93IGFkZHIuCisJCVdyaXRlSGFsZndvcmQoc2VyaWFsX2hhbmRsZSwgMHgwNUZGRkZBOCwgcmVnKTsgLy8gRENSCisJCXJlZyA9IDB4NUFCMDsgLy8gcmVmcmVzaCwgNCBjeWNsZSB3YWl0c3RhdGUKKwkJV3JpdGVIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkFDLCByZWcpOyAvLyBSQ1IKKwkJcmVnID0gMHg5NjA1OyAvLyByZWZyZXNoIGNvbnN0YW50CisJCVdyaXRlSGFsZndvcmQoc2VyaWFsX2hhbmRsZSwgMHgwNUZGRkZCMiwgcmVnKTsgLy8gUlRDT1IKKwkJcmVnID0gMHhBNTE4OyAvLyBwaGkvMzIKKwkJV3JpdGVIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkFFLCByZWcpOyAvLyBSVENTUgorCisKKwkJLy8gZG93bmxvYWQgUm9ja2JveC9nZGIKKwkJcEZpbGUgPSBmb3BlbihnQ21kLnN6RXhlY2ZpbGUsICJyYiIpOworCQlpZiAocEZpbGUgPT0gTlVMTCkKKwkJeworCQkJcHJpbnRmKCJcbkV4ZWN1dGFibGUgZmlsZSAlcyBjYW5ub3QgYmUgb3BlbmVkLCBleGl0aW5nLlxuIiwgZ0NtZC5zekV4ZWNmaWxlKTsKKwkJCXJldHVybiAtMzsKKwkJfQorCisJCXNpemUgPSBmcmVhZChhYkZpcm13YXJlLCAxLCBzaXplb2YoYWJGaXJtd2FyZSksIHBGaWxlKTsKKwkJV3JpdGVCeXRlTXVsdGlwbGUoc2VyaWFsX2hhbmRsZSwgMHgwOTAwMDAwMCwgc2l6ZSwgYWJGaXJtd2FyZSk7CisJCWZjbG9zZSAocEZpbGUpOworCQlwcmludGYoIlxiXGJcYiBkb25lLlxuIik7CisKKwkJLy8gc3RhcnQgcm9ja2JveC9nZGIKKwkJcHJpbnRmKCJTdGFydGluZyBwcm9ncmFtLi4uIik7CisJCUV4ZWN1dGUoc2VyaWFsX2hhbmRsZSwgMHgwOTAwMDIwMCwgZmFsc2UpOworCQlwcmludGYoIlxiXGJcYiBkb25lLlxuIik7CisJfQorCisKKwlpZiAoZ0NtZC5iVGVzdCkKKwl7CisJCS8vIHRlc3QgY29kZTogcXVlcnkga2V5cGFkCisJCXdoaWxlICgxKQorCQl7CisJCQlXcml0ZUJ5dGUoc2VyaWFsX2hhbmRsZSwgMHgwNUZGRkVFOCwgMHgyNCk7IC8vIEFEQ1NSCisJCQl3aGlsZSAoIShSZWFkQnl0ZShzZXJpYWxfaGFuZGxlLCAweDA1RkZGRUU4KSAmIDB4ODApKTsKKwkJCXJlZyA9IFJlYWRIYWxmd29yZChzZXJpYWxfaGFuZGxlLCAweDA1RkZGRUUwKTsgLy8gQUREUkEKKwkJCXByaW50ZigiQURDKDQpOiAlZFxuIiwgcmVnPj42KTsKKwkJfQorCX0KKworCisJaWYgKGdDbWQuYkJsaW5rKQorCXsKKwkJLy8gYmxpbmtpbmcgTEVECisJCVVJTlQ4IGJ5dGU7CisJCXByaW50ZigiRmxhc2hpbmcgcmVkIExFRCBmb3JldmVyLi4uIChzdG9wIHdpdGggQ3RybC1DKVxuIik7CisJCWJ5dGUgPSBSZWFkQnl0ZShzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkMzKTsKKwkJd2hpbGUgKDEpCisJCXsKKwkJCWJ5dGUgXj0gMHg0MDsKKwkJCVdyaXRlQnl0ZShzZXJpYWxfaGFuZGxlLCAweDA1RkZGRkMzLCBieXRlKTsKKwkJCVNsZWVwKDIwMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZmxhc2gvdWFydF9ib290L3VhcnRfYm9vdC5kc3AgYi9mbGFzaC91YXJ0X2Jvb3QvdWFydF9ib290LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDk0YzcyCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvdWFydF9ib290L3VhcnRfYm9vdC5kc3AKQEAgLTAsMCArMSwxMzAgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0idWFydF9ib290IiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCitDRkc9dWFydF9ib290IC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidWFydF9ib290Lm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidWFydF9ib290Lm1hayIgQ0ZHPSJ1YXJ0X2Jvb3QgLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJ1YXJ0X2Jvb3QgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInVhcnRfYm9vdCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInVhcnRfYm9vdCAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWXUic3RkYWZ4LmgiIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0ZSIC9GRCAvYworIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA3IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDcgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInVhcnRfYm9vdCAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1l1InN0ZGFmeC5oIiAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GUiAvRkQgL0daIC9jCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDcgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwNyAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAidWFydF9ib290IC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAidWFydF9ib290IC0gV2luMzIgRGVidWciCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cY2xpZW50LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGZsYXNoLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHVhcnRfYm9vdC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx1YXJ0X3dpbi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxjbGllbnQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZmxhc2guaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cbWluaW1vbi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxzY2FsYXJfdHlwZXMuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cdWFydC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZmxhc2gvdWFydF9ib290L3VhcnRfd2luLmMgYi9mbGFzaC91YXJ0X2Jvb3QvdWFydF93aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMwMTdhCi0tLSAvZGV2L251bGwKKysrIGIvZmxhc2gvdWFydF9ib290L3VhcnRfd2luLmMKQEAgLTAsMCArMSwxMzggQEAKKy8vIFVBUlQgd3JhcHBlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFdpbjMyIHBsYXRmb3JtCisvLyBtYWtlIGEgbmV3IHZlcnNpb24gb2YgdGhpcyBmaWxlIGZvciBkaWZmZXJlbnQgc3lzdGVtcywgZS5nLiBMaW51eAorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgInNjYWxhcl90eXBlcy5oIiAvLyAoVSlJTlQ4LzE2LzMyCisjaW5jbHVkZSAiVWFydC5oIgorCisvLyBDT014IGZvciB3aW5kb3dzLCByZXR1cm5zIE5VTEwgb24gZXJyb3IKK3RVYXJ0SGFuZGxlIFVhcnRPcGVuKGNoYXIqIHN6UG9ydE5hbWUpCit7CisJSEFORExFIHNlcmlhbF9oYW5kbGU7IAorCURDQiAgZGNiOworCUNPTU1USU1FT1VUUyBjdG8gPSB7IDAsIDAsIDAsIDAsIDAgfTsKKworCW1lbXNldCgmZGNiLDAsc2l6ZW9mKGRjYikpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvLyBzZXQgRENCIHRvIGNvbmZpZ3VyZSB0aGUgc2VyaWFsIHBvcnQKKwlkY2IuRENCbGVuZ3RoICAgICAgID0gc2l6ZW9mKGRjYik7CisKKwlkY2IuZk91dHhDdHNGbG93ICAgID0gMDsKKwlkY2IuZk91dHhEc3JGbG93ICAgID0gMDsKKwlkY2IuZkR0ckNvbnRyb2wgICAgID0gRFRSX0NPTlRST0xfRU5BQkxFOyAvLyBlbmFibGUgZm9yIHBvd2VyCisJZGNiLmZEc3JTZW5zaXRpdml0eSA9IDA7CisJZGNiLmZSdHNDb250cm9sICAgICA9IFJUU19DT05UUk9MX0VOQUJMRTsgLy8gZW5hYmxlIGZvciBwb3dlcgorCWRjYi5mT3V0WCAgICAgICAgICAgPSAwOworCWRjYi5mSW5YICAgICAgICAgICAgPSAwOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0gbWlzYyBwYXJhbWV0ZXJzIC0tLS0tICovCisJZGNiLmZFcnJvckNoYXIgICAgICA9IDA7CisJZGNiLmZCaW5hcnkgICAgICAgICA9IDE7CisJZGNiLmZOdWxsICAgICAgICAgICA9IDA7CisJZGNiLmZBYm9ydE9uRXJyb3IgICA9IDA7CisJZGNiLndSZXNlcnZlZCAgICAgICA9IDA7CisJZGNiLlhvbkxpbSAgICAgICAgICA9IDI7CisJZGNiLlhvZmZMaW0gICAgICAgICA9IDQ7CisJZGNiLlhvbkNoYXIgICAgICAgICA9IDB4MTM7CisJZGNiLlhvZmZDaGFyICAgICAgICA9IDB4MTk7CisJZGNiLkV2dENoYXIgICAgICAgICA9IDA7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLSAqLworCWRjYi5CYXVkUmF0ZSA9IDQ4MDA7CisJZGNiLlBhcml0eSAgID0gTk9QQVJJVFk7CisJZGNiLmZQYXJpdHkgID0gMDsKKwlkY2IuU3RvcEJpdHMgPSBPTkVTVE9QQklUOworCWRjYi5CeXRlU2l6ZSA9IDg7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLy8gb3BlbmluZyBzZXJpYWwgcG9ydAorCXNlcmlhbF9oYW5kbGUgPSBDcmVhdGVGaWxlKHN6UG9ydE5hbWUsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsCisJCTAsIE5VTEwsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19XUklURV9USFJPVUdILCBOVUxMKTsKKworCWlmIChzZXJpYWxfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCXsKKwkJLy9wcmludGYoIkNhbm5vdCBvcGVuIHBvcnQgXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJU2V0Q29tbU1hc2soc2VyaWFsX2hhbmRsZSwgMCk7CisJU2V0Q29tbVRpbWVvdXRzKHNlcmlhbF9oYW5kbGUsICZjdG8pOworCisJaWYoIVNldENvbW1TdGF0ZShzZXJpYWxfaGFuZGxlLCAmZGNiKSkKKwl7CisJCS8vcHJpbnRmKCJFcnJvciBzZXR0aW5nIHVwIENPTSBwYXJhbXNcbiIpOworCQlDbG9zZUhhbmRsZShzZXJpYWxfaGFuZGxlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHNlcmlhbF9oYW5kbGU7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBlcnJvcgorYm9vbCBVYXJ0Q29uZmlnKHRVYXJ0SGFuZGxlIGhhbmRsZSwgbG9uZyBsQmF1ZFJhdGUsIHRQYXJpdHkgblBhcml0eSwgdFN0b3BCaXRzIG5TdG9wQml0cywgaW50IG5CeXRlU2l6ZSkKK3sKKwlEQ0IgIGRjYjsKKwkKKwlpZiAoIUdldENvbW1TdGF0ZSAoaGFuZGxlLCAmZGNiKSkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlkY2IuQmF1ZFJhdGUgPSBsQmF1ZFJhdGU7CisJZGNiLlBhcml0eQkgPSBuUGFyaXR5OworCWRjYi5TdG9wQml0cyA9IG5TdG9wQml0czsKKwlkY2IuQnl0ZVNpemUgPSBuQnl0ZVNpemU7CisKKwlpZighU2V0Q29tbVN0YXRlKGhhbmRsZSwgJmRjYikpCisJeworCQkvL0RXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisJCS8vcHJpbnRmKCJFcnJvciAlZCBzZXR0aW5nIHVwIENPTSBwYXJhbXMgZm9yIGJhdWRyYXRlIGJ5dGVcbiIsIGR3RXJyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvLyByZXR1cm5zIGhvdyBtdWNoIGRhdGEgd2FzIGFjdHVhbGx5IHRyYW5zbWl0dGVkCitsb25nIFVhcnRXcml0ZSh0VWFydEhhbmRsZSBoYW5kbGUsIHVuc2lnbmVkIGNoYXIqIHBEYXRhLCBsb25nIGxTaXplKQoreworCUJPT0wgc3VjY2VzczsKKwlEV09SRCByZXN1bHRfbmJyOworCisJc3VjY2VzcyA9IFdyaXRlRmlsZShoYW5kbGUsIHBEYXRhLCBsU2l6ZSwgJnJlc3VsdF9uYnIsIE5VTEwpOworCisJaWYoIXN1Y2Nlc3MpCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0X25icjsKK30KKworLy8gcmV0dXJucyBob3cgbXVjaCBkYXRhIHdhcyBhY3R1YWxseSByZWNlaXZlZAorbG9uZyBVYXJ0UmVhZCh0VWFydEhhbmRsZSBoYW5kbGUsIHVuc2lnbmVkIGNoYXIqIHBCdWZmZXIsIGxvbmcgbFNpemUpCit7CisJQk9PTCBzdWNjZXNzOworCURXT1JEIHJlYWRfbmJyOworCisJc3VjY2VzcyA9IFJlYWRGaWxlKGhhbmRsZSwgcEJ1ZmZlciwgbFNpemUsICZyZWFkX25iciwgTlVMTCk7CisJaWYoIXN1Y2Nlc3MpCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcmVhZF9uYnI7Cit9CisKKwordm9pZCBVYXJ0Q2xvc2UodFVhcnRIYW5kbGUgaGFuZGxlKQoreworCWlmIChoYW5kbGUgIT0gTlVMTCkKKwl7CisJCUNsb3NlSGFuZGxlKGhhbmRsZSk7CisJfQorCisJcmV0dXJuOworfQo=