IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIHRoZSBnbG9iYWwgcmVnaXN0cnkgYXJlIHN1cHBvc2VkIHRvIGJlCmJpbmRpcj0kcHJlZml4L2JpbiAgICAgICAgICAgICMgd2hlcmUgd2luZWxpYiBhcHBzIHdpbGwgYmUgKG9yIGFyZSkgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIHNhbXBsZSBzeXN0ZW0uaW5pIHJlc2lkZXMKR0NPTkY9JHN5c2NvbmZkaXIvd2luZS5jb25mICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIHdpbmUuY29uZiBnbG9iYWwgY29uZmlnIGZpbGUKTENPTkY9fi8ud2luZS9jb25maWcgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGxvY2FsIGNvbmZpZyBmaWxlCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9HTE9CQUxDT05GPWF1dG8gICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9MT0NBTENPTkY9YXV0byAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSBsb2NhbGNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpET0FQUD1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBhcHBsaWNhdGlvbnMsIGRpc3RyaWJ1dGVkIHdpdGggV2luZQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgcGF0aCB0byB0aGUgd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9JGV4ZGlyL2NvbmZpZyAgICAgICAgICMgcGF0aCB0byB0aGUgZGVmYXVsdCB3aW5lIGNvbmZpZyBmaWxlIChhbHNvIHVzZWQgYnkgd2luZWNvbmYpClJVTkRMTDMyPXByb2dyYW1zL3J1bmRsbDMyL3J1bmRsbDMyICAgICAgICMgcGF0aCB0byB0aGUgcnVuZGxsMzIgd2luZWxpYiBhcHBsaWNhdGlvbgpJTkZTQ1JJUFQ9dG9vbHMvd2luZS5pbmYgICAgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgLmluZiBzY3JpcHQKIyBDUk9PVD0vdmFyL3dpbmUgICAgICAgICAgICAgIyBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQojLS0tIGVuZCBvZiBkZWZhdWx0cwoKIyB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSB0aGUgaW5zdGFsbGVyClRNUENPTkY9L3RtcC93aW5laW5zdGFsbC5jb25mCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL2NvbW1hbmQiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL1Byb2dyYW0gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcy9Db21tb24gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL0ZvbnRzIiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcy9TdGFydHVwIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgY3AgJElORlNDUklQVCAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3dpbmUuaW5mIgp9CgojY3JlYXRlcyBzeW1ib2xpYyBsaW5rIGluIHdpbmRvd3MgZGlyZWN0b3J5IHRvIGluc3RhbGxlZCB3aW5lbGliIGFwcGxpY2F0aW9uCiNwYXJhbWV0ZXJzOgojIC0gbmFtZSBvZiB0aGUgaW5zdGFsbGVkIHdpbmVsaWIgYXBwbGljYXRpb24KIyAtIGZ1bGwgcGF0aCB0byBhcHBsaWNhdGlvbiBpbiB0aGUgd2luZWxpYiBkaXJlY3RvcnkKZnVuY3Rpb24gbGlua19hcHAgewogIGlmIFsgIiRXSU5FSU5TVEFMTEVEIiA9ICdubycgXQogIHRoZW4gewogICAgbG4gLXNmICRQV0QvcHJvZ3JhbXMvJDEvJDEuZXhlLnNvICQyCiAgfQogIGVsc2UgewogICAgbG4gLXNmICRsaWJkaXIvd2luZS8kMS5leGUuc28gJDIKICB9CiAgZmkKfQoKI3B1dHMgd2luZG93cyBhcHBsaWNhdGlvbnMgcmVwbGFjZW1lbnRzIHRvIHdpbmRvd3MgZGlyZWN0b3JpZXMsCiNjb25maWd1cmVzIHRoZW0KZnVuY3Rpb24gY29uZmlndXJlX3dpbmVfYXBwbGljYXRpb25zIHsKICBsaW5rX2FwcCBzdGFydCAgICAgICAgIiRDUk9PVC93aW5kb3dzL2NvbW1hbmQvc3RhcnQuZXhlIgogIGxpbmtfYXBwIG5vdGVwYWQgICAgICAiJENST09UL3dpbmRvd3Mvbm90ZXBhZC5leGUiCiAgbGlua19hcHAgcmVnZWRpdCAgICAgICIkQ1JPT1Qvd2luZG93cy9yZWdlZGl0LmV4ZSIKICBsaW5rX2FwcCBydW5kbGwzMiAgICAgIiRDUk9PVC93aW5kb3dzL3J1bmRsbDMyLmV4ZSIKICBsaW5rX2FwcCB3Y21kICAgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93Y21kLmV4ZSIKICBsaW5rX2FwcCBjb250cm9sICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS9jb250cm9sLmV4ZSIKICBsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS9oZWxwLmV4ZSIKICBsaW5rX2FwcCBub3RlcGFkICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS9ub3RlcGFkLmV4ZSIKICBsaW5rX2FwcCBwcm9nbWFuICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS9wcm9nbWFuLmV4ZSIKICBsaW5rX2FwcCByZWdzdnIzMiAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS9yZWdzdnIzMi5leGUiCiAgbGlua19hcHAgd2luZW1pbmUgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0vd2lubWluZS5leGUiCiAgbGlua19hcHAgd2ludmVyICAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0vd2ludmVyLmV4ZSIKICBsaW5rX2FwcCB1bmluc3RhbGxlciAgIiRDUk9PVC93aW5kb3dzL3VuaW5zdGFsbC5leGUiCiAgbGlua19hcHAgd2luaGVscCAgICAgICIkQ1JPT1Qvd2luZG93cy93aW5oZWxwLmV4ZSIKICBsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3dpbmhscDMyLmV4ZSIKICBsaW5rX2FwcCB3aW5lYnJvd3NlciAgIiRDUk9PVC93aW5kb3dzL3dpbmVicm93c2VyLmV4ZSIKfQoKIyBzdGFydHVwLi4uCgplY2hvICJXSU5FIEluc3RhbGxlciB2MC43NCIKZWNobwoKaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCnRoZW4gewoKICBpZiAhIFsgLWYgY29uZmlndXJlIF0KICB0aGVuIHsKICAgIGlmIFsgLWYgLi4vY29uZmlndXJlIF0KICAgIHRoZW4gewogICAgICBwdXNoZCAuLgogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIllvdSdyZSBydW5uaW5nIHRoaXMgZnJvbSB0aGUgd3JvbmcgZGlyZWN0b3J5LiIKICAgICAgZWNobyAiQ2hhbmdlIHRvIHRoZSBXaW5lIHNvdXJjZSdzIG1haW4gZGlyZWN0b3J5IGFuZCB0cnkgYWdhaW4uIgogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgfQogIGZpCgogIGlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4gewogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIHdpbmVpbnN0YWxsIGFzIHJvb3QsIHRoaXMgaXMgbm90IGFkdmlzYWJsZS4gUGxlYXNlIHJlcnVuIGFzIGEgdXNlci4iCiAgICBlY2hvICJBYm9ydGluZy4iCiAgICBleGl0IDEKICB9CiAgZmkKCiAgaWYgWyAhIC13IC4gXQogIHRoZW4gewogICAgZWNobyAiVGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLiBZb3UgcHJvYmFibHkgZXh0cmFjdGVkIHRoZSBzb3VyY2VzIGFzIHJvb3QuIgogICAgZWNobyAiWW91IHNob3VsZCByZW1vdmUgdGhlIHNvdXJjZSB0cmVlIGFuZCBleHRyYWN0IGl0IGFnYWluIGFzIGEgbm9ybWFsIHVzZXIuIgogICAgZXhpdCAxCiAgfQogIGZpCgogICMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgogIGhhc2ggcnBtICY+L2Rldi9udWxsCiAgUkVUPSQ/CiAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgIGlmIFsgLW4gImBycG0gLXFpIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAiXk5hbWUiYCIgXTsgdGhlbgogICAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdOyB0aGVuCiAgICAgICAgZWNobyAiV2UgbmVlZCB0byByZW1vdmUgdGhlIHJwbSBhcyByb290LCBwbGVhc2UgZW50ZXIgeW91ciByb290IHBhc3N3b3JkIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvIFN0YXJ0aW5nIHdpbmUgcnBtIHJlbW92YWwuLi4KICAgICAgICBzdSAtYyAicnBtIC1lIHdpbmU7IFJFVD0kPyIKICAgICAgICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyBEb25lLgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkZBSUxFRC4gUHJvYmFibHkgeW91IGFyZW4ndCBpbnN0YWxsaW5nIGFzIHJvb3QuIgogICAgICAgICAgZWNobyAiRXhwZWN0IHByb2JsZW1zIChsaWJyYXJ5IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGluc3RhbGwgZXRjLikuIgogICAgICAgIGZpCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJTb3JyeSwgSSB3b24ndCBpbnN0YWxsIFdpbmUgd2hlbiBhbiBycG0gdmVyc2lvbiBpcyBzdGlsbCBpbnN0YWxsZWQuIgogICAgICAgIGVjaG8gIihXaW5lIHN1cHBvcnQgc3VmZmVyZWQgZnJvbSB3YXkgdG9vIG1hbnkgY29uZmxpY3RzIGJldHdlZW4gUlBNIgogICAgICAgIGVjaG8gImFuZCBzb3VyY2UgaW5zdGFsbHMpIgogICAgICAgIGVjaG8gIkhhdmUgYSBuaWNlIGRheSAhIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgd2luZSBiaW5hcnkgc3RpbGwgYXZhaWxhYmxlCiAgaWYgWyAtbiAiYHdoaWNoIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAnL3dpbmUnYCIgXTsgdGhlbgogICAgZWNobyAiV2FybmluZyAhISB3aW5lIGJpbmFyeSAoc3RpbGwpIGZvdW5kLCB3aGljaCBtYXkgaW5kaWNhdGUiCiAgICBlY2hvICJhIChjb25mbGljdGluZykgcHJldmlvdXMgaW5zdGFsbGF0aW9uLiIKICAgIGVjaG8gIllvdSBtaWdodCB3YW50IHRvIGFib3J0IGFuZCB1bmluc3RhbGwgV2luZSBmaXJzdC4iCiAgICBzdGRfc2xlZXAKICBmaQoKICAjIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCwgaWYgbmVjZXNzYXJ5CgogIGlmIFsgLWYgY29uZmlnLmNhY2hlIF0gJiYgWyAtZiBNYWtlZmlsZSBdICYmIFsgTWFrZWZpbGUgLW50IGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJJIHNlZSB0aGF0IFdJTkUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBzbyBJJ2xsIHNraXAgdGhhdC4iCiAgICBzdGRfc2xlZXAKICAgICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogICAgLiAuL2NvbmZpZy5jYWNoZQogIH0KICBlbHNlIHsKICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlLi4uIgogICAgZWNobwogICAgaWYgISAuL2NvbmZpZ3VyZSAtQyAkQ09ORkFSR1MgLS1wcmVmaXg9JHByZWZpeAogICAgdGhlbiB7CiAgICAgIGVjaG8KICAgICAgZWNobyAiQ29uZmlndXJlIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICAgICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgICBldmFsICIkYWNfY3ZfaGF2ZV94IgogICAgaWYgWyAiJGhhdmVfeCIgIT0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKICB9CiAgZmkKCiAgIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsLCB3ZSBuZWVkIHRvIGFsd2F5cyBkbyB0aGlzIGJlY2F1c2Ugd2UKICAjIGRvbid0IHdhbnQgdGhlICdtYWtlIGluc3RhbGwnIGNvbW1hbmQgd2UgbWlnaHQgcnVuIHRvIHJ1biAnbWFrZScgYXMgcm9vdAogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgICMgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBidWlsZCBhbmQgaW5zdGFsbCB3aW5lCiAgICBlY2hvCiAgICBlY2hvICJXZSBuZWVkIHRvIGluc3RhbGwgd2luZSBhcyByb290IHVzZXIsIGRvIHlvdSB3YW50IHVzIHRvIGJ1aWxkIHdpbmUsIgogICAgZWNobyAiJ3N1IHJvb3QnIGFuZCBpbnN0YWxsIFdpbmU/ICBFbnRlciAnbm8nIHRvIGNvbnRpbnVlIHdpdGhvdXQgaW5zdGFsbGluZyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBST09USU5TVEFMTD0iJEFOU1dFUiIKCiAgICBpZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgICMgc3RhcnQgb3V0IHdpdGggdGhlIGJhc2ljIGNvbW1hbmQKICAgICAgc3Vjb21tYW5kPSJtYWtlIGluc3RhbGwiCgogICAgICAjIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSAkbGliZGlyIGluIHRoZWlyIGxkLnNvLmNvbmYgYWRkIHRoaXMKICAgICAgIyB0byBvdXIgc3Vjb21tYW5kIHN0cmluZwogICAgICBpZiBbIC1mIC9ldGMvbGQuc28uY29uZiBdCiAgICAgIHRoZW4KICAgICAgICBpZiAhIGdyZXAgLXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZiA+L2Rldi9udWxsIDI+JjEKICAgICAgICB0aGVuIHsKICAgICAgICAgIGVjaG8KICAgICAgICAgIGVjaG8gIiRsaWJkaXIgZG9lc24ndCBleGlzdCBpbiB5b3VyIC9ldGMvbGQuc28uY29uZiwgaXQgd2lsbCBiZSBhZGRlZCIKICAgICAgICAgIGVjaG8gIndoZW4gd2UgcGVyZm9ybSB0aGUgaW5zdGFsbC4uLiIKICAgICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDtlY2hvICRsaWJkaXI+Pi9ldGMvbGQuc28uY29uZiIKICAgICAgICB9CiAgICAgICAgZmkKICAgICAgICAjIHJ1biBsZGNvbmZpZyBhbHdheXMganVzdCBpbiBjYXNlIHNvbWUgdXBkYXRlZCBmaWxlcyBkb24ndCBnZXQgbGlua2VkCiAgICAgICAgc3Vjb21tYW5kPSIkc3Vjb21tYW5kOyRhY19jdl9wYXRoX0xEQ09ORklHIgogICAgICBmaQogICAgfQogICAgZmkgIyBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQoKICAgIGVjaG8KCiAgICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgICBlY2hvICJpbiB0aGUgbWVhbnRpbWUuLi4iCiAgICBlY2hvCiAgICBzdGRfc2xlZXAKCiAgICAjIHRyeSB0byBqdXN0IG1ha2Ugd2luZSwgaWYgdGhpcyBmYWlscyAnbWFrZSBkZXBlbmQnIGFuZCB0cnkgdG8gcmVtYWtlCiAgICBpZiAhIHsgbWFrZTsgfQogICAgdGhlbiB7CiAgICAgIGlmICEgeyBtYWtlIGRlcGVuZCAmJiBtYWtlOyB9CiAgICAgIHRoZW4gewogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJDb21waWxhdGlvbiBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBmaQoKICAgIGlmIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgZWNobwoKICAgICAgZWNobyAiUGVyZm9ybWluZyAnbWFrZSBpbnN0YWxsJyBhcyByb290IHRvIGluc3RhbGwgYmluYXJpZXMsIGVudGVyIHJvb3QgcGFzc3dvcmQiCgogICAgICBzdGRfc2xlZXAKCiAgICAgIGlmICEgc3Ugcm9vdCAtYyAiJHN1Y29tbWFuZCIKICAgICAgdGhlbiB7CiAgICAgIAlpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgICAgdGhlbiB7CiAgICAgIAkgICAgIGVjaG8KICAgICAgICAgICAgIGVjaG8gIkVpdGhlciB5b3UgZW50ZXJlZCBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgb3Igd2UgZmFpbGVkIHRvIgogICAgICAgICAgICAgZWNobyAicnVuICckc3Vjb21tYW5kJyBjb3JyZWN0bHkuIgogICAgICAgICAgICAgZWNobyAiSWYgeW91IGRpZG4ndCBlbnRlciBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgdGhlbiBwbGVhc2UiCiAgICAgICAgICAgICBlY2hvICJyZXBvcnQgdGhpcyBlcnJvciBhbmQgYW55IHN0ZXBzIHRvIHBvc3NpYmx5IHJlcHJvZHVjZSBpdCB0byIKICAgICAgICAgICAgIGVjaG8gImh0dHA6Ly9idWdzLndpbmVocS5vcmcvIgogICAgICAgICAgICAgZWNobwogICAgICAgICAgICAgZWNobyAiSW5zdGFsbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuIgogICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgIH0KICAgICAgICAgZmkKICAgICAgIH0KICAgICAgZmkKCiAgICAgIGVjaG8KCiAgICAgICMgc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIG9uIHRoZSB1c2VycyBzeXN0ZW0sIGlmIG5vdCBwcm9tcHQgdGhlbQogICAgICAjIGFuZCB0aGVuIGV4aXQKICAgICAgaWYgWyAhIGB3aGljaCB3aW5lYCBdCiAgICAgIHRoZW4KICAgICAgICBlY2hvICJDb3VsZCBub3QgZmluZCB3aW5lIG9uIHlvdXIgc3lzdGVtLiAgUnVuIHdpbmVpbnN0YWxsIGFzIHJvb3QgdG8gaW5zdGFsbCB3aW5lIgogICAgICAgIGVjaG8gImJlZm9yZSByZS1ydW5uaW5nIHdpbmVpbnN0YWxsIGFzIGEgdXNlci4iCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIkV4aXRpbmcgd2luZWluc3RhbGwiCiAgICAgICAgZXhpdCAxOwogICAgICBmaQoKICAgICAgV0lORUlOU1RBTExFRD15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBXSU5FSU5TVEFMTEVEPW5vCiAgICB9CiAgICBmaSAjIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgfQogIGZpICMgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9HTE9CQUxDT05GIiBdCnRoZW4KICBET0dMT0JBTENPTkY9YXV0bwpmaQoKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzeXN0ZW0gd2luZS5jb25mCiAgaWYgWyAhIC1mICRHQ09ORiBdICYmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIERPR0xPQkFMQ09ORj1ubwogICAgZWNobyAiQ3JlYXRpb24gb2YgYSBnbG9iYWwgY29uZmlnIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBpbiB3aW5laW5zdGFsbCBhdCB0aGlzIgogICAgZWNobyAidGltZS4gIFdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJjaGl0ZWN0dXJlIGlzIGNsZWFuZWQgdXAgdGhpcyBmdW5jdGlvbmFsaXR5IgogICAgZWNobyAid2lsbCBiZSByZXN0b3JlZCB0byB3aW5laW5zdGFsbC4iCiAgICBlY2hvCiAgZmkKfQpmaQoKaWYgWyAiJERPTE9DQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHRoZSB1c2VyIGlzIHJvb3QsIGlmIHNvLCBleHBsaWNpdGx5IGFzayB0aGVtIGlmIHRoZXkgd2FudCBhCiAgIyBsb2NhbCBjb25maWcgZmlsZQogIGlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyBhcyByb290LiAgRG8geW91IHdhbnQgYSBsb2NhbCBjb25maWcgZmlsZSwiCiAgICBlY2hvICJmaWxlLCB+Ly53aW5lL2NvbmZpZywgY3JlYXRlZD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgZWxzZQogICAgIyBpZiB0aGUgdXNlciBoYXMgYW4gZXhpc3RpbmcgY29uZmlnIGZpbGUgYXNrIHRoZW0gaWYgdGhleSB3YW50IHVzIHRvCiAgICAjIG92ZXJ3cml0ZSBpdCwgb3RoZXJ3aXNlIGp1c3QgYXNrIHRoZW0gaWYgdGhleSB3YW50IHRvIGNyZWF0ZSBvbmUKICAgIGlmIFsgLWYgIiRMQ09ORiIgXQogICAgdGhlbgogICAgICBlY2hvICJGb3VuZCBleGlzdGluZyAkTENPTkYsIGRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGlzIgogICAgICBlY2hvICJleGlzdGluZyBXaW5lIGNvbmZpZ3VyYXRpb24gZmlsZT8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgICB0aGVuCiAgICAgIHsKICAgICAgICBlY2hvICJXb3VsZCB5b3UgbGlrZSB0byBtYWtlIGEgYmFja3VwIG9mIHRoaXMgb2xkIGNvbmZpZyBmaWxlPyIKICAgICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICAgIGVjaG8KICAgICAgICBpZiBbICIkQU5TV0VSIiA9ICJ5ZXMiIF0KICAgICAgICB0aGVuCiAgICAgICAgewogICAgICAgICAgZWNobyAiUmVuYW1pbmcgJExDT05GIHRvICRMQ09ORi5vbGQiCiAgICAgICAgICBtdiAtZiAiJExDT05GIiAiJExDT05GLm9sZCIKICAgICAgICAgIGVjaG8KICAgICAgICB9CiAgICAgICAgZmkKICAgICAgfQogICAgICBmaQogICAgZWxzZQogICAgewogICAgICBlY2hvICJDcmVhdGUgbG9jYWwgY29uZmlnIGZpbGUgfi8ud2luZS9jb25maWc/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgICAgZWNobwogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuCiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIG5lZWRfcm9vdCBcCiAgICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gVHJ5IGFnYWluIGFzIHJvb3QgdG8gZ2VuZXJhdGUgYSBzeXN0ZW0gd2luZS5jb25mLiIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIH0KICAgIGZpCiAgZmkKfQpmaQoKIyBnZW5lcmF0ZSAkVE1QQ09ORiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRET1dDSEsiID0gJ3llcycgXSB8fCBbICIkRE9XQ0hLIiA9ICdhdXRvJyBdCiAgdGhlbiB7CiAgICBlY2hvIC1uICJTZWFyY2hpbmcgZm9yIGFuIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLi4uIgogICAgaWYgISAkV0lORUNPTkYgLWluaWZpbGUgIiRXSU5FSU5JIiA+ICRUTVBDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJFRNUENPTkYgPiAvZGV2L251bGwKCiAgICAgIGVjaG8gIiBub3QgZm91bmQuIChubyBtYXRjaGluZyAvZXRjL2ZzdGFiIG1vdW50IGVudHJ5IGZvdW5kKSIKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgZG9fd2l0aG91dF93aW5kb3dzIFwKICAgICAgICJXaW5kb3dzIHdhcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNvIEkgYXNzdW1lIHlvdSB3YW50IiBcCiAgICAgICAiYSBXaW5lLW9ubHkgaW5zdGFsbGF0aW9uLiBBbSBJIGNvcnJlY3Q/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggd2luZG93c19ub3RfZm91bmQgXAogICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gTWFrZSBzdXJlIHlvdXIgV2luZG93cyBwYXJ0aXRpb24gaXMgbW91bnRlZCBhbmQgdHJ5IGFnYWluLCIgXAogICAgICAgICAib3IgY3JlYXRlICRMQ09ORiBtYW51YWxseSBieSBjb3B5aW5nIGZyb20gJFdJTkVJTkkgYW5kIGFkYXB0aW5nIHRoZSBkcml2ZSBwYXRocy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgRE9XSU5FPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIiBmb3VuZC4iCgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBhbmQgc28gd2UgY2FuIHVzZSB0aGUgV2luZG93cyIgXAogICAgICAgIkRyaXZlIGFzIG91ciBXaW5lIGRyaXZlLiBZb3UgbWF5LCBob3dldmVyLCB3aXNoIHRvIGNyZWF0ZSBhIGNsZWFuIiBcCiAgICAgICAiV2luZSBpbnN0YWxsIGFueXdheXMuIgogICAgICBjb25mX3llc25vX2Fuc3dlciAiU2hvdWxkIEkgdXNlIHRoZSBXaW5kb3dzIGRyaXZlIGZvciB0aGUgV2luZSBpbnN0YWxsPyAoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHdpbmRvd3NfZm91bmQKICAgICAgICBjb25mX3F1ZXN0aW9uIGxvdyB3aW5kb3dzX2ZvdW5kIFwKICAgICAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIiBcCiAgICAgICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgICAgICAgRE9XSU5FPW5vCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgRE9XSU5FPXllcwogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBmaQogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuCiAgRE9XSU5FPW5vCmZpCgojIHNldHVwIGEgbm8td2luZG93cyBpbnN0YWxsYXRpb24sIGlmIG5lY2Vzc2FyeQppZiBbICIkRE9XSU5FIiA9ICd5ZXMnIF0KdGhlbiB7CiAgIyBzZXQgYW4gYXBwcm9wcmlhdGUgRENST09UCiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gRENST09UPX4vYwogIGVsc2UgRENST09UPS9jCiAgZmkKCiAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAgICJDb25maWd1cmluZyBXaW5lIHdpdGhvdXQgV2luZG93cy4iIFwKICAgICAiU29tZSBmYWtlIFdpbmRvd3MgZGlyZWN0b3JpZXMgbXVzdCBiZSBjcmVhdGVkLCB0byBob2xkIGFueSAuaW5pIGZpbGVzLCBETExzLCIgXAogICAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgICAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyIKICB3aGlsZSBbIC16ICIkQ1JPT1QiIF0KICBkbyB7CiAgICBjb25mX3N0cmluZ19hbnN3ZXIgIihkZWZhdWx0IGlzICREQ1JPT1QpICIKICAgIFsgLXogIiRBTlNXRVIiIF0gJiYgQU5TV0VSPSIkRENST09UIgogICAgaWYgISBbIC1kICIkQU5TV0VSIiBdCiAgICB0aGVuIHsKICAgICAgaWYgbWtkaXIgLXAgIiRBTlNXRVIiCiAgICAgIHRoZW4gQ1JPT1Q9IiRBTlNXRVIiCiAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkRpcmVjdG9yeSAkQU5TV0VSIGNhbid0IGJlIGNyZWF0ZWQgISIKICAgICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgZmkKICAgIH0KICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICBmaQogIH0KICBkb25lCiAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgoKICAgIGNyZWF0ZV93aW5kb3dzX2RpcmVjdG9yaWVzCiAgICBjb25maWd1cmVfd2luZV9hcHBsaWNhdGlvbnMKCiAgIyBjcmVhdGUgJExDT05GIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlICRXSU5FSU5JCiAgaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KICB0aGVuIHsKICAgIGNwICRXSU5FSU5JICRUTVBDT05GCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRlZmF1bHRfY29uZmlnCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkZWZhdWx0X2NvbmZpZyBcCiAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIGRlZmF1bHQgV2luZSBjb25maWd1cmF0aW9uLiIgXAogICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgfQogIGZpCgogICMgbm93IHdlIHJlYWxseSBzaG91bGQgaW5zdGFsbCB0aGUgcmVnaXN0cnkKICBpZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KICB0aGVuIERPUkVHPXllcwogIGZpCn0KZmkKZWNobwoKI2luc3RhbGwgdGhlIGxvY2FsIGNvbmZpZyBmaWxlICRMQ09ORgppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC13IH4vLndpbmUgXQogIHRoZW4KICAgIG1rZGlyIH4vLndpbmUKICBmaQogIGNwICRUTVBDT05GICRMQ09ORiA+IC9kZXYvbnVsbAplbHNlCiAgRE9SRUc9bm8KZmkKCiNpbnN0YWxsIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJEdDT05GCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC1mICRzeXNjb25mZGlyIF0KICB0aGVuCiAgICBta2RpciAtcCAkc3lzY29uZmRpcgogIGZpCgogIGNwICRUTVBDT05GICRHQ09ORiA+IC9kZXYvbnVsbApmaQoKIyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CiMgKG5vdCB0byBiZSBkb25lIGlmIHdpbmRvd3MgcmVnaXN0cnkgZXhpc3RzKQppZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KdGhlbiB7CiAgQ1JPT1Q9YHNlZCAtbiAnL15cW0RyaXZlIENcXSQvLC9eXFsuKlxdJC8gcy9eXCJQYXRoXCIgPSBcIlwoLipcKVwiL1wxL3AnICRMQ09ORmAKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL1dJTk5UL3N5c3RlbTMyL2NvbmZpZy9zeXN0ZW0iIF0KICB0aGVuIERPUkVHPW5vCiAgZWxzZSBET1JFRz15ZXMKICBmaQogIGlmIFsgIiRET1JFRyIgPSAneWVzJyBdCiAgdGhlbiBlY2hvICJOb3QgZm91bmQsIGRlZmF1bHQgV2luZSByZWdpc3RyeSB3aWxsIGJlIGluc3RhbGxlZC4iCiAgZWxzZSBlY2hvICJXaW5kb3dzIHJlZ2lzdHJ5IGZvdW5kLCB3aWxsIG5vdCBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeS4iCiAgZmkKICBlY2hvCn0KZmkKCiMgaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5IGVudHJpZXMKaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBlY2hvICJDb21waWxpbmcgcnVuZGxsMzIuLi4iCiAgICAoY2QgcHJvZ3JhbXMvcnVuZGxsMzI7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgQ2hlY2sgaWYgZG9zZGV2aWNlcyBleGlzdHMgYW5kIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkKICBpZiBbICEgLWQgfi8ud2luZS9kb3NkZXZpY2VzIF0KICB0aGVuCiAgICBta2RpciB+Ly53aW5lL2Rvc2RldmljZXMKICAgIGxuIC1zIC9tbnQvZmQwIH4vLndpbmUvZG9zZGV2aWNlcy9hOgogICAgbG4gLXMgJENST09UIH4vLndpbmUvZG9zZGV2aWNlcy9jOgogICAgbG4gLXMgL2Nkcm9tIH4vLndpbmUvZG9zZGV2aWNlcy9kOgogICAgbG4gLXMgL3RtcCB+Ly53aW5lL2Rvc2RldmljZXMvZToKICAgIGxuIC1zIH4gfi8ud2luZS9kb3NkZXZpY2VzL2Y6CiAgICBsbiAtcyAvIH4vLndpbmUvZG9zZGV2aWNlcy96OgogIGZpCgogIGVjaG8gIkluc3RhbGxpbmcgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCiAgZWNobwogIGlmICEgJFJVTkRMTDMyIHNldHVwYXBpLmRsbCxJbnN0YWxsSGluZlNlY3Rpb24gRGVmYXVsdEluc3RhbGwgMTI4ICRJTkZTQ1JJUFQgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnZWRpdF9lcnJvcgogICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2VkaXRfZXJyb3IKICAgIGV4aXQgMQogIH0KICBlbHNlIHsKICAgIGVjaG8KICAgIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgfQogIGZpCiAgaWYgWyAiJFNZU1JFRyIgPSAnYXV0bycgXQogIHRoZW4gU1lTUkVHPXllcwogIGZpCn0KZmkKCiMgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsLCBpZiBkZXNpcmVkCmlmIFsgYHdob2FtaWAgPSAncm9vdCcgXSAmJiBbICIkRE9SRUciID0gJ3llcycgXSAmJiBbICIkU1lTUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgWyAtZCB+Ly53aW5lIF0gfHwgbWtkaXIgfi8ud2luZQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3MgdXNlciByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvd2luZS51c2VycmVnIF0gJiYgY3Agfi8ud2luZS93aW5lLnVzZXJyZWcgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIH4vLndpbmUvd2luZS51c2VycmVnCiAgfQogIGZpCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHN5c3RlbSByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvc3lzdGVtLnJlZyBdICYmIGNwIH4vLndpbmUvc3lzdGVtLnJlZyAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIH4vLndpbmUvc3lzdGVtLnJlZwogIH0KICBmaQp9CmZpCgojIGNsZWFudXAgYW55IHRlbXBvcmFyeSBmaWxlcyB0aGF0IG1heSByZW1haW4KaWYgWyAtZiAkVE1QQ09ORiBdCnRoZW4gcm0gLWYgJFRNUENPTkYKZmkKCgojIGl0J3MgYSB3cmFwCmVjaG8KZWNobyAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIGZvciBub3cuIEdvb2QgbHVjayAodGhpcyBpcyBzdGlsbCBhbHBoYSBzb2Z0d2FyZSkuIgplY2hvICJJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIFdJTkUsIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZpcnN0LCIKZWNobyAiYXMgbWFueSBraW5kcyBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGV4cGxhaW5lZCB0aGVyZS4iCgpleGl0IDAK