IyEvYmluL2Jhc2gKCiMjCiMgQ29weXJpZ2h0IDIwMTUgVGVsZWbzbmljYSBJbnZlc3RpZ2FjafNuIHkgRGVzYXJyb2xsbywgUy5BLlUuCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3BlbnZpbQojIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQojIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCiMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwojIHVuZGVyIHRoZSBMaWNlbnNlLgojCiMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQojIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKIyMKCiNHZXQgY29uZmlndXJhdGlvbiBvZiBhIGhvc3QgZm9yIHVzaW5nIGl0IGFzIGEgY29tcHV0ZSBub2RlCgpmdW5jdGlvbiB1c2FnZSgpewogICAgZWNobyAgLWUgInVzYWdlOiAkMCB1c2VyIGlwX25hbWUgWz4+IGhvc3QueWFtbF1cbiAgR2V0IGhvc3QgcGFyYW1ldGVycyBhbmQgZ2VuZXJhdGVkIGEgeWFtbCBmaWxlIHRvIGJlIHVzZWQgZm9yIG9wZW52aW0gaG9zdC1hZGQiCiAgICBleGl0IDEKfQoKZnVuY3Rpb24gbG9hZF92Zl9kcml2ZXIoKXsKICBsb2NhbCBwZl9kcml2ZXI9JDEKICBpZiBbWyBgbHNtb2QgfCBjdXQgLWQiICIgLWYxIHwgZ3JlcCAkcGZfZHJpdmVyIHwgZ3JlcCAtdiB2ZmAgXV0gJiYgW1sgISBgbHNtb2QgfCBjdXQgLWQiICIgLWYxIHwgZ3JlcCAke3BmX2RyaXZlcn12ZmAgXV0KICB0aGVuCiAgICA+JjIgZWNobyAiJHBmX2RyaXZlciBpcyBsb2FkZWQgYnV0IG5vdCAke3BmX2RyaXZlcn12Zi4gVGhpcyBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBwcm9wZXJseSBhZGQgU1ItSU9WLiIKICAgIHJlYWQgLXAgIkRvIHlvdSB3YW50IHRvIGxvYWQgJHtwZl9kcml2ZXJ9dmYgW1kvbl0gIiBsb2FkX2RyaXZlcgogICAgY2FzZSAkbG9hZF9kcml2ZXIgaW4KICAgICAgW25OXSogKSBleGl0IDE7OwogICAgICAqICkgPiYyIGVjaG8gIkxvYWRpbmcgJHtwZl9kcml2ZXJ9dmYuLi4iCiAgICAgICAgICBtb2Rwcm9iZSAke3BmX2RyaXZlcn12ZjsKICAgICAgICAgID4mMiBlY2hvICJSZWxvYWRpbmcgJHtwZl9kcml2ZXJ9Li4uIgogICAgICAgICAgbW9kcHJvYmUgLXIgJHBmX2RyaXZlcjsKICAgICAgICAgIG1vZHByb2JlICRwZl9kcml2ZXI7OwogICAgZXNhYwogIGZpCn0KCmZ1bmN0aW9uIHJlbW92ZV92Zl9kcml2ZXIoKXsKICBsb2NhbCBwZl9kcml2ZXI9JDEKICBpZiBbWyBgbHNtb2QgfCBjdXQgLWQiICIgLWYxIHwgZ3JlcCAkcGZfZHJpdmVyIHwgZ3JlcCAtdiB2ZmAgXV0gJiYgW1sgYGxzbW9kIHwgY3V0IC1kIiAiIC1mMSB8IGdyZXAgJHtwZl9kcml2ZXJ9dmZgIF1dCiAgdGhlbgogICAgPiYyIGVjaG8gIiR7cGZfZHJpdmVyfXZmIGlzIGxvYWRlZC4gSW4gb3JkZXIgdG8gZW5zdXJlIHByb3BlciBTUi1JT1YgYmVoYXZpb3IgdGhlIGRyaXZlciBtdXN0IGJlIHJlbW92ZWQuIgogICAgcmVhZCAtcCAiRG8geW91IHdhbnQgdG8gcmVtb3ZlICR7cGZfZHJpdmVyfXZmIG5vdz8gW1kvbl0gIiByZW1vdmVfZHJpdmVyCiAgICBjYXNlICRyZW1vdmVfZHJpdmVyIGluCiAgICAgIFtuTl0qICkgPiYyIGVjaG8gIk9LLiBSZW1lbWJlciB0byByZW1vdmUgdGhlIGRyaXZlciBwcmlvciBzdGFydCB1c2luZyB0aGUgY29tcHV0ZSBub2RlIGV4ZWN1dGluZzoiOwogICAgICAgICAgICAgID4mMiBlY2hvICJtb2Rwcm9iZSAtciAke3BmX2RyaXZlcn12ZiI7CiAgICAgICAgICAgICAgPiYyIGVjaG8gIm1vZHByb2JlIC1yICR7cGZfZHJpdmVyfSI7CiAgICAgICAgICAgICAgPiYyIGVjaG8gIm1vZHByb2JlICR7cGZfZHJpdmVyfSI7OwogICAgICAqICkgPiYyIGVjaG8gIlJlbW92aW5nICR7cGZfZHJpdmVyfXZmLi4uIgogICAgICAgICAgbW9kcHJvYmUgLXIgJHtwZl9kcml2ZXJ9dmY7CiAgICAgICAgICA+JjIgZWNobyAiUmVsb2FkaW5nICR7cGZfZHJpdmVyfS4uLiIKICAgICAgICAgIG1vZHByb2JlIC1yICRwZl9kcml2ZXI7CiAgICAgICAgICBtb2Rwcm9iZSAkcGZfZHJpdmVyOzsKICAgIGVzYWMKICBmaQp9CgpmdW5jdGlvbiBnZXRfaGFzaF92YWx1ZSgpIHsgICBlY2hvIGBldmFsICBlY2hvICRce1xgZWNobyAkMVskMl1cYFx9YDsgfQoKZnVuY3Rpb24geG1scGF0aF9hcmdzKCkKewogIGxvY2FsIGV4cHI9IiR7MS8vXC8vIH0iCiAgbG9jYWwgcGF0aD0oKQogIGxvY2FsIGNodW5rIHRhZyBkYXRhCiAgbG9jYWwgZXhpdF9jb2RlPTEKICBsb2NhbCBwcmludF9saW5lPTAKICBsb2NhbCBjbG9zaW5nX3RhZz0wCgogIHdoaWxlIElGUz0nJyByZWFkIC1yIC1kICc8JyBjaHVuazsgZG8KICAgIGRhdGE9YXJndW1lbnRzPSIiCiAgICBJRlM9Jz4nIHJlYWQgLXIgdGFnX2FyZyBkYXRhIDw8PCAiJGNodW5rIgogICAgSUZTPScgJyByZWFkIC1yIHRhZyBhcmd1bWVudHMgPDw8ICIkdGFnX2FyZyIKICAgICNJZiBsYXN0IHRhZyB3YXMgc2luZ2xlIGxldmVsIHJlbW92ZSBpdCBmcm9tIHBhdGgKICAgIGlmIFtbICRjbG9zaW5nX3RhZyAtZXEgMSBdXSAKICAgIHRoZW4gCiAgICAgIHVuc2V0IHBhdGhbJHsjcGF0aFtAXX0tMV0KICAgICAgY2xvc2luZ190YWc9MAogICAgZmkKICAgICNJbiBjYXNlIHRoZSB0YWcgaXMgY2xvc2VkIGluIHRoZSBzYW1lIGxpbmUgbWFyayBpdAogICAgW1sgJGFyZ3VtZW50cyA9ID8qJy8nIF1dICYmIGNsb3NpbmdfdGFnPTEKICAgIGFyZ3VtZW50cz0iJHthcmd1bWVudHMvL1wvL30iCiAgICBjYXNlICIkdGFnIiBpbgogICAgICAnPycqKSA7OwogICAgICAnIS0tJyopIDs7CiAgICAgID8qJy8nKSA7OwogICAgICAnLyc/KikgdW5zZXQgcGF0aFskeyNwYXRoW0BdfS0xXSA7OwogICAgICA/KikgcGF0aCs9KCIkdGFnIik7OyAgICAgICAgCiAgICBlc2FjCiAgICAKICAgICNlY2hvICJcIiR7cGF0aFtAXX1cIiBcIiRleHByXCIgXCIkZGF0YVwiIFwiJGFyZ3VtZW50c1wiICRleGl0X2NvZGUgJHByaW50X2xpbmUiCiAgICAKICAgIGlmIFtbICIke3BhdGhbQF19IiA9PSAiJGV4cHIiIF1dCiAgICB0aGVuCiAgICAgICNJZiB0aGVyZSBpcyBkYXRhIHByaW50IGl0IGFuZCBhcHBlbmQgYXJndW1lbnRzIGlmIGFueQogICAgICBpZiBbICIkZGF0YSIgIT0gIiIgXSAKICAgICAgdGhlbgogICAgICAgIGVjaG8gIiRkYXRhICRhcmd1bWVudHMiCiAgICAgICAgI3JldHVybiBjb2RlIDAgbWVhbnMgZGF0YSB3YXMgZm91bmQKICAgICAgICBleGl0X2NvZGU9MAogICAgICAgIGNvbnRpbnVlCiAgICAgICNpZiB0aGVyZSBpcyBubyBkYXRhIGJ1dCB0aGVyZSBhcmUgYXJndW1lbnRzIHByaW50IGFyZ3VtZW50cwogICAgICBlbGlmIFsgIiRhcmd1bWVudHMiICE9ICIiIF0KICAgICAgdGhlbgogICAgICAgIGVjaG8gIiRhcmd1bWVudHMiCiAgICAgICAgI3JldHVybiBjb2RlIDIgbWVhbnMgbm8gZGF0YSBidXQgYXJndW1lbnRzIHdlcmUgZm91bmQKICAgICAgICBleGl0X2NvZGU9MgogICAgICAgIGNvbnRpbnVlCiAgICAgICNvdGhlcndpc2Ugc3dpdGNoIGZsYWcgdG8gc3RhcnQvc3RvcCBlY2hvaW5nIGVhY2ggbGluZSB1bnRpbCB0aGUgdGFnIGlzIGNsb3NlZAogICAgICBlbGlmIFtbICRleGl0X2NvZGUgLWVxIDEgXV0KICAgICAgdGhlbgogICAgICAgIHByaW50X2xpbmU9JCgoKHByaW50X2xpbmUrMSklMikpCiAgICAgICAgI3JldHVybiBjb2RlIDMgbWVhbnMgdGhhdCB0aGUgd2hvbGUgeG1sIHNlZ21lbnQgaXMgcmV0dXJuZWQKICAgICAgICBleGl0X2NvZGU9MwogICAgICBmaQogICAgZmkKICAgIFtbICRwcmludF9saW5lID09ICIxIiBdXSAmJiBlY2hvICI8IiRjaHVuawogIGRvbmUKICByZXR1cm4gJGV4aXRfY29kZQp9CgoKI2NoZWNrIHJvb3QgcHJpdmlsZWdlcyBhbmQgbm9uIGEgcm9vdCB1c2VyIGJlaGluZAoKW1sgIiQjIiAtbHQgIjIiIF1dICYmIGVjaG8gIk1pc3NpbmcgcGFyYW1ldGVycyIgJiYgdXNhZ2UKbG9hZF92Zl9kcml2ZXIgaXhnYmUKbG9hZF92Zl9kcml2ZXIgaTQwZQoKSE9TVF9OQU1FPWBjYXQgL2V0Yy9ob3N0bmFtZWAKRkVBVFVSRVM9YGdyZXAgIl5mbGFncyIgIC9wcm9jL2NwdWluZm9gCkZFQVRVUkVTX0xJU1Q9IiIKaWYgZWNobyAkRkVBVFVSRVMgfCBncmVwIC1xIHBkcGUxZ2IgOyB0aGVuIEZFQVRVUkVTX0xJU1Q9IiR7RkVBVFVSRVNfTElTVH0sbHBzIjsgIGZpCmlmIGVjaG8gJEZFQVRVUkVTIHwgZ3JlcCAtcSBkY2EgICAgIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LGRpb2MiOyBmaQppZiBlY2hvICRGRUFUVVJFUyB8IGVncmVwIC1xICIodm14fHN2bSkiIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LGh3c3YiOyBmaQppZiBlY2hvICRGRUFUVVJFUyB8IGVncmVwIC1xICIoZXB0fG5wdCkiIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LHRsYnBzIjsgZmkKaWYgZWNobyAkRkVBVFVSRVMgfCBncmVwIC1xIGh0ICAgICAgOyB0aGVuIEZFQVRVUkVTX0xJU1Q9IiR7RkVBVFVSRVNfTElTVH0saHQiOyAgIGZpCmlmIHVuYW1lIC1tIHwgZ3JlcCAtcSB4ODZfNjQgICAgICAgIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LDY0YiI7ICBmaQppZiBjYXQgL3Zhci9sb2cvZG1lc2cgfCBncmVwIC1xIC1lIEludGVsLUlPTU1VICAgOyB0aGVuIEZFQVRVUkVTX0xJU1Q9IiR7RkVBVFVSRVNfTElTVH0saW9tbXUiOyAgZmkKRkVBVFVSRVNfTElTVD0ke0ZFQVRVUkVTX0xJU1QjLH0KCk5VTUFTPWBnYXdrICdCRUdJTntudW1hcz0wO30KICAoJDE9PSJwaHlzaWNhbCIgJiYgJDI9PSJpZCIgKXsgaWYgKCQ0KzE+bnVtYXMpe251bWFzPSQ0KzF9IH07CiAgRU5Ee3ByaW50ZigiJWQiLG51bWFzKTt9JyAvcHJvYy9jcHVpbmZvYAoKQ1BVUz1gZ2F3ayAnKCQxPT0icHJvY2Vzc29yIil7cHJvPSQzO30KICAoJDE9PSJwaHlzaWNhbCIgJiYgJDI9PSJpZCIpeyBwaHk9JDQ7fQogICgkMT09ImNvcmUiICYmICQyPT0iaWQiKXtwcmludGYgIiAlZC0lZC0lZCIsIHBoeSwkNCxwcm87fScgL3Byb2MvY3B1aW5mb2AKCmlmIGdyZXAgLXEgaXNvbGNwdXMgL3Byb2MvY21kbGluZQp0aGVuCiAgaXNvbGNwdXM9YGNhdCAvcHJvYy9jbWRsaW5lYAogIGlzb2xjcHVzPSR7aXNvbGNwdXMjIyppc29sY3B1cz19CiAgaXNvbGNwdXM9JHtpc29sY3B1cyUlICp9CiAgaXNvbGNwdXM9JHtpc29sY3B1cy8vLC8gfQplbHNlCiAgaXNvbGNwdXM9IiIKZmkKCgojb2J0YWluIGludGVyZmFjZXMgaW5mb3JtYXRpb24KdW5zZXQgZHBpZApyZWFkIC1wICJEbyB5b3Ugd2FudCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIGNvbm5lY3Rpdml0eSBpbmZvcm1hdGlvbiAoZGF0YXBhdGhpZC9kcGlkIG9mIHRoZSBzd2l0Y2ggYW5kIHN3aXRjaCBwb3J0IGlkKT8gW1kvbl0gIiBjb25uX2luZm8KY2FzZSAkY29ubl9pbmZvIGluCiAgICBbTm5dKiApIHByb3ZfY29ubj1mYWxzZTs7CiAgICAqICkgcHJvdl9jb25uPXRydWU7CiAgICAgICAgcmVhZCAtcCAiV2hhdCBpcyB0aGUgc3dpdGNoIGRhcGFwYXRoaWQvZHBkaT8gKDAxOjAyOjAzOjA0OjA1OjA2OjA3OjA4KSAiIGRwaWQ7CiAgICAgICAgW1sgLXogJGRwaWQgXV0gJiYgZHBpZD0iMDE6MDI6MDM6MDQ6MDU6MDY6MDc6MDgiOwogICAgICAgIFBPUlRfUkFORE9NPSRSQU5ET00KICAgICAgICBpZmFjZV9jb3VudGVyPTA7Owplc2FjICAgICAgIApPTERJRlM9JElGUwpJRlM9JCdcbicKdW5zZXQgUEZfbGlzdAp1bnNldCBWRl9saXN0CmZvciBkZXZpY2UgaW4gYHZpcnNoIG5vZGVkZXYtbGlzdCAtLWNhcCBuZXQgfCBncmVwIC12IG5ldF9sb18wMF8wMF8wMF8wMF8wMF8wMGAKZG8Kdmlyc2ggbm9kZWRldi1kdW1weG1sICRkZXZpY2UgPiBkZXZpY2VfeG1sCm5hbWU9YHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvaW50ZXJmYWNlIiA8IGRldmljZV94bWxgCm5hbWU9IiR7bmFtZS8vIC99IgphZGRyZXNzPWB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2FkZHJlc3MiIDwgZGV2aWNlX3htbGAKYWRkcmVzcz0iJHthZGRyZXNzLy8gL30iCnBhcmVudD1geG1scGF0aF9hcmdzICJkZXZpY2UvcGFyZW50IiA8IGRldmljZV94bWxgCnBhcmVudD0iJHtwYXJlbnQvLyAvfSIKI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVkIHZhcmlhYmxlcyAnc3BlZWQnIGFuZCAnc3RhdGUnCmV2YWwgYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvbGluayIgPCBkZXZpY2VfeG1sYAp2aXJzaCBub2RlZGV2LWR1bXB4bWwgJHBhcmVudCA+IHBhcmVudF94bWwKZHJpdmVyPWB4bWxwYXRoX2FyZ3MgImRldmljZS9kcml2ZXIvbmFtZSIgPCBwYXJlbnRfeG1sYApbICQ/IC1lcSAxIF0gJiYgZHJpdmVyPSJOL0EiCmRyaXZlcj0iJHtkcml2ZXIvLyAvfSIKCiNJZiB0aGUgZGV2aWNlIGlzIG5vdCB1cCB0cnkgdG8gYnJpbmcgaXQgdXAgYW5kIHJlbG9hZCBzdGF0ZQppZiBbWyAkc3RhdGUgPT0gJ2Rvd24nIF1dICYmICggW1sgJGRyaXZlciA9PSAiaXhnYmUiIF1dIHx8IFtbICRkcml2ZXIgPT0gImk0MGUiIF1dICkKdGhlbgogID4mMiBlY2hvICIkbmFtZSBpcyBkb3duLiBUcnlpbmcgdG8gYnJpbmcgaXQgdXAiCiAgaWZjb25maWcgJG5hbWUgdXAKICBzbGVlcCAyCiAgdmlyc2ggbm9kZWRldi1kdW1weG1sICRkZXZpY2UgPiBkZXZpY2VfeG1sCiAgZXZhbCBgeG1scGF0aF9hcmdzICJkZXZpY2UvY2FwYWJpbGl0eS9saW5rIiA8IGRldmljZV94bWxgCmZpCgppZiBbWyAkc3RhdGUgPT0gJ2Rvd24nIF1dICAmJiAoIFtbICRkcml2ZXIgPT0gIml4Z2JlIiBdXSB8fCBbWyAkZHJpdmVyID09ICJpNDBlIiBdXSApCnRoZW4KICAgID4mMiBlY2hvICJJbnRlcmZhY2VzIG11c3QgYmUgY29ubmVjdGVkIGFuZCB1cCBpbiBvcmRlciB0byBwcm9wZXJseSBkZXRlY3QgdGhlIHNwZWVkLiBZb3UgY2FuIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBtYW51YWxseSBvciBza2lwIHRoZSBpbnRlcmZhY2UiCiAgICBrZWVwX2Fza2luZz10cnVlCiAgICBza2lwX2ludGVyZmFjZT10cnVlCiAgICB1bnNldCBzcGVlZAogICAgd2hpbGUgJGtlZXBfYXNraW5nOyBkbwogICAgICAgIHJlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHNraXAgaW50ZXJmYWNlICRuYW1lICgkYWRkcmVzcykgW3kvTl0gIiAtaSAibiIgc2tpcAogICAgICAgIGNhc2UgJHNraXAgaW4KICAgICAgICAgICAgW1l5XSogKSBrZWVwX2Fza2luZz1mYWxzZTs7CiAgICAgICAgICAgICogKSBza2lwX2ludGVyZmFjZT1mYWxzZTsKICAgICAgICAgICAgICAgIGRlZmF1bHRfc3BlZWQ9IjEwMDAwIgogICAgICAgICAgICAgICAgd2hpbGUgJGtlZXBfYXNraW5nOyBkbwogICAgICAgICAgICAgICAgICAgcmVhZCAtcCAiV2hhdCBpcyB0aGUgc3BlZWQgb2YgdGhlIGludGVyZmFjZSBleHByZXNzZWQgaW4gTWJwcz8gKCRkZWZhdWx0X3NwZWVkKSAiIHNwZWVkOwogICAgICAgICAgICAgICAgICAgW1sgLXogJHNwZWVkIF1dICYmIHNwZWVkPSRkZWZhdWx0X3NwZWVkCiAgICAgICAgICAgICAgICAgICBbWyAkc3BlZWQgPX4gJyd8KlshMC05XSBdXSAmJiBlY2hvICJUaGUgaW5wdXQgbXVzdCBiZSBhbiBpbnRlZ2VyIiAmJiBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgIGtlZXBfYXNraW5nPWZhbHNlIDsKICAgICAgICAgICAgICAgIGRvbmU7OwogICAgICAgIGVzYWMKICAgIGRvbmUKCiAgICRza2lwX2ludGVyZmFjZSAmJiBjb250aW51ZQpmaQojdGhlIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgYSAnbm9kZScgdmFyaWFibGUKZXZhbCBgeG1scGF0aF9hcmdzICJkZXZpY2UvY2FwYWJpbGl0eS9udW1hIiA8IHBhcmVudF94bWxgCiN0aGUgZm9sbG93aW5nIGxpbmUgY3JlYXRlcyB0aGUgdmFyaWFibGUgJ3R5cGUnCiNpbiBjYXNlIHRoZSBpbnRlcmZhY2UgaXMgYSBQRiB0aGUgdmFsdWUgaXMgJ3ZpcnRfZnVuY3Rpb25zJwojaW4gY2FzZSB0aGUgaW50ZXJmYWNlIGlzIGEgVkYgdGhlIHZhbHVlIGlzICdwaHlzX2Z1bmN0aW9uJwp0eXBlPSJOL0EiCmV2YWwgYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvY2FwYWJpbGl0eSIgPCBwYXJlbnRfeG1sYAojb2J0YWluIHBjaQojdGhlIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgdGhlIHZhcmlhYmxlcyAnZG9tYWluJyAnYnVzJyAnc2xvdCcgYW5kICdmdW5jdGlvbicKZXZhbCBgeG1scGF0aF9hcmdzICJkZXZpY2UvY2FwYWJpbGl0eS9pb21tdUdyb3VwL2FkZHJlc3MiIDwgcGFyZW50X3htbGAKcGNpPSIke2RvbWFpbiMqeH06JHtidXMjKnh9OiR7c2xvdCMqeH0uJHtmdW5jdGlvbiMqeH0iCnVuZGVyc2NvcmVkX3BjaT0iJHtwY2kvL1w6L199Igp1bmRlcnNjb3JlZF9wY2k9InBjaV8ke3VuZGVyc2NvcmVkX3BjaS8vXC4vX30iCgppZiAoIFtbICRkcml2ZXIgPT0gIml4Z2JlIiBdXSB8fCBbWyAkZHJpdmVyID09ICJpNDBlIiBdXSApIAp0aGVuCiAgdW5kZXJzY29yZWRfcGNpPSJwZiIkdW5kZXJzY29yZWRfcGNpCiAgUEZfbGlzdFskeyNQRl9saXN0W0BdfV09JHVuZGVyc2NvcmVkX3BjaQogIGV2YWwgZGVjbGFyZSAtQSAkdW5kZXJzY29yZWRfcGNpCiAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJuYW1lIl09JG5hbWUKICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm51bWEiXT0kbm9kZQogIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsibWFjIl09JGFkZHJlc3MKICBldmFsICR1bmRlcnNjb3JlZF9wY2lbInNwZWVkIl09JHNwZWVkCiAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJwY2kiXT0kcGNpCiAgI3JlcXVlc3Qgc3dpdGNoIHBvcnQgdG8gdGhlIHVzZXIgaWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBiZWluZyBwcm92aWRlZCBhbmQgaW5jbHVkZSBpdAogIGlmICAkcHJvdl9jb25uIAogIHRoZW4KICAgIHVuc2V0IHN3aXRjaF9wb3J0CiAgICByZWFkIC1wICJXaGF0IGlzIHRoZSBwb3J0IG5hbWUgaW4gdGhlIHN3aXRjaCAkZHBpZCB3aGVyZSBwb3J0ICRuYW1lICgkcGNpKSBpcyBjb25uZWN0ZWQ/ICgke25hbWV9LSR7UE9SVF9SQU5ET019LyRpZmFjZV9jb3VudGVyKSAiIHN3aXRjaF9wb3J0CiAgICBbWyAteiAkc3dpdGNoX3BvcnQgXV0gJiYgc3dpdGNoX3BvcnQ9IiR7bmFtZX0tJHtQT1JUX1JBTkRPTX0vJGlmYWNlX2NvdW50ZXIiCiAgICBpZmFjZV9jb3VudGVyPSQoKGlmYWNlX2NvdW50ZXIrMSkpCiAgICBldmFsICR1bmRlcnNjb3JlZF9wY2lbImRwaWQiXT0kZHBpZAogICAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJzd2l0Y2hfcG9ydCJdPSRzd2l0Y2hfcG9ydAogIGZpCgogICNB8WFkbyBlbCBwY2kgZGUgY2FkYSB1bm8gZGUgbG9zIGhpam9zCiAgU1JJT1ZfY291bnRlcj0wCiAgZm9yIGNoaWxkIGluIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2NhcGFiaWxpdHkvYWRkcmVzcyIgPCBwYXJlbnRfeG1sYAogIGRvIAogICAgU1JJT1ZfY291bnRlcj0kKChTUklPVl9jb3VudGVyKzEpKQogICAgI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIHRoZSB2YXJpYWJsZXMgJ2RvbWFpbicgJ2J1cycgJ3Nsb3QnIGFuZCAnZnVuY3Rpb24nCiAgICBldmFsICRjaGlsZAogICAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJTUklPViIkU1JJT1ZfY291bnRlcl09IiR7ZG9tYWluIyp4fV8ke2J1cyMqeH1fJHtzbG90Iyp4fV8ke2Z1bmN0aW9uIyp4fSIKICBkb25lCiAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJTUklPViJdPSRTUklPVl9jb3VudGVyCiAgCiNTaSBzZSB0cmF0YSBkZSB1biBTUklPViAodGllbmUgdW5hIGNhcGFiaWxpdHkgY29uIHR5cGUgJ3BoeXNfZnVuY3Rpb24nKQplbGlmIFtbICR0eXBlID09ICdwaHlzX2Z1bmN0aW9uJyBdXQp0aGVuCiAgdW5kZXJzY29yZWRfcGNpPSJ2ZiIkdW5kZXJzY29yZWRfcGNpCiAgVkZfbGlzdFskeyNWRl9saXN0W0BdfV09JHVuZGVyc2NvcmVkX3BjaQogIGV2YWwgZGVjbGFyZSAtQSAkdW5kZXJzY29yZWRfcGNpCiAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJzb3VyY2VfbmFtZSJdPSRuYW1lCiAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJtYWMiXT0kYWRkcmVzcwogIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsicGNpIl09JHBjaQpmaQpybSAtZiBkZXZpY2VfeG1sIHBhcmVudF94bWwKZG9uZQpJRlM9JE9MRElGUwoKZWNobyAiI1RoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSAkMCIKZWNobyAiI2ZvciBhZGRpbmcgdGhpcyBjb21wdXRlIG5vZGUgdG8gb3BlbnZpbSIKZWNobyAiI2NvcHkgdGhpcyBmaWxlIHRvIG9wZW52aW0gY29udHJvbGxlciBhbmQgcnVuIgplY2hvICIjb3BlbnZpbSBob3N0LWFkZCA8dGhpcz4iCmVjaG8KZWNobyAiaG9zdDoiCmVjaG8gIiAgbmFtZTogICAgJEhPU1RfTkFNRSIKZWNobyAiICB1c2VyOiAgICAkMSIKZWNobyAiICBpcF9uYW1lOiAkMiIKZWNobyAiaG9zdC1kYXRhOiIKZWNobyAiICBuYW1lOiAgICAgICAgJEhPU1RfTkFNRSIKZWNobyAiICB1c2VyOiAgICAgICAgJDEiCmVjaG8gIiAgaXBfbmFtZTogICAgICQyIgplY2hvICIgIHJhbmtpbmc6ICAgICAxMDAiCmVjaG8gIiAgZGVzY3JpcHRpb246ICRIT1NUX05BTUUiCmVjaG8gIiAgZmVhdHVyZXM6ICAgICRGRUFUVVJFU19MSVNUIgplY2hvICIgIG51bWFzOiIKCm51bWE9MAp3aGlsZSBbWyAkbnVtYSAtbHQgJE5VTUFTIF1dCmRvCiAgZWNobyAiICAtIG51bWFfc29ja2V0OiAgJG51bWEiCiNNRU1PUlkKICBpZiBbIC1mIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJHtudW1hfS9odWdlcGFnZXMvaHVnZXBhZ2VzLTEwNDg1NzZrQi9ucl9odWdlcGFnZXMgXQogIHRoZW4KICAgIGVjaG8gIiAgICBodWdlcGFnZXM6ICIgYGNhdCAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZSR7bnVtYX0vaHVnZXBhZ2VzL2h1Z2VwYWdlcy0xMDQ4NTc2a0IvbnJfaHVnZXBhZ2VzYAogIGVsc2UKICAgICNUT0RPIGh1Z2VwYWdlcyBvZiAyMDQ4a0Igc2l6ZQogICAgZWNobyAiICAgIGh1Z2VwYWdlczogIDAiCiAgZmkKICBtZW1vcnk9YGhlYWQgLW4xIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJHtudW1hfS9tZW1pbmZvICB8IGdhd2sgJygkNT09ImtCIil7cHJpbnQgJDR9J2AKICBtZW1vcnk9JCgobWVtb3J5KzEwNDg1NzYtMSkpICAgI21lbW9yeSBtdXN0IGJlIGNlaWxlZAogIG1lbW9yeT0kKChtZW1vcnkvMTA0ODU3NikpICAgI2Zyb20gYGtCIHRvIEdCCiAgZWNobyAiICAgIG1lbW9yeTogICAgJG1lbW9yeSIKCiNDT1JFUwogIGVjaG8gIiAgICBjb3JlczoiCiAgRklSU1Q9Ii0iICNmaXJzdCBpdGVtIGluIGEgbGlzdCBzdGFydCB3aXRoICItIiBpbiB5YW1sIGZpbGVzLCB0aGVuIGl0IHdpbGwgc2V0IHRvICIgIgogIGZvciBjcHUgaW4gJENQVVMKICBkbwogICAgUEhZU0lDQUw9YGVjaG8gJGNwdSB8IGN1dCAtZiAxIC1kIi0iYAogICAgQ09SRT1gZWNobyAkY3B1IHwgY3V0IC1mIDIgLWQiLSJgCiAgICBUSFJFQUQ9YGVjaG8gJGNwdSB8IGN1dCAtZiAzIC1kIi0iYAogICAgW1sgJFBIWVNJQ0FMICE9ICRudW1hIF1dICYmIGNvbnRpbnVlICAgI3NraXAgbm9uIHBoeXNpY2FsCiAgICBlY2hvICIgICAgLSBjb3JlX2lkOiAgICRDT1JFIgogICAgZWNobyAiICAgICAgdGhyZWFkX2lkOiAkVEhSRUFEIgogICAgI2NoZWNrIGlmIGVsaWdpYmxlCiAgICBjcHVfaXNvbGF0ZWQ9Im5vIgogICAgZm9yIGlzb2xjcHUgaW4gJGlzb2xjcHVzCiAgICBkbwogICAgICBpc29sY3B1X3N0YXJ0PWBlY2hvICRpc29sY3B1IHwgY3V0IC1mIDEgLWQiLSJgCiAgICAgIGlzb2xjcHVfZW5kPWBlY2hvICRpc29sY3B1IHwgY3V0IC1mIDIgLWQiLSJgCiAgICAgIGlmIFsgIiRUSFJFQUQiIC1nZSAiJGlzb2xjcHVfc3RhcnQiIC1hICIkVEhSRUFEIiAtbGUgIiRpc29sY3B1X2VuZCIgXQogICAgICB0aGVuCiAgICAgICAgY3B1X2lzb2xhdGVkPSJ5ZXMiCiAgICAgICAgYnJlYWsKICAgICAgZmkKICAgIGRvbmUKICAgIFtbICRjcHVfaXNvbGF0ZWQgPT0gIm5vIiBdXSAmJiAgIGVjaG8gIiAgICAgIHN0YXR1czogICAgbm90ZWxpZ2libGUiCiAgICBGSVJTVD0iICIKICBkb25lCiAKICAjTklDIElOVEVSRkFDRVMKICBpbnRlcmZhY2VzX25iPTAKICBmb3IgKChpPTA7IGk8JHsjUEZfbGlzdFtAXX07aSsrKSkKICBkbwogICAgdW5kZXJzY29yZWRfcGNpPSR7UEZfbGlzdFskaV19CiAgICBwbmFtZT0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIm5hbWUiKQogICAgcG51bWE9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJudW1hIikKICAgIFtbICRwbnVtYSAhPSAkbnVtYSBdXSAmJiBjb250aW51ZSAKICAgIHBtYWM9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJtYWMiKQogICAgcHBjaT0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgInBjaSIpCiAgICBwc3BlZWQ9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJzcGVlZCIpCiAgICBwU1JJT1Y9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJTUklPViIpCiAgICBbWyAkaW50ZXJmYWNlc19uYiAtZXEgMCBdXSAmJiBlY2hvICIgICAgaW50ZXJmYWNlczoiCiAgICBpbnRlcmZhY2VzX25iPSQoKGludGVyZmFjZXNfbmIrMSkpCiAgICBzcmlvdl9uYj0wCiAgICBlY2hvICIgICAgLSBzb3VyY2VfbmFtZTogJHBuYW1lIgogICAgZWNobyAiICAgICAgTWJwczogJHBzcGVlZCIKICAgIGVjaG8gIiAgICAgIHBjaTogXCIkcHBjaVwiIgogICAgZWNobyAiICAgICAgbWFjOiBcIiRwbWFjXCIiCiAgICBpZiAkcHJvdl9jb25uIAogICAgICB0aGVuCiAgICAgICAgcGRwaWQ9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJkcGlkIikKICAgICAgICBwc3dpdGNoX3BvcnQ9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJzd2l0Y2hfcG9ydCIpCiAgICAgICAgZWNobyAiICAgICAgc3dpdGNoX2RwaWQ6ICRwZHBpZCIKICAgICAgICBlY2hvICIgICAgICBzd2l0Y2hfcG9ydDogJHBzd2l0Y2hfcG9ydCIKICAgIGZpCiAgICBmb3IgKChqPTE7ajw9JHBTUklPVjtqKyspKQogICAgZG8KICAgICAgY2hpbGRTUklPVj0idmZwY2lfIiQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAiU1JJT1YiJGopCiAgICAgIHBuYW1lPSQoZ2V0X2hhc2hfdmFsdWUgJGNoaWxkU1JJT1YgInNvdXJjZV9uYW1lIikKICAgICAgaW5kZXg9JHtwbmFtZSMjKl99CiAgICAgIHBtYWM9JChnZXRfaGFzaF92YWx1ZSAkY2hpbGRTUklPViAibWFjIikKICAgICAgcHBjaT0kKGdldF9oYXNoX3ZhbHVlICRjaGlsZFNSSU9WICJwY2kiKQogICAgICBbWyAkc3Jpb3ZfbmIgLWVxIDAgXV0gJiYgZWNobyAiICAgICAgc3Jpb3ZzOiIKICAgICAgc3Jpb3ZfbmI9JCgoc3Jpb3ZfbmIrMSkpCiAgICAgIGVjaG8gIiAgICAgIC0gbWFjOiBcIiRwbWFjXCIiCiAgICAgIGVjaG8gIiAgICAgICAgcGNpOiBcIiRwcGNpXCIiCiAgICAgIGVjaG8gIiAgICAgICAgc291cmNlX25hbWU6ICRpbmRleCIKICAgIGRvbmUKICBkb25lCgogIG51bWE9JCgobnVtYSsxKSkKZG9uZQpyZW1vdmVfdmZfZHJpdmVyIGl4Z2JlCnJlbW92ZV92Zl9kcml2ZXIgaTQwZQojQnJpbmcgdXAgYWxsIGludGVyZmFjZXMKZm9yICgoaT0wOyBpPCR7I1BGX2xpc3RbQF19O2krKykpCmRvCiAgdW5kZXJzY29yZWRfcGNpPSR7UEZfbGlzdFskaV19CiAgcG5hbWU9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJuYW1lIikKICBpZmNvbmZpZyAkcG5hbWUgdXAKZG9uZQo=