IyEvYmluL3NoCiMKIyBTY3JpcHQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIFdJTkVQUkVGSVggZGlyZWN0b3J5CiMKIyBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KIyBDb3B5cmlnaHQgMjAwNCBDaHJpcyBNb3JnYW4KIyBDb3B5cmlnaHQgMjAwNCBBbGV4YW5kcmUgSnVsbGlhcmQKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQojCgp1c2FnZSgpCnsKICAgIGVjaG8gIlVzYWdlOiAkMCBbb3B0aW9uc10iCiAgICBlY2hvICIiCiAgICBlY2hvICJPcHRpb25zOiIKICAgIGVjaG8gIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UiCiAgICBlY2hvICIgICAgICAtLXByZWZpeCA8ZGlyPiAgICAgICAgIERpcmVjdG9yeSB0byBjcmVhdGUgKGRlZmF1bHQ6IFwkV0lORVBSRUZJWCBvciB+Ly53aW5lKSIKICAgIGVjaG8gIiAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgRG9uJ3QgcHJpbnQgc3RhdHVzIG1lc3NhZ2VzIgogICAgZWNobyAiICAtdywgLS13YWl0ICAgICAgICAgICAgICAgICBXYWl0IGZvciB0aGUgd2luZXNlcnZlciB0byBleGl0IGJlZm9yZSByZXR1cm5pbmciCiAgICBlY2hvICIiCn0KCnNldCAtZQoKYmluZGlyPSIiCmNhc2UgIiQwIiBpbgogICovKikKICAgICMgJDAgY29udGFpbnMgYSBwYXRoLCB1c2UgaXQKICAgIGJpbmRpcj1gZGlybmFtZSAiJDAiYAogICAgOzsKICAqKQogICAgIyBubyBkaXJlY3RvcnkgaW4gJDAsIHNlYXJjaCBpbiBQQVRICiAgICBzYXZlZF9pZnM9JElGUwogICAgSUZTPToKICAgIGZvciBkIGluICRQQVRICiAgICBkbwogICAgICBJRlM9JHNhdmVkX2lmcwogICAgICBpZiBbIC14ICIkZC8kMCIgXQogICAgICB0aGVuCiAgICAgICAgYmluZGlyPSIkZCIKICAgICAgICBicmVhawogICAgICBmaQogICAgZG9uZQogICAgOzsKZXNhYwoKYmluZGlyPWBjZCAiJGJpbmRpciIgJiYgcHdkYApkbGxkaXI9IiRiaW5kaXIvQGJpbnRvZGxsZGlyQCIKZGF0YWRpcj0iJGJpbmRpci9AYmludG9kYXRhZGlyQCIKCmRvX3dhaXQ9MApxdWlldD0wCgppZiBbICEgLWYgIiRkbGxkaXIvbnRkbGwuZGxsLnNvIiAtYSBcCiAgICAgLXggIiRiaW5kaXIvLi4vc2VydmVyL3dpbmVzZXJ2ZXIiIC1hIFwKICAgICAtZiAiJGJpbmRpci8uLi9kbGxzL250ZGxsL250ZGxsLmRsbC5zbyIgXQp0aGVuCiAgICAjIHJ1bm5pbmcgZnJvbSB0aGUgd2luZSBzb3VyY2UgdHJlZQogICAgdG9wZGlyPWBjZCAiJGJpbmRpci8uLiIgJiYgcHdkYAogICAgV0lORUxPQURFUj0iJHRvcGRpci93aW5lIgogICAgV0lORVNFUlZFUj0iJHRvcGRpci9zZXJ2ZXIvd2luZXNlcnZlciIKICAgIGlmIFsgLW4gIiRMRF9MSUJSQVJZX1BBVEgiIF0KICAgIHRoZW4KICAgICAgICBMRF9MSUJSQVJZX1BBVEg9IiR0b3BkaXIvbGliczokTERfTElCUkFSWV9QQVRIIgogICAgZWxzZQogICAgICAgIExEX0xJQlJBUllfUEFUSD0iJHRvcGRpci9saWJzIgogICAgZmkKICAgIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKCiAgICAjIGZpbmQgdGhlIHNvdXJjZSBkaXJlY3RvcnkKICAgIGxpbms9YHJlYWRsaW5rICIkV0lORUxPQURFUiJgCiAgICBpZiBbIC16ICIkbGluayIgXQogICAgdGhlbgogICAgICAgIHRvcHNyY2Rpcj0iJHRvcGRpciIKICAgIGVsc2UKICAgICAgICBsaW5rPWBkaXJuYW1lICIkbGluayJgCiAgICAgICAgY2FzZSAiJGxpbmsiIGluCiAgICAgICAgICAgIC8qKSB0b3BzcmNkaXI9YGNkICIkbGluay8uLiIgJiYgcHdkYCA7OwogICAgICAgICAgICAgKikgdG9wc3JjZGlyPWBjZCAiJHRvcGRpci8kbGluay8uLiIgJiYgcHdkYCA7OwogICAgICAgIGVzYWMKICAgIGZpCiAgICBkbGxkaXI9IiR0b3BkaXIvcHJvZ3JhbXMiCiAgICBkYXRhZGlyPSIkdG9wc3JjZGlyL3Rvb2xzIgpmaQoKd2hpbGUgWyAkIyAtZ3QgMCBdCmRvCiAgICBjYXNlICIkMSIgaW4KICAgICAgICAtaHwtLWhlbHApCiAgICAgICAgICAgIHVzYWdlCiAgICAgICAgICAgIGV4aXQgMAogICAgICAgICAgICA7OwogICAgICAgIC0tcHJlZml4KQogICAgICAgICAgICBXSU5FUFJFRklYPSIkMiIKICAgICAgICAgICAgc2hpZnQgMgogICAgICAgICAgICA7OwogICAgICAgIC1xfC0tcXVpZXQpCiAgICAgICAgICAgIHF1aWV0PTEKICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgOzsKICAgICAgICAtd3wtLXdhaXQpCiAgICAgICAgICAgIGRvX3dhaXQ9MQogICAgICAgICAgICBzaGlmdAogICAgICAgICAgICA7OwogICAgICAgIC0tdXNlLXdpbmUtdHJlZSkKICAgICAgICAgICAgIyBpZ25vcmVkLCBhdXRvZGV0ZWN0ZWQgbm93CiAgICAgICAgICAgIHNoaWZ0IDIKICAgICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgICBlY2hvICJVbmtub3duIG9wdGlvbiAkMSIKICAgICAgICAgICAgdXNhZ2UKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgICAgIDs7CiAgZXNhYwpkb25lCgpXSU5FUFJFRklYPSIke1dJTkVQUkVGSVg6LSRIT01FLy53aW5lfSIKCmlmIFsgLWQgIiRXSU5FUFJFRklYIiBdIHx8IG1rZGlyICIkV0lORVBSRUZJWCI7IHRoZW4gOgplbHNlCiAgICBlY2hvICJDb3VsZCBub3QgY3JlYXRlICRXSU5FUFJFRklYLCBhYm9ydGluZyIKICAgIGV4aXQgMQpmaQoKV0lORVBSRUZJWD1gY2QgIiRXSU5FUFJFRklYIiAmJiBwd2RgCgojIENyZWF0ZSB0aGUgZHJpdmUgc3ltbGlua3MKCmlmIFsgISAtZCAiJFdJTkVQUkVGSVgvZG9zZGV2aWNlcyIgXQp0aGVuCiAgICBta2RpciAiJFdJTkVQUkVGSVgvZG9zZGV2aWNlcyIKICAgIFsgLWQgIiRXSU5FUFJFRklYL2RyaXZlX2MiIF0gfHwgbWtkaXIgIiRXSU5FUFJFRklYL2RyaXZlX2MiCiAgICBsbiAtcyAiLi4vZHJpdmVfYyIgIiRXSU5FUFJFRklYL2Rvc2RldmljZXMvYzoiCiAgICBsbiAtcyAiLyIgIiRXSU5FUFJFRklYL2Rvc2RldmljZXMvejoiCmZpCgpDUk9PVD0iJFdJTkVQUkVGSVgvZG9zZGV2aWNlcy9jOiIKCiMgQ3JlYXRlIHRoZSBkaXJlY3RvcnkgdHJlZQoKZm9yIGkgaW4gXAogICAgIiRDUk9PVC93aW5kb3dzIiBcCiAgICAiJENST09UL3dpbmRvd3MvY29tbWFuZCIgXAogICAgIiRDUk9PVC93aW5kb3dzL2ZvbnRzIiBcCiAgICAiJENST09UL3dpbmRvd3MvaW5mIiBcCiAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiBcCiAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9kcml2ZXJzIiBcCiAgICAiJENST09UL3dpbmRvd3MvdGVtcCIKZG8KICAgIFsgLWQgIiRpIiBdIHx8IG1rZGlyICIkaSIKZG9uZQoKIyBDb3B5IHRoZSAuaW5mIHNjcmlwdCBhbmQgcnVuIGl0CgpjcCAiJGRhdGFkaXIvd2luZS5pbmYiICIkQ1JPT1Qvd2luZG93cy9pbmYvd2luZS5pbmYiCmV4cG9ydCBXSU5FUFJFRklYCiIke1dJTkVMT0FERVI6LSRiaW5kaXIvd2luZX0iIHJ1bmRsbDMyLmV4ZSBzZXR1cGFwaS5kbGwsSW5zdGFsbEhpbmZTZWN0aW9uIERlZmF1bHRJbnN0YWxsIDEyOCB3aW5lLmluZgoKIyBXYWl0IGZvciB0aGUgd2luZXNlcnZlciB0byBmaW5pc2gKCmlmIFsgJGRvX3dhaXQgPSAxIF0KdGhlbgogICAgIiR7V0lORVNFUlZFUjotJGJpbmRpci93aW5lc2VydmVyfSIgLXcKZmkKCmlmIFsgJHF1aWV0ID0gMCBdCnRoZW4KICAgIGVjaG8gIiRXSU5FUFJFRklYIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LiIKZmkK