IyEvYmluL3NoCiMKIyBTY3JpcHQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIFdJTkVQUkVGSVggZGlyZWN0b3J5CiMKIyBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KIyBDb3B5cmlnaHQgMjAwNCBDaHJpcyBNb3JnYW4KIyBDb3B5cmlnaHQgMjAwNCBBbGV4YW5kcmUgSnVsbGlhcmQKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQojCgp1c2FnZSgpCnsKICAgIGVjaG8gIlVzYWdlOiAkMCBbb3B0aW9uc10iCiAgICBlY2hvICIiCiAgICBlY2hvICJPcHRpb25zOiIKICAgIGVjaG8gIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UiCiAgICBlY2hvICIgICAgICAtLXByZWZpeCA8ZGlyPiAgICAgICAgIERpcmVjdG9yeSB0byBjcmVhdGUgKGRlZmF1bHQ6IFwkV0lORVBSRUZJWCBvciB+Ly53aW5lKSIKICAgIGVjaG8gIiAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgRG9uJ3QgcHJpbnQgc3RhdHVzIG1lc3NhZ2VzIgogICAgZWNobyAiICAtdywgLS13YWl0ICAgICAgICAgICAgICAgICBXYWl0IGZvciB0aGUgd2luZXNlcnZlciB0byBleGl0IGJlZm9yZSByZXR1cm5pbmciCiAgICBlY2hvICIiCn0KCnNldCAtZQoKYmluZGlyPSIiCmNhc2UgIiQwIiBpbgogICovKikKICAgICMgJDAgY29udGFpbnMgYSBwYXRoLCB1c2UgaXQKICAgIGJpbmRpcj1gZGlybmFtZSAiJDAiYAogICAgOzsKICAqKQogICAgIyBubyBkaXJlY3RvcnkgaW4gJDAsIHNlYXJjaCBpbiBQQVRICiAgICBzYXZlZF9pZnM9JElGUwogICAgSUZTPToKICAgIGZvciBkIGluICRQQVRICiAgICBkbwogICAgICBJRlM9JHNhdmVkX2lmcwogICAgICBpZiBbIC14ICIkZC8kMCIgXQogICAgICB0aGVuCiAgICAgICAgYmluZGlyPSIkZCIKICAgICAgICBicmVhawogICAgICBmaQogICAgZG9uZQogICAgOzsKZXNhYwoKYmluZGlyPWBjZCAiJGJpbmRpciIgJiYgcHdkYApkbGxkaXI9IiRiaW5kaXIvQGJpbnRvZGxsZGlyQCIKZGF0YWRpcj0iJGJpbmRpci9AYmludG9kYXRhZGlyQCIKCmRvX3dhaXQ9MApxdWlldD0wCgppZiBbICEgLWYgIiRkbGxkaXIvbnRkbGwuZGxsLnNvIiAtYSBcCiAgICAgLXggIiRiaW5kaXIvLi4vc2VydmVyL3dpbmVzZXJ2ZXIiIC1hIFwKICAgICAtZiAiJGJpbmRpci8uLi9kbGxzL250ZGxsL250ZGxsLmRsbC5zbyIgXQp0aGVuCiAgICAjIHJ1bm5pbmcgZnJvbSB0aGUgd2luZSBzb3VyY2UgdHJlZQogICAgdG9wZGlyPWBjZCAiJGJpbmRpci8uLiIgJiYgcHdkYAogICAgV0lORUxPQURFUj0iJHRvcGRpci93aW5lIgogICAgV0lORVNFUlZFUj0iJHRvcGRpci9zZXJ2ZXIvd2luZXNlcnZlciIKICAgIGlmIFsgLW4gIiRMRF9MSUJSQVJZX1BBVEgiIF0KICAgIHRoZW4KICAgICAgICBMRF9MSUJSQVJZX1BBVEg9IiR0b3BkaXIvbGlicy93aW5lOiRMRF9MSUJSQVJZX1BBVEgiCiAgICBlbHNlCiAgICAgICAgTERfTElCUkFSWV9QQVRIPSIkdG9wZGlyL2xpYnMvd2luZSIKICAgIGZpCiAgICBleHBvcnQgTERfTElCUkFSWV9QQVRICgogICAgIyBmaW5kIHRoZSBzb3VyY2UgZGlyZWN0b3J5CiAgICBsaW5rPWByZWFkbGluayAiJFdJTkVMT0FERVIiYAogICAgaWYgWyAteiAiJGxpbmsiIF0KICAgIHRoZW4KICAgICAgICB0b3BzcmNkaXI9IiR0b3BkaXIiCiAgICBlbHNlCiAgICAgICAgbGluaz1gZGlybmFtZSAiJGxpbmsiYAogICAgICAgIGNhc2UgIiRsaW5rIiBpbgogICAgICAgICAgICAvKikgdG9wc3JjZGlyPWBjZCAiJGxpbmsvLi4iICYmIHB3ZGAgOzsKICAgICAgICAgICAgICopIHRvcHNyY2Rpcj1gY2QgIiR0b3BkaXIvJGxpbmsvLi4iICYmIHB3ZGAgOzsKICAgICAgICBlc2FjCiAgICBmaQogICAgZGxsZGlyPSIkdG9wZGlyL3Byb2dyYW1zIgogICAgZGF0YWRpcj0iJHRvcHNyY2Rpci90b29scyIKZmkKCndoaWxlIFsgJCMgLWd0IDAgXQpkbwogICAgY2FzZSAiJDEiIGluCiAgICAgICAgLWh8LS1oZWxwKQogICAgICAgICAgICB1c2FnZQogICAgICAgICAgICBleGl0IDAKICAgICAgICAgICAgOzsKICAgICAgICAtLXByZWZpeCkKICAgICAgICAgICAgV0lORVBSRUZJWD0iJDIiCiAgICAgICAgICAgIHNoaWZ0IDIKICAgICAgICAgICAgOzsKICAgICAgICAtcXwtLXF1aWV0KQogICAgICAgICAgICBxdWlldD0xCiAgICAgICAgICAgIHNoaWZ0CiAgICAgICAgICAgIDs7CiAgICAgICAgLXd8LS13YWl0KQogICAgICAgICAgICBkb193YWl0PTEKICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgOzsKICAgICAgICAtLXVzZS13aW5lLXRyZWUpCiAgICAgICAgICAgICMgaWdub3JlZCwgYXV0b2RldGVjdGVkIG5vdwogICAgICAgICAgICBzaGlmdCAyCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgZWNobyAiVW5rbm93biBvcHRpb24gJDEiCiAgICAgICAgICAgIHVzYWdlCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgICAgICA7OwogIGVzYWMKZG9uZQoKV0lORVBSRUZJWD0iJHtXSU5FUFJFRklYOi0kSE9NRS8ud2luZX0iCgppZiBbIC1kICIkV0lORVBSRUZJWCIgXSB8fCBta2RpciAiJFdJTkVQUkVGSVgiOyB0aGVuIDoKZWxzZQogICAgZWNobyAiQ291bGQgbm90IGNyZWF0ZSAkV0lORVBSRUZJWCwgYWJvcnRpbmciCiAgICBleGl0IDEKZmkKCldJTkVQUkVGSVg9YGNkICIkV0lORVBSRUZJWCIgJiYgcHdkYAoKIyBDcmVhdGUgdGhlIGRyaXZlIHN5bWxpbmtzCgppZiBbICEgLWQgIiRXSU5FUFJFRklYL2Rvc2RldmljZXMiIF0KdGhlbgogICAgbWtkaXIgIiRXSU5FUFJFRklYL2Rvc2RldmljZXMiCiAgICBbIC1kICIkV0lORVBSRUZJWC9kcml2ZV9jIiBdIHx8IG1rZGlyICIkV0lORVBSRUZJWC9kcml2ZV9jIgogICAgbG4gLXMgIi4uL2RyaXZlX2MiICIkV0lORVBSRUZJWC9kb3NkZXZpY2VzL2M6IgogICAgbG4gLXMgIi8iICIkV0lORVBSRUZJWC9kb3NkZXZpY2VzL3o6IgpmaQoKQ1JPT1Q9IiRXSU5FUFJFRklYL2Rvc2RldmljZXMvYzoiCgojIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHRyZWUKCmZvciBpIGluIFwKICAgICIkQ1JPT1Qvd2luZG93cyIgXAogICAgIiRDUk9PVC93aW5kb3dzL2NvbW1hbmQiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9mb250cyIgXAogICAgIiRDUk9PVC93aW5kb3dzL2luZiIgXAogICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbSIgXAogICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyIiBcCiAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvZHJpdmVycyIgXAogICAgIiRDUk9PVC93aW5kb3dzL3RlbXAiCmRvCiAgICBbIC1kICIkaSIgXSB8fCBta2RpciAiJGkiCmRvbmUKCiMgQ29weSB0aGUgLmluZiBzY3JpcHQgYW5kIHJ1biBpdAoKY3AgIiRkYXRhZGlyL3dpbmUuaW5mIiAiJENST09UL3dpbmRvd3MvaW5mL3dpbmUuaW5mIgpleHBvcnQgV0lORVBSRUZJWAoiJHtXSU5FTE9BREVSOi0kYmluZGlyL3dpbmV9IiBydW5kbGwzMi5leGUgc2V0dXBhcGkuZGxsLEluc3RhbGxIaW5mU2VjdGlvbiBEZWZhdWx0SW5zdGFsbCAxMjggd2luZS5pbmYKCiMgV2FpdCBmb3IgdGhlIHdpbmVzZXJ2ZXIgdG8gZmluaXNoCgppZiBbICRkb193YWl0ID0gMSBdCnRoZW4KICAgICIke1dJTkVTRVJWRVI6LSRiaW5kaXIvd2luZXNlcnZlcn0iIC13CmZpCgppZiBbICRxdWlldCA9IDAgXQp0aGVuCiAgICBlY2hvICIkV0lORVBSRUZJWCB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4iCmZpCg==