IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCiBpZiB0ZXN0ICJ6JCoiID0genZlcnNpb24gXAogfHwgdGVzdCAieiQqIiA9IHotLXZlcnNpb247IFwKIHRoZW4gXAoJZWNobyAnZ2l0LWd1aSB2ZXJzaW9uIEBAR0lUR1VJX1ZFUlNJT05AQCc7IFwKCWV4aXQ7IFwKIGZpOyBcCiBleGVjIHdpc2ggIiQwIiAtLSAiJEAiCgpzZXQgYXBwdmVycyB7QEBHSVRHVUlfVkVSU0lPTkBAfQpzZXQgY29weXJpZ2h0IHsKQ29weXJpZ2h0IKkgMjAwNiwgMjAwNyBTaGF3biBQZWFyY2UsIGV0LiBhbC4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQX0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgVGNsL1RrIHNhbml0eSBjaGVjawoKaWYge1tjYXRjaCB7cGFja2FnZSByZXF1aXJlIFRjbCA4LjR9IGVycl0KIHx8IFtjYXRjaCB7cGFja2FnZSByZXF1aXJlIFRrICA4LjR9IGVycl0KfSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCXRrX21lc3NhZ2VCb3ggXAoJCS1pY29uIGVycm9yIFwKCQktdHlwZSBvayBcCgkJLXRpdGxlICJnaXQtZ3VpOiBmYXRhbCBlcnJvciIgXAoJCS1tZXNzYWdlICRlcnIKCWV4aXQgMQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGNvbmZpZ3VyZSBvdXIgbGlicmFyeQoKc2V0IG9ndWlsaWIge0BAR0lUR1VJX0xJQkRJUkBAfQpzZXQgb2d1aXJlbCB7QEBHSVRHVUlfUkVMQVRJVkVAQH0KaWYgeyRvZ3VpcmVsIGVxIHsxfX0gewoJc2V0IG9ndWlsaWIgW2ZpbGUgZGlybmFtZSBbZmlsZSBkaXJuYW1lIFtmaWxlIG5vcm1hbGl6ZSAkYXJndjBdXV0KCXNldCBvZ3VpbGliIFtmaWxlIGpvaW4gJG9ndWlsaWIgc2hhcmUgZ2l0LWd1aSBsaWJdCn0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoIEBAKiAkb2d1aXJlbF19IHsKCXNldCBvZ3VpbGliIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXV0gbGliXQp9CnNldCBpZHggW2ZpbGUgam9pbiAkb2d1aWxpYiB0Y2xJbmRleF0KY2F0Y2ggewoJc2V0IGZkIFtvcGVuICRpZHggcl0KCWlmIHtbZ2V0cyAkZmRdIGVxIHsjIEF1dG9nZW5lcmF0ZWQgYnkgZ2l0LWd1aSBNYWtlZmlsZX19IHsKCQlzZXQgaWR4IFtsaXN0XQoJCXdoaWxlIHtbZ2V0cyAkZmQgbl0gPj0gMH0gewoJCQlpZiB7JG4gbmUge30gJiYgIVtzdHJpbmcgbWF0Y2ggIyogJG5dfSB7CgkJCQlsYXBwZW5kIGlkeCAkbgoJCQl9CgkJfQoJfSBlbHNlIHsKCQlzZXQgaWR4IHt9Cgl9CgljbG9zZSAkZmQKfQppZiB7JGlkeCBuZSB7fX0gewoJc2V0IGxvYWRlZCBbbGlzdF0KCWZvcmVhY2ggcCAkaWR4IHsKCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRsb2FkZWQgJHBdID49IDB9IGNvbnRpbnVlCgkJcHV0cyAkcAoJCXNvdXJjZSBbZmlsZSBqb2luICRvZ3VpbGliICRwXQoJCWxhcHBlbmQgbG9hZGVkICRwCgl9Cgl1bnNldCBsb2FkZWQgcAp9IGVsc2UgewoJc2V0IGF1dG9fcGF0aCBbY29uY2F0IFtsaXN0ICRvZ3VpbGliXSAkYXV0b19wYXRoXQp9CnVuc2V0IC1ub2NvbXBsYWluIG9ndWlsaWIgb2d1aXJlbCBpZHggZmQKCmlmIHshW2NhdGNoIHtzZXQgX3ZlcmJvc2UgJGVudihHSVRHVUlfVkVSQk9TRSl9XX0gewoJdW5zZXQgX3ZlcmJvc2UKCXJlbmFtZSBhdXRvX2xvYWQgcmVhbF9fYXV0b19sb2FkCglwcm9jIGF1dG9fbG9hZCB7bmFtZSBhcmdzfSB7CgkJcHV0cyBzdGRlcnIgImF1dG9fbG9hZCAkbmFtZSIKCQlyZXR1cm4gW3VwbGV2ZWwgMSByZWFsX19hdXRvX2xvYWQgJG5hbWUgJGFyZ3NdCgl9CglyZW5hbWUgc291cmNlIHJlYWxfX3NvdXJjZQoJcHJvYyBzb3VyY2Uge25hbWV9IHsKCQlwdXRzIHN0ZGVyciAic291cmNlICAgICRuYW1lIgoJCXVwbGV2ZWwgMSByZWFsX19zb3VyY2UgJG5hbWUKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyByZWFkIG9ubHkgZ2xvYmFscwoKc2V0IF9hcHBuYW1lIFtsaW5kZXggW2ZpbGUgc3BsaXQgJGFyZ3YwXSBlbmRdCnNldCBfZ2l0ZGlyIHt9CnNldCBfZ2l0ZXhlYyB7fQpzZXQgX3JlcG9uYW1lIHt9CnNldCBfaXNjeWd3aW4ge30KCnByb2MgYXBwbmFtZSB7fSB7CglnbG9iYWwgX2FwcG5hbWUKCXJldHVybiAkX2FwcG5hbWUKfQoKcHJvYyBnaXRkaXIge2FyZ3N9IHsKCWdsb2JhbCBfZ2l0ZGlyCglpZiB7JGFyZ3MgZXEge319IHsKCQlyZXR1cm4gJF9naXRkaXIKCX0KCXJldHVybiBbZXZhbCBbY29uY2F0IFtsaXN0IGZpbGUgam9pbiAkX2dpdGRpcl0gJGFyZ3NdXQp9Cgpwcm9jIGdpdGV4ZWMge2FyZ3N9IHsKCWdsb2JhbCBfZ2l0ZXhlYwoJaWYgeyRfZ2l0ZXhlYyBlcSB7fX0gewoJCWlmIHtbY2F0Y2gge3NldCBfZ2l0ZXhlYyBbZ2l0IC0tZXhlYy1wYXRoXX0gZXJyXX0gewoJCQllcnJvciAiR2l0IG5vdCBpbnN0YWxsZWQ/XG5cbiRlcnIiCgkJfQoJfQoJaWYgeyRhcmdzIGVxIHt9fSB7CgkJcmV0dXJuICRfZ2l0ZXhlYwoJfQoJcmV0dXJuIFtldmFsIFtjb25jYXQgW2xpc3QgZmlsZSBqb2luICRfZ2l0ZXhlY10gJGFyZ3NdXQp9Cgpwcm9jIHJlcG9uYW1lIHt9IHsKCWdsb2JhbCBfcmVwb25hbWUKCXJldHVybiAkX3JlcG9uYW1lCn0KCnByb2MgaXNfTWFjT1NYIHt9IHsKCWdsb2JhbCB0Y2xfcGxhdGZvcm0gdGtfbGlicmFyeQoJaWYge1t0ayB3aW5kb3dpbmdzeXN0ZW1dIGVxIHthcXVhfX0gewoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIGlzX1dpbmRvd3Mge30gewoJZ2xvYmFsIHRjbF9wbGF0Zm9ybQoJaWYgeyR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIGVxIHt3aW5kb3dzfX0gewoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIGlzX0N5Z3dpbiB7fSB7CglnbG9iYWwgdGNsX3BsYXRmb3JtIF9pc2N5Z3dpbgoJaWYgeyRfaXNjeWd3aW4gZXEge319IHsKCQlpZiB7JHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgZXEge3dpbmRvd3N9fSB7CgkJCWlmIHtbY2F0Y2gge3NldCBwIFtleGVjIGN5Z3BhdGggLS13aW5kaXJdfSBlcnJdfSB7CgkJCQlzZXQgX2lzY3lnd2luIDAKCQkJfSBlbHNlIHsKCQkJCXNldCBfaXNjeWd3aW4gMQoJCQl9CgkJfSBlbHNlIHsKCQkJc2V0IF9pc2N5Z3dpbiAwCgkJfQoJfQoJcmV0dXJuICRfaXNjeWd3aW4KfQoKcHJvYyBpc19lbmFibGVkIHtvcHRpb259IHsKCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKCWlmIHtbY2F0Y2gge3NldCBvbiAkZW5hYmxlZF9vcHRpb25zKCRvcHRpb24pfV19IHtyZXR1cm4gMH0KCXJldHVybiAkb24KfQoKcHJvYyBlbmFibGVfb3B0aW9uIHtvcHRpb259IHsKCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKCXNldCBlbmFibGVkX29wdGlvbnMoJG9wdGlvbikgMQp9Cgpwcm9jIGRpc2FibGVfb3B0aW9uIHtvcHRpb259IHsKCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKCXNldCBlbmFibGVkX29wdGlvbnMoJG9wdGlvbikgMAp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGNvbmZpZwoKcHJvYyBpc19tYW55X2NvbmZpZyB7bmFtZX0gewoJc3dpdGNoIC1nbG9iIC0tICRuYW1lIHsKCXJlbW90ZS4qLmZldGNoIC0KCXJlbW90ZS4qLnB1c2gKCQl7cmV0dXJuIDF9CgkqCgkJe3JldHVybiAwfQoJfQp9Cgpwcm9jIGlzX2NvbmZpZ190cnVlIHtuYW1lfSB7CglnbG9iYWwgcmVwb19jb25maWcKCWlmIHtbY2F0Y2gge3NldCB2ICRyZXBvX2NvbmZpZygkbmFtZSl9XX0gewoJCXJldHVybiAwCgl9IGVsc2VpZiB7JHYgZXEge3RydWV9IHx8ICR2IGVxIHsxfSB8fCAkdiBlcSB7eWVzfX0gewoJCXJldHVybiAxCgl9IGVsc2UgewoJCXJldHVybiAwCgl9Cn0KCnByb2MgbG9hZF9jb25maWcge2luY2x1ZGVfZ2xvYmFsfSB7CglnbG9iYWwgcmVwb19jb25maWcgZ2xvYmFsX2NvbmZpZyBkZWZhdWx0X2NvbmZpZwoKCWFycmF5IHVuc2V0IGdsb2JhbF9jb25maWcKCWlmIHskaW5jbHVkZV9nbG9iYWx9IHsKCQljYXRjaCB7CgkJCXNldCBmZF9yYyBbb3BlbiAifCBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tbGlzdCIgcl0KCQkJd2hpbGUge1tnZXRzICRmZF9yYyBsaW5lXSA+PSAwfSB7CgkJCQlpZiB7W3JlZ2V4cCB7XihbXj1dKyk9KC4qKSR9ICRsaW5lIGxpbmUgbmFtZSB2YWx1ZV19IHsKCQkJCQlpZiB7W2lzX21hbnlfY29uZmlnICRuYW1lXX0gewoJCQkJCQlsYXBwZW5kIGdsb2JhbF9jb25maWcoJG5hbWUpICR2YWx1ZQoJCQkJCX0gZWxzZSB7CgkJCQkJCXNldCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJCQl9CgkJCQl9CgkJCX0KCQkJY2xvc2UgJGZkX3JjCgkJfQoJfQoKCWFycmF5IHVuc2V0IHJlcG9fY29uZmlnCgljYXRjaCB7CgkJc2V0IGZkX3JjIFtvcGVuICJ8IGdpdCBjb25maWcgLS1saXN0IiByXQoJCXdoaWxlIHtbZ2V0cyAkZmRfcmMgbGluZV0gPj0gMH0gewoJCQlpZiB7W3JlZ2V4cCB7XihbXj1dKyk9KC4qKSR9ICRsaW5lIGxpbmUgbmFtZSB2YWx1ZV19IHsKCQkJCWlmIHtbaXNfbWFueV9jb25maWcgJG5hbWVdfSB7CgkJCQkJbGFwcGVuZCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCQl9IGVsc2UgewoJCQkJCXNldCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCQl9CgkJCX0KCQl9CgkJY2xvc2UgJGZkX3JjCgl9CgoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10gewoJCWlmIHtbY2F0Y2gge3NldCB2ICRnbG9iYWxfY29uZmlnKCRuYW1lKX1dfSB7CgkJCXNldCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkZGVmYXVsdF9jb25maWcoJG5hbWUpCgkJfQoJCWlmIHtbY2F0Y2gge3NldCB2ICRyZXBvX2NvbmZpZygkbmFtZSl9XX0gewoJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKCQl9Cgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgaGFuZHkgdXRpbHMKCnByb2MgZ2l0IHthcmdzfSB7CglyZXR1cm4gW2V2YWwgZXhlYyBnaXQgJGFyZ3NdCn0KCmF1dG9fbG9hZCB0a19vcHRpb25NZW51CnJlbmFtZSB0a19vcHRpb25NZW51IHJlYWxfX3RrT3B0aW9uTWVudQpwcm9jIHRrX29wdGlvbk1lbnUge3cgdmFyTmFtZSBhcmdzfSB7CglzZXQgbSBbZXZhbCByZWFsX190a09wdGlvbk1lbnUgJHcgJHZhck5hbWUgJGFyZ3NdCgkkbSBjb25maWd1cmUgLWZvbnQgZm9udF91aQoJJHcgY29uZmlndXJlIC1mb250IGZvbnRfdWkKCXJldHVybiAkbQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHZlcnNpb24gY2hlY2sKCnNldCByZXFfbWFqIDEKc2V0IHJlcV9taW4gNQoKaWYge1tjYXRjaCB7c2V0IHYgW2dpdCAtLXZlcnNpb25dfSBlcnJdfSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJDYW5ub3QgZGV0ZXJtaW5lIEdpdCB2ZXJzaW9uOgoKJGVycgoKW2FwcG5hbWVdIHJlcXVpcmVzIEdpdCAkcmVxX21hai4kcmVxX21pbiBvciBsYXRlci4iCglleGl0IDEKfQppZiB7W3JlZ2V4cCB7XmdpdCB2ZXJzaW9uIChcZCspXC4oXGQrKX0gJHYgX2p1bmsgYWN0X21haiBhY3RfbWluXX0gewoJaWYgeyRhY3RfbWFqIDwgJHJlcV9tYWoKCQl8fCAoJGFjdF9tYWogPT0gJHJlcV9tYWogJiYgJGFjdF9taW4gPCAkcmVxX21pbil9IHsKCQljYXRjaCB7d20gd2l0aGRyYXcgLn0KCQllcnJvcl9wb3B1cCAiW2FwcG5hbWVdIHJlcXVpcmVzIEdpdCAkcmVxX21hai4kcmVxX21pbiBvciBsYXRlci4KCllvdSBhcmUgdXNpbmcgJHYuIgoJCWV4aXQgMQoJfQp9IGVsc2UgewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiQ2Fubm90IHBhcnNlIEdpdCB2ZXJzaW9uIHN0cmluZzpcblxuJHYiCglleGl0IDEKfQp1bnNldCAtbm9jb21wbGFpbiB2IF9qdW5rIGFjdF9tYWogYWN0X21pbiByZXFfbWFqIHJlcV9taW4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgcmVwb3NpdG9yeSBzZXR1cAoKaWYge1tjYXRjaCB7CgkJc2V0IF9naXRkaXIgJGVudihHSVRfRElSKQoJCXNldCBfcHJlZml4IHt9CgkJfV0KCSYmIFtjYXRjaCB7CgkJc2V0IF9naXRkaXIgW2dpdCByZXYtcGFyc2UgLS1naXQtZGlyXQoJCXNldCBfcHJlZml4IFtnaXQgcmV2LXBhcnNlIC0tc2hvdy1wcmVmaXhdCgl9IGVycl19IHsKCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJZXJyb3JfcG9wdXAgIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5OlxuXG4kZXJyIgoJZXhpdCAxCn0KaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkX2dpdGRpcl0gJiYgW2lzX0N5Z3dpbl19IHsKCWNhdGNoIHtzZXQgX2dpdGRpciBbZXhlYyBjeWdwYXRoIC0tdW5peCAkX2dpdGRpcl19Cn0KaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkX2dpdGRpcl19IHsKCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJZXJyb3JfcG9wdXAgIkdpdCBkaXJlY3Rvcnkgbm90IGZvdW5kOlxuXG4kX2dpdGRpciIKCWV4aXQgMQp9CmlmIHtbbGluZGV4IFtmaWxlIHNwbGl0ICRfZ2l0ZGlyXSBlbmRdIG5lIHsuZ2l0fX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiQ2Fubm90IHVzZSBmdW5ueSAuZ2l0IGRpcmVjdG9yeTpcblxuJF9naXRkaXIiCglleGl0IDEKfQppZiB7W2NhdGNoIHtjZCBbZmlsZSBkaXJuYW1lICRfZ2l0ZGlyXX0gZXJyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiTm8gd29ya2luZyBkaXJlY3RvcnkgW2ZpbGUgZGlybmFtZSAkX2dpdGRpcl06XG5cbiRlcnIiCglleGl0IDEKfQpzZXQgX3JlcG9uYW1lIFtsaW5kZXggW2ZpbGUgc3BsaXQgXAoJW2ZpbGUgbm9ybWFsaXplIFtmaWxlIGRpcm5hbWUgJF9naXRkaXJdXV0gXAoJZW5kXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBnbG9iYWwgaW5pdAoKc2V0IGN1cnJlbnRfZGlmZl9wYXRoIHt9CnNldCBjdXJyZW50X2RpZmZfc2lkZSB7fQpzZXQgZGlmZl9hY3Rpb25zIFtsaXN0XQpzZXQgdWlfc3RhdHVzX3ZhbHVlIHtJbml0aWFsaXppbmcuLi59CgpzZXQgSEVBRCB7fQpzZXQgUEFSRU5UIHt9CnNldCBNRVJHRV9IRUFEIFtsaXN0XQpzZXQgY29tbWl0X3R5cGUge30Kc2V0IGVtcHR5X3RyZWUge30Kc2V0IGN1cnJlbnRfYnJhbmNoIHt9CnNldCBjdXJyZW50X2RpZmZfcGF0aCB7fQpzZXQgc2VsZWN0ZWRfY29tbWl0X3R5cGUgbmV3CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHRhc2sgbWFuYWdlbWVudAoKc2V0IHJlc2Nhbl9hY3RpdmUgMApzZXQgZGlmZl9hY3RpdmUgMApzZXQgbGFzdF9jbGlja2VkIHt9CgpzZXQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0XQpzZXQgaW5kZXhfbG9ja190eXBlIG5vbmUKCnByb2MgbG9ja19pbmRleCB7dHlwZX0gewoJZ2xvYmFsIGluZGV4X2xvY2tfdHlwZSBkaXNhYmxlX29uX2xvY2sKCglpZiB7JGluZGV4X2xvY2tfdHlwZSBlcSB7bm9uZX19IHsKCQlzZXQgaW5kZXhfbG9ja190eXBlICR0eXBlCgkJZm9yZWFjaCB3ICRkaXNhYmxlX29uX2xvY2sgewoJCQl1cGxldmVsICMwICR3IGRpc2FibGVkCgkJfQoJCXJldHVybiAxCgl9IGVsc2VpZiB7JGluZGV4X2xvY2tfdHlwZSBlcSAiYmVnaW4tJHR5cGUifSB7CgkJc2V0IGluZGV4X2xvY2tfdHlwZSAkdHlwZQoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIHVubG9ja19pbmRleCB7fSB7CglnbG9iYWwgaW5kZXhfbG9ja190eXBlIGRpc2FibGVfb25fbG9jawoKCXNldCBpbmRleF9sb2NrX3R5cGUgbm9uZQoJZm9yZWFjaCB3ICRkaXNhYmxlX29uX2xvY2sgewoJCXVwbGV2ZWwgIzAgJHcgbm9ybWFsCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgc3RhdHVzCgpwcm9jIHJlcG9zaXRvcnlfc3RhdGUge2N0dmFyIGhkdmFyIG1odmFyfSB7CglnbG9iYWwgY3VycmVudF9icmFuY2gKCXVwdmFyICRjdHZhciBjdCAkaGR2YXIgaGQgJG1odmFyIG1oCgoJc2V0IG1oIFtsaXN0XQoKCWlmIHtbY2F0Y2gge3NldCBjdXJyZW50X2JyYW5jaCBbZ2l0IHN5bWJvbGljLXJlZiBIRUFEXX1dfSB7CgkJc2V0IGN1cnJlbnRfYnJhbmNoIHt9Cgl9IGVsc2UgewoJCXJlZ3N1YiBecmVmcy8oKGhlYWRzfHRhZ3N8cmVtb3RlcykvKT8gXAoJCQkkY3VycmVudF9icmFuY2ggXAoJCQl7fSBcCgkJCWN1cnJlbnRfYnJhbmNoCgl9CgoJaWYge1tjYXRjaCB7c2V0IGhkIFtnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURdfV19IHsKCQlzZXQgaGQge30KCQlzZXQgY3QgaW5pdGlhbAoJCXJldHVybgoJfQoKCXNldCBtZXJnZV9oZWFkIFtnaXRkaXIgTUVSR0VfSEVBRF0KCWlmIHtbZmlsZSBleGlzdHMgJG1lcmdlX2hlYWRdfSB7CgkJc2V0IGN0IG1lcmdlCgkJc2V0IGZkX21oIFtvcGVuICRtZXJnZV9oZWFkIHJdCgkJd2hpbGUge1tnZXRzICRmZF9taCBsaW5lXSA+PSAwfSB7CgkJCWxhcHBlbmQgbWggJGxpbmUKCQl9CgkJY2xvc2UgJGZkX21oCgkJcmV0dXJuCgl9CgoJc2V0IGN0IG5vcm1hbAp9Cgpwcm9jIFBBUkVOVCB7fSB7CglnbG9iYWwgUEFSRU5UIGVtcHR5X3RyZWUKCglzZXQgcCBbbGluZGV4ICRQQVJFTlQgMF0KCWlmIHskcCBuZSB7fX0gewoJCXJldHVybiAkcAoJfQoJaWYgeyRlbXB0eV90cmVlIGVxIHt9fSB7CgkJc2V0IGVtcHR5X3RyZWUgW2dpdCBta3RyZWUgPDwge31dCgl9CglyZXR1cm4gJGVtcHR5X3RyZWUKfQoKcHJvYyByZXNjYW4ge2FmdGVyIHtob25vcl90cnVzdG10aW1lIDF9fSB7CglnbG9iYWwgSEVBRCBQQVJFTlQgTUVSR0VfSEVBRCBjb21taXRfdHlwZQoJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIgdWlfc3RhdHVzX3ZhbHVlIHVpX2NvbW0KCWdsb2JhbCByZXNjYW5fYWN0aXZlIGZpbGVfc3RhdGVzCglnbG9iYWwgcmVwb19jb25maWcKCglpZiB7JHJlc2Nhbl9hY3RpdmUgPiAwIHx8ICFbbG9ja19pbmRleCByZWFkXX0gcmV0dXJuCgoJcmVwb3NpdG9yeV9zdGF0ZSBuZXdUeXBlIG5ld0hFQUQgbmV3TUVSR0VfSEVBRAoJaWYge1tzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV0KCQkmJiAkbmV3VHlwZSBlcSB7bm9ybWFsfQoJCSYmICRuZXdIRUFEIGVxICRIRUFEfSB7Cgl9IGVsc2UgewoJCXNldCBIRUFEICRuZXdIRUFECgkJc2V0IFBBUkVOVCAkbmV3SEVBRAoJCXNldCBNRVJHRV9IRUFEICRuZXdNRVJHRV9IRUFECgkJc2V0IGNvbW1pdF90eXBlICRuZXdUeXBlCgl9CgoJYXJyYXkgdW5zZXQgZmlsZV9zdGF0ZXMKCglpZiB7IVskdWlfY29tbSBlZGl0IG1vZGlmaWVkXQoJCXx8IFtzdHJpbmcgdHJpbSBbJHVpX2NvbW0gZ2V0IDAuMCBlbmRdXSBlcSB7fX0gewoJCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJfSBlbHNlaWYge1tsb2FkX21lc3NhZ2UgR0lUR1VJX01TR119IHsKCQl9IGVsc2VpZiB7W2xvYWRfbWVzc2FnZSBNRVJHRV9NU0ddfSB7CgkJfSBlbHNlaWYge1tsb2FkX21lc3NhZ2UgU1FVQVNIX01TR119IHsKCQl9CgkJJHVpX2NvbW0gZWRpdCByZXNldAoJCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKCX0KCglpZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJCWxvYWRfYWxsX2hlYWRzCgkJcG9wdWxhdGVfYnJhbmNoX21lbnUKCX0KCglpZiB7JGhvbm9yX3RydXN0bXRpbWUgJiYgJHJlcG9fY29uZmlnKGd1aS50cnVzdG10aW1lKSBlcSB7dHJ1ZX19IHsKCQlyZXNjYW5fc3RhZ2UyIHt9ICRhZnRlcgoJfSBlbHNlIHsKCQlzZXQgcmVzY2FuX2FjdGl2ZSAxCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVmcmVzaGluZyBmaWxlIHN0YXR1cy4uLn0KCQlzZXQgY21kIFtsaXN0IGdpdCB1cGRhdGUtaW5kZXhdCgkJbGFwcGVuZCBjbWQgLXEKCQlsYXBwZW5kIGNtZCAtLXVubWVyZ2VkCgkJbGFwcGVuZCBjbWQgLS1pZ25vcmUtbWlzc2luZwoJCWxhcHBlbmQgY21kIC0tcmVmcmVzaAoJCXNldCBmZF9yZiBbb3BlbiAifCAkY21kIiByXQoJCWZjb25maWd1cmUgJGZkX3JmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQlmaWxlZXZlbnQgJGZkX3JmIHJlYWRhYmxlIFwKCQkJW2xpc3QgcmVzY2FuX3N0YWdlMiAkZmRfcmYgJGFmdGVyXQoJfQp9Cgpwcm9jIHJlc2Nhbl9zdGFnZTIge2ZkIGFmdGVyfSB7CglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgcmVzY2FuX2FjdGl2ZSBidWZfcmRpIGJ1Zl9yZGYgYnVmX3JsbwoKCWlmIHskZmQgbmUge319IHsKCQlyZWFkICRmZAoJCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCQljbG9zZSAkZmQKCX0KCglzZXQgbHNfb3RoZXJzIFtsaXN0IHwgZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC16IFwKCQktLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlXQoJc2V0IGluZm9fZXhjbHVkZSBbZ2l0ZGlyIGluZm8gZXhjbHVkZV0KCWlmIHtbZmlsZSByZWFkYWJsZSAkaW5mb19leGNsdWRlXX0gewoJCWxhcHBlbmQgbHNfb3RoZXJzICItLWV4Y2x1ZGUtZnJvbT0kaW5mb19leGNsdWRlIgoJfQoKCXNldCBidWZfcmRpIHt9CglzZXQgYnVmX3JkZiB7fQoJc2V0IGJ1Zl9ybG8ge30KCglzZXQgcmVzY2FuX2FjdGl2ZSAzCglzZXQgdWlfc3RhdHVzX3ZhbHVlIHtTY2FubmluZyBmb3IgbW9kaWZpZWQgZmlsZXMgLi4ufQoJc2V0IGZkX2RpIFtvcGVuICJ8IGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC16IFtQQVJFTlRdIiByXQoJc2V0IGZkX2RmIFtvcGVuICJ8IGdpdCBkaWZmLWZpbGVzIC16IiByXQoJc2V0IGZkX2xvIFtvcGVuICRsc19vdGhlcnMgcl0KCglmY29uZmlndXJlICRmZF9kaSAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZjb25maWd1cmUgJGZkX2RmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJZmNvbmZpZ3VyZSAkZmRfbG8gLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CglmaWxlZXZlbnQgJGZkX2RpIHJlYWRhYmxlIFtsaXN0IHJlYWRfZGlmZl9pbmRleCAkZmRfZGkgJGFmdGVyXQoJZmlsZWV2ZW50ICRmZF9kZiByZWFkYWJsZSBbbGlzdCByZWFkX2RpZmZfZmlsZXMgJGZkX2RmICRhZnRlcl0KCWZpbGVldmVudCAkZmRfbG8gcmVhZGFibGUgW2xpc3QgcmVhZF9sc19vdGhlcnMgJGZkX2xvICRhZnRlcl0KfQoKcHJvYyBsb2FkX21lc3NhZ2Uge2ZpbGV9IHsKCWdsb2JhbCB1aV9jb21tCgoJc2V0IGYgW2dpdGRpciAkZmlsZV0KCWlmIHtbZmlsZSBpc2ZpbGUgJGZdfSB7CgkJaWYge1tjYXRjaCB7c2V0IGZkIFtvcGVuICRmIHJdfV19IHsKCQkJcmV0dXJuIDAKCQl9CgkJc2V0IGNvbnRlbnQgW3N0cmluZyB0cmltIFtyZWFkICRmZF1dCgkJY2xvc2UgJGZkCgkJcmVnc3ViIC1hbGwgLWxpbmUge1sgXHJcdF0rJH0gJGNvbnRlbnQge30gY29udGVudAoJCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkJJHVpX2NvbW0gaW5zZXJ0IGVuZCAkY29udGVudAoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIHJlYWRfZGlmZl9pbmRleCB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmRpCgoJYXBwZW5kIGJ1Zl9yZGkgW3JlYWQgJGZkXQoJc2V0IGMgMAoJc2V0IG4gW3N0cmluZyBsZW5ndGggJGJ1Zl9yZGldCgl3aGlsZSB7JGMgPCAkbn0gewoJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGkgJGNdCgkJaWYgeyR6MSA9PSAtMX0gYnJlYWsKCQlpbmNyIHoxCgkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkaSAkejFdCgkJaWYgeyR6MiA9PSAtMX0gYnJlYWsKCgkJaW5jciBjCgkJc2V0IGkgW3NwbGl0IFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJGMgW2V4cHIgeyR6MSAtIDJ9XV0geyB9XQoJCXNldCBwIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJHoxIFtleHByIHskejIgLSAxfV1dCgkJbWVyZ2Vfc3RhdGUgXAoJCQlbZW5jb2RpbmcgY29udmVydGZyb20gJHBdIFwKCQkJW2xpbmRleCAkaSA0XT8gXAoJCQlbbGlzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMl1dIFwKCQkJW2xpc3RdCgkJc2V0IGMgJHoyCgkJaW5jciBjCgl9CglpZiB7JGMgPCAkbn0gewoJCXNldCBidWZfcmRpIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJGMgZW5kXQoJfSBlbHNlIHsKCQlzZXQgYnVmX3JkaSB7fQoJfQoKCXJlc2Nhbl9kb25lICRmZCBidWZfcmRpICRhZnRlcgp9Cgpwcm9jIHJlYWRfZGlmZl9maWxlcyB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmRmCgoJYXBwZW5kIGJ1Zl9yZGYgW3JlYWQgJGZkXQoJc2V0IGMgMAoJc2V0IG4gW3N0cmluZyBsZW5ndGggJGJ1Zl9yZGZdCgl3aGlsZSB7JGMgPCAkbn0gewoJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGYgJGNdCgkJaWYgeyR6MSA9PSAtMX0gYnJlYWsKCQlpbmNyIHoxCgkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkZiAkejFdCgkJaWYgeyR6MiA9PSAtMX0gYnJlYWsKCgkJaW5jciBjCgkJc2V0IGkgW3NwbGl0IFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJGMgW2V4cHIgeyR6MSAtIDJ9XV0geyB9XQoJCXNldCBwIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJHoxIFtleHByIHskejIgLSAxfV1dCgkJbWVyZ2Vfc3RhdGUgXAoJCQlbZW5jb2RpbmcgY29udmVydGZyb20gJHBdIFwKCQkJP1tsaW5kZXggJGkgNF0gXAoJCQlbbGlzdF0gXAoJCQlbbGlzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMl1dCgkJc2V0IGMgJHoyCgkJaW5jciBjCgl9CglpZiB7JGMgPCAkbn0gewoJCXNldCBidWZfcmRmIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJGMgZW5kXQoJfSBlbHNlIHsKCQlzZXQgYnVmX3JkZiB7fQoJfQoKCXJlc2Nhbl9kb25lICRmZCBidWZfcmRmICRhZnRlcgp9Cgpwcm9jIHJlYWRfbHNfb3RoZXJzIHtmZCBhZnRlcn0gewoJZ2xvYmFsIGJ1Zl9ybG8KCglhcHBlbmQgYnVmX3JsbyBbcmVhZCAkZmRdCglzZXQgcGNrIFtzcGxpdCAkYnVmX3JsbyAiXDAiXQoJc2V0IGJ1Zl9ybG8gW2xpbmRleCAkcGNrIGVuZF0KCWZvcmVhY2ggcCBbbHJhbmdlICRwY2sgMCBlbmQtMV0gewoJCW1lcmdlX3N0YXRlIFtlbmNvZGluZyBjb252ZXJ0ZnJvbSAkcF0gP08KCX0KCXJlc2Nhbl9kb25lICRmZCBidWZfcmxvICRhZnRlcgp9Cgpwcm9jIHJlc2Nhbl9kb25lIHtmZCBidWYgYWZ0ZXJ9IHsKCWdsb2JhbCByZXNjYW5fYWN0aXZlIGN1cnJlbnRfZGlmZl9wYXRoCglnbG9iYWwgZmlsZV9zdGF0ZXMgcmVwb19jb25maWcKCXVwdmFyICRidWYgdG9fY2xlYXIKCglpZiB7IVtlb2YgJGZkXX0gcmV0dXJuCglzZXQgdG9fY2xlYXIge30KCWNsb3NlICRmZAoJaWYge1tpbmNyIHJlc2Nhbl9hY3RpdmUgLTFdID4gMH0gcmV0dXJuCgoJcHJ1bmVfc2VsZWN0aW9uCgl1bmxvY2tfaW5kZXgKCWRpc3BsYXlfYWxsX2ZpbGVzCglpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIG5lIHt9fSByZXNob3dfZGlmZgoJdXBsZXZlbCAjMCAkYWZ0ZXIKfQoKcHJvYyBwcnVuZV9zZWxlY3Rpb24ge30gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIHNlbGVjdGVkX3BhdGhzCgoJZm9yZWFjaCBwYXRoIFthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10gewoJCWlmIHtbY2F0Y2gge3NldCBzdGlsbF9oZXJlICRmaWxlX3N0YXRlcygkcGF0aCl9XX0gewoJCQl1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCkKCQl9Cgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdWkgaGVscGVycwoKcHJvYyBtYXBpY29uIHt3IHN0YXRlIHBhdGh9IHsKCWdsb2JhbCBhbGxfaWNvbnMKCglpZiB7W2NhdGNoIHtzZXQgciAkYWxsX2ljb25zKCRzdGF0ZSR3KX1dfSB7CgkJcHV0cyAiZXJyb3I6IG5vIGljb24gZm9yICR3IHN0YXRlPXskc3RhdGV9ICRwYXRoIgoJCXJldHVybiBmaWxlX3BsYWluCgl9CglyZXR1cm4gJHIKfQoKcHJvYyBtYXBkZXNjIHtzdGF0ZSBwYXRofSB7CglnbG9iYWwgYWxsX2Rlc2NzCgoJaWYge1tjYXRjaCB7c2V0IHIgJGFsbF9kZXNjcygkc3RhdGUpfV19IHsKCQlwdXRzICJlcnJvcjogbm8gZGVzYyBmb3Igc3RhdGU9eyRzdGF0ZX0gJHBhdGgiCgkJcmV0dXJuICRzdGF0ZQoJfQoJcmV0dXJuICRyCn0KCnByb2MgZXNjYXBlX3BhdGgge3BhdGh9IHsKCXJlZ3N1YiAtYWxsIHtcXH0gJHBhdGggIlxcXFwiIHBhdGgKCXJlZ3N1YiAtYWxsICJcbiIgJHBhdGggIlxcbiIgcGF0aAoJcmV0dXJuICRwYXRoCn0KCnByb2Mgc2hvcnRfcGF0aCB7cGF0aH0gewoJcmV0dXJuIFtlc2NhcGVfcGF0aCBbbGluZGV4IFtmaWxlIHNwbGl0ICRwYXRoXSBlbmRdXQp9CgpzZXQgbmV4dF9pY29uX2lkIDAKc2V0IG51bGxfc2hhMSBbc3RyaW5nIHJlcGVhdCAwIDQwXQoKcHJvYyBtZXJnZV9zdGF0ZSB7cGF0aCBuZXdfc3RhdGUge2hlYWRfaW5mbyB7fX0ge2luZGV4X2luZm8ge319fSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgbmV4dF9pY29uX2lkIG51bGxfc2hhMQoKCXNldCBzMCBbc3RyaW5nIGluZGV4ICRuZXdfc3RhdGUgMF0KCXNldCBzMSBbc3RyaW5nIGluZGV4ICRuZXdfc3RhdGUgMV0KCglpZiB7W2NhdGNoIHtzZXQgaW5mbyAkZmlsZV9zdGF0ZXMoJHBhdGgpfV19IHsKCQlzZXQgc3RhdGUgX18KCQlzZXQgaWNvbiBuW2luY3IgbmV4dF9pY29uX2lkXQoJfSBlbHNlIHsKCQlzZXQgc3RhdGUgW2xpbmRleCAkaW5mbyAwXQoJCXNldCBpY29uIFtsaW5kZXggJGluZm8gMV0KCQlpZiB7JGhlYWRfaW5mbyBlcSB7fX0gIHtzZXQgaGVhZF9pbmZvICBbbGluZGV4ICRpbmZvIDJdfQoJCWlmIHskaW5kZXhfaW5mbyBlcSB7fX0ge3NldCBpbmRleF9pbmZvIFtsaW5kZXggJGluZm8gM119Cgl9CgoJaWYgICAgIHskczAgZXEgez99fSB7c2V0IHMwIFtzdHJpbmcgaW5kZXggJHN0YXRlIDBdfSBcCgllbHNlaWYgeyRzMCBlcSB7X319IHtzZXQgczAgX30KCglpZiAgICAgeyRzMSBlcSB7P319IHtzZXQgczEgW3N0cmluZyBpbmRleCAkc3RhdGUgMV19IFwKCWVsc2VpZiB7JHMxIGVxIHtffX0ge3NldCBzMSBffQoKCWlmIHskczAgZXEge0F9ICYmICRzMSBlcSB7X30gJiYgJGhlYWRfaW5mbyBlcSB7fX0gewoJCXNldCBoZWFkX2luZm8gW2xpc3QgMCAkbnVsbF9zaGExXQoJfSBlbHNlaWYgeyRzMCBuZSB7X30gJiYgW3N0cmluZyBpbmRleCAkc3RhdGUgMF0gZXEge199CgkJJiYgJGhlYWRfaW5mbyBlcSB7fX0gewoJCXNldCBoZWFkX2luZm8gJGluZGV4X2luZm8KCX0KCglzZXQgZmlsZV9zdGF0ZXMoJHBhdGgpIFtsaXN0ICRzMCRzMSAkaWNvbiBcCgkJJGhlYWRfaW5mbyAkaW5kZXhfaW5mbyBcCgkJXQoJcmV0dXJuICRzdGF0ZQp9Cgpwcm9jIGRpc3BsYXlfZmlsZV9oZWxwZXIge3cgcGF0aCBpY29uX25hbWUgb2xkX20gbmV3X219IHsKCWdsb2JhbCBmaWxlX2xpc3RzCgoJaWYgeyRuZXdfbSBlcSB7X319IHsKCQlzZXQgbG5vIFtsc2VhcmNoIC1zb3J0ZWQgLWV4YWN0ICRmaWxlX2xpc3RzKCR3KSAkcGF0aF0KCQlpZiB7JGxubyA+PSAwfSB7CgkJCXNldCBmaWxlX2xpc3RzKCR3KSBbbHJlcGxhY2UgJGZpbGVfbGlzdHMoJHcpICRsbm8gJGxub10KCQkJaW5jciBsbm8KCQkJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkJCSR3IGRlbGV0ZSAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJCQkkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJCX0KCX0gZWxzZWlmIHskb2xkX20gZXEge199ICYmICRuZXdfbSBuZSB7X319IHsKCQlsYXBwZW5kIGZpbGVfbGlzdHMoJHcpICRwYXRoCgkJc2V0IGZpbGVfbGlzdHMoJHcpIFtsc29ydCAtdW5pcXVlICRmaWxlX2xpc3RzKCR3KV0KCQlzZXQgbG5vIFtsc2VhcmNoIC1zb3J0ZWQgLWV4YWN0ICRmaWxlX2xpc3RzKCR3KSAkcGF0aF0KCQlpbmNyIGxubwoJCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJCSR3IGltYWdlIGNyZWF0ZSAkbG5vLjAgXAoJCQktYWxpZ24gY2VudGVyIC1wYWR4IDUgLXBhZHkgMSBcCgkJCS1uYW1lICRpY29uX25hbWUgXAoJCQktaW1hZ2UgW21hcGljb24gJHcgJG5ld19tICRwYXRoXQoJCSR3IGluc2VydCAkbG5vLjEgIltlc2NhcGVfcGF0aCAkcGF0aF1cbiIKCQkkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJfSBlbHNlaWYgeyRvbGRfbSBuZSAkbmV3X219IHsKCQkkdyBjb25mIC1zdGF0ZSBub3JtYWwKCQkkdyBpbWFnZSBjb25mICRpY29uX25hbWUgLWltYWdlIFttYXBpY29uICR3ICRuZXdfbSAkcGF0aF0KCQkkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJfQp9Cgpwcm9jIGRpc3BsYXlfZmlsZSB7cGF0aCBzdGF0ZX0gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIHNlbGVjdGVkX3BhdGhzCglnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpcgoKCXNldCBvbGRfbSBbbWVyZ2Vfc3RhdGUgJHBhdGggJHN0YXRlXQoJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQoJc2V0IG5ld19tIFtsaW5kZXggJHMgMF0KCXNldCBpY29uX25hbWUgW2xpbmRleCAkcyAxXQoKCXNldCBvIFtzdHJpbmcgaW5kZXggJG9sZF9tIDBdCglzZXQgbiBbc3RyaW5nIGluZGV4ICRuZXdfbSAwXQoJaWYgeyRvIGVxIHtVfX0gewoJCXNldCBvIF8KCX0KCWlmIHskbiBlcSB7VX19IHsKCQlzZXQgbiBfCgl9CglkaXNwbGF5X2ZpbGVfaGVscGVyCSR1aV9pbmRleCAkcGF0aCAkaWNvbl9uYW1lICRvICRuCgoJaWYge1tzdHJpbmcgaW5kZXggJG9sZF9tIDBdIGVxIHtVfX0gewoJCXNldCBvIFUKCX0gZWxzZSB7CgkJc2V0IG8gW3N0cmluZyBpbmRleCAkb2xkX20gMV0KCX0KCWlmIHtbc3RyaW5nIGluZGV4ICRuZXdfbSAwXSBlcSB7VX19IHsKCQlzZXQgbiBVCgl9IGVsc2UgewoJCXNldCBuIFtzdHJpbmcgaW5kZXggJG5ld19tIDFdCgl9CglkaXNwbGF5X2ZpbGVfaGVscGVyCSR1aV93b3JrZGlyICRwYXRoICRpY29uX25hbWUgJG8gJG4KCglpZiB7JG5ld19tIGVxIHtfX319IHsKCQl1bnNldCBmaWxlX3N0YXRlcygkcGF0aCkKCQljYXRjaCB7dW5zZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpfQoJfQp9Cgpwcm9jIGRpc3BsYXlfYWxsX2ZpbGVzX2hlbHBlciB7dyBwYXRoIGljb25fbmFtZSBtfSB7CglnbG9iYWwgZmlsZV9saXN0cwoKCWxhcHBlbmQgZmlsZV9saXN0cygkdykgJHBhdGgKCXNldCBsbm8gW2V4cHIge1tsaW5kZXggW3NwbGl0IFskdyBpbmRleCBlbmRdIC5dIDBdIC0gMX1dCgkkdyBpbWFnZSBjcmVhdGUgZW5kIFwKCQktYWxpZ24gY2VudGVyIC1wYWR4IDUgLXBhZHkgMSBcCgkJLW5hbWUgJGljb25fbmFtZSBcCgkJLWltYWdlIFttYXBpY29uICR3ICRtICRwYXRoXQoJJHcgaW5zZXJ0IGVuZCAiW2VzY2FwZV9wYXRoICRwYXRoXVxuIgp9Cgpwcm9jIGRpc3BsYXlfYWxsX2ZpbGVzIHt9IHsKCWdsb2JhbCB1aV9pbmRleCB1aV93b3JrZGlyCglnbG9iYWwgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cwoJZ2xvYmFsIGxhc3RfY2xpY2tlZAoKCSR1aV9pbmRleCBjb25mIC1zdGF0ZSBub3JtYWwKCSR1aV93b3JrZGlyIGNvbmYgLXN0YXRlIG5vcm1hbAoKCSR1aV9pbmRleCBkZWxldGUgMC4wIGVuZAoJJHVpX3dvcmtkaXIgZGVsZXRlIDAuMCBlbmQKCXNldCBsYXN0X2NsaWNrZWQge30KCglzZXQgZmlsZV9saXN0cygkdWlfaW5kZXgpIFtsaXN0XQoJc2V0IGZpbGVfbGlzdHMoJHVpX3dvcmtkaXIpIFtsaXN0XQoKCWZvcmVhY2ggcGF0aCBbbHNvcnQgW2FycmF5IG5hbWVzIGZpbGVfc3RhdGVzXV0gewoJCXNldCBzICRmaWxlX3N0YXRlcygkcGF0aCkKCQlzZXQgbSBbbGluZGV4ICRzIDBdCgkJc2V0IGljb25fbmFtZSBbbGluZGV4ICRzIDFdCgoJCXNldCBzIFtzdHJpbmcgaW5kZXggJG0gMF0KCQlpZiB7JHMgbmUge1V9ICYmICRzIG5lIHtffX0gewoJCQlkaXNwbGF5X2FsbF9maWxlc19oZWxwZXIgJHVpX2luZGV4ICRwYXRoIFwKCQkJCSRpY29uX25hbWUgJHMKCQl9CgoJCWlmIHtbc3RyaW5nIGluZGV4ICRtIDBdIGVxIHtVfX0gewoJCQlzZXQgcyBVCgkJfSBlbHNlIHsKCQkJc2V0IHMgW3N0cmluZyBpbmRleCAkbSAxXQoJCX0KCQlpZiB7JHMgbmUge199fSB7CgkJCWRpc3BsYXlfYWxsX2ZpbGVzX2hlbHBlciAkdWlfd29ya2RpciAkcGF0aCBcCgkJCQkkaWNvbl9uYW1lICRzCgkJfQoJfQoKCSR1aV9pbmRleCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHVpX3dvcmtkaXIgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBpY29ucwoKc2V0IGZpbGVtYXNrIHsKI2RlZmluZSBtYXNrX3dpZHRoIDE0CiNkZWZpbmUgbWFza19oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFza19iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsCiAgIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsCiAgIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWZ9Owp9CgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcGxhaW4gLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmxhY2sgLWRhdGEgewojZGVmaW5lIHBsYWluX3dpZHRoIDE0CiNkZWZpbmUgcGxhaW5faGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIHBsYWluX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwNSwgMHgwMiwgMHgwOSwgMHgwMiwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwKICAgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX21vZCAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibHVlIC1kYXRhIHsKI2RlZmluZSBtb2Rfd2lkdGggMTQKI2RlZmluZSBtb2RfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIG1vZF9iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4N2EsIDB4MDUsIDB4MDIsIDB4MDksIDB4N2EsIDB4MWYsIDB4MDIsIDB4MTAsCiAgIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsCiAgIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9mdWxsdGljayAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCAiIzAwNzAwMCIgLWRhdGEgewojZGVmaW5lIGZpbGVfZnVsbHRpY2tfd2lkdGggMTQKI2RlZmluZSBmaWxlX2Z1bGx0aWNrX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX2Z1bGx0aWNrX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgxYSwgMHgwMiwgMHgwYywgMHgwMiwgMHgwYywgMHgwMiwgMHgxNiwgMHgwMiwgMHgxNiwKICAgMHgwMiwgMHgxMywgMHgwMCwgMHgxMywgMHg4NiwgMHgxMSwgMHg4YywgMHgxMSwgMHhkOCwgMHgxMCwgMHhmMiwgMHgxMCwKICAgMHg2MiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX3BhcnR0aWNrIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kICIjMDA1MDUwIiAtZGF0YSB7CiNkZWZpbmUgcGFydHRpY2tfd2lkdGggMTQKI2RlZmluZSBwYXJ0dGlja19oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFydHRpY2tfYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDdhLCAweDA1LCAweDAyLCAweDA5LCAweDdhLCAweDFmLCAweDAyLCAweDEwLAogICAweDdhLCAweDE0LCAweDAyLCAweDE2LCAweDAyLCAweDEzLCAweDhhLCAweDExLCAweGRhLCAweDEwLCAweDcyLCAweDEwLAogICAweDIyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcXVlc3Rpb24gLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmxhY2sgLWRhdGEgewojZGVmaW5lIGZpbGVfcXVlc3Rpb25fd2lkdGggMTQKI2RlZmluZSBmaWxlX3F1ZXN0aW9uX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX3F1ZXN0aW9uX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMiwgMHhlMiwgMHgwNCwgMHhmMiwgMHgwOSwgMHgxYSwgMHgxYiwgMHgwYSwgMHgxMywKICAgMHg4MiwgMHgxMSwgMHhjMiwgMHgxMCwgMHg2MiwgMHgxMCwgMHg2MiwgMHgxMCwgMHgwMiwgMHgxMCwgMHg2MiwgMHgxMCwKICAgMHg2MiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX3JlbW92ZWQgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgcmVkIC1kYXRhIHsKI2RlZmluZSBmaWxlX3JlbW92ZWRfd2lkdGggMTQKI2RlZmluZSBmaWxlX3JlbW92ZWRfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfcmVtb3ZlZF9iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDUsIDB4MDIsIDB4MDksIDB4MDIsIDB4MWYsIDB4MDIsIDB4MTAsCiAgIDB4MWEsIDB4MTYsIDB4MzIsIDB4MTMsIDB4ZTIsIDB4MTEsIDB4YzIsIDB4MTAsIDB4ZTIsIDB4MTEsIDB4MzIsIDB4MTMsCiAgIDB4MWEsIDB4MTYsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9tZXJnZSAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibHVlIC1kYXRhIHsKI2RlZmluZSBmaWxlX21lcmdlX3dpZHRoIDE0CiNkZWZpbmUgZmlsZV9tZXJnZV9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9tZXJnZV9iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4NjIsIDB4MDUsIDB4NjIsIDB4MDksIDB4NjIsIDB4MWYsIDB4NjIsIDB4MTAsCiAgIDB4ZmEsIDB4MTEsIDB4ZjIsIDB4MTAsIDB4NjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsCiAgIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCnNldCBmaWxlX2Rpcl9kYXRhIHsKI2RlZmluZSBmaWxlX3dpZHRoIDE4CiNkZWZpbmUgZmlsZV9oZWlnaHQgMTgKc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9iaXRzW10gPSB7CiAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmOCwgMHgwMywgMHgwMCwKICAweDBjLCAweDAzLCAweDAwLCAweDA0LCAweGZlLCAweDAwLCAweDA2LCAweDgwLCAweDAwLCAweGZmLCAweDlmLCAweDAwLAogIDB4MDMsIDB4OTgsIDB4MDAsIDB4MDIsIDB4OTAsIDB4MDAsIDB4MDYsIDB4YjAsIDB4MDAsIDB4MDQsIDB4YTAsIDB4MDAsCiAgMHgwYywgMHhlMCwgMHgwMCwgMHgwOCwgMHhjMCwgMHgwMCwgMHhmOCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKfQppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfZGlyIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsdWUgXAoJLWRhdGEgJGZpbGVfZGlyX2RhdGEgLW1hc2tkYXRhICRmaWxlX2Rpcl9kYXRhCnVuc2V0IGZpbGVfZGlyX2RhdGEKCnNldCBmaWxlX3VwbGV2ZWxfZGF0YSB7CiNkZWZpbmUgdXBfd2lkdGggMTUKI2RlZmluZSB1cF9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgdXBfYml0c1tdID0gewogIDB4ODAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ZTAsIDB4MDMsIDB4ZjAsIDB4MDcsIDB4ZjgsIDB4MGYsIDB4ZmMsIDB4MWYsCiAgMHhmZSwgMHgzZiwgMHhjMCwgMHgwMSwgMHhjMCwgMHgwMSwgMHhjMCwgMHgwMSwgMHhjMCwgMHgwMSwgMHhjMCwgMHgwMSwKICAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweDAwLCAweDAwfTsKfQppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfdXBsZXZlbCAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCByZWQgXAoJLWRhdGEgJGZpbGVfdXBsZXZlbF9kYXRhIC1tYXNrZGF0YSAkZmlsZV91cGxldmVsX2RhdGEKdW5zZXQgZmlsZV91cGxldmVsX2RhdGEKCnNldCB1aV9pbmRleCAudnBhbmUuZmlsZXMuaW5kZXgubGlzdApzZXQgdWlfd29ya2RpciAudnBhbmUuZmlsZXMud29ya2Rpci5saXN0CgpzZXQgYWxsX2ljb25zKF8kdWlfaW5kZXgpICAgZmlsZV9wbGFpbgpzZXQgYWxsX2ljb25zKEEkdWlfaW5kZXgpICAgZmlsZV9mdWxsdGljawpzZXQgYWxsX2ljb25zKE0kdWlfaW5kZXgpICAgZmlsZV9mdWxsdGljawpzZXQgYWxsX2ljb25zKEQkdWlfaW5kZXgpICAgZmlsZV9yZW1vdmVkCnNldCBhbGxfaWNvbnMoVSR1aV9pbmRleCkgICBmaWxlX21lcmdlCgpzZXQgYWxsX2ljb25zKF8kdWlfd29ya2RpcikgZmlsZV9wbGFpbgpzZXQgYWxsX2ljb25zKE0kdWlfd29ya2RpcikgZmlsZV9tb2QKc2V0IGFsbF9pY29ucyhEJHVpX3dvcmtkaXIpIGZpbGVfcXVlc3Rpb24Kc2V0IGFsbF9pY29ucyhVJHVpX3dvcmtkaXIpIGZpbGVfbWVyZ2UKc2V0IGFsbF9pY29ucyhPJHVpX3dvcmtkaXIpIGZpbGVfcGxhaW4KCnNldCBtYXhfc3RhdHVzX2Rlc2MgMApmb3JlYWNoIGkgewoJCXtfXyAiVW5tb2RpZmllZCJ9CgoJCXtfTSAiTW9kaWZpZWQsIG5vdCBzdGFnZWQifQoJCXtNXyAiU3RhZ2VkIGZvciBjb21taXQifQoJCXtNTSAiUG9ydGlvbnMgc3RhZ2VkIGZvciBjb21taXQifQoJCXtNRCAiU3RhZ2VkIGZvciBjb21taXQsIG1pc3NpbmcifQoKCQl7X08gIlVudHJhY2tlZCwgbm90IHN0YWdlZCJ9CgkJe0FfICJTdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe0FNICJQb3J0aW9ucyBzdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe0FEICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyJ9CgoJCXtfRCAiTWlzc2luZyJ9CgkJe0RfICJTdGFnZWQgZm9yIHJlbW92YWwifQoJCXtETyAiU3RhZ2VkIGZvciByZW1vdmFsLCBzdGlsbCBwcmVzZW50In0KCgkJe1VfICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIn0KCQl7VVUgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJCXtVTSAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiJ9CgkJe1VEICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIn0KCX0gewoJaWYgeyRtYXhfc3RhdHVzX2Rlc2MgPCBbc3RyaW5nIGxlbmd0aCBbbGluZGV4ICRpIDFdXX0gewoJCXNldCBtYXhfc3RhdHVzX2Rlc2MgW3N0cmluZyBsZW5ndGggW2xpbmRleCAkaSAxXV0KCX0KCXNldCBhbGxfZGVzY3MoW2xpbmRleCAkaSAwXSkgW2xpbmRleCAkaSAxXQp9CnVuc2V0IGkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdXRpbAoKcHJvYyBiaW5kX2J1dHRvbjMge3cgY21kfSB7CgliaW5kICR3IDxBbnktQnV0dG9uLTM+ICRjbWQKCWlmIHtbaXNfTWFjT1NYXX0gewoJCWJpbmQgJHcgPENvbnRyb2wtQnV0dG9uLTE+ICRjbWQKCX0KfQoKcHJvYyBzY3JvbGxiYXIybWFueSB7bGlzdCBtb2RlIGFyZ3N9IHsKCWZvcmVhY2ggdyAkbGlzdCB7ZXZhbCAkdyAkbW9kZSAkYXJnc30KfQoKcHJvYyBtYW55MnNjcm9sbGJhciB7bGlzdCBtb2RlIHNiIHRvcCBib3R0b219IHsKCSRzYiBzZXQgJHRvcCAkYm90dG9tCglmb3JlYWNoIHcgJGxpc3QgeyR3ICRtb2RlIG1vdmV0byAkdG9wfQp9Cgpwcm9jIGluY3JfZm9udF9zaXplIHtmb250IHthbXQgMX19IHsKCXNldCBzeiBbZm9udCBjb25maWd1cmUgJGZvbnQgLXNpemVdCglpbmNyIHN6ICRhbXQKCWZvbnQgY29uZmlndXJlICRmb250IC1zaXplICRzegoJZm9udCBjb25maWd1cmUgJHtmb250fWJvbGQgLXNpemUgJHN6Cglmb250IGNvbmZpZ3VyZSAke2ZvbnR9aXRhbGljIC1zaXplICRzegp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGNvbW1hbmRzCgpzZXQgc3RhcnRpbmdfZ2l0a19tc2cge1N0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi59Cgpwcm9jIGRvX2dpdGsge3JldnN9IHsKCWdsb2JhbCBlbnYgdWlfc3RhdHVzX3ZhbHVlIHN0YXJ0aW5nX2dpdGtfbXNnCgoJIyAtLSBBbHdheXMgc3RhcnQgZ2l0ayB0aHJvdWdoIHdoYXRldmVyIHdlIHdlcmUgbG9hZGVkIHdpdGguICBUaGlzCgkjICAgIGxldHMgdXMgYnlwYXNzIHVzaW5nIHNoZWxsIHByb2Nlc3Mgb24gV2luZG93cyBzeXN0ZW1zLgoJIwoJc2V0IGNtZCBbbGlzdCBbaW5mbyBuYW1lb2ZleGVjdXRhYmxlXV0KCXNldCBleGUgW2dpdGV4ZWMgZ2l0a10KCWxhcHBlbmQgY21kICRleGUKCWlmIHskcmV2cyBuZSB7fX0gewoJCWFwcGVuZCBjbWQgeyB9CgkJYXBwZW5kIGNtZCAkcmV2cwoJfQoKCWlmIHshIFtmaWxlIGV4aXN0cyAkZXhlXX0gewoJCWVycm9yX3BvcHVwICJVbmFibGUgdG8gc3RhcnQgZ2l0azpcblxuJGV4ZSBkb2VzIG5vdCBleGlzdCIKCX0gZWxzZSB7CgkJZXZhbCBleGVjICRjbWQgJgoJCXNldCB1aV9zdGF0dXNfdmFsdWUgJHN0YXJ0aW5nX2dpdGtfbXNnCgkJYWZ0ZXIgMTAwMDAgewoJCQlpZiB7JHVpX3N0YXR1c192YWx1ZSBlcSAkc3RhcnRpbmdfZ2l0a19tc2d9IHsKCQkJCXNldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln0KCQkJfQoJCX0KCX0KfQoKc2V0IGlzX3F1aXR0aW5nIDAKCnByb2MgZG9fcXVpdCB7fSB7CglnbG9iYWwgdWlfY29tbSBpc19xdWl0dGluZyByZXBvX2NvbmZpZyBjb21taXRfdHlwZQoKCWlmIHskaXNfcXVpdHRpbmd9IHJldHVybgoJc2V0IGlzX3F1aXR0aW5nIDEKCglpZiB7W3dpbmZvIGV4aXN0cyAkdWlfY29tbV19IHsKCQkjIC0tIFN0YXNoIG91ciBjdXJyZW50IGNvbW1pdCBidWZmZXIuCgkJIwoJCXNldCBzYXZlIFtnaXRkaXIgR0lUR1VJX01TR10KCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSBbJHVpX2NvbW0gZ2V0IDAuMCBlbmRdXQoJCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFxyXHRdKyR9ICRtc2cge30gbXNnCgkJaWYgeyghW3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQoJCQl8fCBbJHVpX2NvbW0gZWRpdCBtb2RpZmllZF0pCgkJCSYmICRtc2cgbmUge319IHsKCQkJY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRzYXZlIHddCgkJCQlwdXRzIC1ub25ld2xpbmUgJGZkICRtc2cKCQkJCWNsb3NlICRmZAoJCQl9CgkJfSBlbHNlIHsKCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRzYXZlfQoJCX0KCgkJIyAtLSBTdGFzaCBvdXIgY3VycmVudCB3aW5kb3cgZ2VvbWV0cnkgaW50byB0aGlzIHJlcG9zaXRvcnkuCgkJIwoJCXNldCBjZmdfZ2VvbWV0cnkgW2xpc3RdCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW3dtIGdlb21ldHJ5IC5dCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW2xpbmRleCBbLnZwYW5lIHNhc2ggY29vcmQgMF0gMV0KCQlsYXBwZW5kIGNmZ19nZW9tZXRyeSBbbGluZGV4IFsudnBhbmUuZmlsZXMgc2FzaCBjb29yZCAwXSAwXQoJCWlmIHtbY2F0Y2gge3NldCByY19nZW9tZXRyeSAkcmVwb19jb25maWcoZ3VpLmdlb21ldHJ5KX1dfSB7CgkJCXNldCByY19nZW9tZXRyeSB7fQoJCX0KCQlpZiB7JGNmZ19nZW9tZXRyeSBuZSAkcmNfZ2VvbWV0cnl9IHsKCQkJY2F0Y2gge2dpdCBjb25maWcgZ3VpLmdlb21ldHJ5ICRjZmdfZ2VvbWV0cnl9CgkJfQoJfQoKCWRlc3Ryb3kgLgp9Cgpwcm9jIGRvX3Jlc2NhbiB7fSB7CglyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19Cn0KCnByb2MgZG9fY29tbWl0IHt9IHsKCWNvbW1pdF90cmVlCn0KCnByb2MgdG9nZ2xlX29yX2RpZmYge3cgeCB5fSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cyBjdXJyZW50X2RpZmZfcGF0aCB1aV9pbmRleCB1aV93b3JrZGlyCglnbG9iYWwgbGFzdF9jbGlja2VkIHNlbGVjdGVkX3BhdGhzCgoJc2V0IHBvcyBbc3BsaXQgWyR3IGluZGV4IEAkeCwkeV0gLl0KCXNldCBsbm8gW2xpbmRleCAkcG9zIDBdCglzZXQgY29sIFtsaW5kZXggJHBvcyAxXQoJc2V0IHBhdGggW2xpbmRleCAkZmlsZV9saXN0cygkdykgW2V4cHIgeyRsbm8gLSAxfV1dCglpZiB7JHBhdGggZXEge319IHsKCQlzZXQgbGFzdF9jbGlja2VkIHt9CgkJcmV0dXJuCgl9CgoJc2V0IGxhc3RfY2xpY2tlZCBbbGlzdCAkdyAkbG5vXQoJYXJyYXkgdW5zZXQgc2VsZWN0ZWRfcGF0aHMKCSR1aV9pbmRleCB0YWcgcmVtb3ZlIGluX3NlbCAwLjAgZW5kCgkkdWlfd29ya2RpciB0YWcgcmVtb3ZlIGluX3NlbCAwLjAgZW5kCgoJaWYgeyRjb2wgPT0gMH0gewoJCWlmIHskY3VycmVudF9kaWZmX3BhdGggZXEgJHBhdGh9IHsKCQkJc2V0IGFmdGVyIHtyZXNob3dfZGlmZjt9CgkJfSBlbHNlIHsKCQkJc2V0IGFmdGVyIHt9CgkJfQoJCWlmIHskdyBlcSAkdWlfaW5kZXh9IHsKCQkJdXBkYXRlX2luZGV4aW5mbyBcCgkJCQkiVW5zdGFnaW5nIFtzaG9ydF9wYXRoICRwYXRoXSBmcm9tIGNvbW1pdCIgXAoJCQkJW2xpc3QgJHBhdGhdIFwKCQkJCVtjb25jYXQgJGFmdGVyIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59fV0KCQl9IGVsc2VpZiB7JHcgZXEgJHVpX3dvcmtkaXJ9IHsKCQkJdXBkYXRlX2luZGV4IFwKCQkJCSJBZGRpbmcgW3Nob3J0X3BhdGggJHBhdGhdIiBcCgkJCQlbbGlzdCAkcGF0aF0gXAoJCQkJW2NvbmNhdCAkYWZ0ZXIge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19XQoJCX0KCX0gZWxzZSB7CgkJc2hvd19kaWZmICRwYXRoICR3ICRsbm8KCX0KfQoKcHJvYyBhZGRfb25lX3RvX3NlbGVjdGlvbiB7dyB4IHl9IHsKCWdsb2JhbCBmaWxlX2xpc3RzIGxhc3RfY2xpY2tlZCBzZWxlY3RlZF9wYXRocwoKCXNldCBsbm8gW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAkeCwkeV0gLl0gMF0KCXNldCBwYXRoIFtsaW5kZXggJGZpbGVfbGlzdHMoJHcpIFtleHByIHskbG5vIC0gMX1dXQoJaWYgeyRwYXRoIGVxIHt9fSB7CgkJc2V0IGxhc3RfY2xpY2tlZCB7fQoJCXJldHVybgoJfQoKCWlmIHskbGFzdF9jbGlja2VkIG5lIHt9CgkJJiYgW2xpbmRleCAkbGFzdF9jbGlja2VkIDBdIG5lICR3fSB7CgkJYXJyYXkgdW5zZXQgc2VsZWN0ZWRfcGF0aHMKCQlbbGluZGV4ICRsYXN0X2NsaWNrZWQgMF0gdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJfQoKCXNldCBsYXN0X2NsaWNrZWQgW2xpc3QgJHcgJGxub10KCWlmIHtbY2F0Y2gge3NldCBpbl9zZWwgJHNlbGVjdGVkX3BhdGhzKCRwYXRoKX1dfSB7CgkJc2V0IGluX3NlbCAwCgl9CglpZiB7JGluX3NlbH0gewoJCXVuc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKQoJCSR3IHRhZyByZW1vdmUgaW5fc2VsICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCgl9IGVsc2UgewoJCXNldCBzZWxlY3RlZF9wYXRocygkcGF0aCkgMQoJCSR3IHRhZyBhZGQgaW5fc2VsICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCgl9Cn0KCnByb2MgYWRkX3JhbmdlX3RvX3NlbGVjdGlvbiB7dyB4IHl9IHsKCWdsb2JhbCBmaWxlX2xpc3RzIGxhc3RfY2xpY2tlZCBzZWxlY3RlZF9wYXRocwoKCWlmIHtbbGluZGV4ICRsYXN0X2NsaWNrZWQgMF0gbmUgJHd9IHsKCQl0b2dnbGVfb3JfZGlmZiAkdyAkeCAkeQoJCXJldHVybgoJfQoKCXNldCBsbm8gW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAkeCwkeV0gLl0gMF0KCXNldCBsYyBbbGluZGV4ICRsYXN0X2NsaWNrZWQgMV0KCWlmIHskbGMgPCAkbG5vfSB7CgkJc2V0IGJlZ2luICRsYwoJCXNldCBlbmQgJGxubwoJfSBlbHNlIHsKCQlzZXQgYmVnaW4gJGxubwoJCXNldCBlbmQgJGxjCgl9CgoJZm9yZWFjaCBwYXRoIFtscmFuZ2UgJGZpbGVfbGlzdHMoJHcpIFwKCQlbZXhwciB7JGJlZ2luIC0gMX1dIFwKCQlbZXhwciB7JGVuZCAtIDF9XV0gewoJCXNldCBzZWxlY3RlZF9wYXRocygkcGF0aCkgMQoJfQoJJHcgdGFnIGFkZCBpbl9zZWwgJGJlZ2luLjAgW2V4cHIgeyRlbmQgKyAxfV0uMAp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGNvbmZpZyBkZWZhdWx0cwoKc2V0IGN1cnNvcl9wdHIgYXJyb3cKZm9udCBjcmVhdGUgZm9udF9kaWZmIC1mYW1pbHkgQ291cmllciAtc2l6ZSAxMApmb250IGNyZWF0ZSBmb250X3VpCmNhdGNoIHsKCWxhYmVsIC5kdW1teQoJZXZhbCBmb250IGNvbmZpZ3VyZSBmb250X3VpIFtmb250IGFjdHVhbCBbLmR1bW15IGNnZXQgLWZvbnRdXQoJZGVzdHJveSAuZHVtbXkKfQoKZm9udCBjcmVhdGUgZm9udF91aWl0YWxpYwpmb250IGNyZWF0ZSBmb250X3VpYm9sZApmb250IGNyZWF0ZSBmb250X2RpZmZib2xkCmZvbnQgY3JlYXRlIGZvbnRfZGlmZml0YWxpYwoKZm9yZWFjaCBjbGFzcyB7QnV0dG9uIENoZWNrYnV0dG9uIEVudHJ5IExhYmVsCgkJTGFiZWxmcmFtZSBMaXN0Ym94IE1lbnUgTWVzc2FnZQoJCVJhZGlvYnV0dG9uIFNwaW5ib3ggVGV4dH0gewoJb3B0aW9uIGFkZCAqJGNsYXNzLmZvbnQgZm9udF91aQp9CnVuc2V0IGNsYXNzCgppZiB7W2lzX01hY09TWF19IHsKCXNldCBNMUIgTTEKCXNldCBNMVQgQ21kCn0gZWxzZSB7CglzZXQgTTFCIENvbnRyb2wKCXNldCBNMVQgQ3RybAp9Cgpwcm9jIGFwcGx5X2NvbmZpZyB7fSB7CglnbG9iYWwgcmVwb19jb25maWcgZm9udF9kZXNjcwoKCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgZm9udCBbbGluZGV4ICRvcHRpb24gMV0KCQlpZiB7W2NhdGNoIHsKCQkJZm9yZWFjaCB7Y24gY3Z9ICRyZXBvX2NvbmZpZyhndWkuJG5hbWUpIHsKCQkJCWZvbnQgY29uZmlndXJlICRmb250ICRjbiAkY3YKCQkJfQoJCQl9IGVycl19IHsKCQkJZXJyb3JfcG9wdXAgIkludmFsaWQgZm9udCBzcGVjaWZpZWQgaW4gZ3VpLiRuYW1lOlxuXG4kZXJyIgoJCX0KCQlmb3JlYWNoIHtjbiBjdn0gW2ZvbnQgY29uZmlndXJlICRmb250XSB7CgkJCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkICRjbiAkY3YKCQkJZm9udCBjb25maWd1cmUgJHtmb250fWl0YWxpYyAkY24gJGN2CgkJfQoJCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkIC13ZWlnaHQgYm9sZAoJCWZvbnQgY29uZmlndXJlICR7Zm9udH1pdGFsaWMgLXNsYW50IGl0YWxpYwoJfQp9CgpzZXQgZGVmYXVsdF9jb25maWcobWVyZ2Uuc3VtbWFyeSkgZmFsc2UKc2V0IGRlZmF1bHRfY29uZmlnKG1lcmdlLnZlcmJvc2l0eSkgMgpzZXQgZGVmYXVsdF9jb25maWcodXNlci5uYW1lKSB7fQpzZXQgZGVmYXVsdF9jb25maWcodXNlci5lbWFpbCkge30KCnNldCBkZWZhdWx0X2NvbmZpZyhndWkudHJ1c3RtdGltZSkgZmFsc2UKc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5kaWZmY29udGV4dCkgNQpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLm5ld2JyYW5jaHRlbXBsYXRlKSB7fQpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLmZvbnR1aSkgW2ZvbnQgY29uZmlndXJlIGZvbnRfdWldCnNldCBkZWZhdWx0X2NvbmZpZyhndWkuZm9udGRpZmYpIFtmb250IGNvbmZpZ3VyZSBmb250X2RpZmZdCnNldCBmb250X2Rlc2NzIHsKCXtmb250dWkgICBmb250X3VpICAge01haW4gRm9udH19Cgl7Zm9udGRpZmYgZm9udF9kaWZmIHtEaWZmL0NvbnNvbGUgRm9udH19Cn0KbG9hZF9jb25maWcgMAphcHBseV9jb25maWcKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgZmVhdHVyZSBvcHRpb24gc2VsZWN0aW9uCgppZiB7W3JlZ2V4cCB7XmdpdC0oLispJH0gW2FwcG5hbWVdIF9qdW5rIHN1YmNvbW1hbmRdfSB7Cgl1bnNldCBfanVuawp9IGVsc2UgewoJc2V0IHN1YmNvbW1hbmQgZ3VpCn0KaWYgeyRzdWJjb21tYW5kIGVxIHtndWkuc2h9fSB7CglzZXQgc3ViY29tbWFuZCBndWkKfQppZiB7JHN1YmNvbW1hbmQgZXEge2d1aX0gJiYgW2xsZW5ndGggJGFyZ3ZdID4gMH0gewoJc2V0IHN1YmNvbW1hbmQgW2xpbmRleCAkYXJndiAwXQoJc2V0IGFyZ3YgW2xyYW5nZSAkYXJndiAxIGVuZF0KfQoKZW5hYmxlX29wdGlvbiBtdWx0aWNvbW1pdAplbmFibGVfb3B0aW9uIGJyYW5jaAplbmFibGVfb3B0aW9uIHRyYW5zcG9ydAoKc3dpdGNoIC0tICRzdWJjb21tYW5kIHsKYnJvd3NlciAtCmJsYW1lIHsKCWRpc2FibGVfb3B0aW9uIG11bHRpY29tbWl0CglkaXNhYmxlX29wdGlvbiBicmFuY2gKCWRpc2FibGVfb3B0aW9uIHRyYW5zcG9ydAp9CmNpdG9vbCB7CgllbmFibGVfb3B0aW9uIHNpbmdsZWNvbW1pdAoKCWRpc2FibGVfb3B0aW9uIG11bHRpY29tbWl0CglkaXNhYmxlX29wdGlvbiBicmFuY2gKCWRpc2FibGVfb3B0aW9uIHRyYW5zcG9ydAp9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdWkgY29uc3RydWN0aW9uCgpzZXQgdWlfY29tbSB7fQoKIyAtLSBNZW51IEJhcgojCm1lbnUgLm1iYXIgLXRlYXJvZmYgMAoubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgUmVwb3NpdG9yeSAtbWVudSAubWJhci5yZXBvc2l0b3J5Ci5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBFZGl0IC1tZW51IC5tYmFyLmVkaXQKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBCcmFuY2ggLW1lbnUgLm1iYXIuYnJhbmNoCn0KaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XSB8fCBbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSB7CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgQ29tbWl0IC1tZW51IC5tYmFyLmNvbW1pdAp9CmlmIHtbaXNfZW5hYmxlZCB0cmFuc3BvcnRdfSB7CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgTWVyZ2UgLW1lbnUgLm1iYXIubWVyZ2UKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBGZXRjaCAtbWVudSAubWJhci5mZXRjaAoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFB1c2ggLW1lbnUgLm1iYXIucHVzaAp9Ci4gY29uZmlndXJlIC1tZW51IC5tYmFyCgojIC0tIFJlcG9zaXRvcnkgTWVudQojCm1lbnUgLm1iYXIucmVwb3NpdG9yeQoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0Jyb3dzZSBDdXJyZW50IEJyYW5jaH0gXAoJLWNvbW1hbmQge2Jyb3dzZXI6Om5ldyAkY3VycmVudF9icmFuY2h9CnRyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2JyYW5jaCB3cml0ZSAiLm1iYXIucmVwb3NpdG9yeSBlbnRyeWNvbmYgWy5tYmFyLnJlcG9zaXRvcnkgaW5kZXggbGFzdF0gLWxhYmVsIFwiQnJvd3NlIFwkY3VycmVudF9icmFuY2hcIiA7IyIKLm1iYXIucmVwb3NpdG9yeSBhZGQgc2VwYXJhdG9yCgoubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7VmlzdWFsaXplIEN1cnJlbnQgQnJhbmNofSBcCgktY29tbWFuZCB7ZG9fZ2l0ayAkY3VycmVudF9icmFuY2h9CnRyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2JyYW5jaCB3cml0ZSAiLm1iYXIucmVwb3NpdG9yeSBlbnRyeWNvbmYgWy5tYmFyLnJlcG9zaXRvcnkgaW5kZXggbGFzdF0gLWxhYmVsIFwiVmlzdWFsaXplIFwkY3VycmVudF9icmFuY2hcIiA7IyIKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Zpc3VhbGl6ZSBBbGwgQnJhbmNoZXN9IFwKCS1jb21tYW5kIHtkb19naXRrIC0tYWxsfQoubWJhci5yZXBvc2l0b3J5IGFkZCBzZXBhcmF0b3IKCmlmIHtbaXNfZW5hYmxlZCBtdWx0aWNvbW1pdF19IHsKCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgLWxhYmVsIHtEYXRhYmFzZSBTdGF0aXN0aWNzfSBcCgkJLWNvbW1hbmQgZG9fc3RhdHMKCgkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCB7Q29tcHJlc3MgRGF0YWJhc2V9IFwKCQktY29tbWFuZCBkb19nYwoKCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgLWxhYmVsIHtWZXJpZnkgRGF0YWJhc2V9IFwKCQktY29tbWFuZCBkb19mc2NrX29iamVjdHMKCgkubWJhci5yZXBvc2l0b3J5IGFkZCBzZXBhcmF0b3IKCglpZiB7W2lzX0N5Z3dpbl19IHsKCQkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKCQkJLWxhYmVsIHtDcmVhdGUgRGVza3RvcCBJY29ufSBcCgkJCS1jb21tYW5kIGRvX2N5Z3dpbl9zaG9ydGN1dAoJfSBlbHNlaWYge1tpc19XaW5kb3dzXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fd2luZG93c19zaG9ydGN1dAoJfSBlbHNlaWYge1tpc19NYWNPU1hdfSB7CgkJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgkJCS1sYWJlbCB7Q3JlYXRlIERlc2t0b3AgSWNvbn0gXAoJCQktY29tbWFuZCBkb19tYWNvc3hfYXBwCgl9Cn0KCi5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgLWxhYmVsIFF1aXQgXAoJLWNvbW1hbmQgZG9fcXVpdCBcCgktYWNjZWxlcmF0b3IgJE0xVC1RCgojIC0tIEVkaXQgTWVudQojCm1lbnUgLm1iYXIuZWRpdAoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBVbmRvIFwKCS1jb21tYW5kIHtjYXRjaCB7W2ZvY3VzXSBlZGl0IHVuZG99fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1aCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFJlZG8gXAoJLWNvbW1hbmQge2NhdGNoIHtbZm9jdXNdIGVkaXQgcmVkb319IFwKCS1hY2NlbGVyYXRvciAkTTFULVkKLm1iYXIuZWRpdCBhZGQgc2VwYXJhdG9yCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIEN1dCBcCgktY29tbWFuZCB7Y2F0Y2gge3RrX3RleHRDdXQgW2ZvY3VzXX19IFwKCS1hY2NlbGVyYXRvciAkTTFULVgKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgQ29weSBcCgktY29tbWFuZCB7Y2F0Y2gge3RrX3RleHRDb3B5IFtmb2N1c119fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1DCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFBhc3RlIFwKCS1jb21tYW5kIHtjYXRjaCB7dGtfdGV4dFBhc3RlIFtmb2N1c107IFtmb2N1c10gc2VlIGluc2VydH19IFwKCS1hY2NlbGVyYXRvciAkTTFULVYKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgRGVsZXRlIFwKCS1jb21tYW5kIHtjYXRjaCB7W2ZvY3VzXSBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0fX0gXAoJLWFjY2VsZXJhdG9yIERlbAoubWJhci5lZGl0IGFkZCBzZXBhcmF0b3IKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwge1NlbGVjdCBBbGx9IFwKCS1jb21tYW5kIHtjYXRjaCB7W2ZvY3VzXSB0YWcgYWRkIHNlbCAwLjAgZW5kfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtQQoKIyAtLSBCcmFuY2ggTWVudQojCmlmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CgltZW51IC5tYmFyLmJyYW5jaAoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge0NyZWF0ZS4uLn0gXAoJCS1jb21tYW5kIGRvX2NyZWF0ZV9icmFuY2ggXAoJCS1hY2NlbGVyYXRvciAkTTFULU4KCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0IC5tYmFyLmJyYW5jaCBlbnRyeWNvbmYgXAoJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge0RlbGV0ZS4uLn0gXAoJCS1jb21tYW5kIGRvX2RlbGV0ZV9icmFuY2gKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0IC5tYmFyLmJyYW5jaCBlbnRyeWNvbmYgXAoJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge1Jlc2V0Li4ufSBcCgkJLWNvbW1hbmQgbWVyZ2U6OnJlc2V0X2hhcmQKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0IC5tYmFyLmJyYW5jaCBlbnRyeWNvbmYgXAoJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQp9CgojIC0tIENvbW1pdCBNZW51CiMKaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XSB8fCBbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSB7CgltZW51IC5tYmFyLmNvbW1pdAoKCS5tYmFyLmNvbW1pdCBhZGQgcmFkaW9idXR0b24gXAoJCS1sYWJlbCB7TmV3IENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgkJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKCQktdmFsdWUgbmV3CglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIHJhZGlvYnV0dG9uIFwKCQktbGFiZWwge0FtZW5kIExhc3QgQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fc2VsZWN0X2NvbW1pdF90eXBlIFwKCQktdmFyaWFibGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUgXAoJCS12YWx1ZSBhbWVuZAoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBzZXBhcmF0b3IKCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIFJlc2NhbiBcCgkJLWNvbW1hbmQgZG9fcmVzY2FuIFwKCQktYWNjZWxlcmF0b3IgRjUKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge0FkZCBUbyBDb21taXR9IFwKCQktY29tbWFuZCBkb19hZGRfc2VsZWN0aW9uCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtBZGQgRXhpc3RpbmcgVG8gQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fYWRkX2FsbCBcCgkJLWFjY2VsZXJhdG9yICRNMVQtSQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7VW5zdGFnZSBGcm9tIENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX3Vuc3RhZ2Vfc2VsZWN0aW9uCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtSZXZlcnQgQ2hhbmdlc30gXAoJCS1jb21tYW5kIGRvX3JldmVydF9zZWxlY3Rpb24KCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgc2VwYXJhdG9yCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7U2lnbiBPZmZ9IFwKCQktY29tbWFuZCBkb19zaWdub2ZmIFwKCQktYWNjZWxlcmF0b3IgJE0xVC1TCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBDb21taXQgXAoJCS1jb21tYW5kIGRvX2NvbW1pdCBcCgkJLWFjY2VsZXJhdG9yICRNMVQtUmV0dXJuCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KfQoKIyAtLSBNZXJnZSBNZW51CiMKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCW1lbnUgLm1iYXIubWVyZ2UKCS5tYmFyLm1lcmdlIGFkZCBjb21tYW5kIC1sYWJlbCB7TG9jYWwgTWVyZ2UuLi59IFwKCQktY29tbWFuZCBtZXJnZTo6ZGlhbG9nCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIubWVyZ2UgZW50cnljb25mIFsubWJhci5tZXJnZSBpbmRleCBsYXN0XSAtc3RhdGVdCgkubWJhci5tZXJnZSBhZGQgY29tbWFuZCAtbGFiZWwge0Fib3J0IE1lcmdlLi4ufSBcCgkJLWNvbW1hbmQgbWVyZ2U6OnJlc2V0X2hhcmQKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5tZXJnZSBlbnRyeWNvbmYgWy5tYmFyLm1lcmdlIGluZGV4IGxhc3RdIC1zdGF0ZV0KCn0KCiMgLS0gVHJhbnNwb3J0IE1lbnUKIwppZiB7W2lzX2VuYWJsZWQgdHJhbnNwb3J0XX0gewoJbWVudSAubWJhci5mZXRjaAoKCW1lbnUgLm1iYXIucHVzaAoJLm1iYXIucHVzaCBhZGQgY29tbWFuZCAtbGFiZWwge1B1c2guLi59IFwKCQktY29tbWFuZCBkb19wdXNoX2FueXdoZXJlIFwKCQktYWNjZWxlcmF0b3IgJE0xVC1QCn0KCmlmIHtbaXNfTWFjT1NYXX0gewoJIyAtLSBBcHBsZSBNZW51IChNYWMgT1MgWCBvbmx5KQoJIwoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEFwcGxlIC1tZW51IC5tYmFyLmFwcGxlCgltZW51IC5tYmFyLmFwcGxlCgoJLm1iYXIuYXBwbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dCBbYXBwbmFtZV0iIFwKCQktY29tbWFuZCBkb19hYm91dAoJLm1iYXIuYXBwbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJPcHRpb25zLi4uIiBcCgkJLWNvbW1hbmQgZG9fb3B0aW9ucwp9IGVsc2UgewoJIyAtLSBFZGl0IE1lbnUKCSMKCS5tYmFyLmVkaXQgYWRkIHNlcGFyYXRvcgoJLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwge09wdGlvbnMuLi59IFwKCQktY29tbWFuZCBkb19vcHRpb25zCgoJIyAtLSBUb29scyBNZW51CgkjCglpZiB7W2lzX0N5Z3dpbl0gJiYgW2ZpbGUgZXhpc3RzIC91c3IvbG9jYWwvbWlnYS9saWIvZ3VpLW1pZ2FdfSB7Cglwcm9jIGRvX21pZ2Ege30gewoJCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUKCQlpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoJCXNldCBjbWQgW2xpc3Qgc2ggLS1sb2dpbiAtYyAiL3Vzci9sb2NhbC9taWdhL2xpYi9ndWktbWlnYSBcIltwd2RdXCIiXQoJCXNldCBtaWdhX2ZkIFtvcGVuICJ8JGNtZCIgcl0KCQlmY29uZmlndXJlICRtaWdhX2ZkIC1ibG9ja2luZyAwCgkJZmlsZWV2ZW50ICRtaWdhX2ZkIHJlYWRhYmxlIFtsaXN0IG1pZ2FfZG9uZSAkbWlnYV9mZF0KCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSdW5uaW5nIG1pZ2EuLi59Cgl9Cglwcm9jIG1pZ2FfZG9uZSB7ZmR9IHsKCQlyZWFkICRmZCA1MTIKCQlpZiB7W2VvZiAkZmRdfSB7CgkJCWNsb3NlICRmZAoJCQl1bmxvY2tfaW5kZXgKCQkJcmVzY2FuIFtsaXN0IHNldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln1dCgkJfQoJfQoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFRvb2xzIC1tZW51IC5tYmFyLnRvb2xzCgltZW51IC5tYmFyLnRvb2xzCgkubWJhci50b29scyBhZGQgY29tbWFuZCAtbGFiZWwgIk1pZ3JhdGUiIFwKCQktY29tbWFuZCBkb19taWdhCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIudG9vbHMgZW50cnljb25mIFsubWJhci50b29scyBpbmRleCBsYXN0XSAtc3RhdGVdCgl9Cn0KCiMgLS0gSGVscCBNZW51CiMKLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEhlbHAgLW1lbnUgLm1iYXIuaGVscAptZW51IC5tYmFyLmhlbHAKCmlmIHshW2lzX01hY09TWF19IHsKCS5tYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dCBbYXBwbmFtZV0iIFwKCQktY29tbWFuZCBkb19hYm91dAp9CgpzZXQgYnJvd3NlciB7fQpjYXRjaCB7c2V0IGJyb3dzZXIgJHJlcG9fY29uZmlnKGluc3Rhd2ViLmJyb3dzZXIpfQpzZXQgZG9jX3BhdGggW2ZpbGUgZGlybmFtZSBbZ2l0ZXhlY11dCnNldCBkb2NfcGF0aCBbZmlsZSBqb2luICRkb2NfcGF0aCBEb2N1bWVudGF0aW9uIGluZGV4Lmh0bWxdCgppZiB7W2lzX0N5Z3dpbl19IHsKCXNldCBkb2NfcGF0aCBbZXhlYyBjeWdwYXRoIC0tbWl4ZWQgJGRvY19wYXRoXQp9CgppZiB7JGJyb3dzZXIgZXEge319IHsKCWlmIHtbaXNfTWFjT1NYXX0gewoJCXNldCBicm93c2VyIG9wZW4KCX0gZWxzZWlmIHtbaXNfQ3lnd2luXX0gewoJCXNldCBwcm9ncmFtX2ZpbGVzIFtmaWxlIGRpcm5hbWUgW2V4ZWMgY3lncGF0aCAtLXdpbmRpcl1dCgkJc2V0IHByb2dyYW1fZmlsZXMgW2ZpbGUgam9pbiAkcHJvZ3JhbV9maWxlcyB7UHJvZ3JhbSBGaWxlc31dCgkJc2V0IGZpcmVmb3ggW2ZpbGUgam9pbiAkcHJvZ3JhbV9maWxlcyB7TW96aWxsYSBGaXJlZm94fSBmaXJlZm94LmV4ZV0KCQlzZXQgaWUgW2ZpbGUgam9pbiAkcHJvZ3JhbV9maWxlcyB7SW50ZXJuZXQgRXhwbG9yZXJ9IElFWFBMT1JFLkVYRV0KCQlpZiB7W2ZpbGUgZXhpc3RzICRmaXJlZm94XX0gewoJCQlzZXQgYnJvd3NlciAkZmlyZWZveAoJCX0gZWxzZWlmIHtbZmlsZSBleGlzdHMgJGllXX0gewoJCQlzZXQgYnJvd3NlciAkaWUKCQl9CgkJdW5zZXQgcHJvZ3JhbV9maWxlcyBmaXJlZm94IGllCgl9Cn0KCmlmIHtbZmlsZSBpc2ZpbGUgJGRvY19wYXRoXX0gewoJc2V0IGRvY191cmwgImZpbGU6JGRvY19wYXRoIgp9IGVsc2UgewoJc2V0IGRvY191cmwge2h0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL30KfQoKaWYgeyRicm93c2VyIG5lIHt9fSB7CgkubWJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCB7T25saW5lIERvY3VtZW50YXRpb259IFwKCQktY29tbWFuZCBbbGlzdCBleGVjICRicm93c2VyICRkb2NfdXJsICZdCn0KdW5zZXQgYnJvd3NlciBkb2NfcGF0aCBkb2NfdXJsCgojIC0tIFN0YW5kYXJkIGJpbmRpbmdzCiMKd20gcHJvdG9jb2wgLiBXTV9ERUxFVEVfV0lORE9XIGRvX3F1aXQKYmluZCBhbGwgPCRNMUItS2V5LXE+IGRvX3F1aXQKYmluZCBhbGwgPCRNMUItS2V5LVE+IGRvX3F1aXQKYmluZCBhbGwgPCRNMUItS2V5LXc+IHtkZXN0cm95IFt3aW5mbyB0b3BsZXZlbCAlV119CmJpbmQgYWxsIDwkTTFCLUtleS1XPiB7ZGVzdHJveSBbd2luZm8gdG9wbGV2ZWwgJVddfQoKc2V0IHN1YmNvbW1hbmRfYXJncyB7fQpwcm9jIHVzYWdlIHt9IHsKCXB1dHMgc3RkZXJyICJ1c2FnZTogJDo6YXJndjAgJDo6c3ViY29tbWFuZCAkOjpzdWJjb21tYW5kX2FyZ3MiCglleGl0IDEKfQoKIyAtLSBOb3QgYSBub3JtYWwgY29tbWl0IHR5cGUgaW52b2NhdGlvbj8gIERvIHRoYXQgaW5zdGVhZCEKIwpzd2l0Y2ggLS0gJHN1YmNvbW1hbmQgewpicm93c2VyIHsKCXNldCBzdWJjb21tYW5kX2FyZ3Mge3Jldj99Cglzd2l0Y2ggW2xsZW5ndGggJGFyZ3ZdIHsKCTAgewoJCXNldCBjdXJyZW50X2JyYW5jaCBbZ2l0IHN5bWJvbGljLXJlZiBIRUFEXQoJCXJlZ3N1YiBecmVmcy8oKGhlYWRzfHRhZ3N8cmVtb3RlcykvKT8gXAoJCQkkY3VycmVudF9icmFuY2gge30gY3VycmVudF9icmFuY2gKCX0KCTEgewoJCXNldCBjdXJyZW50X2JyYW5jaCBbbGluZGV4ICRhcmd2IDBdCgl9CglkZWZhdWx0IHVzYWdlCgl9Cglicm93c2VyOjpuZXcgJGN1cnJlbnRfYnJhbmNoCglyZXR1cm4KfQpibGFtZSB7CglzZXQgc3ViY29tbWFuZF9hcmdzIHtyZXY/IHBhdGg/fQoJc2V0IGhlYWQge30KCXNldCBwYXRoIHt9CglzZXQgaXNfcGF0aCAwCglmb3JlYWNoIGEgJGFyZ3YgewoJCWlmIHskaXNfcGF0aCB8fCBbZmlsZSBleGlzdHMgJF9wcmVmaXgkYV19IHsKCQkJaWYgeyRwYXRoIG5lIHt9fSB1c2FnZQoJCQlzZXQgcGF0aCAkX3ByZWZpeCRhCgkJCWJyZWFrCgkJfSBlbHNlaWYgeyRhIGVxIHstLX19IHsKCQkJaWYgeyRwYXRoIG5lIHt9fSB7CgkJCQlpZiB7JGhlYWQgbmUge319IHVzYWdlCgkJCQlzZXQgaGVhZCAkcGF0aAoJCQkJc2V0IHBhdGgge30KCQkJfQoJCQlzZXQgaXNfcGF0aCAxCgkJfSBlbHNlaWYgeyRoZWFkIGVxIHt9fSB7CgkJCWlmIHskaGVhZCBuZSB7fX0gdXNhZ2UKCQkJc2V0IGhlYWQgJGEKCQl9IGVsc2UgewoJCQl1c2FnZQoJCX0KCX0KCXVuc2V0IGlzX3BhdGgKCglpZiB7JGhlYWQgZXEge319IHsKCQlzZXQgY3VycmVudF9icmFuY2ggW2dpdCBzeW1ib2xpYy1yZWYgSEVBRF0KCQlyZWdzdWIgXnJlZnMvKChoZWFkc3x0YWdzfHJlbW90ZXMpLyk/IFwKCQkJJGN1cnJlbnRfYnJhbmNoIHt9IGN1cnJlbnRfYnJhbmNoCgl9IGVsc2UgewoJCXNldCBjdXJyZW50X2JyYW5jaCAkaGVhZAoJfQoKCWlmIHskcGF0aCBlcSB7fX0gdXNhZ2UKCWJsYW1lOjpuZXcgJGhlYWQgJHBhdGgKCXJldHVybgp9CmNpdG9vbCAtCmd1aSB7CglpZiB7W2xsZW5ndGggJGFyZ3ZdICE9IDB9IHsKCQlwdXRzIC1ub25ld2xpbmUgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIgoJCWlmIHskc3ViY29tbWFuZCBuZSB7Z3VpfSAmJiBbYXBwbmFtZV0gbmUgImdpdC0kc3ViY29tbWFuZCJ9IHsKCQkJcHV0cyAtbm9uZXdsaW5lIHN0ZGVyciAiICRzdWJjb21tYW5kIgoJCX0KCQlwdXRzIHN0ZGVyciB7fQoJCWV4aXQgMQoJfQoJIyBmYWxsIHRocm91Z2ggdG8gc2V0dXAgVUkgZm9yIGNvbW1pdHMKfQpkZWZhdWx0IHsKCXB1dHMgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIFxbe2JsYW1lfGJyb3dzZXJ8Y2l0b29sfVxdIgoJZXhpdCAxCn0KfQoKIyAtLSBCcmFuY2ggQ29udHJvbAojCmZyYW1lIC5icmFuY2ggXAoJLWJvcmRlcndpZHRoIDEgXAoJLXJlbGllZiBzdW5rZW4KbGFiZWwgLmJyYW5jaC5sMSBcCgktdGV4dCB7Q3VycmVudCBCcmFuY2g6fSBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdApsYWJlbCAuYnJhbmNoLmNiIFwKCS10ZXh0dmFyaWFibGUgY3VycmVudF9icmFuY2ggXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQKcGFjayAuYnJhbmNoLmwxIC1zaWRlIGxlZnQKcGFjayAuYnJhbmNoLmNiIC1zaWRlIGxlZnQgLWZpbGwgeApwYWNrIC5icmFuY2ggLXNpZGUgdG9wIC1maWxsIHgKCiMgLS0gTWFpbiBXaW5kb3cgTGF5b3V0CiMKcGFuZWR3aW5kb3cgLnZwYW5lIC1vcmllbnQgdmVydGljYWwKcGFuZWR3aW5kb3cgLnZwYW5lLmZpbGVzIC1vcmllbnQgaG9yaXpvbnRhbAoudnBhbmUgYWRkIC52cGFuZS5maWxlcyAtc3RpY2t5IG5zZXcgLWhlaWdodCAxMDAgLXdpZHRoIDIwMApwYWNrIC52cGFuZSAtYW5jaG9yIG4gLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgojIC0tIEluZGV4IEZpbGUgTGlzdAojCmZyYW1lIC52cGFuZS5maWxlcy5pbmRleCAtaGVpZ2h0IDEwMCAtd2lkdGggMjAwCmxhYmVsIC52cGFuZS5maWxlcy5pbmRleC50aXRsZSAtdGV4dCB7U3RhZ2VkIENoYW5nZXMgKFdpbGwgQmUgQ29tbWl0dGVkKX0gXAoJLWJhY2tncm91bmQgbGlnaHRncmVlbgp0ZXh0ICR1aV9pbmRleCAtYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgktd2lkdGggMjAgLWhlaWdodCAxMCBcCgktd3JhcCBub25lIFwKCS1jdXJzb3IgJGN1cnNvcl9wdHIgXAoJLXhzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMuaW5kZXguc3ggc2V0fSBcCgkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy5pbmRleC5zeSBzZXR9IFwKCS1zdGF0ZSBkaXNhYmxlZApzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLmluZGV4LnN4IC1vcmllbnQgaCAtY29tbWFuZCBbbGlzdCAkdWlfaW5kZXggeHZpZXddCnNjcm9sbGJhciAudnBhbmUuZmlsZXMuaW5kZXguc3kgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR1aV9pbmRleCB5dmlld10KcGFjayAudnBhbmUuZmlsZXMuaW5kZXgudGl0bGUgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMuaW5kZXguc3ggLXNpZGUgYm90dG9tIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMuaW5kZXguc3kgLXNpZGUgcmlnaHQgLWZpbGwgeQpwYWNrICR1aV9pbmRleCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCi52cGFuZS5maWxlcyBhZGQgLnZwYW5lLmZpbGVzLmluZGV4IC1zdGlja3kgbnNldwoKIyAtLSBXb3JraW5nIERpcmVjdG9yeSBGaWxlIExpc3QKIwpmcmFtZSAudnBhbmUuZmlsZXMud29ya2RpciAtaGVpZ2h0IDEwMCAtd2lkdGggMjAwCmxhYmVsIC52cGFuZS5maWxlcy53b3JrZGlyLnRpdGxlIC10ZXh0IHtVbnN0YWdlZCBDaGFuZ2VzIChXaWxsIE5vdCBCZSBDb21taXR0ZWQpfSBcCgktYmFja2dyb3VuZCBsaWdodHNhbG1vbgp0ZXh0ICR1aV93b3JrZGlyIC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCS13aWR0aCAyMCAtaGVpZ2h0IDEwIFwKCS13cmFwIG5vbmUgXAoJLWN1cnNvciAkY3Vyc29yX3B0ciBcCgkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy53b3JrZGlyLnN4IHNldH0gXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMud29ya2Rpci5zeSBzZXR9IFwKCS1zdGF0ZSBkaXNhYmxlZApzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR1aV93b3JrZGlyIHh2aWV3XQpzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3kgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR1aV93b3JrZGlyIHl2aWV3XQpwYWNrIC52cGFuZS5maWxlcy53b3JrZGlyLnRpdGxlIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggLXNpZGUgYm90dG9tIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci5zeSAtc2lkZSByaWdodCAtZmlsbCB5CnBhY2sgJHVpX3dvcmtkaXIgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoudnBhbmUuZmlsZXMgYWRkIC52cGFuZS5maWxlcy53b3JrZGlyIC1zdGlja3kgbnNldwoKZm9yZWFjaCBpIFtsaXN0ICR1aV9pbmRleCAkdWlfd29ya2Rpcl0gewoJJGkgdGFnIGNvbmYgaW5fZGlmZiAtYmFja2dyb3VuZCBsaWdodGdyYXkKCSRpIHRhZyBjb25mIGluX3NlbCAgLWJhY2tncm91bmQgbGlnaHRncmF5Cn0KdW5zZXQgaQoKIyAtLSBEaWZmIGFuZCBDb21taXQgQXJlYQojCmZyYW1lIC52cGFuZS5sb3dlciAtaGVpZ2h0IDMwMCAtd2lkdGggNDAwCmZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYQpmcmFtZSAudnBhbmUubG93ZXIuZGlmZiAtcmVsaWVmIHN1bmtlbiAtYm9yZGVyd2lkdGggMQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYSAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5kaWZmIC1zaWRlIGJvdHRvbSAtZmlsbCBib3RoIC1leHBhbmQgMQoudnBhbmUgYWRkIC52cGFuZS5sb3dlciAtc3RpY2t5IG5zZXcKCiMgLS0gQ29tbWl0IEFyZWEgQnV0dG9ucwojCmZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zCmxhYmVsIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmwgLXRleHQge30gXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5sIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMgLXNpZGUgbGVmdCAtZmlsbCB5CgpidXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMucmVzY2FuIC10ZXh0IHtSZXNjYW59IFwKCS1jb21tYW5kIGRvX3Jlc2NhbgpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiAtc2lkZSB0b3AgLWZpbGwgeApsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgl7LnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMucmVzY2FuIGNvbmYgLXN0YXRlfQoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmluY2FsbCAtdGV4dCB7QWRkIEV4aXN0aW5nfSBcCgktY29tbWFuZCBkb19hZGRfYWxsCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuaW5jYWxsIC1zaWRlIHRvcCAtZmlsbCB4CmxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCXsudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5pbmNhbGwgY29uZiAtc3RhdGV9CgpidXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuc2lnbm9mZiAtdGV4dCB7U2lnbiBPZmZ9IFwKCS1jb21tYW5kIGRvX3NpZ25vZmYKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5zaWdub2ZmIC1zaWRlIHRvcCAtZmlsbCB4CgpidXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuY29tbWl0IC10ZXh0IHtDb21taXR9IFwKCS1jb21tYW5kIGRvX2NvbW1pdApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCAtc2lkZSB0b3AgLWZpbGwgeApsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgl7LnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuY29tbWl0IGNvbmYgLXN0YXRlfQoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnB1c2ggLXRleHQge1B1c2h9IFwKCS1jb21tYW5kIGRvX3B1c2hfYW55d2hlcmUKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5wdXNoIC1zaWRlIHRvcCAtZmlsbCB4CgojIC0tIENvbW1pdCBNZXNzYWdlIEJ1ZmZlcgojCmZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIKZnJhbWUgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIKc2V0IHVpX2NvbW0gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci50CnNldCB1aV9jb21sIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmwKcmFkaW9idXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubmV3IFwKCS10ZXh0IHtOZXcgQ29tbWl0fSBcCgktY29tbWFuZCBkb19zZWxlY3RfY29tbWl0X3R5cGUgXAoJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKCS12YWx1ZSBuZXcKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJW2xpc3QgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubmV3IGNvbmYgLXN0YXRlXQpyYWRpb2J1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5hbWVuZCBcCgktdGV4dCB7QW1lbmQgTGFzdCBDb21taXR9IFwKCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgktdmFyaWFibGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUgXAoJLXZhbHVlIGFtZW5kCmxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCVtsaXN0IC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmFtZW5kIGNvbmYgLXN0YXRlXQpsYWJlbCAkdWlfY29tbCBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdApwcm9jIHRyYWNlX2NvbW1pdF90eXBlIHt2YXJuYW1lIGFyZ3N9IHsKCWdsb2JhbCB1aV9jb21sIGNvbW1pdF90eXBlCglzd2l0Y2ggLWdsb2IgLS0gJGNvbW1pdF90eXBlIHsKCWluaXRpYWwgICAgICAge3NldCB0eHQge0luaXRpYWwgQ29tbWl0IE1lc3NhZ2U6fX0KCWFtZW5kICAgICAgICAge3NldCB0eHQge0FtZW5kZWQgQ29tbWl0IE1lc3NhZ2U6fX0KCWFtZW5kLWluaXRpYWwge3NldCB0eHQge0FtZW5kZWQgSW5pdGlhbCBDb21taXQgTWVzc2FnZTp9fQoJYW1lbmQtbWVyZ2UgICB7c2V0IHR4dCB7QW1lbmRlZCBNZXJnZSBDb21taXQgTWVzc2FnZTp9fQoJbWVyZ2UgICAgICAgICB7c2V0IHR4dCB7TWVyZ2UgQ29tbWl0IE1lc3NhZ2U6fX0KCSogICAgICAgICAgICAge3NldCB0eHQge0NvbW1pdCBNZXNzYWdlOn19Cgl9CgkkdWlfY29tbCBjb25mIC10ZXh0ICR0eHQKfQp0cmFjZSBhZGQgdmFyaWFibGUgY29tbWl0X3R5cGUgd3JpdGUgdHJhY2VfY29tbWl0X3R5cGUKcGFjayAkdWlfY29tbCAtc2lkZSBsZWZ0IC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5hbWVuZCAtc2lkZSByaWdodApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLm5ldyAtc2lkZSByaWdodAoKdGV4dCAkdWlfY29tbSAtYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMSBcCgktdW5kbyB0cnVlIFwKCS1tYXh1bmRvIDIwIFwKCS1hdXRvc2VwYXJhdG9ycyB0cnVlIFwKCS1yZWxpZWYgc3Vua2VuIFwKCS13aWR0aCA3NSAtaGVpZ2h0IDkgLXdyYXAgbm9uZSBcCgktZm9udCBmb250X2RpZmYgXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnNieSBzZXR9CnNjcm9sbGJhciAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnNieSBcCgktY29tbWFuZCBbbGlzdCAkdWlfY29tbSB5dmlld10KcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKcGFjayAkdWlfY29tbSAtc2lkZSBsZWZ0IC1maWxsIHkKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyIC1zaWRlIGxlZnQgLWZpbGwgeQoKIyAtLSBDb21taXQgTWVzc2FnZSBCdWZmZXIgQ29udGV4dCBNZW51CiMKc2V0IGN0eG0gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5jdHhtCm1lbnUgJGN0eG0gLXRlYXJvZmYgMAokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0N1dH0gXAoJLWNvbW1hbmQge3RrX3RleHRDdXQgJHVpX2NvbW19CiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q29weX0gXAoJLWNvbW1hbmQge3RrX3RleHRDb3B5ICR1aV9jb21tfQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Bhc3RlfSBcCgktY29tbWFuZCB7dGtfdGV4dFBhc3RlICR1aV9jb21tfQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0RlbGV0ZX0gXAoJLWNvbW1hbmQgeyR1aV9jb21tIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3R9CiRjdHhtIGFkZCBzZXBhcmF0b3IKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktY29tbWFuZCB7Zm9jdXMgJHVpX2NvbW07JHVpX2NvbW0gdGFnIGFkZCBzZWwgMC4wIGVuZH0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDb3B5IEFsbH0gXAoJLWNvbW1hbmQgewoJCSR1aV9jb21tIHRhZyBhZGQgc2VsIDAuMCBlbmQKCQl0a190ZXh0Q29weSAkdWlfY29tbQoJCSR1aV9jb21tIHRhZyByZW1vdmUgc2VsIDAuMCBlbmQKCX0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1NpZ24gT2ZmfSBcCgktY29tbWFuZCBkb19zaWdub2ZmCmJpbmRfYnV0dG9uMyAkdWlfY29tbSAidGtfcG9wdXAgJGN0eG0gJVggJVkiCgojIC0tIERpZmYgSGVhZGVyCiMKcHJvYyB0cmFjZV9jdXJyZW50X2RpZmZfcGF0aCB7dmFybmFtZSBhcmdzfSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggZGlmZl9hY3Rpb25zIGZpbGVfc3RhdGVzCglpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIGVxIHt9fSB7CgkJc2V0IHMge30KCQlzZXQgZiB7fQoJCXNldCBwIHt9CgkJc2V0IG8gZGlzYWJsZWQKCX0gZWxzZSB7CgkJc2V0IHAgJGN1cnJlbnRfZGlmZl9wYXRoCgkJc2V0IHMgW21hcGRlc2MgW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHApIDBdICRwXQoJCXNldCBmIHtGaWxlOn0KCQlzZXQgcCBbZXNjYXBlX3BhdGggJHBdCgkJc2V0IG8gbm9ybWFsCgl9CgoJLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnN0YXR1cyBjb25maWd1cmUgLXRleHQgJHMKCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIGNvbmZpZ3VyZSAtdGV4dCAkZgoJLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnBhdGggY29uZmlndXJlIC10ZXh0ICRwCglmb3JlYWNoIHcgJGRpZmZfYWN0aW9ucyB7CgkJdXBsZXZlbCAjMCAkdyAkbwoJfQp9CnRyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2RpZmZfcGF0aCB3cml0ZSB0cmFjZV9jdXJyZW50X2RpZmZfcGF0aAoKZnJhbWUgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyIC1iYWNrZ3JvdW5kIGdvbGQKbGFiZWwgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnN0YXR1cyBcCgktYmFja2dyb3VuZCBnb2xkIFwKCS13aWR0aCAkbWF4X3N0YXR1c19kZXNjIFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0CmxhYmVsIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIFwKCS1iYWNrZ3JvdW5kIGdvbGQgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQKbGFiZWwgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnBhdGggXAoJLWJhY2tncm91bmQgZ29sZCBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5zdGF0dXMgLXNpZGUgbGVmdApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIC1zaWRlIGxlZnQKcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCAtZmlsbCB4CnNldCBjdHhtIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5jdHhtCm1lbnUgJGN0eG0gLXRlYXJvZmYgMAokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHl9IFwKCS1jb21tYW5kIHsKCQljbGlwYm9hcmQgY2xlYXIKCQljbGlwYm9hcmQgYXBwZW5kIFwKCQkJLWZvcm1hdCBTVFJJTkcgXAoJCQktdHlwZSBTVFJJTkcgXAoJCQktLSAkY3VycmVudF9kaWZmX3BhdGgKCX0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCmJpbmRfYnV0dG9uMyAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCAidGtfcG9wdXAgJGN0eG0gJVggJVkiCgojIC0tIERpZmYgQm9keQojCmZyYW1lIC52cGFuZS5sb3dlci5kaWZmLmJvZHkKc2V0IHVpX2RpZmYgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS50CnRleHQgJHVpX2RpZmYgLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDAgXAoJLXdpZHRoIDgwIC1oZWlnaHQgMTUgLXdyYXAgbm9uZSBcCgktZm9udCBmb250X2RpZmYgXAoJLXhzY3JvbGxjb21tYW5kIHsudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieCBzZXR9IFwKCS15c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnkgc2V0fSBcCgktc3RhdGUgZGlzYWJsZWQKc2Nyb2xsYmFyIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J4IC1vcmllbnQgaG9yaXpvbnRhbCBcCgktY29tbWFuZCBbbGlzdCAkdWlfZGlmZiB4dmlld10Kc2Nyb2xsYmFyIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J5IC1vcmllbnQgdmVydGljYWwgXAoJLWNvbW1hbmQgW2xpc3QgJHVpX2RpZmYgeXZpZXddCnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnggLXNpZGUgYm90dG9tIC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieSAtc2lkZSByaWdodCAtZmlsbCB5CnBhY2sgJHVpX2RpZmYgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQpwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmJvZHkgLXNpZGUgYm90dG9tIC1maWxsIGJvdGggLWV4cGFuZCAxCgokdWlfZGlmZiB0YWcgY29uZiBkX2NyIC1lbGlkZSB0cnVlCiR1aV9kaWZmIHRhZyBjb25mIGRfQCAtZm9yZWdyb3VuZCBibHVlIC1mb250IGZvbnRfZGlmZmJvbGQKJHVpX2RpZmYgdGFnIGNvbmYgZF8rIC1mb3JlZ3JvdW5kIHsjMDBhMDAwfQokdWlfZGlmZiB0YWcgY29uZiBkXy0gLWZvcmVncm91bmQgcmVkCgokdWlfZGlmZiB0YWcgY29uZiBkXysrIC1mb3JlZ3JvdW5kIHsjMDBhMDAwfQokdWlfZGlmZiB0YWcgY29uZiBkXy0tIC1mb3JlZ3JvdW5kIHJlZAokdWlfZGlmZiB0YWcgY29uZiBkXytzIFwKCS1mb3JlZ3JvdW5kIHsjMDBhMDAwfSBcCgktYmFja2dyb3VuZCB7I2UyZWZmYX0KJHVpX2RpZmYgdGFnIGNvbmYgZF8tcyBcCgktZm9yZWdyb3VuZCByZWQgXAoJLWJhY2tncm91bmQgeyNlMmVmZmF9CiR1aV9kaWZmIHRhZyBjb25mIGRfcysgXAoJLWZvcmVncm91bmQgeyMwMGEwMDB9IFwKCS1iYWNrZ3JvdW5kIGl2b3J5MQokdWlfZGlmZiB0YWcgY29uZiBkX3MtIFwKCS1mb3JlZ3JvdW5kIHJlZCBcCgktYmFja2dyb3VuZCBpdm9yeTEKCiR1aV9kaWZmIHRhZyBjb25mIGQ8PDw8PDw8IFwKCS1mb3JlZ3JvdW5kIG9yYW5nZSBcCgktZm9udCBmb250X2RpZmZib2xkCiR1aV9kaWZmIHRhZyBjb25mIGQ9PT09PT09IFwKCS1mb3JlZ3JvdW5kIG9yYW5nZSBcCgktZm9udCBmb250X2RpZmZib2xkCiR1aV9kaWZmIHRhZyBjb25mIGQ+Pj4+Pj4+IFwKCS1mb3JlZ3JvdW5kIG9yYW5nZSBcCgktZm9udCBmb250X2RpZmZib2xkCgokdWlfZGlmZiB0YWcgcmFpc2Ugc2VsCgojIC0tIERpZmYgQm9keSBDb250ZXh0IE1lbnUKIwpzZXQgY3R4bSAudnBhbmUubG93ZXIuZGlmZi5ib2R5LmN0eG0KbWVudSAkY3R4bSAtdGVhcm9mZiAwCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7UmVmcmVzaH0gXAoJLWNvbW1hbmQgcmVzaG93X2RpZmYKbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q29weX0gXAoJLWNvbW1hbmQge3RrX3RleHRDb3B5ICR1aV9kaWZmfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktY29tbWFuZCB7Zm9jdXMgJHVpX2RpZmY7JHVpX2RpZmYgdGFnIGFkZCBzZWwgMC4wIGVuZH0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q29weSBBbGx9IFwKCS1jb21tYW5kIHsKCQkkdWlfZGlmZiB0YWcgYWRkIHNlbCAwLjAgZW5kCgkJdGtfdGV4dENvcHkgJHVpX2RpZmYKCQkkdWlfZGlmZiB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kCgl9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7QXBwbHkvUmV2ZXJzZSBIdW5rfSBcCgktY29tbWFuZCB7YXBwbHlfaHVuayAkY3Vyc29yWCAkY3Vyc29yWX0Kc2V0IHVpX2RpZmZfYXBwbHlodW5rIFskY3R4bSBpbmRleCBsYXN0XQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgJHVpX2RpZmZfYXBwbHlodW5rIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0RlY3JlYXNlIEZvbnQgU2l6ZX0gXAoJLWNvbW1hbmQge2luY3JfZm9udF9zaXplIGZvbnRfZGlmZiAtMX0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7SW5jcmVhc2UgRm9udCBTaXplfSBcCgktY29tbWFuZCB7aW5jcl9mb250X3NpemUgZm9udF9kaWZmIDF9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7U2hvdyBMZXNzIENvbnRleHR9IFwKCS1jb21tYW5kIHtpZiB7JHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkgPj0gMX0gewoJCWluY3IgcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSAtMQoJCXJlc2hvd19kaWZmCgl9fQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTaG93IE1vcmUgQ29udGV4dH0gXAoJLWNvbW1hbmQge2lmIHskcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSA8IDk5fSB7CgkJaW5jciByZXBvX2NvbmZpZyhndWkuZGlmZmNvbnRleHQpCgkJcmVzaG93X2RpZmYKCX19CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIC1sYWJlbCB7T3B0aW9ucy4uLn0gXAoJLWNvbW1hbmQgZG9fb3B0aW9ucwpiaW5kX2J1dHRvbjMgJHVpX2RpZmYgIgoJc2V0IGN1cnNvclggJXgKCXNldCBjdXJzb3JZICV5CglpZiB7XCR1aV9pbmRleCBlcSBcJGN1cnJlbnRfZGlmZl9zaWRlfSB7CgkJJGN0eG0gZW50cnljb25mICR1aV9kaWZmX2FwcGx5aHVuayAtbGFiZWwge1Vuc3RhZ2UgSHVuayBGcm9tIENvbW1pdH0KCX0gZWxzZSB7CgkJJGN0eG0gZW50cnljb25mICR1aV9kaWZmX2FwcGx5aHVuayAtbGFiZWwge1N0YWdlIEh1bmsgRm9yIENvbW1pdH0KCX0KCXRrX3BvcHVwICRjdHhtICVYICVZCiIKdW5zZXQgdWlfZGlmZl9hcHBseWh1bmsKCiMgLS0gU3RhdHVzIEJhcgojCmxhYmVsIC5zdGF0dXMgLXRleHR2YXJpYWJsZSB1aV9zdGF0dXNfdmFsdWUgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWJvcmRlcndpZHRoIDEgXAoJLXJlbGllZiBzdW5rZW4KcGFjayAuc3RhdHVzIC1hbmNob3IgdyAtc2lkZSBib3R0b20gLWZpbGwgeAoKIyAtLSBMb2FkIGdlb21ldHJ5CiMKY2F0Y2ggewpzZXQgZ20gJHJlcG9fY29uZmlnKGd1aS5nZW9tZXRyeSkKd20gZ2VvbWV0cnkgLiBbbGluZGV4ICRnbSAwXQoudnBhbmUgc2FzaCBwbGFjZSAwIFwKCVtsaW5kZXggWy52cGFuZSBzYXNoIGNvb3JkIDBdIDBdIFwKCVtsaW5kZXggJGdtIDFdCi52cGFuZS5maWxlcyBzYXNoIHBsYWNlIDAgXAoJW2xpbmRleCAkZ20gMl0gXAoJW2xpbmRleCBbLnZwYW5lLmZpbGVzIHNhc2ggY29vcmQgMF0gMV0KdW5zZXQgZ20KfQoKIyAtLSBLZXkgQmluZGluZ3MKIwpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1SZXR1cm4+IHtkb19jb21taXQ7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LWk+IHtkb19hZGRfYWxsO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1JPiB7ZG9fYWRkX2FsbDticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXkteD4ge3RrX3RleHRDdXQgJVc7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVg+IHt0a190ZXh0Q3V0ICVXO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1jPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LUM+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktdj4ge3RrX3RleHRQYXN0ZSAlVzsgJVcgc2VlIGluc2VydDsgYnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVY+IHt0a190ZXh0UGFzdGUgJVc7ICVXIHNlZSBpbnNlcnQ7IGJyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1hPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktQT4geyVXIHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWt9CgpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS14PiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LVg+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktYz4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1DPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LXY+IHticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktVj4ge2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1hPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktQT4geyVXIHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1VcD4gICAgIHtjYXRjaCB7JVcgeXZpZXcgc2Nyb2xsIC0xIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LURvd24+ICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktTGVmdD4gICB7Y2F0Y2ggeyVXIHh2aWV3IHNjcm9sbCAtMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1SaWdodD4gIHtjYXRjaCB7JVcgeHZpZXcgc2Nyb2xsICAxIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LWs+ICAgICAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktaj4gICAgICAgICB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAgMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1oPiAgICAgICAgIHtjYXRjaCB7JVcgeHZpZXcgc2Nyb2xsIC0xIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LWw+ICAgICAgICAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxDb250cm9sLUtleS1iPiB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAtMSBwYWdlc307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPENvbnRyb2wtS2V5LWY+IHtjYXRjaCB7JVcgeXZpZXcgc2Nyb2xsICAxIHBhZ2VzfTticmVha30KYmluZCAkdWlfZGlmZiA8QnV0dG9uLTE+ICAge2ZvY3VzICVXfQoKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCWJpbmQgLiA8JE0xQi1LZXktbj4gZG9fY3JlYXRlX2JyYW5jaAoJYmluZCAuIDwkTTFCLUtleS1OPiBkb19jcmVhdGVfYnJhbmNoCn0KaWYge1tpc19lbmFibGVkIHRyYW5zcG9ydF19IHsKCWJpbmQgLiA8JE0xQi1LZXktcD4gZG9fcHVzaF9hbnl3aGVyZQoJYmluZCAuIDwkTTFCLUtleS1QPiBkb19wdXNoX2FueXdoZXJlCn0KCmJpbmQgLiAgIDxLZXktRjU+ICAgICBkb19yZXNjYW4KYmluZCAuICAgPCRNMUItS2V5LXI+IGRvX3Jlc2NhbgpiaW5kIC4gICA8JE0xQi1LZXktUj4gZG9fcmVzY2FuCmJpbmQgLiAgIDwkTTFCLUtleS1zPiBkb19zaWdub2ZmCmJpbmQgLiAgIDwkTTFCLUtleS1TPiBkb19zaWdub2ZmCmJpbmQgLiAgIDwkTTFCLUtleS1pPiBkb19hZGRfYWxsCmJpbmQgLiAgIDwkTTFCLUtleS1JPiBkb19hZGRfYWxsCmJpbmQgLiAgIDwkTTFCLUtleS1SZXR1cm4+IGRvX2NvbW1pdApmb3JlYWNoIGkgW2xpc3QgJHVpX2luZGV4ICR1aV93b3JrZGlyXSB7CgliaW5kICRpIDxCdXR0b24tMT4gICAgICAgInRvZ2dsZV9vcl9kaWZmICAgICAgICAgJGkgJXggJXk7IGJyZWFrIgoJYmluZCAkaSA8JE0xQi1CdXR0b24tMT4gICJhZGRfb25lX3RvX3NlbGVjdGlvbiAgICRpICV4ICV5OyBicmVhayIKCWJpbmQgJGkgPFNoaWZ0LUJ1dHRvbi0xPiAiYWRkX3JhbmdlX3RvX3NlbGVjdGlvbiAkaSAleCAleTsgYnJlYWsiCn0KdW5zZXQgaQoKc2V0IGZpbGVfbGlzdHMoJHVpX2luZGV4KSBbbGlzdF0Kc2V0IGZpbGVfbGlzdHMoJHVpX3dvcmtkaXIpIFtsaXN0XQoKd20gdGl0bGUgLiAiW2FwcG5hbWVdIChbcmVwb25hbWVdKSBbZmlsZSBub3JtYWxpemUgW2ZpbGUgZGlybmFtZSBbZ2l0ZGlyXV1dIgpmb2N1cyAtZm9yY2UgJHVpX2NvbW0KCiMgLS0gV2FybiB0aGUgdXNlciBhYm91dCBlbnZpcm9ubWVudGFsIHByb2JsZW1zLiAgQ3lnd2luJ3MgVGNsCiMgICAgZG9lcyAqbm90KiBwYXNzIGl0cyBlbnYgYXJyYXkgb250byBhbnkgcHJvY2Vzc2VzIGl0IHNwYXducy4KIyAgICBUaGlzIG1lYW5zIHRoYXQgZ2l0IHByb2Nlc3NlcyBnZXQgbm9uZSBvZiBvdXIgZW52aXJvbm1lbnQuCiMKaWYge1tpc19DeWd3aW5dfSB7CglzZXQgaWdub3JlZF9lbnYgMAoJc2V0IHN1Z2dlc3RfdXNlciB7fQoJc2V0IG1zZyAiUG9zc2libGUgZW52aXJvbm1lbnQgaXNzdWVzIGV4aXN0LgoKVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5CmdvaW5nIHRvIGJlIGlnbm9yZWQgYnkgYW55IEdpdCBzdWJwcm9jZXNzIHJ1bgpieSBbYXBwbmFtZV06CgoiCglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGVudl0gewoJCXN3aXRjaCAtcmVnZXhwIC0tICRuYW1lIHsKCQl7XkdJVF9JTkRFWF9GSUxFJH0gLQoJCXteR0lUX09CSkVDVF9ESVJFQ1RPUlkkfSAtCgkJe15HSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUyR9IC0KCQl7XkdJVF9ESUZGX09QVFMkfSAtCgkJe15HSVRfRVhURVJOQUxfRElGRiR9IC0KCQl7XkdJVF9QQUdFUiR9IC0KCQl7XkdJVF9UUkFDRSR9IC0KCQl7XkdJVF9DT05GSUckfSAtCgkJe15HSVRfQ09ORklHX0xPQ0FMJH0gLQoJCXteR0lUXyhBVVRIT1J8Q09NTUlUVEVSKV9EQVRFJH0gewoJCQlhcHBlbmQgbXNnICIgLSAkbmFtZVxuIgoJCQlpbmNyIGlnbm9yZWRfZW52CgkJfQoJCXteR0lUXyhBVVRIT1J8Q09NTUlUVEVSKV8oTkFNRXxFTUFJTCkkfSB7CgkJCWFwcGVuZCBtc2cgIiAtICRuYW1lXG4iCgkJCWluY3IgaWdub3JlZF9lbnYKCQkJc2V0IHN1Z2dlc3RfdXNlciAkbmFtZQoJCX0KCQl9Cgl9CglpZiB7JGlnbm9yZWRfZW52ID4gMH0gewoJCWFwcGVuZCBtc2cgIgpUaGlzIGlzIGR1ZSB0byBhIGtub3duIGlzc3VlIHdpdGggdGhlClRjbCBiaW5hcnkgZGlzdHJpYnV0ZWQgYnkgQ3lnd2luLiIKCgkJaWYgeyRzdWdnZXN0X3VzZXIgbmUge319IHsKCQkJYXBwZW5kIG1zZyAiCgpBIGdvb2QgcmVwbGFjZW1lbnQgZm9yICRzdWdnZXN0X3VzZXIKaXMgcGxhY2luZyB2YWx1ZXMgZm9yIHRoZSB1c2VyLm5hbWUgYW5kCnVzZXIuZW1haWwgc2V0dGluZ3MgaW50byB5b3VyIHBlcnNvbmFsCn4vLmdpdGNvbmZpZyBmaWxlLgoiCgkJfQoJCXdhcm5fcG9wdXAgJG1zZwoJfQoJdW5zZXQgaWdub3JlZF9lbnYgbXNnIHN1Z2dlc3RfdXNlciBuYW1lCn0KCiMgLS0gT25seSBpbml0aWFsaXplIGNvbXBsZXggVUkgaWYgd2UgYXJlIGdvaW5nIHRvIHN0YXkgcnVubmluZy4KIwppZiB7W2lzX2VuYWJsZWQgdHJhbnNwb3J0XX0gewoJbG9hZF9hbGxfcmVtb3RlcwoJbG9hZF9hbGxfaGVhZHMKCglwb3B1bGF0ZV9icmFuY2hfbWVudQoJcG9wdWxhdGVfZmV0Y2hfbWVudQoJcG9wdWxhdGVfcHVzaF9tZW51Cn0KCiMgLS0gT25seSBzdWdnZXN0IGEgZ2MgcnVuIGlmIHdlIGFyZSBnb2luZyB0byBzdGF5IHJ1bm5pbmcuCiMKaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XX0gewoJc2V0IG9iamVjdF9saW1pdCAyMDAwCglpZiB7W2lzX1dpbmRvd3NdfSB7c2V0IG9iamVjdF9saW1pdCAyMDB9CglyZWdleHAge14oWzAtOV0rKSBvYmplY3RzLH0gW2dpdCBjb3VudC1vYmplY3RzXSBfanVuayBvYmplY3RzX2N1cnJlbnQKCWlmIHskb2JqZWN0c19jdXJyZW50ID49ICRvYmplY3RfbGltaXR9IHsKCQlpZiB7W2Fza19wb3B1cCBcCgkJCSJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyAkb2JqZWN0c19jdXJyZW50IGxvb3NlIG9iamVjdHMuCgpUbyBtYWludGFpbiBvcHRpbWFsIHBlcmZvcm1hbmNlIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IGNvbXByZXNzIHRoZSBkYXRhYmFzZSB3aGVuIG1vcmUgdGhhbiAkb2JqZWN0X2xpbWl0IGxvb3NlIG9iamVjdHMgZXhpc3QuCgpDb21wcmVzcyB0aGUgZGF0YWJhc2Ugbm93PyJdIGVxIHllc30gewoJCQlkb19nYwoJCX0KCX0KCXVuc2V0IG9iamVjdF9saW1pdCBfanVuayBvYmplY3RzX2N1cnJlbnQKfQoKbG9ja19pbmRleCBiZWdpbi1yZWFkCmFmdGVyIDEgZG9fcmVzY2FuCg==