IyEgL2Jpbi9zaAouICIke3NyY2Rpcj0ufS9pbml0LnNoIjsgcGF0aF9wcmVwZW5kXyAuIC4uL3NyYwoKIyBUZXN0IG9mIGdldHRleHQgZmFjaWxpdGllcyBpbiB0aGUgQyMgbGFuZ3VhZ2UuCiMgQXNzdW1lcyBhbiBmcl9GUiBsb2NhbGUgaXMgaW5zdGFsbGVkLgojIEFzc3VtZXMgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBhcmUgaW5zdGFsbGVkOiBtb25vLCBtY3MuCgojIE5vdGU6IFRoaXMgdGVzdCBmYWlscyB3aGVuIGEgR05VIGdldHRleHQgdmVyc2lvbiA8IDAuMTcgaXMgaW5zdGFsbGVkIHdpdGgKIyB0aGUgc2FtZSAtLXByZWZpeCBhcyBtY3MuIG1jcyBhcHBhcmVudGx5IHNlYXJjaGVzICR7cHJlZml4fS9saWIgYmVmb3JlCiMgc2VhcmNoaW5nIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmU6CiMgICAkIG1jcyAtb3V0OnByb2dyYW0uZXhlIC1saWI6Li4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwtY3NoYXJwIC1yZWZlcmVuY2U6R05VLkdldHRleHQgcHJvZ3JhbS5jcwojICAgcHJvZ3JhbS5jcygxNyw0NSk6IGVycm9yIENTMDExNzogYEdOVS5HZXR0ZXh0LkdldHRleHRSZXNvdXJjZU1hbmFnZXInIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZpbml0aW9uIGZvciBgR2V0UGFydGljdWxhclBsdXJhbFN0cmluZycKIyAgIC91c3IvbG9jYWwvbGliL0dOVS5HZXR0ZXh0LmRsbCAoTG9jYXRpb24gb2YgdGhlIHN5bWJvbCByZWxhdGVkIHRvIHByZXZpb3VzIGVycm9yKQojICAgcHJvZ3JhbS5jcygxOCw0NSk6IGVycm9yIENTMDExNzogYEdOVS5HZXR0ZXh0LkdldHRleHRSZXNvdXJjZU1hbmFnZXInIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZpbml0aW9uIGZvciBgR2V0UGFydGljdWxhclN0cmluZycKIyAgIC91c3IvbG9jYWwvbGliL0dOVS5HZXR0ZXh0LmRsbCAoTG9jYXRpb24gb2YgdGhlIHN5bWJvbCByZWxhdGVkIHRvIHByZXZpb3VzIGVycm9yKQojICAgQ29tcGlsYXRpb24gZmFpbGVkOiAyIGVycm9yKHMpLCAwIHdhcm5pbmdzCiMgVGhlIHdvcmthcm91bmQgaXMgdG8gaW5zdGFsbCBHTlUgZ2V0dGV4dCB3aXRoIHRoZSBzYW1lIC0tcHJlZml4LCBkZXNwaXRlCiMgdGhlIHRlc3QgZmFpbHVyZSwgYW5kIHJ1biAibWFrZSBjaGVjayIgYWZ0ZXJ3YXJkcy4KCiMgVGVzdCB3aGV0aGVyIHdlIGNhbiBidWlsZCBhbmQgdGVzdCBDIyBwcm9ncmFtcy4KdGVzdCAiJHtDU0hBUlBfQ0hPSUNFfSIgIT0gbm8gfHwgewogIGVjaG8gIlNraXBwaW5nIHRlc3Q6IGNvbmZpZ3VyZWQgd2l0aCAtLWRpc2FibGUtY3NoYXJwIgogIEV4aXQgNzcKfQp0ZXN0ICIke0JVSUxEQ1NIQVJQfSIgPSB5ZXMgfHwgewogIGVjaG8gIlNraXBwaW5nIHRlc3Q6IEMjIGNvbXBpbGVyIG5vdCBmb3VuZCIKICBFeGl0IDc3Cn0KdGVzdCAiJHtURVNUQ1NIQVJQfSIgPSB5ZXMgfHwgewogIGVjaG8gIlNraXBwaW5nIHRlc3Q6IEMjIGVuZ2luZSBub3QgZm91bmQiCiAgRXhpdCA3Nwp9CgpjYXQgPDxcRU9GID4gcHJvZ3JhbS5jcwp1c2luZyBTeXN0ZW07CnVzaW5nIEdOVS5HZXR0ZXh0OwpjbGFzcyBQcm9ncmFtIHsKICBzdGF0aWMgdm9pZCBNYWluIChTdHJpbmdbXSBhcmdzKSB7CiAgICAjaWYgX19Nb25vQ1NfXwogICAgLy8gU29tZSBzeXN0ZW1zIGRvbid0IHNldCBDdXJyZW50Q3VsdHVyZSBhbmQgQ3VycmVudFVJQ3VsdHVyZSBhcyBzcGVjaWZpZWQKICAgIC8vIGJ5IExDX0FMTC4gU28gc2V0IGl0IGJ5IGhhbmQuCiAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5DdXJyZW50VGhyZWFkLkN1cnJlbnRDdWx0dXJlID0KICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLkN1cnJlbnRUaHJlYWQuQ3VycmVudFVJQ3VsdHVyZSA9CiAgICAgIG5ldyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbygiZnItRlIiKTsKICAgICNlbmRpZgogICAgaW50IG4gPSBJbnQzMi5QYXJzZShhcmdzWzBdKTsKICAgIEdldHRleHRSZXNvdXJjZU1hbmFnZXIgY2F0YWxvZyA9IG5ldyBHZXR0ZXh0UmVzb3VyY2VNYW5hZ2VyKCJwcm9nIik7CiAgICBDb25zb2xlLldyaXRlTGluZShjYXRhbG9nLkdldFN0cmluZygiJ1lvdXIgY29tbWFuZCwgcGxlYXNlPycsIGFza2VkIHRoZSB3YWl0ZXIuIikpOwogICAgQ29uc29sZS5Xcml0ZUxpbmUoU3RyaW5nLkZvcm1hdChjYXRhbG9nLkdldFBsdXJhbFN0cmluZygiYSBwaWVjZSBvZiBjYWtlIiwiezB9IHBpZWNlcyBvZiBjYWtlIixuKSwgbikpOwogICAgQ29uc29sZS5Xcml0ZUxpbmUoU3RyaW5nLkZvcm1hdChjYXRhbG9nLkdldFN0cmluZygiezB9IGlzIHJlcGxhY2VkIGJ5IHsxfS4iKSwgIkZGIiwgIkVVUiIpKTsKICAgIENvbnNvbGUuV3JpdGVMaW5lKFN0cmluZy5Gb3JtYXQoY2F0YWxvZy5HZXRQYXJ0aWN1bGFyUGx1cmFsU3RyaW5nKCIrKyIsImEgcGllY2Ugb2YgY2FrZSIsInswfSBwaWVjZXMgb2YgY2FrZSIsbiksIG4pKTsKICAgIENvbnNvbGUuV3JpdGVMaW5lKFN0cmluZy5Gb3JtYXQoY2F0YWxvZy5HZXRQYXJ0aWN1bGFyU3RyaW5nKCIrKyIsInswfSBpcyByZXBsYWNlZCBieSB7MX0uIiksICJGRiIsICJFVVIiKSk7CiAgfQp9CkVPRgoKOiAke0NTSEFSUENPTVA9Ii9iaW4vc2ggLi4vLi4vY3NoYXJwY29tcC5zaCJ9CiR7Q1NIQVJQQ09NUH0gLW8gcHJvZ3JhbS5leGUgLUwgLi4vLi4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwtY3NoYXJwIC1sIEdOVS5HZXR0ZXh0IHByb2dyYW0uY3MgfHwgRXhpdCAxCgo6ICR7WEdFVFRFWFQ9eGdldHRleHR9CiR7WEdFVFRFWFR9IC1vIHByb2cudG1wIC0tb21pdC1oZWFkZXIgLS1uby1sb2NhdGlvbiBwcm9ncmFtLmNzIHx8IEV4aXQgMQpMQ19BTEw9QyB0ciAtZCAnXHInIDwgcHJvZy50bXAgPiBwcm9nLnBvdCB8fCBFeGl0IDEKCmNhdCA8PEVPRiA+IHByb2cub2sKbXNnaWQgIidZb3VyIGNvbW1hbmQsIHBsZWFzZT8nLCBhc2tlZCB0aGUgd2FpdGVyLiIKbXNnc3RyICIiCgojLCBjc2hhcnAtZm9ybWF0Cm1zZ2lkICJhIHBpZWNlIG9mIGNha2UiCm1zZ2lkX3BsdXJhbCAiezB9IHBpZWNlcyBvZiBjYWtlIgptc2dzdHJbMF0gIiIKbXNnc3RyWzFdICIiCgojLCBjc2hhcnAtZm9ybWF0Cm1zZ2lkICJ7MH0gaXMgcmVwbGFjZWQgYnkgezF9LiIKbXNnc3RyICIiCgojLCBjc2hhcnAtZm9ybWF0Cm1zZ2N0eHQgIisrIgptc2dpZCAiYSBwaWVjZSBvZiBjYWtlIgptc2dpZF9wbHVyYWwgInswfSBwaWVjZXMgb2YgY2FrZSIKbXNnc3RyWzBdICIiCm1zZ3N0clsxXSAiIgoKIywgY3NoYXJwLWZvcm1hdAptc2djdHh0ICIrKyIKbXNnaWQgInswfSBpcyByZXBsYWNlZCBieSB7MX0uIgptc2dzdHIgIiIKRU9GCgo6ICR7RElGRj1kaWZmfQoke0RJRkZ9IHByb2cub2sgcHJvZy5wb3QgfHwgRXhpdCAxCgpjYXQgPDxcRU9GID4gZnIucG8KbXNnaWQgIiIKbXNnc3RyICIiCiJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMVxuIgoiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gPiAxKTtcbiIKCm1zZ2lkICInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iCm1zZ3N0ciAiq1ZvdHJlIGNvbW1hbmRlLCBzJ2lsIHZvdXMgcGxhaXS7LCBkaXQgbGUgZ2Fy529uLiIKCiMgTGVzIGdhdGVhdXggYWxsZW1hbmRzIHNvbnQgbGVzIG1laWxsZXVycyBkdSBtb25kZS4KIywgY3NoYXJwLWZvcm1hdAptc2dpZCAiYSBwaWVjZSBvZiBjYWtlIgptc2dpZF9wbHVyYWwgInswfSBwaWVjZXMgb2YgY2FrZSIKbXNnc3RyWzBdICJ1biBtb3JjZWF1IGRlIGdhdGVhdSIKbXNnc3RyWzFdICJ7MH0gbW9yY2VhdXggZGUgZ2F0ZWF1IgoKIyBSZXZlcnNlIHRoZSBhcmd1bWVudHMuCiMsIGNzaGFycC1mb3JtYXQKbXNnaWQgInswfSBpcyByZXBsYWNlZCBieSB7MX0uIgptc2dzdHIgInsxfSByZW1wbGFjZSB7MH0uIgoKIyBFdXBoZW1pc3RpYyBmb3JtdWxhdGlvbi4KIywgY3NoYXJwLWZvcm1hdAptc2djdHh0ICIrKyIKbXNnaWQgImEgcGllY2Ugb2YgY2FrZSIKbXNnaWRfcGx1cmFsICJ7MH0gcGllY2VzIG9mIGNha2UiCm1zZ3N0clswXSAidW4gbW9yY2VhdSBkZSBnYXRlYXUgc3VjY3VsZW50Igptc2dzdHJbMV0gInswfSBtb3JjZWF1eCBkZSBnYXRlYXUgc3VjY3VsZW50IgoKIyBFdXBoZW1pc3RpYyBmb3JtdWxhdGlvbi4KIywgY3NoYXJwLWZvcm1hdAptc2djdHh0ICIrKyIKbXNnaWQgInswfSBpcyByZXBsYWNlZCBieSB7MX0uIgptc2dzdHIgIkxlIG5vdXZlYXUgezF9IHJlbXBsYWNlIGxlIHZpZXV4IHswfS4iCkVPRgoKOiAke01TR01FUkdFPW1zZ21lcmdlfQoke01TR01FUkdFfSAtcSAtbyBmci5wby50bXAgZnIucG8gcHJvZy5wb3QgfHwgRXhpdCAxCkxDX0FMTD1DIHRyIC1kICdccicgPCBmci5wby50bXAgPiBmci5wby5uZXcgfHwgRXhpdCAxCgo6ICR7RElGRj1kaWZmfQoke0RJRkZ9IGZyLnBvIGZyLnBvLm5ldyB8fCBFeGl0IDEKCjogJHtNU0dGTVQ9bXNnZm10fQpHRVRURVhUQ1NIQVJQTElCRElSPS4uLy4uLy4uL2dldHRleHQtcnVudGltZS9pbnRsLWNzaGFycCBcCiR7TVNHRk1UfSAtLWNzaGFycCAtZCAuIC1yIHByb2cgLWwgZnIgZnIucG8gfHwgRXhpdCAxCgojIFRlc3Qgd2hpY2ggb2YgdGhlIGZyX0ZSIGxvY2FsZXMgYXJlIGluc3RhbGxlZC4KOiAke0xPQ0FMRV9GUj1mcl9GUn0KOiAke0xPQ0FMRV9GUl9VVEY4PWZyX0ZSLlVURi04fQppZiB0ZXN0ICRMT0NBTEVfRlIgIT0gbm9uZTsgdGhlbgogIExDX0FMTD0kTE9DQUxFX0ZSIC4uL3Rlc3Rsb2NhbGUKICBjYXNlICQ/IGluCiAgICAwKSA7OwogICAgNzcpIExPQ0FMRV9GUj1ub25lOzsKICAgICopIEV4aXQgMTs7CiAgZXNhYwpmaQppZiB0ZXN0ICRMT0NBTEVfRlJfVVRGOCAhPSBub25lOyB0aGVuCiAgTENfQUxMPSRMT0NBTEVfRlJfVVRGOCAuLi90ZXN0bG9jYWxlCiAgY2FzZSAkPyBpbgogICAgMCkgOzsKICAgIDc3KSBMT0NBTEVfRlJfVVRGOD1ub25lOzsKICAgICopIEV4aXQgMTs7CiAgZXNhYwpmaQppZiB0ZXN0ICRMT0NBTEVfRlIgPSBub25lICYmIHRlc3QgJExPQ0FMRV9GUl9VVEY4ID0gbm9uZTsgdGhlbgogIGlmIHRlc3QgLWYgL3Vzci9iaW4vbG9jYWxlZGVmOyB0aGVuCiAgICBlY2hvICJTa2lwcGluZyB0ZXN0OiBubyBmcmVuY2ggbG9jYWxlIGlzIGluc3RhbGxlZCIKICBlbHNlCiAgICBlY2hvICJTa2lwcGluZyB0ZXN0OiBubyBmcmVuY2ggbG9jYWxlIGlzIHN1cHBvcnRlZCIKICBmaQogIEV4aXQgNzcKZmkKCjogJHtESUZGPWRpZmZ9CmNhdCA8PFxFT0YgPiBwcm9nLm9rCqtWb3RyZSBjb21tYW5kZSwgcydpbCB2b3VzIHBsYWl0uywgZGl0IGxlIGdhcudvbi4KMiBtb3JjZWF1eCBkZSBnYXRlYXUKRVVSIHJlbXBsYWNlIEZGLgoyIG1vcmNlYXV4IGRlIGdhdGVhdSBzdWNjdWxlbnQKTGUgbm91dmVhdSBFVVIgcmVtcGxhY2UgbGUgdmlldXggRkYuCkVPRgpjYXQgPDxcRU9GID4gcHJvZy5va3UKwqtWb3RyZSBjb21tYW5kZSwgcydpbCB2b3VzIHBsYWl0wrssIGRpdCBsZSBnYXLDp29uLgoyIG1vcmNlYXV4IGRlIGdhdGVhdQpFVVIgcmVtcGxhY2UgRkYuCjIgbW9yY2VhdXggZGUgZ2F0ZWF1IHN1Y2N1bGVudApMZSBub3V2ZWF1IEVVUiByZW1wbGFjZSBsZSB2aWV1eCBGRi4KRU9GCgo6ICR7TE9DQUxFX0ZSPWZyX0ZSfQo6ICR7TE9DQUxFX0ZSX1VURjg9ZnJfRlIuVVRGLTh9CjogJHtDU0hBUlBFWEVDPSIvYmluL3NoIC4uLy4uL2NzaGFycGV4ZWMuc2gifQppZiB0ZXN0ICRMT0NBTEVfRlIgIT0gbm9uZTsgdGhlbgogICMgT24gTWFjIE9TIFgsIHdpdGggbW9ubyA0LjIuMywgdGhpcyB0ZXN0IHdvdWxkIGZhaWwsIGJlY2F1c2UgdGhlIENvbnNvbGUncwogICMgb3V0cHV0IGVuY29kaW5nIGlzIFN5c3RlbS5UZXh0LkVuY29kaW5nLkRlZmF1bHQsIGFuZCB0aGlzIGlzIFVURi04IGV2ZW4KICAjIGluIHRoZSBmcl9GUi5JU084ODU5LTEgbG9jYWxlLiBTeXN0ZW0uVGV4dC5FbmNvZGluZy5EZWZhdWx0IGlzIGRlZmluZWQKICAjIHRocm91Z2ggSW50ZXJuYWxDb2RlUGFnZSgpLCB3aGljaCB1c2VzIGdfZ2V0X2NoYXJzZXQoKSwgd2hpY2ggdXNlcyBlaXRoZXIKICAjIGxvY2FsZV9jaGFyc2V0KCkgb3IgbmxfbGFuZ2luZm8oQ09ERVNFVCkgW3doaWNoIGlzICJJU084ODU5LTEiIGluIHRoaXMgY2FzZV0KICAjIG9yICJVVEYtOCIgLSBkZXBlbmRpbmcgb24gcGxhdGZvcm0gb3IgYnVpbGQgY29uZmlndXJhdGlvbi4gU28sIGFsbG93IHRoZQogICMgZXhwZWN0ZWQgcmVzdWx0IGluIFVURi04IGVuY29kaW5nIGhlcmUgdG9vLgogIHByZXBhcmVfbG9jYWxlXyBmciAkTE9DQUxFX0ZSCiAgTEFOR1VBR0U9IExDX0FMTD0kTE9DQUxFX0ZSICR7Q1NIQVJQRVhFQ30gLUwgLi4vLi4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwtY3NoYXJwIHByb2dyYW0uZXhlIDIgPiBwcm9nLm91dCB8fCBFeGl0IDEKICAke0RJRkZ9IHByb2cub2t1IHByb2cub3V0ID4vZGV2L251bGwgfHwgJHtESUZGfSBwcm9nLm9rIHByb2cub3V0IHx8IEV4aXQgMQpmaQppZiB0ZXN0ICRMT0NBTEVfRlJfVVRGOCAhPSBub25lOyB0aGVuCiAgcHJlcGFyZV9sb2NhbGVfIGZyICRMT0NBTEVfRlJfVVRGOAogIExBTkdVQUdFPSBMQ19BTEw9JExPQ0FMRV9GUl9VVEY4ICR7Q1NIQVJQRVhFQ30gLUwgLi4vLi4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwtY3NoYXJwIHByb2dyYW0uZXhlIDIgPiBwcm9nLm91dCB8fCBFeGl0IDEKICAke0RJRkZ9IHByb2cub2t1IHByb2cub3V0IHx8IEV4aXQgMQpmaQoKRXhpdCAwCg==