IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCnNldCBhcHB2ZXJzIHtAQEdJVEdVSV9WRVJTSU9OQEB9CnNldCBjb3B5cmlnaHQgewpDb3B5cmlnaHQgqSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZSwgUGF1bCBNYWNrZXJyYXMuCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0F9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHJlYWQgb25seSBnbG9iYWxzCgpzZXQgX2FwcG5hbWUgW2xpbmRleCBbZmlsZSBzcGxpdCAkYXJndjBdIGVuZF0Kc2V0IF9naXRkaXIge30Kc2V0IF9naXRleGVjIHt9CnNldCBfcmVwb25hbWUge30Kc2V0IF9pc2N5Z3dpbiB7fQoKcHJvYyBhcHBuYW1lIHt9IHsKCWdsb2JhbCBfYXBwbmFtZQoJcmV0dXJuICRfYXBwbmFtZQp9Cgpwcm9jIGdpdGRpciB7YXJnc30gewoJZ2xvYmFsIF9naXRkaXIKCWlmIHskYXJncyBlcSB7fX0gewoJCXJldHVybiAkX2dpdGRpcgoJfQoJcmV0dXJuIFtldmFsIFtjb25jYXQgW2xpc3QgZmlsZSBqb2luICRfZ2l0ZGlyXSAkYXJnc11dCn0KCnByb2MgZ2l0ZXhlYyB7YXJnc30gewoJZ2xvYmFsIF9naXRleGVjCglpZiB7JF9naXRleGVjIGVxIHt9fSB7CgkJaWYge1tjYXRjaCB7c2V0IF9naXRleGVjIFtleGVjIGdpdCAtLWV4ZWMtcGF0aF19IGVycl19IHsKCQkJZXJyb3IgIkdpdCBub3QgaW5zdGFsbGVkP1xuXG4kZXJyIgoJCX0KCX0KCWlmIHskYXJncyBlcSB7fX0gewoJCXJldHVybiAkX2dpdGV4ZWMKCX0KCXJldHVybiBbZXZhbCBbY29uY2F0IFtsaXN0IGZpbGUgam9pbiAkX2dpdGV4ZWNdICRhcmdzXV0KfQoKcHJvYyByZXBvbmFtZSB7fSB7CglnbG9iYWwgX3JlcG9uYW1lCglyZXR1cm4gJF9yZXBvbmFtZQp9Cgpwcm9jIGlzX01hY09TWCB7fSB7CglnbG9iYWwgdGNsX3BsYXRmb3JtIHRrX2xpYnJhcnkKCWlmIHtbdGsgd2luZG93aW5nc3lzdGVtXSBlcSB7YXF1YX19IHsKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIDAKfQoKcHJvYyBpc19XaW5kb3dzIHt9IHsKCWdsb2JhbCB0Y2xfcGxhdGZvcm0KCWlmIHskdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSBlcSB7d2luZG93c319IHsKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIDAKfQoKcHJvYyBpc19DeWd3aW4ge30gewoJZ2xvYmFsIHRjbF9wbGF0Zm9ybSBfaXNjeWd3aW4KCWlmIHskX2lzY3lnd2luIGVxIHt9fSB7CgkJaWYgeyR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIGVxIHt3aW5kb3dzfX0gewoJCQlpZiB7W2NhdGNoIHtzZXQgcCBbZXhlYyBjeWdwYXRoIC0td2luZGlyXX0gZXJyXX0gewoJCQkJc2V0IF9pc2N5Z3dpbiAwCgkJCX0gZWxzZSB7CgkJCQlzZXQgX2lzY3lnd2luIDEKCQkJfQoJCX0gZWxzZSB7CgkJCXNldCBfaXNjeWd3aW4gMAoJCX0KCX0KCXJldHVybiAkX2lzY3lnd2luCn0KCnByb2MgaXNfZW5hYmxlZCB7b3B0aW9ufSB7CglnbG9iYWwgZW5hYmxlZF9vcHRpb25zCglpZiB7W2NhdGNoIHtzZXQgb24gJGVuYWJsZWRfb3B0aW9ucygkb3B0aW9uKX1dfSB7cmV0dXJuIDB9CglyZXR1cm4gJG9uCn0KCnByb2MgZW5hYmxlX29wdGlvbiB7b3B0aW9ufSB7CglnbG9iYWwgZW5hYmxlZF9vcHRpb25zCglzZXQgZW5hYmxlZF9vcHRpb25zKCRvcHRpb24pIDEKfQoKcHJvYyBkaXNhYmxlX29wdGlvbiB7b3B0aW9ufSB7CglnbG9iYWwgZW5hYmxlZF9vcHRpb25zCglzZXQgZW5hYmxlZF9vcHRpb25zKCRvcHRpb24pIDAKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBjb25maWcKCnByb2MgaXNfbWFueV9jb25maWcge25hbWV9IHsKCXN3aXRjaCAtZ2xvYiAtLSAkbmFtZSB7CglyZW1vdGUuKi5mZXRjaCAtCglyZW1vdGUuKi5wdXNoCgkJe3JldHVybiAxfQoJKgoJCXtyZXR1cm4gMH0KCX0KfQoKcHJvYyBpc19jb25maWdfdHJ1ZSB7bmFtZX0gewoJZ2xvYmFsIHJlcG9fY29uZmlnCglpZiB7W2NhdGNoIHtzZXQgdiAkcmVwb19jb25maWcoJG5hbWUpfV19IHsKCQlyZXR1cm4gMAoJfSBlbHNlaWYgeyR2IGVxIHt0cnVlfSB8fCAkdiBlcSB7MX0gfHwgJHYgZXEge3llc319IHsKCQlyZXR1cm4gMQoJfSBlbHNlIHsKCQlyZXR1cm4gMAoJfQp9Cgpwcm9jIGxvYWRfY29uZmlnIHtpbmNsdWRlX2dsb2JhbH0gewoJZ2xvYmFsIHJlcG9fY29uZmlnIGdsb2JhbF9jb25maWcgZGVmYXVsdF9jb25maWcKCglhcnJheSB1bnNldCBnbG9iYWxfY29uZmlnCglpZiB7JGluY2x1ZGVfZ2xvYmFsfSB7CgkJY2F0Y2ggewoJCQlzZXQgZmRfcmMgW29wZW4gInwgZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWxpc3QiIHJdCgkJCXdoaWxlIHtbZ2V0cyAkZmRfcmMgbGluZV0gPj0gMH0gewoJCQkJaWYge1tyZWdleHAge14oW149XSspPSguKikkfSAkbGluZSBsaW5lIG5hbWUgdmFsdWVdfSB7CgkJCQkJaWYge1tpc19tYW55X2NvbmZpZyAkbmFtZV19IHsKCQkJCQkJbGFwcGVuZCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXQgZ2xvYmFsX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCQkJfQoJCQkJfQoJCQl9CgkJCWNsb3NlICRmZF9yYwoJCX0KCX0KCglhcnJheSB1bnNldCByZXBvX2NvbmZpZwoJY2F0Y2ggewoJCXNldCBmZF9yYyBbb3BlbiAifCBnaXQgY29uZmlnIC0tbGlzdCIgcl0KCQl3aGlsZSB7W2dldHMgJGZkX3JjIGxpbmVdID49IDB9IHsKCQkJaWYge1tyZWdleHAge14oW149XSspPSguKikkfSAkbGluZSBsaW5lIG5hbWUgdmFsdWVdfSB7CgkJCQlpZiB7W2lzX21hbnlfY29uZmlnICRuYW1lXX0gewoJCQkJCWxhcHBlbmQgcmVwb19jb25maWcoJG5hbWUpICR2YWx1ZQoJCQkJfSBlbHNlIHsKCQkJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICR2YWx1ZQoJCQkJfQoJCQl9CgkJfQoJCWNsb3NlICRmZF9yYwoJfQoKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZGVmYXVsdF9jb25maWddIHsKCQlpZiB7W2NhdGNoIHtzZXQgdiAkZ2xvYmFsX2NvbmZpZygkbmFtZSl9XX0gewoJCQlzZXQgZ2xvYmFsX2NvbmZpZygkbmFtZSkgJGRlZmF1bHRfY29uZmlnKCRuYW1lKQoJCX0KCQlpZiB7W2NhdGNoIHtzZXQgdiAkcmVwb19jb25maWcoJG5hbWUpfV19IHsKCQkJc2V0IHJlcG9fY29uZmlnKCRuYW1lKSAkZGVmYXVsdF9jb25maWcoJG5hbWUpCgkJfQoJfQp9Cgpwcm9jIHNhdmVfY29uZmlnIHt9IHsKCWdsb2JhbCBkZWZhdWx0X2NvbmZpZyBmb250X2Rlc2NzCglnbG9iYWwgcmVwb19jb25maWcgZ2xvYmFsX2NvbmZpZwoJZ2xvYmFsIHJlcG9fY29uZmlnX25ldyBnbG9iYWxfY29uZmlnX25ldwoKCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgZm9udCBbbGluZGV4ICRvcHRpb24gMV0KCQlmb250IGNvbmZpZ3VyZSAkZm9udCBcCgkJCS1mYW1pbHkgJGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCgkJCS1zaXplICRnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpCgkJZm9udCBjb25maWd1cmUgJHtmb250fWJvbGQgXAoJCQktZmFtaWx5ICRnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXmZhbWlseSkgXAoJCQktc2l6ZSAkZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKQoJCXNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJG5hbWUpIFtmb250IGNvbmZpZ3VyZSAkZm9udF0KCQl1bnNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXmZhbWlseSkKCQl1bnNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpCgl9CgoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10gewoJCXNldCB2YWx1ZSAkZ2xvYmFsX2NvbmZpZ19uZXcoJG5hbWUpCgkJaWYgeyR2YWx1ZSBuZSAkZ2xvYmFsX2NvbmZpZygkbmFtZSl9IHsKCQkJaWYgeyR2YWx1ZSBlcSAkZGVmYXVsdF9jb25maWcoJG5hbWUpfSB7CgkJCQljYXRjaCB7ZXhlYyBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tdW5zZXQgJG5hbWV9CgkJCX0gZWxzZSB7CgkJCQlyZWdzdWIgLWFsbCAiXFt7fVxdIiAkdmFsdWUgeyJ9IHZhbHVlCgkJCQlleGVjIGdpdCBjb25maWcgLS1nbG9iYWwgJG5hbWUgJHZhbHVlCgkJCX0KCQkJc2V0IGdsb2JhbF9jb25maWcoJG5hbWUpICR2YWx1ZQoJCQlpZiB7JHZhbHVlIGVxICRyZXBvX2NvbmZpZygkbmFtZSl9IHsKCQkJCWNhdGNoIHtleGVjIGdpdCBjb25maWcgLS11bnNldCAkbmFtZX0KCQkJCXNldCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCX0KCQl9Cgl9CgoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10gewoJCXNldCB2YWx1ZSAkcmVwb19jb25maWdfbmV3KCRuYW1lKQoJCWlmIHskdmFsdWUgbmUgJHJlcG9fY29uZmlnKCRuYW1lKX0gewoJCQlpZiB7JHZhbHVlIGVxICRnbG9iYWxfY29uZmlnKCRuYW1lKX0gewoJCQkJY2F0Y2gge2V4ZWMgZ2l0IGNvbmZpZyAtLXVuc2V0ICRuYW1lfQoJCQl9IGVsc2UgewoJCQkJcmVnc3ViIC1hbGwgIlxbe31cXSIgJHZhbHVlIHsifSB2YWx1ZQoJCQkJZXhlYyBnaXQgY29uZmlnICRuYW1lICR2YWx1ZQoJCQl9CgkJCXNldCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJfQoJfQp9Cgpwcm9jIGVycm9yX3BvcHVwIHttc2d9IHsKCXNldCB0aXRsZSBbYXBwbmFtZV0KCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CgkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgoJfQoJc2V0IGNtZCBbbGlzdCB0a19tZXNzYWdlQm94IFwKCQktaWNvbiBlcnJvciBcCgkJLXR5cGUgb2sgXAoJCS10aXRsZSAiJHRpdGxlOiBlcnJvciIgXAoJCS1tZXNzYWdlICRtc2ddCglpZiB7W3dpbmZvIGlzbWFwcGVkIC5dfSB7CgkJbGFwcGVuZCBjbWQgLXBhcmVudCAuCgl9CglldmFsICRjbWQKfQoKcHJvYyB3YXJuX3BvcHVwIHttc2d9IHsKCXNldCB0aXRsZSBbYXBwbmFtZV0KCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CgkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgoJfQoJc2V0IGNtZCBbbGlzdCB0a19tZXNzYWdlQm94IFwKCQktaWNvbiB3YXJuaW5nIFwKCQktdHlwZSBvayBcCgkJLXRpdGxlICIkdGl0bGU6IHdhcm5pbmciIFwKCQktbWVzc2FnZSAkbXNnXQoJaWYge1t3aW5mbyBpc21hcHBlZCAuXX0gewoJCWxhcHBlbmQgY21kIC1wYXJlbnQgLgoJfQoJZXZhbCAkY21kCn0KCnByb2MgaW5mb19wb3B1cCB7bXNnIHtwYXJlbnQgLn19IHsKCXNldCB0aXRsZSBbYXBwbmFtZV0KCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CgkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgoJfQoJdGtfbWVzc2FnZUJveCBcCgkJLXBhcmVudCAkcGFyZW50IFwKCQktaWNvbiBpbmZvIFwKCQktdHlwZSBvayBcCgkJLXRpdGxlICR0aXRsZSBcCgkJLW1lc3NhZ2UgJG1zZwp9Cgpwcm9jIGFza19wb3B1cCB7bXNnfSB7CglzZXQgdGl0bGUgW2FwcG5hbWVdCglpZiB7W3JlcG9uYW1lXSBuZSB7fX0gewoJCWFwcGVuZCB0aXRsZSAiIChbcmVwb25hbWVdKSIKCX0KCXJldHVybiBbdGtfbWVzc2FnZUJveCBcCgkJLXBhcmVudCAuIFwKCQktaWNvbiBxdWVzdGlvbiBcCgkJLXR5cGUgeWVzbm8gXAoJCS10aXRsZSAkdGl0bGUgXAoJCS1tZXNzYWdlICRtc2ddCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgcmVwb3NpdG9yeSBzZXR1cAoKaWYgeyAgIFtjYXRjaCB7c2V0IF9naXRkaXIgJGVudihHSVRfRElSKX1dCgkmJiBbY2F0Y2gge3NldCBfZ2l0ZGlyIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXX0gZXJyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3Rvcnk6XG5cbiRlcnIiCglleGl0IDEKfQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXSAmJiBbaXNfQ3lnd2luXX0gewoJY2F0Y2gge3NldCBfZ2l0ZGlyIFtleGVjIGN5Z3BhdGggLS11bml4ICRfZ2l0ZGlyXX0KfQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiR2l0IGRpcmVjdG9yeSBub3QgZm91bmQ6XG5cbiRfZ2l0ZGlyIgoJZXhpdCAxCn0KaWYge1tsaW5kZXggW2ZpbGUgc3BsaXQgJF9naXRkaXJdIGVuZF0gbmUgey5naXR9fSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJDYW5ub3QgdXNlIGZ1bm55IC5naXQgZGlyZWN0b3J5OlxuXG4kX2dpdGRpciIKCWV4aXQgMQp9CmlmIHtbY2F0Y2gge2NkIFtmaWxlIGRpcm5hbWUgJF9naXRkaXJdfSBlcnJdfSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJObyB3b3JraW5nIGRpcmVjdG9yeSBbZmlsZSBkaXJuYW1lICRfZ2l0ZGlyXTpcblxuJGVyciIKCWV4aXQgMQp9CnNldCBfcmVwb25hbWUgW2xpbmRleCBbZmlsZSBzcGxpdCBcCglbZmlsZSBub3JtYWxpemUgW2ZpbGUgZGlybmFtZSAkX2dpdGRpcl1dXSBcCgllbmRdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHRhc2sgbWFuYWdlbWVudAoKc2V0IHJlc2Nhbl9hY3RpdmUgMApzZXQgZGlmZl9hY3RpdmUgMApzZXQgbGFzdF9jbGlja2VkIHt9CgpzZXQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0XQpzZXQgaW5kZXhfbG9ja190eXBlIG5vbmUKCnByb2MgbG9ja19pbmRleCB7dHlwZX0gewoJZ2xvYmFsIGluZGV4X2xvY2tfdHlwZSBkaXNhYmxlX29uX2xvY2sKCglpZiB7JGluZGV4X2xvY2tfdHlwZSBlcSB7bm9uZX19IHsKCQlzZXQgaW5kZXhfbG9ja190eXBlICR0eXBlCgkJZm9yZWFjaCB3ICRkaXNhYmxlX29uX2xvY2sgewoJCQl1cGxldmVsICMwICR3IGRpc2FibGVkCgkJfQoJCXJldHVybiAxCgl9IGVsc2VpZiB7JGluZGV4X2xvY2tfdHlwZSBlcSAiYmVnaW4tJHR5cGUifSB7CgkJc2V0IGluZGV4X2xvY2tfdHlwZSAkdHlwZQoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIHVubG9ja19pbmRleCB7fSB7CglnbG9iYWwgaW5kZXhfbG9ja190eXBlIGRpc2FibGVfb25fbG9jawoKCXNldCBpbmRleF9sb2NrX3R5cGUgbm9uZQoJZm9yZWFjaCB3ICRkaXNhYmxlX29uX2xvY2sgewoJCXVwbGV2ZWwgIzAgJHcgbm9ybWFsCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgc3RhdHVzCgpwcm9jIHJlcG9zaXRvcnlfc3RhdGUge2N0dmFyIGhkdmFyIG1odmFyfSB7CglnbG9iYWwgY3VycmVudF9icmFuY2gKCXVwdmFyICRjdHZhciBjdCAkaGR2YXIgaGQgJG1odmFyIG1oCgoJc2V0IG1oIFtsaXN0XQoKCWlmIHtbY2F0Y2gge3NldCBjdXJyZW50X2JyYW5jaCBbZXhlYyBnaXQgc3ltYm9saWMtcmVmIEhFQURdfV19IHsKCQlzZXQgY3VycmVudF9icmFuY2gge30KCX0gZWxzZSB7CgkJcmVnc3ViIF5yZWZzLygoaGVhZHN8dGFnc3xyZW1vdGVzKS8pPyBcCgkJCSRjdXJyZW50X2JyYW5jaCBcCgkJCXt9IFwKCQkJY3VycmVudF9icmFuY2gKCX0KCglpZiB7W2NhdGNoIHtzZXQgaGQgW2V4ZWMgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEXX1dfSB7CgkJc2V0IGhkIHt9CgkJc2V0IGN0IGluaXRpYWwKCQlyZXR1cm4KCX0KCglzZXQgbWVyZ2VfaGVhZCBbZ2l0ZGlyIE1FUkdFX0hFQURdCglpZiB7W2ZpbGUgZXhpc3RzICRtZXJnZV9oZWFkXX0gewoJCXNldCBjdCBtZXJnZQoJCXNldCBmZF9taCBbb3BlbiAkbWVyZ2VfaGVhZCByXQoJCXdoaWxlIHtbZ2V0cyAkZmRfbWggbGluZV0gPj0gMH0gewoJCQlsYXBwZW5kIG1oICRsaW5lCgkJfQoJCWNsb3NlICRmZF9taAoJCXJldHVybgoJfQoKCXNldCBjdCBub3JtYWwKfQoKcHJvYyBQQVJFTlQge30gewoJZ2xvYmFsIFBBUkVOVCBlbXB0eV90cmVlCgoJc2V0IHAgW2xpbmRleCAkUEFSRU5UIDBdCglpZiB7JHAgbmUge319IHsKCQlyZXR1cm4gJHAKCX0KCWlmIHskZW1wdHlfdHJlZSBlcSB7fX0gewoJCXNldCBlbXB0eV90cmVlIFtleGVjIGdpdCBta3RyZWUgPDwge31dCgl9CglyZXR1cm4gJGVtcHR5X3RyZWUKfQoKcHJvYyByZXNjYW4ge2FmdGVyIHtob25vcl90cnVzdG10aW1lIDF9fSB7CglnbG9iYWwgSEVBRCBQQVJFTlQgTUVSR0VfSEVBRCBjb21taXRfdHlwZQoJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIgdWlfc3RhdHVzX3ZhbHVlIHVpX2NvbW0KCWdsb2JhbCByZXNjYW5fYWN0aXZlIGZpbGVfc3RhdGVzCglnbG9iYWwgcmVwb19jb25maWcKCglpZiB7JHJlc2Nhbl9hY3RpdmUgPiAwIHx8ICFbbG9ja19pbmRleCByZWFkXX0gcmV0dXJuCgoJcmVwb3NpdG9yeV9zdGF0ZSBuZXdUeXBlIG5ld0hFQUQgbmV3TUVSR0VfSEVBRAoJaWYge1tzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV0KCQkmJiAkbmV3VHlwZSBlcSB7bm9ybWFsfQoJCSYmICRuZXdIRUFEIGVxICRIRUFEfSB7Cgl9IGVsc2UgewoJCXNldCBIRUFEICRuZXdIRUFECgkJc2V0IFBBUkVOVCAkbmV3SEVBRAoJCXNldCBNRVJHRV9IRUFEICRuZXdNRVJHRV9IRUFECgkJc2V0IGNvbW1pdF90eXBlICRuZXdUeXBlCgl9CgoJYXJyYXkgdW5zZXQgZmlsZV9zdGF0ZXMKCglpZiB7IVskdWlfY29tbSBlZGl0IG1vZGlmaWVkXQoJCXx8IFtzdHJpbmcgdHJpbSBbJHVpX2NvbW0gZ2V0IDAuMCBlbmRdXSBlcSB7fX0gewoJCWlmIHtbbG9hZF9tZXNzYWdlIEdJVEdVSV9NU0ddfSB7CgkJfSBlbHNlaWYge1tsb2FkX21lc3NhZ2UgTUVSR0VfTVNHXX0gewoJCX0gZWxzZWlmIHtbbG9hZF9tZXNzYWdlIFNRVUFTSF9NU0ddfSB7CgkJfQoJCSR1aV9jb21tIGVkaXQgcmVzZXQKCQkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCgl9CgoJaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCQlsb2FkX2FsbF9oZWFkcwoJCXBvcHVsYXRlX2JyYW5jaF9tZW51Cgl9CgoJaWYgeyRob25vcl90cnVzdG10aW1lICYmICRyZXBvX2NvbmZpZyhndWkudHJ1c3RtdGltZSkgZXEge3RydWV9fSB7CgkJcmVzY2FuX3N0YWdlMiB7fSAkYWZ0ZXIKCX0gZWxzZSB7CgkJc2V0IHJlc2Nhbl9hY3RpdmUgMQoJCXNldCB1aV9zdGF0dXNfdmFsdWUge1JlZnJlc2hpbmcgZmlsZSBzdGF0dXMuLi59CgkJc2V0IGNtZCBbbGlzdCBnaXQgdXBkYXRlLWluZGV4XQoJCWxhcHBlbmQgY21kIC1xCgkJbGFwcGVuZCBjbWQgLS11bm1lcmdlZAoJCWxhcHBlbmQgY21kIC0taWdub3JlLW1pc3NpbmcKCQlsYXBwZW5kIGNtZCAtLXJlZnJlc2gKCQlzZXQgZmRfcmYgW29wZW4gInwgJGNtZCIgcl0KCQlmY29uZmlndXJlICRmZF9yZiAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5CgkJZmlsZWV2ZW50ICRmZF9yZiByZWFkYWJsZSBcCgkJCVtsaXN0IHJlc2Nhbl9zdGFnZTIgJGZkX3JmICRhZnRlcl0KCX0KfQoKcHJvYyByZXNjYW5fc3RhZ2UyIHtmZCBhZnRlcn0gewoJZ2xvYmFsIHVpX3N0YXR1c192YWx1ZQoJZ2xvYmFsIHJlc2Nhbl9hY3RpdmUgYnVmX3JkaSBidWZfcmRmIGJ1Zl9ybG8KCglpZiB7JGZkIG5lIHt9fSB7CgkJcmVhZCAkZmQKCQlpZiB7IVtlb2YgJGZkXX0gcmV0dXJuCgkJY2xvc2UgJGZkCgl9CgoJc2V0IGxzX290aGVycyBbbGlzdCB8IGdpdCBscy1maWxlcyAtLW90aGVycyAteiBcCgkJLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZV0KCXNldCBpbmZvX2V4Y2x1ZGUgW2dpdGRpciBpbmZvIGV4Y2x1ZGVdCglpZiB7W2ZpbGUgcmVhZGFibGUgJGluZm9fZXhjbHVkZV19IHsKCQlsYXBwZW5kIGxzX290aGVycyAiLS1leGNsdWRlLWZyb209JGluZm9fZXhjbHVkZSIKCX0KCglzZXQgYnVmX3JkaSB7fQoJc2V0IGJ1Zl9yZGYge30KCXNldCBidWZfcmxvIHt9CgoJc2V0IHJlc2Nhbl9hY3RpdmUgMwoJc2V0IHVpX3N0YXR1c192YWx1ZSB7U2Nhbm5pbmcgZm9yIG1vZGlmaWVkIGZpbGVzIC4uLn0KCXNldCBmZF9kaSBbb3BlbiAifCBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAteiBbUEFSRU5UXSIgcl0KCXNldCBmZF9kZiBbb3BlbiAifCBnaXQgZGlmZi1maWxlcyAteiIgcl0KCXNldCBmZF9sbyBbb3BlbiAkbHNfb3RoZXJzIHJdCgoJZmNvbmZpZ3VyZSAkZmRfZGkgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CglmY29uZmlndXJlICRmZF9kZiAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZjb25maWd1cmUgJGZkX2xvIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJZmlsZWV2ZW50ICRmZF9kaSByZWFkYWJsZSBbbGlzdCByZWFkX2RpZmZfaW5kZXggJGZkX2RpICRhZnRlcl0KCWZpbGVldmVudCAkZmRfZGYgcmVhZGFibGUgW2xpc3QgcmVhZF9kaWZmX2ZpbGVzICRmZF9kZiAkYWZ0ZXJdCglmaWxlZXZlbnQgJGZkX2xvIHJlYWRhYmxlIFtsaXN0IHJlYWRfbHNfb3RoZXJzICRmZF9sbyAkYWZ0ZXJdCn0KCnByb2MgbG9hZF9tZXNzYWdlIHtmaWxlfSB7CglnbG9iYWwgdWlfY29tbQoKCXNldCBmIFtnaXRkaXIgJGZpbGVdCglpZiB7W2ZpbGUgaXNmaWxlICRmXX0gewoJCWlmIHtbY2F0Y2gge3NldCBmZCBbb3BlbiAkZiByXX1dfSB7CgkJCXJldHVybiAwCgkJfQoJCXNldCBjb250ZW50IFtzdHJpbmcgdHJpbSBbcmVhZCAkZmRdXQoJCWNsb3NlICRmZAoJCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFxyXHRdKyR9ICRjb250ZW50IHt9IGNvbnRlbnQKCQkkdWlfY29tbSBkZWxldGUgMC4wIGVuZAoJCSR1aV9jb21tIGluc2VydCBlbmQgJGNvbnRlbnQKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIDAKfQoKcHJvYyByZWFkX2RpZmZfaW5kZXgge2ZkIGFmdGVyfSB7CglnbG9iYWwgYnVmX3JkaQoKCWFwcGVuZCBidWZfcmRpIFtyZWFkICRmZF0KCXNldCBjIDAKCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZfcmRpXQoJd2hpbGUgeyRjIDwgJG59IHsKCQlzZXQgejEgW3N0cmluZyBmaXJzdCAiXDAiICRidWZfcmRpICRjXQoJCWlmIHskejEgPT0gLTF9IGJyZWFrCgkJaW5jciB6MQoJCXNldCB6MiBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGkgJHoxXQoJCWlmIHskejIgPT0gLTF9IGJyZWFrCgoJCWluY3IgYwoJCXNldCBpIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRidWZfcmRpICRjIFtleHByIHskejEgLSAyfV1dIHsgfV0KCQlzZXQgcCBbc3RyaW5nIHJhbmdlICRidWZfcmRpICR6MSBbZXhwciB7JHoyIC0gMX1dXQoJCW1lcmdlX3N0YXRlIFwKCQkJW2VuY29kaW5nIGNvbnZlcnRmcm9tICRwXSBcCgkJCVtsaW5kZXggJGkgNF0/IFwKCQkJW2xpc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDJdXSBcCgkJCVtsaXN0XQoJCXNldCBjICR6MgoJCWluY3IgYwoJfQoJaWYgeyRjIDwgJG59IHsKCQlzZXQgYnVmX3JkaSBbc3RyaW5nIHJhbmdlICRidWZfcmRpICRjIGVuZF0KCX0gZWxzZSB7CgkJc2V0IGJ1Zl9yZGkge30KCX0KCglyZXNjYW5fZG9uZSAkZmQgYnVmX3JkaSAkYWZ0ZXIKfQoKcHJvYyByZWFkX2RpZmZfZmlsZXMge2ZkIGFmdGVyfSB7CglnbG9iYWwgYnVmX3JkZgoKCWFwcGVuZCBidWZfcmRmIFtyZWFkICRmZF0KCXNldCBjIDAKCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZfcmRmXQoJd2hpbGUgeyRjIDwgJG59IHsKCQlzZXQgejEgW3N0cmluZyBmaXJzdCAiXDAiICRidWZfcmRmICRjXQoJCWlmIHskejEgPT0gLTF9IGJyZWFrCgkJaW5jciB6MQoJCXNldCB6MiBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGYgJHoxXQoJCWlmIHskejIgPT0gLTF9IGJyZWFrCgoJCWluY3IgYwoJCXNldCBpIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRidWZfcmRmICRjIFtleHByIHskejEgLSAyfV1dIHsgfV0KCQlzZXQgcCBbc3RyaW5nIHJhbmdlICRidWZfcmRmICR6MSBbZXhwciB7JHoyIC0gMX1dXQoJCW1lcmdlX3N0YXRlIFwKCQkJW2VuY29kaW5nIGNvbnZlcnRmcm9tICRwXSBcCgkJCT9bbGluZGV4ICRpIDRdIFwKCQkJW2xpc3RdIFwKCQkJW2xpc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDJdXQoJCXNldCBjICR6MgoJCWluY3IgYwoJfQoJaWYgeyRjIDwgJG59IHsKCQlzZXQgYnVmX3JkZiBbc3RyaW5nIHJhbmdlICRidWZfcmRmICRjIGVuZF0KCX0gZWxzZSB7CgkJc2V0IGJ1Zl9yZGYge30KCX0KCglyZXNjYW5fZG9uZSAkZmQgYnVmX3JkZiAkYWZ0ZXIKfQoKcHJvYyByZWFkX2xzX290aGVycyB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmxvCgoJYXBwZW5kIGJ1Zl9ybG8gW3JlYWQgJGZkXQoJc2V0IHBjayBbc3BsaXQgJGJ1Zl9ybG8gIlwwIl0KCXNldCBidWZfcmxvIFtsaW5kZXggJHBjayBlbmRdCglmb3JlYWNoIHAgW2xyYW5nZSAkcGNrIDAgZW5kLTFdIHsKCQltZXJnZV9zdGF0ZSBbZW5jb2RpbmcgY29udmVydGZyb20gJHBdID9PCgl9CglyZXNjYW5fZG9uZSAkZmQgYnVmX3JsbyAkYWZ0ZXIKfQoKcHJvYyByZXNjYW5fZG9uZSB7ZmQgYnVmIGFmdGVyfSB7CglnbG9iYWwgcmVzY2FuX2FjdGl2ZQoJZ2xvYmFsIGZpbGVfc3RhdGVzIHJlcG9fY29uZmlnCgl1cHZhciAkYnVmIHRvX2NsZWFyCgoJaWYgeyFbZW9mICRmZF19IHJldHVybgoJc2V0IHRvX2NsZWFyIHt9CgljbG9zZSAkZmQKCWlmIHtbaW5jciByZXNjYW5fYWN0aXZlIC0xXSA+IDB9IHJldHVybgoKCXBydW5lX3NlbGVjdGlvbgoJdW5sb2NrX2luZGV4CglkaXNwbGF5X2FsbF9maWxlcwoJcmVzaG93X2RpZmYKCXVwbGV2ZWwgIzAgJGFmdGVyCn0KCnByb2MgcHJ1bmVfc2VsZWN0aW9uIHt9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocwoKCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgc2VsZWN0ZWRfcGF0aHNdIHsKCQlpZiB7W2NhdGNoIHtzZXQgc3RpbGxfaGVyZSAkZmlsZV9zdGF0ZXMoJHBhdGgpfV19IHsKCQkJdW5zZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpCgkJfQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGRpZmYKCnByb2MgY2xlYXJfZGlmZiB7fSB7CglnbG9iYWwgdWlfZGlmZiBjdXJyZW50X2RpZmZfcGF0aCBjdXJyZW50X2RpZmZfaGVhZGVyCglnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpcgoKCSR1aV9kaWZmIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHVpX2RpZmYgZGVsZXRlIDAuMCBlbmQKCSR1aV9kaWZmIGNvbmYgLXN0YXRlIGRpc2FibGVkCgoJc2V0IGN1cnJlbnRfZGlmZl9wYXRoIHt9CglzZXQgY3VycmVudF9kaWZmX2hlYWRlciB7fQoKCSR1aV9pbmRleCB0YWcgcmVtb3ZlIGluX2RpZmYgMC4wIGVuZAoJJHVpX3dvcmtkaXIgdGFnIHJlbW92ZSBpbl9kaWZmIDAuMCBlbmQKfQoKcHJvYyByZXNob3dfZGlmZiB7fSB7CglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlIGZpbGVfc3RhdGVzIGZpbGVfbGlzdHMKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBjdXJyZW50X2RpZmZfc2lkZQoKCXNldCBwICRjdXJyZW50X2RpZmZfcGF0aAoJaWYgeyRwIGVxIHt9CgkJfHwgJGN1cnJlbnRfZGlmZl9zaWRlIGVxIHt9CgkJfHwgW2NhdGNoIHtzZXQgcyAkZmlsZV9zdGF0ZXMoJHApfV0KCQl8fCBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkY3VycmVudF9kaWZmX3NpZGUpICRwXSA9PSAtMX0gewoJCWNsZWFyX2RpZmYKCX0gZWxzZSB7CgkJc2hvd19kaWZmICRwICRjdXJyZW50X2RpZmZfc2lkZQoJfQp9Cgpwcm9jIGhhbmRsZV9lbXB0eV9kaWZmIHt9IHsKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzCgoJc2V0IHBhdGggJGN1cnJlbnRfZGlmZl9wYXRoCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglpZiB7W2xpbmRleCAkcyAwXSBuZSB7X019fSByZXR1cm4KCglpbmZvX3BvcHVwICJObyBkaWZmZXJlbmNlcyBkZXRlY3RlZC4KCltzaG9ydF9wYXRoICRwYXRoXSBoYXMgbm8gY2hhbmdlcy4KClRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGZpbGUgd2FzIHVwZGF0ZWQKYnkgYW5vdGhlciBhcHBsaWNhdGlvbiwgYnV0IHRoZSBjb250ZW50IHdpdGhpbgp0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuCgpBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byBmaW5kCm90aGVyIGZpbGVzIHdoaWNoIG1heSBoYXZlIHRoZSBzYW1lIHN0YXRlLiIKCgljbGVhcl9kaWZmCglkaXNwbGF5X2ZpbGUgJHBhdGggX18KCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0gMAp9Cgpwcm9jIHNob3dfZGlmZiB7cGF0aCB3IHtsbm8ge319fSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cwoJZ2xvYmFsIGlzXzN3YXlfZGlmZiBkaWZmX2FjdGl2ZSByZXBvX2NvbmZpZwoJZ2xvYmFsIHVpX2RpZmYgdWlfc3RhdHVzX3ZhbHVlIHVpX2luZGV4IHVpX3dvcmtkaXIKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBjdXJyZW50X2RpZmZfc2lkZSBjdXJyZW50X2RpZmZfaGVhZGVyCgoJaWYgeyRkaWZmX2FjdGl2ZSB8fCAhW2xvY2tfaW5kZXggcmVhZF19IHJldHVybgoKCWNsZWFyX2RpZmYKCWlmIHskbG5vID09IHt9fSB7CgkJc2V0IGxubyBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkdykgJHBhdGhdCgkJaWYgeyRsbm8gPj0gMH0gewoJCQlpbmNyIGxubwoJCX0KCX0KCWlmIHskbG5vID49IDF9IHsKCQkkdyB0YWcgYWRkIGluX2RpZmYgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCX0KCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglzZXQgbSBbbGluZGV4ICRzIDBdCglzZXQgaXNfM3dheV9kaWZmIDAKCXNldCBkaWZmX2FjdGl2ZSAxCglzZXQgY3VycmVudF9kaWZmX3BhdGggJHBhdGgKCXNldCBjdXJyZW50X2RpZmZfc2lkZSAkdwoJc2V0IGN1cnJlbnRfZGlmZl9oZWFkZXIge30KCXNldCB1aV9zdGF0dXNfdmFsdWUgIkxvYWRpbmcgZGlmZiBvZiBbZXNjYXBlX3BhdGggJHBhdGhdLi4uIgoKCSMgLSBHaXQgd29uJ3QgZ2l2ZSB1cyB0aGUgZGlmZiwgdGhlcmUncyBub3RoaW5nIHRvIGNvbXBhcmUgdG8hCgkjCglpZiB7JG0gZXEge19PfX0gewoJCXNldCBtYXhfc3ogW2V4cHIgezEyOCAqIDEwMjR9XQoJCWlmIHtbY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRwYXRoIHJdCgkJCQlzZXQgY29udGVudCBbcmVhZCAkZmQgJG1heF9zel0KCQkJCWNsb3NlICRmZAoJCQkJc2V0IHN6IFtmaWxlIHNpemUgJHBhdGhdCgkJCX0gZXJyIF19IHsKCQkJc2V0IGRpZmZfYWN0aXZlIDAKCQkJdW5sb2NrX2luZGV4CgkJCXNldCB1aV9zdGF0dXNfdmFsdWUgIlVuYWJsZSB0byBkaXNwbGF5IFtlc2NhcGVfcGF0aCAkcGF0aF0iCgkJCWVycm9yX3BvcHVwICJFcnJvciBsb2FkaW5nIGZpbGU6XG5cbiRlcnIiCgkJCXJldHVybgoJCX0KCQkkdWlfZGlmZiBjb25mIC1zdGF0ZSBub3JtYWwKCQlpZiB7IVtjYXRjaCB7c2V0IHR5cGUgW2V4ZWMgZmlsZSAkcGF0aF19XX0gewoJCQlzZXQgbiBbc3RyaW5nIGxlbmd0aCAkcGF0aF0KCQkJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkbiAkcGF0aCAkdHlwZV19IHsKCQkJCXNldCB0eXBlIFtzdHJpbmcgcmFuZ2UgJHR5cGUgJG4gZW5kXQoJCQkJcmVnc3ViIHteOj9ccyp9ICR0eXBlIHt9IHR5cGUKCQkJfQoJCQkkdWlfZGlmZiBpbnNlcnQgZW5kICIqICR0eXBlXG4iIGRfQAoJCX0KCQlpZiB7W3N0cmluZyBmaXJzdCAiXDAiICRjb250ZW50XSAhPSAtMX0gewoJCQkkdWlfZGlmZiBpbnNlcnQgZW5kIFwKCQkJCSIqIEJpbmFyeSBmaWxlIChub3Qgc2hvd2luZyBjb250ZW50KS4iIFwKCQkJCWRfQAoJCX0gZWxzZSB7CgkJCWlmIHskc3ogPiAkbWF4X3N6fSB7CgkJCQkkdWlfZGlmZiBpbnNlcnQgZW5kIFwKIiogVW50cmFja2VkIGZpbGUgaXMgJHN6IGJ5dGVzLgoqIFNob3dpbmcgb25seSBmaXJzdCAkbWF4X3N6IGJ5dGVzLgoiIGRfQAoJCQl9CgkJCSR1aV9kaWZmIGluc2VydCBlbmQgJGNvbnRlbnQKCQkJaWYgeyRzeiA+ICRtYXhfc3p9IHsKCQkJCSR1aV9kaWZmIGluc2VydCBlbmQgIgoqIFVudHJhY2tlZCBmaWxlIGNsaXBwZWQgaGVyZSBieSBbYXBwbmFtZV0uCiogVG8gc2VlIHRoZSBlbnRpcmUgZmlsZSwgdXNlIGFuIGV4dGVybmFsIGVkaXRvci4KIiBkX0AKCQkJfQoJCX0KCQkkdWlfZGlmZiBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJCXNldCBkaWZmX2FjdGl2ZSAwCgkJdW5sb2NrX2luZGV4CgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufQoJCXJldHVybgoJfQoKCXNldCBjbWQgW2xpc3QgfCBnaXRdCglpZiB7JHcgZXEgJHVpX2luZGV4fSB7CgkJbGFwcGVuZCBjbWQgZGlmZi1pbmRleAoJCWxhcHBlbmQgY21kIC0tY2FjaGVkCgl9IGVsc2VpZiB7JHcgZXEgJHVpX3dvcmtkaXJ9IHsKCQlpZiB7W3N0cmluZyBpbmRleCAkbSAwXSBlcSB7VX19IHsKCQkJbGFwcGVuZCBjbWQgZGlmZgoJCX0gZWxzZSB7CgkJCWxhcHBlbmQgY21kIGRpZmYtZmlsZXMKCQl9Cgl9CgoJbGFwcGVuZCBjbWQgLXAKCWxhcHBlbmQgY21kIC0tbm8tY29sb3IKCWlmIHskcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSA+IDB9IHsKCQlsYXBwZW5kIGNtZCAiLVUkcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSIKCX0KCWlmIHskdyBlcSAkdWlfaW5kZXh9IHsKCQlsYXBwZW5kIGNtZCBbUEFSRU5UXQoJfQoJbGFwcGVuZCBjbWQgLS0KCWxhcHBlbmQgY21kICRwYXRoCgoJaWYge1tjYXRjaCB7c2V0IGZkIFtvcGVuICRjbWQgcl19IGVycl19IHsKCQlzZXQgZGlmZl9hY3RpdmUgMAoJCXVubG9ja19pbmRleAoJCXNldCB1aV9zdGF0dXNfdmFsdWUgIlVuYWJsZSB0byBkaXNwbGF5IFtlc2NhcGVfcGF0aCAkcGF0aF0iCgkJZXJyb3JfcG9wdXAgIkVycm9yIGxvYWRpbmcgZGlmZjpcblxuJGVyciIKCQlyZXR1cm4KCX0KCglmY29uZmlndXJlICRmZCBcCgkJLWJsb2NraW5nIDAgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgcmVhZF9kaWZmICRmZF0KfQoKcHJvYyByZWFkX2RpZmYge2ZkfSB7CglnbG9iYWwgdWlfZGlmZiB1aV9zdGF0dXNfdmFsdWUgZGlmZl9hY3RpdmUKCWdsb2JhbCBpc18zd2F5X2RpZmYgY3VycmVudF9kaWZmX2hlYWRlcgoKCSR1aV9kaWZmIGNvbmYgLXN0YXRlIG5vcm1hbAoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJIyAtLSBDbGVhbnVwIHVuaW50ZXJlc3RpbmcgZGlmZiBoZWFkZXIgbGluZXMuCgkJIwoJCWlmIHsgICBbc3RyaW5nIG1hdGNoIHtkaWZmIC0tZ2l0ICp9ICAgICAgJGxpbmVdCgkJCXx8IFtzdHJpbmcgbWF0Y2gge2RpZmYgLS1jYyAqfSAgICAgICAkbGluZV0KCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGlmZiAtLWNvbWJpbmVkICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHstLS0gKn0gICAgICAgICAgICAgJGxpbmVdCgkJCXx8IFtzdHJpbmcgbWF0Y2ggeysrKyAqfSAgICAgICAgICAgICAkbGluZV19IHsKCQkJYXBwZW5kIGN1cnJlbnRfZGlmZl9oZWFkZXIgJGxpbmUgIlxuIgoJCQljb250aW51ZQoJCX0KCQlpZiB7W3N0cmluZyBtYXRjaCB7aW5kZXggKn0gJGxpbmVdfSBjb250aW51ZQoJCWlmIHskbGluZSBlcSB7ZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwfX0gewoJCQlzZXQgbGluZSAiZGVsZXRlZCBzeW1saW5rIgoJCX0KCgkJIyAtLSBBdXRvbWF0aWNhbGx5IGRldGVjdCBpZiB0aGlzIGlzIGEgMyB3YXkgZGlmZi4KCQkjCgkJaWYge1tzdHJpbmcgbWF0Y2gge0BAQCAqfSAkbGluZV19IHtzZXQgaXNfM3dheV9kaWZmIDF9CgoJCWlmIHtbc3RyaW5nIG1hdGNoIHttb2RlICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHtuZXcgZmlsZSAqfSAkbGluZV0KCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGVsZXRlZCBmaWxlICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHtCaW5hcnkgZmlsZXMgKiBhbmQgKiBkaWZmZXJ9ICRsaW5lXQoJCQl8fCAkbGluZSBlcSB7XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlfQoJCQl8fCBbcmVnZXhwIHteXCogVW5tZXJnZWQgcGF0aCB9ICRsaW5lXX0gewoJCQlzZXQgdGFncyB7fQoJCX0gZWxzZWlmIHskaXNfM3dheV9kaWZmfSB7CgkJCXNldCBvcCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMV0KCQkJc3dpdGNoIC0tICRvcCB7CgkJCXsgIH0ge3NldCB0YWdzIHt9fQoJCQl7QEB9IHtzZXQgdGFncyBkX0B9CgkJCXsgK30ge3NldCB0YWdzIGRfcyt9CgkJCXsgLX0ge3NldCB0YWdzIGRfcy19CgkJCXsrIH0ge3NldCB0YWdzIGRfK3N9CgkJCXstIH0ge3NldCB0YWdzIGRfLXN9CgkJCXstLX0ge3NldCB0YWdzIGRfLS19CgkJCXsrK30gewoJCQkJaWYge1tyZWdleHAge15cK1wrKFs8Pl17N30gfD17N30pfSAkbGluZSBfZyBvcF19IHsKCQkJCQlzZXQgbGluZSBbc3RyaW5nIHJlcGxhY2UgJGxpbmUgMCAxIHsgIH1dCgkJCQkJc2V0IHRhZ3MgZCRvcAoJCQkJfSBlbHNlIHsKCQkJCQlzZXQgdGFncyBkXysrCgkJCQl9CgkJCX0KCQkJZGVmYXVsdCB7CgkJCQlwdXRzICJlcnJvcjogVW5oYW5kbGVkIDMgd2F5IGRpZmYgbWFya2VyOiB7JG9wfSIKCQkJCXNldCB0YWdzIHt9CgkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNldCBvcCBbc3RyaW5nIGluZGV4ICRsaW5lIDBdCgkJCXN3aXRjaCAtLSAkb3AgewoJCQl7IH0ge3NldCB0YWdzIHt9fQoJCQl7QH0ge3NldCB0YWdzIGRfQH0KCQkJey19IHtzZXQgdGFncyBkXy19CgkJCXsrfSB7CgkJCQlpZiB7W3JlZ2V4cCB7XlwrKFs8Pl17N30gfD17N30pfSAkbGluZSBfZyBvcF19IHsKCQkJCQlzZXQgbGluZSBbc3RyaW5nIHJlcGxhY2UgJGxpbmUgMCAwIHsgfV0KCQkJCQlzZXQgdGFncyBkJG9wCgkJCQl9IGVsc2UgewoJCQkJCXNldCB0YWdzIGRfKwoJCQkJfQoJCQl9CgkJCWRlZmF1bHQgewoJCQkJcHV0cyAiZXJyb3I6IFVuaGFuZGxlZCAyIHdheSBkaWZmIG1hcmtlcjogeyRvcH0iCgkJCQlzZXQgdGFncyB7fQoJCQl9CgkJCX0KCQl9CgkJJHVpX2RpZmYgaW5zZXJ0IGVuZCAkbGluZSAkdGFncwoJCWlmIHtbc3RyaW5nIGluZGV4ICRsaW5lIGVuZF0gZXEgIlxyIn0gewoJCQkkdWlfZGlmZiB0YWcgYWRkIGRfY3Ige2VuZCAtIDJjfQoJCX0KCQkkdWlfZGlmZiBpbnNlcnQgZW5kICJcbiIgJHRhZ3MKCX0KCSR1aV9kaWZmIGNvbmYgLXN0YXRlIGRpc2FibGVkCgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCXNldCBkaWZmX2FjdGl2ZSAwCgkJdW5sb2NrX2luZGV4CgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufQoKCQlpZiB7WyR1aV9kaWZmIGluZGV4IGVuZF0gZXEgezIuMH19IHsKCQkJaGFuZGxlX2VtcHR5X2RpZmYKCQl9Cgl9Cn0KCnByb2MgYXBwbHlfaHVuayB7eCB5fSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggY3VycmVudF9kaWZmX2hlYWRlciBjdXJyZW50X2RpZmZfc2lkZQoJZ2xvYmFsIHVpX2RpZmYgdWlfaW5kZXggZmlsZV9zdGF0ZXMKCglpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIGVxIHt9IHx8ICRjdXJyZW50X2RpZmZfaGVhZGVyIGVxIHt9fSByZXR1cm4KCWlmIHshW2xvY2tfaW5kZXggYXBwbHlfaHVua119IHJldHVybgoKCXNldCBhcHBseV9jbWQge2dpdCBhcHBseSAtLWNhY2hlZCAtLXdoaXRlc3BhY2U9bm93YXJufQoJc2V0IG1pIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRjdXJyZW50X2RpZmZfcGF0aCkgMF0KCWlmIHskY3VycmVudF9kaWZmX3NpZGUgZXEgJHVpX2luZGV4fSB7CgkJc2V0IG1vZGUgdW5zdGFnZQoJCWxhcHBlbmQgYXBwbHlfY21kIC0tcmV2ZXJzZQoJCWlmIHtbc3RyaW5nIGluZGV4ICRtaSAwXSBuZSB7TX19IHsKCQkJdW5sb2NrX2luZGV4CgkJCXJldHVybgoJCX0KCX0gZWxzZSB7CgkJc2V0IG1vZGUgc3RhZ2UKCQlpZiB7W3N0cmluZyBpbmRleCAkbWkgMV0gbmUge019fSB7CgkJCXVubG9ja19pbmRleAoJCQlyZXR1cm4KCQl9Cgl9CgoJc2V0IHNfbG5vIFtsaW5kZXggW3NwbGl0IFskdWlfZGlmZiBpbmRleCBAJHgsJHldIC5dIDBdCglzZXQgc19sbm8gWyR1aV9kaWZmIHNlYXJjaCAtYmFja3dhcmRzIC1yZWdleHAgXkBAICRzX2xuby4wIDAuMF0KCWlmIHskc19sbm8gZXEge319IHsKCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCglzZXQgZV9sbm8gWyR1aV9kaWZmIHNlYXJjaCAtZm9yd2FyZHMgLXJlZ2V4cCBeQEAgIiRzX2xubyArIDEgbGluZXMiIGVuZF0KCWlmIHskZV9sbm8gZXEge319IHsKCQlzZXQgZV9sbm8gZW5kCgl9CgoJaWYge1tjYXRjaCB7CgkJc2V0IHAgW29wZW4gInwgJGFwcGx5X2NtZCIgd10KCQlmY29uZmlndXJlICRwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJCXB1dHMgLW5vbmV3bGluZSAkcCAkY3VycmVudF9kaWZmX2hlYWRlcgoJCXB1dHMgLW5vbmV3bGluZSAkcCBbJHVpX2RpZmYgZ2V0ICRzX2xubyAkZV9sbm9dCgkJY2xvc2UgJHB9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvICRtb2RlIHNlbGVjdGVkIGh1bmsuXG5cbiRlcnIiCgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9CgoJJHVpX2RpZmYgY29uZiAtc3RhdGUgbm9ybWFsCgkkdWlfZGlmZiBkZWxldGUgJHNfbG5vICRlX2xubwoJJHVpX2RpZmYgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglpZiB7WyR1aV9kaWZmIGdldCAxLjAgZW5kXSBlcSAiXG4ifSB7CgkJc2V0IG8gXwoJfSBlbHNlIHsKCQlzZXQgbyA/Cgl9CgoJaWYgeyRjdXJyZW50X2RpZmZfc2lkZSBlcSAkdWlfaW5kZXh9IHsKCQlzZXQgbWkgJHtvfU0KCX0gZWxzZWlmIHtbc3RyaW5nIGluZGV4ICRtaSAwXSBlcSB7X319IHsKCQlzZXQgbWkgTSRvCgl9IGVsc2UgewoJCXNldCBtaSA/JG8KCX0KCXVubG9ja19pbmRleAoJZGlzcGxheV9maWxlICRjdXJyZW50X2RpZmZfcGF0aCAkbWkKCWlmIHskbyBlcSB7X319IHsKCQljbGVhcl9kaWZmCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgY29tbWl0Cgpwcm9jIGxvYWRfbGFzdF9jb21taXQge30gewoJZ2xvYmFsIEhFQUQgUEFSRU5UIE1FUkdFX0hFQUQgY29tbWl0X3R5cGUgdWlfY29tbQoJZ2xvYmFsIHJlcG9fY29uZmlnCgoJaWYge1tsbGVuZ3RoICRQQVJFTlRdID09IDB9IHsKCQllcnJvcl9wb3B1cCB7VGhlcmUgaXMgbm90aGluZyB0byBhbWVuZC4KCllvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIGNvbW1pdC4KVGhlcmUgaXMgbm8gY29tbWl0IGJlZm9yZSB0aGlzIHRvIGFtZW5kLgp9CgkJcmV0dXJuCgl9CgoJcmVwb3NpdG9yeV9zdGF0ZSBjdXJUeXBlIGN1ckhFQUQgY3VyTUVSR0VfSEVBRAoJaWYgeyRjdXJUeXBlIGVxIHttZXJnZX19IHsKCQllcnJvcl9wb3B1cCB7Q2Fubm90IGFtZW5kIHdoaWxlIG1lcmdpbmcuCgpZb3UgYXJlIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgdGhhdApoYXMgbm90IGJlZW4gZnVsbHkgY29tcGxldGVkLiAgWW91IGNhbm5vdCBhbWVuZAp0aGUgcHJpb3IgY29tbWl0IHVubGVzcyB5b3UgZmlyc3QgYWJvcnQgdGhlCmN1cnJlbnQgbWVyZ2UgYWN0aXZpdHkuCn0KCQlyZXR1cm4KCX0KCglzZXQgbXNnIHt9CglzZXQgcGFyZW50cyBbbGlzdF0KCWlmIHtbY2F0Y2ggewoJCQlzZXQgZmQgW29wZW4gInwgZ2l0IGNhdC1maWxlIGNvbW1pdCAkY3VySEVBRCIgcl0KCQkJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nIGJpbmFyeSAtdHJhbnNsYXRpb24gbGYKCQkJaWYge1tjYXRjaCB7c2V0IGVuYyAkcmVwb19jb25maWcoaTE4bi5jb21taXRlbmNvZGluZyl9XX0gewoJCQkJc2V0IGVuYyB1dGYtOAoJCQl9CgkJCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPiAwfSB7CgkJCQlpZiB7W3N0cmluZyBtYXRjaCB7cGFyZW50ICp9ICRsaW5lXX0gewoJCQkJCWxhcHBlbmQgcGFyZW50cyBbc3RyaW5nIHJhbmdlICRsaW5lIDcgZW5kXQoJCQkJfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2gge2VuY29kaW5nICp9ICRsaW5lXX0gewoJCQkJCXNldCBlbmMgW3N0cmluZyB0b2xvd2VyIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdXQoJCQkJfQoJCQl9CgkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkZW5jCgkJCXNldCBtc2cgW3N0cmluZyB0cmltIFtyZWFkICRmZF1dCgkJCWNsb3NlICRmZAoJCX0gZXJyXX0gewoJCWVycm9yX3BvcHVwICJFcnJvciBsb2FkaW5nIGNvbW1pdCBkYXRhIGZvciBhbWVuZDpcblxuJGVyciIKCQlyZXR1cm4KCX0KCglzZXQgSEVBRCAkY3VySEVBRAoJc2V0IFBBUkVOVCAkcGFyZW50cwoJc2V0IE1FUkdFX0hFQUQgW2xpc3RdCglzd2l0Y2ggLS0gW2xsZW5ndGggJHBhcmVudHNdIHsKCTAgICAgICAge3NldCBjb21taXRfdHlwZSBhbWVuZC1pbml0aWFsfQoJMSAgICAgICB7c2V0IGNvbW1pdF90eXBlIGFtZW5kfQoJZGVmYXVsdCB7c2V0IGNvbW1pdF90eXBlIGFtZW5kLW1lcmdlfQoJfQoKCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkkdWlfY29tbSBpbnNlcnQgZW5kICRtc2cKCSR1aV9jb21tIGVkaXQgcmVzZXQKCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KfQoKcHJvYyBjcmVhdGVfbmV3X2NvbW1pdCB7fSB7CglnbG9iYWwgY29tbWl0X3R5cGUgdWlfY29tbQoKCXNldCBjb21taXRfdHlwZSBub3JtYWwKCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkkdWlfY29tbSBlZGl0IHJlc2V0CgkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCglyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19Cn0KCnNldCBHSVRfQ09NTUlUVEVSX0lERU5UIHt9Cgpwcm9jIGNvbW1pdHRlcl9pZGVudCB7fSB7CglnbG9iYWwgR0lUX0NPTU1JVFRFUl9JREVOVAoKCWlmIHskR0lUX0NPTU1JVFRFUl9JREVOVCBlcSB7fX0gewoJCWlmIHtbY2F0Y2gge3NldCBtZSBbZXhlYyBnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlRdfSBlcnJdfSB7CgkJCWVycm9yX3BvcHVwICJVbmFibGUgdG8gb2J0YWluIHlvdXIgaWRlbnRpdHk6XG5cbiRlcnIiCgkJCXJldHVybiB7fQoJCX0KCQlpZiB7IVtyZWdleHAge14oLiopIFswLTldKyBbLSswLTldKyR9IFwKCQkJJG1lIG1lIEdJVF9DT01NSVRURVJfSURFTlRdfSB7CgkJCWVycm9yX3BvcHVwICJJbnZhbGlkIEdJVF9DT01NSVRURVJfSURFTlQ6XG5cbiRtZSIKCQkJcmV0dXJuIHt9CgkJfQoJfQoKCXJldHVybiAkR0lUX0NPTU1JVFRFUl9JREVOVAp9Cgpwcm9jIGNvbW1pdF90cmVlIHt9IHsKCWdsb2JhbCBIRUFEIGNvbW1pdF90eXBlIGZpbGVfc3RhdGVzIHVpX2NvbW0gcmVwb19jb25maWcKCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUgcGNoX2Vycm9yCgoJaWYge1tjb21taXR0ZXJfaWRlbnRdIGVxIHt9fSByZXR1cm4KCWlmIHshW2xvY2tfaW5kZXggdXBkYXRlXX0gcmV0dXJuCgoJIyAtLSBPdXIgaW4gbWVtb3J5IHN0YXRlIHNob3VsZCBtYXRjaCB0aGUgcmVwb3NpdG9yeS4KCSMKCXJlcG9zaXRvcnlfc3RhdGUgY3VyVHlwZSBjdXJIRUFEIGN1ck1FUkdFX0hFQUQKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdCgkJJiYgJGN1clR5cGUgZXEge25vcm1hbH0KCQkmJiAkY3VySEVBRCBlcSAkSEVBRH0gewoJfSBlbHNlaWYgeyRjb21taXRfdHlwZSBuZSAkY3VyVHlwZSB8fCAkSEVBRCBuZSAkY3VySEVBRH0gewoJCWluZm9fcG9wdXAge0xhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLgoKQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5CnNpbmNlIHRoZSBsYXN0IHNjYW4uICBBIHJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZApiZWZvcmUgYW5vdGhlciBjb21taXQgY2FuIGJlIGNyZWF0ZWQuCgpUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy4KfQoJCXVubG9ja19pbmRleAoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KCQlyZXR1cm4KCX0KCgkjIC0tIEF0IGxlYXN0IG9uZSBmaWxlIHNob3VsZCBkaWZmZXIgaW4gdGhlIGluZGV4LgoJIwoJc2V0IGZpbGVzX3JlYWR5IDAKCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlfPyB7Y29udGludWV9CgkJQT8gLQoJCUQ/IC0KCQlNPyB7c2V0IGZpbGVzX3JlYWR5IDF9CgkJVT8gewoJCQllcnJvcl9wb3B1cCAiVW5tZXJnZWQgZmlsZXMgY2Fubm90IGJlIGNvbW1pdHRlZC4KCkZpbGUgW3Nob3J0X3BhdGggJHBhdGhdIGhhcyBtZXJnZSBjb25mbGljdHMuCllvdSBtdXN0IHJlc29sdmUgdGhlbSBhbmQgYWRkIHRoZSBmaWxlIGJlZm9yZSBjb21taXR0aW5nLgoiCgkJCXVubG9ja19pbmRleAoJCQlyZXR1cm4KCQl9CgkJZGVmYXVsdCB7CgkJCWVycm9yX3BvcHVwICJVbmtub3duIGZpbGUgc3RhdGUgW2xpbmRleCAkcyAwXSBkZXRlY3RlZC4KCkZpbGUgW3Nob3J0X3BhdGggJHBhdGhdIGNhbm5vdCBiZSBjb21taXR0ZWQgYnkgdGhpcyBwcm9ncmFtLgoiCgkJfQoJCX0KCX0KCWlmIHshJGZpbGVzX3JlYWR5fSB7CgkJaW5mb19wb3B1cCB7Tm8gY2hhbmdlcyB0byBjb21taXQuCgpZb3UgbXVzdCBhZGQgYXQgbGVhc3QgMSBmaWxlIGJlZm9yZSB5b3UgY2FuIGNvbW1pdC4KfQoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gQSBtZXNzYWdlIGlzIHJlcXVpcmVkLgoJIwoJc2V0IG1zZyBbc3RyaW5nIHRyaW0gWyR1aV9jb21tIGdldCAxLjAgZW5kXV0KCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFx0XHJdKyR9ICRtc2cge30gbXNnCglpZiB7JG1zZyBlcSB7fX0gewoJCWVycm9yX3BvcHVwIHtQbGVhc2Ugc3VwcGx5IGEgY29tbWl0IG1lc3NhZ2UuCgpBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgoKLSBGaXJzdCBsaW5lOiBEZXNjcmliZSBpbiBvbmUgc2VudGFuY2Ugd2hhdCB5b3UgZGlkLgotIFNlY29uZCBsaW5lOiBCbGFuawotIFJlbWFpbmluZyBsaW5lczogRGVzY3JpYmUgd2h5IHRoaXMgY2hhbmdlIGlzIGdvb2QuCn0KCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCgkjIC0tIFJ1biB0aGUgcHJlLWNvbW1pdCBob29rLgoJIwoJc2V0IHBjaG9vayBbZ2l0ZGlyIGhvb2tzIHByZS1jb21taXRdCgoJIyBPbiBDeWd3aW4gW2ZpbGUgZXhlY3V0YWJsZV0gbWlnaHQgbGllIHNvIHdlIG5lZWQgdG8gYXNrCgkjIHRoZSBzaGVsbCBpZiB0aGUgaG9vayBpcyBleGVjdXRhYmxlLiAgWWVzIHRoYXQncyBhbm5veWluZy4KCSMKCWlmIHtbaXNfQ3lnd2luXSAmJiBbZmlsZSBpc2ZpbGUgJHBjaG9va119IHsKCQlzZXQgcGNob29rIFtsaXN0IHNoIC1jIFtjb25jYXQgXAoJCQkiaWYgdGVzdCAteCBcIiRwY2hvb2tcIjsiIFwKCQkJInRoZW4gZXhlYyBcIiRwY2hvb2tcIiAyPiYxOyIgXAoJCQkiZmkiXV0KCX0gZWxzZWlmIHtbZmlsZSBleGVjdXRhYmxlICRwY2hvb2tdfSB7CgkJc2V0IHBjaG9vayBbbGlzdCAkcGNob29rIHwmIGNhdF0KCX0gZWxzZSB7CgkJY29tbWl0X3dyaXRldHJlZSAkY3VySEVBRCAkbXNnCgkJcmV0dXJuCgl9CgoJc2V0IHVpX3N0YXR1c192YWx1ZSB7Q2FsbGluZyBwcmUtY29tbWl0IGhvb2suLi59CglzZXQgcGNoX2Vycm9yIHt9CglzZXQgZmRfcGggW29wZW4gInwgJHBjaG9vayIgcl0KCWZjb25maWd1cmUgJGZkX3BoIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmRfcGggcmVhZGFibGUgXAoJCVtsaXN0IGNvbW1pdF9wcmVob29rX3dhaXQgJGZkX3BoICRjdXJIRUFEICRtc2ddCn0KCnByb2MgY29tbWl0X3ByZWhvb2tfd2FpdCB7ZmRfcGggY3VySEVBRCBtc2d9IHsKCWdsb2JhbCBwY2hfZXJyb3IgdWlfc3RhdHVzX3ZhbHVlCgoJYXBwZW5kIHBjaF9lcnJvciBbcmVhZCAkZmRfcGhdCglmY29uZmlndXJlICRmZF9waCAtYmxvY2tpbmcgMQoJaWYge1tlb2YgJGZkX3BoXX0gewoJCWlmIHtbY2F0Y2gge2Nsb3NlICRmZF9waH1dfSB7CgkJCXNldCB1aV9zdGF0dXNfdmFsdWUge0NvbW1pdCBkZWNsaW5lZCBieSBwcmUtY29tbWl0IGhvb2sufQoJCQlob29rX2ZhaWxlZF9wb3B1cCBwcmUtY29tbWl0ICRwY2hfZXJyb3IKCQkJdW5sb2NrX2luZGV4CgkJfSBlbHNlIHsKCQkJY29tbWl0X3dyaXRldHJlZSAkY3VySEVBRCAkbXNnCgkJfQoJCXNldCBwY2hfZXJyb3Ige30KCQlyZXR1cm4KCX0KCWZjb25maWd1cmUgJGZkX3BoIC1ibG9ja2luZyAwCn0KCnByb2MgY29tbWl0X3dyaXRldHJlZSB7Y3VySEVBRCBtc2d9IHsKCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUKCglzZXQgdWlfc3RhdHVzX3ZhbHVlIHtDb21taXR0aW5nIGNoYW5nZXMuLi59CglzZXQgZmRfd3QgW29wZW4gInwgZ2l0IHdyaXRlLXRyZWUiIHJdCglmaWxlZXZlbnQgJGZkX3d0IHJlYWRhYmxlIFwKCQlbbGlzdCBjb21taXRfY29tbWl0dHJlZSAkZmRfd3QgJGN1ckhFQUQgJG1zZ10KfQoKcHJvYyBjb21taXRfY29tbWl0dHJlZSB7ZmRfd3QgY3VySEVBRCBtc2d9IHsKCWdsb2JhbCBIRUFEIFBBUkVOVCBNRVJHRV9IRUFEIGNvbW1pdF90eXBlCglnbG9iYWwgYWxsX2hlYWRzIGN1cnJlbnRfYnJhbmNoCglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlIHVpX2NvbW0gc2VsZWN0ZWRfY29tbWl0X3R5cGUKCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocyByZXNjYW5fYWN0aXZlCglnbG9iYWwgcmVwb19jb25maWcKCglnZXRzICRmZF93dCB0cmVlX2lkCglpZiB7JHRyZWVfaWQgZXEge30gfHwgW2NhdGNoIHtjbG9zZSAkZmRfd3R9IGVycl19IHsKCQllcnJvcl9wb3B1cCAid3JpdGUtdHJlZSBmYWlsZWQ6XG5cbiRlcnIiCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7Q29tbWl0IGZhaWxlZC59CgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9CgoJIyAtLSBCdWlsZCB0aGUgbWVzc2FnZS4KCSMKCXNldCBtc2dfcCBbZ2l0ZGlyIENPTU1JVF9FRElUTVNHXQoJc2V0IG1zZ193dCBbb3BlbiAkbXNnX3Agd10KCWlmIHtbY2F0Y2gge3NldCBlbmMgJHJlcG9fY29uZmlnKGkxOG4uY29tbWl0ZW5jb2RpbmcpfV19IHsKCQlzZXQgZW5jIHV0Zi04Cgl9CglmY29uZmlndXJlICRtc2dfd3QgLWVuY29kaW5nICRlbmMgLXRyYW5zbGF0aW9uIGJpbmFyeQoJcHV0cyAtbm9uZXdsaW5lICRtc2dfd3QgJG1zZwoJY2xvc2UgJG1zZ193dAoKCSMgLS0gQ3JlYXRlIHRoZSBjb21taXQuCgkjCglzZXQgY21kIFtsaXN0IGdpdCBjb21taXQtdHJlZSAkdHJlZV9pZF0KCXNldCBwYXJlbnRzIFtjb25jYXQgJFBBUkVOVCAkTUVSR0VfSEVBRF0KCWlmIHtbbGxlbmd0aCAkcGFyZW50c10gPiAwfSB7CgkJZm9yZWFjaCBwICRwYXJlbnRzIHsKCQkJbGFwcGVuZCBjbWQgLXAgJHAKCQl9Cgl9IGVsc2UgewoJCSMgZ2l0IGNvbW1pdC10cmVlIHdyaXRlcyB0byBzdGRlcnIgZHVyaW5nIGluaXRpYWwgY29tbWl0LgoJCWxhcHBlbmQgY21kIDI+L2Rldi9udWxsCgl9CglsYXBwZW5kIGNtZCA8JG1zZ19wCglpZiB7W2NhdGNoIHtzZXQgY210X2lkIFtldmFsIGV4ZWMgJGNtZF19IGVycl19IHsKCQllcnJvcl9wb3B1cCAiY29tbWl0LXRyZWUgZmFpbGVkOlxuXG4kZXJyIgoJCXNldCB1aV9zdGF0dXNfdmFsdWUge0NvbW1pdCBmYWlsZWQufQoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gVXBkYXRlIHRoZSBIRUFEIHJlZi4KCSMKCXNldCByZWZsb2dtIGNvbW1pdAoJaWYgeyRjb21taXRfdHlwZSBuZSB7bm9ybWFsfX0gewoJCWFwcGVuZCByZWZsb2dtICIgKCRjb21taXRfdHlwZSkiCgl9CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJG1zZ10KCWlmIHskaSA+PSAwfSB7CgkJYXBwZW5kIHJlZmxvZ20gezogfSBbc3RyaW5nIHJhbmdlICRtc2cgMCBbZXhwciB7JGkgLSAxfV1dCgl9IGVsc2UgewoJCWFwcGVuZCByZWZsb2dtIHs6IH0gJG1zZwoJfQoJc2V0IGNtZCBbbGlzdCBnaXQgdXBkYXRlLXJlZiAtbSAkcmVmbG9nbSBIRUFEICRjbXRfaWQgJGN1ckhFQURdCglpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZH0gZXJyXX0gewoJCWVycm9yX3BvcHVwICJ1cGRhdGUtcmVmIGZhaWxlZDpcblxuJGVyciIKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtDb21taXQgZmFpbGVkLn0KCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCgkjIC0tIE1ha2Ugc3VyZSBvdXIgY3VycmVudCBicmFuY2ggZXhpc3RzLgoJIwoJaWYgeyRjb21taXRfdHlwZSBlcSB7aW5pdGlhbH19IHsKCQlsYXBwZW5kIGFsbF9oZWFkcyAkY3VycmVudF9icmFuY2gKCQlzZXQgYWxsX2hlYWRzIFtsc29ydCAtdW5pcXVlICRhbGxfaGVhZHNdCgkJcG9wdWxhdGVfYnJhbmNoX21lbnUKCX0KCgkjIC0tIENsZWFudXAgYWZ0ZXIgb3Vyc2VsdmVzLgoJIwoJY2F0Y2gge2ZpbGUgZGVsZXRlICRtc2dfcH0KCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIE1FUkdFX0hFQURdfQoJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgTUVSR0VfTVNHXX0KCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIFNRVUFTSF9NU0ddfQoJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgR0lUR1VJX01TR119CgoJIyAtLSBMZXQgcmVyZXJlIGRvIGl0cyB0aGluZy4KCSMKCWlmIHtbZmlsZSBpc2RpcmVjdG9yeSBbZ2l0ZGlyIHJyLWNhY2hlXV19IHsKCQljYXRjaCB7ZXhlYyBnaXQgcmVyZXJlfQoJfQoKCSMgLS0gUnVuIHRoZSBwb3N0LWNvbW1pdCBob29rLgoJIwoJc2V0IHBjaG9vayBbZ2l0ZGlyIGhvb2tzIHBvc3QtY29tbWl0XQoJaWYge1tpc19DeWd3aW5dICYmIFtmaWxlIGlzZmlsZSAkcGNob29rXX0gewoJCXNldCBwY2hvb2sgW2xpc3Qgc2ggLWMgW2NvbmNhdCBcCgkJCSJpZiB0ZXN0IC14IFwiJHBjaG9va1wiOyIgXAoJCQkidGhlbiBleGVjIFwiJHBjaG9va1wiOyIgXAoJCQkiZmkiXV0KCX0gZWxzZWlmIHshW2ZpbGUgZXhlY3V0YWJsZSAkcGNob29rXX0gewoJCXNldCBwY2hvb2sge30KCX0KCWlmIHskcGNob29rIG5lIHt9fSB7CgkJY2F0Y2gge2V4ZWMgJHBjaG9vayAmfQoJfQoKCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkkdWlfY29tbSBlZGl0IHJlc2V0CgkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCgoJaWYge1tpc19lbmFibGVkIHNpbmdsZWNvbW1pdF19IGRvX3F1aXQKCgkjIC0tIFVwZGF0ZSBpbiBtZW1vcnkgc3RhdHVzCgkjCglzZXQgc2VsZWN0ZWRfY29tbWl0X3R5cGUgbmV3CglzZXQgY29tbWl0X3R5cGUgbm9ybWFsCglzZXQgSEVBRCAkY210X2lkCglzZXQgUEFSRU5UICRjbXRfaWQKCXNldCBNRVJHRV9IRUFEIFtsaXN0XQoKCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKCQlzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCgkJc2V0IG0gW2xpbmRleCAkcyAwXQoJCXN3aXRjaCAtZ2xvYiAtLSAkbSB7CgkJX08gLQoJCV9NIC0KCQlfRCB7Y29udGludWV9CgkJX18gLQoJCUFfIC0KCQlNXyAtCgkJRF8gewoJCQl1bnNldCBmaWxlX3N0YXRlcygkcGF0aCkKCQkJY2F0Y2gge3Vuc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKX0KCQl9CgkJRE8gewoJCQlzZXQgZmlsZV9zdGF0ZXMoJHBhdGgpIFtsaXN0IF9PIFtsaW5kZXggJHMgMV0ge30ge31dCgkJfQoJCUFNIC0KCQlBRCAtCgkJTU0gLQoJCU1EIHsKCQkJc2V0IGZpbGVfc3RhdGVzKCRwYXRoKSBbbGlzdCBcCgkJCQlfW3N0cmluZyBpbmRleCAkbSAxXSBcCgkJCQlbbGluZGV4ICRzIDFdIFwKCQkJCVtsaW5kZXggJHMgM10gXAoJCQkJe31dCgkJfQoJCX0KCX0KCglkaXNwbGF5X2FsbF9maWxlcwoJdW5sb2NrX2luZGV4CglyZXNob3dfZGlmZgoJc2V0IHVpX3N0YXR1c192YWx1ZSBcCgkJIkNoYW5nZXMgY29tbWl0dGVkIGFzIFtzdHJpbmcgcmFuZ2UgJGNtdF9pZCAwIDddLiIKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBmZXRjaCBwdXNoCgpwcm9jIGZldGNoX2Zyb20ge3JlbW90ZX0gewoJc2V0IHcgW25ld19jb25zb2xlIFwKCQkiZmV0Y2ggJHJlbW90ZSIgXAoJCSJGZXRjaGluZyBuZXcgY2hhbmdlcyBmcm9tICRyZW1vdGUiXQoJc2V0IGNtZCBbbGlzdCBnaXQgZmV0Y2hdCglsYXBwZW5kIGNtZCAkcmVtb3RlCgljb25zb2xlX2V4ZWMgJHcgJGNtZCBjb25zb2xlX2RvbmUKfQoKcHJvYyBwdXNoX3RvIHtyZW1vdGV9IHsKCXNldCB3IFtuZXdfY29uc29sZSBcCgkJInB1c2ggJHJlbW90ZSIgXAoJCSJQdXNoaW5nIGNoYW5nZXMgdG8gJHJlbW90ZSJdCglzZXQgY21kIFtsaXN0IGdpdCBwdXNoXQoJbGFwcGVuZCBjbWQgLXYKCWxhcHBlbmQgY21kICRyZW1vdGUKCWNvbnNvbGVfZXhlYyAkdyAkY21kIGNvbnNvbGVfZG9uZQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGhlbHBlcnMKCnByb2MgbWFwaWNvbiB7dyBzdGF0ZSBwYXRofSB7CglnbG9iYWwgYWxsX2ljb25zCgoJaWYge1tjYXRjaCB7c2V0IHIgJGFsbF9pY29ucygkc3RhdGUkdyl9XX0gewoJCXB1dHMgImVycm9yOiBubyBpY29uIGZvciAkdyBzdGF0ZT17JHN0YXRlfSAkcGF0aCIKCQlyZXR1cm4gZmlsZV9wbGFpbgoJfQoJcmV0dXJuICRyCn0KCnByb2MgbWFwZGVzYyB7c3RhdGUgcGF0aH0gewoJZ2xvYmFsIGFsbF9kZXNjcwoKCWlmIHtbY2F0Y2gge3NldCByICRhbGxfZGVzY3MoJHN0YXRlKX1dfSB7CgkJcHV0cyAiZXJyb3I6IG5vIGRlc2MgZm9yIHN0YXRlPXskc3RhdGV9ICRwYXRoIgoJCXJldHVybiAkc3RhdGUKCX0KCXJldHVybiAkcgp9Cgpwcm9jIGVzY2FwZV9wYXRoIHtwYXRofSB7CglyZWdzdWIgLWFsbCB7XFx9ICRwYXRoICJcXFxcIiBwYXRoCglyZWdzdWIgLWFsbCAiXG4iICRwYXRoICJcXG4iIHBhdGgKCXJldHVybiAkcGF0aAp9Cgpwcm9jIHNob3J0X3BhdGgge3BhdGh9IHsKCXJldHVybiBbZXNjYXBlX3BhdGggW2xpbmRleCBbZmlsZSBzcGxpdCAkcGF0aF0gZW5kXV0KfQoKc2V0IG5leHRfaWNvbl9pZCAwCnNldCBudWxsX3NoYTEgW3N0cmluZyByZXBlYXQgMCA0MF0KCnByb2MgbWVyZ2Vfc3RhdGUge3BhdGggbmV3X3N0YXRlIHtoZWFkX2luZm8ge319IHtpbmRleF9pbmZvIHt9fX0gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIG5leHRfaWNvbl9pZCBudWxsX3NoYTEKCglzZXQgczAgW3N0cmluZyBpbmRleCAkbmV3X3N0YXRlIDBdCglzZXQgczEgW3N0cmluZyBpbmRleCAkbmV3X3N0YXRlIDFdCgoJaWYge1tjYXRjaCB7c2V0IGluZm8gJGZpbGVfc3RhdGVzKCRwYXRoKX1dfSB7CgkJc2V0IHN0YXRlIF9fCgkJc2V0IGljb24gbltpbmNyIG5leHRfaWNvbl9pZF0KCX0gZWxzZSB7CgkJc2V0IHN0YXRlIFtsaW5kZXggJGluZm8gMF0KCQlzZXQgaWNvbiBbbGluZGV4ICRpbmZvIDFdCgkJaWYgeyRoZWFkX2luZm8gZXEge319ICB7c2V0IGhlYWRfaW5mbyAgW2xpbmRleCAkaW5mbyAyXX0KCQlpZiB7JGluZGV4X2luZm8gZXEge319IHtzZXQgaW5kZXhfaW5mbyBbbGluZGV4ICRpbmZvIDNdfQoJfQoKCWlmICAgICB7JHMwIGVxIHs/fX0ge3NldCBzMCBbc3RyaW5nIGluZGV4ICRzdGF0ZSAwXX0gXAoJZWxzZWlmIHskczAgZXEge199fSB7c2V0IHMwIF99CgoJaWYgICAgIHskczEgZXEgez99fSB7c2V0IHMxIFtzdHJpbmcgaW5kZXggJHN0YXRlIDFdfSBcCgllbHNlaWYgeyRzMSBlcSB7X319IHtzZXQgczEgX30KCglpZiB7JHMwIGVxIHtBfSAmJiAkczEgZXEge199ICYmICRoZWFkX2luZm8gZXEge319IHsKCQlzZXQgaGVhZF9pbmZvIFtsaXN0IDAgJG51bGxfc2hhMV0KCX0gZWxzZWlmIHskczAgbmUge199ICYmIFtzdHJpbmcgaW5kZXggJHN0YXRlIDBdIGVxIHtffQoJCSYmICRoZWFkX2luZm8gZXEge319IHsKCQlzZXQgaGVhZF9pbmZvICRpbmRleF9pbmZvCgl9CgoJc2V0IGZpbGVfc3RhdGVzKCRwYXRoKSBbbGlzdCAkczAkczEgJGljb24gXAoJCSRoZWFkX2luZm8gJGluZGV4X2luZm8gXAoJCV0KCXJldHVybiAkc3RhdGUKfQoKcHJvYyBkaXNwbGF5X2ZpbGVfaGVscGVyIHt3IHBhdGggaWNvbl9uYW1lIG9sZF9tIG5ld19tfSB7CglnbG9iYWwgZmlsZV9saXN0cwoKCWlmIHskbmV3X20gZXEge199fSB7CgkJc2V0IGxubyBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkdykgJHBhdGhdCgkJaWYgeyRsbm8gPj0gMH0gewoJCQlzZXQgZmlsZV9saXN0cygkdykgW2xyZXBsYWNlICRmaWxlX2xpc3RzKCR3KSAkbG5vICRsbm9dCgkJCWluY3IgbG5vCgkJCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJCQkkdyBkZWxldGUgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCQkJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCQl9Cgl9IGVsc2VpZiB7JG9sZF9tIGVxIHtffSAmJiAkbmV3X20gbmUge199fSB7CgkJbGFwcGVuZCBmaWxlX2xpc3RzKCR3KSAkcGF0aAoJCXNldCBmaWxlX2xpc3RzKCR3KSBbbHNvcnQgLXVuaXF1ZSAkZmlsZV9saXN0cygkdyldCgkJc2V0IGxubyBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkdykgJHBhdGhdCgkJaW5jciBsbm8KCQkkdyBjb25mIC1zdGF0ZSBub3JtYWwKCQkkdyBpbWFnZSBjcmVhdGUgJGxuby4wIFwKCQkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAoJCQktbmFtZSAkaWNvbl9uYW1lIFwKCQkJLWltYWdlIFttYXBpY29uICR3ICRuZXdfbSAkcGF0aF0KCQkkdyBpbnNlcnQgJGxuby4xICJbZXNjYXBlX3BhdGggJHBhdGhdXG4iCgkJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCX0gZWxzZWlmIHskb2xkX20gbmUgJG5ld19tfSB7CgkJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkJJHcgaW1hZ2UgY29uZiAkaWNvbl9uYW1lIC1pbWFnZSBbbWFwaWNvbiAkdyAkbmV3X20gJHBhdGhdCgkJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCX0KfQoKcHJvYyBkaXNwbGF5X2ZpbGUge3BhdGggc3RhdGV9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocwoJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIKCglzZXQgb2xkX20gW21lcmdlX3N0YXRlICRwYXRoICRzdGF0ZV0KCXNldCBzICRmaWxlX3N0YXRlcygkcGF0aCkKCXNldCBuZXdfbSBbbGluZGV4ICRzIDBdCglzZXQgaWNvbl9uYW1lIFtsaW5kZXggJHMgMV0KCglzZXQgbyBbc3RyaW5nIGluZGV4ICRvbGRfbSAwXQoJc2V0IG4gW3N0cmluZyBpbmRleCAkbmV3X20gMF0KCWlmIHskbyBlcSB7VX19IHsKCQlzZXQgbyBfCgl9CglpZiB7JG4gZXEge1V9fSB7CgkJc2V0IG4gXwoJfQoJZGlzcGxheV9maWxlX2hlbHBlcgkkdWlfaW5kZXggJHBhdGggJGljb25fbmFtZSAkbyAkbgoKCWlmIHtbc3RyaW5nIGluZGV4ICRvbGRfbSAwXSBlcSB7VX19IHsKCQlzZXQgbyBVCgl9IGVsc2UgewoJCXNldCBvIFtzdHJpbmcgaW5kZXggJG9sZF9tIDFdCgl9CglpZiB7W3N0cmluZyBpbmRleCAkbmV3X20gMF0gZXEge1V9fSB7CgkJc2V0IG4gVQoJfSBlbHNlIHsKCQlzZXQgbiBbc3RyaW5nIGluZGV4ICRuZXdfbSAxXQoJfQoJZGlzcGxheV9maWxlX2hlbHBlcgkkdWlfd29ya2RpciAkcGF0aCAkaWNvbl9uYW1lICRvICRuCgoJaWYgeyRuZXdfbSBlcSB7X199fSB7CgkJdW5zZXQgZmlsZV9zdGF0ZXMoJHBhdGgpCgkJY2F0Y2gge3Vuc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKX0KCX0KfQoKcHJvYyBkaXNwbGF5X2FsbF9maWxlc19oZWxwZXIge3cgcGF0aCBpY29uX25hbWUgbX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMKCglsYXBwZW5kIGZpbGVfbGlzdHMoJHcpICRwYXRoCglzZXQgbG5vIFtleHByIHtbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggZW5kXSAuXSAwXSAtIDF9XQoJJHcgaW1hZ2UgY3JlYXRlIGVuZCBcCgkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAoJCS1uYW1lICRpY29uX25hbWUgXAoJCS1pbWFnZSBbbWFwaWNvbiAkdyAkbSAkcGF0aF0KCSR3IGluc2VydCBlbmQgIltlc2NhcGVfcGF0aCAkcGF0aF1cbiIKfQoKcHJvYyBkaXNwbGF5X2FsbF9maWxlcyB7fSB7CglnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpcgoJZ2xvYmFsIGZpbGVfc3RhdGVzIGZpbGVfbGlzdHMKCWdsb2JhbCBsYXN0X2NsaWNrZWQKCgkkdWlfaW5kZXggY29uZiAtc3RhdGUgbm9ybWFsCgkkdWlfd29ya2RpciBjb25mIC1zdGF0ZSBub3JtYWwKCgkkdWlfaW5kZXggZGVsZXRlIDAuMCBlbmQKCSR1aV93b3JrZGlyIGRlbGV0ZSAwLjAgZW5kCglzZXQgbGFzdF9jbGlja2VkIHt9CgoJc2V0IGZpbGVfbGlzdHMoJHVpX2luZGV4KSBbbGlzdF0KCXNldCBmaWxlX2xpc3RzKCR1aV93b3JrZGlyKSBbbGlzdF0KCglmb3JlYWNoIHBhdGggW2xzb3J0IFthcnJheSBuYW1lcyBmaWxlX3N0YXRlc11dIHsKCQlzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCgkJc2V0IG0gW2xpbmRleCAkcyAwXQoJCXNldCBpY29uX25hbWUgW2xpbmRleCAkcyAxXQoKCQlzZXQgcyBbc3RyaW5nIGluZGV4ICRtIDBdCgkJaWYgeyRzIG5lIHtVfSAmJiAkcyBuZSB7X319IHsKCQkJZGlzcGxheV9hbGxfZmlsZXNfaGVscGVyICR1aV9pbmRleCAkcGF0aCBcCgkJCQkkaWNvbl9uYW1lICRzCgkJfQoKCQlpZiB7W3N0cmluZyBpbmRleCAkbSAwXSBlcSB7VX19IHsKCQkJc2V0IHMgVQoJCX0gZWxzZSB7CgkJCXNldCBzIFtzdHJpbmcgaW5kZXggJG0gMV0KCQl9CgkJaWYgeyRzIG5lIHtffX0gewoJCQlkaXNwbGF5X2FsbF9maWxlc19oZWxwZXIgJHVpX3dvcmtkaXIgJHBhdGggXAoJCQkJJGljb25fbmFtZSAkcwoJCX0KCX0KCgkkdWlfaW5kZXggY29uZiAtc3RhdGUgZGlzYWJsZWQKCSR1aV93b3JrZGlyIGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgdXBkYXRlX2luZGV4aW5mbyB7bXNnIHBhdGhMaXN0IGFmdGVyfSB7CglnbG9iYWwgdXBkYXRlX2luZGV4X2NwIHVpX3N0YXR1c192YWx1ZQoKCWlmIHshW2xvY2tfaW5kZXggdXBkYXRlXX0gcmV0dXJuCgoJc2V0IHVwZGF0ZV9pbmRleF9jcCAwCglzZXQgcGF0aExpc3QgW2xzb3J0ICRwYXRoTGlzdF0KCXNldCB0b3RhbENudCBbbGxlbmd0aCAkcGF0aExpc3RdCglzZXQgYmF0Y2ggW2V4cHIge2ludCgkdG90YWxDbnQgKiAuMDEpICsgMX1dCglpZiB7JGJhdGNoID4gMjV9IHtzZXQgYmF0Y2ggMjV9CgoJc2V0IHVpX3N0YXR1c192YWx1ZSBbZm9ybWF0IFwKCQkiJG1zZy4uLiAlaS8laSBmaWxlcyAoJS4yZiUlKSIgXAoJCSR1cGRhdGVfaW5kZXhfY3AgXAoJCSR0b3RhbENudCBcCgkJMC4wXQoJc2V0IGZkIFtvcGVuICJ8IGdpdCB1cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvIiB3XQoJZmNvbmZpZ3VyZSAkZmQgXAoJCS1ibG9ja2luZyAwIFwKCQktYnVmZmVyaW5nIGZ1bGwgXAoJCS1idWZmZXJzaXplIDUxMiBcCgkJLWVuY29kaW5nIGJpbmFyeSBcCgkJLXRyYW5zbGF0aW9uIGJpbmFyeQoJZmlsZWV2ZW50ICRmZCB3cml0YWJsZSBbbGlzdCBcCgkJd3JpdGVfdXBkYXRlX2luZGV4aW5mbyBcCgkJJGZkIFwKCQkkcGF0aExpc3QgXAoJCSR0b3RhbENudCBcCgkJJGJhdGNoIFwKCQkkbXNnIFwKCQkkYWZ0ZXIgXAoJCV0KfQoKcHJvYyB3cml0ZV91cGRhdGVfaW5kZXhpbmZvIHtmZCBwYXRoTGlzdCB0b3RhbENudCBiYXRjaCBtc2cgYWZ0ZXJ9IHsKCWdsb2JhbCB1cGRhdGVfaW5kZXhfY3AgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7JHVwZGF0ZV9pbmRleF9jcCA+PSAkdG90YWxDbnR9IHsKCQljbG9zZSAkZmQKCQl1bmxvY2tfaW5kZXgKCQl1cGxldmVsICMwICRhZnRlcgoJCXJldHVybgoJfQoKCWZvciB7c2V0IGkgJGJhdGNofSBcCgkJeyR1cGRhdGVfaW5kZXhfY3AgPCAkdG90YWxDbnQgJiYgJGkgPiAwfSBcCgkJe2luY3IgaSAtMX0gewoJCXNldCBwYXRoIFtsaW5kZXggJHBhdGhMaXN0ICR1cGRhdGVfaW5kZXhfY3BdCgkJaW5jciB1cGRhdGVfaW5kZXhfY3AKCgkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQoJCXN3aXRjaCAtZ2xvYiAtLSBbbGluZGV4ICRzIDBdIHsKCQlBPyB7c2V0IG5ldyBfT30KCQlNPyB7c2V0IG5ldyBfTX0KCQlEXyB7c2V0IG5ldyBfRH0KCQlEPyB7c2V0IG5ldyBfP30KCQk/PyB7Y29udGludWV9CgkJfQoJCXNldCBpbmZvIFtsaW5kZXggJHMgMl0KCQlpZiB7JGluZm8gZXEge319IGNvbnRpbnVlCgoJCXB1dHMgLW5vbmV3bGluZSAkZmQgIiRpbmZvXHRbZW5jb2RpbmcgY29udmVydHRvICRwYXRoXVwwIgoJCWRpc3BsYXlfZmlsZSAkcGF0aCAkbmV3Cgl9CgoJc2V0IHVpX3N0YXR1c192YWx1ZSBbZm9ybWF0IFwKCQkiJG1zZy4uLiAlaS8laSBmaWxlcyAoJS4yZiUlKSIgXAoJCSR1cGRhdGVfaW5kZXhfY3AgXAoJCSR0b3RhbENudCBcCgkJW2V4cHIgezEwMC4wICogJHVwZGF0ZV9pbmRleF9jcCAvICR0b3RhbENudH1dXQp9Cgpwcm9jIHVwZGF0ZV9pbmRleCB7bXNnIHBhdGhMaXN0IGFmdGVyfSB7CglnbG9iYWwgdXBkYXRlX2luZGV4X2NwIHVpX3N0YXR1c192YWx1ZQoKCWlmIHshW2xvY2tfaW5kZXggdXBkYXRlXX0gcmV0dXJuCgoJc2V0IHVwZGF0ZV9pbmRleF9jcCAwCglzZXQgcGF0aExpc3QgW2xzb3J0ICRwYXRoTGlzdF0KCXNldCB0b3RhbENudCBbbGxlbmd0aCAkcGF0aExpc3RdCglzZXQgYmF0Y2ggW2V4cHIge2ludCgkdG90YWxDbnQgKiAuMDEpICsgMX1dCglpZiB7JGJhdGNoID4gMjV9IHtzZXQgYmF0Y2ggMjV9CgoJc2V0IHVpX3N0YXR1c192YWx1ZSBbZm9ybWF0IFwKCQkiJG1zZy4uLiAlaS8laSBmaWxlcyAoJS4yZiUlKSIgXAoJCSR1cGRhdGVfaW5kZXhfY3AgXAoJCSR0b3RhbENudCBcCgkJMC4wXQoJc2V0IGZkIFtvcGVuICJ8IGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLXogLS1zdGRpbiIgd10KCWZjb25maWd1cmUgJGZkIFwKCQktYmxvY2tpbmcgMCBcCgkJLWJ1ZmZlcmluZyBmdWxsIFwKCQktYnVmZmVyc2l6ZSA1MTIgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgd3JpdGFibGUgW2xpc3QgXAoJCXdyaXRlX3VwZGF0ZV9pbmRleCBcCgkJJGZkIFwKCQkkcGF0aExpc3QgXAoJCSR0b3RhbENudCBcCgkJJGJhdGNoIFwKCQkkbXNnIFwKCQkkYWZ0ZXIgXAoJCV0KfQoKcHJvYyB3cml0ZV91cGRhdGVfaW5kZXgge2ZkIHBhdGhMaXN0IHRvdGFsQ250IGJhdGNoIG1zZyBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCWdsb2JhbCBmaWxlX3N0YXRlcyBjdXJyZW50X2RpZmZfcGF0aAoKCWlmIHskdXBkYXRlX2luZGV4X2NwID49ICR0b3RhbENudH0gewoJCWNsb3NlICRmZAoJCXVubG9ja19pbmRleAoJCXVwbGV2ZWwgIzAgJGFmdGVyCgkJcmV0dXJuCgl9CgoJZm9yIHtzZXQgaSAkYmF0Y2h9IFwKCQl7JHVwZGF0ZV9pbmRleF9jcCA8ICR0b3RhbENudCAmJiAkaSA+IDB9IFwKCQl7aW5jciBpIC0xfSB7CgkJc2V0IHBhdGggW2xpbmRleCAkcGF0aExpc3QgJHVwZGF0ZV9pbmRleF9jcF0KCQlpbmNyIHVwZGF0ZV9pbmRleF9jcAoKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlBRCB7c2V0IG5ldyBfX30KCQk/RCB7c2V0IG5ldyBEX30KCQlfTyAtCgkJQU0ge3NldCBuZXcgQV99CgkJVT8gewoJCQlpZiB7W2ZpbGUgZXhpc3RzICRwYXRoXX0gewoJCQkJc2V0IG5ldyBNXwoJCQl9IGVsc2UgewoJCQkJc2V0IG5ldyBEXwoJCQl9CgkJfQoJCT9NIHtzZXQgbmV3IE1ffQoJCT8/IHtjb250aW51ZX0KCQl9CgkJcHV0cyAtbm9uZXdsaW5lICRmZCAiW2VuY29kaW5nIGNvbnZlcnR0byAkcGF0aF1cMCIKCQlkaXNwbGF5X2ZpbGUgJHBhdGggJG5ldwoJfQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCVtleHByIHsxMDAuMCAqICR1cGRhdGVfaW5kZXhfY3AgLyAkdG90YWxDbnR9XV0KfQoKcHJvYyBjaGVja291dF9pbmRleCB7bXNnIHBhdGhMaXN0IGFmdGVyfSB7CglnbG9iYWwgdXBkYXRlX2luZGV4X2NwIHVpX3N0YXR1c192YWx1ZQoKCWlmIHshW2xvY2tfaW5kZXggdXBkYXRlXX0gcmV0dXJuCgoJc2V0IHVwZGF0ZV9pbmRleF9jcCAwCglzZXQgcGF0aExpc3QgW2xzb3J0ICRwYXRoTGlzdF0KCXNldCB0b3RhbENudCBbbGxlbmd0aCAkcGF0aExpc3RdCglzZXQgYmF0Y2ggW2V4cHIge2ludCgkdG90YWxDbnQgKiAuMDEpICsgMX1dCglpZiB7JGJhdGNoID4gMjV9IHtzZXQgYmF0Y2ggMjV9CgoJc2V0IHVpX3N0YXR1c192YWx1ZSBbZm9ybWF0IFwKCQkiJG1zZy4uLiAlaS8laSBmaWxlcyAoJS4yZiUlKSIgXAoJCSR1cGRhdGVfaW5kZXhfY3AgXAoJCSR0b3RhbENudCBcCgkJMC4wXQoJc2V0IGNtZCBbbGlzdCBnaXQgY2hlY2tvdXQtaW5kZXhdCglsYXBwZW5kIGNtZCAtLWluZGV4CglsYXBwZW5kIGNtZCAtLXF1aWV0CglsYXBwZW5kIGNtZCAtLWZvcmNlCglsYXBwZW5kIGNtZCAtegoJbGFwcGVuZCBjbWQgLS1zdGRpbgoJc2V0IGZkIFtvcGVuICJ8ICRjbWQgIiB3XQoJZmNvbmZpZ3VyZSAkZmQgXAoJCS1ibG9ja2luZyAwIFwKCQktYnVmZmVyaW5nIGZ1bGwgXAoJCS1idWZmZXJzaXplIDUxMiBcCgkJLWVuY29kaW5nIGJpbmFyeSBcCgkJLXRyYW5zbGF0aW9uIGJpbmFyeQoJZmlsZWV2ZW50ICRmZCB3cml0YWJsZSBbbGlzdCBcCgkJd3JpdGVfY2hlY2tvdXRfaW5kZXggXAoJCSRmZCBcCgkJJHBhdGhMaXN0IFwKCQkkdG90YWxDbnQgXAoJCSRiYXRjaCBcCgkJJG1zZyBcCgkJJGFmdGVyIFwKCQldCn0KCnByb2Mgd3JpdGVfY2hlY2tvdXRfaW5kZXgge2ZkIHBhdGhMaXN0IHRvdGFsQ250IGJhdGNoIG1zZyBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCWdsb2JhbCBmaWxlX3N0YXRlcyBjdXJyZW50X2RpZmZfcGF0aAoKCWlmIHskdXBkYXRlX2luZGV4X2NwID49ICR0b3RhbENudH0gewoJCWNsb3NlICRmZAoJCXVubG9ja19pbmRleAoJCXVwbGV2ZWwgIzAgJGFmdGVyCgkJcmV0dXJuCgl9CgoJZm9yIHtzZXQgaSAkYmF0Y2h9IFwKCQl7JHVwZGF0ZV9pbmRleF9jcCA8ICR0b3RhbENudCAmJiAkaSA+IDB9IFwKCQl7aW5jciBpIC0xfSB7CgkJc2V0IHBhdGggW2xpbmRleCAkcGF0aExpc3QgJHVwZGF0ZV9pbmRleF9jcF0KCQlpbmNyIHVwZGF0ZV9pbmRleF9jcAoJCXN3aXRjaCAtZ2xvYiAtLSBbbGluZGV4ICRmaWxlX3N0YXRlcygkcGF0aCkgMF0gewoJCVU/IHtjb250aW51ZX0KCQk/TSAtCgkJP0QgewoJCQlwdXRzIC1ub25ld2xpbmUgJGZkICJbZW5jb2RpbmcgY29udmVydHRvICRwYXRoXVwwIgoJCQlkaXNwbGF5X2ZpbGUgJHBhdGggP18KCQl9CgkJfQoJfQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCVtleHByIHsxMDAuMCAqICR1cGRhdGVfaW5kZXhfY3AgLyAkdG90YWxDbnR9XV0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBicmFuY2ggbWFuYWdlbWVudAoKcHJvYyBpc190cmFja2luZ19icmFuY2gge25hbWV9IHsKCWdsb2JhbCB0cmFja2luZ19icmFuY2hlcwoKCWlmIHshW2NhdGNoIHtzZXQgaW5mbyAkdHJhY2tpbmdfYnJhbmNoZXMoJG5hbWUpfV19IHsKCQlyZXR1cm4gMQoJfQoJZm9yZWFjaCB0IFthcnJheSBuYW1lcyB0cmFja2luZ19icmFuY2hlc10gewoJCWlmIHtbc3RyaW5nIG1hdGNoIHsqL1wqfSAkdF0gJiYgW3N0cmluZyBtYXRjaCAkdCAkbmFtZV19IHsKCQkJcmV0dXJuIDEKCQl9Cgl9CglyZXR1cm4gMAp9Cgpwcm9jIGxvYWRfYWxsX2hlYWRzIHt9IHsKCWdsb2JhbCBhbGxfaGVhZHMKCglzZXQgYWxsX2hlYWRzIFtsaXN0XQoJc2V0IGZkIFtvcGVuICJ8IGdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JShyZWZuYW1lKSByZWZzL2hlYWRzIiByXQoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKCQlpZiB7W2lzX3RyYWNraW5nX2JyYW5jaCAkbGluZV19IGNvbnRpbnVlCgkJaWYgeyFbcmVnc3ViIF5yZWZzL2hlYWRzLyAkbGluZSB7fSBuYW1lXX0gY29udGludWUKCQlsYXBwZW5kIGFsbF9oZWFkcyAkbmFtZQoJfQoJY2xvc2UgJGZkCgoJc2V0IGFsbF9oZWFkcyBbbHNvcnQgJGFsbF9oZWFkc10KfQoKcHJvYyBwb3B1bGF0ZV9icmFuY2hfbWVudSB7fSB7CglnbG9iYWwgYWxsX2hlYWRzIGRpc2FibGVfb25fbG9jawoKCXNldCBtIC5tYmFyLmJyYW5jaAoJc2V0IGxhc3QgWyRtIGluZGV4IGxhc3RdCglmb3Ige3NldCBpIDB9IHskaSA8PSAkbGFzdH0ge2luY3IgaX0gewoJCWlmIHtbJG0gdHlwZSAkaV0gZXEge3NlcGFyYXRvcn19IHsKCQkJJG0gZGVsZXRlICRpIGxhc3QKCQkJc2V0IG5ld19kb2wgW2xpc3RdCgkJCWZvcmVhY2ggYSAkZGlzYWJsZV9vbl9sb2NrIHsKCQkJCWlmIHtbbGluZGV4ICRhIDBdIG5lICRtIHx8IFtsaW5kZXggJGEgMl0gPCAkaX0gewoJCQkJCWxhcHBlbmQgbmV3X2RvbCAkYQoJCQkJfQoJCQl9CgkJCXNldCBkaXNhYmxlX29uX2xvY2sgJG5ld19kb2wKCQkJYnJlYWsKCQl9Cgl9CgoJaWYgeyRhbGxfaGVhZHMgbmUge319IHsKCQkkbSBhZGQgc2VwYXJhdG9yCgl9Cglmb3JlYWNoIGIgJGFsbF9oZWFkcyB7CgkJJG0gYWRkIHJhZGlvYnV0dG9uIFwKCQkJLWxhYmVsICRiIFwKCQkJLWNvbW1hbmQgW2xpc3Qgc3dpdGNoX2JyYW5jaCAkYl0gXAoJCQktdmFyaWFibGUgY3VycmVudF9icmFuY2ggXAoJCQktdmFsdWUgJGIgXAoJCQktZm9udCBmb250X3VpCgkJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCQlbbGlzdCAkbSBlbnRyeWNvbmYgWyRtIGluZGV4IGxhc3RdIC1zdGF0ZV0KCX0KfQoKcHJvYyBhbGxfdHJhY2tpbmdfYnJhbmNoZXMge30gewoJZ2xvYmFsIHRyYWNraW5nX2JyYW5jaGVzCgoJc2V0IGFsbF90cmFja2luZ3Mge30KCXNldCBjbWQge30KCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgdHJhY2tpbmdfYnJhbmNoZXNdIHsKCQlpZiB7W3JlZ3N1YiB7L1wqJH0gJG5hbWUge30gbmFtZV19IHsKCQkJbGFwcGVuZCBjbWQgJG5hbWUKCQl9IGVsc2UgewoJCQlyZWdzdWIgXnJlZnMvKGhlYWRzfHJlbW90ZXMpLyAkbmFtZSB7fSBuYW1lCgkJCWxhcHBlbmQgYWxsX3RyYWNraW5ncyAkbmFtZQoJCX0KCX0KCglpZiB7JGNtZCBuZSB7fX0gewoJCXNldCBmZCBbb3BlbiAifCBnaXQgZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSUocmVmbmFtZSkgJGNtZCIgcl0KCQl3aGlsZSB7W2dldHMgJGZkIG5hbWVdID4gMH0gewoJCQlyZWdzdWIgXnJlZnMvKGhlYWRzfHJlbW90ZXMpLyAkbmFtZSB7fSBuYW1lCgkJCWxhcHBlbmQgYWxsX3RyYWNraW5ncyAkbmFtZQoJCX0KCQljbG9zZSAkZmQKCX0KCglyZXR1cm4gW2xzb3J0IC11bmlxdWUgJGFsbF90cmFja2luZ3NdCn0KCnByb2MgZG9fY3JlYXRlX2JyYW5jaF9hY3Rpb24ge3d9IHsKCWdsb2JhbCBhbGxfaGVhZHMgbnVsbF9zaGExIHJlcG9fY29uZmlnCglnbG9iYWwgY3JlYXRlX2JyYW5jaF9jaGVja291dCBjcmVhdGVfYnJhbmNoX3JldnR5cGUKCWdsb2JhbCBjcmVhdGVfYnJhbmNoX2hlYWQgY3JlYXRlX2JyYW5jaF90cmFja2luZ2hlYWQKCWdsb2JhbCBjcmVhdGVfYnJhbmNoX25hbWUgY3JlYXRlX2JyYW5jaF9yZXZleHAKCglzZXQgbmV3YnJhbmNoICRjcmVhdGVfYnJhbmNoX25hbWUKCWlmIHskbmV3YnJhbmNoIGVxIHt9CgkJfHwgJG5ld2JyYW5jaCBlcSAkcmVwb19jb25maWcoZ3VpLm5ld2JyYW5jaHRlbXBsYXRlKX0gewoJCXRrX21lc3NhZ2VCb3ggXAoJCQktaWNvbiBlcnJvciBcCgkJCS10eXBlIG9rIFwKCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAoJCQktcGFyZW50ICR3IFwKCQkJLW1lc3NhZ2UgIlBsZWFzZSBzdXBwbHkgYSBicmFuY2ggbmFtZS4iCgkJZm9jdXMgJHcuZGVzYy5uYW1lX3QKCQlyZXR1cm4KCX0KCWlmIHshW2NhdGNoIHtleGVjIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLSAicmVmcy9oZWFkcy8kbmV3YnJhbmNoIn1dfSB7CgkJdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIGVycm9yIFwKCQkJLXR5cGUgb2sgXAoJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCgkJCS1wYXJlbnQgJHcgXAoJCQktbWVzc2FnZSAiQnJhbmNoICckbmV3YnJhbmNoJyBhbHJlYWR5IGV4aXN0cy4iCgkJZm9jdXMgJHcuZGVzYy5uYW1lX3QKCQlyZXR1cm4KCX0KCWlmIHtbY2F0Y2gge2V4ZWMgZ2l0IGNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyRuZXdicmFuY2gifV19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJXZSBkbyBub3QgbGlrZSAnJG5ld2JyYW5jaCcgYXMgYSBicmFuY2ggbmFtZS4iCgkJZm9jdXMgJHcuZGVzYy5uYW1lX3QKCQlyZXR1cm4KCX0KCglzZXQgcmV2IHt9Cglzd2l0Y2ggLS0gJGNyZWF0ZV9icmFuY2hfcmV2dHlwZSB7CgloZWFkIHtzZXQgcmV2ICRjcmVhdGVfYnJhbmNoX2hlYWR9Cgl0cmFja2luZyB7c2V0IHJldiAkY3JlYXRlX2JyYW5jaF90cmFja2luZ2hlYWR9CglleHByZXNzaW9uIHtzZXQgcmV2ICRjcmVhdGVfYnJhbmNoX3JldmV4cH0KCX0KCWlmIHtbY2F0Y2gge3NldCBjbXQgW2V4ZWMgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHtyZXZ9XjAiXX1dfSB7CgkJdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIGVycm9yIFwKCQkJLXR5cGUgb2sgXAoJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCgkJCS1wYXJlbnQgJHcgXAoJCQktbWVzc2FnZSAiSW52YWxpZCBzdGFydGluZyByZXZpc2lvbjogJHJldiIKCQlyZXR1cm4KCX0KCXNldCBjbWQgW2xpc3QgZ2l0IHVwZGF0ZS1yZWZdCglsYXBwZW5kIGNtZCAtbQoJbGFwcGVuZCBjbWQgImJyYW5jaDogQ3JlYXRlZCBmcm9tICRyZXYiCglsYXBwZW5kIGNtZCAicmVmcy9oZWFkcy8kbmV3YnJhbmNoIgoJbGFwcGVuZCBjbWQgJGNtdAoJbGFwcGVuZCBjbWQgJG51bGxfc2hhMQoJaWYge1tjYXRjaCB7ZXZhbCBleGVjICRjbWR9IGVycl19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJGYWlsZWQgdG8gY3JlYXRlICckbmV3YnJhbmNoJy5cblxuJGVyciIKCQlyZXR1cm4KCX0KCglsYXBwZW5kIGFsbF9oZWFkcyAkbmV3YnJhbmNoCglzZXQgYWxsX2hlYWRzIFtsc29ydCAkYWxsX2hlYWRzXQoJcG9wdWxhdGVfYnJhbmNoX21lbnUKCWRlc3Ryb3kgJHcKCWlmIHskY3JlYXRlX2JyYW5jaF9jaGVja291dH0gewoJCXN3aXRjaF9icmFuY2ggJG5ld2JyYW5jaAoJfQp9Cgpwcm9jIHJhZGlvX3NlbGVjdG9yIHt2YXJuYW1lIHZhbHVlIGFyZ3N9IHsKCXVwdmFyICMwICR2YXJuYW1lIHZhcgoJc2V0IHZhciAkdmFsdWUKfQoKdHJhY2UgYWRkIHZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfaGVhZCB3cml0ZSBcCglbbGlzdCByYWRpb19zZWxlY3RvciBjcmVhdGVfYnJhbmNoX3JldnR5cGUgaGVhZF0KdHJhY2UgYWRkIHZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSB0cmFja2luZ10KCnRyYWNlIGFkZCB2YXJpYWJsZSBkZWxldGVfYnJhbmNoX2hlYWQgd3JpdGUgXAoJW2xpc3QgcmFkaW9fc2VsZWN0b3IgZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgaGVhZF0KdHJhY2UgYWRkIHZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIHRyYWNraW5nXQoKcHJvYyBkb19jcmVhdGVfYnJhbmNoIHt9IHsKCWdsb2JhbCBhbGxfaGVhZHMgY3VycmVudF9icmFuY2ggcmVwb19jb25maWcKCWdsb2JhbCBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IGNyZWF0ZV9icmFuY2hfcmV2dHlwZQoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfaGVhZCBjcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfbmFtZSBjcmVhdGVfYnJhbmNoX3JldmV4cAoKCXNldCB3IC5icmFuY2hfZWRpdG9yCgl0b3BsZXZlbCAkdwoJd20gZ2VvbWV0cnkgJHcgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgoKCWxhYmVsICR3LmhlYWRlciAtdGV4dCB7Q3JlYXRlIE5ldyBCcmFuY2h9IFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy5jcmVhdGUgLXRleHQgQ3JlYXRlIFwKCQktZm9udCBmb250X3VpIFwKCQktZGVmYXVsdCBhY3RpdmUgXAoJCS1jb21tYW5kIFtsaXN0IGRvX2NyZWF0ZV9icmFuY2hfYWN0aW9uICR3XQoJcGFjayAkdy5idXR0b25zLmNyZWF0ZSAtc2lkZSByaWdodAoJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IHtDYW5jZWx9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQoJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CglwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKCglsYWJlbGZyYW1lICR3LmRlc2MgXAoJCS10ZXh0IHtCcmFuY2ggRGVzY3JpcHRpb259IFwKCQktZm9udCBmb250X3VpCglsYWJlbCAkdy5kZXNjLm5hbWVfbCAtdGV4dCB7TmFtZTp9IC1mb250IGZvbnRfdWkKCWVudHJ5ICR3LmRlc2MubmFtZV90IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzdW5rZW4gXAoJCS13aWR0aCA0MCBcCgkJLXRleHR2YXJpYWJsZSBjcmVhdGVfYnJhbmNoX25hbWUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS12YWxpZGF0ZSBrZXkgXAoJCS12YWxpZGF0ZWNvbW1hbmQgewoJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtbfl46PypcW1wwLSBdfSAlU119IHtyZXR1cm4gMH0KCQkJcmV0dXJuIDEKCQl9CglncmlkICR3LmRlc2MubmFtZV9sICR3LmRlc2MubmFtZV90IC1zdGlja3kgd2UgLXBhZHggezAgNX0KCWdyaWQgY29sdW1uY29uZmlndXJlICR3LmRlc2MgMSAtd2VpZ2h0IDEKCXBhY2sgJHcuZGVzYyAtYW5jaG9yIG53IC1maWxsIHggLXBhZHkgNSAtcGFkeCA1CgoJbGFiZWxmcmFtZSAkdy5mcm9tIFwKCQktdGV4dCB7U3RhcnRpbmcgUmV2aXNpb259IFwKCQktZm9udCBmb250X3VpCglyYWRpb2J1dHRvbiAkdy5mcm9tLmhlYWRfciBcCgkJLXRleHQge0xvY2FsIEJyYW5jaDp9IFwKCQktdmFsdWUgaGVhZCBcCgkJLXZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBcCgkJLWZvbnQgZm9udF91aQoJZXZhbCB0a19vcHRpb25NZW51ICR3LmZyb20uaGVhZF9tIGNyZWF0ZV9icmFuY2hfaGVhZCAkYWxsX2hlYWRzCglncmlkICR3LmZyb20uaGVhZF9yICR3LmZyb20uaGVhZF9tIC1zdGlja3kgdwoJc2V0IGFsbF90cmFja2luZ3MgW2FsbF90cmFja2luZ19icmFuY2hlc10KCWlmIHskYWxsX3RyYWNraW5ncyBuZSB7fX0gewoJCXNldCBjcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZCBbbGluZGV4ICRhbGxfdHJhY2tpbmdzIDBdCgkJcmFkaW9idXR0b24gJHcuZnJvbS50cmFja2luZ19yIFwKCQkJLXRleHQge1RyYWNraW5nIEJyYW5jaDp9IFwKCQkJLXZhbHVlIHRyYWNraW5nIFwKCQkJLXZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBcCgkJCS1mb250IGZvbnRfdWkKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZnJvbS50cmFja2luZ19tIFwKCQkJY3JlYXRlX2JyYW5jaF90cmFja2luZ2hlYWQgXAoJCQkkYWxsX3RyYWNraW5ncwoJCWdyaWQgJHcuZnJvbS50cmFja2luZ19yICR3LmZyb20udHJhY2tpbmdfbSAtc3RpY2t5IHcKCX0KCXJhZGlvYnV0dG9uICR3LmZyb20uZXhwX3IgXAoJCS10ZXh0IHtSZXZpc2lvbiBFeHByZXNzaW9uOn0gXAoJCS12YWx1ZSBleHByZXNzaW9uIFwKCQktdmFyaWFibGUgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIFwKCQktZm9udCBmb250X3VpCgllbnRyeSAkdy5mcm9tLmV4cF90IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzdW5rZW4gXAoJCS13aWR0aCA1MCBcCgkJLXRleHR2YXJpYWJsZSBjcmVhdGVfYnJhbmNoX3JldmV4cCBcCgkJLWZvbnQgZm9udF91aSBcCgkJLXZhbGlkYXRlIGtleSBcCgkJLXZhbGlkYXRlY29tbWFuZCB7CgkJCWlmIHslZCA9PSAxICYmIFtyZWdleHAge1xzfSAlU119IHtyZXR1cm4gMH0KCQkJaWYgeyVkID09IDEgJiYgW3N0cmluZyBsZW5ndGggJVNdID4gMH0gewoJCQkJc2V0IGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBleHByZXNzaW9uCgkJCX0KCQkJcmV0dXJuIDEKCQl9CglncmlkICR3LmZyb20uZXhwX3IgJHcuZnJvbS5leHBfdCAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5mcm9tIDEgLXdlaWdodCAxCglwYWNrICR3LmZyb20gLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQoKCWxhYmVsZnJhbWUgJHcucG9zdEFjdGlvbnMgXAoJCS10ZXh0IHtQb3N0IENyZWF0aW9uIEFjdGlvbnN9IFwKCQktZm9udCBmb250X3VpCgljaGVja2J1dHRvbiAkdy5wb3N0QWN0aW9ucy5jaGVja291dCBcCgkJLXRleHQge0NoZWNrb3V0IGFmdGVyIGNyZWF0aW9ufSBcCgkJLXZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfY2hlY2tvdXQgXAoJCS1mb250IGZvbnRfdWkKCXBhY2sgJHcucG9zdEFjdGlvbnMuY2hlY2tvdXQgLWFuY2hvciBudwoJcGFjayAkdy5wb3N0QWN0aW9ucyAtYW5jaG9yIG53IC1maWxsIHggLXBhZHkgNSAtcGFkeCA1CgoJc2V0IGNyZWF0ZV9icmFuY2hfY2hlY2tvdXQgMQoJc2V0IGNyZWF0ZV9icmFuY2hfaGVhZCAkY3VycmVudF9icmFuY2gKCXNldCBjcmVhdGVfYnJhbmNoX3JldnR5cGUgaGVhZAoJc2V0IGNyZWF0ZV9icmFuY2hfbmFtZSAkcmVwb19jb25maWcoZ3VpLm5ld2JyYW5jaHRlbXBsYXRlKQoJc2V0IGNyZWF0ZV9icmFuY2hfcmV2ZXhwIHt9CgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gIgoJCWdyYWIgJHcKCQkkdy5kZXNjLm5hbWVfdCBpY3Vyc29yIGVuZAoJCWZvY3VzICR3LmRlc2MubmFtZV90CgkiCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCWJpbmQgJHcgPEtleS1SZXR1cm4+ICJkb19jcmVhdGVfYnJhbmNoX2FjdGlvbiAkdzticmVhayIKCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBDcmVhdGUgQnJhbmNoIgoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIGRvX2RlbGV0ZV9icmFuY2hfYWN0aW9uIHt3fSB7CglnbG9iYWwgYWxsX2hlYWRzCglnbG9iYWwgZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgZGVsZXRlX2JyYW5jaF9oZWFkIGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkCgoJc2V0IGNoZWNrX3JldiB7fQoJc3dpdGNoIC0tICRkZWxldGVfYnJhbmNoX2NoZWNrdHlwZSB7CgloZWFkIHtzZXQgY2hlY2tfcmV2ICRkZWxldGVfYnJhbmNoX2hlYWR9Cgl0cmFja2luZyB7c2V0IGNoZWNrX3JldiAkZGVsZXRlX2JyYW5jaF90cmFja2luZ2hlYWR9CglhbHdheXMge3NldCBjaGVja19yZXYgezpub25lfX0KCX0KCWlmIHskY2hlY2tfcmV2IGVxIHs6bm9uZX19IHsKCQlzZXQgY2hlY2tfY210IHt9Cgl9IGVsc2VpZiB7W2NhdGNoIHtzZXQgY2hlY2tfY210IFtleGVjIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiR7Y2hlY2tfcmV2fV4wIl19XX0gewoJCXRrX21lc3NhZ2VCb3ggXAoJCQktaWNvbiBlcnJvciBcCgkJCS10eXBlIG9rIFwKCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAoJCQktcGFyZW50ICR3IFwKCQkJLW1lc3NhZ2UgIkludmFsaWQgY2hlY2sgcmV2aXNpb246ICRjaGVja19yZXYiCgkJcmV0dXJuCgl9CgoJc2V0IHRvX2RlbGV0ZSBbbGlzdF0KCXNldCBub3RfbWVyZ2VkIFtsaXN0XQoJZm9yZWFjaCBpIFskdy5saXN0LmwgY3Vyc2VsZWN0aW9uXSB7CgkJc2V0IGIgWyR3Lmxpc3QubCBnZXQgJGldCgkJaWYge1tjYXRjaCB7c2V0IG8gW2V4ZWMgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAkYl19XX0gY29udGludWUKCQlpZiB7JGNoZWNrX2NtdCBuZSB7fX0gewoJCQlpZiB7JGIgZXEgJGNoZWNrX3Jldn0gY29udGludWUKCQkJaWYge1tjYXRjaCB7c2V0IG0gW2V4ZWMgZ2l0IG1lcmdlLWJhc2UgJG8gJGNoZWNrX2NtdF19XX0gY29udGludWUKCQkJaWYgeyRvIG5lICRtfSB7CgkJCQlsYXBwZW5kIG5vdF9tZXJnZWQgJGIKCQkJCWNvbnRpbnVlCgkJCX0KCQl9CgkJbGFwcGVuZCB0b19kZWxldGUgW2xpc3QgJGIgJG9dCgl9CglpZiB7JG5vdF9tZXJnZWQgbmUge319IHsKCQlzZXQgbXNnICJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAkY2hlY2tfcmV2OgoKIC0gW2pvaW4gJG5vdF9tZXJnZWQgIlxuIC0gIl0iCgkJdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIGluZm8gXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICRtc2cKCX0KCWlmIHskdG9fZGVsZXRlIGVxIHt9fSByZXR1cm4KCWlmIHskZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgZXEge2Fsd2F5c319IHsKCQlzZXQgbXNnIHtSZWNvdmVyaW5nIGRlbGV0ZWQgYnJhbmNoZXMgaXMgZGlmZmljdWx0LgoKRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz99CgkJaWYge1t0a19tZXNzYWdlQm94IFwKCQkJLWljb24gd2FybmluZyBcCgkJCS10eXBlIHllc25vIFwKCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAoJCQktcGFyZW50ICR3IFwKCQkJLW1lc3NhZ2UgJG1zZ10gbmUgeWVzfSB7CgkJCXJldHVybgoJCX0KCX0KCglzZXQgZmFpbGVkIHt9Cglmb3JlYWNoIGkgJHRvX2RlbGV0ZSB7CgkJc2V0IGIgW2xpbmRleCAkaSAwXQoJCXNldCBvIFtsaW5kZXggJGkgMV0KCQlpZiB7W2NhdGNoIHtleGVjIGdpdCB1cGRhdGUtcmVmIC1kICJyZWZzL2hlYWRzLyRiIiAkb30gZXJyXX0gewoJCQlhcHBlbmQgZmFpbGVkICIgLSAkYjogJGVyclxuIgoJCX0gZWxzZSB7CgkJCXNldCB4IFtsc2VhcmNoIC1zb3J0ZWQgLWV4YWN0ICRhbGxfaGVhZHMgJGJdCgkJCWlmIHskeCA+PSAwfSB7CgkJCQlzZXQgYWxsX2hlYWRzIFtscmVwbGFjZSAkYWxsX2hlYWRzICR4ICR4XQoJCQl9CgkJfQoJfQoKCWlmIHskZmFpbGVkIG5lIHt9fSB7CgkJdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIGVycm9yIFwKCQkJLXR5cGUgb2sgXAoJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCgkJCS1wYXJlbnQgJHcgXAoJCQktbWVzc2FnZSAiRmFpbGVkIHRvIGRlbGV0ZSBicmFuY2hlczpcbiRmYWlsZWQiCgl9CgoJc2V0IGFsbF9oZWFkcyBbbHNvcnQgJGFsbF9oZWFkc10KCXBvcHVsYXRlX2JyYW5jaF9tZW51CglkZXN0cm95ICR3Cn0KCnByb2MgZG9fZGVsZXRlX2JyYW5jaCB7fSB7CglnbG9iYWwgYWxsX2hlYWRzIHRyYWNraW5nX2JyYW5jaGVzIGN1cnJlbnRfYnJhbmNoCglnbG9iYWwgZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgZGVsZXRlX2JyYW5jaF9oZWFkIGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkCgoJc2V0IHcgLmJyYW5jaF9lZGl0b3IKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtEZWxldGUgTG9jYWwgQnJhbmNofSBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcuYnV0dG9ucwoJYnV0dG9uICR3LmJ1dHRvbnMuY3JlYXRlIC10ZXh0IERlbGV0ZSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZG9fZGVsZXRlX2JyYW5jaF9hY3Rpb24gJHddCglwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CglidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQge0NhbmNlbH0gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWxhYmVsZnJhbWUgJHcubGlzdCBcCgkJLXRleHQge0xvY2FsIEJyYW5jaGVzfSBcCgkJLWZvbnQgZm9udF91aQoJbGlzdGJveCAkdy5saXN0LmwgXAoJCS1oZWlnaHQgMTAgXAoJCS13aWR0aCA3MCBcCgkJLXNlbGVjdG1vZGUgZXh0ZW5kZWQgXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5saXN0LnNieSBzZXRdIFwKCQktZm9udCBmb250X3VpCglmb3JlYWNoIGggJGFsbF9oZWFkcyB7CgkJaWYgeyRoIG5lICRjdXJyZW50X2JyYW5jaH0gewoJCQkkdy5saXN0LmwgaW5zZXJ0IGVuZCAkaAoJCX0KCX0KCXNjcm9sbGJhciAkdy5saXN0LnNieSAtY29tbWFuZCBbbGlzdCAkdy5saXN0LmwgeXZpZXddCglwYWNrICR3Lmxpc3Quc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHcubGlzdC5sIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKCXBhY2sgJHcubGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LnZhbGlkYXRlIFwKCQktdGV4dCB7RGVsZXRlIE9ubHkgSWZ9IFwKCQktZm9udCBmb250X3VpCglyYWRpb2J1dHRvbiAkdy52YWxpZGF0ZS5oZWFkX3IgXAoJCS10ZXh0IHtNZXJnZWQgSW50byBMb2NhbCBCcmFuY2g6fSBcCgkJLXZhbHVlIGhlYWQgXAoJCS12YXJpYWJsZSBkZWxldGVfYnJhbmNoX2NoZWNrdHlwZSBcCgkJLWZvbnQgZm9udF91aQoJZXZhbCB0a19vcHRpb25NZW51ICR3LnZhbGlkYXRlLmhlYWRfbSBkZWxldGVfYnJhbmNoX2hlYWQgJGFsbF9oZWFkcwoJZ3JpZCAkdy52YWxpZGF0ZS5oZWFkX3IgJHcudmFsaWRhdGUuaGVhZF9tIC1zdGlja3kgdwoJc2V0IGFsbF90cmFja2luZ3MgW2FsbF90cmFja2luZ19icmFuY2hlc10KCWlmIHskYWxsX3RyYWNraW5ncyBuZSB7fX0gewoJCXNldCBkZWxldGVfYnJhbmNoX3RyYWNraW5naGVhZCBbbGluZGV4ICRhbGxfdHJhY2tpbmdzIDBdCgkJcmFkaW9idXR0b24gJHcudmFsaWRhdGUudHJhY2tpbmdfciBcCgkJCS10ZXh0IHtNZXJnZWQgSW50byBUcmFja2luZyBCcmFuY2g6fSBcCgkJCS12YWx1ZSB0cmFja2luZyBcCgkJCS12YXJpYWJsZSBkZWxldGVfYnJhbmNoX2NoZWNrdHlwZSBcCgkJCS1mb250IGZvbnRfdWkKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcudmFsaWRhdGUudHJhY2tpbmdfbSBcCgkJCWRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIFwKCQkJJGFsbF90cmFja2luZ3MKCQlncmlkICR3LnZhbGlkYXRlLnRyYWNraW5nX3IgJHcudmFsaWRhdGUudHJhY2tpbmdfbSAtc3RpY2t5IHcKCX0KCXJhZGlvYnV0dG9uICR3LnZhbGlkYXRlLmFsd2F5c19yIFwKCQktdGV4dCB7QWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSBjaGVja3MpfSBcCgkJLXZhbHVlIGFsd2F5cyBcCgkJLXZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIFwKCQktZm9udCBmb250X3VpCglncmlkICR3LnZhbGlkYXRlLmFsd2F5c19yIC1jb2x1bW5zcGFuIDIgLXN0aWNreSB3CglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy52YWxpZGF0ZSAxIC13ZWlnaHQgMQoJcGFjayAkdy52YWxpZGF0ZSAtYW5jaG9yIG53IC1maWxsIHggLXBhZHkgNSAtcGFkeCA1CgoJc2V0IGRlbGV0ZV9icmFuY2hfaGVhZCAkY3VycmVudF9icmFuY2gKCXNldCBkZWxldGVfYnJhbmNoX2NoZWNrdHlwZSBoZWFkCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gImRlc3Ryb3kgJHciCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogRGVsZXRlIEJyYW5jaCIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBzd2l0Y2hfYnJhbmNoIHtuZXdfYnJhbmNofSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBjdXJyZW50X2JyYW5jaCByZXBvX2NvbmZpZwoKCWlmIHshW2xvY2tfaW5kZXggc3dpdGNoXX0gcmV0dXJuCgoJIyAtLSBPdXIgaW4gbWVtb3J5IHN0YXRlIHNob3VsZCBtYXRjaCB0aGUgcmVwb3NpdG9yeS4KCSMKCXJlcG9zaXRvcnlfc3RhdGUgY3VyVHlwZSBjdXJIRUFEIGN1ck1FUkdFX0hFQUQKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdCgkJJiYgJGN1clR5cGUgZXEge25vcm1hbH0KCQkmJiAkY3VySEVBRCBlcSAkSEVBRH0gewoJfSBlbHNlaWYgeyRjb21taXRfdHlwZSBuZSAkY3VyVHlwZSB8fCAkSEVBRCBuZSAkY3VySEVBRH0gewoJCWluZm9fcG9wdXAge0xhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLgoKQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5CnNpbmNlIHRoZSBsYXN0IHNjYW4uICBBIHJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZApiZWZvcmUgdGhlIGN1cnJlbnQgYnJhbmNoIGNhbiBiZSBjaGFuZ2VkLgoKVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuCn0KCQl1bmxvY2tfaW5kZXgKCQlyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19CgkJcmV0dXJuCgl9CgoJIyAtLSBEb24ndCBkbyBhIHBvaW50bGVzcyBzd2l0Y2guCgkjCglpZiB7JGN1cnJlbnRfYnJhbmNoIGVxICRuZXdfYnJhbmNofSB7CgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9CgoJaWYgeyRyZXBvX2NvbmZpZyhndWkudHJ1c3RtdGltZSkgZXEge3RydWV9fSB7CgkJc3dpdGNoX2JyYW5jaF9zdGFnZTIge30gJG5ld19icmFuY2gKCX0gZWxzZSB7CgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVmcmVzaGluZyBmaWxlIHN0YXR1cy4uLn0KCQlzZXQgY21kIFtsaXN0IGdpdCB1cGRhdGUtaW5kZXhdCgkJbGFwcGVuZCBjbWQgLXEKCQlsYXBwZW5kIGNtZCAtLXVubWVyZ2VkCgkJbGFwcGVuZCBjbWQgLS1pZ25vcmUtbWlzc2luZwoJCWxhcHBlbmQgY21kIC0tcmVmcmVzaAoJCXNldCBmZF9yZiBbb3BlbiAifCAkY21kIiByXQoJCWZjb25maWd1cmUgJGZkX3JmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQlmaWxlZXZlbnQgJGZkX3JmIHJlYWRhYmxlIFwKCQkJW2xpc3Qgc3dpdGNoX2JyYW5jaF9zdGFnZTIgJGZkX3JmICRuZXdfYnJhbmNoXQoJfQp9Cgpwcm9jIHN3aXRjaF9icmFuY2hfc3RhZ2UyIHtmZF9yZiBuZXdfYnJhbmNofSB7CglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlIEhFQUQKCglpZiB7JGZkX3JmIG5lIHt9fSB7CgkJcmVhZCAkZmRfcmYKCQlpZiB7IVtlb2YgJGZkX3JmXX0gcmV0dXJuCgkJY2xvc2UgJGZkX3JmCgl9CgoJc2V0IHVpX3N0YXR1c192YWx1ZSAiVXBkYXRpbmcgd29ya2luZyBkaXJlY3RvcnkgdG8gJyRuZXdfYnJhbmNoJy4uLiIKCXNldCBjbWQgW2xpc3QgZ2l0IHJlYWQtdHJlZV0KCWxhcHBlbmQgY21kIC1tCglsYXBwZW5kIGNtZCAtdQoJbGFwcGVuZCBjbWQgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZQoJbGFwcGVuZCBjbWQgJEhFQUQKCWxhcHBlbmQgY21kICRuZXdfYnJhbmNoCglzZXQgZmRfcnQgW29wZW4gInwgJGNtZCIgcl0KCWZjb25maWd1cmUgJGZkX3J0IC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmRfcnQgcmVhZGFibGUgXAoJCVtsaXN0IHN3aXRjaF9icmFuY2hfcmVhZHRyZWVfd2FpdCAkZmRfcnQgJG5ld19icmFuY2hdCn0KCnByb2Mgc3dpdGNoX2JyYW5jaF9yZWFkdHJlZV93YWl0IHtmZF9ydCBuZXdfYnJhbmNofSB7CglnbG9iYWwgc2VsZWN0ZWRfY29tbWl0X3R5cGUgY29tbWl0X3R5cGUgSEVBRCBNRVJHRV9IRUFEIFBBUkVOVAoJZ2xvYmFsIGN1cnJlbnRfYnJhbmNoCglnbG9iYWwgdWlfY29tbSB1aV9zdGF0dXNfdmFsdWUKCgkjIC0tIFdlIG5ldmVyIGdldCBpbnRlcmVzdGluZyBvdXRwdXQgb24gc3Rkb3V0OyBvbmx5IHN0ZGVyci4KCSMKCXJlYWQgJGZkX3J0CglmY29uZmlndXJlICRmZF9ydCAtYmxvY2tpbmcgMQoJaWYgeyFbZW9mICRmZF9ydF19IHsKCQlmY29uZmlndXJlICRmZF9ydCAtYmxvY2tpbmcgMAoJCXJldHVybgoJfQoKCSMgLS0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdhc24ndCBpbiBzeW5jIHdpdGggdGhlIGluZGV4IGFuZAoJIyAgICB3ZSdkIGhhdmUgdG8gb3ZlcndyaXRlIHNvbWV0aGluZyB0byBtYWtlIHRoZSBzd2l0Y2guIEEKCSMgICAgbWVyZ2UgaXMgcmVxdWlyZWQuCgkjCglpZiB7W2NhdGNoIHtjbG9zZSAkZmRfcnR9IGVycl19IHsKCQlyZWdzdWIge15mYXRhbDogfSAkZXJyIHt9IGVycgoJCXdhcm5fcG9wdXAgIkZpbGUgbGV2ZWwgbWVyZ2UgcmVxdWlyZWQuCgokZXJyCgpTdGF5aW5nIG9uIGJyYW5jaCAnJGN1cnJlbnRfYnJhbmNoJy4iCgkJc2V0IHVpX3N0YXR1c192YWx1ZSAiQWJvcnRlZCBjaGVja291dCBvZiAnJG5ld19icmFuY2gnIChmaWxlIGxldmVsIG1lcmdpbmcgaXMgcmVxdWlyZWQpLiIKCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCgkjIC0tIFVwZGF0ZSB0aGUgc3ltYm9saWMgcmVmLiAgQ29yZSBnaXQgZG9lc24ndCBldmVuIGNoZWNrIGZvciBmYWlsdXJlCgkjICAgIGhlcmUsIGl0IEp1c3QgV29ya3ModG0pLiAgSWYgaXQgZG9lc24ndCB3ZSBhcmUgaW4gc29tZSByZWFsbHkgdWdseQoJIyAgICBzdGF0ZSB0aGF0IGlzIGRpZmZpY3VsdCB0byByZWNvdmVyIGZyb20gd2l0aGluIGdpdC1ndWkuCgkjCglpZiB7W2NhdGNoIHtleGVjIGdpdCBzeW1ib2xpYy1yZWYgSEVBRCAicmVmcy9oZWFkcy8kbmV3X2JyYW5jaCJ9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IGJyYW5jaC4KClRoaXMgd29ya2luZyBkaXJlY3RvcnkgaXMgb25seSBwYXJ0aWFsbHkgc3dpdGNoZWQuCldlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHlvdXIgZmlsZXMsIGJ1dCBmYWlsZWQgdG8KdXBkYXRlIGFuIGludGVybmFsIEdpdCBmaWxlLgoKVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuICBbYXBwbmFtZV0gd2lsbCBub3cKY2xvc2UgYW5kIGdpdmUgdXAuCgokZXJyIgoJCWRvX3F1aXQKCQlyZXR1cm4KCX0KCgkjIC0tIFVwZGF0ZSBvdXIgcmVwb3NpdG9yeSBzdGF0ZS4gIElmIHdlIHdlcmUgcHJldmlvdXNseSBpbiBhbWVuZCBtb2RlCgkjICAgIHdlIG5lZWQgdG8gdG9zcyB0aGUgY3VycmVudCBidWZmZXIgYW5kIGRvIGEgZnVsbCByZXNjYW4gdG8gdXBkYXRlCgkjICAgIG91ciBmaWxlIGxpc3RzLiAgSWYgd2Ugd2VyZW4ndCBpbiBhbWVuZCBtb2RlIG91ciBmaWxlIGxpc3RzIGFyZQoJIyAgICBhY2N1cmF0ZSBhbmQgd2UgY2FuIGF2b2lkIHRoZSByZXNjYW4uCgkjCgl1bmxvY2tfaW5kZXgKCXNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJJHVpX2NvbW0gZGVsZXRlIDAuMCBlbmQKCQkkdWlfY29tbSBlZGl0IHJlc2V0CgkJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSAiQ2hlY2tlZCBvdXQgYnJhbmNoICckY3VycmVudF9icmFuY2gnLiJ9Cgl9IGVsc2UgewoJCXJlcG9zaXRvcnlfc3RhdGUgY29tbWl0X3R5cGUgSEVBRCBNRVJHRV9IRUFECgkJc2V0IFBBUkVOVCAkSEVBRAoJCXNldCB1aV9zdGF0dXNfdmFsdWUgIkNoZWNrZWQgb3V0IGJyYW5jaCAnJGN1cnJlbnRfYnJhbmNoJy4iCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgcmVtb3RlIG1hbmFnZW1lbnQKCnByb2MgbG9hZF9hbGxfcmVtb3RlcyB7fSB7CglnbG9iYWwgcmVwb19jb25maWcKCWdsb2JhbCBhbGxfcmVtb3RlcyB0cmFja2luZ19icmFuY2hlcwoKCXNldCBhbGxfcmVtb3RlcyBbbGlzdF0KCWFycmF5IHVuc2V0IHRyYWNraW5nX2JyYW5jaGVzCgoJc2V0IHJtX2RpciBbZ2l0ZGlyIHJlbW90ZXNdCglpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJHJtX2Rpcl19IHsKCQlzZXQgYWxsX3JlbW90ZXMgW2dsb2IgXAoJCQktdHlwZXMgZiBcCgkJCS10YWlscyBcCgkJCS1ub2NvbXBsYWluIFwKCQkJLWRpcmVjdG9yeSAkcm1fZGlyICpdCgoJCWZvcmVhY2ggbmFtZSAkYWxsX3JlbW90ZXMgewoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gW2ZpbGUgam9pbiAkcm1fZGlyICRuYW1lXSByXQoJCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJCQkJaWYgeyFbcmVnZXhwIHteUHVsbDpbIAldKihbXjpdKyk6KC4rKSR9IFwKCQkJCQkJJGxpbmUgbGluZSBzcmMgZHN0XX0gY29udGludWUKCQkJCQlpZiB7IVtyZWdleHAgXnJlZnMvICRkc3RdfSB7CgkJCQkJCXNldCBkc3QgInJlZnMvaGVhZHMvJGRzdCIKCQkJCQl9CgkJCQkJc2V0IHRyYWNraW5nX2JyYW5jaGVzKCRkc3QpIFtsaXN0ICRuYW1lICRzcmNdCgkJCQl9CgkJCQljbG9zZSAkZmQKCQkJfQoJCX0KCX0KCglmb3JlYWNoIGxpbmUgW2FycmF5IG5hbWVzIHJlcG9fY29uZmlnIHJlbW90ZS4qLnVybF0gewoJCWlmIHshW3JlZ2V4cCBecmVtb3RlXC4oLiopXC51cmxcJCAkbGluZSBsaW5lIG5hbWVdfSBjb250aW51ZQoJCWxhcHBlbmQgYWxsX3JlbW90ZXMgJG5hbWUKCgkJaWYge1tjYXRjaCB7c2V0IGZsICRyZXBvX2NvbmZpZyhyZW1vdGUuJG5hbWUuZmV0Y2gpfV19IHsKCQkJc2V0IGZsIHt9CgkJfQoJCWZvcmVhY2ggbGluZSAkZmwgewoJCQlpZiB7IVtyZWdleHAge14oW146XSspOiguKykkfSAkbGluZSBsaW5lIHNyYyBkc3RdfSBjb250aW51ZQoJCQlpZiB7IVtyZWdleHAgXnJlZnMvICRkc3RdfSB7CgkJCQlzZXQgZHN0ICJyZWZzL2hlYWRzLyRkc3QiCgkJCX0KCQkJc2V0IHRyYWNraW5nX2JyYW5jaGVzKCRkc3QpIFtsaXN0ICRuYW1lICRzcmNdCgkJfQoJfQoKCXNldCBhbGxfcmVtb3RlcyBbbHNvcnQgLXVuaXF1ZSAkYWxsX3JlbW90ZXNdCn0KCnByb2MgcG9wdWxhdGVfZmV0Y2hfbWVudSB7fSB7CglnbG9iYWwgYWxsX3JlbW90ZXMgcmVwb19jb25maWcKCglzZXQgbSAubWJhci5mZXRjaAoJZm9yZWFjaCByICRhbGxfcmVtb3RlcyB7CgkJc2V0IGVuYWJsZSAwCgkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIudXJsKX1dfSB7CgkJCWlmIHshW2NhdGNoIHtzZXQgYSAkcmVwb19jb25maWcocmVtb3RlLiRyLmZldGNoKX1dfSB7CgkJCQlzZXQgZW5hYmxlIDEKCQkJfQoJCX0gZWxzZSB7CgkJCWNhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiBbZ2l0ZGlyIHJlbW90ZXMgJHJdIHJdCgkJCQl3aGlsZSB7W2dldHMgJGZkIG5dID49IDB9IHsKCQkJCQlpZiB7W3JlZ2V4cCB7XlB1bGw6WyBcdF0qKFteOl0rKTp9ICRuXX0gewoJCQkJCQlzZXQgZW5hYmxlIDEKCQkJCQkJYnJlYWsKCQkJCQl9CgkJCQl9CgkJCQljbG9zZSAkZmQKCQkJfQoJCX0KCgkJaWYgeyRlbmFibGV9IHsKCQkJJG0gYWRkIGNvbW1hbmQgXAoJCQkJLWxhYmVsICJGZXRjaCBmcm9tICRyLi4uIiBcCgkJCQktY29tbWFuZCBbbGlzdCBmZXRjaF9mcm9tICRyXSBcCgkJCQktZm9udCBmb250X3VpCgkJfQoJfQp9Cgpwcm9jIHBvcHVsYXRlX3B1c2hfbWVudSB7fSB7CglnbG9iYWwgYWxsX3JlbW90ZXMgcmVwb19jb25maWcKCglzZXQgbSAubWJhci5wdXNoCglzZXQgZmFzdF9jb3VudCAwCglmb3JlYWNoIHIgJGFsbF9yZW1vdGVzIHsKCQlzZXQgZW5hYmxlIDAKCQlpZiB7IVtjYXRjaCB7c2V0IGEgJHJlcG9fY29uZmlnKHJlbW90ZS4kci51cmwpfV19IHsKCQkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIucHVzaCl9XX0gewoJCQkJc2V0IGVuYWJsZSAxCgkJCX0KCQl9IGVsc2UgewoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gW2dpdGRpciByZW1vdGVzICRyXSByXQoJCQkJd2hpbGUge1tnZXRzICRmZCBuXSA+PSAwfSB7CgkJCQkJaWYge1tyZWdleHAge15QdXNoOlsgXHRdKihbXjpdKyk6fSAkbl19IHsKCQkJCQkJc2V0IGVuYWJsZSAxCgkJCQkJCWJyZWFrCgkJCQkJfQoJCQkJfQoJCQkJY2xvc2UgJGZkCgkJCX0KCQl9CgoJCWlmIHskZW5hYmxlfSB7CgkJCWlmIHshJGZhc3RfY291bnR9IHsKCQkJCSRtIGFkZCBzZXBhcmF0b3IKCQkJfQoJCQkkbSBhZGQgY29tbWFuZCBcCgkJCQktbGFiZWwgIlB1c2ggdG8gJHIuLi4iIFwKCQkJCS1jb21tYW5kIFtsaXN0IHB1c2hfdG8gJHJdIFwKCQkJCS1mb250IGZvbnRfdWkKCQkJaW5jciBmYXN0X2NvdW50CgkJfQoJfQp9Cgpwcm9jIHN0YXJ0X3B1c2hfYW55d2hlcmVfYWN0aW9uIHt3fSB7CglnbG9iYWwgcHVzaF91cmx0eXBlIHB1c2hfcmVtb3RlIHB1c2hfdXJsIHB1c2hfdGhpbiBwdXNoX3RhZ3MKCglzZXQgcl91cmwge30KCXN3aXRjaCAtLSAkcHVzaF91cmx0eXBlIHsKCXJlbW90ZSB7c2V0IHJfdXJsICRwdXNoX3JlbW90ZX0KCXVybCB7c2V0IHJfdXJsICRwdXNoX3VybH0KCX0KCWlmIHskcl91cmwgZXEge319IHJldHVybgoKCXNldCBjbWQgW2xpc3QgZ2l0IHB1c2hdCglsYXBwZW5kIGNtZCAtdgoJaWYgeyRwdXNoX3RoaW59IHsKCQlsYXBwZW5kIGNtZCAtLXRoaW4KCX0KCWlmIHskcHVzaF90YWdzfSB7CgkJbGFwcGVuZCBjbWQgLS10YWdzCgl9CglsYXBwZW5kIGNtZCAkcl91cmwKCXNldCBjbnQgMAoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcuc291cmNlLmwgZ2V0ICRpXQoJCWxhcHBlbmQgY21kICJyZWZzL2hlYWRzLyRiOnJlZnMvaGVhZHMvJGIiCgkJaW5jciBjbnQKCX0KCWlmIHskY250ID09IDB9IHsKCQlyZXR1cm4KCX0gZWxzZWlmIHskY250ID09IDF9IHsKCQlzZXQgdW5pdCBicmFuY2gKCX0gZWxzZSB7CgkJc2V0IHVuaXQgYnJhbmNoZXMKCX0KCglzZXQgY29ucyBbbmV3X2NvbnNvbGUgInB1c2ggJHJfdXJsIiAiUHVzaGluZyAkY250ICR1bml0IHRvICRyX3VybCJdCgljb25zb2xlX2V4ZWMgJGNvbnMgJGNtZCBjb25zb2xlX2RvbmUKCWRlc3Ryb3kgJHcKfQoKdHJhY2UgYWRkIHZhcmlhYmxlIHB1c2hfcmVtb3RlIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIHB1c2hfdXJsdHlwZSByZW1vdGVdCgpwcm9jIGRvX3B1c2hfYW55d2hlcmUge30gewoJZ2xvYmFsIGFsbF9oZWFkcyBhbGxfcmVtb3RlcyBjdXJyZW50X2JyYW5jaAoJZ2xvYmFsIHB1c2hfdXJsdHlwZSBwdXNoX3JlbW90ZSBwdXNoX3VybCBwdXNoX3RoaW4gcHVzaF90YWdzCgoJc2V0IHcgLnB1c2hfc2V0dXAKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtQdXNoIEJyYW5jaGVzfSAtZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy5jcmVhdGUgLXRleHQgUHVzaCBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3Qgc3RhcnRfcHVzaF9hbnl3aGVyZV9hY3Rpb24gJHddCglwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CglidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQge0NhbmNlbH0gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWxhYmVsZnJhbWUgJHcuc291cmNlIFwKCQktdGV4dCB7U291cmNlIEJyYW5jaGVzfSBcCgkJLWZvbnQgZm9udF91aQoJbGlzdGJveCAkdy5zb3VyY2UubCBcCgkJLWhlaWdodCAxMCBcCgkJLXdpZHRoIDcwIFwKCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3LnNvdXJjZS5zYnkgc2V0XSBcCgkJLWZvbnQgZm9udF91aQoJZm9yZWFjaCBoICRhbGxfaGVhZHMgewoJCSR3LnNvdXJjZS5sIGluc2VydCBlbmQgJGgKCQlpZiB7JGggZXEgJGN1cnJlbnRfYnJhbmNofSB7CgkJCSR3LnNvdXJjZS5sIHNlbGVjdCBzZXQgZW5kCgkJfQoJfQoJc2Nyb2xsYmFyICR3LnNvdXJjZS5zYnkgLWNvbW1hbmQgW2xpc3QgJHcuc291cmNlLmwgeXZpZXddCglwYWNrICR3LnNvdXJjZS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5zb3VyY2UubCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCglwYWNrICR3LnNvdXJjZSAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LmRlc3QgXAoJCS10ZXh0IHtEZXN0aW5hdGlvbiBSZXBvc2l0b3J5fSBcCgkJLWZvbnQgZm9udF91aQoJaWYgeyRhbGxfcmVtb3RlcyBuZSB7fX0gewoJCXJhZGlvYnV0dG9uICR3LmRlc3QucmVtb3RlX3IgXAoJCQktdGV4dCB7UmVtb3RlOn0gXAoJCQktdmFsdWUgcmVtb3RlIFwKCQkJLXZhcmlhYmxlIHB1c2hfdXJsdHlwZSBcCgkJCS1mb250IGZvbnRfdWkKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZGVzdC5yZW1vdGVfbSBwdXNoX3JlbW90ZSAkYWxsX3JlbW90ZXMKCQlncmlkICR3LmRlc3QucmVtb3RlX3IgJHcuZGVzdC5yZW1vdGVfbSAtc3RpY2t5IHcKCQlpZiB7W2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGFsbF9yZW1vdGVzIG9yaWdpbl0gIT0gLTF9IHsKCQkJc2V0IHB1c2hfcmVtb3RlIG9yaWdpbgoJCX0gZWxzZSB7CgkJCXNldCBwdXNoX3JlbW90ZSBbbGluZGV4ICRhbGxfcmVtb3RlcyAwXQoJCX0KCQlzZXQgcHVzaF91cmx0eXBlIHJlbW90ZQoJfSBlbHNlIHsKCQlzZXQgcHVzaF91cmx0eXBlIHVybAoJfQoJcmFkaW9idXR0b24gJHcuZGVzdC51cmxfciBcCgkJLXRleHQge0FyYml0cmFyeSBVUkw6fSBcCgkJLXZhbHVlIHVybCBcCgkJLXZhcmlhYmxlIHB1c2hfdXJsdHlwZSBcCgkJLWZvbnQgZm9udF91aQoJZW50cnkgJHcuZGVzdC51cmxfdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggNTAgXAoJCS10ZXh0dmFyaWFibGUgcHVzaF91cmwgXAoJCS1mb250IGZvbnRfdWkgXAoJCS12YWxpZGF0ZSBrZXkgXAoJCS12YWxpZGF0ZWNvbW1hbmQgewoJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtcc30gJVNdfSB7cmV0dXJuIDB9CgkJCWlmIHslZCA9PSAxICYmIFtzdHJpbmcgbGVuZ3RoICVTXSA+IDB9IHsKCQkJCXNldCBwdXNoX3VybHR5cGUgdXJsCgkJCX0KCQkJcmV0dXJuIDEKCQl9CglncmlkICR3LmRlc3QudXJsX3IgJHcuZGVzdC51cmxfdCAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5kZXN0IDEgLXdlaWdodCAxCglwYWNrICR3LmRlc3QgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQoKCWxhYmVsZnJhbWUgJHcub3B0aW9ucyBcCgkJLXRleHQge1RyYW5zZmVyIE9wdGlvbnN9IFwKCQktZm9udCBmb250X3VpCgljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRoaW4gXAoJCS10ZXh0IHtVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKX0gXAoJCS12YXJpYWJsZSBwdXNoX3RoaW4gXAoJCS1mb250IGZvbnRfdWkKCWdyaWQgJHcub3B0aW9ucy50aGluIC1jb2x1bW5zcGFuIDIgLXN0aWNreSB3CgljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRhZ3MgXAoJCS10ZXh0IHtJbmNsdWRlIHRhZ3N9IFwKCQktdmFyaWFibGUgcHVzaF90YWdzIFwKCQktZm9udCBmb250X3VpCglncmlkICR3Lm9wdGlvbnMudGFncyAtY29sdW1uc3BhbiAyIC1zdGlja3kgdwoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcub3B0aW9ucyAxIC13ZWlnaHQgMQoJcGFjayAkdy5vcHRpb25zIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglzZXQgcHVzaF91cmwge30KCXNldCBwdXNoX3RoaW4gMAoJc2V0IHB1c2hfdGFncyAwCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBQdXNoIgoJdGt3YWl0IHdpbmRvdyAkdwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIG1lcmdlCgpwcm9jIGNhbl9tZXJnZSB7fSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBmaWxlX3N0YXRlcwoKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJaW5mb19wb3B1cCB7Q2Fubm90IG1lcmdlIHdoaWxlIGFtZW5kaW5nLgoKWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0IGJlZm9yZQpzdGFydGluZyBhbnkgdHlwZSBvZiBtZXJnZS4KfQoJCXJldHVybiAwCgl9CgoJaWYge1tjb21taXR0ZXJfaWRlbnRdIGVxIHt9fSB7cmV0dXJuIDB9CglpZiB7IVtsb2NrX2luZGV4IG1lcmdlXX0ge3JldHVybiAwfQoKCSMgLS0gT3VyIGluIG1lbW9yeSBzdGF0ZSBzaG91bGQgbWF0Y2ggdGhlIHJlcG9zaXRvcnkuCgkjCglyZXBvc2l0b3J5X3N0YXRlIGN1clR5cGUgY3VySEVBRCBjdXJNRVJHRV9IRUFECglpZiB7JGNvbW1pdF90eXBlIG5lICRjdXJUeXBlIHx8ICRIRUFEIG5lICRjdXJIRUFEfSB7CgkJaW5mb19wb3B1cCB7TGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuCgpBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkKc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkCmJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuCgpUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy4KfQoJCXVubG9ja19pbmRleAoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KCQlyZXR1cm4gMAoJfQoKCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlfTyB7CgkJCWNvbnRpbnVlOyAjIGFuZCBwcmF5IGl0IHdvcmtzIQoJCX0KCQlVPyB7CgkJCWVycm9yX3BvcHVwICJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLgoKRmlsZSBbc2hvcnRfcGF0aCAkcGF0aF0gaGFzIG1lcmdlIGNvbmZsaWN0cy4KCllvdSBtdXN0IHJlc29sdmUgdGhlbSwgYWRkIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvCmNvbXBsZXRlIHRoZSBjdXJyZW50IG1lcmdlLiAgT25seSB0aGVuIGNhbiB5b3UKYmVnaW4gYW5vdGhlciBtZXJnZS4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuIDAKCQl9CgkJPz8gewoJCQllcnJvcl9wb3B1cCAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhbmdlLgoKRmlsZSBbc2hvcnRfcGF0aCAkcGF0aF0gaXMgbW9kaWZpZWQuCgpZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUKc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvIHdpbGwgaGVscCB5b3UgYWJvcnQKYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuIDAKCQl9CgkJfQoJfQoKCXJldHVybiAxCn0KCnByb2MgdmlzdWFsaXplX2xvY2FsX21lcmdlIHt3fSB7CglzZXQgcmV2cyB7fQoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlsYXBwZW5kIHJldnMgWyR3LnNvdXJjZS5sIGdldCAkaV0KCX0KCWlmIHskcmV2cyBlcSB7fX0gcmV0dXJuCglsYXBwZW5kIHJldnMgLS1ub3QgSEVBRAoJZG9fZ2l0ayAkcmV2cwp9Cgpwcm9jIHN0YXJ0X2xvY2FsX21lcmdlX2FjdGlvbiB7d30gewoJZ2xvYmFsIEhFQUQgdWlfc3RhdHVzX3ZhbHVlIGN1cnJlbnRfYnJhbmNoCgoJc2V0IGNtZCBbbGlzdCBnaXQgbWVyZ2VdCglzZXQgbmFtZXMge30KCXNldCByZXZjbnQgMAoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcuc291cmNlLmwgZ2V0ICRpXQoJCWxhcHBlbmQgY21kICRiCgkJbGFwcGVuZCBuYW1lcyAkYgoJCWluY3IgcmV2Y250Cgl9CgoJaWYgeyRyZXZjbnQgPT0gMH0gewoJCXJldHVybgoJfSBlbHNlaWYgeyRyZXZjbnQgPT0gMX0gewoJCXNldCB1bml0IGJyYW5jaAoJfSBlbHNlaWYgeyRyZXZjbnQgPD0gMTV9IHsKCQlzZXQgdW5pdCBicmFuY2hlcwoJfSBlbHNlIHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJUb28gbWFueSBicmFuY2hlcyBzZWxlY3RlZC4KCllvdSBoYXZlIHJlcXVlc3RlZCB0byBtZXJnZSAkcmV2Y250IGJyYW5jaGVzCmluIGFuIG9jdG9wdXMgbWVyZ2UuICBUaGlzIGV4Y2VlZHMgR2l0J3MKaW50ZXJuYWwgbGltaXQgb2YgMTUgYnJhbmNoZXMgcGVyIG1lcmdlLgoKUGxlYXNlIHNlbGVjdCBmZXdlciBicmFuY2hlcy4gIFRvIG1lcmdlIG1vcmUKdGhhbiAxNSBicmFuY2hlcywgbWVyZ2UgdGhlIGJyYW5jaGVzIGluIGJhdGNoZXMuCiIKCQlyZXR1cm4KCX0KCglzZXQgbXNnICJNZXJnaW5nICRjdXJyZW50X2JyYW5jaCwgW2pvaW4gJG5hbWVzIHssIH1dIgoJc2V0IHVpX3N0YXR1c192YWx1ZSAiJG1zZy4uLiIKCXNldCBjb25zIFtuZXdfY29uc29sZSAiTWVyZ2UiICRtc2ddCgljb25zb2xlX2V4ZWMgJGNvbnMgJGNtZCBbbGlzdCBmaW5pc2hfbWVyZ2UgJHJldmNudF0KCWJpbmQgJHcgPERlc3Ryb3k+IHt9CglkZXN0cm95ICR3Cn0KCnByb2MgZmluaXNoX21lcmdlIHtyZXZjbnQgdyBva30gewoJY29uc29sZV9kb25lICR3ICRvawoJaWYgeyRva30gewoJCXNldCBtc2cge01lcmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkufQoJfSBlbHNlIHsKCQlpZiB7JHJldmNudCAhPSAxfSB7CgkJCWluZm9fcG9wdXAgIk9jdG9wdXMgbWVyZ2UgZmFpbGVkLgoKWW91ciBtZXJnZSBvZiAkcmV2Y250IGJyYW5jaGVzIGhhcyBmYWlsZWQuCgpUaGVyZSBhcmUgZmlsZS1sZXZlbCBjb25mbGljdHMgYmV0d2VlbiB0aGUKYnJhbmNoZXMgd2hpY2ggbXVzdCBiZSByZXNvbHZlZCBtYW51YWxseS4KClRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aWxsIG5vdyBiZSByZXNldC4KCllvdSBjYW4gYXR0ZW1wdCB0aGlzIG1lcmdlIGFnYWluCmJ5IG1lcmdpbmcgb25seSBvbmUgYnJhbmNoIGF0IGEgdGltZS4iICR3CgoJCQlzZXQgZmQgW29wZW4gInwgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQiIHJdCgkJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZXNldF9oYXJkX3dhaXQgJGZkXQoJCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtBYm9ydGluZy4uLiBwbGVhc2Ugd2FpdC4uLn0KCQkJcmV0dXJuCgkJfQoKCQlzZXQgbXNnIHtNZXJnZSBmYWlsZWQuICBDb25mbGljdCByZXNvbHV0aW9uIGlzIHJlcXVpcmVkLn0KCX0KCXVubG9ja19pbmRleAoJcmVzY2FuIFtsaXN0IHNldCB1aV9zdGF0dXNfdmFsdWUgJG1zZ10KfQoKcHJvYyBkb19sb2NhbF9tZXJnZSB7fSB7CglnbG9iYWwgY3VycmVudF9icmFuY2gKCglpZiB7IVtjYW5fbWVyZ2VdfSByZXR1cm4KCglzZXQgdyAubWVyZ2Vfc2V0dXAKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIFwKCQktdGV4dCAiTWVyZ2UgSW50byAkY3VycmVudF9icmFuY2giIFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy52aXN1YWxpemUgLXRleHQgVmlzdWFsaXplIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCB2aXN1YWxpemVfbG9jYWxfbWVyZ2UgJHddCglwYWNrICR3LmJ1dHRvbnMudmlzdWFsaXplIC1zaWRlIGxlZnQKCWJ1dHRvbiAkdy5idXR0b25zLmNyZWF0ZSAtdGV4dCBNZXJnZSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3Qgc3RhcnRfbG9jYWxfbWVyZ2VfYWN0aW9uICR3XQoJcGFjayAkdy5idXR0b25zLmNyZWF0ZSAtc2lkZSByaWdodAoJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IHtDYW5jZWx9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQoJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CglwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKCglsYWJlbGZyYW1lICR3LnNvdXJjZSBcCgkJLXRleHQge1NvdXJjZSBCcmFuY2hlc30gXAoJCS1mb250IGZvbnRfdWkKCWxpc3Rib3ggJHcuc291cmNlLmwgXAoJCS1oZWlnaHQgMTAgXAoJCS13aWR0aCA3MCBcCgkJLXNlbGVjdG1vZGUgZXh0ZW5kZWQgXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5zb3VyY2Uuc2J5IHNldF0gXAoJCS1mb250IGZvbnRfdWkKCXNjcm9sbGJhciAkdy5zb3VyY2Uuc2J5IC1jb21tYW5kIFtsaXN0ICR3LnNvdXJjZS5sIHl2aWV3XQoJcGFjayAkdy5zb3VyY2Uuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHcuc291cmNlLmwgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5zb3VyY2UgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CgoJc2V0IGNtZCBbbGlzdCBnaXQgZm9yLWVhY2gtcmVmXQoJbGFwcGVuZCBjbWQgey0tZm9ybWF0PSUob2JqZWN0bmFtZSkgJShyZWZuYW1lKX0KCWxhcHBlbmQgY21kIHJlZnMvaGVhZHMKCWxhcHBlbmQgY21kIHJlZnMvcmVtb3RlcwoJc2V0IGZyX2ZkIFtvcGVuICJ8ICRjbWQiIHJdCglmY29uZmlndXJlICRmcl9mZCAtdHJhbnNsYXRpb24gYmluYXJ5Cgl3aGlsZSB7W2dldHMgJGZyX2ZkIGxpbmVdID4gMH0gewoJCXNldCBsaW5lIFtzcGxpdCAkbGluZSB7IH1dCgkJc2V0IHNoYTEoW2xpbmRleCAkbGluZSAwXSkgW2xpbmRleCAkbGluZSAxXQoJfQoJY2xvc2UgJGZyX2ZkCgoJc2V0IHRvX3Nob3cge30KCXNldCBmcl9mZCBbb3BlbiAifCBnaXQgcmV2LWxpc3QgLS1hbGwgLS1ub3QgSEVBRCJdCgl3aGlsZSB7W2dldHMgJGZyX2ZkIGxpbmVdID4gMH0gewoJCWlmIHtbY2F0Y2gge3NldCByZWYgJHNoYTEoJGxpbmUpfV19IGNvbnRpbnVlCgkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzKS8gJHJlZiB7fSByZWYKCQlsYXBwZW5kIHRvX3Nob3cgJHJlZgoJfQoJY2xvc2UgJGZyX2ZkCgoJZm9yZWFjaCByZWYgW2xzb3J0IC11bmlxdWUgJHRvX3Nob3ddIHsKCQkkdy5zb3VyY2UubCBpbnNlcnQgZW5kICRyZWYKCX0KCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdyIKCWJpbmQgJHcgPEtleS1Fc2NhcGU+ICJ1bmxvY2tfaW5kZXg7ZGVzdHJveSAkdyIKCWJpbmQgJHcgPERlc3Ryb3k+IHVubG9ja19pbmRleAoJd20gdGl0bGUgJHcgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IE1lcmdlIgoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIGRvX3Jlc2V0X2hhcmQge30gewoJZ2xvYmFsIEhFQUQgY29tbWl0X3R5cGUgZmlsZV9zdGF0ZXMKCglpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0gewoJCWluZm9fcG9wdXAge0Nhbm5vdCBhYm9ydCB3aGlsZSBhbWVuZGluZy4KCllvdSBtdXN0IGZpbmlzaCBhbWVuZGluZyB0aGlzIGNvbW1pdC4KfQoJCXJldHVybgoJfQoKCWlmIHshW2xvY2tfaW5kZXggYWJvcnRdfSByZXR1cm4KCglpZiB7W3N0cmluZyBtYXRjaCAqbWVyZ2UqICRjb21taXRfdHlwZV19IHsKCQlzZXQgb3AgbWVyZ2UKCX0gZWxzZSB7CgkJc2V0IG9wIGNvbW1pdAoJfQoKCWlmIHtbYXNrX3BvcHVwICJBYm9ydCAkb3A/CgpBYm9ydGluZyB0aGUgY3VycmVudCAkb3Agd2lsbCBjYXVzZQoqQUxMKiB1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGJlIGxvc3QuCgpDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50ICRvcD8iXSBlcSB7eWVzfX0gewoJCXNldCBmZCBbb3BlbiAifCBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCIgcl0KCQlmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5CgkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZXNldF9oYXJkX3dhaXQgJGZkXQoJCXNldCB1aV9zdGF0dXNfdmFsdWUge0Fib3J0aW5nLi4uIHBsZWFzZSB3YWl0Li4ufQoJfSBlbHNlIHsKCQl1bmxvY2tfaW5kZXgKCX0KfQoKcHJvYyByZXNldF9oYXJkX3dhaXQge2ZkfSB7CglnbG9iYWwgdWlfY29tbQoKCXJlYWQgJGZkCglpZiB7W2VvZiAkZmRdfSB7CgkJY2xvc2UgJGZkCgkJdW5sb2NrX2luZGV4CgoJCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQoKCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBNRVJHRV9IRUFEXX0KCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciByci1jYWNoZSBNRVJHRV9SUl19CgkJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgU1FVQVNIX01TR119CgkJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgTUVSR0VfTVNHXX0KCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBHSVRHVUlfTVNHXX0KCgkJcmVzY2FuIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtBYm9ydCBjb21wbGV0ZWQuICBSZWFkeS59fQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGJyb3dzZXIKCnNldCBuZXh0X2Jyb3dzZXJfaWQgMAoKcHJvYyBuZXdfYnJvd3NlciB7Y29tbWl0fSB7CglnbG9iYWwgbmV4dF9icm93c2VyX2lkIGN1cnNvcl9wdHIgTTFCCglnbG9iYWwgYnJvd3Nlcl9jb21taXQgYnJvd3Nlcl9zdGF0dXMgYnJvd3Nlcl9zdGFjayBicm93c2VyX3BhdGggYnJvd3Nlcl9idXN5CgoJc2V0IHcgLmJyb3dzZXJbaW5jciBuZXh0X2Jyb3dzZXJfaWRdCglzZXQgd19saXN0ICR3Lmxpc3QubAoJc2V0IGJyb3dzZXJfY29tbWl0KCR3X2xpc3QpICRjb21taXQKCXNldCBicm93c2VyX3N0YXR1cygkd19saXN0KSB7U3RhcnRpbmcuLi59CglzZXQgYnJvd3Nlcl9zdGFjaygkd19saXN0KSB7fQoJc2V0IGJyb3dzZXJfcGF0aCgkd19saXN0KSAkYnJvd3Nlcl9jb21taXQoJHdfbGlzdCk6CglzZXQgYnJvd3Nlcl9idXN5KCR3X2xpc3QpIDEKCgl0b3BsZXZlbCAkdwoJbGFiZWwgJHcucGF0aCAtdGV4dHZhcmlhYmxlIGJyb3dzZXJfcGF0aCgkd19saXN0KSBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzdW5rZW4gXAoJCS1mb250IGZvbnRfdWlib2xkCglwYWNrICR3LnBhdGggLWFuY2hvciB3IC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcubGlzdAoJdGV4dCAkd19saXN0IC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCQktY3Vyc29yICRjdXJzb3JfcHRyIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS13cmFwIG5vbmUgXAoJCS1oZWlnaHQgMjAgXAoJCS13aWR0aCA3MCBcCgkJLXhzY3JvbGxjb21tYW5kIFtsaXN0ICR3Lmxpc3Quc2J4IHNldF0gXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5saXN0LnNieSBzZXRdIFwKCQktZm9udCBmb250X3VpCgkkd19saXN0IHRhZyBjb25mIGluX3NlbCBcCgkJLWJhY2tncm91bmQgWyR3X2xpc3QgY2dldCAtZm9yZWdyb3VuZF0gXAoJCS1mb3JlZ3JvdW5kIFskd19saXN0IGNnZXQgLWJhY2tncm91bmRdCglzY3JvbGxiYXIgJHcubGlzdC5zYnggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR3X2xpc3QgeHZpZXddCglzY3JvbGxiYXIgJHcubGlzdC5zYnkgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR3X2xpc3QgeXZpZXddCglwYWNrICR3Lmxpc3Quc2J4IC1zaWRlIGJvdHRvbSAtZmlsbCB4CglwYWNrICR3Lmxpc3Quc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHdfbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCglwYWNrICR3Lmxpc3QgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgoJbGFiZWwgJHcuc3RhdHVzIC10ZXh0dmFyaWFibGUgYnJvd3Nlcl9zdGF0dXMoJHdfbGlzdCkgXAoJCS1hbmNob3IgdyBcCgkJLWp1c3RpZnkgbGVmdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktZm9udCBmb250X3VpCglwYWNrICR3LnN0YXR1cyAtYW5jaG9yIHcgLXNpZGUgYm90dG9tIC1maWxsIHgKCgliaW5kICR3X2xpc3QgPEJ1dHRvbi0xPiAgICAgICAgImJyb3dzZXJfY2xpY2sgMCAkd19saXN0IEAleCwleTticmVhayIKCWJpbmQgJHdfbGlzdCA8RG91YmxlLUJ1dHRvbi0xPiAiYnJvd3Nlcl9jbGljayAxICR3X2xpc3QgQCV4LCV5O2JyZWFrIgoJYmluZCAkd19saXN0IDwkTTFCLVVwPiAgICAgICAgICJicm93c2VyX3BhcmVudCAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDwkTTFCLUxlZnQ+ICAgICAgICJicm93c2VyX3BhcmVudCAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxVcD4gICAgICAgICAgICAgICJicm93c2VyX21vdmUgLTEgJHdfbGlzdDticmVhayIKCWJpbmQgJHdfbGlzdCA8RG93bj4gICAgICAgICAgICAiYnJvd3Nlcl9tb3ZlIDEgJHdfbGlzdDticmVhayIKCWJpbmQgJHdfbGlzdCA8JE0xQi1SaWdodD4gICAgICAiYnJvd3Nlcl9lbnRlciAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxSZXR1cm4+ICAgICAgICAgICJicm93c2VyX2VudGVyICR3X2xpc3Q7YnJlYWsiCgliaW5kICR3X2xpc3QgPFByaW9yPiAgICAgICAgICAgImJyb3dzZXJfcGFnZSAtMSAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxOZXh0PiAgICAgICAgICAgICJicm93c2VyX3BhZ2UgMSAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxMZWZ0PiAgICAgICAgICAgIGJyZWFrCgliaW5kICR3X2xpc3QgPFJpZ2h0PiAgICAgICAgICAgYnJlYWsKCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZm9jdXMgJHciCgliaW5kICR3IDxEZXN0cm95PiAiCgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9idWZmZXIgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfZmlsZXMgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfc3RhdHVzICR3X2xpc3QKCQlhcnJheSB1bnNldCBicm93c2VyX3N0YWNrICR3X2xpc3QKCQlhcnJheSB1bnNldCBicm93c2VyX3BhdGggJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfY29tbWl0ICR3X2xpc3QKCQlhcnJheSB1bnNldCBicm93c2VyX2J1c3kgJHdfbGlzdAoJIgoJd20gdGl0bGUgJHcgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IEZpbGUgQnJvd3NlciIKCWxzX3RyZWUgJHdfbGlzdCAkYnJvd3Nlcl9jb21taXQoJHdfbGlzdCkge30KfQoKcHJvYyBicm93c2VyX21vdmUge2RpciB3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggaW5fc2VsLmZpcnN0XSAuXSAwXQoJaW5jciBsbm8gJGRpcgoJaWYge1tsaW5kZXggJGJyb3dzZXJfZmlsZXMoJHcpIFtleHByIHskbG5vIC0gMX1dXSBuZSB7fX0gewoJCSR3IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJCSR3IHNlZSAkbG5vLjAKCX0KfQoKcHJvYyBicm93c2VyX3BhZ2Uge2RpciB3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJJHcgeXZpZXcgc2Nyb2xsICRkaXIgcGFnZXMKCXNldCBsbm8gW2V4cHIge2ludCgKCQkgIFtsaW5kZXggWyR3IHl2aWV3XSAwXQoJCSogW2xsZW5ndGggJGJyb3dzZXJfZmlsZXMoJHcpXQoJCSsgMSl9XQoJaWYge1tsaW5kZXggJGJyb3dzZXJfZmlsZXMoJHcpIFtleHByIHskbG5vIC0gMX1dXSBuZSB7fX0gewoJCSR3IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJCSR3IHNlZSAkbG5vLjAKCX0KfQoKcHJvYyBicm93c2VyX3BhcmVudCB7d30gewoJZ2xvYmFsIGJyb3dzZXJfZmlsZXMgYnJvd3Nlcl9zdGF0dXMgYnJvd3Nlcl9wYXRoCglnbG9iYWwgYnJvd3Nlcl9zdGFjayBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJc2V0IGluZm8gW2xpbmRleCAkYnJvd3Nlcl9maWxlcygkdykgMF0KCWlmIHtbbGluZGV4ICRpbmZvIDBdIGVxIHtwYXJlbnR9fSB7CgkJc2V0IHBhcmVudCBbbGluZGV4ICRicm93c2VyX3N0YWNrKCR3KSBlbmQtMV0KCQlzZXQgYnJvd3Nlcl9zdGFjaygkdykgW2xyYW5nZSAkYnJvd3Nlcl9zdGFjaygkdykgMCBlbmQtMl0KCQlpZiB7JGJyb3dzZXJfc3RhY2soJHcpIGVxIHt9fSB7CgkJCXJlZ3N1YiB7Oi4qJH0gJGJyb3dzZXJfcGF0aCgkdykgezp9IGJyb3dzZXJfcGF0aCgkdykKCQl9IGVsc2UgewoJCQlyZWdzdWIgey9bXi9dKyR9ICRicm93c2VyX3BhdGgoJHcpIHt9IGJyb3dzZXJfcGF0aCgkdykKCQl9CgkJc2V0IGJyb3dzZXJfc3RhdHVzKCR3KSAiTG9hZGluZyAkYnJvd3Nlcl9wYXRoKCR3KS4uLiIKCQlsc190cmVlICR3IFtsaW5kZXggJHBhcmVudCAwXSBbbGluZGV4ICRwYXJlbnQgMV0KCX0KfQoKcHJvYyBicm93c2VyX2VudGVyIHt3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX3N0YXR1cyBicm93c2VyX3BhdGgKCWdsb2JhbCBicm93c2VyX2NvbW1pdCBicm93c2VyX3N0YWNrIGJyb3dzZXJfYnVzeQoKCWlmIHskYnJvd3Nlcl9idXN5KCR3KX0gcmV0dXJuCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBpbl9zZWwuZmlyc3RdIC5dIDBdCglzZXQgaW5mbyBbbGluZGV4ICRicm93c2VyX2ZpbGVzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KCWlmIHskaW5mbyBuZSB7fX0gewoJCXN3aXRjaCAtLSBbbGluZGV4ICRpbmZvIDBdIHsKCQlwYXJlbnQgewoJCQlicm93c2VyX3BhcmVudCAkdwoJCX0KCQl0cmVlIHsKCQkJc2V0IG5hbWUgW2xpbmRleCAkaW5mbyAyXQoJCQlzZXQgZXNjbiBbZXNjYXBlX3BhdGggJG5hbWVdCgkJCXNldCBicm93c2VyX3N0YXR1cygkdykgIkxvYWRpbmcgJGVzY24uLi4iCgkJCWFwcGVuZCBicm93c2VyX3BhdGgoJHcpICRlc2NuCgkJCWxzX3RyZWUgJHcgW2xpbmRleCAkaW5mbyAxXSAkbmFtZQoJCX0KCQlibG9iIHsKCQkJc2V0IG5hbWUgW2xpbmRleCAkaW5mbyAyXQoJCQlzZXQgcCB7fQoJCQlmb3JlYWNoIG4gJGJyb3dzZXJfc3RhY2soJHcpIHsKCQkJCWFwcGVuZCBwIFtsaW5kZXggJG4gMV0KCQkJfQoJCQlhcHBlbmQgcCAkbmFtZQoJCQlzaG93X2JsYW1lICRicm93c2VyX2NvbW1pdCgkdykgJHAKCQl9CgkJfQoJfQp9Cgpwcm9jIGJyb3dzZXJfY2xpY2sge3dhc19kb3VibGVfY2xpY2sgdyBwb3N9IHsKCWdsb2JhbCBicm93c2VyX2ZpbGVzIGJyb3dzZXJfYnVzeQoKCWlmIHskYnJvd3Nlcl9idXN5KCR3KX0gcmV0dXJuCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAkcG9zXSAuXSAwXQoJZm9jdXMgJHcKCglpZiB7W2xpbmRleCAkYnJvd3Nlcl9maWxlcygkdykgW2V4cHIgeyRsbm8gLSAxfV1dIG5lIHt9fSB7CgkJJHcgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJCSR3IHRhZyBhZGQgaW5fc2VsICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCgkJaWYgeyR3YXNfZG91YmxlX2NsaWNrfSB7CgkJCWJyb3dzZXJfZW50ZXIgJHcKCQl9Cgl9Cn0KCnByb2MgbHNfdHJlZSB7dyB0cmVlX2lkIG5hbWV9IHsKCWdsb2JhbCBicm93c2VyX2J1ZmZlciBicm93c2VyX2ZpbGVzIGJyb3dzZXJfc3RhY2sgYnJvd3Nlcl9idXN5CgoJc2V0IGJyb3dzZXJfYnVmZmVyKCR3KSB7fQoJc2V0IGJyb3dzZXJfZmlsZXMoJHcpIHt9CglzZXQgYnJvd3Nlcl9idXN5KCR3KSAxCgoJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkkdyB0YWcgcmVtb3ZlIGluX3NlbCAwLjAgZW5kCgkkdyBkZWxldGUgMC4wIGVuZAoJaWYgeyRicm93c2VyX3N0YWNrKCR3KSBuZSB7fX0gewoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgXAoJCQktYWxpZ24gY2VudGVyIC1wYWR4IDUgLXBhZHkgMSBcCgkJCS1uYW1lIGljb24wIFwKCQkJLWltYWdlIGZpbGVfdXBsZXZlbAoJCSR3IGluc2VydCBlbmQge1tVcCBUbyBQYXJlbnRdfQoJCWxhcHBlbmQgYnJvd3Nlcl9maWxlcygkdykgcGFyZW50Cgl9CglsYXBwZW5kIGJyb3dzZXJfc3RhY2soJHcpIFtsaXN0ICR0cmVlX2lkICRuYW1lXQoJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglzZXQgY21kIFtsaXN0IGdpdCBscy10cmVlIC16ICR0cmVlX2lkXQoJc2V0IGZkIFtvcGVuICJ8ICRjbWQiIHJdCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgcmVhZF9sc190cmVlICRmZCAkd10KfQoKcHJvYyByZWFkX2xzX3RyZWUge2ZkIHd9IHsKCWdsb2JhbCBicm93c2VyX2J1ZmZlciBicm93c2VyX2ZpbGVzIGJyb3dzZXJfc3RhdHVzIGJyb3dzZXJfYnVzeQoKCWlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsKCQljYXRjaCB7Y2xvc2UgJGZkfQoJCXJldHVybgoJfQoKCWFwcGVuZCBicm93c2VyX2J1ZmZlcigkdykgW3JlYWQgJGZkXQoJc2V0IHBjayBbc3BsaXQgJGJyb3dzZXJfYnVmZmVyKCR3KSAiXDAiXQoJc2V0IGJyb3dzZXJfYnVmZmVyKCR3KSBbbGluZGV4ICRwY2sgZW5kXQoKCXNldCBuIFtsbGVuZ3RoICRicm93c2VyX2ZpbGVzKCR3KV0KCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJZm9yZWFjaCBwIFtscmFuZ2UgJHBjayAwIGVuZC0xXSB7CgkJc2V0IGluZm8gW3NwbGl0ICRwICJcdCJdCgkJc2V0IHBhdGggW2xpbmRleCAkaW5mbyAxXQoJCXNldCBpbmZvIFtzcGxpdCBbbGluZGV4ICRpbmZvIDBdIHsgfV0KCQlzZXQgdHlwZSBbbGluZGV4ICRpbmZvIDFdCgkJc2V0IG9iamVjdCBbbGluZGV4ICRpbmZvIDJdCgoJCXN3aXRjaCAtLSAkdHlwZSB7CgkJYmxvYiB7CgkJCXNldCBpbWFnZSBmaWxlX21vZAoJCX0KCQl0cmVlIHsKCQkJc2V0IGltYWdlIGZpbGVfZGlyCgkJCWFwcGVuZCBwYXRoIC8KCQl9CgkJZGVmYXVsdCB7CgkJCXNldCBpbWFnZSBmaWxlX3F1ZXN0aW9uCgkJfQoJCX0KCgkJaWYgeyRuID4gMH0geyR3IGluc2VydCBlbmQgIlxuIn0KCQkkdyBpbWFnZSBjcmVhdGUgZW5kIFwKCQkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAoJCQktbmFtZSBpY29uW2luY3Igbl0gXAoJCQktaW1hZ2UgJGltYWdlCgkJJHcgaW5zZXJ0IGVuZCBbZXNjYXBlX3BhdGggJHBhdGhdCgkJbGFwcGVuZCBicm93c2VyX2ZpbGVzKCR3KSBbbGlzdCAkdHlwZSAkb2JqZWN0ICRwYXRoXQoJfQoJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglpZiB7W2VvZiAkZmRdfSB7CgkJY2xvc2UgJGZkCgkJc2V0IGJyb3dzZXJfc3RhdHVzKCR3KSBSZWFkeS4KCQlzZXQgYnJvd3Nlcl9idXN5KCR3KSAwCgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9idWZmZXIgJHcKCQlpZiB7JG4gPiAwfSB7CgkJCSR3IHRhZyBhZGQgaW5fc2VsIDEuMCAyLjAKCQkJZm9jdXMgLWZvcmNlICR3CgkJfQoJfQp9Cgpwcm9jIHNob3dfYmxhbWUge2NvbW1pdCBwYXRofSB7CglnbG9iYWwgbmV4dF9icm93c2VyX2lkIGJsYW1lX3N0YXR1cyBibGFtZV9kYXRhCgoJaWYge1t3aW5mbyBpc21hcHBlZCAuXX0gewoJCXNldCB3IC5icm93c2VyW2luY3IgbmV4dF9icm93c2VyX2lkXQoJCXNldCB0bCAkdwoJCXRvcGxldmVsICR3Cgl9IGVsc2UgewoJCXNldCB3IHt9CgkJc2V0IHRsIC4KCX0KCXNldCBibGFtZV9zdGF0dXMoJHcpIHtMb2FkaW5nIGN1cnJlbnQgZmlsZSBjb250ZW50Li4ufQoKCWxhYmVsICR3LnBhdGggLXRleHQgIiRjb21taXQ6JHBhdGgiIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcucGF0aCAtc2lkZSB0b3AgLWZpbGwgeAoKCWZyYW1lICR3Lm91dAoJdGV4dCAkdy5vdXQubG9hZGVkX3QgXAoJCS1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS13cmFwIG5vbmUgXAoJCS1oZWlnaHQgNDAgXAoJCS13aWR0aCAxIFwKCQktZm9udCBmb250X2RpZmYKCSR3Lm91dC5sb2FkZWRfdCB0YWcgY29uZiBhbm5vdGF0ZWQgLWJhY2tncm91bmQgZ3JleQoKCXRleHQgJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDAgXAoJCS1zdGF0ZSBkaXNhYmxlZCBcCgkJLXdyYXAgbm9uZSBcCgkJLWhlaWdodCA0MCBcCgkJLXdpZHRoIDUgXAoJCS1mb250IGZvbnRfZGlmZgoJJHcub3V0LmxpbmVudW1iZXJfdCB0YWcgY29uZiBsaW5lbnVtYmVyIC1qdXN0aWZ5IHJpZ2h0CgoJdGV4dCAkdy5vdXQuZmlsZV90IFwKCQktYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQktd3JhcCBub25lIFwKCQktaGVpZ2h0IDQwIFwKCQktd2lkdGggODAgXAoJCS14c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5vdXQuc2J4IHNldF0gXAoJCS1mb250IGZvbnRfZGlmZgoKCXNjcm9sbGJhciAkdy5vdXQuc2J4IC1vcmllbnQgaCAtY29tbWFuZCBbbGlzdCAkdy5vdXQuZmlsZV90IHh2aWV3XQoJc2Nyb2xsYmFyICR3Lm91dC5zYnkgLW9yaWVudCB2IFwKCQktY29tbWFuZCBbbGlzdCBzY3JvbGxiYXIybWFueSBbbGlzdCBcCgkJJHcub3V0LmxvYWRlZF90IFwKCQkkdy5vdXQubGluZW51bWJlcl90IFwKCQkkdy5vdXQuZmlsZV90IFwKCQldIHl2aWV3XQoJZ3JpZCBcCgkJJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJJHcub3V0LmxvYWRlZF90IFwKCQkkdy5vdXQuZmlsZV90IFwKCQkkdy5vdXQuc2J5IFwKCQktc3RpY2t5IG5zZXcKCWdyaWQgY29uZiAkdy5vdXQuc2J4IC1jb2x1bW4gMiAtc3RpY2t5IHdlCglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5vdXQgMiAtd2VpZ2h0IDEKCWdyaWQgcm93Y29uZmlndXJlICR3Lm91dCAwIC13ZWlnaHQgMQoJcGFjayAkdy5vdXQgLWZpbGwgYm90aCAtZXhwYW5kIDEKCglsYWJlbCAkdy5zdGF0dXMgLXRleHR2YXJpYWJsZSBibGFtZV9zdGF0dXMoJHcpIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLWZvbnQgZm9udF91aQoJcGFjayAkdy5zdGF0dXMgLXNpZGUgYm90dG9tIC1maWxsIHgKCglmcmFtZSAkdy5jbQoJdGV4dCAkdy5jbS50IFwKCQktYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQktd3JhcCBub25lIFwKCQktaGVpZ2h0IDEwIFwKCQktd2lkdGggODAgXAoJCS14c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5jbS5zYnggc2V0XSBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3LmNtLnNieSBzZXRdIFwKCQktZm9udCBmb250X2RpZmYKCXNjcm9sbGJhciAkdy5jbS5zYnggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR3LmNtLnQgeHZpZXddCglzY3JvbGxiYXIgJHcuY20uc2J5IC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkdy5jbS50IHl2aWV3XQoJcGFjayAkdy5jbS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5jbS5zYnggLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcuY20udCAtZXhwYW5kIDEgLWZpbGwgYm90aAoJcGFjayAkdy5jbSAtc2lkZSBib3R0b20gLWZpbGwgeAoKCW1lbnUgJHcuY3R4bSAtdGVhcm9mZiAwCgkkdy5jdHhtIGFkZCBjb21tYW5kIC1sYWJlbCAiQ29weSBDb21taXQiIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCAiYmxhbWVfY29weWNvbW1pdCAkdyBcJGN1cnNvclcgQFwkY3Vyc29yWCxcJGN1cnNvclkiCgoJZm9yZWFjaCBpIFtsaXN0IFwKCQkkdy5vdXQubG9hZGVkX3QgXAoJCSR3Lm91dC5saW5lbnVtYmVyX3QgXAoJCSR3Lm91dC5maWxlX3RdIHsKCQkkaSB0YWcgY29uZiBpbl9zZWwgXAoJCQktYmFja2dyb3VuZCBbJGkgY2dldCAtZm9yZWdyb3VuZF0gXAoJCQktZm9yZWdyb3VuZCBbJGkgY2dldCAtYmFja2dyb3VuZF0KCQkkaSBjb25mIC15c2Nyb2xsY29tbWFuZCBcCgkJCVtsaXN0IG1hbnkyc2Nyb2xsYmFyIFtsaXN0IFwKCQkJJHcub3V0LmxvYWRlZF90IFwKCQkJJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJCSR3Lm91dC5maWxlX3QgXAoJCQldIHl2aWV3ICR3Lm91dC5zYnldCgkJYmluZCAkaSA8QnV0dG9uLTE+ICIKCQkJYmxhbWVfY2xpY2sgeyR3fSBcXAoJCQkJJHcuY20udCBcXAoJCQkJJHcub3V0LmxpbmVudW1iZXJfdCBcXAoJCQkJJHcub3V0LmZpbGVfdCBcXAoJCQkJJGkgQCV4LCV5CgkJCWZvY3VzICRpCgkJIgoJCWJpbmRfYnV0dG9uMyAkaSAiCgkJCXNldCBjdXJzb3JYICV4CgkJCXNldCBjdXJzb3JZICV5CgkJCXNldCBjdXJzb3JXICVXCgkJCXRrX3BvcHVwICR3LmN0eG0gJVggJVkKCQkiCgl9CgoJYmluZCAkdy5jbS50IDxCdXR0b24tMT4gImZvY3VzICR3LmNtLnQiCgliaW5kICR0bCA8VmlzaWJpbGl0eT4gImZvY3VzICR0bCIKCWJpbmQgJHRsIDxEZXN0cm95PiAiCgkJYXJyYXkgdW5zZXQgYmxhbWVfc3RhdHVzIHskd30KCQlhcnJheSB1bnNldCBibGFtZV9kYXRhICR3LCoKCSIKCXdtIHRpdGxlICR0bCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogRmlsZSBWaWV3ZXIiCgoJc2V0IGJsYW1lX2RhdGEoJHcsY29tbWl0X2NvdW50KSAwCglzZXQgYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkge30KCXNldCBibGFtZV9kYXRhKCR3LHRvdGFsX2xpbmVzKSAwCglzZXQgYmxhbWVfZGF0YSgkdyxibGFtZV9saW5lcykgMAoJc2V0IGJsYW1lX2RhdGEoJHcsaGlnaGxpZ2h0X2NvbW1pdCkge30KCXNldCBibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSAtMQoKCXNldCBjbWQgW2xpc3QgZ2l0IGNhdC1maWxlIGJsb2IgIiRjb21taXQ6JHBhdGgiXQoJc2V0IGZkIFtvcGVuICJ8ICRjbWQiIHJdCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYgLWVuY29kaW5nIGJpbmFyeQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZWFkX2JsYW1lX2NhdGZpbGUgXAoJCSRmZCAkdyAkY29tbWl0ICRwYXRoIFwKCQkkdy5jbS50ICR3Lm91dC5sb2FkZWRfdCAkdy5vdXQubGluZW51bWJlcl90ICR3Lm91dC5maWxlX3RdCn0KCnByb2MgcmVhZF9ibGFtZV9jYXRmaWxlIHtmZCB3IGNvbW1pdCBwYXRoIHdfY21pdCB3X2xvYWQgd19saW5lIHdfZmlsZX0gewoJZ2xvYmFsIGJsYW1lX3N0YXR1cyBibGFtZV9kYXRhCgoJaWYgeyFbd2luZm8gZXhpc3RzICR3X2ZpbGVdfSB7CgkJY2F0Y2gge2Nsb3NlICRmZH0KCQlyZXR1cm4KCX0KCglzZXQgbiAkYmxhbWVfZGF0YSgkdyx0b3RhbF9saW5lcykKCSR3X2xvYWQgY29uZiAtc3RhdGUgbm9ybWFsCgkkd19saW5lIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHdfZmlsZSBjb25mIC1zdGF0ZSBub3JtYWwKCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0gewoJCXJlZ3N1YiAiXHJcJCIgJGxpbmUge30gbGluZQoJCWluY3IgbgoJCSR3X2xvYWQgaW5zZXJ0IGVuZCAiXG4iCgkJJHdfbGluZSBpbnNlcnQgZW5kICIkblxuIiBsaW5lbnVtYmVyCgkJJHdfZmlsZSBpbnNlcnQgZW5kICIkbGluZVxuIgoJfQoJJHdfbG9hZCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHdfbGluZSBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHdfZmlsZSBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJc2V0IGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpICRuCgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCWJsYW1lX2luY3JlbWVudGFsX3N0YXR1cyAkdwoJCXNldCBjbWQgW2xpc3QgZ2l0IGJsYW1lIC1NIC1DIC0taW5jcmVtZW50YWxdCgkJbGFwcGVuZCBjbWQgJGNvbW1pdCAtLSAkcGF0aAoJCXNldCBmZCBbb3BlbiAifCAkY21kIiByXQoJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZiAtZW5jb2RpbmcgYmluYXJ5CgkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZWFkX2JsYW1lX2luY3JlbWVudGFsICRmZCAkdyBcCgkJCSR3X2xvYWQgJHdfY21pdCAkd19saW5lICR3X2ZpbGVdCgl9Cn0KCnByb2MgcmVhZF9ibGFtZV9pbmNyZW1lbnRhbCB7ZmQgdyB3X2xvYWQgd19jbWl0IHdfbGluZSB3X2ZpbGV9IHsKCWdsb2JhbCBibGFtZV9zdGF0dXMgYmxhbWVfZGF0YQoKCWlmIHshW3dpbmZvIGV4aXN0cyAkd19maWxlXX0gewoJCWNhdGNoIHtjbG9zZSAkZmR9CgkJcmV0dXJuCgl9CgoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJaWYge1tyZWdleHAge14oW2EtejAtOV17NDB9KSAoXGQrKSAoXGQrKSAoXGQrKSR9ICRsaW5lIGxpbmUgXAoJCQljbWl0IG9yaWdpbmFsX2xpbmUgZmluYWxfbGluZSBsaW5lX2NvdW50XX0gewoJCQlzZXQgYmxhbWVfZGF0YSgkdyxjb21taXQpICRjbWl0CgkJCXNldCBibGFtZV9kYXRhKCR3LG9yaWdpbmFsX2xpbmUpICRvcmlnaW5hbF9saW5lCgkJCXNldCBibGFtZV9kYXRhKCR3LGZpbmFsX2xpbmUpICRmaW5hbF9saW5lCgkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmVfY291bnQpICRsaW5lX2NvdW50CgoJCQlpZiB7W2NhdGNoIHtzZXQgZyAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcil9XX0gewoJCQkJJHdfbGluZSB0YWcgY29uZiBnJGNtaXQKCQkJCSR3X2ZpbGUgdGFnIGNvbmYgZyRjbWl0CgkJCQkkd19saW5lIHRhZyByYWlzZSBpbl9zZWwKCQkJCSR3X2ZpbGUgdGFnIHJhaXNlIGluX3NlbAoJCQkJJHdfZmlsZSB0YWcgcmFpc2Ugc2VsCgkJCQlzZXQgYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcikgJGJsYW1lX2RhdGEoJHcsY29tbWl0X2NvdW50KQoJCQkJaW5jciBibGFtZV9kYXRhKCR3LGNvbW1pdF9jb3VudCkKCQkJCWxhcHBlbmQgYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkgJGNtaXQKCQkJfQoJCX0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoIHtmaWxlbmFtZSAqfSAkbGluZV19IHsKCQkJc2V0IGZpbGUgW3N0cmluZyByYW5nZSAkbGluZSA5IGVuZF0KCQkJc2V0IG4gJGJsYW1lX2RhdGEoJHcsbGluZV9jb3VudCkKCQkJc2V0IGxubyAkYmxhbWVfZGF0YSgkdyxmaW5hbF9saW5lKQoJCQlzZXQgY21pdCAkYmxhbWVfZGF0YSgkdyxjb21taXQpCgoJCQl3aGlsZSB7JG4gPiAwfSB7CgkJCQlpZiB7W2NhdGNoIHtzZXQgZyBnJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sY29tbWl0KX1dfSB7CgkJCQkJJHdfbG9hZCB0YWcgYWRkIGFubm90YXRlZCAkbG5vLjAgIiRsbm8uMCBsaW5lZW5kICsgMWMiCgkJCQl9IGVsc2UgewoJCQkJCSR3X2xpbmUgdGFnIHJlbW92ZSBnJGcgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoJCQkJCSR3X2ZpbGUgdGFnIHJlbW92ZSBnJGcgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoJCQkJfQoKCQkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGNvbW1pdCkgJGNtaXQKCQkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGZpbGUpICRmaWxlCgkJCQkkd19saW5lIHRhZyBhZGQgZyRjbWl0ICRsbm8uMCAiJGxuby4wIGxpbmVlbmQgKyAxYyIKCQkJCSR3X2ZpbGUgdGFnIGFkZCBnJGNtaXQgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoKCQkJCWlmIHskYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfbGluZSkgPT0gLTF9IHsKCQkJCQlpZiB7W2xpbmRleCBbJHdfZmlsZSB5dmlld10gMF0gPT0gMH0gewoJCQkJCQkkd19maWxlIHNlZSAkbG5vLjAKCQkJCQkJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCgkJCQkJfQoJCQkJfSBlbHNlaWYgeyRibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSA9PSAkbG5vfSB7CgkJCQkJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCgkJCQl9CgoJCQkJaW5jciBuIC0xCgkJCQlpbmNyIGxubwoJCQkJaW5jciBibGFtZV9kYXRhKCR3LGJsYW1lX2xpbmVzKQoJCQl9CgoJCQlzZXQgaGMgJGJsYW1lX2RhdGEoJHcsaGlnaGxpZ2h0X2NvbW1pdCkKCQkJaWYgeyRoYyBuZSB7fQoJCQkJJiYgW2V4cHIgeyRibGFtZV9kYXRhKCR3LCRoYyxvcmRlcikgKyAxfV0KCQkJCQk9PSAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcil9IHsKCQkJCWJsYW1lX3Nob3djb21taXQgJHcgJHdfY21pdCAkd19saW5lICR3X2ZpbGUgXAoJCQkJCSRibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKQoJCQl9CgkJfSBlbHNlaWYge1tyZWdleHAge14oW2Etei1dKykgKC4qKSR9ICRsaW5lIGxpbmUgaGVhZGVyIGRhdGFdfSB7CgkJCXNldCBibGFtZV9kYXRhKCR3LCRibGFtZV9kYXRhKCR3LGNvbW1pdCksJGhlYWRlcikgJGRhdGEKCQl9Cgl9CgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCXNldCBibGFtZV9zdGF0dXMoJHcpIHtBbm5vdGF0aW9uIGNvbXBsZXRlLn0KCX0gZWxzZSB7CgkJYmxhbWVfaW5jcmVtZW50YWxfc3RhdHVzICR3Cgl9Cn0KCnByb2MgYmxhbWVfaW5jcmVtZW50YWxfc3RhdHVzIHt3fSB7CglnbG9iYWwgYmxhbWVfc3RhdHVzIGJsYW1lX2RhdGEKCglzZXQgYmxhbWVfc3RhdHVzKCR3KSBbZm9ybWF0IFwKCQkiTG9hZGluZyBhbm5vdGF0aW9ucy4uLiAlaSBvZiAlaSBsaW5lcyBhbm5vdGF0ZWQgKCUyaSUlKSIgXAoJCSRibGFtZV9kYXRhKCR3LGJsYW1lX2xpbmVzKSBcCgkJJGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpIFwKCQlbZXhwciB7MTAwICogJGJsYW1lX2RhdGEoJHcsYmxhbWVfbGluZXMpCgkJCS8gJGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpfV1dCn0KCnByb2MgYmxhbWVfY2xpY2sge3cgd19jbWl0IHdfbGluZSB3X2ZpbGUgY3VyX3cgcG9zfSB7CglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskY3VyX3cgaW5kZXggJHBvc10gLl0gMF0KCWlmIHskbG5vIGVxIHt9fSByZXR1cm4KCgkkd19saW5lIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCSR3X2ZpbGUgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJJHdfbGluZSB0YWcgYWRkIGluX3NlbCAkbG5vLjAgIiRsbm8uMCArIDEgbGluZSIKCSR3X2ZpbGUgdGFnIGFkZCBpbl9zZWwgJGxuby4wICIkbG5vLjAgKyAxIGxpbmUiCgoJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCn0KCnNldCBibGFtZV9jb2xvcnMgewoJI2ZmNDA0MAoJI2ZmNDBmZgoJIzQwNDBmZgp9Cgpwcm9jIGJsYW1lX3Nob3djb21taXQge3cgd19jbWl0IHdfbGluZSB3X2ZpbGUgbG5vfSB7CglnbG9iYWwgYmxhbWVfY29sb3JzIGJsYW1lX2RhdGEgcmVwb19jb25maWcKCglzZXQgY21pdCAkYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfY29tbWl0KQoJaWYgeyRjbWl0IG5lIHt9fSB7CgkJc2V0IGlkeCAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcikKCQlzZXQgaSAwCgkJZm9yZWFjaCBjICRibGFtZV9jb2xvcnMgewoJCQlzZXQgaCBbbGluZGV4ICRibGFtZV9kYXRhKCR3LGNvbW1pdF9saXN0KSBbZXhwciB7JGlkeCAtIDEgKyAkaX1dXQoJCQkkd19saW5lIHRhZyBjb25mIGckaCAtYmFja2dyb3VuZCB3aGl0ZQoJCQkkd19maWxlIHRhZyBjb25mIGckaCAtYmFja2dyb3VuZCB3aGl0ZQoJCQlpbmNyIGkKCQl9Cgl9CgoJJHdfY21pdCBjb25mIC1zdGF0ZSBub3JtYWwKCSR3X2NtaXQgZGVsZXRlIDAuMCBlbmQKCWlmIHtbY2F0Y2gge3NldCBjbWl0ICRibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGNvbW1pdCl9XX0gewoJCXNldCBjbWl0IHt9CgkJJHdfY21pdCBpbnNlcnQgZW5kICJMb2FkaW5nIGFubm90YXRpb24uLi4iCgl9IGVsc2UgewoJCXNldCBpZHggJGJsYW1lX2RhdGEoJHcsJGNtaXQsb3JkZXIpCgkJc2V0IGkgMAoJCWZvcmVhY2ggYyAkYmxhbWVfY29sb3JzIHsKCQkJc2V0IGggW2xpbmRleCAkYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkgW2V4cHIgeyRpZHggLSAxICsgJGl9XV0KCQkJJHdfbGluZSB0YWcgY29uZiBnJGggLWJhY2tncm91bmQgJGMKCQkJJHdfZmlsZSB0YWcgY29uZiBnJGggLWJhY2tncm91bmQgJGMKCQkJaW5jciBpCgkJfQoKCQlpZiB7W2NhdGNoIHtzZXQgbXNnICRibGFtZV9kYXRhKCR3LCRjbWl0LG1lc3NhZ2UpfV19IHsKCQkJc2V0IG1zZyB7fQoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gInwgZ2l0IGNhdC1maWxlIGNvbW1pdCAkY21pdCIgcl0KCQkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyBiaW5hcnkgLXRyYW5zbGF0aW9uIGxmCgkJCQlpZiB7W2NhdGNoIHtzZXQgZW5jICRyZXBvX2NvbmZpZyhpMThuLmNvbW1pdGVuY29kaW5nKX1dfSB7CgkJCQkJc2V0IGVuYyB1dGYtOAoJCQkJfQoJCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKCQkJCQlpZiB7W3N0cmluZyBtYXRjaCB7ZW5jb2RpbmcgKn0gJGxpbmVdfSB7CgkJCQkJCXNldCBlbmMgW3N0cmluZyB0b2xvd2VyIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdXQoJCQkJCX0KCQkJCX0KCQkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkZW5jCgkJCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSBbcmVhZCAkZmRdXQoJCQkJY2xvc2UgJGZkCgkJCX0KCQkJc2V0IGJsYW1lX2RhdGEoJHcsJGNtaXQsbWVzc2FnZSkgJG1zZwoJCX0KCgkJc2V0IGF1dGhvcl9uYW1lIHt9CgkJc2V0IGF1dGhvcl9lbWFpbCB7fQoJCXNldCBhdXRob3JfdGltZSB7fQoJCWNhdGNoIHtzZXQgYXV0aG9yX25hbWUgJGJsYW1lX2RhdGEoJHcsJGNtaXQsYXV0aG9yKX0KCQljYXRjaCB7c2V0IGF1dGhvcl9lbWFpbCAkYmxhbWVfZGF0YSgkdywkY21pdCxhdXRob3ItbWFpbCl9CgkJY2F0Y2gge3NldCBhdXRob3JfdGltZSBbY2xvY2sgZm9ybWF0ICRibGFtZV9kYXRhKCR3LCRjbWl0LGF1dGhvci10aW1lKV19CgoJCXNldCBjb21taXR0ZXJfbmFtZSB7fQoJCXNldCBjb21taXR0ZXJfZW1haWwge30KCQlzZXQgY29tbWl0dGVyX3RpbWUge30KCQljYXRjaCB7c2V0IGNvbW1pdHRlcl9uYW1lICRibGFtZV9kYXRhKCR3LCRjbWl0LGNvbW1pdHRlcil9CgkJY2F0Y2gge3NldCBjb21taXR0ZXJfZW1haWwgJGJsYW1lX2RhdGEoJHcsJGNtaXQsY29tbWl0dGVyLW1haWwpfQoJCWNhdGNoIHtzZXQgY29tbWl0dGVyX3RpbWUgW2Nsb2NrIGZvcm1hdCAkYmxhbWVfZGF0YSgkdywkY21pdCxjb21taXR0ZXItdGltZSldfQoKCQkkd19jbWl0IGluc2VydCBlbmQgImNvbW1pdCAkY21pdFxuIgoJCSR3X2NtaXQgaW5zZXJ0IGVuZCAiQXV0aG9yOiAkYXV0aG9yX25hbWUgJGF1dGhvcl9lbWFpbCAkYXV0aG9yX3RpbWVcbiIKCQkkd19jbWl0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogJGNvbW1pdHRlcl9uYW1lICRjb21taXR0ZXJfZW1haWwgJGNvbW1pdHRlcl90aW1lXG4iCgkJJHdfY21pdCBpbnNlcnQgZW5kICJPcmlnaW5hbCBGaWxlOiBbZXNjYXBlX3BhdGggJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sZmlsZSldXG4iCgkJJHdfY21pdCBpbnNlcnQgZW5kICJcbiIKCQkkd19jbWl0IGluc2VydCBlbmQgJG1zZwoJfQoJJHdfY21pdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoKCXNldCBibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSAkbG5vCglzZXQgYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfY29tbWl0KSAkY21pdAp9Cgpwcm9jIGJsYW1lX2NvcHljb21taXQge3cgaSBwb3N9IHsKCWdsb2JhbCBibGFtZV9kYXRhCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskaSBpbmRleCAkcG9zXSAuXSAwXQoJaWYgeyFbY2F0Y2gge3NldCBjb21taXQgJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sY29tbWl0KX1dfSB7CgkJY2xpcGJvYXJkIGNsZWFyCgkJY2xpcGJvYXJkIGFwcGVuZCBcCgkJCS1mb3JtYXQgU1RSSU5HIFwKCQkJLXR5cGUgU1RSSU5HIFwKCQkJLS0gJGNvbW1pdAoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGljb25zCgpzZXQgZmlsZW1hc2sgewojZGVmaW5lIG1hc2tfd2lkdGggMTQKI2RlZmluZSBtYXNrX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBtYXNrX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZn07Cn0KCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9wbGFpbiAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibGFjayAtZGF0YSB7CiNkZWZpbmUgcGxhaW5fd2lkdGggMTQKI2RlZmluZSBwbGFpbl9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhaW5fYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDA1LCAweDAyLCAweDA5LCAweDAyLCAweDFmLCAweDAyLCAweDEwLAogICAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLAogICAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfbW9kIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewojZGVmaW5lIG1vZF93aWR0aCAxNAojZGVmaW5lIG1vZF9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgbW9kX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg3YSwgMHgwNSwgMHgwMiwgMHgwOSwgMHg3YSwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX2Z1bGx0aWNrIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kICIjMDA3MDAwIiAtZGF0YSB7CiNkZWZpbmUgZmlsZV9mdWxsdGlja193aWR0aCAxNAojZGVmaW5lIGZpbGVfZnVsbHRpY2tfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfZnVsbHRpY2tfYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDFhLCAweDAyLCAweDBjLCAweDAyLCAweDBjLCAweDAyLCAweDE2LCAweDAyLCAweDE2LAogICAweDAyLCAweDEzLCAweDAwLCAweDEzLCAweDg2LCAweDExLCAweDhjLCAweDExLCAweGQ4LCAweDEwLCAweGYyLCAweDEwLAogICAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcGFydHRpY2sgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgIiMwMDUwNTAiIC1kYXRhIHsKI2RlZmluZSBwYXJ0dGlja193aWR0aCAxNAojZGVmaW5lIHBhcnR0aWNrX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBwYXJ0dGlja19iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4N2EsIDB4MDUsIDB4MDIsIDB4MDksIDB4N2EsIDB4MWYsIDB4MDIsIDB4MTAsCiAgIDB4N2EsIDB4MTQsIDB4MDIsIDB4MTYsIDB4MDIsIDB4MTMsIDB4OGEsIDB4MTEsIDB4ZGEsIDB4MTAsIDB4NzIsIDB4MTAsCiAgIDB4MjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9xdWVzdGlvbiAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibGFjayAtZGF0YSB7CiNkZWZpbmUgZmlsZV9xdWVzdGlvbl93aWR0aCAxNAojZGVmaW5lIGZpbGVfcXVlc3Rpb25faGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfcXVlc3Rpb25fYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAyLCAweGUyLCAweDA0LCAweGYyLCAweDA5LCAweDFhLCAweDFiLCAweDBhLCAweDEzLAogICAweDgyLCAweDExLCAweGMyLCAweDEwLCAweDYyLCAweDEwLCAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweDYyLCAweDEwLAogICAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcmVtb3ZlZCAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCByZWQgLWRhdGEgewojZGVmaW5lIGZpbGVfcmVtb3ZlZF93aWR0aCAxNAojZGVmaW5lIGZpbGVfcmVtb3ZlZF9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9yZW1vdmVkX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwNSwgMHgwMiwgMHgwOSwgMHgwMiwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHgxYSwgMHgxNiwgMHgzMiwgMHgxMywgMHhlMiwgMHgxMSwgMHhjMiwgMHgxMCwgMHhlMiwgMHgxMSwgMHgzMiwgMHgxMywKICAgMHgxYSwgMHgxNiwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX21lcmdlIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewojZGVmaW5lIGZpbGVfbWVyZ2Vfd2lkdGggMTQKI2RlZmluZSBmaWxlX21lcmdlX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX21lcmdlX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg2MiwgMHgwNSwgMHg2MiwgMHgwOSwgMHg2MiwgMHgxZiwgMHg2MiwgMHgxMCwKICAgMHhmYSwgMHgxMSwgMHhmMiwgMHgxMCwgMHg2MiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKc2V0IGZpbGVfZGlyX2RhdGEgewojZGVmaW5lIGZpbGVfd2lkdGggMTgKI2RlZmluZSBmaWxlX2hlaWdodCAxOApzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX2JpdHNbXSA9IHsKICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY4LCAweDAzLCAweDAwLAogIDB4MGMsIDB4MDMsIDB4MDAsIDB4MDQsIDB4ZmUsIDB4MDAsIDB4MDYsIDB4ODAsIDB4MDAsIDB4ZmYsIDB4OWYsIDB4MDAsCiAgMHgwMywgMHg5OCwgMHgwMCwgMHgwMiwgMHg5MCwgMHgwMCwgMHgwNiwgMHhiMCwgMHgwMCwgMHgwNCwgMHhhMCwgMHgwMCwKICAweDBjLCAweGUwLCAweDAwLCAweDA4LCAweGMwLCAweDAwLCAweGY4LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Owp9CmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9kaXIgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmx1ZSBcCgktZGF0YSAkZmlsZV9kaXJfZGF0YSAtbWFza2RhdGEgJGZpbGVfZGlyX2RhdGEKdW5zZXQgZmlsZV9kaXJfZGF0YQoKc2V0IGZpbGVfdXBsZXZlbF9kYXRhIHsKI2RlZmluZSB1cF93aWR0aCAxNQojZGVmaW5lIHVwX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciB1cF9iaXRzW10gPSB7CiAgMHg4MCwgMHgwMCwgMHhjMCwgMHgwMSwgMHhlMCwgMHgwMywgMHhmMCwgMHgwNywgMHhmOCwgMHgwZiwgMHhmYywgMHgxZiwKICAweGZlLCAweDNmLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLAogIDB4YzAsIDB4MDEsIDB4YzAsIDB4MDEsIDB4MDAsIDB4MDB9Owp9CmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV91cGxldmVsIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIHJlZCBcCgktZGF0YSAkZmlsZV91cGxldmVsX2RhdGEgLW1hc2tkYXRhICRmaWxlX3VwbGV2ZWxfZGF0YQp1bnNldCBmaWxlX3VwbGV2ZWxfZGF0YQoKc2V0IHVpX2luZGV4IC52cGFuZS5maWxlcy5pbmRleC5saXN0CnNldCB1aV93b3JrZGlyIC52cGFuZS5maWxlcy53b3JrZGlyLmxpc3QKCnNldCBhbGxfaWNvbnMoXyR1aV9pbmRleCkgICBmaWxlX3BsYWluCnNldCBhbGxfaWNvbnMoQSR1aV9pbmRleCkgICBmaWxlX2Z1bGx0aWNrCnNldCBhbGxfaWNvbnMoTSR1aV9pbmRleCkgICBmaWxlX2Z1bGx0aWNrCnNldCBhbGxfaWNvbnMoRCR1aV9pbmRleCkgICBmaWxlX3JlbW92ZWQKc2V0IGFsbF9pY29ucyhVJHVpX2luZGV4KSAgIGZpbGVfbWVyZ2UKCnNldCBhbGxfaWNvbnMoXyR1aV93b3JrZGlyKSBmaWxlX3BsYWluCnNldCBhbGxfaWNvbnMoTSR1aV93b3JrZGlyKSBmaWxlX21vZApzZXQgYWxsX2ljb25zKEQkdWlfd29ya2RpcikgZmlsZV9xdWVzdGlvbgpzZXQgYWxsX2ljb25zKFUkdWlfd29ya2RpcikgZmlsZV9tZXJnZQpzZXQgYWxsX2ljb25zKE8kdWlfd29ya2RpcikgZmlsZV9wbGFpbgoKc2V0IG1heF9zdGF0dXNfZGVzYyAwCmZvcmVhY2ggaSB7CgkJe19fICJVbm1vZGlmaWVkIn0KCgkJe19NICJNb2RpZmllZCwgbm90IHN0YWdlZCJ9CgkJe01fICJTdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe01NICJQb3J0aW9ucyBzdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe01EICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyJ9CgoJCXtfTyAiVW50cmFja2VkLCBub3Qgc3RhZ2VkIn0KCQl7QV8gIlN0YWdlZCBmb3IgY29tbWl0In0KCQl7QU0gIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0In0KCQl7QUQgIlN0YWdlZCBmb3IgY29tbWl0LCBtaXNzaW5nIn0KCgkJe19EICJNaXNzaW5nIn0KCQl7RF8gIlN0YWdlZCBmb3IgcmVtb3ZhbCJ9CgkJe0RPICJTdGFnZWQgZm9yIHJlbW92YWwsIHN0aWxsIHByZXNlbnQifQoKCQl7VV8gIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJCXtVVSAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiJ9CgkJe1VNICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIn0KCQl7VUQgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJfSB7CglpZiB7JG1heF9zdGF0dXNfZGVzYyA8IFtzdHJpbmcgbGVuZ3RoIFtsaW5kZXggJGkgMV1dfSB7CgkJc2V0IG1heF9zdGF0dXNfZGVzYyBbc3RyaW5nIGxlbmd0aCBbbGluZGV4ICRpIDFdXQoJfQoJc2V0IGFsbF9kZXNjcyhbbGluZGV4ICRpIDBdKSBbbGluZGV4ICRpIDFdCn0KdW5zZXQgaQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyB1dGlsCgpwcm9jIGJpbmRfYnV0dG9uMyB7dyBjbWR9IHsKCWJpbmQgJHcgPEFueS1CdXR0b24tMz4gJGNtZAoJaWYge1tpc19NYWNPU1hdfSB7CgkJYmluZCAkdyA8Q29udHJvbC1CdXR0b24tMT4gJGNtZAoJfQp9Cgpwcm9jIHNjcm9sbGJhcjJtYW55IHtsaXN0IG1vZGUgYXJnc30gewoJZm9yZWFjaCB3ICRsaXN0IHtldmFsICR3ICRtb2RlICRhcmdzfQp9Cgpwcm9jIG1hbnkyc2Nyb2xsYmFyIHtsaXN0IG1vZGUgc2IgdG9wIGJvdHRvbX0gewoJJHNiIHNldCAkdG9wICRib3R0b20KCWZvcmVhY2ggdyAkbGlzdCB7JHcgJG1vZGUgbW92ZXRvICR0b3B9Cn0KCnByb2MgaW5jcl9mb250X3NpemUge2ZvbnQge2FtdCAxfX0gewoJc2V0IHN6IFtmb250IGNvbmZpZ3VyZSAkZm9udCAtc2l6ZV0KCWluY3Igc3ogJGFtdAoJZm9udCBjb25maWd1cmUgJGZvbnQgLXNpemUgJHN6Cglmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCAtc2l6ZSAkc3oKfQoKcHJvYyBob29rX2ZhaWxlZF9wb3B1cCB7aG9vayBtc2d9IHsKCXNldCB3IC5ob29rZmFpbAoJdG9wbGV2ZWwgJHcKCglmcmFtZSAkdy5tCglsYWJlbCAkdy5tLmwxIC10ZXh0ICIkaG9vayBob29rIGZhaWxlZDoiIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1mb250IGZvbnRfdWlib2xkCgl0ZXh0ICR3Lm0udCBcCgkJLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggODAgLWhlaWdodCAxMCBcCgkJLWZvbnQgZm9udF9kaWZmIFwKCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubS5zYnkgc2V0XQoJbGFiZWwgJHcubS5sMiBcCgkJLXRleHQge1lvdSBtdXN0IGNvcnJlY3QgdGhlIGFib3ZlIGVycm9ycyBiZWZvcmUgY29tbWl0dGluZy59IFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1mb250IGZvbnRfdWlib2xkCglzY3JvbGxiYXIgJHcubS5zYnkgLWNvbW1hbmQgW2xpc3QgJHcubS50IHl2aWV3XQoJcGFjayAkdy5tLmwxIC1zaWRlIHRvcCAtZmlsbCB4CglwYWNrICR3Lm0ubDIgLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcubS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5tLnQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeCA1IC1wYWR5IDEwCgoJJHcubS50IGluc2VydCAxLjAgJG1zZwoJJHcubS50IGNvbmYgLXN0YXRlIGRpc2FibGVkCgoJYnV0dG9uICR3Lm9rIC10ZXh0IE9LIFwKCQktd2lkdGggMTUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kICJkZXN0cm95ICR3IgoJcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWFuY2hvciBlIC1wYWR5IDEwIC1wYWR4IDEwCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgoJYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogZXJyb3IiCgl0a3dhaXQgd2luZG93ICR3Cn0KCnNldCBuZXh0X2NvbnNvbGVfaWQgMAoKcHJvYyBuZXdfY29uc29sZSB7c2hvcnRfdGl0bGUgbG9uZ190aXRsZX0gewoJZ2xvYmFsIG5leHRfY29uc29sZV9pZCBjb25zb2xlX2RhdGEKCXNldCB3IC5jb25zb2xlW2luY3IgbmV4dF9jb25zb2xlX2lkXQoJc2V0IGNvbnNvbGVfZGF0YSgkdykgW2xpc3QgJHNob3J0X3RpdGxlICRsb25nX3RpdGxlXQoJcmV0dXJuIFtjb25zb2xlX2luaXQgJHddCn0KCnByb2MgY29uc29sZV9pbml0IHt3fSB7CglnbG9iYWwgY29uc29sZV9jciBjb25zb2xlX2RhdGEgTTFCCgoJc2V0IGNvbnNvbGVfY3IoJHcpIDEuMAoJdG9wbGV2ZWwgJHcKCWZyYW1lICR3Lm0KCWxhYmVsICR3Lm0ubDEgLXRleHQgIltsaW5kZXggJGNvbnNvbGVfZGF0YSgkdykgMV06IiBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktZm9udCBmb250X3VpYm9sZAoJdGV4dCAkdy5tLnQgXAoJCS1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLXdpZHRoIDgwIC1oZWlnaHQgMTAgXAoJCS1mb250IGZvbnRfZGlmZiBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubS5zYnkgc2V0XQoJbGFiZWwgJHcubS5zIC10ZXh0IHtXb3JraW5nLi4uIHBsZWFzZSB3YWl0Li4ufSBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktZm9udCBmb250X3VpYm9sZAoJc2Nyb2xsYmFyICR3Lm0uc2J5IC1jb21tYW5kIFtsaXN0ICR3Lm0udCB5dmlld10KCXBhY2sgJHcubS5sMSAtc2lkZSB0b3AgLWZpbGwgeAoJcGFjayAkdy5tLnMgLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcubS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5tLnQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeCA1IC1wYWR5IDEwCgoJbWVudSAkdy5jdHhtIC10ZWFyb2ZmIDAKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJDb3B5IiBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgInRrX3RleHRDb3B5ICR3Lm0udCIKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJTZWxlY3QgQWxsIiBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgImZvY3VzICR3Lm0udDskdy5tLnQgdGFnIGFkZCBzZWwgMC4wIGVuZCIKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJDb3B5IEFsbCIgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kICIKCQkJJHcubS50IHRhZyBhZGQgc2VsIDAuMCBlbmQKCQkJdGtfdGV4dENvcHkgJHcubS50CgkJCSR3Lm0udCB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kCgkJIgoKCWJ1dHRvbiAkdy5vayAtdGV4dCB7Q2xvc2V9IFwKCQktZm9udCBmb250X3VpIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS1jb21tYW5kICJkZXN0cm95ICR3IgoJcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWFuY2hvciBlIC1wYWR5IDEwIC1wYWR4IDEwCgoJYmluZF9idXR0b24zICR3Lm0udCAidGtfcG9wdXAgJHcuY3R4bSAlWCAlWSIKCWJpbmQgJHcubS50IDwkTTFCLUtleS1hPiAiJHcubS50IHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWsiCgliaW5kICR3Lm0udCA8JE0xQi1LZXktQT4gIiR3Lm0udCB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrIgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImZvY3VzICR3IgoJd20gdGl0bGUgJHcgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IFtsaW5kZXggJGNvbnNvbGVfZGF0YSgkdykgMF0iCglyZXR1cm4gJHcKfQoKcHJvYyBjb25zb2xlX2V4ZWMge3cgY21kIGFmdGVyfSB7CgkjIC0tIEN5Z3dpbidzIFRjbCB0b3NzZXMgdGhlIGVudmlyb21lbnQgd2hlbiB3ZSBleGVjIG91ciBjaGlsZC4KCSMgICAgQnV0IG1vc3QgdXNlcnMgbmVlZCB0aGF0IHNvIHdlIGhhdmUgdG8gcmVsb2dpbi4gOi0oCgkjCglpZiB7W2lzX0N5Z3dpbl19IHsKCQlzZXQgY21kIFtsaXN0IHNoIC0tbG9naW4gLWMgImNkIFwiW3B3ZF1cIiAmJiBbam9pbiAkY21kIHsgfV0iXQoJfQoKCSMgLS0gVGNsIHdvbid0IGxldCB1cyByZWRpcmVjdCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIHRvCgkjICAgIHRoZSBzYW1lIHBpcGUuICBTbyBwYXNzIGl0IHRocm91Z2ggY2F0Li4uCgkjCglzZXQgY21kIFtjb25jYXQgfCAkY21kIHwmIGNhdF0KCglzZXQgZmRfZiBbb3BlbiAkY21kIHJdCglmY29uZmlndXJlICRmZF9mIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmRfZiByZWFkYWJsZSBbbGlzdCBjb25zb2xlX3JlYWQgJHcgJGZkX2YgJGFmdGVyXQp9Cgpwcm9jIGNvbnNvbGVfcmVhZCB7dyBmZCBhZnRlcn0gewoJZ2xvYmFsIGNvbnNvbGVfY3IKCglzZXQgYnVmIFtyZWFkICRmZF0KCWlmIHskYnVmIG5lIHt9fSB7CgkJaWYgeyFbd2luZm8gZXhpc3RzICR3XX0ge2NvbnNvbGVfaW5pdCAkd30KCQkkdy5tLnQgY29uZiAtc3RhdGUgbm9ybWFsCgkJc2V0IGMgMAoJCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZdCgkJd2hpbGUgeyRjIDwgJG59IHsKCQkJc2V0IGNyIFtzdHJpbmcgZmlyc3QgIlxyIiAkYnVmICRjXQoJCQlzZXQgbGYgW3N0cmluZyBmaXJzdCAiXG4iICRidWYgJGNdCgkJCWlmIHskY3IgPCAwfSB7c2V0IGNyIFtleHByIHskbiArIDF9XX0KCQkJaWYgeyRsZiA8IDB9IHtzZXQgbGYgW2V4cHIgeyRuICsgMX1dfQoKCQkJaWYgeyRsZiA8ICRjcn0gewoJCQkJJHcubS50IGluc2VydCBlbmQgW3N0cmluZyByYW5nZSAkYnVmICRjICRsZl0KCQkJCXNldCBjb25zb2xlX2NyKCR3KSBbJHcubS50IGluZGV4IHtlbmQgLTFjfV0KCQkJCXNldCBjICRsZgoJCQkJaW5jciBjCgkJCX0gZWxzZSB7CgkJCQkkdy5tLnQgZGVsZXRlICRjb25zb2xlX2NyKCR3KSBlbmQKCQkJCSR3Lm0udCBpbnNlcnQgZW5kICJcbiIKCQkJCSR3Lm0udCBpbnNlcnQgZW5kIFtzdHJpbmcgcmFuZ2UgJGJ1ZiAkYyAkY3JdCgkJCQlzZXQgYyAkY3IKCQkJCWluY3IgYwoJCQl9CgkJfQoJCSR3Lm0udCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJCSR3Lm0udCBzZWUgZW5kCgl9CgoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDEKCWlmIHtbZW9mICRmZF19IHsKCQlpZiB7W2NhdGNoIHtjbG9zZSAkZmR9XX0gewoJCQlzZXQgb2sgMAoJCX0gZWxzZSB7CgkJCXNldCBvayAxCgkJfQoJCXVwbGV2ZWwgIzAgJGFmdGVyICR3ICRvawoJCXJldHVybgoJfQoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAKfQoKcHJvYyBjb25zb2xlX2NoYWluIHtjbWRsaXN0IHcge29rIDF9fSB7CglpZiB7JG9rfSB7CgkJaWYge1tsbGVuZ3RoICRjbWRsaXN0XSA9PSAwfSB7CgkJCWNvbnNvbGVfZG9uZSAkdyAkb2sKCQkJcmV0dXJuCgkJfQoKCQlzZXQgY21kIFtsaW5kZXggJGNtZGxpc3QgMF0KCQlzZXQgY21kbGlzdCBbbHJhbmdlICRjbWRsaXN0IDEgZW5kXQoKCQlpZiB7W2xpbmRleCAkY21kIDBdIGVxIHtjb25zb2xlX2V4ZWN9fSB7CgkJCWNvbnNvbGVfZXhlYyAkdyBcCgkJCQlbbGluZGV4ICRjbWQgMV0gXAoJCQkJW2xpc3QgY29uc29sZV9jaGFpbiAkY21kbGlzdF0KCQl9IGVsc2UgewoJCQl1cGxldmVsICMwICRjbWQgJGNtZGxpc3QgJHcgJG9rCgkJfQoJfSBlbHNlIHsKCQljb25zb2xlX2RvbmUgJHcgJG9rCgl9Cn0KCnByb2MgY29uc29sZV9kb25lIHthcmdzfSB7CglnbG9iYWwgY29uc29sZV9jciBjb25zb2xlX2RhdGEKCglzd2l0Y2ggLS0gW2xsZW5ndGggJGFyZ3NdIHsKCTIgewoJCXNldCB3IFtsaW5kZXggJGFyZ3MgMF0KCQlzZXQgb2sgW2xpbmRleCAkYXJncyAxXQoJfQoJMyB7CgkJc2V0IHcgW2xpbmRleCAkYXJncyAxXQoJCXNldCBvayBbbGluZGV4ICRhcmdzIDJdCgl9CglkZWZhdWx0IHsKCQllcnJvciAid3JvbmcgbnVtYmVyIG9mIGFyZ3M6IGNvbnNvbGVfZG9uZSA/aWdub3JlZD8gdyBvayIKCX0KCX0KCglpZiB7JG9rfSB7CgkJaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CgkJCSR3Lm0ucyBjb25mIC1iYWNrZ3JvdW5kIGdyZWVuIC10ZXh0IHtTdWNjZXNzfQoJCQkkdy5vayBjb25mIC1zdGF0ZSBub3JtYWwKCQl9Cgl9IGVsc2UgewoJCWlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsKCQkJY29uc29sZV9pbml0ICR3CgkJfQoJCSR3Lm0ucyBjb25mIC1iYWNrZ3JvdW5kIHJlZCAtdGV4dCB7RXJyb3I6IENvbW1hbmQgRmFpbGVkfQoJCSR3Lm9rIGNvbmYgLXN0YXRlIG5vcm1hbAoJfQoKCWFycmF5IHVuc2V0IGNvbnNvbGVfY3IgJHcKCWFycmF5IHVuc2V0IGNvbnNvbGVfZGF0YSAkdwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGNvbW1hbmRzCgpzZXQgc3RhcnRpbmdfZ2l0a19tc2cge1N0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi59Cgpwcm9jIGRvX2dpdGsge3JldnN9IHsKCWdsb2JhbCBlbnYgdWlfc3RhdHVzX3ZhbHVlIHN0YXJ0aW5nX2dpdGtfbXNnCgoJIyAtLSBBbHdheXMgc3RhcnQgZ2l0ayB0aHJvdWdoIHdoYXRldmVyIHdlIHdlcmUgbG9hZGVkIHdpdGguICBUaGlzCgkjICAgIGxldHMgdXMgYnlwYXNzIHVzaW5nIHNoZWxsIHByb2Nlc3Mgb24gV2luZG93cyBzeXN0ZW1zLgoJIwoJc2V0IGNtZCBbaW5mbyBuYW1lb2ZleGVjdXRhYmxlXQoJbGFwcGVuZCBjbWQgW2dpdGV4ZWMgZ2l0a10KCWlmIHskcmV2cyBuZSB7fX0gewoJCWFwcGVuZCBjbWQgeyB9CgkJYXBwZW5kIGNtZCAkcmV2cwoJfQoKCWlmIHtbY2F0Y2gge2V2YWwgZXhlYyAkY21kICZ9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvIHN0YXJ0IGdpdGs6XG5cbiRlcnIiCgl9IGVsc2UgewoJCXNldCB1aV9zdGF0dXNfdmFsdWUgJHN0YXJ0aW5nX2dpdGtfbXNnCgkJYWZ0ZXIgMTAwMDAgewoJCQlpZiB7JHVpX3N0YXR1c192YWx1ZSBlcSAkc3RhcnRpbmdfZ2l0a19tc2d9IHsKCQkJCXNldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln0KCQkJfQoJCX0KCX0KfQoKcHJvYyBkb19zdGF0cyB7fSB7CglzZXQgZmQgW29wZW4gInwgZ2l0IGNvdW50LW9iamVjdHMgLXYiIHJdCgl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID4gMH0gewoJCWlmIHtbcmVnZXhwIHteKFteOl0rKTogKFxkKykkfSAkbGluZSBfIG5hbWUgdmFsdWVdfSB7CgkJCXNldCBzdGF0cygkbmFtZSkgJHZhbHVlCgkJfQoJfQoJY2xvc2UgJGZkCgoJc2V0IHBhY2tlZF9zeiAwCglmb3JlYWNoIHAgW2dsb2IgLWRpcmVjdG9yeSBbZ2l0ZGlyIG9iamVjdHMgcGFja10gXAoJCS10eXBlIGYgXAoJCS1ub2NvbXBsYWluIC0tICpdIHsKCQlpbmNyIHBhY2tlZF9zeiBbZmlsZSBzaXplICRwXQoJfQoJaWYgeyRwYWNrZWRfc3ogPiAwfSB7CgkJc2V0IHN0YXRzKHNpemUtcGFjaykgW2V4cHIgeyRwYWNrZWRfc3ogLyAxMDI0fV0KCX0KCglzZXQgdyAuc3RhdHNfdmlldwoJdG9wbGV2ZWwgJHcKCXdtIGdlb21ldHJ5ICR3ICIrW3dpbmZvIHJvb3R4IC5dK1t3aW5mbyByb290eSAuXSIKCglsYWJlbCAkdy5oZWFkZXIgLXRleHQge0RhdGFiYXNlIFN0YXRpc3RpY3N9IFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zIC1ib3JkZXIgMQoJYnV0dG9uICR3LmJ1dHRvbnMuY2xvc2UgLXRleHQgQ2xvc2UgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglidXR0b24gJHcuYnV0dG9ucy5nYyAtdGV4dCB7Q29tcHJlc3MgRGF0YWJhc2V9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCAiZGVzdHJveSAkdztkb19nYyIKCXBhY2sgJHcuYnV0dG9ucy5jbG9zZSAtc2lkZSByaWdodAoJcGFjayAkdy5idXR0b25zLmdjIC1zaWRlIGxlZnQKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWZyYW1lICR3LnN0YXQgLWJvcmRlcndpZHRoIDEgLXJlbGllZiBzb2xpZAoJZm9yZWFjaCBzIHsKCQl7Y291bnQgICAgICAgICAgIHtOdW1iZXIgb2YgbG9vc2Ugb2JqZWN0c319CgkJe3NpemUgICAgICAgICAgICB7RGlzayBzcGFjZSB1c2VkIGJ5IGxvb3NlIG9iamVjdHN9IHsgS2lCfX0KCQl7aW4tcGFjayAgICAgICAgIHtOdW1iZXIgb2YgcGFja2VkIG9iamVjdHN9fQoJCXtwYWNrcyAgICAgICAgICAge051bWJlciBvZiBwYWNrc319CgkJe3NpemUtcGFjayAgICAgICB7RGlzayBzcGFjZSB1c2VkIGJ5IHBhY2tlZCBvYmplY3RzfSB7IEtpQn19CgkJe3BydW5lLXBhY2thYmxlICB7UGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZ319CgkJe2dhcmJhZ2UgICAgICAgICB7R2FyYmFnZSBmaWxlc319CgkJfSB7CgkJc2V0IG5hbWUgW2xpbmRleCAkcyAwXQoJCXNldCBsYWJlbCBbbGluZGV4ICRzIDFdCgkJaWYge1tjYXRjaCB7c2V0IHZhbHVlICRzdGF0cygkbmFtZSl9XX0gY29udGludWUKCQlpZiB7W2xsZW5ndGggJHNdID4gMn0gewoJCQlzZXQgdmFsdWUgIiR2YWx1ZVtsaW5kZXggJHMgMl0iCgkJfQoKCQlsYWJlbCAkdy5zdGF0LmxfJG5hbWUgLXRleHQgIiRsYWJlbDoiIC1hbmNob3IgdyAtZm9udCBmb250X3VpCgkJbGFiZWwgJHcuc3RhdC52XyRuYW1lIC10ZXh0ICR2YWx1ZSAtYW5jaG9yIHcgLWZvbnQgZm9udF91aQoJCWdyaWQgJHcuc3RhdC5sXyRuYW1lICR3LnN0YXQudl8kbmFtZSAtc3RpY2t5IHdlIC1wYWR4IHswIDV9Cgl9CglwYWNrICR3LnN0YXQgLXBhZHkgMTAgLXBhZHggMTAKCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQoJYmluZCAkdyA8S2V5LVJldHVybj4gW2xpc3QgZGVzdHJveSAkd10KCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBEYXRhYmFzZSBTdGF0aXN0aWNzIgoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIGRvX2djIHt9IHsKCXNldCB3IFtuZXdfY29uc29sZSB7Z2N9IHtDb21wcmVzc2luZyB0aGUgb2JqZWN0IGRhdGFiYXNlfV0KCWNvbnNvbGVfY2hhaW4gewoJCXtjb25zb2xlX2V4ZWMge2dpdCBwYWNrLXJlZnMgLS1wcnVuZX19CgkJe2NvbnNvbGVfZXhlYyB7Z2l0IHJlZmxvZyBleHBpcmUgLS1hbGx9fQoJCXtjb25zb2xlX2V4ZWMge2dpdCByZXBhY2sgLWEgLWQgLWx9fQoJCXtjb25zb2xlX2V4ZWMge2dpdCByZXJlcmUgZ2N9fQoJfSAkdwp9Cgpwcm9jIGRvX2ZzY2tfb2JqZWN0cyB7fSB7CglzZXQgdyBbbmV3X2NvbnNvbGUge2ZzY2stb2JqZWN0c30gXAoJCXtWZXJpZnlpbmcgdGhlIG9iamVjdCBkYXRhYmFzZSB3aXRoIGZzY2stb2JqZWN0c31dCglzZXQgY21kIFtsaXN0IGdpdCBmc2NrLW9iamVjdHNdCglsYXBwZW5kIGNtZCAtLWZ1bGwKCWxhcHBlbmQgY21kIC0tY2FjaGUKCWxhcHBlbmQgY21kIC0tc3RyaWN0Cgljb25zb2xlX2V4ZWMgJHcgJGNtZCBjb25zb2xlX2RvbmUKfQoKc2V0IGlzX3F1aXR0aW5nIDAKCnByb2MgZG9fcXVpdCB7fSB7CglnbG9iYWwgdWlfY29tbSBpc19xdWl0dGluZyByZXBvX2NvbmZpZyBjb21taXRfdHlwZQoKCWlmIHskaXNfcXVpdHRpbmd9IHJldHVybgoJc2V0IGlzX3F1aXR0aW5nIDEKCglpZiB7W3dpbmZvIGV4aXN0cyAkdWlfY29tbV19IHsKCQkjIC0tIFN0YXNoIG91ciBjdXJyZW50IGNvbW1pdCBidWZmZXIuCgkJIwoJCXNldCBzYXZlIFtnaXRkaXIgR0lUR1VJX01TR10KCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSBbJHVpX2NvbW0gZ2V0IDAuMCBlbmRdXQoJCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFxyXHRdKyR9ICRtc2cge30gbXNnCgkJaWYgeyghW3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQoJCQl8fCBbJHVpX2NvbW0gZWRpdCBtb2RpZmllZF0pCgkJCSYmICRtc2cgbmUge319IHsKCQkJY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRzYXZlIHddCgkJCQlwdXRzIC1ub25ld2xpbmUgJGZkICRtc2cKCQkJCWNsb3NlICRmZAoJCQl9CgkJfSBlbHNlIHsKCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRzYXZlfQoJCX0KCgkJIyAtLSBTdGFzaCBvdXIgY3VycmVudCB3aW5kb3cgZ2VvbWV0cnkgaW50byB0aGlzIHJlcG9zaXRvcnkuCgkJIwoJCXNldCBjZmdfZ2VvbWV0cnkgW2xpc3RdCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW3dtIGdlb21ldHJ5IC5dCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW2xpbmRleCBbLnZwYW5lIHNhc2ggY29vcmQgMF0gMV0KCQlsYXBwZW5kIGNmZ19nZW9tZXRyeSBbbGluZGV4IFsudnBhbmUuZmlsZXMgc2FzaCBjb29yZCAwXSAwXQoJCWlmIHtbY2F0Y2gge3NldCByY19nZW9tZXRyeSAkcmVwb19jb25maWcoZ3VpLmdlb21ldHJ5KX1dfSB7CgkJCXNldCByY19nZW9tZXRyeSB7fQoJCX0KCQlpZiB7JGNmZ19nZW9tZXRyeSBuZSAkcmNfZ2VvbWV0cnl9IHsKCQkJY2F0Y2gge2V4ZWMgZ2l0IGNvbmZpZyBndWkuZ2VvbWV0cnkgJGNmZ19nZW9tZXRyeX0KCQl9Cgl9CgoJZGVzdHJveSAuCn0KCnByb2MgZG9fcmVzY2FuIHt9IHsKCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KfQoKcHJvYyB1bnN0YWdlX2hlbHBlciB7dHh0IHBhdGhzfSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7IVtsb2NrX2luZGV4IGJlZ2luLXVwZGF0ZV19IHJldHVybgoKCXNldCBwYXRoTGlzdCBbbGlzdF0KCXNldCBhZnRlciB7fQoJZm9yZWFjaCBwYXRoICRwYXRocyB7CgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJQT8gLQoJCU0/IC0KCQlEPyB7CgkJCWxhcHBlbmQgcGF0aExpc3QgJHBhdGgKCQkJaWYgeyRwYXRoIGVxICRjdXJyZW50X2RpZmZfcGF0aH0gewoJCQkJc2V0IGFmdGVyIHtyZXNob3dfZGlmZjt9CgkJCX0KCQl9CgkJfQoJfQoJaWYgeyRwYXRoTGlzdCBlcSB7fX0gewoJCXVubG9ja19pbmRleAoJfSBlbHNlIHsKCQl1cGRhdGVfaW5kZXhpbmZvIFwKCQkJJHR4dCBcCgkJCSRwYXRoTGlzdCBcCgkJCVtjb25jYXQgJGFmdGVyIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59fV0KCX0KfQoKcHJvYyBkb191bnN0YWdlX3NlbGVjdGlvbiB7fSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggc2VsZWN0ZWRfcGF0aHMKCglpZiB7W2FycmF5IHNpemUgc2VsZWN0ZWRfcGF0aHNdID4gMH0gewoJCXVuc3RhZ2VfaGVscGVyIFwKCQkJe1Vuc3RhZ2luZyBzZWxlY3RlZCBmaWxlcyBmcm9tIGNvbW1pdH0gXAoJCQlbYXJyYXkgbmFtZXMgc2VsZWN0ZWRfcGF0aHNdCgl9IGVsc2VpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIG5lIHt9fSB7CgkJdW5zdGFnZV9oZWxwZXIgXAoJCQkiVW5zdGFnaW5nIFtzaG9ydF9wYXRoICRjdXJyZW50X2RpZmZfcGF0aF0gZnJvbSBjb21taXQiIFwKCQkJW2xpc3QgJGN1cnJlbnRfZGlmZl9wYXRoXQoJfQp9Cgpwcm9jIGFkZF9oZWxwZXIge3R4dCBwYXRoc30gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIGN1cnJlbnRfZGlmZl9wYXRoCgoJaWYgeyFbbG9ja19pbmRleCBiZWdpbi11cGRhdGVdfSByZXR1cm4KCglzZXQgcGF0aExpc3QgW2xpc3RdCglzZXQgYWZ0ZXIge30KCWZvcmVhY2ggcGF0aCAkcGF0aHMgewoJCXN3aXRjaCAtZ2xvYiAtLSBbbGluZGV4ICRmaWxlX3N0YXRlcygkcGF0aCkgMF0gewoJCV9PIC0KCQk/TSAtCgkJP0QgLQoJCVU/IHsKCQkJbGFwcGVuZCBwYXRoTGlzdCAkcGF0aAoJCQlpZiB7JHBhdGggZXEgJGN1cnJlbnRfZGlmZl9wYXRofSB7CgkJCQlzZXQgYWZ0ZXIge3Jlc2hvd19kaWZmO30KCQkJfQoJCX0KCQl9Cgl9CglpZiB7JHBhdGhMaXN0IGVxIHt9fSB7CgkJdW5sb2NrX2luZGV4Cgl9IGVsc2UgewoJCXVwZGF0ZV9pbmRleCBcCgkJCSR0eHQgXAoJCQkkcGF0aExpc3QgXAoJCQlbY29uY2F0ICRhZnRlciB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkgdG8gY29tbWl0Ln19XQoJfQp9Cgpwcm9jIGRvX2FkZF9zZWxlY3Rpb24ge30gewoJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIHNlbGVjdGVkX3BhdGhzCgoJaWYge1thcnJheSBzaXplIHNlbGVjdGVkX3BhdGhzXSA+IDB9IHsKCQlhZGRfaGVscGVyIFwKCQkJe0FkZGluZyBzZWxlY3RlZCBmaWxlc30gXAoJCQlbYXJyYXkgbmFtZXMgc2VsZWN0ZWRfcGF0aHNdCgl9IGVsc2VpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIG5lIHt9fSB7CgkJYWRkX2hlbHBlciBcCgkJCSJBZGRpbmcgW3Nob3J0X3BhdGggJGN1cnJlbnRfZGlmZl9wYXRoXSIgXAoJCQlbbGlzdCAkY3VycmVudF9kaWZmX3BhdGhdCgl9Cn0KCnByb2MgZG9fYWRkX2FsbCB7fSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMKCglzZXQgcGF0aHMgW2xpc3RdCglmb3JlYWNoIHBhdGggW2FycmF5IG5hbWVzIGZpbGVfc3RhdGVzXSB7CgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJVT8ge2NvbnRpbnVlfQoJCT9NIC0KCQk/RCB7bGFwcGVuZCBwYXRocyAkcGF0aH0KCQl9Cgl9CglhZGRfaGVscGVyIHtBZGRpbmcgYWxsIGNoYW5nZWQgZmlsZXN9ICRwYXRocwp9Cgpwcm9jIHJldmVydF9oZWxwZXIge3R4dCBwYXRoc30gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIGN1cnJlbnRfZGlmZl9wYXRoCgoJaWYgeyFbbG9ja19pbmRleCBiZWdpbi11cGRhdGVdfSByZXR1cm4KCglzZXQgcGF0aExpc3QgW2xpc3RdCglzZXQgYWZ0ZXIge30KCWZvcmVhY2ggcGF0aCAkcGF0aHMgewoJCXN3aXRjaCAtZ2xvYiAtLSBbbGluZGV4ICRmaWxlX3N0YXRlcygkcGF0aCkgMF0gewoJCVU/IHtjb250aW51ZX0KCQk/TSAtCgkJP0QgewoJCQlsYXBwZW5kIHBhdGhMaXN0ICRwYXRoCgkJCWlmIHskcGF0aCBlcSAkY3VycmVudF9kaWZmX3BhdGh9IHsKCQkJCXNldCBhZnRlciB7cmVzaG93X2RpZmY7fQoJCQl9CgkJfQoJCX0KCX0KCglzZXQgbiBbbGxlbmd0aCAkcGF0aExpc3RdCglpZiB7JG4gPT0gMH0gewoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfSBlbHNlaWYgeyRuID09IDF9IHsKCQlzZXQgcyAiW3Nob3J0X3BhdGggW2xpbmRleCAkcGF0aExpc3RdXSIKCX0gZWxzZSB7CgkJc2V0IHMgInRoZXNlICRuIGZpbGVzIgoJfQoKCXNldCByZXBseSBbdGtfZGlhbG9nIFwKCQkuY29uZmlybV9yZXZlcnQgXAoJCSJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pIiBcCgkJIlJldmVydCBjaGFuZ2VzIGluICRzPwoKQW55IHVuYWRkZWQgY2hhbmdlcyB3aWxsIGJlIHBlcm1hbmVudGx5IGxvc3QgYnkgdGhlIHJldmVydC4iIFwKCQlxdWVzdGlvbiBcCgkJMSBcCgkJe0RvIE5vdGhpbmd9IFwKCQl7UmV2ZXJ0IENoYW5nZXN9IFwKCQldCglpZiB7JHJlcGx5ID09IDF9IHsKCQljaGVja291dF9pbmRleCBcCgkJCSR0eHQgXAoJCQkkcGF0aExpc3QgXAoJCQlbY29uY2F0ICRhZnRlciB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX1dCgl9IGVsc2UgewoJCXVubG9ja19pbmRleAoJfQp9Cgpwcm9jIGRvX3JldmVydF9zZWxlY3Rpb24ge30gewoJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIHNlbGVjdGVkX3BhdGhzCgoJaWYge1thcnJheSBzaXplIHNlbGVjdGVkX3BhdGhzXSA+IDB9IHsKCQlyZXZlcnRfaGVscGVyIFwKCQkJe1JldmVydGluZyBzZWxlY3RlZCBmaWxlc30gXAoJCQlbYXJyYXkgbmFtZXMgc2VsZWN0ZWRfcGF0aHNdCgl9IGVsc2VpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIG5lIHt9fSB7CgkJcmV2ZXJ0X2hlbHBlciBcCgkJCSJSZXZlcnRpbmcgW3Nob3J0X3BhdGggJGN1cnJlbnRfZGlmZl9wYXRoXSIgXAoJCQlbbGlzdCAkY3VycmVudF9kaWZmX3BhdGhdCgl9Cn0KCnByb2MgZG9fc2lnbm9mZiB7fSB7CglnbG9iYWwgdWlfY29tbQoKCXNldCBtZSBbY29tbWl0dGVyX2lkZW50XQoJaWYgeyRtZSBlcSB7fX0gcmV0dXJuCgoJc2V0IHNvYiAiU2lnbmVkLW9mZi1ieTogJG1lIgoJc2V0IGxhc3QgWyR1aV9jb21tIGdldCB7ZW5kIC0xYyBsaW5lc3RhcnR9IHtlbmQgLTFjfV0KCWlmIHskbGFzdCBuZSAkc29ifSB7CgkJJHVpX2NvbW0gZWRpdCBzZXBhcmF0b3IKCQlpZiB7JGxhc3QgbmUge30KCQkJJiYgIVtyZWdleHAge15bQS1aXVtBLVphLXpdKi1bQS1aYS16LV0rOiAqfSAkbGFzdF19IHsKCQkJJHVpX2NvbW0gaW5zZXJ0IGVuZCAiXG4iCgkJfQoJCSR1aV9jb21tIGluc2VydCBlbmQgIlxuJHNvYiIKCQkkdWlfY29tbSBlZGl0IHNlcGFyYXRvcgoJCSR1aV9jb21tIHNlZSBlbmQKCX0KfQoKcHJvYyBkb19zZWxlY3RfY29tbWl0X3R5cGUge30gewoJZ2xvYmFsIGNvbW1pdF90eXBlIHNlbGVjdGVkX2NvbW1pdF90eXBlCgoJaWYgeyRzZWxlY3RlZF9jb21taXRfdHlwZSBlcSB7bmV3fQoJCSYmIFtzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV19IHsKCQljcmVhdGVfbmV3X2NvbW1pdAoJfSBlbHNlaWYgeyRzZWxlY3RlZF9jb21taXRfdHlwZSBlcSB7YW1lbmR9CgkJJiYgIVtzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV19IHsKCQlsb2FkX2xhc3RfY29tbWl0CgoJCSMgVGhlIGFtZW5kIHJlcXVlc3Qgd2FzIHJlamVjdGVkLi4uCgkJIwoJCWlmIHshW3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0gewoJCQlzZXQgc2VsZWN0ZWRfY29tbWl0X3R5cGUgbmV3CgkJfQoJfQp9Cgpwcm9jIGRvX2NvbW1pdCB7fSB7Cgljb21taXRfdHJlZQp9Cgpwcm9jIGRvX2Fib3V0IHt9IHsKCWdsb2JhbCBhcHB2ZXJzIGNvcHlyaWdodAoJZ2xvYmFsIHRjbF9wYXRjaExldmVsIHRrX3BhdGNoTGV2ZWwKCglzZXQgdyAuYWJvdXRfZGlhbG9nCgl0b3BsZXZlbCAkdwoJd20gZ2VvbWV0cnkgJHcgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgoKCWxhYmVsICR3LmhlYWRlciAtdGV4dCAiQWJvdXQgW2FwcG5hbWVdIiBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcuYnV0dG9ucwoJYnV0dG9uICR3LmJ1dHRvbnMuY2xvc2UgLXRleHQge0Nsb3NlfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KCXBhY2sgJHcuYnV0dG9ucy5jbG9zZSAtc2lkZSByaWdodAoJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCgoJbGFiZWwgJHcuZGVzYyBcCgkJLXRleHQgIlthcHBuYW1lXSAtIGEgY29tbWl0IGNyZWF0aW9uIHRvb2wgZm9yIEdpdC4KJGNvcHlyaWdodCIgXAoJCS1wYWR4IDUgLXBhZHkgNSBcCgkJLWp1c3RpZnkgbGVmdCBcCgkJLWFuY2hvciB3IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzb2xpZCBcCgkJLWZvbnQgZm9udF91aQoJcGFjayAkdy5kZXNjIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDUgLXBhZHkgNQoKCXNldCB2IHt9CglhcHBlbmQgdiAiW2FwcG5hbWVdIHZlcnNpb24gJGFwcHZlcnNcbiIKCWFwcGVuZCB2ICJbZXhlYyBnaXQgdmVyc2lvbl1cbiIKCWFwcGVuZCB2ICJcbiIKCWlmIHskdGNsX3BhdGNoTGV2ZWwgZXEgJHRrX3BhdGNoTGV2ZWx9IHsKCQlhcHBlbmQgdiAiVGNsL1RrIHZlcnNpb24gJHRjbF9wYXRjaExldmVsIgoJfSBlbHNlIHsKCQlhcHBlbmQgdiAiVGNsIHZlcnNpb24gJHRjbF9wYXRjaExldmVsIgoJCWFwcGVuZCB2ICIsIFRrIHZlcnNpb24gJHRrX3BhdGNoTGV2ZWwiCgl9CgoJbGFiZWwgJHcudmVycyBcCgkJLXRleHQgJHYgXAoJCS1wYWR4IDUgLXBhZHkgNSBcCgkJLWp1c3RpZnkgbGVmdCBcCgkJLWFuY2hvciB3IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzb2xpZCBcCgkJLWZvbnQgZm9udF91aQoJcGFjayAkdy52ZXJzIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDUgLXBhZHkgNQoKCW1lbnUgJHcuY3R4bSAtdGVhcm9mZiAwCgkkdy5jdHhtIGFkZCBjb21tYW5kIFwKCQktbGFiZWwge0NvcHl9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCAiCgkJY2xpcGJvYXJkIGNsZWFyCgkJY2xpcGJvYXJkIGFwcGVuZCAtZm9ybWF0IFNUUklORyAtdHlwZSBTVFJJTkcgLS0gXFskdy52ZXJzIGNnZXQgLXRleHRcXQoJIgoKCWJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKCWJpbmQgJHcgPEtleS1Fc2NhcGU+ICJkZXN0cm95ICR3IgoJYmluZF9idXR0b24zICR3LnZlcnMgInRrX3BvcHVwICR3LmN0eG0gJVggJVk7IGdyYWIgJHc7IGZvY3VzICR3IgoJd20gdGl0bGUgJHcgIkFib3V0IFthcHBuYW1lXSIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBkb19vcHRpb25zIHt9IHsKCWdsb2JhbCByZXBvX2NvbmZpZyBnbG9iYWxfY29uZmlnIGZvbnRfZGVzY3MKCWdsb2JhbCByZXBvX2NvbmZpZ19uZXcgZ2xvYmFsX2NvbmZpZ19uZXcKCglhcnJheSB1bnNldCByZXBvX2NvbmZpZ19uZXcKCWFycmF5IHVuc2V0IGdsb2JhbF9jb25maWdfbmV3Cglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIHJlcG9fY29uZmlnXSB7CgkJc2V0IHJlcG9fY29uZmlnX25ldygkbmFtZSkgJHJlcG9fY29uZmlnKCRuYW1lKQoJfQoJbG9hZF9jb25maWcgMQoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyByZXBvX2NvbmZpZ10gewoJCXN3aXRjaCAtLSAkbmFtZSB7CgkJZ3VpLmRpZmZjb250ZXh0IHtjb250aW51ZX0KCQl9CgkJc2V0IHJlcG9fY29uZmlnX25ldygkbmFtZSkgJHJlcG9fY29uZmlnKCRuYW1lKQoJfQoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBnbG9iYWxfY29uZmlnXSB7CgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KCRuYW1lKSAkZ2xvYmFsX2NvbmZpZygkbmFtZSkKCX0KCglzZXQgdyAub3B0aW9uc19lZGl0b3IKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0ICJbYXBwbmFtZV0gT3B0aW9ucyIgXAoJCS1mb250IGZvbnRfdWlib2xkCglwYWNrICR3LmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAoKCWZyYW1lICR3LmJ1dHRvbnMKCWJ1dHRvbiAkdy5idXR0b25zLnJlc3RvcmUgLXRleHQge1Jlc3RvcmUgRGVmYXVsdHN9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBkb19yZXN0b3JlX2RlZmF1bHRzCglwYWNrICR3LmJ1dHRvbnMucmVzdG9yZSAtc2lkZSBsZWZ0CglidXR0b24gJHcuYnV0dG9ucy5zYXZlIC10ZXh0IFNhdmUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRvX3NhdmVfY29uZmlnICR3XQoJcGFjayAkdy5idXR0b25zLnNhdmUgLXNpZGUgcmlnaHQKCWJ1dHRvbiAkdy5idXR0b25zLmNhbmNlbCAtdGV4dCB7Q2FuY2VsfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KCXBhY2sgJHcuYnV0dG9ucy5jYW5jZWwgLXNpZGUgcmlnaHQgLXBhZHggNQoJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCgoJbGFiZWxmcmFtZSAkdy5yZXBvIC10ZXh0ICJbcmVwb25hbWVdIFJlcG9zaXRvcnkiIFwKCQktZm9udCBmb250X3VpCglsYWJlbGZyYW1lICR3Lmdsb2JhbCAtdGV4dCB7R2xvYmFsIChBbGwgUmVwb3NpdG9yaWVzKX0gXAoJCS1mb250IGZvbnRfdWkKCXBhY2sgJHcucmVwbyAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQoJcGFjayAkdy5nbG9iYWwgLXNpZGUgcmlnaHQgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CgoJc2V0IG9wdGlkIDAKCWZvcmVhY2ggb3B0aW9uIHsKCQl7dCB1c2VyLm5hbWUge1VzZXIgTmFtZX19CgkJe3QgdXNlci5lbWFpbCB7RW1haWwgQWRkcmVzc319CgoJCXtiIG1lcmdlLnN1bW1hcnkge1N1bW1hcml6ZSBNZXJnZSBDb21taXRzfX0KCQl7aS0xLi41IG1lcmdlLnZlcmJvc2l0eSB7TWVyZ2UgVmVyYm9zaXR5fX0KCgkJe2IgZ3VpLnRydXN0bXRpbWUgIHtUcnVzdCBGaWxlIE1vZGlmaWNhdGlvbiBUaW1lc3RhbXBzfX0KCQl7aS0xLi45OSBndWkuZGlmZmNvbnRleHQge051bWJlciBvZiBEaWZmIENvbnRleHQgTGluZXN9fQoJCXt0IGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSB7TmV3IEJyYW5jaCBOYW1lIFRlbXBsYXRlfX0KCQl9IHsKCQlzZXQgdHlwZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMV0KCQlzZXQgdGV4dCBbbGluZGV4ICRvcHRpb24gMl0KCQlpbmNyIG9wdGlkCgkJZm9yZWFjaCBmIHtyZXBvIGdsb2JhbH0gewoJCQlzd2l0Y2ggLWdsb2IgLS0gJHR5cGUgewoJCQliIHsKCQkJCWNoZWNrYnV0dG9uICR3LiRmLiRvcHRpZCAtdGV4dCAkdGV4dCBcCgkJCQkJLXZhcmlhYmxlICR7Zn1fY29uZmlnX25ldygkbmFtZSkgXAoJCQkJCS1vbnZhbHVlIHRydWUgXAoJCQkJCS1vZmZ2YWx1ZSBmYWxzZSBcCgkJCQkJLWZvbnQgZm9udF91aQoJCQkJcGFjayAkdy4kZi4kb3B0aWQgLXNpZGUgdG9wIC1hbmNob3IgdwoJCQl9CgkJCWktKiB7CgkJCQlyZWdleHAgLS0gey0oXGQrKVwuXC4oXGQrKSR9ICR0eXBlIF9qdW5rIG1pbiBtYXgKCQkJCWZyYW1lICR3LiRmLiRvcHRpZAoJCQkJbGFiZWwgJHcuJGYuJG9wdGlkLmwgLXRleHQgIiR0ZXh0OiIgLWZvbnQgZm9udF91aQoJCQkJcGFjayAkdy4kZi4kb3B0aWQubCAtc2lkZSBsZWZ0IC1hbmNob3IgdyAtZmlsbCB4CgkJCQlzcGluYm94ICR3LiRmLiRvcHRpZC52IFwKCQkJCQktdGV4dHZhcmlhYmxlICR7Zn1fY29uZmlnX25ldygkbmFtZSkgXAoJCQkJCS1mcm9tICRtaW4gXAoJCQkJCS10byAkbWF4IFwKCQkJCQktaW5jcmVtZW50IDEgXAoJCQkJCS13aWR0aCBbZXhwciB7MSArIFtzdHJpbmcgbGVuZ3RoICRtYXhdfV0gXAoJCQkJCS1mb250IGZvbnRfdWkKCQkJCWJpbmQgJHcuJGYuJG9wdGlkLnYgPEZvY3VzSW4+IHslVyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmR9CgkJCQlwYWNrICR3LiRmLiRvcHRpZC52IC1zaWRlIHJpZ2h0IC1hbmNob3IgZSAtcGFkeCA1CgkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3IC1maWxsIHgKCQkJfQoJCQl0IHsKCQkJCWZyYW1lICR3LiRmLiRvcHRpZAoJCQkJbGFiZWwgJHcuJGYuJG9wdGlkLmwgLXRleHQgIiR0ZXh0OiIgLWZvbnQgZm9udF91aQoJCQkJZW50cnkgJHcuJGYuJG9wdGlkLnYgXAoJCQkJCS1ib3JkZXJ3aWR0aCAxIFwKCQkJCQktcmVsaWVmIHN1bmtlbiBcCgkJCQkJLXdpZHRoIDIwIFwKCQkJCQktdGV4dHZhcmlhYmxlICR7Zn1fY29uZmlnX25ldygkbmFtZSkgXAoJCQkJCS1mb250IGZvbnRfdWkKCQkJCXBhY2sgJHcuJGYuJG9wdGlkLmwgLXNpZGUgbGVmdCAtYW5jaG9yIHcKCQkJCXBhY2sgJHcuJGYuJG9wdGlkLnYgLXNpZGUgbGVmdCAtYW5jaG9yIHcgXAoJCQkJCS1maWxsIHggLWV4cGFuZCAxIFwKCQkJCQktcGFkeCA1CgkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3IC1maWxsIHgKCQkJfQoJCQl9CgkJfQoJfQoKCXNldCBhbGxfZm9udHMgW2xzb3J0IFtmb250IGZhbWlsaWVzXV0KCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgZm9udCBbbGluZGV4ICRvcHRpb24gMV0KCQlzZXQgdGV4dCBbbGluZGV4ICRvcHRpb24gMl0KCgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCgkJCVtmb250IGNvbmZpZ3VyZSAkZm9udCAtZmFtaWx5XQoJCXNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpIFwKCQkJW2ZvbnQgY29uZmlndXJlICRmb250IC1zaXplXQoKCQlmcmFtZSAkdy5nbG9iYWwuJG5hbWUKCQlsYWJlbCAkdy5nbG9iYWwuJG5hbWUubCAtdGV4dCAiJHRleHQ6IiAtZm9udCBmb250X3VpCgkJcGFjayAkdy5nbG9iYWwuJG5hbWUubCAtc2lkZSBsZWZ0IC1hbmNob3IgdyAtZmlsbCB4CgkJZXZhbCB0a19vcHRpb25NZW51ICR3Lmdsb2JhbC4kbmFtZS5mYW1pbHkgXAoJCQlnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXmZhbWlseSkgXAoJCQkkYWxsX2ZvbnRzCgkJc3BpbmJveCAkdy5nbG9iYWwuJG5hbWUuc2l6ZSBcCgkJCS10ZXh0dmFyaWFibGUgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKSBcCgkJCS1mcm9tIDIgLXRvIDgwIC1pbmNyZW1lbnQgMSBcCgkJCS13aWR0aCAzIFwKCQkJLWZvbnQgZm9udF91aQoJCWJpbmQgJHcuZ2xvYmFsLiRuYW1lLnNpemUgPEZvY3VzSW4+IHslVyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmR9CgkJcGFjayAkdy5nbG9iYWwuJG5hbWUuc2l6ZSAtc2lkZSByaWdodCAtYW5jaG9yIGUKCQlwYWNrICR3Lmdsb2JhbC4kbmFtZS5mYW1pbHkgLXNpZGUgcmlnaHQgLWFuY2hvciBlCgkJcGFjayAkdy5nbG9iYWwuJG5hbWUgLXNpZGUgdG9wIC1hbmNob3IgdyAtZmlsbCB4Cgl9CgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gImRlc3Ryb3kgJHciCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogT3B0aW9ucyIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBkb19yZXN0b3JlX2RlZmF1bHRzIHt9IHsKCWdsb2JhbCBmb250X2Rlc2NzIGRlZmF1bHRfY29uZmlnIHJlcG9fY29uZmlnCglnbG9iYWwgcmVwb19jb25maWdfbmV3IGdsb2JhbF9jb25maWdfbmV3CgoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10gewoJCXNldCByZXBvX2NvbmZpZ19uZXcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKCX0KCglmb3JlYWNoIG9wdGlvbiAkZm9udF9kZXNjcyB7CgkJc2V0IG5hbWUgW2xpbmRleCAkb3B0aW9uIDBdCgkJc2V0IHJlcG9fY29uZmlnKGd1aS4kbmFtZSkgJGRlZmF1bHRfY29uZmlnKGd1aS4kbmFtZSkKCX0KCWFwcGx5X2NvbmZpZwoKCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgZm9udCBbbGluZGV4ICRvcHRpb24gMV0KCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5mYW1pbHkpIFwKCQkJW2ZvbnQgY29uZmlndXJlICRmb250IC1mYW1pbHldCgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkgXAoJCQlbZm9udCBjb25maWd1cmUgJGZvbnQgLXNpemVdCgl9Cn0KCnByb2MgZG9fc2F2ZV9jb25maWcge3d9IHsKCWlmIHtbY2F0Y2gge3NhdmVfY29uZmlnfSBlcnJdfSB7CgkJZXJyb3JfcG9wdXAgIkZhaWxlZCB0byBjb21wbGV0ZWx5IHNhdmUgb3B0aW9uczpcblxuJGVyciIKCX0KCXJlc2hvd19kaWZmCglkZXN0cm95ICR3Cn0KCnByb2MgZG9fd2luZG93c19zaG9ydGN1dCB7fSB7CglnbG9iYWwgYXJndjAKCglzZXQgZm4gW3RrX2dldFNhdmVGaWxlIFwKCQktcGFyZW50IC4gXAoJCS10aXRsZSAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogQ3JlYXRlIERlc2t0b3AgSWNvbiIgXAoJCS1pbml0aWFsZmlsZSAiR2l0IFtyZXBvbmFtZV0uYmF0Il0KCWlmIHskZm4gIT0ge319IHsKCQlpZiB7W2NhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiAkZm4gd10KCQkJCXB1dHMgJGZkICJARUNITyBFbnRlcmluZyBbcmVwb25hbWVdIgoJCQkJcHV0cyAkZmQgIkBFQ0hPIFN0YXJ0aW5nIGdpdC1ndWkuLi4gcGxlYXNlIHdhaXQuLi4iCgkJCQlwdXRzICRmZCAiQFNFVCBQQVRIPVtmaWxlIG5vcm1hbGl6ZSBbZ2l0ZXhlY11dOyVQQVRIJSIKCQkJCXB1dHMgJGZkICJAU0VUIEdJVF9ESVI9W2ZpbGUgbm9ybWFsaXplIFtnaXRkaXJdXSIKCQkJCXB1dHMgLW5vbmV3bGluZSAkZmQgIkBcIltpbmZvIG5hbWVvZmV4ZWN1dGFibGVdXCIiCgkJCQlwdXRzICRmZCAiIFwiW2ZpbGUgbm9ybWFsaXplICRhcmd2MF1cIiIKCQkJCWNsb3NlICRmZAoJCQl9IGVycl19IHsKCQkJZXJyb3JfcG9wdXAgIkNhbm5vdCB3cml0ZSBzY3JpcHQ6XG5cbiRlcnIiCgkJfQoJfQp9Cgpwcm9jIGRvX2N5Z3dpbl9zaG9ydGN1dCB7fSB7CglnbG9iYWwgYXJndjAKCglpZiB7W2NhdGNoIHsKCQlzZXQgZGVza3RvcCBbZXhlYyBjeWdwYXRoIFwKCQkJLS13aW5kb3dzIFwKCQkJLS1hYnNvbHV0ZSBcCgkJCS0tbG9uZy1uYW1lIFwKCQkJLS1kZXNrdG9wXQoJCX1dfSB7CgkJCXNldCBkZXNrdG9wIC4KCX0KCXNldCBmbiBbdGtfZ2V0U2F2ZUZpbGUgXAoJCS1wYXJlbnQgLiBcCgkJLXRpdGxlICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBDcmVhdGUgRGVza3RvcCBJY29uIiBcCgkJLWluaXRpYWxkaXIgJGRlc2t0b3AgXAoJCS1pbml0aWFsZmlsZSAiR2l0IFtyZXBvbmFtZV0uYmF0Il0KCWlmIHskZm4gIT0ge319IHsKCQlpZiB7W2NhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiAkZm4gd10KCQkJCXNldCBzaCBbZXhlYyBjeWdwYXRoIFwKCQkJCQktLXdpbmRvd3MgXAoJCQkJCS0tYWJzb2x1dGUgXAoJCQkJCS9iaW4vc2hdCgkJCQlzZXQgbWUgW2V4ZWMgY3lncGF0aCBcCgkJCQkJLS11bml4IFwKCQkJCQktLWFic29sdXRlIFwKCQkJCQkkYXJndjBdCgkJCQlzZXQgZ2QgW2V4ZWMgY3lncGF0aCBcCgkJCQkJLS11bml4IFwKCQkJCQktLWFic29sdXRlIFwKCQkJCQlbZ2l0ZGlyXV0KCQkJCXNldCBndyBbZXhlYyBjeWdwYXRoIFwKCQkJCQktLXdpbmRvd3MgXAoJCQkJCS0tYWJzb2x1dGUgXAoJCQkJCVtmaWxlIGRpcm5hbWUgW2dpdGRpcl1dXQoJCQkJcmVnc3ViIC1hbGwgJyAkbWUgIidcXCcnIiBtZQoJCQkJcmVnc3ViIC1hbGwgJyAkZ2QgIidcXCcnIiBnZAoJCQkJcHV0cyAkZmQgIkBFQ0hPIEVudGVyaW5nICRndyIKCQkJCXB1dHMgJGZkICJARUNITyBTdGFydGluZyBnaXQtZ3VpLi4uIHBsZWFzZSB3YWl0Li4uIgoJCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAiQFwiJHNoXCIgLS1sb2dpbiAtYyBcIiIKCQkJCXB1dHMgLW5vbmV3bGluZSAkZmQgIkdJVF9ESVI9JyRnZCciCgkJCQlwdXRzIC1ub25ld2xpbmUgJGZkICIgJyRtZSciCgkJCQlwdXRzICRmZCAiJlwiIgoJCQkJY2xvc2UgJGZkCgkJCX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiQ2Fubm90IHdyaXRlIHNjcmlwdDpcblxuJGVyciIKCQl9Cgl9Cn0KCnByb2MgZG9fbWFjb3N4X2FwcCB7fSB7CglnbG9iYWwgYXJndjAgZW52CgoJc2V0IGZuIFt0a19nZXRTYXZlRmlsZSBcCgkJLXBhcmVudCAuIFwKCQktdGl0bGUgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IENyZWF0ZSBEZXNrdG9wIEljb24iIFwKCQktaW5pdGlhbGRpciBbZmlsZSBqb2luICRlbnYoSE9NRSkgRGVza3RvcF0gXAoJCS1pbml0aWFsZmlsZSAiR2l0IFtyZXBvbmFtZV0uYXBwIl0KCWlmIHskZm4gIT0ge319IHsKCQlpZiB7W2NhdGNoIHsKCQkJCXNldCBDb250ZW50cyBbZmlsZSBqb2luICRmbiBDb250ZW50c10KCQkJCXNldCBNYWNPUyBbZmlsZSBqb2luICRDb250ZW50cyBNYWNPU10KCQkJCXNldCBleGUgW2ZpbGUgam9pbiAkTWFjT1MgZ2l0LWd1aV0KCgkJCQlmaWxlIG1rZGlyICRNYWNPUwoKCQkJCXNldCBmZCBbb3BlbiBbZmlsZSBqb2luICRDb250ZW50cyBJbmZvLnBsaXN0XSB3XQoJCQkJcHV0cyAkZmQgezw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q+Cgk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KCTxzdHJpbmc+Z2l0LWd1aTwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KCTxzdHJpbmc+b3JnLnNwZWFyY2UuZ2l0LWd1aTwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgoJPHN0cmluZz42LjA8L3N0cmluZz4KCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgoJPHN0cmluZz5BUFBMPC9zdHJpbmc+Cgk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+Cgk8c3RyaW5nPj8/Pz88L3N0cmluZz4KCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjEuMDwvc3RyaW5nPgoJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+Cgk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pn0KCQkJCWNsb3NlICRmZAoKCQkJCXNldCBmZCBbb3BlbiAkZXhlIHddCgkJCQlzZXQgZ2QgW2ZpbGUgbm9ybWFsaXplIFtnaXRkaXJdXQoJCQkJc2V0IGVwIFtmaWxlIG5vcm1hbGl6ZSBbZ2l0ZXhlY11dCgkJCQlyZWdzdWIgLWFsbCAnICRnZCAiJ1xcJyciIGdkCgkJCQlyZWdzdWIgLWFsbCAnICRlcCAiJ1xcJyciIGVwCgkJCQlwdXRzICRmZCAiIyEvYmluL3NoIgoJCQkJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBlbnZdIHsKCQkJCQlpZiB7W3N0cmluZyBtYXRjaCBHSVRfKiAkbmFtZV19IHsKCQkJCQkJcmVnc3ViIC1hbGwgJyAkZW52KCRuYW1lKSAiJ1xcJyciIHYKCQkJCQkJcHV0cyAkZmQgImV4cG9ydCAkbmFtZT0nJHYnIgoJCQkJCX0KCQkJCX0KCQkJCXB1dHMgJGZkICJleHBvcnQgUEFUSD0nJGVwJzpcJFBBVEgiCgkJCQlwdXRzICRmZCAiZXhwb3J0IEdJVF9ESVI9JyRnZCciCgkJCQlwdXRzICRmZCAiZXhlYyBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXSIKCQkJCWNsb3NlICRmZAoKCQkJCWZpbGUgYXR0cmlidXRlcyAkZXhlIC1wZXJtaXNzaW9ucyB1K3gsZyt4LG8reAoJCQl9IGVycl19IHsKCQkJZXJyb3JfcG9wdXAgIkNhbm5vdCB3cml0ZSBpY29uOlxuXG4kZXJyIgoJCX0KCX0KfQoKcHJvYyB0b2dnbGVfb3JfZGlmZiB7dyB4IHl9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzIGN1cnJlbnRfZGlmZl9wYXRoIHVpX2luZGV4IHVpX3dvcmtkaXIKCWdsb2JhbCBsYXN0X2NsaWNrZWQgc2VsZWN0ZWRfcGF0aHMKCglzZXQgcG9zIFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXQoJc2V0IGxubyBbbGluZGV4ICRwb3MgMF0KCXNldCBjb2wgW2xpbmRleCAkcG9zIDFdCglzZXQgcGF0aCBbbGluZGV4ICRmaWxlX2xpc3RzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KCWlmIHskcGF0aCBlcSB7fX0gewoJCXNldCBsYXN0X2NsaWNrZWQge30KCQlyZXR1cm4KCX0KCglzZXQgbGFzdF9jbGlja2VkIFtsaXN0ICR3ICRsbm9dCglhcnJheSB1bnNldCBzZWxlY3RlZF9wYXRocwoJJHVpX2luZGV4IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCSR1aV93b3JrZGlyIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCglpZiB7JGNvbCA9PSAwfSB7CgkJaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBlcSAkcGF0aH0gewoJCQlzZXQgYWZ0ZXIge3Jlc2hvd19kaWZmO30KCQl9IGVsc2UgewoJCQlzZXQgYWZ0ZXIge30KCQl9CgkJaWYgeyR3IGVxICR1aV9pbmRleH0gewoJCQl1cGRhdGVfaW5kZXhpbmZvIFwKCQkJCSJVbnN0YWdpbmcgW3Nob3J0X3BhdGggJHBhdGhdIGZyb20gY29tbWl0IiBcCgkJCQlbbGlzdCAkcGF0aF0gXAoJCQkJW2NvbmNhdCAkYWZ0ZXIge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19XQoJCX0gZWxzZWlmIHskdyBlcSAkdWlfd29ya2Rpcn0gewoJCQl1cGRhdGVfaW5kZXggXAoJCQkJIkFkZGluZyBbc2hvcnRfcGF0aCAkcGF0aF0iIFwKCQkJCVtsaXN0ICRwYXRoXSBcCgkJCQlbY29uY2F0ICRhZnRlciB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX1dCgkJfQoJfSBlbHNlIHsKCQlzaG93X2RpZmYgJHBhdGggJHcgJGxubwoJfQp9Cgpwcm9jIGFkZF9vbmVfdG9fc2VsZWN0aW9uIHt3IHggeX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMgbGFzdF9jbGlja2VkIHNlbGVjdGVkX3BhdGhzCgoJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXSAwXQoJc2V0IHBhdGggW2xpbmRleCAkZmlsZV9saXN0cygkdykgW2V4cHIgeyRsbm8gLSAxfV1dCglpZiB7JHBhdGggZXEge319IHsKCQlzZXQgbGFzdF9jbGlja2VkIHt9CgkJcmV0dXJuCgl9CgoJaWYgeyRsYXN0X2NsaWNrZWQgbmUge30KCQkmJiBbbGluZGV4ICRsYXN0X2NsaWNrZWQgMF0gbmUgJHd9IHsKCQlhcnJheSB1bnNldCBzZWxlY3RlZF9wYXRocwoJCVtsaW5kZXggJGxhc3RfY2xpY2tlZCAwXSB0YWcgcmVtb3ZlIGluX3NlbCAwLjAgZW5kCgl9CgoJc2V0IGxhc3RfY2xpY2tlZCBbbGlzdCAkdyAkbG5vXQoJaWYge1tjYXRjaCB7c2V0IGluX3NlbCAkc2VsZWN0ZWRfcGF0aHMoJHBhdGgpfV19IHsKCQlzZXQgaW5fc2VsIDAKCX0KCWlmIHskaW5fc2VsfSB7CgkJdW5zZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpCgkJJHcgdGFnIHJlbW92ZSBpbl9zZWwgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCX0gZWxzZSB7CgkJc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKSAxCgkJJHcgdGFnIGFkZCBpbl9zZWwgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCX0KfQoKcHJvYyBhZGRfcmFuZ2VfdG9fc2VsZWN0aW9uIHt3IHggeX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMgbGFzdF9jbGlja2VkIHNlbGVjdGVkX3BhdGhzCgoJaWYge1tsaW5kZXggJGxhc3RfY2xpY2tlZCAwXSBuZSAkd30gewoJCXRvZ2dsZV9vcl9kaWZmICR3ICR4ICR5CgkJcmV0dXJuCgl9CgoJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXSAwXQoJc2V0IGxjIFtsaW5kZXggJGxhc3RfY2xpY2tlZCAxXQoJaWYgeyRsYyA8ICRsbm99IHsKCQlzZXQgYmVnaW4gJGxjCgkJc2V0IGVuZCAkbG5vCgl9IGVsc2UgewoJCXNldCBiZWdpbiAkbG5vCgkJc2V0IGVuZCAkbGMKCX0KCglmb3JlYWNoIHBhdGggW2xyYW5nZSAkZmlsZV9saXN0cygkdykgXAoJCVtleHByIHskYmVnaW4gLSAxfV0gXAoJCVtleHByIHskZW5kIC0gMX1dXSB7CgkJc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKSAxCgl9CgkkdyB0YWcgYWRkIGluX3NlbCAkYmVnaW4uMCBbZXhwciB7JGVuZCArIDF9XS4wCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgY29uZmlnIGRlZmF1bHRzCgpzZXQgY3Vyc29yX3B0ciBhcnJvdwpmb250IGNyZWF0ZSBmb250X2RpZmYgLWZhbWlseSBDb3VyaWVyIC1zaXplIDEwCmZvbnQgY3JlYXRlIGZvbnRfdWkKY2F0Y2ggewoJbGFiZWwgLmR1bW15CglldmFsIGZvbnQgY29uZmlndXJlIGZvbnRfdWkgW2ZvbnQgYWN0dWFsIFsuZHVtbXkgY2dldCAtZm9udF1dCglkZXN0cm95IC5kdW1teQp9Cgpmb250IGNyZWF0ZSBmb250X3VpYm9sZApmb250IGNyZWF0ZSBmb250X2RpZmZib2xkCgppZiB7W2lzX1dpbmRvd3NdfSB7CglzZXQgTTFCIENvbnRyb2wKCXNldCBNMVQgQ3RybAp9IGVsc2VpZiB7W2lzX01hY09TWF19IHsKCXNldCBNMUIgTTEKCXNldCBNMVQgQ21kCn0gZWxzZSB7CglzZXQgTTFCIE0xCglzZXQgTTFUIE0xCn0KCnByb2MgYXBwbHlfY29uZmlnIHt9IHsKCWdsb2JhbCByZXBvX2NvbmZpZyBmb250X2Rlc2NzCgoJZm9yZWFjaCBvcHRpb24gJGZvbnRfZGVzY3MgewoJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAwXQoJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQoJCWlmIHtbY2F0Y2ggewoJCQlmb3JlYWNoIHtjbiBjdn0gJHJlcG9fY29uZmlnKGd1aS4kbmFtZSkgewoJCQkJZm9udCBjb25maWd1cmUgJGZvbnQgJGNuICRjdgoJCQl9CgkJCX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiBndWkuJG5hbWU6XG5cbiRlcnIiCgkJfQoJCWZvcmVhY2gge2NuIGN2fSBbZm9udCBjb25maWd1cmUgJGZvbnRdIHsKCQkJZm9udCBjb25maWd1cmUgJHtmb250fWJvbGQgJGNuICRjdgoJCX0KCQlmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCAtd2VpZ2h0IGJvbGQKCX0KfQoKc2V0IGRlZmF1bHRfY29uZmlnKG1lcmdlLnN1bW1hcnkpIGZhbHNlCnNldCBkZWZhdWx0X2NvbmZpZyhtZXJnZS52ZXJib3NpdHkpIDIKc2V0IGRlZmF1bHRfY29uZmlnKHVzZXIubmFtZSkge30Kc2V0IGRlZmF1bHRfY29uZmlnKHVzZXIuZW1haWwpIHt9CgpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLnRydXN0bXRpbWUpIGZhbHNlCnNldCBkZWZhdWx0X2NvbmZpZyhndWkuZGlmZmNvbnRleHQpIDUKc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSkge30Kc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5mb250dWkpIFtmb250IGNvbmZpZ3VyZSBmb250X3VpXQpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLmZvbnRkaWZmKSBbZm9udCBjb25maWd1cmUgZm9udF9kaWZmXQpzZXQgZm9udF9kZXNjcyB7Cgl7Zm9udHVpICAgZm9udF91aSAgIHtNYWluIEZvbnR9fQoJe2ZvbnRkaWZmIGZvbnRfZGlmZiB7RGlmZi9Db25zb2xlIEZvbnR9fQp9CmxvYWRfY29uZmlnIDAKYXBwbHlfY29uZmlnCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGZlYXR1cmUgb3B0aW9uIHNlbGVjdGlvbgoKaWYge1tyZWdleHAge15naXQtKC4rKSR9IFthcHBuYW1lXSBfanVuayBzdWJjb21tYW5kXX0gewoJdW5zZXQgX2p1bmsKfSBlbHNlIHsKCXNldCBzdWJjb21tYW5kIGd1aQp9CmlmIHskc3ViY29tbWFuZCBlcSB7Z3VpLnNofX0gewoJc2V0IHN1YmNvbW1hbmQgZ3VpCn0KaWYgeyRzdWJjb21tYW5kIGVxIHtndWl9ICYmIFtsbGVuZ3RoICRhcmd2XSA+IDB9IHsKCXNldCBzdWJjb21tYW5kIFtsaW5kZXggJGFyZ3YgMF0KCXNldCBhcmd2IFtscmFuZ2UgJGFyZ3YgMSBlbmRdCn0KCmVuYWJsZV9vcHRpb24gbXVsdGljb21taXQKZW5hYmxlX29wdGlvbiBicmFuY2gKZW5hYmxlX29wdGlvbiB0cmFuc3BvcnQKCnN3aXRjaCAtLSAkc3ViY29tbWFuZCB7CmJsYW1lIHsKCWRpc2FibGVfb3B0aW9uIG11bHRpY29tbWl0CglkaXNhYmxlX29wdGlvbiBicmFuY2gKCWRpc2FibGVfb3B0aW9uIHRyYW5zcG9ydAp9CmNpdG9vbCB7CgllbmFibGVfb3B0aW9uIHNpbmdsZWNvbW1pdAoKCWRpc2FibGVfb3B0aW9uIG11bHRpY29tbWl0CglkaXNhYmxlX29wdGlvbiBicmFuY2gKCWRpc2FibGVfb3B0aW9uIHRyYW5zcG9ydAp9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdWkgY29uc3RydWN0aW9uCgpzZXQgdWlfY29tbSB7fQoKIyAtLSBNZW51IEJhcgojCm1lbnUgLm1iYXIgLXRlYXJvZmYgMAoubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgUmVwb3NpdG9yeSAtbWVudSAubWJhci5yZXBvc2l0b3J5Ci5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBFZGl0IC1tZW51IC5tYmFyLmVkaXQKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBCcmFuY2ggLW1lbnUgLm1iYXIuYnJhbmNoCn0KaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XSB8fCBbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSB7CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgQ29tbWl0IC1tZW51IC5tYmFyLmNvbW1pdAp9CmlmIHtbaXNfZW5hYmxlZCB0cmFuc3BvcnRdfSB7CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgTWVyZ2UgLW1lbnUgLm1iYXIubWVyZ2UKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBGZXRjaCAtbWVudSAubWJhci5mZXRjaAoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFB1c2ggLW1lbnUgLm1iYXIucHVzaAp9Ci4gY29uZmlndXJlIC1tZW51IC5tYmFyCgojIC0tIFJlcG9zaXRvcnkgTWVudQojCm1lbnUgLm1iYXIucmVwb3NpdG9yeQoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0Jyb3dzZSBDdXJyZW50IEJyYW5jaH0gXAoJLWNvbW1hbmQge25ld19icm93c2VyICRjdXJyZW50X2JyYW5jaH0gXAoJLWZvbnQgZm9udF91aQp0cmFjZSBhZGQgdmFyaWFibGUgY3VycmVudF9icmFuY2ggd3JpdGUgIi5tYmFyLnJlcG9zaXRvcnkgZW50cnljb25mIFsubWJhci5yZXBvc2l0b3J5IGluZGV4IGxhc3RdIC1sYWJlbCBcIkJyb3dzZSBcJGN1cnJlbnRfYnJhbmNoXCIgOyMiCi5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Zpc3VhbGl6ZSBDdXJyZW50IEJyYW5jaH0gXAoJLWNvbW1hbmQge2RvX2dpdGsgJGN1cnJlbnRfYnJhbmNofSBcCgktZm9udCBmb250X3VpCnRyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2JyYW5jaCB3cml0ZSAiLm1iYXIucmVwb3NpdG9yeSBlbnRyeWNvbmYgWy5tYmFyLnJlcG9zaXRvcnkgaW5kZXggbGFzdF0gLWxhYmVsIFwiVmlzdWFsaXplIFwkY3VycmVudF9icmFuY2hcIiA7IyIKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Zpc3VhbGl6ZSBBbGwgQnJhbmNoZXN9IFwKCS1jb21tYW5kIHtkb19naXRrIC0tYWxsfSBcCgktZm9udCBmb250X3VpCi5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgoKaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XX0gewoJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwge0RhdGFiYXNlIFN0YXRpc3RpY3N9IFwKCQktY29tbWFuZCBkb19zdGF0cyBcCgkJLWZvbnQgZm9udF91aQoKCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgLWxhYmVsIHtDb21wcmVzcyBEYXRhYmFzZX0gXAoJCS1jb21tYW5kIGRvX2djIFwKCQktZm9udCBmb250X3VpCgoJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwge1ZlcmlmeSBEYXRhYmFzZX0gXAoJCS1jb21tYW5kIGRvX2ZzY2tfb2JqZWN0cyBcCgkJLWZvbnQgZm9udF91aQoKCS5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgoKCWlmIHtbaXNfQ3lnd2luXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fY3lnd2luX3Nob3J0Y3V0IFwKCQkJLWZvbnQgZm9udF91aQoJfSBlbHNlaWYge1tpc19XaW5kb3dzXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fd2luZG93c19zaG9ydGN1dCBcCgkJCS1mb250IGZvbnRfdWkKCX0gZWxzZWlmIHtbaXNfTWFjT1NYXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fbWFjb3N4X2FwcCBcCgkJCS1mb250IGZvbnRfdWkKCX0KfQoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwgUXVpdCBcCgktY29tbWFuZCBkb19xdWl0IFwKCS1hY2NlbGVyYXRvciAkTTFULVEgXAoJLWZvbnQgZm9udF91aQoKIyAtLSBFZGl0IE1lbnUKIwptZW51IC5tYmFyLmVkaXQKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgVW5kbyBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gZWRpdCB1bmRvfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtWiBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFJlZG8gXAoJLWNvbW1hbmQge2NhdGNoIHtbZm9jdXNdIGVkaXQgcmVkb319IFwKCS1hY2NlbGVyYXRvciAkTTFULVkgXAoJLWZvbnQgZm9udF91aQoubWJhci5lZGl0IGFkZCBzZXBhcmF0b3IKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgQ3V0IFwKCS1jb21tYW5kIHtjYXRjaCB7dGtfdGV4dEN1dCBbZm9jdXNdfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtWCBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIENvcHkgXAoJLWNvbW1hbmQge2NhdGNoIHt0a190ZXh0Q29weSBbZm9jdXNdfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtQyBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFBhc3RlIFwKCS1jb21tYW5kIHtjYXRjaCB7dGtfdGV4dFBhc3RlIFtmb2N1c107IFtmb2N1c10gc2VlIGluc2VydH19IFwKCS1hY2NlbGVyYXRvciAkTTFULVYgXAoJLWZvbnQgZm9udF91aQoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBEZWxldGUgXAoJLWNvbW1hbmQge2NhdGNoIHtbZm9jdXNdIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3R9fSBcCgktYWNjZWxlcmF0b3IgRGVsIFwKCS1mb250IGZvbnRfdWkKLm1iYXIuZWRpdCBhZGQgc2VwYXJhdG9yCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gdGFnIGFkZCBzZWwgMC4wIGVuZH19IFwKCS1hY2NlbGVyYXRvciAkTTFULUEgXAoJLWZvbnQgZm9udF91aQoKIyAtLSBCcmFuY2ggTWVudQojCmlmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CgltZW51IC5tYmFyLmJyYW5jaAoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge0NyZWF0ZS4uLn0gXAoJCS1jb21tYW5kIGRvX2NyZWF0ZV9icmFuY2ggXAoJCS1hY2NlbGVyYXRvciAkTTFULU4gXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0IC5tYmFyLmJyYW5jaCBlbnRyeWNvbmYgXAoJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge0RlbGV0ZS4uLn0gXAoJCS1jb21tYW5kIGRvX2RlbGV0ZV9icmFuY2ggXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0IC5tYmFyLmJyYW5jaCBlbnRyeWNvbmYgXAoJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQp9CgojIC0tIENvbW1pdCBNZW51CiMKaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XSB8fCBbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSB7CgltZW51IC5tYmFyLmNvbW1pdAoKCS5tYmFyLmNvbW1pdCBhZGQgcmFkaW9idXR0b24gXAoJCS1sYWJlbCB7TmV3IENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgkJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKCQktdmFsdWUgbmV3IFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIHJhZGlvYnV0dG9uIFwKCQktbGFiZWwge0FtZW5kIExhc3QgQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fc2VsZWN0X2NvbW1pdF90eXBlIFwKCQktdmFyaWFibGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUgXAoJCS12YWx1ZSBhbWVuZCBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBzZXBhcmF0b3IKCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIFJlc2NhbiBcCgkJLWNvbW1hbmQgZG9fcmVzY2FuIFwKCQktYWNjZWxlcmF0b3IgRjUgXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge0FkZCBUbyBDb21taXR9IFwKCQktY29tbWFuZCBkb19hZGRfc2VsZWN0aW9uIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtBZGQgRXhpc3RpbmcgVG8gQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fYWRkX2FsbCBcCgkJLWFjY2VsZXJhdG9yICRNMVQtSSBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7VW5zdGFnZSBGcm9tIENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX3Vuc3RhZ2Vfc2VsZWN0aW9uIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtSZXZlcnQgQ2hhbmdlc30gXAoJCS1jb21tYW5kIGRvX3JldmVydF9zZWxlY3Rpb24gXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgc2VwYXJhdG9yCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7U2lnbiBPZmZ9IFwKCQktY29tbWFuZCBkb19zaWdub2ZmIFwKCQktYWNjZWxlcmF0b3IgJE0xVC1TIFwKCQktZm9udCBmb250X3VpCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBDb21taXQgXAoJCS1jb21tYW5kIGRvX2NvbW1pdCBcCgkJLWFjY2VsZXJhdG9yICRNMVQtUmV0dXJuIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KfQoKaWYge1tpc19NYWNPU1hdfSB7CgkjIC0tIEFwcGxlIE1lbnUgKE1hYyBPUyBYIG9ubHkpCgkjCgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgQXBwbGUgLW1lbnUgLm1iYXIuYXBwbGUKCW1lbnUgLm1iYXIuYXBwbGUKCgkubWJhci5hcHBsZSBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IFthcHBuYW1lXSIgXAoJCS1jb21tYW5kIGRvX2Fib3V0IFwKCQktZm9udCBmb250X3VpCgkubWJhci5hcHBsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlthcHBuYW1lXSBPcHRpb25zLi4uIiBcCgkJLWNvbW1hbmQgZG9fb3B0aW9ucyBcCgkJLWZvbnQgZm9udF91aQp9IGVsc2UgewoJIyAtLSBFZGl0IE1lbnUKCSMKCS5tYmFyLmVkaXQgYWRkIHNlcGFyYXRvcgoJLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwge09wdGlvbnMuLi59IFwKCQktY29tbWFuZCBkb19vcHRpb25zIFwKCQktZm9udCBmb250X3VpCgoJIyAtLSBUb29scyBNZW51CgkjCglpZiB7W2ZpbGUgZXhpc3RzIC91c3IvbG9jYWwvbWlnYS9saWIvZ3VpLW1pZ2FdCgkJJiYgW2ZpbGUgZXhpc3RzIC5wdmNzcmNdfSB7Cglwcm9jIGRvX21pZ2Ege30gewoJCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUKCQlpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoJCXNldCBjbWQgW2xpc3Qgc2ggLS1sb2dpbiAtYyAiL3Vzci9sb2NhbC9taWdhL2xpYi9ndWktbWlnYSBcIltwd2RdXCIiXQoJCXNldCBtaWdhX2ZkIFtvcGVuICJ8JGNtZCIgcl0KCQlmY29uZmlndXJlICRtaWdhX2ZkIC1ibG9ja2luZyAwCgkJZmlsZWV2ZW50ICRtaWdhX2ZkIHJlYWRhYmxlIFtsaXN0IG1pZ2FfZG9uZSAkbWlnYV9mZF0KCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSdW5uaW5nIG1pZ2EuLi59Cgl9Cglwcm9jIG1pZ2FfZG9uZSB7ZmR9IHsKCQlyZWFkICRmZCA1MTIKCQlpZiB7W2VvZiAkZmRdfSB7CgkJCWNsb3NlICRmZAoJCQl1bmxvY2tfaW5kZXgKCQkJcmVzY2FuIFtsaXN0IHNldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln1dCgkJfQoJfQoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFRvb2xzIC1tZW51IC5tYmFyLnRvb2xzCgltZW51IC5tYmFyLnRvb2xzCgkubWJhci50b29scyBhZGQgY29tbWFuZCAtbGFiZWwgIk1pZ3JhdGUiIFwKCQktY29tbWFuZCBkb19taWdhIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIudG9vbHMgZW50cnljb25mIFsubWJhci50b29scyBpbmRleCBsYXN0XSAtc3RhdGVdCgl9Cn0KCiMgLS0gSGVscCBNZW51CiMKLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEhlbHAgLW1lbnUgLm1iYXIuaGVscAptZW51IC5tYmFyLmhlbHAKCmlmIHshW2lzX01hY09TWF19IHsKCS5tYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dCBbYXBwbmFtZV0iIFwKCQktY29tbWFuZCBkb19hYm91dCBcCgkJLWZvbnQgZm9udF91aQp9CgpzZXQgYnJvd3NlciB7fQpjYXRjaCB7c2V0IGJyb3dzZXIgJHJlcG9fY29uZmlnKGluc3Rhd2ViLmJyb3dzZXIpfQpzZXQgZG9jX3BhdGggW2ZpbGUgZGlybmFtZSBbZ2l0ZXhlY11dCnNldCBkb2NfcGF0aCBbZmlsZSBqb2luICRkb2NfcGF0aCBEb2N1bWVudGF0aW9uIGluZGV4Lmh0bWxdCgppZiB7W2lzX0N5Z3dpbl19IHsKCXNldCBkb2NfcGF0aCBbZXhlYyBjeWdwYXRoIC0td2luZG93cyAkZG9jX3BhdGhdCn0KCmlmIHskYnJvd3NlciBlcSB7fX0gewoJaWYge1tpc19NYWNPU1hdfSB7CgkJc2V0IGJyb3dzZXIgb3BlbgoJfSBlbHNlaWYge1tpc19DeWd3aW5dfSB7CgkJc2V0IHByb2dyYW1fZmlsZXMgW2ZpbGUgZGlybmFtZSBbZXhlYyBjeWdwYXRoIC0td2luZGlyXV0KCQlzZXQgcHJvZ3JhbV9maWxlcyBbZmlsZSBqb2luICRwcm9ncmFtX2ZpbGVzIHtQcm9ncmFtIEZpbGVzfV0KCQlzZXQgZmlyZWZveCBbZmlsZSBqb2luICRwcm9ncmFtX2ZpbGVzIHtNb3ppbGxhIEZpcmVmb3h9IGZpcmVmb3guZXhlXQoJCXNldCBpZSBbZmlsZSBqb2luICRwcm9ncmFtX2ZpbGVzIHtJbnRlcm5ldCBFeHBsb3Jlcn0gSUVYUExPUkUuRVhFXQoJCWlmIHtbZmlsZSBleGlzdHMgJGZpcmVmb3hdfSB7CgkJCXNldCBicm93c2VyICRmaXJlZm94CgkJfSBlbHNlaWYge1tmaWxlIGV4aXN0cyAkaWVdfSB7CgkJCXNldCBicm93c2VyICRpZQoJCX0KCQl1bnNldCBwcm9ncmFtX2ZpbGVzIGZpcmVmb3ggaWUKCX0KfQoKaWYge1tmaWxlIGlzZmlsZSAkZG9jX3BhdGhdfSB7CglzZXQgZG9jX3VybCAiZmlsZTokZG9jX3BhdGgiCn0gZWxzZSB7CglzZXQgZG9jX3VybCB7aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvfQp9CgppZiB7JGJyb3dzZXIgbmUge319IHsKCS5tYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsIHtPbmxpbmUgRG9jdW1lbnRhdGlvbn0gXAoJCS1jb21tYW5kIFtsaXN0IGV4ZWMgJGJyb3dzZXIgJGRvY191cmwgJl0gXAoJCS1mb250IGZvbnRfdWkKfQp1bnNldCBicm93c2VyIGRvY19wYXRoIGRvY191cmwKCiMgLS0gU3RhbmRhcmQgYmluZGluZ3MKIwpiaW5kIC4gICA8RGVzdHJveT4gZG9fcXVpdApiaW5kIGFsbCA8JE0xQi1LZXktcT4gZG9fcXVpdApiaW5kIGFsbCA8JE0xQi1LZXktUT4gZG9fcXVpdApiaW5kIGFsbCA8JE0xQi1LZXktdz4ge2Rlc3Ryb3kgW3dpbmZvIHRvcGxldmVsICVXXX0KYmluZCBhbGwgPCRNMUItS2V5LVc+IHtkZXN0cm95IFt3aW5mbyB0b3BsZXZlbCAlV119CgojIC0tIE5vdCBhIG5vcm1hbCBjb21taXQgdHlwZSBpbnZvY2F0aW9uPyAgRG8gdGhhdCBpbnN0ZWFkIQojCnN3aXRjaCAtLSAkc3ViY29tbWFuZCB7CmJsYW1lIHsKCWlmIHtbbGxlbmd0aCAkYXJndl0gIT0gMn0gewoJCXB1dHMgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIGJsYW1lIGNvbW1pdCBwYXRoIgoJCWV4aXQgMQoJfQoJc2V0IGN1cnJlbnRfYnJhbmNoIFtsaW5kZXggJGFyZ3YgMF0KCXNob3dfYmxhbWUgJGN1cnJlbnRfYnJhbmNoIFtsaW5kZXggJGFyZ3YgMV0KCXJldHVybgp9CmNpdG9vbCAtCmd1aSB7CglpZiB7W2xsZW5ndGggJGFyZ3ZdICE9IDB9IHsKCQlwdXRzIC1ub25ld2xpbmUgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIgoJCWlmIHskc3ViY29tbWFuZCBuZSB7Z3VpfSAmJiBbYXBwbmFtZV0gbmUgImdpdC0kc3ViY29tbWFuZCJ9IHsKCQkJcHV0cyAtbm9uZXdsaW5lIHN0ZGVyciAiICRzdWJjb21tYW5kIgoJCX0KCQlwdXRzIHN0ZGVyciB7fQoJCWV4aXQgMQoJfQoJIyBmYWxsIHRocm91Z2ggdG8gc2V0dXAgVUkgZm9yIGNvbW1pdHMKfQpkZWZhdWx0IHsKCXB1dHMgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIFxbe2JsYW1lfGNpdG9vbH1cXSIKCWV4aXQgMQp9Cn0KCiMgLS0gQnJhbmNoIENvbnRyb2wKIwpmcmFtZSAuYnJhbmNoIFwKCS1ib3JkZXJ3aWR0aCAxIFwKCS1yZWxpZWYgc3Vua2VuCmxhYmVsIC5icmFuY2gubDEgXAoJLXRleHQge0N1cnJlbnQgQnJhbmNoOn0gXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpsYWJlbCAuYnJhbmNoLmNiIFwKCS10ZXh0dmFyaWFibGUgY3VycmVudF9icmFuY2ggXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpwYWNrIC5icmFuY2gubDEgLXNpZGUgbGVmdApwYWNrIC5icmFuY2guY2IgLXNpZGUgbGVmdCAtZmlsbCB4CnBhY2sgLmJyYW5jaCAtc2lkZSB0b3AgLWZpbGwgeAoKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCW1lbnUgLm1iYXIubWVyZ2UKCS5tYmFyLm1lcmdlIGFkZCBjb21tYW5kIC1sYWJlbCB7TG9jYWwgTWVyZ2UuLi59IFwKCQktY29tbWFuZCBkb19sb2NhbF9tZXJnZSBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLm1lcmdlIGVudHJ5Y29uZiBbLm1iYXIubWVyZ2UgaW5kZXggbGFzdF0gLXN0YXRlXQoJLm1iYXIubWVyZ2UgYWRkIGNvbW1hbmQgLWxhYmVsIHtBYm9ydCBNZXJnZS4uLn0gXAoJCS1jb21tYW5kIGRvX3Jlc2V0X2hhcmQgXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5tZXJnZSBlbnRyeWNvbmYgWy5tYmFyLm1lcmdlIGluZGV4IGxhc3RdIC1zdGF0ZV0KCgoJbWVudSAubWJhci5mZXRjaAoKCW1lbnUgLm1iYXIucHVzaAoJLm1iYXIucHVzaCBhZGQgY29tbWFuZCAtbGFiZWwge1B1c2guLi59IFwKCQktY29tbWFuZCBkb19wdXNoX2FueXdoZXJlIFwKCQktZm9udCBmb250X3VpCn0KCiMgLS0gTWFpbiBXaW5kb3cgTGF5b3V0CiMKcGFuZWR3aW5kb3cgLnZwYW5lIC1vcmllbnQgdmVydGljYWwKcGFuZWR3aW5kb3cgLnZwYW5lLmZpbGVzIC1vcmllbnQgaG9yaXpvbnRhbAoudnBhbmUgYWRkIC52cGFuZS5maWxlcyAtc3RpY2t5IG5zZXcgLWhlaWdodCAxMDAgLXdpZHRoIDIwMApwYWNrIC52cGFuZSAtYW5jaG9yIG4gLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgojIC0tIEluZGV4IEZpbGUgTGlzdAojCmZyYW1lIC52cGFuZS5maWxlcy5pbmRleCAtaGVpZ2h0IDEwMCAtd2lkdGggMjAwCmxhYmVsIC52cGFuZS5maWxlcy5pbmRleC50aXRsZSAtdGV4dCB7Q2hhbmdlcyBUbyBCZSBDb21taXR0ZWR9IFwKCS1iYWNrZ3JvdW5kIGdyZWVuIFwKCS1mb250IGZvbnRfdWkKdGV4dCAkdWlfaW5kZXggLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDAgXAoJLXdpZHRoIDIwIC1oZWlnaHQgMTAgXAoJLXdyYXAgbm9uZSBcCgktZm9udCBmb250X3VpIFwKCS1jdXJzb3IgJGN1cnNvcl9wdHIgXAoJLXhzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMuaW5kZXguc3ggc2V0fSBcCgkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy5pbmRleC5zeSBzZXR9IFwKCS1zdGF0ZSBkaXNhYmxlZApzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLmluZGV4LnN4IC1vcmllbnQgaCAtY29tbWFuZCBbbGlzdCAkdWlfaW5kZXggeHZpZXddCnNjcm9sbGJhciAudnBhbmUuZmlsZXMuaW5kZXguc3kgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR1aV9pbmRleCB5dmlld10KcGFjayAudnBhbmUuZmlsZXMuaW5kZXgudGl0bGUgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMuaW5kZXguc3ggLXNpZGUgYm90dG9tIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMuaW5kZXguc3kgLXNpZGUgcmlnaHQgLWZpbGwgeQpwYWNrICR1aV9pbmRleCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCi52cGFuZS5maWxlcyBhZGQgLnZwYW5lLmZpbGVzLmluZGV4IC1zdGlja3kgbnNldwoKIyAtLSBXb3JraW5nIERpcmVjdG9yeSBGaWxlIExpc3QKIwpmcmFtZSAudnBhbmUuZmlsZXMud29ya2RpciAtaGVpZ2h0IDEwMCAtd2lkdGggMjAwCmxhYmVsIC52cGFuZS5maWxlcy53b3JrZGlyLnRpdGxlIC10ZXh0IHtDaGFuZ2VkIEJ1dCBOb3QgVXBkYXRlZH0gXAoJLWJhY2tncm91bmQgcmVkIFwKCS1mb250IGZvbnRfdWkKdGV4dCAkdWlfd29ya2RpciAtYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgktd2lkdGggMjAgLWhlaWdodCAxMCBcCgktd3JhcCBub25lIFwKCS1mb250IGZvbnRfdWkgXAoJLWN1cnNvciAkY3Vyc29yX3B0ciBcCgkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy53b3JrZGlyLnN4IHNldH0gXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMud29ya2Rpci5zeSBzZXR9IFwKCS1zdGF0ZSBkaXNhYmxlZApzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR1aV93b3JrZGlyIHh2aWV3XQpzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3kgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR1aV93b3JrZGlyIHl2aWV3XQpwYWNrIC52cGFuZS5maWxlcy53b3JrZGlyLnRpdGxlIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggLXNpZGUgYm90dG9tIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci5zeSAtc2lkZSByaWdodCAtZmlsbCB5CnBhY2sgJHVpX3dvcmtkaXIgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoudnBhbmUuZmlsZXMgYWRkIC52cGFuZS5maWxlcy53b3JrZGlyIC1zdGlja3kgbnNldwoKZm9yZWFjaCBpIFtsaXN0ICR1aV9pbmRleCAkdWlfd29ya2Rpcl0gewoJJGkgdGFnIGNvbmYgaW5fZGlmZiAtZm9udCBmb250X3VpYm9sZAoJJGkgdGFnIGNvbmYgaW5fc2VsIFwKCQktYmFja2dyb3VuZCBbJGkgY2dldCAtZm9yZWdyb3VuZF0gXAoJCS1mb3JlZ3JvdW5kIFskaSBjZ2V0IC1iYWNrZ3JvdW5kXQp9CnVuc2V0IGkKCiMgLS0gRGlmZiBhbmQgQ29tbWl0IEFyZWEKIwpmcmFtZSAudnBhbmUubG93ZXIgLWhlaWdodCAzMDAgLXdpZHRoIDQwMApmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEKZnJhbWUgLnZwYW5lLmxvd2VyLmRpZmYgLXJlbGllZiBzdW5rZW4gLWJvcmRlcndpZHRoIDEKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuZGlmZiAtc2lkZSBib3R0b20gLWZpbGwgYm90aCAtZXhwYW5kIDEKLnZwYW5lIGFkZCAudnBhbmUubG93ZXIgLXN0aWNreSBuc2V3CgojIC0tIENvbW1pdCBBcmVhIEJ1dHRvbnMKIwpmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucwpsYWJlbCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5sIC10ZXh0IHt9IFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0IFwKCS1mb250IGZvbnRfdWkKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5sIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMgLXNpZGUgbGVmdCAtZmlsbCB5CgpidXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMucmVzY2FuIC10ZXh0IHtSZXNjYW59IFwKCS1jb21tYW5kIGRvX3Jlc2NhbiBcCgktZm9udCBmb250X3VpCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMucmVzY2FuIC1zaWRlIHRvcCAtZmlsbCB4CmxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCXsudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5yZXNjYW4gY29uZiAtc3RhdGV9CgpidXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuaW5jYWxsIC10ZXh0IHtBZGQgRXhpc3Rpbmd9IFwKCS1jb21tYW5kIGRvX2FkZF9hbGwgXAoJLWZvbnQgZm9udF91aQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmluY2FsbCAtc2lkZSB0b3AgLWZpbGwgeApsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgl7LnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuaW5jYWxsIGNvbmYgLXN0YXRlfQoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnNpZ25vZmYgLXRleHQge1NpZ24gT2ZmfSBcCgktY29tbWFuZCBkb19zaWdub2ZmIFwKCS1mb250IGZvbnRfdWkKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5zaWdub2ZmIC1zaWRlIHRvcCAtZmlsbCB4CgpidXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuY29tbWl0IC10ZXh0IHtDb21taXR9IFwKCS1jb21tYW5kIGRvX2NvbW1pdCBcCgktZm9udCBmb250X3VpCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuY29tbWl0IC1zaWRlIHRvcCAtZmlsbCB4CmxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCXsudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5jb21taXQgY29uZiAtc3RhdGV9CgojIC0tIENvbW1pdCBNZXNzYWdlIEJ1ZmZlcgojCmZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIKZnJhbWUgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIKc2V0IHVpX2NvbW0gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci50CnNldCB1aV9jb21sIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmwKcmFkaW9idXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubmV3IFwKCS10ZXh0IHtOZXcgQ29tbWl0fSBcCgktY29tbWFuZCBkb19zZWxlY3RfY29tbWl0X3R5cGUgXAoJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKCS12YWx1ZSBuZXcgXAoJLWZvbnQgZm9udF91aQpsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCglbbGlzdCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5uZXcgY29uZiAtc3RhdGVdCnJhZGlvYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmFtZW5kIFwKCS10ZXh0IHtBbWVuZCBMYXN0IENvbW1pdH0gXAoJLWNvbW1hbmQgZG9fc2VsZWN0X2NvbW1pdF90eXBlIFwKCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCgktdmFsdWUgYW1lbmQgXAoJLWZvbnQgZm9udF91aQpsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCglbbGlzdCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5hbWVuZCBjb25mIC1zdGF0ZV0KbGFiZWwgJHVpX2NvbWwgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpwcm9jIHRyYWNlX2NvbW1pdF90eXBlIHt2YXJuYW1lIGFyZ3N9IHsKCWdsb2JhbCB1aV9jb21sIGNvbW1pdF90eXBlCglzd2l0Y2ggLWdsb2IgLS0gJGNvbW1pdF90eXBlIHsKCWluaXRpYWwgICAgICAge3NldCB0eHQge0luaXRpYWwgQ29tbWl0IE1lc3NhZ2U6fX0KCWFtZW5kICAgICAgICAge3NldCB0eHQge0FtZW5kZWQgQ29tbWl0IE1lc3NhZ2U6fX0KCWFtZW5kLWluaXRpYWwge3NldCB0eHQge0FtZW5kZWQgSW5pdGlhbCBDb21taXQgTWVzc2FnZTp9fQoJYW1lbmQtbWVyZ2UgICB7c2V0IHR4dCB7QW1lbmRlZCBNZXJnZSBDb21taXQgTWVzc2FnZTp9fQoJbWVyZ2UgICAgICAgICB7c2V0IHR4dCB7TWVyZ2UgQ29tbWl0IE1lc3NhZ2U6fX0KCSogICAgICAgICAgICAge3NldCB0eHQge0NvbW1pdCBNZXNzYWdlOn19Cgl9CgkkdWlfY29tbCBjb25mIC10ZXh0ICR0eHQKfQp0cmFjZSBhZGQgdmFyaWFibGUgY29tbWl0X3R5cGUgd3JpdGUgdHJhY2VfY29tbWl0X3R5cGUKcGFjayAkdWlfY29tbCAtc2lkZSBsZWZ0IC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5hbWVuZCAtc2lkZSByaWdodApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLm5ldyAtc2lkZSByaWdodAoKdGV4dCAkdWlfY29tbSAtYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMSBcCgktdW5kbyB0cnVlIFwKCS1tYXh1bmRvIDIwIFwKCS1hdXRvc2VwYXJhdG9ycyB0cnVlIFwKCS1yZWxpZWYgc3Vua2VuIFwKCS13aWR0aCA3NSAtaGVpZ2h0IDkgLXdyYXAgbm9uZSBcCgktZm9udCBmb250X2RpZmYgXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnNieSBzZXR9CnNjcm9sbGJhciAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnNieSBcCgktY29tbWFuZCBbbGlzdCAkdWlfY29tbSB5dmlld10KcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKcGFjayAkdWlfY29tbSAtc2lkZSBsZWZ0IC1maWxsIHkKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyIC1zaWRlIGxlZnQgLWZpbGwgeQoKIyAtLSBDb21taXQgTWVzc2FnZSBCdWZmZXIgQ29udGV4dCBNZW51CiMKc2V0IGN0eG0gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5jdHhtCm1lbnUgJGN0eG0gLXRlYXJvZmYgMAokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0N1dH0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7dGtfdGV4dEN1dCAkdWlfY29tbX0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDb3B5fSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHt0a190ZXh0Q29weSAkdWlfY29tbX0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtQYXN0ZX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7dGtfdGV4dFBhc3RlICR1aV9jb21tfQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0RlbGV0ZX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7JHVpX2NvbW0gZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdH0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1NlbGVjdCBBbGx9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge2ZvY3VzICR1aV9jb21tOyR1aV9jb21tIHRhZyBhZGQgc2VsIDAuMCBlbmR9CiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q29weSBBbGx9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQgewoJCSR1aV9jb21tIHRhZyBhZGQgc2VsIDAuMCBlbmQKCQl0a190ZXh0Q29weSAkdWlfY29tbQoJCSR1aV9jb21tIHRhZyByZW1vdmUgc2VsIDAuMCBlbmQKCX0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1NpZ24gT2ZmfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIGRvX3NpZ25vZmYKYmluZF9idXR0b24zICR1aV9jb21tICJ0a19wb3B1cCAkY3R4bSAlWCAlWSIKCiMgLS0gRGlmZiBIZWFkZXIKIwpzZXQgY3VycmVudF9kaWZmX3BhdGgge30Kc2V0IGN1cnJlbnRfZGlmZl9zaWRlIHt9CnNldCBkaWZmX2FjdGlvbnMgW2xpc3RdCnByb2MgdHJhY2VfY3VycmVudF9kaWZmX3BhdGgge3Zhcm5hbWUgYXJnc30gewoJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIGRpZmZfYWN0aW9ucyBmaWxlX3N0YXRlcwoJaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBlcSB7fX0gewoJCXNldCBzIHt9CgkJc2V0IGYge30KCQlzZXQgcCB7fQoJCXNldCBvIGRpc2FibGVkCgl9IGVsc2UgewoJCXNldCBwICRjdXJyZW50X2RpZmZfcGF0aAoJCXNldCBzIFttYXBkZXNjIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwKSAwXSAkcF0KCQlzZXQgZiB7RmlsZTp9CgkJc2V0IHAgW2VzY2FwZV9wYXRoICRwXQoJCXNldCBvIG5vcm1hbAoJfQoKCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5zdGF0dXMgY29uZmlndXJlIC10ZXh0ICRzCgkudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuZmlsZSBjb25maWd1cmUgLXRleHQgJGYKCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5wYXRoIGNvbmZpZ3VyZSAtdGV4dCAkcAoJZm9yZWFjaCB3ICRkaWZmX2FjdGlvbnMgewoJCXVwbGV2ZWwgIzAgJHcgJG8KCX0KfQp0cmFjZSBhZGQgdmFyaWFibGUgY3VycmVudF9kaWZmX3BhdGggd3JpdGUgdHJhY2VfY3VycmVudF9kaWZmX3BhdGgKCmZyYW1lIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlciAtYmFja2dyb3VuZCBvcmFuZ2UKbGFiZWwgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnN0YXR1cyBcCgktYmFja2dyb3VuZCBvcmFuZ2UgXAoJLXdpZHRoICRtYXhfc3RhdHVzX2Rlc2MgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpsYWJlbCAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuZmlsZSBcCgktYmFja2dyb3VuZCBvcmFuZ2UgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpsYWJlbCAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCBcCgktYmFja2dyb3VuZCBvcmFuZ2UgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5zdGF0dXMgLXNpZGUgbGVmdApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIC1zaWRlIGxlZnQKcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCAtZmlsbCB4CnNldCBjdHhtIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5jdHhtCm1lbnUgJGN0eG0gLXRlYXJvZmYgMAokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHl9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQgewoJCWNsaXBib2FyZCBjbGVhcgoJCWNsaXBib2FyZCBhcHBlbmQgXAoJCQktZm9ybWF0IFNUUklORyBcCgkJCS10eXBlIFNUUklORyBcCgkJCS0tICRjdXJyZW50X2RpZmZfcGF0aAoJfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KYmluZF9idXR0b24zIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5wYXRoICJ0a19wb3B1cCAkY3R4bSAlWCAlWSIKCiMgLS0gRGlmZiBCb2R5CiMKZnJhbWUgLnZwYW5lLmxvd2VyLmRpZmYuYm9keQpzZXQgdWlfZGlmZiAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnQKdGV4dCAkdWlfZGlmZiAtYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgktd2lkdGggODAgLWhlaWdodCAxNSAtd3JhcCBub25lIFwKCS1mb250IGZvbnRfZGlmZiBcCgkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J4IHNldH0gXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieSBzZXR9IFwKCS1zdGF0ZSBkaXNhYmxlZApzY3JvbGxiYXIgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnggLW9yaWVudCBob3Jpem9udGFsIFwKCS1jb21tYW5kIFtsaXN0ICR1aV9kaWZmIHh2aWV3XQpzY3JvbGxiYXIgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnkgLW9yaWVudCB2ZXJ0aWNhbCBcCgktY29tbWFuZCBbbGlzdCAkdWlfZGlmZiB5dmlld10KcGFjayAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieCAtc2lkZSBib3R0b20gLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKcGFjayAkdWlfZGlmZiAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuYm9keSAtc2lkZSBib3R0b20gLWZpbGwgYm90aCAtZXhwYW5kIDEKCiR1aV9kaWZmIHRhZyBjb25mIGRfY3IgLWVsaWRlIHRydWUKJHVpX2RpZmYgdGFnIGNvbmYgZF9AIC1mb3JlZ3JvdW5kIGJsdWUgLWZvbnQgZm9udF9kaWZmYm9sZAokdWlfZGlmZiB0YWcgY29uZiBkXysgLWZvcmVncm91bmQgeyMwMGEwMDB9CiR1aV9kaWZmIHRhZyBjb25mIGRfLSAtZm9yZWdyb3VuZCByZWQKCiR1aV9kaWZmIHRhZyBjb25mIGRfKysgLWZvcmVncm91bmQgeyMwMGEwMDB9CiR1aV9kaWZmIHRhZyBjb25mIGRfLS0gLWZvcmVncm91bmQgcmVkCiR1aV9kaWZmIHRhZyBjb25mIGRfK3MgXAoJLWZvcmVncm91bmQgeyMwMGEwMDB9IFwKCS1iYWNrZ3JvdW5kIHsjZTJlZmZhfQokdWlfZGlmZiB0YWcgY29uZiBkXy1zIFwKCS1mb3JlZ3JvdW5kIHJlZCBcCgktYmFja2dyb3VuZCB7I2UyZWZmYX0KJHVpX2RpZmYgdGFnIGNvbmYgZF9zKyBcCgktZm9yZWdyb3VuZCB7IzAwYTAwMH0gXAoJLWJhY2tncm91bmQgaXZvcnkxCiR1aV9kaWZmIHRhZyBjb25mIGRfcy0gXAoJLWZvcmVncm91bmQgcmVkIFwKCS1iYWNrZ3JvdW5kIGl2b3J5MQoKJHVpX2RpZmYgdGFnIGNvbmYgZDw8PDw8PDwgXAoJLWZvcmVncm91bmQgb3JhbmdlIFwKCS1mb250IGZvbnRfZGlmZmJvbGQKJHVpX2RpZmYgdGFnIGNvbmYgZD09PT09PT0gXAoJLWZvcmVncm91bmQgb3JhbmdlIFwKCS1mb250IGZvbnRfZGlmZmJvbGQKJHVpX2RpZmYgdGFnIGNvbmYgZD4+Pj4+Pj4gXAoJLWZvcmVncm91bmQgb3JhbmdlIFwKCS1mb250IGZvbnRfZGlmZmJvbGQKCiR1aV9kaWZmIHRhZyByYWlzZSBzZWwKCiMgLS0gRGlmZiBCb2R5IENvbnRleHQgTWVudQojCnNldCBjdHhtIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuY3R4bQptZW51ICRjdHhtIC10ZWFyb2ZmIDAKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtSZWZyZXNofSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHJlc2hvd19kaWZmCmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHl9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge3RrX3RleHRDb3B5ICR1aV9kaWZmfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHtmb2N1cyAkdWlfZGlmZjskdWlfZGlmZiB0YWcgYWRkIHNlbCAwLjAgZW5kfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDb3B5IEFsbH0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7CgkJJHVpX2RpZmYgdGFnIGFkZCBzZWwgMC4wIGVuZAoJCXRrX3RleHRDb3B5ICR1aV9kaWZmCgkJJHVpX2RpZmYgdGFnIHJlbW92ZSBzZWwgMC4wIGVuZAoJfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0FwcGx5L1JldmVyc2UgSHVua30gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7YXBwbHlfaHVuayAkY3Vyc29yWCAkY3Vyc29yWX0Kc2V0IHVpX2RpZmZfYXBwbHlodW5rIFskY3R4bSBpbmRleCBsYXN0XQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgJHVpX2RpZmZfYXBwbHlodW5rIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0RlY3JlYXNlIEZvbnQgU2l6ZX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7aW5jcl9mb250X3NpemUgZm9udF9kaWZmIC0xfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtJbmNyZWFzZSBGb250IFNpemV9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge2luY3JfZm9udF9zaXplIGZvbnRfZGlmZiAxfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Nob3cgTGVzcyBDb250ZXh0fSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHtpZiB7JHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkgPj0gMn0gewoJCWluY3IgcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSAtMQoJCXJlc2hvd19kaWZmCgl9fQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTaG93IE1vcmUgQ29udGV4dH0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7CgkJaW5jciByZXBvX2NvbmZpZyhndWkuZGlmZmNvbnRleHQpCgkJcmVzaG93X2RpZmYKCX0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBzZXBhcmF0b3IKJGN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsIHtPcHRpb25zLi4ufSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIGRvX29wdGlvbnMKYmluZF9idXR0b24zICR1aV9kaWZmICIKCXNldCBjdXJzb3JYICV4CglzZXQgY3Vyc29yWSAleQoJaWYge1wkdWlfaW5kZXggZXEgXCRjdXJyZW50X2RpZmZfc2lkZX0gewoJCSRjdHhtIGVudHJ5Y29uZiAkdWlfZGlmZl9hcHBseWh1bmsgLWxhYmVsIHtVbnN0YWdlIEh1bmsgRnJvbSBDb21taXR9Cgl9IGVsc2UgewoJCSRjdHhtIGVudHJ5Y29uZiAkdWlfZGlmZl9hcHBseWh1bmsgLWxhYmVsIHtTdGFnZSBIdW5rIEZvciBDb21taXR9Cgl9Cgl0a19wb3B1cCAkY3R4bSAlWCAlWQoiCnVuc2V0IHVpX2RpZmZfYXBwbHlodW5rCgojIC0tIFN0YXR1cyBCYXIKIwpzZXQgdWlfc3RhdHVzX3ZhbHVlIHtJbml0aWFsaXppbmcuLi59CmxhYmVsIC5zdGF0dXMgLXRleHR2YXJpYWJsZSB1aV9zdGF0dXNfdmFsdWUgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWJvcmRlcndpZHRoIDEgXAoJLXJlbGllZiBzdW5rZW4gXAoJLWZvbnQgZm9udF91aQpwYWNrIC5zdGF0dXMgLWFuY2hvciB3IC1zaWRlIGJvdHRvbSAtZmlsbCB4CgojIC0tIExvYWQgZ2VvbWV0cnkKIwpjYXRjaCB7CnNldCBnbSAkcmVwb19jb25maWcoZ3VpLmdlb21ldHJ5KQp3bSBnZW9tZXRyeSAuIFtsaW5kZXggJGdtIDBdCi52cGFuZSBzYXNoIHBsYWNlIDAgXAoJW2xpbmRleCBbLnZwYW5lIHNhc2ggY29vcmQgMF0gMF0gXAoJW2xpbmRleCAkZ20gMV0KLnZwYW5lLmZpbGVzIHNhc2ggcGxhY2UgMCBcCglbbGluZGV4ICRnbSAyXSBcCglbbGluZGV4IFsudnBhbmUuZmlsZXMgc2FzaCBjb29yZCAwXSAxXQp1bnNldCBnbQp9CgojIC0tIEtleSBCaW5kaW5ncwojCmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVJldHVybj4ge2RvX2NvbW1pdDticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktaT4ge2RvX2FkZF9hbGw7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LUk+IHtkb19hZGRfYWxsO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS14PiB7dGtfdGV4dEN1dCAlVzticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktWD4ge3RrX3RleHRDdXQgJVc7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LWM+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktQz4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS12PiB7dGtfdGV4dFBhc3RlICVXOyAlVyBzZWUgaW5zZXJ0OyBicmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktVj4ge3RrX3RleHRQYXN0ZSAlVzsgJVcgc2VlIGluc2VydDsgYnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LWE+IHslVyB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1BPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KCmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LXg+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktWD4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1jPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LUM+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktdj4ge2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1WPiB7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LWE+IHslVyB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1BPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LVVwPiAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktRG93bj4gICB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAgMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1MZWZ0PiAgIHtjYXRjaCB7JVcgeHZpZXcgc2Nyb2xsIC0xIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LVJpZ2h0PiAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxCdXR0b24tMT4gICB7Zm9jdXMgJVd9CgppZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJYmluZCAuIDwkTTFCLUtleS1uPiBkb19jcmVhdGVfYnJhbmNoCgliaW5kIC4gPCRNMUItS2V5LU4+IGRvX2NyZWF0ZV9icmFuY2gKfQoKYmluZCBhbGwgPEtleS1GNT4gZG9fcmVzY2FuCmJpbmQgYWxsIDwkTTFCLUtleS1yPiBkb19yZXNjYW4KYmluZCBhbGwgPCRNMUItS2V5LVI+IGRvX3Jlc2NhbgpiaW5kIC4gICA8JE0xQi1LZXktcz4gZG9fc2lnbm9mZgpiaW5kIC4gICA8JE0xQi1LZXktUz4gZG9fc2lnbm9mZgpiaW5kIC4gICA8JE0xQi1LZXktaT4gZG9fYWRkX2FsbApiaW5kIC4gICA8JE0xQi1LZXktST4gZG9fYWRkX2FsbApiaW5kIC4gICA8JE0xQi1LZXktUmV0dXJuPiBkb19jb21taXQKZm9yZWFjaCBpIFtsaXN0ICR1aV9pbmRleCAkdWlfd29ya2Rpcl0gewoJYmluZCAkaSA8QnV0dG9uLTE+ICAgICAgICJ0b2dnbGVfb3JfZGlmZiAgICAgICAgICRpICV4ICV5OyBicmVhayIKCWJpbmQgJGkgPCRNMUItQnV0dG9uLTE+ICAiYWRkX29uZV90b19zZWxlY3Rpb24gICAkaSAleCAleTsgYnJlYWsiCgliaW5kICRpIDxTaGlmdC1CdXR0b24tMT4gImFkZF9yYW5nZV90b19zZWxlY3Rpb24gJGkgJXggJXk7IGJyZWFrIgp9CnVuc2V0IGkKCnNldCBmaWxlX2xpc3RzKCR1aV9pbmRleCkgW2xpc3RdCnNldCBmaWxlX2xpc3RzKCR1aV93b3JrZGlyKSBbbGlzdF0KCnNldCBIRUFEIHt9CnNldCBQQVJFTlQge30Kc2V0IE1FUkdFX0hFQUQgW2xpc3RdCnNldCBjb21taXRfdHlwZSB7fQpzZXQgZW1wdHlfdHJlZSB7fQpzZXQgY3VycmVudF9icmFuY2gge30Kc2V0IGN1cnJlbnRfZGlmZl9wYXRoIHt9CnNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKCndtIHRpdGxlIC4gIlthcHBuYW1lXSAoW2ZpbGUgbm9ybWFsaXplIFtmaWxlIGRpcm5hbWUgW2dpdGRpcl1dXSkiCmZvY3VzIC1mb3JjZSAkdWlfY29tbQoKIyAtLSBXYXJuIHRoZSB1c2VyIGFib3V0IGVudmlyb25tZW50YWwgcHJvYmxlbXMuICBDeWd3aW4ncyBUY2wKIyAgICBkb2VzICpub3QqIHBhc3MgaXRzIGVudiBhcnJheSBvbnRvIGFueSBwcm9jZXNzZXMgaXQgc3Bhd25zLgojICAgIFRoaXMgbWVhbnMgdGhhdCBnaXQgcHJvY2Vzc2VzIGdldCBub25lIG9mIG91ciBlbnZpcm9ubWVudC4KIwppZiB7W2lzX0N5Z3dpbl19IHsKCXNldCBpZ25vcmVkX2VudiAwCglzZXQgc3VnZ2VzdF91c2VyIHt9CglzZXQgbXNnICJQb3NzaWJsZSBlbnZpcm9ubWVudCBpc3N1ZXMgZXhpc3QuCgpUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcHJvYmFibHkKZ29pbmcgdG8gYmUgaWdub3JlZCBieSBhbnkgR2l0IHN1YnByb2Nlc3MgcnVuCmJ5IFthcHBuYW1lXToKCiIKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZW52XSB7CgkJc3dpdGNoIC1yZWdleHAgLS0gJG5hbWUgewoJCXteR0lUX0lOREVYX0ZJTEUkfSAtCgkJe15HSVRfT0JKRUNUX0RJUkVDVE9SWSR9IC0KCQl7XkdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTJH0gLQoJCXteR0lUX0RJRkZfT1BUUyR9IC0KCQl7XkdJVF9FWFRFUk5BTF9ESUZGJH0gLQoJCXteR0lUX1BBR0VSJH0gLQoJCXteR0lUX1RSQUNFJH0gLQoJCXteR0lUX0NPTkZJRyR9IC0KCQl7XkdJVF9DT05GSUdfTE9DQUwkfSAtCgkJe15HSVRfKEFVVEhPUnxDT01NSVRURVIpX0RBVEUkfSB7CgkJCWFwcGVuZCBtc2cgIiAtICRuYW1lXG4iCgkJCWluY3IgaWdub3JlZF9lbnYKCQl9CgkJe15HSVRfKEFVVEhPUnxDT01NSVRURVIpXyhOQU1FfEVNQUlMKSR9IHsKCQkJYXBwZW5kIG1zZyAiIC0gJG5hbWVcbiIKCQkJaW5jciBpZ25vcmVkX2VudgoJCQlzZXQgc3VnZ2VzdF91c2VyICRuYW1lCgkJfQoJCX0KCX0KCWlmIHskaWdub3JlZF9lbnYgPiAwfSB7CgkJYXBwZW5kIG1zZyAiClRoaXMgaXMgZHVlIHRvIGEga25vd24gaXNzdWUgd2l0aCB0aGUKVGNsIGJpbmFyeSBkaXN0cmlidXRlZCBieSBDeWd3aW4uIgoKCQlpZiB7JHN1Z2dlc3RfdXNlciBuZSB7fX0gewoJCQlhcHBlbmQgbXNnICIKCkEgZ29vZCByZXBsYWNlbWVudCBmb3IgJHN1Z2dlc3RfdXNlcgppcyBwbGFjaW5nIHZhbHVlcyBmb3IgdGhlIHVzZXIubmFtZSBhbmQKdXNlci5lbWFpbCBzZXR0aW5ncyBpbnRvIHlvdXIgcGVyc29uYWwKfi8uZ2l0Y29uZmlnIGZpbGUuCiIKCQl9CgkJd2Fybl9wb3B1cCAkbXNnCgl9Cgl1bnNldCBpZ25vcmVkX2VudiBtc2cgc3VnZ2VzdF91c2VyIG5hbWUKfQoKIyAtLSBPbmx5IGluaXRpYWxpemUgY29tcGxleCBVSSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RheSBydW5uaW5nLgojCmlmIHtbaXNfZW5hYmxlZCB0cmFuc3BvcnRdfSB7Cglsb2FkX2FsbF9yZW1vdGVzCglsb2FkX2FsbF9oZWFkcwoKCXBvcHVsYXRlX2JyYW5jaF9tZW51Cglwb3B1bGF0ZV9mZXRjaF9tZW51Cglwb3B1bGF0ZV9wdXNoX21lbnUKfQoKIyAtLSBPbmx5IHN1Z2dlc3QgYSBnYyBydW4gaWYgd2UgYXJlIGdvaW5nIHRvIHN0YXkgcnVubmluZy4KIwppZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdfSB7CglzZXQgb2JqZWN0X2xpbWl0IDIwMDAKCWlmIHtbaXNfV2luZG93c119IHtzZXQgb2JqZWN0X2xpbWl0IDIwMH0KCXJlZ2V4cCB7XihbMC05XSspIG9iamVjdHMsfSBbZXhlYyBnaXQgY291bnQtb2JqZWN0c10gX2p1bmsgb2JqZWN0c19jdXJyZW50CglpZiB7JG9iamVjdHNfY3VycmVudCA+PSAkb2JqZWN0X2xpbWl0fSB7CgkJaWYge1thc2tfcG9wdXAgXAoJCQkiVGhpcyByZXBvc2l0b3J5IGN1cnJlbnRseSBoYXMgJG9iamVjdHNfY3VycmVudCBsb29zZSBvYmplY3RzLgoKVG8gbWFpbnRhaW4gb3B0aW1hbCBwZXJmb3JtYW5jZSBpdCBpcyBzdHJvbmdseQpyZWNvbW1lbmRlZCB0aGF0IHlvdSBjb21wcmVzcyB0aGUgZGF0YWJhc2UKd2hlbiBtb3JlIHRoYW4gJG9iamVjdF9saW1pdCBsb29zZSBvYmplY3RzIGV4aXN0LgoKQ29tcHJlc3MgdGhlIGRhdGFiYXNlIG5vdz8iXSBlcSB5ZXN9IHsKCQkJZG9fZ2MKCQl9Cgl9Cgl1bnNldCBvYmplY3RfbGltaXQgX2p1bmsgb2JqZWN0c19jdXJyZW50Cn0KCmxvY2tfaW5kZXggYmVnaW4tcmVhZAphZnRlciAxIGRvX3Jlc2Nhbgo=