1MOyoQIABAAAAAAAAAAAAP//AAABAAAAetzvVkIBBwBcAAAAXAAAAP///////1Bl8xopWAgARQAATlzbAACAEVccwKgCWMCoAv8AiQCJADo798VPARAAAQAAAAAAACBFT0VMRUhGREVGRkFEQURHQ05FRUZDQ0FDQUNBQ0FBQQAAIAABetzvVhLyCQA8AAAAPAAAAAGAwgAAChBRcg49wJmYAAEAAAAIAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHrc71bV8wkAQAAAAEAAAAD///////8QUXIOPcCBAAABmZgAAQAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAetzvVgM+DABAAAAAQAAAAP///////wAYgqyB2YiqAAJ0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIo9iWZ73O9WRPEBAOoFAADqBQAAAYDCAAAVNmkHIQMDBdz+/gODGwEGEAEAAwIiIiIiAAAACQXZQCIiIiIAAAEBAgFJgQHMBgY2aQcRAwOEBMjIyALlAgAA0wMAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB73O9WYI4EAE4AAABOAAAAAQBeAAAFNmkHEQMDCABFwABAPxoAAAFZCLzIyMgB4AAABQIBACwBAQEBAAAAAGnSAAAAAAAAAAAAAP///wAACgIBAAAAKMjIyAEAAAAAe9zvVvZPCwBcAAAAXAAAAP///////1Bl8xopWAgARQAATl1BAACAEVa2wKgCWMCoAv8AiQCJADo79sVQARAAAQAAAAAAACBFT0VMRUhGREVGRkFEQURHQ05FRUZDQ0FDQUNBQ0FBQQAAIAABe9zvVoRZCwA8AAAAPAAAAP///////xBRciGiIAgGAAEIAAYEAAEQUXIhoiAKFIIlAAAAAAAAChSCAQAAAAAAAAAAAAAAAAAAAAAAAHvc71ayYwwAQAAAAEAAAAD///////8AGIKsgdmIqgACdQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgFbEEfNzvVlcCAgB3AAAAdwAAAAGAwgAAABBRcg49wABpQkIDAAADAnyAAAAYggCN5wADDT+AABBRcg49wIADAQAUAAIADwAAAEAAMTA1MTcyMGUzZGMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKw2F39QKDzUuDgh2Ksm3mIAAAAAgAAQUXIOPcAUfNzvVuR8BwBcAAAAXAAAAP///////1Bl8xopWAgARQAATl1mAACAEVaRwKgCWMCoAv8AiQCJADo79sVQARAAAQAAAAAAACBFT0VMRUhGREVGRkFEQURHQ05FRUZDQ0FDQUNBQ0FBQQAAIAABfNzvVmKABwA8AAAAPAAAAP///////0hidgWlyggGAAEIAAYEAAFIYnYFpcrAqAIBAAAAAAAAwKgC/wAAAAAAAAAAAAAAAAAAAAAAAHzc71adRwoAPAAAADwAAAAIACetHhM2yAcRERAIAEXAACwBCAAA/wYpYsCoB/HAqAdgxIcAswAAX/QAAAAAYAIgAMJVAAACBAW0AAB83O9WuUcKADoAAAA6AAAANsgHEREQCAAnrR4TCABFAAAsAABAAEAGqirAqAdgwKgH8QCzxIe4tco+AABf9WASchCQwAAAAgQFtHzc71bQWwoAPAAAADwAAAAIACetHhM2yAcRERAIAEXAACgCCAAA/wYoZsCoB/HAqAdgxIcAswAAX/W4tco/UBAiOFTVAAAAAAAAAAB83O9WAWAKAG8AAABvAAAACAAnrR4TNsgHEREQCABFwABhAwgAAP8GJy3AqAfxwKgHYMSHALMAAF/1uLXKP1AYIjhkswAA/////////////////////wA5AQQAZAC0bwEBARwCGgEEAAEAAQEEAAEAhQEEQAQARwIAQQQAAABkfNzvVgpgCgA2AAAANgAAADbIBxEREAgAJ60eEwgARQAAKFyVQABABk2ZwKgHYMCoB/EAs8SHuLXKPwAAYC5QEHIQkLwAAHzc71bkYQoASwAAAEsAAAA2yAcRERAIACetHhMIAEUAAD1clkAAQAZNg8CoB2DAqAfxALPEh7i1yj8AAGAuUBhyEJDRAAD/////////////////////ABUDBgV83O9WHWMKADYAAAA2AAAANsgHEREQCAAnrR4TCABFAAAoXJdAAEAGTZfAqAdgwKgH8QCzxIe4tcpUAABgLlAUchCQvAAAfNzvVkxoCgBXAAAAVwAAAAEAXgAA+/w/20L6MQgARQAASURhQAD/EY2pwKgH9eAAAPsU6RTpADUqngAAAAAAAgAAAAAAAAVfaXBwcwRfdGNwBWxvY2FsAAAMAAEEX2lwcMASAAwAAXzc71YPgQsAXAAAAFwAAAD///////9o9ygf2ZwIAEUAAE607UAAQBH028CoB4bAqAf/AIkAiQA6sNk6PAEQAAEAAAAAAAAgRkhFUEZDRUxFSEZDRVBGRkZBQ0FDQUNBQ0FDQUNBQk4AACAAAXzc71bvggsAPAAAADwAAAD///////9IYnYFpc8IBgABCAAGBAABSGJ2BaXPwKgHAQAAAAAAAMCoB/8AAAAAAAAAAAAAAAAAAAAAAAB83O9WWYwMAEAAAABAAAAA////////ABiCrIHZiKoAAnYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3m35on3c71aFvwMAXAAAAFwAAAD///////9QZfMaKVgIAEUAAE5diQAAgBFWbsCoAljAqAL/AIkAiQA6O/bFUAEQAAEAAAAAAAAgRU9FTEVIRkRFRkZBREFER0NORUVGQ0NBQ0FDQUNBQUEAACAAAX3c71afdwQAPAAAADwAAAD///////8QUXIhoiAIBgABCAAGBAABEFFyIaIgChSCJQAAAAAAAAoUggEAAAAAAAAAAAAAAAAAAAAAAAB93O9W2rQMAEAAAABAAAAA////////ABiCrIHZiKoAAncBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9EXBwH7c71Z72AEA6gUAAOoFAAABgMIAABU2aQchAwMF3P7+A4MbAQYQAQADAiIiIiIAAAAJBdlAIiIiIgAAAQECAUmBAcwGBjZpBxEDA4QEyMjIAuUCAADTAwAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH7c71a3BQIAdwAAAHcAAAABgMIAAAAQUXIOPcAAaUJCAwAAAwJ8gAAAGIIAjecAAw0/gAAQUXIOPcCAAwEAFAACAA8AAABAADEwNTE3MjBlM2RjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsNhd/UCg81Lg4IdirJt5iAAAAAIAAEFFyDj3AFH7c71ZlcQgARwAAAEcAAAABAF4AAPxQZfMaKVgIAEUAADldxQAAARG38sCoAljgAAD8z2sU6wAlXs0gdwAAAAEAAAAAAAALbmtnc2VwMDctZHIAAAEAAX7c71bU9AkARwAAAEcAAAABAF4AAPxQZfMaKVgIAEUAADldzQAAARG36sCoAljgAAD8z2sU6wAlXs0gdwAAAAEAAAAAAAALbmtnc2VwMDctZHIAAAEAAX7c71bN2QwAQAAAAEAAAAD///////8AGIKsgdmIqgACeAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACora2/ftzvVmwtDQBcAAAAXAAAAP///////1Bl8xopWAgARQAATl3bAACAEVYcwKgCWMCoAv8AiQCJADo69cVRARAAAQAAAAAAACBFT0VMRUhGREVGRkFEQURIQ05FRUZDQ0FDQUNBQ0FBQQAAIAABftzvVlaiDQA8AAAAPAAAAAgAJ60eEzbIBzEREAgARcAALAEIAAD/Bil3wKgH3MCoB2D47ACzAABaMAAAAABgAiAAk8kAAAIEBbQAAH7c71Zuog0AOgAAADoAAAA2yAcxERAIACetHhMIAEUAACwAAEAAQAaqP8CoB2DAqAfcALP47JLHllQAAFoxYBJyEJCrAAACBAW0ftzvVj24DQA8AAAAPAAAAAgAJ60eEzbIBzEREAgARcAAKAIIAAD/Bih7wKgH3MCoB2D47ACzAABaMZLHllVQECI4gCEAAAAAAAAAAH7c71Yxuw0ASwAAAEsAAAA2yAcxERAIACetHhMIAEUAAD0OgEAAQAabrsCoB2DAqAfcALP47JLHllUAAFoxUBhyEJC8AAD/////////////////////ABUDBgV+3O9WqbsNADYAAAA2AAAANsgHMREQCAAnrR4TCABFAAAoDoFAAEAGm8LAqAdgwKgH3ACz+OySx5ZqAABaMVARchCQpwAAftzvVvm7DQBvAAAAbwAAAAgAJ60eEzbIBzEREAgARcAAYQMIAAD/BidCwKgH3MCoB2D47ACzAABaMZLHllVQGCI4jv4AAP////////////////////8AOQEEAGQAtHAB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/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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ICAgICAgICAgICAgIm1heFNlc3Npb24iOiAxNiwKICAgICAgICAgICAgICAgICAgICJsc0NhcGFiaWxpdHkiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgImhvbGRUaW1lIjogMTIwLAogICAgICAgICAgICAgICAgICAgImxhcmdlQXNDYXBhYmlsaXR5IjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAiZmxvd1NwZWNDYXBhYmlsaXR5IjogIklQVjQiLAogICAgICAgICAgICAgICAgICAgImJncFBlZXIiOlsgeyJwZWVySXAiOiAiMTkyLjE2OC43LjIyMCIsICJyZW1vdGVBcyI6IDEwMCwgInBlZXJIb2xkVGltZSI6IDEyMCwgImNvbm5lY3RNb2RlIjoiYWN0aXZlIn0KICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICB9CiAgICAgIH0KICB9Cn0KCoHc71bF/wkAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADTSRkAAQAbYlsCoB2DAqAc2H/WVIkGxScBYemyKgBAA85ANAAABAQgKAE2bhgCjVIuB3O9WbzIKAEIAAABCAAAACAAnrR4TSGJ2BaXPCABFAAA0zlcAAC4GZ4pKfURdwKgHYAG7rBoTl4f1ftsX1IAQAV7pDAAAAQEICoV9jCYATUNtgdzvVnWVCwBCAAAAQgAAAEhidgWlzwgAJ60eEwgARQAANM+RQABABgZBwKgHYNg6xK7ZcgG78EuQWZyp/juAEADtZRgAAAEBCAoATZugKlNB5IHc71aUMgwAQgAAAEIAAAAIACetHhNIYnYFpc8IAEUAADTsVwAANQY0e9g6xK7AqAdgAbvZcpyp/jvwS5BagBABXrl9AAABAQgKKlPyAwBNQ5KB3O9W0VENAEAAAABAAAAA////////ABiCrIHZiKoAAnsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1tXlGYHc71YJqg0ASgAAAEoAAAA2yAcxERAIACetHhMIAEUAADwv50AAQAZ6SMCoB2DAqAfcoFkAs+xbtCYAAAAAoAJyEJC7AAACBAW0BAIICgBNm8EAAAAAAQMDB4Hc71ZCtg0AiQAAAIkAAABo9ygf0sUIACet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L29ub3MvdWkvbG9naW4uaHRtbCBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS93ZWJwLCovKjtxPTAuOA0KVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0czogMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xMmRjejR5MXMzeXJ4MWt0cW13ZWRxc3p5Ng0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KDQqF3O9WxIcEAOcHAADnBwAAaPcoH9LFCAAnrR4TCABFAAfZ0kpAAEAG0O3AqAdgwKgHNh/1lSJBsUrxWHpxt4AYAROXsgAAAQEICgBNnxIAo1gWSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNzIwDQo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+CjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPHRpdGxlPk9OT1MgTG9naW48L3RpdGxlPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgaW1nIHsKICAgICAgICAgICAgbWFyZ2luOiAyNHB4OwogICAgICAgIH0KICAgICAgICB0ZCB7CiAgICAgICAgICAgIGZvbnQ6IG5vcm1hbCAxNnB4IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICAgICAgcGFkZGluZzogNHB4OwogICAgICAgIH0KICAgICAgICBpbnB1dCB7CiAgICAgICAgICAgIGZvbnQ6IG5vcm1hbCAxNnB4IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsKICAgICAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIH0KCiAgICAgICAgaW5wdXRbdHlwZT0ic3VibWl0Il0gewogICAgICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICAgICAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNDRTU2NTA7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICAvKndpZHRoOiAxMDAlOyAvISogd2lkdGggb2YgaW1hZ2UgKiEvKi8KICAgICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgICAgIGJvcmRlcjogMDsKICAgICAgICAgICAgLW1vei1vdXRsaW5lLXJhZGl1czogNnB4OwogICAgICAgIH0KCiAgICAgICAgaW5wdXRbdHlwZT0ic3VibWl0Il06aG92ZXIgewogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgICAgIGJvcmRlcjogMXB4OwogICAgICAgICAgICBib3JkZXItY29sb3I6ICNmZmY7CiAgICAgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMTBweCAjMzM5OWZmOwogICAgICAgICAgICBvdXRsaW5lLXN0eWxlOiBzb2xpZDsKICAgICAgICAgICAgb3V0bGluZS13aWR0aDogM3B4OwogICAgICAgICAgICBvdXRsaW5lLWNvbG9yOiAjMzM5OWZmOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CjxkaXYgYWxpZ249ImNlbnRlciI+CiAgICA8aW1nIHNyYz0iZGF0YS9pbWcvb25vcy1sb2dvLmxnLnBuZyIvPgoKICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJqX3NlY3VyaXR5X2NoZWNrIj4KICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5Vc2VyOjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IGlkPSJ1c2VybmFtZSIgbmFtZT0ial91c2VybmFtZSIgdHlwZT0idGV4dCIgYXV0b2ZvY3VzLz48L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+UGFzc3dvcmQ6PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgaWQ9InBhc3N3b3JkIiBuYW1lPSJqX3Bhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIvPjwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgaWQ9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iLz48L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8L2Jv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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AG8AAAAIACetHhM2yAcxERAIAEXAAGEDCAAA/wYnQsCoB9zAqAdg+O4AswAArKmthLpwUBgiOP2rAAD/////////////////////ADkBBABkALRwAQECHAIaAQQAAQABAQQAAQCFAQRABABHAgBBBAAAAGSI3O9WXe8NADYAAAA2AAAANsgHMREQCAAnrR4TCABFAAAoGOxAAEAGkVfAqAdgwKgH3ACz+O6thLpwAACs4lAQchCQpwAAiNzvVmYZDgBnAAAAZwAAADbIBzEREAgAJ60eEwgARQAAWRjtQABABpElwKgHYMCoB9wAs/jurYS6cAAArOJQGHIQkNgAAP////////////////////8AMQEEAGQAeMCoB2AUAhIBBAABAAEBBEAEAEcBBAABAIWI3O9WeywOAEkAAABJAAAACAAnrR4TNsgHMREQCABFwAA7BAgAAP8GJmjAqAfcwKgHYPjuALMAAKzirYS6oVAYIjjqNgAA/////////////////////wATBIjc71awUw4ASQAAAEkAAAA2yAcxERAIACetHhMIAEUAADsY7kAAQAaRQsCoB2DAqAfcALP47q2EuqEAAKz1UBhyEJC6AAD/////////////////////ABMEiNzvVvJxDgBNAAAATQAAAAgAJ60eEzbIBzEREAgARcAAPwUIAAD/BiVkwKgH3MCoB2D47gCzAACs9a2EurRQGCI47AgAAP////////////////////8AFwIAAAAAiNzvVpKjDgBAAAAAQAAAAP///////wAYgqyB2YiqAAIDAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwFjCKI3O9Wl7wOAOoFAADqBQAACAAnrR4TNsgHMREQCABFwAXcBggAAP8GHsfAqAfcwKgHYPjuALMAAK0MrYS6tFAQIjiNuwAA/////////////////////wCEAgAAAG1AAQECQAIAgAQEAAAAAEAFBAAAAGTAHRsEAgAKLjExMTEuMTExMQQDAAEABAQABAkJCQmQDgA2QARHBMCoB9wAAAEAKQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAARwAQECAgMACBEREREREQAA/////////////////////wCEAgAAAG1AAQECQAIAgAQEAAAAAEAFBAAAAGTAHRsEAgAKLjIyMjIuMjIyMgQDAAEABAQABAoKCgqQDgA2QARHBMCoB9wAAAEAKQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAARwAQECAgMACCIiIiIiIgAA/////////////////////wB3AgAAAGBAAQECQAIAgAQEAAAAAEAFBAAAAGTAHQ4EAgAKLjIyMjIuMjIyMpAOADZABEcEwKgH3AAAAQApAgAAAAAAAAAAAQAAHAIAAAQAAABkAgEABHABAQICAwAIIiIiIiIiAQD/////////////////////AH8CAAAAaEABAQJAAgCABAQAAAAAQAUEAAAAZMAdFgQCAAouMzMzMy4zMzMzBAQABAsLCwuQDgA2QARHBMCoB9wAAAEAKQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAARwAQECAgMACDMzMzMzMwAA/////////////////////wB3AgAAAGBAAQECQAIAgAQEAAAAAEAFBAAAAGTAHQ4EAgAKLjMzMzMuMzMzM5AOADZABEcEwKgH3AAAAQApAgAAAAAAAAAAAQAAHAIAAAQAAABkAgEABHABAQICAwAIMzMzMzMzAQD/////////////////////ASoCAAABE0ABAQJAAgCABAQAAAAAQAUEAAAAZMAdBwRHAAMAAAqQDgDwQARHBMCoB9wAAAIASQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAARwAQECAgMACBEREREREQAAAQEAHAIAAAQAAABkAgEABHABAQICAwAIIiIiIiIiAQAAAgBJAgAAAAAAAAAAAQAAHAIAAAQAAABkAgEABHABAQICAwAIIiIiIiIiAAABAQAcAgAABAAAAGQCAQAEcAEBAgIDAAgiIiIiIiIBAAACAEkCAAAAAAAAAAABAAAcAgAABAAAAGQCAQAEcAEBAgIDAAgiIiIiIiIAAAEBABwCAAAEAAAAZAIBAARwAQECAgMACDMzMzMzMwEA/////////////////////wDdAgAAAMZAAQECQAIAgAQEAAAAAEAFBAAAAGTAHQcERwADAAAAkA4Ao0AERwTAqAfcAAACAEkCAAAAAAAAAAABAAAcAgAABAAAAGQCAQAEcAEBAgIDAAgiIiIiIiIBAAEBABwCAAAEAAAAZAIBAARwAQECAgMACBEREREREQAAAAIASQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAARwAQECAgMACCIiIiIiIgEAAQEAHAIAAAQAAABkAgEABHABAQICAwAIIiIiIiIiAAD/////////////////////AJACAAAAeUABAQJAAgCABAQAAAAAQAUEAAAAZMAdBwRHAAMAAAqQDgBWQARHBMCoB9wAAAIASQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAARwAQECAgMACDMzMzMzMwAAAQEAHAIAAAQAAABkAgEABHABAQICAwAIMzMzMzMzAQD/////////////////////AN0CAAAAxkABAQJAAgCABAQAAAAAQAUEAAAAZMAdBwRHAAMAAACQDgCjQARHBMCoB9wAAAIASQIAAAAAAAAAAAEAABwCAAAEAAAAZAIBAARwAQECAgMACDMzMzMzMwEAAQEAHAIAAAQAAABkAgEABHABAQICAwAIIiIiIiIiAAAAAgBJAgAAAAAAAAAAAQAAHAIAAAQAAACI3O9Wl7wOADYAAAA2AAAANsgHMREQCAAnrR4TCABFAAAoGO9AAEAGkVTAqAdgwKgH3ACz+O6thLq0AACywFAQfXiQpwAAiNzvVuvCDgCnAAAApwAAAAgAJ60eEzbIBzEREAgARcAAmQcIAAD/BiMKwKgH3MCoB2D47gCzAACywK2EurRQGCI4PJsAAGQCAQAEcAEBAgIDAAgzMzMzMzMBAAEBABwCAAAEAAAAZAIBAARwAQECAgMACDMzMzMzMwAA/////////////////////wAeAgAAAAeQDwADQARH/////////////////////wAeAgAAAAeQDwADAAGFidzvVskcAAA2AAAANgAAADbIBzEREAgAJ60eEwgARQAAKBjwQABABpFTwKgHYMCoB9wAs/jurYS6tAAAszFQEH14kKcAAInc71azeQcA1wAAANcAAAABAF5///pQZfMaKVgIAEUAAMlgTwAAARGl2sCoAljv///6z2wHbAC1PXJNLVNFQVJDSCAqIEhUVFAvMS4xDQpIT1NUOiAyMzkuMjU1LjI1NS4yNTA6MTkwMA0KTUFOOiAic3NkcDpkaXNjb3ZlciINCk1YOiAxDQpTVDogdXJuOmRpYWwtbXVsdGlzY3JlZW4tb3JnOnNlcnZpY2U6ZGlhbDoxDQpVU0VSLUFHRU5UOiBHb29nbGUgQ2hyb21lLzUwLjAuMjY2MS4xMSBXaW5kb3dzDQoNConc71ZJAAkAXAAAAFwAAAD///////9QZfMaKVgIAEUAAE5gWQAAgBFTnsCoAljAqAL/AIkAiQA6OvHFUwEQAAEAAAAAAAAgRkRGS0ZJRUZFTkZEREJERUNORURGRENBQ0FDQUNBQUEAACAAAYnc71bDAQkAPAAAADwAAAD///////9IYnYFpcoIBgABCAAGBAABSGJ2BaXKwKgCAQAAAAAAAMCoAv8AAAAAAAAAAAAAAAAAAAAAAACJ3O9WkMgOAEAAAABAAAAA////////ABiCrIHZiKoAAgQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAit0lDIrc71bYHQIA6gUAAOoFAAABgMIAABU2aQchAwMF3P7+A4MbAQYQAQADAiIiIiIAAAAJBdlAIiIiIgAAAQECAUmBAcwGBjZpBxEDA4QEyMjIAuUCAADTAwAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIrc71bAxQIAQAAAAEAAAAD///////8A4PwWfzCQARIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAitzvVg60AwB3AAAAdwAAAAGAwgAAABBRcg49wABpQkIDAAADAnyAAAAYggCN5wADDT+AABBRcg49wIADAQAUAAIADwAAAEAAMTA1MTcyMGUzZGMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKw2F39QKDzUuDgh2Ksm3mIAAAAAgAAQUXIOPcAUitzvVpQRBADqBQAA6gUAAAGAwgAAFTZpBxEDAwXc/v4DgxsBBhABAAMCEREREQAAAB4F2UAiIiIiAAABAQIBSYEBzAYGNmkHIQMDhATIyMgB5QIAANMDAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAitzvVjYVBQBcAAAAXAAAAP///////1Bl8xopWAgARQAATmCCAACAEVN1wKgCWMCoAv8AiQCJADo68cVTARAAAQAAAAAAACBGREZLRklFRkVORkREQkRFQ05FREZEQ0FDQUNBQ0FBQQAAIAABitzvVqglBQA8AAAAPAAAAP///////xBRciGiIAgGAAEIAAYEAAEQUXIhoiAKFIIlAAAAAAAAChSCAQAAAAAAAAAAAAAAAAAAAAAAAIrc71ZrfAcA1wAAANcAAAABAF5///pQZfMaKVgIAEUAAMlgkwAAARGllsCoAljv///6z2wHbAC1PXJNLVNFQVJDSCAqIEhUVFAvMS4xDQpIT1NUOiAyMzkuMjU1LjI1NS4yNTA6MTkwMA0KTUFOOiAic3NkcDpkaXNjb3ZlciINCk1YOiAxDQpTVDogdXJuOmRpYWwtbXVsdGlzY3JlZW4tb3JnOnNlcnZpY2U6ZGlhbDoxDQpVU0VSLUFHRU5UOiBHb29nbGUgQ2hyb21lLzUwLjAuMjY2MS4xMSBXaW5kb3dzDQoNCorc71ZZ8Q4AQAAAAEAAAAD///////8AGIKsgdmIqgACBQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg9R1ui9zvVgNKAQBcAAAAXAAAAP///////1Bl8xopWAgARQAATmC1AACAEVNCwKgCWMCoAv8AiQCJADo68cVTARAAAQAAAAAAACBGREZLRklFRkVORkREQkRFQ05FREZEQ0FDQUNBQ0FBQQAAIAABi9zvVo6cBwDXAAAA1wAAAAEAXn//+lBl8xopWAgARQAAyWDWAAABEaVTwKgCWO////rPbAdsALU9ck0tU0VBUkNIICogSFRUUC8xLjENCkhPU1Q6IDIzOS4yNTUuMjU1LjI1MDoxOTAwDQpNQU46ICJzc2RwOmRpc2NvdmVyIg0KTVg6IDENClNUOiB1cm46ZGlhbC1tdWx0aXNjcmVlbi1vcmc6c2VydmljZTpkaWFsOjENClVTRVItQUdFTlQ6IEdvb2dsZSBDaHJvbWUvNTAuMC4yNjYxLjExIFdpbmRvd3MNCg0Ki9zvVuZLDABAAAAAQAAAAP///////wAP4hAe3pAAFwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL3O9WPxoPAEAAAABAAAAA////////ABiCrIHZiKoAAgYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3o1VyIzc71Z4JAAAiQMAAIkDAAAIACetHhNo9ygf0sUIAEUAA3s8HEAAQAZresCoBzbAqAdglSIf9Vh6dFZBsfOugBgDkPSjAAABAQgKAKNepwBNnxlQT1NUIC9vbm9zL3VpL2pfc2VjdXJpdHlfY2hlY2sgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LUxlbmd0aDogMzMNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiB0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS93ZWJwLCovKjtxPTAuOA0KT3JpZ2luOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODENClVwZ3JhZGUtSW5zZWN1cmUtUmVxdWVzdHM6IDENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2xvZ2luLmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZQ0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTEyZGN6NHkxczN5cngxa3RxbXdlZHFzenk2DQoNCmpfdXNlcm5hbWU9a2FyYWYmal9wYXNzd29yZD1rYXJhZozc71atRQAAKwEAACsBAABo9ygf0sUIACetHhMIAEUAAR3Sa0AAQAbXiMCoB2DAqAc2H/WVIkGx865YenedgBgBM5D2AAABAQgKAE2lowCjXqdIVFRQLzEuMSAzMDIgRm91bmQNClNldC1Db29raWU6IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzODtQYXRoPS9vbm9zL3VpDQpFeHBpcmVzOiBUaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVA0KTG9jYXRpb246IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkNvbnRlbnQtTGVuZ3RoOiAwDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCozc71a3RgAAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8HUAAQAZuwMCoBzbAqAdglSIf9Vh6d51BsfSXgBADpiJ7AAABAQgKAKNeqQBNpaOM3O9Wmk8AAP8CAAD/AgAACAAnrR4TaPcoH9LFCABFAALxPB5AAEAGbALAqAc2wKgHYJUiH/VYenedQbH0l4AYA6aG4QAAAQEICgCjXqoATaWjR0VUIC9vbm9zL3VpL2luZGV4Lmh0bWwgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogdGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2Uvd2VicCwqLyo7cT0wLjgNClVwZ3JhZGUtSW5zZWN1cmUtUmVxdWVzdHM6IDENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvbG9naW4uaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WD4kAADoRAAA6EQAAaPcoH9LFCAAnrR4TCABFABEs0mxAAEAGx3jAqAdgwKgHNh/1lSJBsfSXWHp6WoAQAUOhBQAAAQEICgBNpakAo16qSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KQ29udGVudC1MZW5ndGg6IDgzMDUNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KPCFET0NUWVBFIGh0bWw+CjwhLS0KfiBDb3B5cmlnaHQgMjAxNC0yMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5Cn4KfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCn4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cn4KfiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCn4KfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tPgo8aHRtbD4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGEvaW1nL29ub3MtbG9nby5wbmciPgoKICAgIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YS9pbWcvYXBwbGUtdG91Y2gtaWNvbi5wbmciPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj4KICAgIDxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLXN0YXR1cy1iYXItc3R5bGUiIGNvbnRlbnQ9ImJsYWNrIj4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KCiAgICA8dGl0bGU+T05PUzwvdGl0bGU+CgogICAgPCEtLSBUaGlyZCBwYXJ0eSBsaWJyYXJ5IGNvZGUgaW5jbHVkZWQgaGVyZSAtLT4KICAgIDwhLS1UT0RPOiB1c2UgbWluaWZpZWQgdmVyc2lvbnMsIG9uY2UgZGVidWdnaW5nIGlzIGNvbXBsZXRlIC0tPgogICAgPHNjcmlwdCBzcmM9InRwL2FuZ3VsYXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InRwL2FuZ3VsYXItcm91dGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InRwL2FuZ3VsYXItY29va2llcy5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9InRwL2QzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJ0cC90b3BvanNvbi52MS5taW4uanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJ0cC9DaGFydC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InRwL2FuZ3VsYXItY2hhcnQubWluLmpzIj48L3NjcmlwdD4KCiAgICA8IS0tIE9OT1MgVUkgRnJhbWV3b3JrIGluY2x1ZGVkIGhlcmUgLS0+CiAgICA8IS0tIFRPRE86IHVzZSBhIHNpbmdsZSBjYXRlbmF0ZWQtbWluaWZpZWQgZmlsZSBoZXJlIC0tPgogICAgPHNjcmlwdCBzcmM9Im9ub3MuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9kaXJlY3RpdmVzLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3V0aWwvdXRpbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3V0aWwvZWUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL2ZuLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvdXRpbC9yYW5kb20uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy91dGlsL3RoZW1lLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvdXRpbC9rZXlzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvdXRpbC9wcmVmcy5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9tYXN0L21hc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9uYXYvbmF2LmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3N2Zy9zdmcuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9zdmcvZ2x5cGguanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9zdmcvaWNvbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3N2Zy9nZW9kYXRhLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL21hcC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3N2Zy96b29tLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvc3ZnL3N2Z1V0aWwuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvcmVtb3RlL3JlbW90ZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3JlbW90ZS91cmxmbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3JlbW90ZS9yZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvcmVtb3RlL3dzb2NrLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvcmVtb3RlL3dlYnNvY2tldC5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy93aWRnZXQvd2lkZ2V0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvd2lkZ2V0L3RhYmxlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvd2lkZ2V0L3Rvb2xiYXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy93aWRnZXQvdG9vbHRpcC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L3dpZGdldC9idXR0b24uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy93aWRnZXQvdGFibGVCdWlsZGVyLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL2xheWVyLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvZncvbGF5ZXIvcGFuZWwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9sYXllci9kaWFsb2cuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9sYXllci9mbGFzaC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL3F1aWNraGVscC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL2Z3L2xheWVyL3ZlaWwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC9mdy9sYXllci9sb2FkaW5nLmpzIj48L3NjcmlwdD4KCiAgICA8IS0tIEZyYW1ld29yayBhbmQgbGlicmFyeSBzdHlsZXNoZWV0cyBpbmNsdWRlZCBoZXJlIC0tPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ0cC9hbmd1bGFyLWNoYXJ0Lm1pbi5jc3MiPgoKICAgIDwhLS0gVE9ETzogdXNlIGEgc2luZ2xlIGNhdGVuYXRlZC1taW5pZmllZCBmaWxlIGhlcmUgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9vbm9zLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9jb21tb24uY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L21hc3QvbWFzdC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvc3ZnL2dseXBoLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy9zdmcvaWNvbi5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvcGFuZWwuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L2xheWVyL2RpYWxvZy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvZmxhc2guY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L2xheWVyL3F1aWNraGVscC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvdmVpbC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbGF5ZXIvbG9hZGluZy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvbmF2L25hdi5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNojNzvVmGJAABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwfQABABm6+wKgHNsCoB2CVIh/1WHp6WkGyBY+AEAPqDngAAAEBCAoAo16tAE2lqYzc71ZhiQAAHhAAAB4QAABo9ygf0sUIACetHhMIAEUAEBDSb0AAQAbIkcCoB2DAqAc2H/WVIkGyBY9YenpagBgBQ5/pAAABAQgKAE2lqQCjXqplZXQiIGhyZWY9ImFwcC9mdy93aWRnZXQvYnV0dG9uLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC9mdy93aWRnZXQvdG9vbGJhci5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvZncvd2lkZ2V0L3Rvb2x0aXAuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL2Z3L3dpZGdldC90YWJsZS5jc3MiPgoKICAgIDwhLS0gQnVpbHRpbiB2aWV3cyBqYXZhc2NyaXB0LiAtLT4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG8uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0QzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9FdmVudC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvRGlhbG9nLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9GaWx0ZXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb0ZvcmNlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9JbnN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9MaW5rLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9Nb2RlbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvT2JsaXF1ZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvT3ZlcmxheS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvUGFuZWwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3RvcG8vdG9wb1NlbGVjdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdG9wby90b3BvU3ByaXRlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9UcmFmZmljLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9UcmFmZmljTmV3LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy90b3BvL3RvcG9Ub29sYmFyLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9kZXZpY2UvZGV2aWNlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9mbG93L2Zsb3cuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L3BvcnQvcG9ydC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L21ldGVyL21ldGVyLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJhcHAvdmlldy9saW5rL2xpbmsuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L2hvc3QvaG9zdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvaW50ZW50L2ludGVudC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvYXBwL2FwcC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvc2V0dGluZ3Mvc2V0dGluZ3MuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImFwcC92aWV3L2NsdXN0ZXIvY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvcHJvY2Vzc29yL3Byb2Nlc3Nvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYXBwL3ZpZXcvdHVubmVsL3R1bm5lbC5qcyI+PC9zY3JpcHQ+CgogICAgPCEtLSBDb250cmlidXRlZCBqYXZhc2NyaXB0IGluamVjdGVkIGhlcmUgLS0+CiAgICA8IS0tIEJ1aWx0aW4gdmlldyBqYXZhc2NyaXB0IGRlZmluZWQgaW4gaW5kZXguaHRtbCB0ZW1wbGF0ZSAtLT4KCgoKICAgIDwhLS0gQnVpbHRpbiB2aWV3cyBzdHlsZXNoZWV0cy4gLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L3RvcG8vdG9wby5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9kZXZpY2UvZGV2aWNlLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2Zsb3cvZmxvdy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9wb3J0L3BvcnQuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvbWV0ZXIvbWV0ZXIuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvbGluay9saW5rLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2hvc3QvaG9zdC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJhcHAvdmlldy9pbnRlbnQvaW50ZW50LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L2FwcC9hcHAuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvc2V0dGluZ3Mvc2V0dGluZ3MuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvY2x1c3Rlci9jbHVzdGVyLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFwcC92aWV3L3Byb2Nlc3Nvci9wcm9jZXNzb3IuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwL3ZpZXcvdHVubmVsL3R1bm5lbC5jc3MiPgoKICAgIDwhLS0gQ29udHJpYnV0ZWQgc3R5bGVzaGVldHMgaW5qZWN0ZWQgaGVyZSAtLT4KICAgIDwhLS0gQnVpbHRpbiB2aWV3IHN0eWxlc2hlZXRzIGRlZmluZWQgaW4gaW5kZXguaHRtbCB0ZW1wbGF0ZSAtLT4KCgoKPC9oZWFkPgo8Ym9keSBjbGFzcz0ibGlnaHQiIG5nLWFwcD0ib25vc0FwcCI+CjxkaXYgaWQ9ImZyYW1lIiBuZy1jb250cm9sbGVyPSJPbm9zQ3RybCBhcyBvbm9zQ3RybCIgZGV0ZWN0LWJyb3dzZXI+CiAgICA8ZGl2IGlkPSJtYXN0IgogICAgICAgICBuZy1jb250cm9sbGVyPSJNYXN0Q3RybCBhcyBtYXN0Q3RybCIKICAgICAgICAgbmctaW5jbHVkZT0iJ2FwcC9mdy9tYXN0L21hc3QuaHRtbCciPjwvZGl2PgoKICAgIDxkaXYgaWQ9InZpZXciIG5nLXZpZXc+PC9kaXY+CgogICAgPGRpdiBpZD0ibmF2IgogICAgICAgICBuZy1jb250cm9sbGVyPSJOYXZDdHJsIGFzIG5hdkN0cmwiCiAgICAgICAgIG5nLWluY2x1ZGU9IiduYXYuaHRtbCciPjwvZGl2PgoKICAgIDxkaXYgaWQ9ImZsb2F0cGFuZWxzIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImFsZXJ0cyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ0b29sdGlwIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImZsYXNoIj48L2Rpdj4KICAgIDxkaXYgaWQ9InF1aWNraGVscCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ2ZWlsIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtc2ciPjwvZGl2PgogICAgICAgIDxzdmcgcmVzaXplPjwvc3ZnPgogICAgPC9kaXY+CjwvZGl2PgoKPHNjcmlwdD4KICAgIDwhLS0gSW5qZWN0IHVzZXIgYWdlbnQgaW5mbyBpbnRvIGh0bWwgZWxlbWVudCB0byBhbGxvdyBDU1Mgc2Vuc2l0aXZpdHkuIC0tPgogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdCA9ICEhKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdykgfHwgISEoJ29ubXNnZXN0dXJlY2hhbmdlJyBpbiB3aW5kb3cpOwogICAgICAgIGQzLnNlbGVjdChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLXVzZXJhZ2VudCcsIG5hdmlnYXRvci51c2VyQWdlbnQpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLXBsYXRmb3JtJywgbmF2aWdhdG9yLnBsYXRmb3JtKQogICAgICAgICAgICAuY2xhc3NlZCgndG91Y2gnLCB0KTsKICAgIH0oKSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KjNzvVmGJAABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwgQABABm69wKgHNsCoB2CVIh/1WHp6WkGyFWuAEAQq/loAAAEBCAoAo16uAE2lqYzc71ZGDgEAuwIAALsCAAAIACetHhNo9ygf0sUIAEUAAq08IUAAQAZsQ8CoBzbAqAdglSIf9Vh6elpBshVrgBgEKtP9AAABAQgKAKNetgBNpalHRVQgL29ub3MvdWkvdHAvYW5ndWxhci5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WbA4BAMECAADBAgAACAAnrR4TaPcoH9LFCABFAAKzEYdAAEAGltfAqAc2wKgHYJUlH/UUCUmVxIwRx4AYAOWGxAAAAQEICgCjXrYATZ8NR0VUIC9vbm9zL3VpL3RwL2FuZ3VsYXItcm91dGUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVowOAQBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANI7KQABABhwTwKgHYMCoBzYf9ZUlxIwRxxQJTBSAEADtkA0AAAEBCAoATaWyAKNetozc71bBDgEAwwIAAMMCAAAIACetHhNo9ygf0sUIAEUAArU8LkAAQAZsLsCoBzbAqAdglSYf9SAPZD7jFQ0WgBgA5ePdAAABAQgKAKNetgBNnw1HRVQgL29ub3MvdWkvdHAvYW5ndWxhci1jb29raWVzLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bZDgEAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADSSG0AAQAYYwsCoB2DAqAc2H/WVJuMVDRYgD2a/gBAA7ZANAAABAQgKAE2lsgCjXraM3O9W8g4BALYCAAC2AgAACAAnrR4TaPcoH9LFCABFAAKoLdVAAEAGepTAqAc2wKgHYJUnH/XbknXDOVCpv4AYAOXHywAAAQEICgCjXrYATZ8NR0VUIC9vbm9zL3VpL3RwL2QzLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YFDwEAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQ2skAAQAZ0K8CoB2DAqAc2H/WVJzlQqb/bkng3gBAA7ZANAAABAQgKAE2lsgCjXraM3O9WmQ8BAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK12aZAAEAGzrXAqAc2wKgHYJUoH/UZ+oG29P29r4AYAOVm2wAAAQEICgCjXrYATZ8NR0VUIC9vbm9zL3VpL3RwL3RvcG9qc29uLnYxLm1pbi5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WqQ8BAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0IqJAAEAGiDvAqAdgwKgHNh/1lSj0/b2vGfqEN4AQAO2QDQAAAQEICgBNpbIAo162jNzvVr4PAQC9AgAAvQIAAAgAJ60eE2j3KB/SxQgARQACr0EdQABABmdFwKgHNsCoB2CVKR/1w0wZC1H9etiAGADlEW0AAAEBCAoAo162AE2fDUdFVCAvb25vcy91aS90cC9DaGFydC5taW4uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVskPAQBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANOXVQABABsUHwKgHYMCoBzYf9ZUpUf162MNMG4aAEADtkA0AAAEBCAoATaWyAKNetozc71YxGwEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHzSckAAQAa8IsCoB2DAqAc2H/WVIkGyFWtYenzTgBABU6xVAAABAQgKAE2lsgCjXrZIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo4MDAwDQovKioKICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjMuNQogKiAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZwogKiBMaWNlbnNlOiBNSVQKICovCihmdW5jdGlvbih3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHsndXNlIHN0cmljdCc7CgovKioKICogQGRlc2NyaXB0aW9uCiAqCiAqIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGEgdXRpbGl0eSBmb3IgcHJvZHVjaW5nIHJpY2ggRXJyb3IgbWVzc2FnZXMgd2l0aGluCiAqIEFuZ3VsYXIuIEl0IGNhbiBiZSBjYWxsZWQgYXMgZm9sbG93czoKICoKICogdmFyIGV4YW1wbGVNaW5FcnIgPSBtaW5FcnIoJ2V4YW1wbGUnKTsKICogdGhyb3cgZXhhbXBsZU1pbkVycignb25lJywgJ1RoaXMgezB9IGlzIHsxfScsIGZvbywgYmFyKTsKICoKICogVGhlIGFib3ZlIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgbWluRXJyIGluIHRoZSBleGFtcGxlIG5hbWVzcGFjZS4gVGhlCiAqIHJlc3VsdGluZyBlcnJvciB3aWxsIGhhdmUgYSBuYW1lc3BhY2VkIGVycm9yIGNvZGUgb2YgZXhhbXBsZS5vbmUuICBUaGUKICogcmVzdWx0aW5nIGVycm9yIHdpbGwgcmVwbGFjZSB7MH0gd2l0aCB0aGUgdmFsdWUgb2YgZm9vLCBhbmQgezF9IHdpdGggdGhlCiAqIHZhbHVlIG9mIGJhci4gVGhlIG9iamVjdCBpcyBub3QgcmVzdHJpY3RlZCBpbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpdCBjYW4KICogdGFrZS4KICoKICogSWYgZmV3ZXIgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgdGhhbiBuZWNlc3NhcnkgZm9yIGludGVycG9sYXRpb24sIHRoZSBleHRyYQogKiBpbnRlcnBvbGF0aW9uIG1hcmtlcnMgd2lsbCBiZSBwcmVzZXJ2ZWQgaW4gdGhlIGZpbmFsIHN0cmluZy4KICoKICogU2luY2UgZGF0YSB3aWxsIGJlIHBhcnNlZCBzdGF0aWNhbGx5IGR1cmluZyBhIGJ1aWxkIHN0ZXAsIHNvbWUgcmVzdHJpY3Rpb25zCiAqIGFyZSBhcHBsaWVkIHdpdGggcmVzcGVjdCB0byBob3cgbWluRXJyIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBhbmQgY2FsbGVkLgogKiBJbnN0YW5jZXMgc2hvdWxkIGhhdmUgbmFtZXMgb2YgdGhlIGZvcm0gbmFtZXNwYWNlTWluRXJyIGZvciBhIG1pbkVyciBjcmVhdGVkCiAqIHVzaW5nIG1pbkVycignbmFtZXNwYWNlJykgLiBFcnJvciBjb2RlcywgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGUgc3RyaW5ncwogKiBzaG91bGQgYWxsIGJlIHN0YXRpYyBzdHJpbmdzLCBub3QgdmFyaWFibGVzIG9yIGdlbmVyYWwgZXhwcmVzc2lvbnMuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgVGhlIG5hbWVzcGFjZSB0byB1c2UgZm9yIHRoZSBuZXcgbWluRXJyIGluc3RhbmNlLgogKiBAcGFyYW0ge2Z1bmN0aW9ufSBFcnJvckNvbnN0cnVjdG9yIEN1c3RvbSBlcnJvciBjb25zdHJ1Y3RvciB0byBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXR1cm5pbmcKICogICBlcnJvciBmcm9tIHJldHVybmVkIGZ1bmN0aW9uLCBmb3IgY2FzZXMgd2hlbiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBlcnJvciBpcyB1c2VmdWwuCiAqIEByZXR1cm5zIHtmdW5jdGlvbihjb2RlOnN0cmluZywgdGVtcGxhdGU6c3RyaW5nLCAuLi50ZW1wbGF0ZUFyZ3MpOiBFcnJvcn0gbWluRXJyIGluc3RhbmNlCiAqLwoKZnVuY3Rpb24gbWluRXJyKG1vZHVsZSwgRXJyb3JDb25zdHJ1Y3RvcikgewogIEVycm9yQ29uc3RydWN0b3IgPSBFcnJvckNvbnN0cnVjdG9yIHx8IEVycm9yOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBjb2RlID0gYXJndW1lbnRzWzBdLAogICAgICBwcmVmaXggPSAnWycgKyAobW9kdWxlID8gbW9kdWxlICsgJzonIDogJycpICsgY29kZSArICddICcsCiAgICAgIHRlbXBsYXRlID0gYXJndW1lbnRzWzFdLAogICAgICB0ZW1wbGF0ZUFyZ3MgPSBhcmd1bWVudHMsCgogICAgICBtZXNzYWdlLCBpOwoKICAgIG1lc3NhZ2UgPSBwcmVmaXggKyB0ZW1wbGF0ZS5yZXBsYWNlKC9ce1xkK1x9L2csIGZ1bmN0aW9uKG1hdGNoKSB7CiAgICAgIHZhciBpbmRleCA9ICttYXRjaC5zbGljZSgxLCAtMSksIGFyZzsKCiAgICAgIGlmIChpbmRleCArIDIgPCB0ZW1wbGF0ZUFyZ3MubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHRvRGVidWdTdHJpbmcodGVtcGxhdGVBcmdzW2luZGV4ICsgMl0pOwogICAgICB9CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0pOwoKICAgIG1lc3NhZ2UgPSBtZXNzYWdlICsgJ1xuaHR0cDovL2Vycm9ycy5hbmd1bGFyanMub3JnLzEuMy41LycgKwogICAgICAobW9kdWxlID8gbW9kdWxlICsgJy8nIDogJycpICsgY29kZTsKICAgIGZvciAoaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAoaSA9PSAyID8gJz8nIDogJyYnKSArICdwJyArIChpIC0gMikgKyAnPScgKwogICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0b0RlYnVnU3RyaW5nKGFyZ3VtZW50c1tpXSkpOwogICAgfQogICAgcmV0dXJuIG5ldyBFcnJvckNvbnN0cnVjdG9yKG1lc3NhZ2UpOwogIH07Cn0KCi8qIFdlIG5lZWQgdG8gdGVsbCBqc2hpbnQgd2hhdCB2YXJpYWJsZXMgYXJlIGJlaW5nIGV4cG9ydGVkICovCi8qIGdsb2JhbCBhbmd1bGFyOiB0cnVlLAogIG1zaWU6IHRydWUsCiAganFMaXRlOiB0cnVlLAogIGpRdWVyeTogdHJ1ZSwKICBzbGljZTogdHJ1ZSwKICBzcGxpY2U6IHRydWUsCiAgcHVzaDogdHJ1ZSwKICB0b1N0cmluZzogdHJ1ZSwKICBuZ01pbkVycjogdHJ1ZSwKICBhbmd1bGFyTW9kdWxlOiB0cnVlLAogIHVpZDogdHJ1ZSwKICBSRUdFWF9TVFJJTkdfUkVHRVhQOiB0cnVlLAogIFZBTElESVRZX1NUQVRFX1BST1BFUlRZOiB0cnVlLAoKICBsb3dlcmNhc2U6IHRydWUsCiAgdXBwZXJjYXNlOiB0cnVlLAogIG1hbnVhbExvd2VyY2FzZTogdHJ1ZSwKICBtYW51YWxVcHBlcmNhc2U6IHRydWUsCiAgbm9kZU5hbWVfOiB0cnVlLAogIGlzQXJyYXlMaWtlOiB0cnVlLAogIGZvckVhY2g6IHRydWUsCiAgc29ydGVkS2V5czogdHJ1ZSwKICBmb3JFYWNoU29ydGVkOiB0cnVlLAogIHJldmVyc2VQYXJhbXM6IHRydWUsCiAgbmV4dFVpZDogdHJ1ZSwKICBzZXRIYXNoS2V5OiB0cnVlLAogIGV4dGVuZDogdHJ1ZSwKICBpbnQ6IHRydWUsCiAgaW5oZXJpdDogdHJ1ZSwKICBub29wOiB0cnVlLAogIGlkZW50aXR5OiB0cnVlLAogIHZhbHVlRm46IHRydWUsCiAgaXNVbmRlZmluZWQ6IHRydWUsCiAgaXNEZWZpbmVkOiB0cnVlLAogIGlzT2JqZWN0OiB0cnVlLAogIGlzU3RyaW5nOiB0cnVlLAogIGlzTnVtYmVyOiB0cnVlLAogIGlzRGF0ZTogdHJ1ZSwKICBpc0FycmF5OiB0cnVlLAogIGlzRnVuY3Rpb246IHRydWUsCiAgaXNSZWdFeHA6IHRydWUsCiAgaXNXaW5kb3c6IHRydWUsCiAgaXNTY29wZTogdHJ1ZSwKICBpc0ZpbGU6IHRydWUsCiAgaXNCbG9iOiB0cnVlLAogIGlzQm9vbGVhbjogdHJ1ZSwKICBpc1Byb21pc2VMaWtlOiB0cnVlLAogIHRyaW06IHRydWUsCiAgZXNjYXBlRm9yUmVnZXhwOiB0cnVlLAogIGlzRWxlbWVudDogdHJ1ZSwKICBtYWtlTWFwOiB0cnVlLAogIGluY2x1ZGVzOiB0cnVlLAogIGFycmF5UmVtb3ZlOiB0cnVlLAogIGNvcHk6IHRydWUsCiAgc2hhbGxvd0NvcHk6IHRydWUsCiAgZXF1YWxzOiB0cnVlLAogIGNzcDogdHJ1ZSwKICBjb25jYXQ6IHRydWUsCiAgc2xpY2VBcmdzOiB0cnVlLAogIGJpbmQ6IHRydWUsCiAgdG9Kc29uUmVwbGFjZXI6IHRydWUsCiAgdG9Kc29uOiB0cnVlLAogIGZyb21Kc29uOiB0cnVlLAogIHN0YXJ0aW5nVGFnOiB0cnVlLAogIHRyeURlY29kZVVSSUNvbXBvbmVudDogdHJ1ZSwKICBwYXJzZUtleVZhbHVlOiB0cnVlLAogIHRvS2V5VmFsdWU6IHRydWUsCiAgZW5jb2RlVXJpU2VnbWVudDogdHJ1ZSwKICBlbmNvZGVVcmlRdWVyeTogdHJ1ZSwKICBhbmd1bGFySW5pdDogdHJ1ZSwKICBib290c3RyYXA6IHRydWUsCiAgZ2V0VGVzdGFiaWxpdHk6IHRydWUsCiAgc25ha2VfY2FzZTogdHJ1ZSwKICBiaW5kSlF1ZXJ5OiB0cnVlLAogIGFzc2VydEFyZzogdHJ1ZSwKICBhc3NlcnRBcmdGbjogdHJ1ZSwKICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eTogdHJ1ZSwKICBnZXR0ZXI6IHRydWUsCiAgZ2V0QmxvY2tOb2RlczogdHJ1ZSwKICBoYXNPd25Qcm9wZXJ0eTogdHJ1ZSwKICBjcmVhdGVNYXA6IHRydWUsCgogIE5PREVfVFlQRV9FTEVNRU5UOiB0cnVlLAogIE5PREVfVFlQRV9URVhUOiB0cnVlLAogIE5PREVfVFlQRV9DT01NRU5UOiB0cnVlLAogIE5PREVfVFlQRV9ET0NVTUVOVDogdHJ1ZSwKICBOT0RFX1RZUEVfRE9DVU1FTlRfRlJBR01FTlQ6IHRydWUsCiovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8qKgogKiBAbmdkb2MgbW9kdWxlCiAqIEBuYW1lIG5nCiAqIEBtb2R1bGUgbmcKICogQGRlc2NyaXB0aW9uCiAqCiAqICMgbmcgKGNvcmUgbW9kdWxlKQogKiBUaGUgbmcgbW9kdWxlIGlzIGxvYWRlZCBieSBkZWZhdWx0IHdoZW4gYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQuIFRoZSBtb2R1bGUgaXRzZWxmCiAqIGNvbnRhaW5zIHRoZSBlc3NlbnRpYWwgY29tcG9uZW50cyBmb3IgYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uIHRvIGZ1bmN0aW9uLiBUaGUgdGFibGUgYmVsb3cKICogbGlzdHMgYSBoaWdoIGxldmVsIGJyZWFrZG93biBvZiBlYWNoIG9mIHRoZSBzZXJ2aWNlcy9mYWN0b3JpZXMsIGZpbHRlcnMsIGRpcmVjdGl2ZXMgYW5kIHRlc3RpbmcKICogY29tcG9uZW50cyBhdmFpbGFibGUgd2l0aGluIHRoaXMgY29yZSBtb2R1bGUuCiAqCiAqIDxkaXYgZG9jLW1vZHVsZS1jb21wb25lbnRzPSJuZyI+PC9kaXY+CiAqLwoKdmFyIFJFR0VYX1NUUklOR19SRUdFWFAgPSAvXlwvKC4rKVwvKFthLXpdKikkLzsKCi8vIFRoZSBuYW1lIG9mIGEgZm9ybSBjb250cm9sJ3MgVmFsaWRpdHlTdGF0ZSBwcm9wZXJ0eS4KLy8gVGhpcyBpcyB1c2VkIHNvIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgaW50ZXJuYWwgdGVzdHMgdG8gY3JlYXRlIG1vY2sgVmFsaWRpdHlTdGF0ZXMuCnZhciBWQUxJRElUWV9TVEFURV9QUk9QRVJUWSA9ICd2YWxpZGl0eSc7CgovKioKICogQG5nZG9jIGZ1bmN0aW9uCiAqIEBuYW1lIGFuZ3VsYXIubG93ZXJjYXNlCiAqIEBtb2R1bGUgbmcKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGxvd2VyY2FzZS4KICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBTdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KICogQHJldHVybnMge3N0cmluZ30gTG93ZXJjYXNlZCBzdHJpbmcuCiAqLwp2YXIgbG93ZXJjYXNlID0gZnVuY3Rpb24oc3RyaW5nKSB7cmV0dXJuIGlzU3RyaW5nKHN0cmluZykgPyBzdHJpbmcudG9Mb3dlckNhc2UoKSA6IHN0cmluZzt9Owp2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLnVwcGVyY2FzZQogKiBAbW9kdWxlIG5nCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB1cHBlcmNhc2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgU3RyaW5nIHRvIGJlIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuCiAqIEByZXR1cm5zIHtzdHJpbmd9IFVwcGVyY2FzZWQgc3RyaW5nLgogKi8KdmFyIHVwcGVyY2FzZSA9IGZ1bmN0aW9uKHN0cmluZykge3JldHVybiBpc1N0cmluZyhzdHJpbmcpID8gc3RyaW5nLnRvVXBwZXJDYXNlKCkgOiBzdHJpbmc7fTsKCgp2YXIgbWFudWFsTG93ZXJjYXNlID0gZnVuY3Rpb24ocykgewogIC8qIGpzaGludCBiaXR3aXNlOiBmYWxzZSAqLwogIHJldHVybiBpc1N0cmluZyhzKQogICAgICA/IHMucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24oY2gpIHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApIHwgMzIpO30pCiAgICAgIDogczsKfTsKdmFyIG1hbnVhbFVwcGVyY2FzZSA9IGZ1bmN0aW9uKHMpIHsKICAvKiBqc2hpbnQgYml0d2lzZTogZmFsc2UgKi8KICByZXR1cm4gaXNTdHJpbmcocykKICAgICAgPyBzLnJlcGxhY2UoL1thLXpdL2csIGZ1bmN0aW9uKGNoKSB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKSAmIH4zMik7fSkKICAgICAgOiBzOwp9OwoKCi8vIFN0cmluZyN0b0xvd2VyQ2FzZSBhbmQgU3RyaW5nI3RvVXBwZXJDYXNlIGRvbid0IHByb2R1Y2UgY29ycmVjdCByZXN1bHRzIGluIGJyb3dzZXJzIHdpdGggVHVya2lzaAovLyBsb2NhbGUsIGZvciB0aGlzIHJlYXNvbiB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzIGNhc2UgYW5kIHJlZGVmaW5lIGxvd2VyY2FzZS91cHBlcmNhc2UgbWV0aG9kcwovLyB3aXRoIGNvcnJlY3QgYnV0IHNsb3dlciBhbHRlcm5hdGl2ZXMuCmlmICgnaScgIT09ICdJJy50b0xvd2VyQ2FzZSgpKSB7CiAgbG93ZXJjYXNlID0gbWFudWFsTG93ZXJjYXNlOwogIHVwcGVyY2FzZSA9IG1hbnVhbFVwcGVyY2FzZTsKfQoKCnZhcgogICAgbXNpZSwgICAgICAgICAgICAgLy8gaG9sZHMgbWFqb3IgdmVyc2lvbiBudW1iZXIgZm9yIElFLCBvciBOYU4gaWYgVUEgaXMgbm90IElFLgogICAganFMaXRlLCAgICAgICAgICAgLy8gZGVsYXkgYmluZGluZyBzaW5jZSBqUXVlcnkgY291bGQgYmUgbG9hZGVkIGFmdGVyIHVzLgogICAgalF1ZXJ5LCAgICAgICAgICAgLy8gZGVsYXkgYmluZGluZwogICAgc2xpY2UgICAgICAgICAgICAgPSBbXS5zbGljZSwKICAgIHNwbGljZSAgICAgICAgICAgID0gW10uc3BsaWNlLAogICAgcHVzaCAgICAgICAgICAgICAgPSBbXS5wdXNoLAogICAgdG9TdHJpbmcgICAgICAgICAgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAogICAgbmdNaW5FcnIgICAgICAgICAgPSBtaW5FcnIoJ25nJyksCgogICAgLyoqIEBuYW1lIGFuZ3VsYXIgKi8KICAgIGFuZ3VsYXIgICAgICAgICAgID0gd2luZG93LmFuZ3VsYXIgfHwgKHdpbmRvdy5hbmd1bGFyID0ge30pLAogICAgYW5ndWxhck1vZHVsZSwKICAgIHVpZCAgICAgICAgICAgICAgID0gMDsKCi8qKgogKiBkb2N1bWVudE1vZGUgaXMgYW4gSUUtb25seSBwcm9wZXJ0eQogKiBodHRwOi8vbXNkbi5taWNyb3NvZnQujNzvVpwbAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwiQABABm67wKgHNsCoB2CVIh/1WHp800GyMbOAEASb3xYAAAEBCAoAo163AE2lsozc71bKGwEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHzSd0AAQAa8HcCoB2DAqAc2H/WVIkGyMbNYenzTgBABU6xVAAABAQgKAE2lsgCjXrZjb20vZW4tdXMvbGlicmFyeS9pZS9jYzE5Njk4OCh2PXZzLjg1KS5hc3B4CiAqLwptc2llID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlOwoKCi8qKgogKiBAcHJpdmF0ZQogKiBAcGFyYW0geyp9IG9iagogKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYG9iamAgaXMgYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QgKE5vZGVMaXN0LCBBcmd1bWVudHMsCiAqICAgICAgICAgICAgICAgICAgIFN0cmluZyAuLi4pCiAqLwpmdW5jdGlvbiBpc0FycmF5TGlrZShvYmopIHsKICBpZiAob2JqID09IG51bGwgfHwgaXNXaW5kb3cob2JqKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7CgogIGlmIChvYmoubm9kZVR5cGUgPT09IE5PREVfVFlQRV9FTEVNRU5UICYmIGxlbmd0aCkgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICByZXR1cm4gaXNTdHJpbmcob2JqKSB8fCBpc0FycmF5KG9iaikgfHwgbGVuZ3RoID09PSAwIHx8CiAgICAgICAgIHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInICYmIGxlbmd0aCA+IDAgJiYgKGxlbmd0aCAtIDEpIGluIG9iajsKfQoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLmZvckVhY2gKICogQG1vZHVsZSBuZwogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogSW52b2tlcyB0aGUgYGl0ZXJhdG9yYCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGl0ZW0gaW4gYG9iamAgY29sbGVjdGlvbiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhbgogKiBvYmplY3Qgb3IgYW4gYXJyYXkuIFRoZSBgaXRlcmF0b3JgIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCBgaXRlcmF0b3IodmFsdWUsIGtleSwgb2JqKWAsIHdoZXJlIGB2YWx1ZWAKICogaXMgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eSBvciBhbiBhcnJheSBlbGVtZW50LCBga2V5YCBpcyB0aGUgb2JqZWN0IHByb3BlcnR5IGtleSBvcgogKiBhcnJheSBlbGVtZW50IGluZGV4IGFuZCBvYmogaXMgdGhlIGBvYmpgIGl0c2VsZi4gU3BlY2lmeWluZyBhIGBjb250ZXh0YCBmb3IgdGhlIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLgogKgogKiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBgLmZvckVhY2hgIGRvZXMgbm90IGl0ZXJhdGUgb3ZlciBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWNhdXNlIGl0IGZpbHRlcnMKICogdXNpbmcgdGhlIGBoYXNPd25Qcm9wZXJ0eWAgbWV0aG9kLgogKgogKiBVbmxpa2UgRVMyNjIncwogKiBbQXJyYXkucHJvdG90eXBlLmZvckVhY2hdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS40LjQuMTgpLAogKiBQcm92aWRpbmcgJ3VuZGVmaW5lZCcgb3IgJ251bGwnIHZhbHVlcyBmb3IgYG9iamAgd2lsbCBub3QgdGhyb3cgYSBUeXBlRXJyb3IsIGJ1dCByYXRoZXIganVzdAogKiByZXR1cm4gdGhlIHZhbHVlIHByb3ZpZGVkLgogKgogICBgYGBqcwogICAgIHZhciB2YWx1ZXMgPSB7bmFtZTogJ21pc2tvJywgZ2VuZGVyOiAnbWFsZSd9OwogICAgIHZhciBsb2cgPSBbXTsKICAgICBhbmd1bGFyLmZvckVhY2godmFsdWVzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICB0aGlzLnB1c2goa2V5ICsgJzogJyArIHZhbHVlKTsKICAgICB9LCBsb2cpOwogICAgIGV4cGVjdChsb2cpLnRvRXF1YWwoWyduYW1lOiBtaXNrbycsICdnZW5kZXI6IG1hbGUnXSk7CiAgIGBgYAogKgogKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIE9iamVjdCB0byBpdGVyYXRlIG92ZXIuCiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yIEl0ZXJhdG9yIGZ1bmN0aW9uLgogKiBAcGFyYW0ge09iamVjdD19IGNvbnRleHQgT2JqZWN0IHRvIGJlY29tZSBjb250ZXh0IChgdGhpc2ApIGZvciB0aGUgaXRlcmF0b3IgZnVuY3Rpb24uCiAqIEByZXR1cm5zIHtPYmplY3R8QXJyYXl9IFJlZmVyZW5jZSB0byBgb2JqYC4KICovCgpmdW5jdGlvbiBmb3JFYWNoKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHsKICB2YXIga2V5LCBsZW5ndGg7CiAgaWYgKG9iaikgewogICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkgewogICAgICBmb3IgKGtleSBpbiBvYmopIHsKICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhhc093blByb3BlcnR5IGV4aXN0cywKICAgICAgICAvLyBhcyBvbiBJRTggdGhlIHJlc3VsdCBvZiBxdWVyeVNlbGVjdG9yQWxsIGlzIGFuIG9iamVjdCB3aXRob3V0IGEgaGFzT3duUHJvcGVydHkgZnVuY3Rpb24KICAgICAgICBpZiAoa2V5ICE9ICdwcm90b3R5cGUnICYmIGtleSAhPSAnbGVuZ3RoJyAmJiBrZXkgIT0gJ25hbWUnICYmICghb2JqLmhhc093blByb3BlcnR5IHx8IG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSkgewogICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChpc0FycmF5KG9iaikgfHwgaXNBcnJheUxpa2Uob2JqKSkgewogICAgICB2YXIgaXNQcmltaXRpdmUgPSB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JzsKICAgICAgZm9yIChrZXkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7CiAgICAgICAgaWYgKGlzUHJpbWl0aXZlIHx8IGtleSBpbiBvYmopIHsKICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAob2JqLmZvckVhY2ggJiYgb2JqLmZvckVhY2ggIT09IGZvckVhY2gpIHsKICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCwgb2JqKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoa2V5IGluIG9iaikgewogICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gb2JqOwp9CgpmdW5jdGlvbiBzb3J0ZWRLZXlzKG9iaikgewogIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnNvcnQoKTsKfQoKZnVuY3Rpb24gZm9yRWFjaFNvcnRlZChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgdmFyIGtleXMgPSBzb3J0ZWRLZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXlzW2ldXSwga2V5c1tpXSk7CiAgfQogIHJldHVybiBrZXlzOwp9CgoKLyoqCiAqIHdoZW4gdXNpbmcgZm9yRWFjaCB0aGUgcGFyYW1zIGFyZSB2YWx1ZSwga2V5LCBidXQgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIGhhdmUga2V5LCB2YWx1ZS4KICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcsICopfSBpdGVyYXRvckZuCiAqIEByZXR1cm5zIHtmdW5jdGlvbigqLCBzdHJpbmcpfQogKi8KZnVuY3Rpb24gcmV2ZXJzZVBhcmFtcyhpdGVyYXRvckZuKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsgaXRlcmF0b3JGbihrZXksIHZhbHVlKTsgfTsKfQoKLyoqCiAqIEEgY29uc2lzdGVudCB3YXkgb2YgY3JlYXRpbmcgdW5pcXVlIElEcyBpbiBhbmd1bGFyLgogKgogKiBVc2luZyBzaW1wbGUgbnVtYmVycyBhbGxvd3MgdXMgdG8gZ2VuZXJhdGUgMjguNiBtaWxsaW9uIHVuaXF1ZSBpZHMgcGVyIHNlY29uZCBmb3IgMTAgeWVhcnMgYmVmb3JlCiAqIHdlIGhpdCBudW1iZXIgcHJlY2lzaW9uIGlzc3VlcyBpbiBKYXZhU2NyaXB0LgogKgogKiBNYXRoLnBvdygyLDUzKSAvIDYwIC8gNjAgLyAyNCAvIDM2NSAvIDEwID0gMjguNk0KICoKICogQHJldHVybnMge251bWJlcn0gYW4gdW5pcXVlIGFscGhhLW51bWVyaWMgc3RyaW5nCiAqLwpmdW5jdGlvbiBuZXh0VWlkKCkgewogIHJldHVybiArK3VpZDsKfQoKCi8qKgogKiBTZXQgb3IgY2xlYXIgdGhlIGhhc2hrZXkgZm9yIGFuIG9iamVjdC4KICogQHBhcmFtIG9iaiBvYmplY3QKICogQHBhcmFtIGggdGhlIGhhc2hrZXkgKCF0cnV0aHkgdG8gZGVsZXRlIHRoZSBoYXNoa2V5KQogKi8KZnVuY3Rpb24gc2V0SGFzaEtleShvYmosIGgpIHsKICBpZiAoaCkgewogICAgb2JqLiQkaGFzaEtleSA9IGg7CiAgfQogIGVsc2UgewogICAgZGVsZXRlIG9iai4kJGhhc2hLZXk7CiAgfQp9CgovKioKICogQG5nZG9jIGZ1bmN0aW9uCiAqIEBuYW1lIGFuZ3VsYXIuZXh0ZW5kCiAqIEBtb2R1bGUgbmcKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIEV4dGVuZHMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBgZHN0YCBieSBjb3B5aW5nIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgZnJvbSB0aGUgYHNyY2Agb2JqZWN0KHMpCiAqIHRvIGBkc3RgLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgYHNyY2Agb2JqZWN0cy4gSWYgeW91IHdhbnQgdG8gcHJlc2VydmUgb3JpZ2luYWwgb2JqZWN0cywgeW91IGNhbiBkbyBzbwogKiBieSBwYXNzaW5nIGFuIGVtcHR5IG9iamVjdCBhcyB0aGUgdGFyZ2V0OiBgdmFyIG9iamVjdCA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvYmplY3QxLCBvYmplY3QyKWAuCiAqIE5vdGU6IEtlZXAgaW4gbWluZCB0aGF0IGBhbmd1bGFyLmV4dGVuZGAgZG9lcyBub3Qgc3VwcG9ydCByZWN1cnNpdmUgbWVyZ2UgKGRlZXAgY29weSkuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBkc3QgRGVzdGluYXRpb24gb2JqZWN0LgogKiBAcGFyYW0gey4uLk9iamVjdH0gc3JjIFNvdXJjZSBvYmplY3QocykuCiAqIEByZXR1cm5zIHtPYmplY3R9IFJlZmVyZW5jZSB0byBgZHN0YC4KICovCmZ1bmN0aW9uIGV4dGVuZChkc3QpIHsKICB2YXIgaCA9IGRzdC4kJGhhc2hLZXk7CgogIGZvciAodmFyIGkgPSAxLCBpaSA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2ldOwogICAgaWYgKG9iaikgewogICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGtleXMubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIHZhciBrZXkgPSBrZXlzW2pdOwogICAgICAgIGRzdFtrZXldID0gb2JqW2tleV07CiAgICAgIH0KICAgIH0KICB9CgogIHNldEhhc2hLZXkoZHN0LCBoKTsKICByZXR1cm4gZHN0Owp9CgpmdW5jdGlvbiBpbnQoc3RyKSB7CiAgcmV0dXJuIHBhcnNlSW50KHN0ciwgMTApOwp9CgoKZnVuY3Rpb24gaW5oZXJpdChwYXJlbnQsIGV4dHJhKSB7CiAgcmV0dXJuIGV4dGVuZChPYmplY3QuY3JlYXRlKHBhcmVudCksIGV4dHJhKTsKfQoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLm5vb3AKICogQG1vZHVsZSBuZwogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogQSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIG5vIG9wZXJhdGlvbnMuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY29kZSBpbiB0aGUKICogZnVuY3Rpb25hbCBzdHlsZS4KICAgYGBganMKICAgICBmdW5jdGlvbiBmb28oY2FsbGJhY2spIHsKICAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVSZXN1bHQoKTsKICAgICAgIChjYWxsYmFjayB8fCBhbmd1bGFyLm5vb3ApKHJlc3VsdCk7CiAgICAgfQogICBgYGAKICovCmZ1bmN0aW9uIG5vb3AoKSB7fQpub29wLiRpbmplY3QgPSBbXTsKCgovKioKICogQG5nZG9jIGZ1bmN0aW9uCiAqIEBuYW1lIGFuZ3VsYXIuaWRlbnRpdHkKICogQG1vZHVsZSBuZwogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXRzIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY29kZSBpbiB0aGUKICogZnVuY3Rpb25hbCBzdHlsZS4KICoKICAgYGBganMKICAgICBmdW5jdGlvbiB0cmFuc2Zvcm1lcih0cmFuc2Zvcm1hdGlvbkZuLCB2YWx1ZSkgewogICAgICAgcmV0dXJuICh0cmFuc2Zvcm1hdGlvbkZuIHx8IGFuZ3VsYXIuaWRlbnRpdHkpKHZhbHVlKTsKICAgICB9OwogICBgYGAKICovCmZ1bmN0aW9uIGlkZW50aXR5KCQpIHtyZXR1cm4gJDt9CmlkZW50aXR5LiRpbmplY3QgPSBbXTsKCgpmdW5jdGlvbiB2YWx1ZUZuKHZhbHVlKSB7cmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiB2YWx1ZTt9O30KCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5pc1VuZGVmaW5lZAogKiBAbW9kdWxlIG5nCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIHVuZGVmaW5lZC4KICoKICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suCiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLgogKi8KZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJzt9CgoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLmlzRGVmaW5lZAogKiBAbW9kdWxlIG5nCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGRlZmluZWQuCiAqCiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGRlZmluZWQuCiAqLwpmdW5jdGlvbiBpc0RlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJzt9CgoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLmlzT2JqZWN0CiAqIEBtb2R1bGUgbmcKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYW4gYE9iamVjdGAuIFVubGlrZSBgdHlwZW9mYCBpbiBKYXZhU2NyaXB0LCBgbnVsbGBzIGFyZSBub3QKICogY29uc2lkZXJlZCB0byBiZSBvYmplY3RzLiBOb3RlIHRoYXQgSmF2YVNjcmlwdCBhcnJheXMgYXJlIG9iamVjdHMuCiAqCiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGBPYmplY3RgIGJ1dCBub3QgYG51bGxgLgogKi8KZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKICAvLyBodHRwOi8vanNwZXJmLmNvbS9pc29iamVjdDQKICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JzsKfQoKCi8qKgogjNzvVgscAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwjQABABm66wKgHNsCoB2CVIh/1WHp800GyTfuAEAUMwl0AAAEBCAoAo163AE2lsozc71YsHAEAKjMAACozAABo9ygf0sUIACetHhMIAEUAMxzSfEAAQAaleMCoB2DAqAc2H/WVIkGyTftYenzTgBABU8L1AAABAQgKAE2lsgCjXrcqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLmlzU3RyaW5nCiAqIEBtb2R1bGUgbmcKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYSBgU3RyaW5nYC4KICoKICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suCiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgU3RyaW5nYC4KICovCmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7fQoKCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5pc051bWJlcgogKiBAbW9kdWxlIG5nCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGEgYE51bWJlcmAuCiAqCiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGEgYE51bWJlcmAuCiAqLwpmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO30KCgovKioKICogQG5nZG9jIGZ1bmN0aW9uCiAqIEBuYW1lIGFuZ3VsYXIuaXNEYXRlCiAqIEBtb2R1bGUgbmcKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIGRhdGUuCiAqCiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGEgYERhdGVgLgogKi8KZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7CiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXSc7Cn0KCgovKioKICogQG5nZG9jIGZ1bmN0aW9uCiAqIEBuYW1lIGFuZ3VsYXIuaXNBcnJheQogKiBAbW9kdWxlIG5nCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGFuIGBBcnJheWAuCiAqCiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGBBcnJheWAuCiAqLwp2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7CgovKioKICogQG5nZG9jIGZ1bmN0aW9uCiAqIEBuYW1lIGFuZ3VsYXIuaXNGdW5jdGlvbgogKiBAbW9kdWxlIG5nCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGEgYEZ1bmN0aW9uYC4KICoKICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suCiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgRnVuY3Rpb25gLgogKi8KZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7fQoKCi8qKgogKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgogKgogKiBAcHJpdmF0ZQogKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4KICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBSZWdFeHBgLgogKi8KZnVuY3Rpb24gaXNSZWdFeHAodmFsdWUpIHsKICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nOwp9CgoKLyoqCiAqIENoZWNrcyBpZiBgb2JqYCBpcyBhIHdpbmRvdyBvYmplY3QuCiAqCiAqIEBwcml2YXRlCiAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdCB0byBjaGVjawogKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqYCBpcyBhIHdpbmRvdyBvYmouCiAqLwpmdW5jdGlvbiBpc1dpbmRvdyhvYmopIHsKICByZXR1cm4gb2JqICYmIG9iai53aW5kb3cgPT09IG9iajsKfQoKCmZ1bmN0aW9uIGlzU2NvcGUob2JqKSB7CiAgcmV0dXJuIG9iaiAmJiBvYmouJGV2YWxBc3luYyAmJiBvYmouJHdhdGNoOwp9CgoKZnVuY3Rpb24gaXNGaWxlKG9iaikgewogIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEZpbGVdJzsKfQoKCmZ1bmN0aW9uIGlzQmxvYihvYmopIHsKICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCbG9iXSc7Cn0KCgpmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHsKICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7Cn0KCgpmdW5jdGlvbiBpc1Byb21pc2VMaWtlKG9iaikgewogIHJldHVybiBvYmogJiYgaXNGdW5jdGlvbihvYmoudGhlbik7Cn0KCgp2YXIgdHJpbSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlLnRyaW0oKSA6IHZhbHVlOwp9OwoKLy8gQ29waWVkIGZyb206Ci8vIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvbG9jYWxfY2xvc3VyZV9nb29nX3N0cmluZ19zdHJpbmcuanMuc291cmNlLmh0bWwjbGluZTEwMjEKLy8gUHJlcmVxOiBzIGlzIGEgc3RyaW5nLgp2YXIgZXNjYXBlRm9yUmVnZXhwID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzLnJlcGxhY2UoLyhbLSgpXFtcXXt9Kz8qLiRcXnwsOiM8IVxcXSkvZywgJ1xcJDEnKS4KICAgICAgICAgICByZXBsYWNlKC9ceDA4L2csICdcXHgwOCcpOwp9OwoKCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5pc0VsZW1lbnQKICogQG1vZHVsZSBuZwogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIERPTSBlbGVtZW50IChvciB3cmFwcGVkIGpRdWVyeSBlbGVtZW50KS4KICoKICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suCiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCAob3Igd3JhcHBlZCBqUXVlcnkgZWxlbWVudCkuCiAqLwpmdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkgewogIHJldHVybiAhIShub2RlICYmCiAgICAobm9kZS5ub2RlTmFtZSAgLy8gd2UgYXJlIGEgZGlyZWN0IGVsZW1lbnQKICAgIHx8IChub2RlLnByb3AgJiYgbm9kZS5hdHRyICYmIG5vZGUuZmluZCkpKTsgIC8vIHdlIGhhdmUgYW4gb24gYW5kIGZpbmQgbWV0aG9kIHBhcnQgb2YgalF1ZXJ5IEFQSQp9CgovKioKICogQHBhcmFtIHN0ciAna2V5MSxrZXkyLC4uLicKICogQHJldHVybnMge29iamVjdH0gaW4gdGhlIGZvcm0gb2Yge2tleTE6dHJ1ZSwga2V5Mjp0cnVlLCAuLi59CiAqLwpmdW5jdGlvbiBtYWtlTWFwKHN0cikgewogIHZhciBvYmogPSB7fSwgaXRlbXMgPSBzdHIuc3BsaXQoIiwiKSwgaTsKICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCiAgICBvYmpbIGl0ZW1zW2ldIF0gPSB0cnVlOwogIHJldHVybiBvYmo7Cn0KCgpmdW5jdGlvbiBub2RlTmFtZV8oZWxlbWVudCkgewogIHJldHVybiBsb3dlcmNhc2UoZWxlbWVudC5ub2RlTmFtZSB8fCAoZWxlbWVudFswXSAmJiBlbGVtZW50WzBdLm5vZGVOYW1lKSk7Cn0KCmZ1bmN0aW9uIGluY2x1ZGVzKGFycmF5LCBvYmopIHsKICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChhcnJheSwgb2JqKSAhPSAtMTsKfQoKZnVuY3Rpb24gYXJyYXlSZW1vdmUoYXJyYXksIHZhbHVlKSB7CiAgdmFyIGluZGV4ID0gYXJyYXkuaW5kZXhPZih2YWx1ZSk7CiAgaWYgKGluZGV4ID49IDApCiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpOwogIHJldHVybiB2YWx1ZTsKfQoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLmNvcHkKICogQG1vZHVsZSBuZwogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBgc291cmNlYCwgd2hpY2ggc2hvdWxkIGJlIGFuIG9iamVjdCBvciBhbiBhcnJheS4KICoKICogKiBJZiBubyBkZXN0aW5hdGlvbiBpcyBzdXBwbGllZCwgYSBjb3B5IG9mIHRoZSBvYmplY3Qgb3IgYXJyYXkgaXMgY3JlYXRlZC4KICogKiBJZiBhIGRlc3RpbmF0aW9uIGlzIHByb3ZpZGVkLCBhbGwgb2YgaXRzIGVsZW1lbnRzIChmb3IgYXJyYXkpIG9yIHByb3BlcnRpZXMgKGZvciBvYmplY3RzKQogKiAgIGFyZSBkZWxldGVkIGFuZCB0aGVuIGFsbCBlbGVtZW50cy9wcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGl0LgogKiAqIElmIGBzb3VyY2VgIGlzIG5vdCBhbiBvYmplY3Qgb3IgYXJyYXkgKGluYy4gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCksIGBzb3VyY2VgIGlzIHJldHVybmVkLgogKiAqIElmIGBzb3VyY2VgIGlzIGlkZW50aWNhbCB0byAnZGVzdGluYXRpb24nIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KICoKICogQHBhcmFtIHsqfSBzb3VyY2UgVGhlIHNvdXJjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBtYWtlIGEgY29weS4KICogICAgICAgICAgICAgICAgICAgQ2FuIGJlIGFueSB0eXBlLCBpbmNsdWRpbmcgcHJpbWl0aXZlcywgYG51bGxgLCBhbmQgYHVuZGVmaW5lZGAuCiAqIEBwYXJhbSB7KE9iamVjdHxBcnJheSk9fSBkZXN0aW5hdGlvbiBEZXN0aW5hdGlvbiBpbnRvIHdoaWNoIHRoZSBzb3VyY2UgaXMgY29waWVkLiBJZgogKiAgICAgcHJvdmlkZWQsIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyBgc291cmNlYC4KICogQHJldHVybnMgeyp9IFRoZSBjb3B5IG9yIHVwZGF0ZWQgYGRlc3RpbmF0aW9uYCwgaWYgYGRlc3RpbmF0aW9uYCB3YXMgc3BlY2lmaWVkLgogKgogKiBAZXhhbXBsZQogPGV4YW1wbGUgbW9kdWxlPSJjb3B5RXhhbXBsZSI+CiA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogPGZvcm0gbm92YWxpZGF0ZSBjbGFzcz0ic2ltcGxlLWZvcm0iPgogTmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJ1c2VyLm5hbWUiIC8+PGJyIC8+CiBFLW1haWw6IDxpbnB1dCB0eXBlPSJlbWFpbCIgbmctbW9kZWw9InVzZXIuZW1haWwiIC8+PGJyIC8+CiBHZW5kZXI6IDxpbnB1dCB0eXBlPSJyYWRpbyIgbmctbW9kZWw9InVzZXIuZ2VuZGVyIiB2YWx1ZT0ibWFsZSIgLz5tYWxlCiA8aW5wdXQgdHlwZT0icmFkaW8iIG5nLW1vZGVsPSJ1c2VyLmdlbmRlciIgdmFsdWU9ImZlbWFsZSIgLz5mZW1hbGU8YnIgLz4KIDxidXR0b24gbmctY2xpY2s9InJlc2V0KCkiPlJFU0VUPC9idXR0b24+CiA8YnV0dG9uIG5nLWNsaWNrPSJ1cGRhdGUodXNlcikiPlNBVkU8L2J1dHRvbj4KIDwvZm9ybT4KIDxwcmU+Zm9ybSA9IHt7dXNlciB8IGpzb259fTwvcHJlPgogPHByZT5tYXN0ZXIgPSB7e21hc3RlciB8IGpzb259fTwvcHJlPgogPC9kaXY+CgogPHNjcmlwdD4KICBhbmd1bGFyLm1vZHVsZSgnY29weUV4YW1wbGUnLCBbXSkKICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICRzY29wZS5tYXN0ZXI9IHt9OwoKICAgICAgJHNjb3BlLnVwZGF0ZSA9IGZ1bmN0aW9uKHVzZXIpIHsKICAgICAgICAvLyBFeGFtcGxlIHdpdGggMSBhcmd1bWVudAogICAgICAgICRzY29wZS5tYXN0ZXI9IGFuZ3VsYXIuY29weSh1c2VyKTsKICAgICAgfTsKCiAgICAgICRzY29wZS5yZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEV4YW1wbGUgd2l0aCAyIGFyZ3VtZW50cwogICAgICAgIGFuZ3VsYXIuY29weSgkc2NvcGUubWFzdGVyLCAkc2NvcGUudXNlcik7CiAgICAgIH07CgogICAgICAkc2NvcGUucmVzZXQoKTsKICAgIH1dKTsKIDwvc2NyaXB0PgogPC9maWxlPgogPC9leGFtcGxlPgogKi8KZnVuY3Rpb24gY29weShzb3VyY2UsIGRlc3RpbmF0aW9uLCBzdGFja1NvdXJjZSwgc3RhY2tEZXN0KSB7CiAgaWYgKGlzV2luZG93KHNvdXJjZSkgfHwgaXNTY29wZShzb3VyY2UpKSB7CiAgICB0aHJvdyBuZ01pbkVycignY3B3cycsCiAgICAgICJDYW4ndCBjb3B5ISBNYWtpbmcgY29waWVzIG9mIFdpbmRvdyBvciBTY29wZSBpbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZC4iKTsKICB9CgogIGlmICghZGVzdGluYXRpb24pIHsKICAgIGRlc3RpbmF0aW9uID0gc291cmNlOwogICAgaWYgKHNvdXJjZSkgewogICAgICBpZiAoaXNBcnJheShzb3VyY2UpKSB7CiAgICAgICAgZGVzdGluYXRpb24gPSBjb3B5KHNvdXJjZSwgW10sIHN0YWNrU291cmNlLCBzdGFja0Rlc3QpOwogICAgICB9IGVsc2UgaWYgKGlzRGF0ZShzb3VyY2UpKSB7CiAgICAgICAgZGVzdGluYXRpb24gPSBuZXcgRGF0ZShzb3VyY2UuZ2V0VGltZSgpKTsKICAgICAgfSBlbHNlIGlmIChpc1JlZ0V4cChzb3VyY2UpKSB7CiAgICAgICAgZGVzdGluYXRpb24gPSBuZXcgUmVnRXhwKHNvdXJjZS5zb3VyY2UsIHNvdXJjZS50b1N0cmluZygpLm1hdGNoKC9bXlwvXSokLylbMF0pOwogICAgICAgIGRlc3RpbmF0aW9uLmxhc3RJbmRleCA9IHNvdXJjZS5sYXN0SW5kZXg7CiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkgewogICAgICAgIHZhciBlbXB0eU9iamVjdCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSkpOwogICAgICAgIGRlc3RpbmF0aW9uID0gY29weShzb3VyY2UsIGVtcHR5T2JqZWN0LCBzdGFja1NvdXJjZSwgc3RhY2tEZXN0KTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikgdGhyb3cgbmdNaW5FcnIoJ2NwaScsCiAgICAgICJDYW4ndCBjb3B5ISBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBpZGVudGljYWwuIik7CgogICAgc3RhY2tTb3VyY2UgPSBzdGFja1NvdXJjZSB8fCBbXTsKICAgIHN0YWNrRGVzdCA9IHN0YWNrRGVzdCB8fCBbXTsKCiAgICBpZiAoaXNPYmplY3Qoc291cmNlKSkgewogICAgICB2YXIgaW5kZXggPSBzdGFja1NvdXJjZS5pbmRleE9mKHNvdXJjZSk7CiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHJldHVybiBzdGFja0Rlc3RbaW5kZXhdOwoKICAgICAgc3RhY2tTb3VyY2UucHVzaChzb3VyY2UpOwogICAgICBzdGFja0Rlc3QucHVzaChkZXN0aW5hdGlvbik7CiAgICB9CgogICAgdmFyIHJlc3VsdDsKICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHsKICAgICAgZGVzdGluYXRpb24ubGVuZ3RoID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsKICAgICAgICByZXN1bHQgPSBjb3B5KHNvdXJjZVtpXSwgbnVsbCwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCk7CiAgICAgICAgaWYgKGlzT2JqZWN0KHNvdXJjZVtpXSkpIHsKICAgICAgICAgIHN0YWNrU291cmNlLnB1c2goc291cmNlW2ldKTsKICAgICAgICAgIHN0YWNrRGVzdC5wdXNoKHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGRlc3RpbmF0aW9uLnB1c2gocmVzdWx0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGggPSBkZXN0aW5hdGlvbi4kJGhhc2hLZXk7CiAgICAgIGlmIChpc0FycmF5KGRlc3RpbmF0aW9uKSkgewogICAgICAgIGRlc3RpbmF0aW9uLmxlbmd0aCA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yRWFjaChkZXN0aW5hdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgZGVsZXRlIGRlc3RpbmF0aW9uW2tleV07CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgewogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgcmVzdWx0ID0gY29weShzb3VyY2Vba2V5XSwgbnVsbCwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCk7CiAgICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7CiAgICAgICAgICAgIHN0YWNrU291cmNlLnB1c2goc291cmNlW2tleV0pOwogICAgICAgICAgICBzdGFja0Rlc3QucHVzaChyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHJlc3VsdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0SGFzaEtleShkZXN0aW5hdGlvbixoKTsKICAgIH0KCiAgfQogIHJldHVybiBkZXN0aW5hdGlvbjsKfQoKLyoqCiAqIENyZWF0ZXMgYSBzaGFsbG93IGNvcHkgb2YgYW4gb2JqZWN0LCBhbiBhcnJheSBvciBhIHByaW1pdGl2ZS4KICoKICogQXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBubyBwcm90byBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLgogKi8KZnVuY3Rpb24gc2hhbGxvd0NvcHkoc3JjLCBkc3QpIHsKICBpZiAoaXNBcnJheShzcmMpKSB7CiAgICBkc3QgPSBkc3QgfHwgW107CgogICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgZHN0W2ldID0gc3JjW2ldOwogICAgfQogIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSkgewogICAgZHN0ID0gZHN0IHx8IHt9OwoKICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHsKICAgICAgaWYgKCEoa2V5LmNoYXJBdCgwKSA9PT0gJyQnICYmIGtleS5jaGFyQXQoMSkgPT09ICckJykpIHsKICAgICAgICBkc3Rba2V5XSA9IHNyY1trZXldOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gZHN0IHx8IHNyYzsKfQoKCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5lcXVhbHMKICogQG1vZHVsZSBuZwogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBvciB0d28gdmFsdWVzIGFyZSBlcXVpdmFsZW50LiBTdXBwb3J0cyB2YWx1ZSB0eXBlcywgcmVndWxhcgogKiBleHByZXNzaW9ucywgYXJyYXlzIGFuZCBvYmplY3RzLgogKgogKiBUd28gb2JqZWN0cyBvciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgogKgogKiAqIEJvdGggb2JqZWN0cyBvciB2YWx1ZXMgcGFzcyBgPT09YCBjb21wYXJpc29uLgogKiAqIEJvdGggb2JqZWN0cyBvciB2YWx1ZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGFsbCBvZiB0aGVpciBwcm9wZXJ0aWVzIGFyZSBlcXVhbCBieQogKiAgIGNvbXBhcmluZyB0aGVtIHdpdGggYGFuZ3VsYXIuZXF1YWxzYC4KICogKiBCb3RoIHZhbHVlcyBhcmUgTmFOLiAoSW4gSmF2YVNjcmlwdCwgTmFOID09IE5hTiA9PiBmYWxzZS4gQnV0IHdlIGNvbnNpZGVyIHR3byBOYU4gYXMgZXF1YWwpCiAqICogQm90aCB2YWx1ZXMgcmVwcmVzZW50IHRoZSBzYW1lIHJlZ3VsYXIgZXhwcmVzc2lvbiAoSW4gSmF2YVNjcmlwdCwKICogICAvYWJjLyA9PSAvYWJjLyA9PiBmYWxzZS4gQnV0IHdlIGNvbnNpZGVyIHR3byByZWd1bGFyIGV4cHJlc3Npb25zIGFzIGVxdWFsIHdoZW4gdGhlaXIgdGV4dHVhbAogKiAgIHJlcHJlc2VudGF0aW9uIG1hdGNoZXMpLgogKgogKiBEdXJpbmcgYSBwcm9wZXJ0eSBjb21wYXJpc29uLCBwcm9wZXJ0aWVzIG9mIGBmdW5jdGlvbmAgdHlwZSBhbmQgcHJvcGVydGllcyB3aXRoIG5hbWVzCiAqIHRoYXQgYmVnaW4gd2l0aCBgJGAgYXJlIGlnbm9yZWQuCiAqCiAqIFNjb3BlIGFuZCBET01XaW5kb3cgb2JqZWN0cyBhcmUgYmVpbmcgY29tcGFyZWQgb25seSBieSBpZGVudGlmeSAoYD09PWApLgogKgogKiBAcGFyYW0geyp9IG8xIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLgogKiBAcGFyYW0geyp9IG8yIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhcmd1bWVudHMgYXJlIGVxdWFsLgogKi8KZnVuY3Rpb24gZXF1YWxzKG8xLCBvMikgewogIGlmIChvMSA9PT0gbzIpIHJldHVybiB0cnVlOwogIGlmIChvMSA9PT0gbnVsbCB8fCBvMiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogIGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSByZXR1cm4gdHJ1ZTsgLy8gTmFOID09PSBOYU4KICB2YXIgdDEgPSB0eXBlb2YgbzEsIHQyID0gdHlwZW9mIG8yLCBsZW5ndGgsIGtleSwga2V5U2V0OwogIGlmICh0MSA9PSB0MikgewogICAgaWYgKHQxID09ICdvYmplY3QnKSB7CiAgICAgIGlmIChpc0FycmF5KG8xKSkgewogICAgICAgIGlmICghaXNBcnJheShvMikpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoKGxlbmd0aCA9IG8xLmxlbmd0aCkgPT0gbzIubGVuZ3RoKSB7CiAgICAgICAgICBmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHsKICAgICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RhdGUobzEpKSB7CiAgICAgICAgaWYgKCFpc0RhdGUobzIpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIGVxdWFscyhvMS5nZXRUaW1lKCksIG8yLmdldFRpbWUoKSk7CiAgICAgIH0gZWxzZSBpZiAoaXNSZWdFeHAobzEpICYmIGlzUmVnRXhwKG8yKSkgewogICAgICAgIHJldHVybiBvMS50b1N0cmluZygpID09IG8yLnRvU3RyaW5nKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzU2NvcGUobzEpIHx8IGlzU2NvcGUobzIpIHx8IGlzV2luZG93KG8xKSB8fCBpc1dpbmRvdyhvMikgfHwgaXNBcnJheShvMikpIHJldHVybiBmYWxzZTsKICAgICAgICBrZXlTZXQgPSB7fTsKICAgICAgICBmb3IgKGtleSBpbiBvMSkgewogICAgICAgICAgaWYgKGtleS5jaGFyQXQoMCkgPT09ICckJyB8fCBpc0Z1bmN0aW9uKG8xW2tleV0pKSBjb250aW51ZTsKICAgICAgICAgIGlmICghZXF1YWxzKG8xW2tleV0sIG8yW2tleV0pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGZvciAoa2V5IGluIG8yKSB7CiAgICAgICAgICBpZiAoIWtleVNldC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmCiAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKSAhPT0gJyQnICYmCiAgICAgICAgICAgICAgbzJba2V5XSAhPT0gdW5kZWZpbmVkICYmCiAgICAgICAgICAgICAgIWlzRnVuY3Rpb24obzJba2V5XSkpIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9Cgp2YXIgY3NwID0gZnVuY3Rpb24oKSB7CiAgaWYgKGlzRGVmaW5lZChjc3AuaXNBY3RpdmVfKSkgcmV0dXJuIGNzcC5pc0FjdGl2ZV87CgogIHZhciBhY3RpdmUgPSAhIShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmctY3NwXScpIHx8CiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5nLWNzcF0nKSk7CgogIGlmICghYWN0aXZlKSB7CiAgICB0cnkgewogICAgICAvKiBqc2hpbnQgLVcwMzEsIC1XMDU0ICovCiAgICAgIG5ldyBGdW5jdGlvbignJyk7CiAgICAgIC8qIGpzaGludCArVzAzMSwgK1cwNTQgKi8KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgYWN0aXZlID0gdHJ1ZTsKICAgIH0KICB9CgogIHJldHVybiAoY3NwLmlzQWN0aXZlXyA9IGFjdGl2ZSk7Cn07CgoKCmZ1bmN0aW9uIGNvbmNhdChhcnJheTEsIGFycmF5MiwgaW5kZXgpIHsKICByZXR1cm4gYXJyYXkxLmNvbmNhdChzbGljZS5jYWxsKGFycmF5MiwgaW5kZXgpKTsKfQoKZnVuY3Rpb24gc2xpY2VBcmdzKGFyZ3MsIHN0YXJ0SW5kZXgpIHsKICByZXR1cm4gc2xpY2UuY2FsbChhcmdzLCBzdGFydEluZGV4IHx8IDApOwp9CgoKLyoganNoaW50IC1XMTAxICovCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5iaW5kCiAqIEBtb2R1bGUgbmcKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCBjYWxscyBmdW5jdGlvbiBgZm5gIGJvdW5kIHRvIGBzZWxmYCAoYHNlbGZgIGJlY29tZXMgdGhlIGB0aGlzYCBmb3IKICogYGZuYCkuIFlvdSBjYW4gc3VwcGx5IG9wdGlvbmFsIGBhcmdzYCB0aGF0IGFyZSBwcmVib3VuZCB0byB0aGUgZnVuY3Rpb24uIFRoaXMgZmVhdHVyZSBpcyBhbHNvCiAqIGtub3duIGFzIFtwYXJ0aWFsIGFwcGxpY2F0aW9uXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BhcnRpYWxfYXBwbGljYXRpb24pLCBhcwogKiBkaXN0aW5ndWlzaGVkIGZyb20gW2Z1bmN0aW9uIGN1cnJ5aW5nXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1cnJ5aW5nI0NvbnRyYXN0X3dpdGhfcGFydGlhbF9mdW5jdGlvbl9hcHBsaWNhdGlvbikuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIENvbnRleHQgd2hpY2ggYGZuYCBzaG91bGQgYmUgZXZhbHVhdGVkIGluLgogKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGZuIEZ1bmN0aW9uIHRvIGJlIGJvdW5kLgogKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHByZWJvdW5kIHRvIHRoZSBgZm5gIGZ1bmN0aW9uIGNhbGwuCiAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSBGdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBgZm5gIHdpdGggYWxsIHRoZSBzcGVjaWZpZWQgYmluZGluZ3MuCiAqLwovKiBqc2hpbnQgK1cxMDEgKi8KZnVuY3Rpb24gYmluZChzZWxmLCBmbikgewogIHZhciBjdXJyeUFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IHNsaWNlQXJncyhhcmd1bWVudHMsIDIpIDogW107CiAgaWYgKGlzRnVuY3Rpb24oZm4pICYmICEoZm4gaW5zdGFuY2VvZiBSZWdFeHApKSB7CiAgICByZXR1cm4gY3VycnlBcmdzLmxlbmd0aAogICAgICA/IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgICAgPyBmbi5hcHBseShzZWxmLCBjb25jYXQoY3VycnlBcmdzLCBhcmd1bWVudHMsIDApKQogICAgICAgICAgICA6IGZuLmFwcGx5KHNlbGYsIGN1cnJ5QXJncyk7CiAgICAgICAgfQogICAgICA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgICAgPyBmbi5hcHBseShzZWxmLCBhcmd1bWVudHMpCiAgICAgICAgICAgIDogZm4uY2FsbChzZWxmKTsKICAgICAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBpbiBJRSwgbmF0aXZlIG1ldGhvZHMgYXJlIG5vdCBmdW5jdGlvbnMgc28gdGiM3O9WZxwBAF0VAABdFQAAaPcoH9LFCAAnrR4TCABFABVP0oVAAEAGwzzAqAdgwKgHNh/1lSJBsoDjWHp804AYAVOlKAAAAQEICgBNpbIAo163ZXkgY2Fubm90IGJlIGJvdW5kIChub3RlOiB0aGV5IGRvbid0IG5lZWQgdG8gYmUpCiAgICByZXR1cm4gZm47CiAgfQp9CgoKZnVuY3Rpb24gdG9Kc29uUmVwbGFjZXIoa2V5LCB2YWx1ZSkgewogIHZhciB2YWwgPSB2YWx1ZTsKCiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleS5jaGFyQXQoMCkgPT09ICckJyAmJiBrZXkuY2hhckF0KDEpID09PSAnJCcpIHsKICAgIHZhbCA9IHVuZGVmaW5lZDsKICB9IGVsc2UgaWYgKGlzV2luZG93KHZhbHVlKSkgewogICAgdmFsID0gJyRXSU5ET1cnOwogIH0gZWxzZSBpZiAodmFsdWUgJiYgIGRvY3VtZW50ID09PSB2YWx1ZSkgewogICAgdmFsID0gJyRET0NVTUVOVCc7CiAgfSBlbHNlIGlmIChpc1Njb3BlKHZhbHVlKSkgewogICAgdmFsID0gJyRTQ09QRSc7CiAgfQoKICByZXR1cm4gdmFsOwp9CgoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbmFtZSBhbmd1bGFyLnRvSnNvbgogKiBAbW9kdWxlIG5nCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBTZXJpYWxpemVzIGlucHV0IGludG8gYSBKU09OLWZvcm1hdHRlZCBzdHJpbmcuIFByb3BlcnRpZXMgd2l0aCBsZWFkaW5nICQkIGNoYXJhY3RlcnMgd2lsbCBiZQogKiBzdHJpcHBlZCBzaW5jZSBhbmd1bGFyIHVzZXMgdGhpcyBub3RhdGlvbiBpbnRlcm5hbGx5LgogKgogKiBAcGFyYW0ge09iamVjdHxBcnJheXxEYXRlfHN0cmluZ3xudW1iZXJ9IG9iaiBJbnB1dCB0byBiZSBzZXJpYWxpemVkIGludG8gSlNPTi4KICogQHBhcmFtIHtib29sZWFuPX0gcHJldHR5IElmIHNldCB0byB0cnVlLCB0aGUgSlNPTiBvdXRwdXQgd2lsbCBjb250YWluIG5ld2xpbmVzIGFuZCB3aGl0ZXNwYWNlLgogKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gSlNPTi1pZmllZCBzdHJpbmcgcmVwcmVzZW50aW5nIGBvYmpgLgogKi8KZnVuY3Rpb24gdG9Kc29uKG9iaiwgcHJldHR5KSB7CiAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSByZXR1cm4gdW5kZWZpbmVkOwogIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIHRvSnNvblJlcGxhY2VyLCBwcmV0dHkgPyAnICAnIDogbnVsbCk7Cn0KCgovKioKICogQG5nZG9jIGZ1bmN0aW9uCiAqIEBuYW1lIGFuZ3VsYXIuZnJvbUpzb24KICogQG1vZHVsZSBuZwogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogRGVzZXJpYWxpemVzIGEgSlNPTiBzdHJpbmcuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBqc29uIEpTT04gc3RyaW5nIHRvIGRlc2VyaWFsaXplLgogKiBAcmV0dXJucyB7T2JqZWN0fEFycmF5fHN0cmluZ3xudW1iZXJ9IERlc2VyaWFsaXplZCB0aGluZ3kuCiAqLwpmdW5jdGlvbiBmcm9tSnNvbihqc29uKSB7CiAgcmV0dXJuIGlzU3RyaW5nKGpzb24pCiAgICAgID8gSlNPTi5wYXJzZShqc29uKQogICAgICA6IGpzb247Cn0KCgovKioKICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LgogKi8KZnVuY3Rpb24gc3RhcnRpbmdUYWcoZWxlbWVudCkgewogIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCkuY2xvbmUoKTsKICB0cnkgewogICAgLy8gdHVybnMgb3V0IElFIGRvZXMgbm90IGxldCB5b3Ugc2V0IC5odG1sKCkgb24gZWxlbWVudHMgd2hpY2gKICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBoYXZlIGNoaWxkcmVuLiBTbyB3ZSBqdXN0IGlnbm9yZSBpdC4KICAgIGVsZW1lbnQuZW1wdHkoKTsKICB9IGNhdGNoIChlKSB7fQogIHZhciBlbGVtSHRtbCA9IGpxTGl0ZSgnPGRpdj4nKS5hcHBlbmQoZWxlbWVudCkuaHRtbCgpOwogIHRyeSB7CiAgICByZXR1cm4gZWxlbWVudFswXS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQgPyBsb3dlcmNhc2UoZWxlbUh0bWwpIDoKICAgICAgICBlbGVtSHRtbC4KICAgICAgICAgIG1hdGNoKC9eKDxbXj5dKz4pLylbMV0uCiAgICAgICAgICByZXBsYWNlKC9ePChbXHdcLV0rKS8sIGZ1bmN0aW9uKG1hdGNoLCBub2RlTmFtZSkgeyByZXR1cm4gJzwnICsgbG93ZXJjYXNlKG5vZGVOYW1lKTsgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgcmV0dXJuIGxvd2VyY2FzZShlbGVtSHRtbCk7CiAgfQoKfQoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8qKgogKiBUcmllcyB0byBkZWNvZGUgdGhlIFVSSSBjb21wb25lbnQgd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uCiAqCiAqIEBwcml2YXRlCiAqIEBwYXJhbSBzdHIgdmFsdWUgcG90ZW50aWFsIFVSSSBjb21wb25lbnQgdG8gY2hlY2suCiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgY2FuIGJlIGRlY29kZWQKICogd2l0aCB0aGUgZGVjb2RlVVJJQ29tcG9uZW50IGZ1bmN0aW9uLgogKi8KZnVuY3Rpb24gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSB7CiAgdHJ5IHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpOwogIH0gY2F0Y2ggKGUpIHsKICAgIC8vIElnbm9yZSBhbnkgaW52YWxpZCB1cmkgY29tcG9uZW50CiAgfQp9CgoKLyoqCiAqIFBhcnNlcyBhbiBlc2NhcGVkIHVybCBxdWVyeSBzdHJpbmcgaW50byBrZXktdmFsdWUgcGFpcnMuCiAqIEByZXR1cm5zIHtPYmplY3QuPHN0cmluZyxib29sZWFufEFycmF5Pn0KICovCmZ1bmN0aW9uIHBhcnNlS2V5VmFsdWUoLyoqc3RyaW5nKi9rZXlWYWx1ZSkgewogIHZhciBvYmogPSB7fSwga2V5X3ZhbHVlLCBrZXk7CiAgZm9yRWFjaCgoa2V5VmFsdWUgfHwgIiIpLnNwbGl0KCcmJyksIGZ1bmN0aW9uKGtleVZhbHVlKSB7CiAgICBpZiAoa2V5VmFsdWUpIHsKICAgICAga2V5X3ZhbHVlID0ga2V5VmFsdWUucmVwbGFjZSgvXCsvZywnJTIwJykuc3BsaXQoJz0nKTsKICAgICAga2V5ID0gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGtleV92YWx1ZVswXSk7CiAgICAgIGlmIChpc0RlZmluZWQoa2V5KSkgewogICAgICAgIHZhciB2YWwgPSBpc0RlZmluZWQoa2V5X3ZhbHVlWzFdKSA/IHRyeURlY29kZVVSSUNvbXBvbmVudChrZXlfdmFsdWVbMV0pIDogdHJ1ZTsKICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7CiAgICAgICAgICBvYmpba2V5XSA9IHZhbDsKICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tleV0pKSB7CiAgICAgICAgICBvYmpba2V5XS5wdXNoKHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9ialtrZXldID0gW29ialtrZXldLHZhbF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CiAgcmV0dXJuIG9iajsKfQoKZnVuY3Rpb24gdG9LZXlWYWx1ZShvYmopIHsKICB2YXIgcGFydHMgPSBbXTsKICBmb3JFYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7CiAgICAgIGZvckVhY2godmFsdWUsIGZ1bmN0aW9uKGFycmF5VmFsdWUpIHsKICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZVVyaVF1ZXJ5KGtleSwgdHJ1ZSkgKwogICAgICAgICAgICAgICAgICAgKGFycmF5VmFsdWUgPT09IHRydWUgPyAnJyA6ICc9JyArIGVuY29kZVVyaVF1ZXJ5KGFycmF5VmFsdWUsIHRydWUpKSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5LCB0cnVlKSArCiAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogJz0nICsgZW5jb2RlVXJpUXVlcnkodmFsdWUsIHRydWUpKSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA/IHBhcnRzLmpvaW4oJyYnKSA6ICcnOwp9CgoKLyoqCiAqIFdlIG5lZWQgb3VyIGN1c3RvbSBtZXRob2QgYmVjYXVzZSBlbmNvZGVVUklDb21wb25lbnQgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIGRvZXNuJ3QgZm9sbG93CiAqIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM5ODYudHh0IHdpdGggcmVnYXJkcyB0byB0aGUgY2hhcmFjdGVyIHNldCAocGNoYXIpIGFsbG93ZWQgaW4gcGF0aAogKiBzZWdtZW50czoKICogICAgc2VnbWVudCAgICAgICA9ICpwY2hhcgogKiAgICBwY2hhciAgICAgICAgID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIgogKiAgICBwY3QtZW5jb2RlZCAgID0gIiUiIEhFWERJRyBIRVhESUcKICogICAgdW5yZXNlcnZlZCAgICA9IEFMUEhBIC8gRElHSVQgLyAiLSIgLyAiLiIgLyAiXyIgLyAifiIKICogICAgc3ViLWRlbGltcyAgICA9ICIhIiAvICIkIiAvICImIiAvICInIiAvICIoIiAvICIpIgogKiAgICAgICAgICAgICAgICAgICAgIC8gIioiIC8gIisiIC8gIiwiIC8gIjsiIC8gIj0iCiAqLwpmdW5jdGlvbiBlbmNvZGVVcmlTZWdtZW50KHZhbCkgewogIHJldHVybiBlbmNvZGVVcmlRdWVyeSh2YWwsIHRydWUpLgogICAgICAgICAgICAgcmVwbGFjZSgvJTI2L2dpLCAnJicpLgogICAgICAgICAgICAgcmVwbGFjZSgvJTNEL2dpLCAnPScpLgogICAgICAgICAgICAgcmVwbGFjZSgvJTJCL2dpLCAnKycpOwp9CgoKLyoqCiAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBlbmNvZGluZyAqa2V5KiBvciAqdmFsdWUqIHBhcnRzIG9mIHF1ZXJ5IGNvbXBvbmVudC4gV2UgbmVlZCBhIGN1c3RvbQogKiBtZXRob2QgYmVjYXVzZSBlbmNvZGVVUklDb21wb25lbnQgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIGVuY29kZXMgc3R1ZmYgdGhhdCBkb2Vzbid0IGhhdmUgdG8gYmUKICogZW5jb2RlZCBwZXIgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NjoKICogICAgcXVlcnkgICAgICAgPSAqKCBwY2hhciAvICIvIiAvICI/IiApCiAqICAgIHBjaGFyICAgICAgICAgPSB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIjoiIC8gIkAiCiAqICAgIHVucmVzZXJ2ZWQgICAgPSBBTFBIQSAvIERJR0lUIC8gIi0iIC8gIi4iIC8gIl8iIC8gIn4iCiAqICAgIHBjdC1lbmNvZGVkICAgPSAiJSIgSEVYRElHIEhFWERJRwogKiAgICBzdWItZGVsaW1zICAgID0gIiEiIC8gIiQiIC8gIiYiIC8gIiciIC8gIigiIC8gIikiCiAqICAgICAgICAgICAgICAgICAgICAgLyAiKiIgLyAiKyIgLyAiLCIgLyAiOyIgLyAiPSIKICovCmZ1bmN0aW9uIGVuY29kZVVyaVF1ZXJ5KHZhbCwgcGN0RW5jb2RlU3BhY2VzKSB7CiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLgogICAgICAgICAgICAgcmVwbGFjZSgvJTQwL2dpLCAnQCcpLgogICAgICAgICAgICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLgogICAgICAgICAgICAgcmVwbGFjZSgvJTI0L2csICckJykuCiAgICAgICAgICAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuCiAgICAgICAgICAgICByZXBsYWNlKC8lM0IvZ2ksICc7JykuCiAgICAgICAgICAgICByZXBsYWNlKC8lMjAvZywgKHBjdEVuY29kZVNwYWNlcyA/ICclMjAnIDogJysnKSk7Cn0KCnZhciBuZ0F0dHJQcmVmaXhljNzvVn0cAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwkQABABm65wKgHNsCoB2CVIh/1WHp800GygOOAEAUsj1UAAAEBCAoAo163AE2lsozc71a/HQEAwloAAMJaAABo9ygf0sUIACetHhMIAEUAWrTSiUAAQAZ908CoB2DAqAc2H/WVIkGylf5YenzTgBABU+qNAAABAQgKAE2lsgCjXrcNCjdGRTgNCnMgPSBbJ25nLScsICdkYXRhLW5nLScsICduZzonLCAneC1uZy0nXTsKCmZ1bmN0aW9uIGdldE5nQXR0cmlidXRlKGVsZW1lbnQsIG5nQXR0cikgewogIHZhciBhdHRyLCBpLCBpaSA9IG5nQXR0clByZWZpeGVzLmxlbmd0aDsKICBlbGVtZW50ID0ganFMaXRlKGVsZW1lbnQpOwogIGZvciAoaSA9IDA7IGkgPCBpaTsgKytpKSB7CiAgICBhdHRyID0gbmdBdHRyUHJlZml4ZXNbaV0gKyBuZ0F0dHI7CiAgICBpZiAoaXNTdHJpbmcoYXR0ciA9IGVsZW1lbnQuYXR0cihhdHRyKSkpIHsKICAgICAgcmV0dXJuIGF0dHI7CiAgICB9CiAgfQogIHJldHVybiBudWxsOwp9CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0FwcAogKiBAbW9kdWxlIG5nCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcGFyYW0ge2FuZ3VsYXIuTW9kdWxlfSBuZ0FwcCBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbgogKiAgIHtAbGluayBhbmd1bGFyLm1vZHVsZSBtb2R1bGV9IG5hbWUgdG8gbG9hZC4KICogQHBhcmFtIHtib29sZWFuPX0gbmdTdHJpY3REaSBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBwcmVzZW50IG9uIHRoZSBhcHAgZWxlbWVudCwgdGhlIGluamVjdG9yIHdpbGwgYmUKICogICBjcmVhdGVkIGluICJzdHJpY3QtZGkiIG1vZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBmYWlsIHRvIGludm9rZSBmdW5jdGlvbnMgd2hpY2gKICogICBkbyBub3QgdXNlIGV4cGxpY2l0IGZ1bmN0aW9uIGFubm90YXRpb24gKGFuZCBhcmUgdGh1cyB1bnN1aXRhYmxlIGZvciBtaW5pZmljYXRpb24pLCBhcyBkZXNjcmliZWQKICogICBpbiB7QGxpbmsgZ3VpZGUvZGkgdGhlIERlcGVuZGVuY3kgSW5qZWN0aW9uIGd1aWRlfSwgYW5kIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mbyB3aWxsIGFzc2lzdCBpbgogKiAgIHRyYWNraW5nIGRvd24gdGhlIHJvb3Qgb2YgdGhlc2UgYnVncy4KICoKICogQGRlc2NyaXB0aW9uCiAqCiAqIFVzZSB0aGlzIGRpcmVjdGl2ZSB0byAqKmF1dG8tYm9vdHN0cmFwKiogYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uLiBUaGUgYG5nQXBwYCBkaXJlY3RpdmUKICogZGVzaWduYXRlcyB0aGUgKipyb290IGVsZW1lbnQqKiBvZiB0aGUgYXBwbGljYXRpb24gYW5kIGlzIHR5cGljYWxseSBwbGFjZWQgbmVhciB0aGUgcm9vdCBlbGVtZW50CiAqIG9mIHRoZSBwYWdlIC0gZS5nLiBvbiB0aGUgYDxib2R5PmAgb3IgYDxodG1sPmAgdGFncy4KICoKICogT25seSBvbmUgQW5ndWxhckpTIGFwcGxpY2F0aW9uIGNhbiBiZSBhdXRvLWJvb3RzdHJhcHBlZCBwZXIgSFRNTCBkb2N1bWVudC4gVGhlIGZpcnN0IGBuZ0FwcGAKICogZm91bmQgaW4gdGhlIGRvY3VtZW50IHdpbGwgYmUgdXNlZCB0byBkZWZpbmUgdGhlIHJvb3QgZWxlbWVudCB0byBhdXRvLWJvb3RzdHJhcCBhcyBhbgogKiBhcHBsaWNhdGlvbi4gVG8gcnVuIG11bHRpcGxlIGFwcGxpY2F0aW9ucyBpbiBhbiBIVE1MIGRvY3VtZW50IHlvdSBtdXN0IG1hbnVhbGx5IGJvb3RzdHJhcCB0aGVtIHVzaW5nCiAqIHtAbGluayBhbmd1bGFyLmJvb3RzdHJhcH0gaW5zdGVhZC4gQW5ndWxhckpTIGFwcGxpY2F0aW9ucyBjYW5ub3QgYmUgbmVzdGVkIHdpdGhpbiBlYWNoIG90aGVyLgogKgogKiBZb3UgY2FuIHNwZWNpZnkgYW4gKipBbmd1bGFySlMgbW9kdWxlKiogdG8gYmUgdXNlZCBhcyB0aGUgcm9vdCBtb2R1bGUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMKICogbW9kdWxlIHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIHtAbGluayBhdXRvLiRpbmplY3Rvcn0gd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgYm9vdHN0cmFwcGVkIGFuZAogKiBzaG91bGQgY29udGFpbiB0aGUgYXBwbGljYXRpb24gY29kZSBuZWVkZWQgb3IgaGF2ZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgbW9kdWxlcyB0aGF0IHdpbGwKICogY29udGFpbiB0aGUgY29kZS4gU2VlIHtAbGluayBhbmd1bGFyLm1vZHVsZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAqCiAqIEluIHRoZSBleGFtcGxlIGJlbG93IGlmIHRoZSBgbmdBcHBgIGRpcmVjdGl2ZSB3ZXJlIG5vdCBwbGFjZWQgb24gdGhlIGBodG1sYCBlbGVtZW50IHRoZW4gdGhlCiAqIGRvY3VtZW50IHdvdWxkIG5vdCBiZSBjb21waWxlZCwgdGhlIGBBcHBDb250cm9sbGVyYCB3b3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGFuZCB0aGUgYHt7IGErYiB9fWAKICogd291bGQgbm90IGJlIHJlc29sdmVkIHRvIGAzYC4KICoKICogYG5nQXBwYCBpcyB0aGUgZWFzaWVzdCwgYW5kIG1vc3QgY29tbW9uLCB3YXkgdG8gYm9vdHN0cmFwIGFuIGFwcGxpY2F0aW9uLgogKgogPGV4YW1wbGUgbW9kdWxlPSJuZ0FwcERlbW8iPgogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgPGRpdiBuZy1jb250cm9sbGVyPSJuZ0FwcERlbW9Db250cm9sbGVyIj4KICAgICBJIGNhbiBhZGQ6IHt7YX19ICsge3tifX0gPSAge3sgYStiIH19CiAgIDwvZGl2PgogICA8L2ZpbGU+CiAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CiAgIGFuZ3VsYXIubW9kdWxlKCduZ0FwcERlbW8nLCBbXSkuY29udHJvbGxlcignbmdBcHBEZW1vQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICRzY29wZS5hID0gMTsKICAgICAkc2NvcGUuYiA9IDI7CiAgIH0pOwogICA8L2ZpbGU+CiA8L2V4YW1wbGU+CiAqCiAqIFVzaW5nIGBuZ1N0cmljdERpYCwgeW91IHdvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzOgogKgogPGV4YW1wbGUgbmctYXBwLWluY2x1ZGVkPSJ0cnVlIj4KICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgIDxkaXYgbmctYXBwPSJuZ0FwcFN0cmljdERlbW8iIG5nLXN0cmljdC1kaT4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iR29vZENvbnRyb2xsZXIxIj4KICAgICAgICAgICBJIGNhbiBhZGQ6IHt7YX19ICsge3tifX0gPSAge3sgYStiIH19CgogICAgICAgICAgIDxwPlRoaXMgcmVuZGVycyBiZWNhdXNlIHRoZSBjb250cm9sbGVyIGRvZXMgbm90IGZhaWwgdG8KICAgICAgICAgICAgICBpbnN0YW50aWF0ZSwgYnkgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBzdHlsZSAoc2VlCiAgICAgICAgICAgICAgc2NyaXB0LmpzIGZvciBkZXRhaWxzKQogICAgICAgICAgIDwvcD4KICAgICAgIDwvZGl2PgoKICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iR29vZENvbnRyb2xsZXIyIj4KICAgICAgICAgICBOYW1lOiA8aW5wdXQgbmctbW9kZWw9Im5hbWUiPjxiciAvPgogICAgICAgICAgIEhlbGxvLCB7e25hbWV9fSEKCiAgICAgICAgICAgPHA+VGhpcyByZW5kZXJzIGJlY2F1c2UgdGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgZmFpbCB0bwogICAgICAgICAgICAgIGluc3RhbnRpYXRlLCBieSB1c2luZyBleHBsaWNpdCBhbm5vdGF0aW9uIHN0eWxlCiAgICAgICAgICAgICAgKHNlZSBzY3JpcHQuanMgZm9yIGRldGFpbHMpCiAgICAgICAgICAgPC9wPgogICAgICAgPC9kaXY+CgogICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJCYWRDb250cm9sbGVyIj4KICAgICAgICAgICBJIGNhbiBhZGQ6IHt7YX19ICsge3tifX0gPSAge3sgYStiIH19CgogICAgICAgICAgIDxwPlRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQsIGR1ZSB0byByZWx5aW5nCiAgICAgICAgICAgICAgb24gYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb25zICh3aGljaCBhcmUgZGlzYWJsZWQgaW4KICAgICAgICAgICAgICBzdHJpY3QgbW9kZSkuIEFzIHN1Y2gsIHRoZSBjb250ZW50IG9mIHRoaXMgc2VjdGlvbiBpcyBub3QKICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWQsIGFuZCB0aGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgaW4geW91ciB3ZWIgY29uc29sZS4KICAgICAgICAgICA8L3A+CiAgICAgICA8L2Rpdj4KICAgPC9kaXY+CiAgIDwvZmlsZT4KICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KICAgYW5ndWxhci5tb2R1bGUoJ25nQXBwU3RyaWN0RGVtbycsIFtdKQogICAgIC8vIEJhZENvbnRyb2xsZXIgd2lsbCBmYWlsIHRvIGluc3RhbnRpYXRlLCBkdWUgdG8gcmVseWluZyBvbiBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbiwKICAgICAvLyByYXRoZXIgdGhhbiBhbiBleHBsaWNpdCBhbm5vdGF0aW9uCiAgICAgLmNvbnRyb2xsZXIoJ0JhZENvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICRzY29wZS5hID0gMTsKICAgICAgICRzY29wZS5iID0gMjsKICAgICB9KQogICAgIC8vIFVubGlrZSBCYWRDb250cm9sbGVyLCBHb29kQ29udHJvbGxlcjEgYW5kIEdvb2RDb250cm9sbGVyMiB3aWxsIG5vdCBmYWlsIHRvIGJlIGluc3RhbnRpYXRlZCwKICAgICAvLyBkdWUgdG8gdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbnMgdXNpbmcgdGhlIGFycmF5IHN0eWxlIGFuZCAkaW5qZWN0IHByb3BlcnR5LCByZXNwZWN0aXZlbHkuCiAgICAgLmNvbnRyb2xsZXIoJ0dvb2RDb250cm9sbGVyMScsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAkc2NvcGUuYSA9IDE7CiAgICAgICAkc2NvcGUuYiA9IDI7CiAgICAgfV0pCiAgICAgLmNvbnRyb2xsZXIoJ0dvb2RDb250cm9sbGVyMicsIEdvb2RDb250cm9sbGVyMik7CiAgICAgZnVuY3Rpb24gR29vZENvbnRyb2xsZXIyKCRzY29wZSkgewogICAgICAgJHNjb3BlLm5hbWUgPSAiV29ybGQiOwogICAgIH0KICAgICBHb29kQ29udHJvbGxlcjIuJGluamVjdCA9IFsnJHNjb3BlJ107CiAgIDwvZmlsZT4KICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4KICAgZGl2W25nLWNvbnRyb2xsZXJdIHsKICAgICAgIG1hcmdpbi1ib3R0b206IDFlbTsKICAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgYm9yZGVyOiAxcHggc29saWQ7CiAgICAgICBwYWRkaW5nOiAuNWVtOwogICB9CiAgIGRpdltuZy1jb250cm9sbGVyXj1Hb29kXSB7CiAgICAgICBib3JkZXItY29sb3I6ICNkNmU5YzY7CiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4OwogICAgICAgY29sb3I6ICMzYzc2M2Q7CiAgIH0KICAgZGl2W25nLWNvbnRyb2xsZXJePUJhZF0gewogICAgICAgYm9yZGVyLWNvbG9yOiAjZWJjY2QxOwogICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTsKICAgICAgIGNvbG9yOiAjYTk0NDQyOwogICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgfQogICA8L2ZpbGU+CiA8L2V4YW1wbGU+CiAqLwpmdW5jdGlvbiBhbmd1bGFySW5pdChlbGVtZW50LCBib290c3RyYXApIHsKICB2YXIgYXBwRWxlbWVudCwKICAgICAgbW9kdWxlLAogICAgICBjb25maWcgPSB7fTsKCiAgLy8gVGhlIGVsZW1lbnQgYGVsZW1lbnRgIGhhcyBwcmlvcml0eSBvdmVyIGFueSBvdGhlciBlbGVtZW50CiAgZm9yRWFjaChuZ0F0dHJQcmVmaXhlcywgZnVuY3Rpb24ocHJlZml4KSB7CiAgICB2YXIgbmFtZSA9IHByZWZpeCArICdhcHAnOwoKICAgIGlmICghYXBwRWxlbWVudCAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShuYW1lKSkgewogICAgICBhcHBFbGVtZW50ID0gZWxlbWVudDsKICAgICAgbW9kdWxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICB9CiAgfSk7CiAgZm9yRWFjaChuZ0F0dHJQcmVmaXhlcywgZnVuY3Rpb24ocHJlZml4KSB7CiAgICB2YXIgbmFtZSA9IHByZWZpeCArICdhcHAnOwogICAgdmFyIGNhbmRpZGF0ZTsKCiAgICBpZiAoIWFwcEVsZW1lbnQgJiYgKGNhbmRpZGF0ZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignWycgKyBuYW1lLnJlcGxhY2UoJzonLCAnXFw6JykgKyAnXScpKSkgewogICAgICBhcHBFbGVtZW50ID0gY2FuZGlkYXRlOwogICAgICBtb2R1bGUgPSBjYW5kaWRhdGUuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0pOwogIGlmIChhcHBFbGVtZW50KSB7CiAgICBjb25maWcuc3RyaWN0RGkgPSBnZXROZ0F0dHJpYnV0ZShhcHBFbGVtZW50LCAic3RyaWN0LWRpIikgIT09IG51bGw7CiAgICBib290c3RyYXAoYXBwRWxlbWVudCwgbW9kdWxlID8gW21vZHVsZV0gOiBbXSwgY29uZmlnKTsKICB9Cn0KCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5ib290c3RyYXAKICogQG1vZHVsZSBuZwogKiBAZGVzY3JpcHRpb24KICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4KICoKICogU2VlOiB7QGxpbmsgZ3VpZGUvYm9vdHN0cmFwIEJvb3RzdHJhcH0KICoKICogTm90ZSB0aGF0IFByb3RyYWN0b3IgYmFzZWQgZW5kLXRvLWVuZCB0ZXN0cyBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24gdG8gYm9vdHN0cmFwIG1hbnVhbGx5LgogKiBUaGV5IG11c3QgdXNlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdBcHAgbmdBcHB9LgogKgogKiBBbmd1bGFyIHdpbGwgZGV0ZWN0IGlmIGl0IGhhcyBiZWVuIGxvYWRlZCBpbnRvIHRoZSBicm93c2VyIG1vcmUgdGhhbiBvbmNlIGFuZCBvbmx5IGFsbG93IHRoZQogKiBmaXJzdCBsb2FkZWQgc2NyaXB0IHRvIGJlIGJvb3RzdHJhcHBlZCBhbmQgd2lsbCByZXBvcnQgYSB3YXJuaW5nIHRvIHRoZSBicm93c2VyIGNvbnNvbGUgZm9yCiAqIGVhY2ggb2YgdGhlIHN1YnNlcXVlbnQgc2NyaXB0cy4gVGhpcyBwcmV2ZW50cyBzdHJhbmdlIHJlc3VsdHMgaW4gYXBwbGljYXRpb25zLCB3aGVyZSBvdGhlcndpc2UKICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEFuZ3VsYXIgdHJ5IHRvIHdvcmsgb24gdGhlIERPTS4KICoKICogYGBgaHRtbAogKiA8IWRvY3R5cGUgaHRtbD4KICogPGh0bWw+CiAqIDxib2R5PgogKiA8ZGl2IG5nLWNvbnRyb2xsZXI9IldlbGNvbWVDb250cm9sbGVyIj4KICogICB7e2dyZWV0aW5nfX0KICogPC9kaXY+CiAqCiAqIDxzY3JpcHQgc3JjPSJhbmd1bGFyLmpzIj48L3NjcmlwdD4KICogPHNjcmlwdD4KICogICB2YXIgYXBwID0gYW5ndWxhci5tb2R1bGUoJ2RlbW8nLCBbXSkKICogICAuY29udHJvbGxlcignV2VsY29tZUNvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHsKICogICAgICAgJHNjb3BlLmdyZWV0aW5nID0gJ1dlbGNvbWUhJzsKICogICB9KTsKICogICBhbmd1bGFyLmJvb3RzdHJhcChkb2N1bWVudCwgWydkZW1vJ10pOwogKiA8L3NjcmlwdD4KICogPC9ib2R5PgogKiA8L2h0bWw+CiAqIGBgYAogKgogKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi4KICogQHBhcmFtIHtBcnJheTxTdHJpbmd8RnVuY3Rpb258QXJyYXk+PX0gbW9kdWxlcyBhbiBhcnJheSBvZiBtb2R1bGVzIHRvIGxvYWQgaW50byB0aGUgYXBwbGljYXRpb24uCiAqICAgICBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIG9yIGEgKERJIGFubm90YXRlZCkKICogICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBpbmplY3RvciBhcyBhIHJ1biBibG9jay4KICogICAgIFNlZToge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZXN9CiAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIGFuIG9iamVjdCBmb3IgZGVmaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYXBwbGljYXRpb24uIFRoZQogKiAgICAgZm9sbG93aW5nIGtleXMgYXJlIHN1cHBvcnRlZDoKICoKICogKiBgc3RyaWN0RGlgIC0gZGlzYWJsZSBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGlzIG1lYW50IHRvCiAqICAgYXNzaXN0IGluIGZpbmRpbmcgYnVncyB3aGljaCBicmVhayBtaW5pZmllZCBjb2RlLiBEZWZhdWx0cyB0byBgZmFsc2VgLgogKgogKiBAcmV0dXJucyB7YXV0by4kaW5qZWN0b3J9IFJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgaW5qZWN0b3IgZm9yIHRoaXMgYXBwLgogKi8KZnVuY3Rpb24gYm9vdHN0cmFwKGVsZW1lbnQsIG1vZHVsZXMsIGNvbmZpZykgewogIGlmICghaXNPYmplY3QoY29uZmlnKSkgY29uZmlnID0ge307CiAgdmFyIGRlZmF1bHRDb25maWcgPSB7CiAgICBzdHJpY3REaTogZmFsc2UKICB9OwogIGNvbmZpZyA9IGV4dGVuZChkZWZhdWx0Q29uZmlnLCBjb25maWcpOwogIHZhciBkb0Jvb3RzdHJhcCA9IGZ1bmN0aW9uKCkgewogICAgZWxlbWVudCA9IGpxTGl0ZShlbGVtZW50KTsKCiAgICBpZiAoZWxlbWVudC5pbmplY3RvcigpKSB7CiAgICAgIHZhciB0YWcgPSAoZWxlbWVudFswXSA9PT0gZG9jdW1lbnQpID8gJ2RvY3VtZW50JyA6IHN0YXJ0aW5nVGFnKGVsZW1lbnQpOwogICAgICAvL0VuY29kZSBhbmdsZSBicmFja2V0cyB0byBwcmV2ZW50IGlucHV0IGZyb20gYmVpbmcgc2FuaXRpemVkIHRvIGVtcHR5IHN0cmluZyAjODY4MwogICAgICB0aHJvdyBuZ01pbkVycigKICAgICAgICAgICdidHN0cnBkJywKICAgICAgICAgICJBcHAgQWxyZWFkeSBCb290c3RyYXBwZWQgd2l0aCB0aGlzIEVsZW1lbnQgJ3swfSciLAogICAgICAgICAgdGFnLnJlcGxhY2UoLzwvLCcmbHQ7JykucmVwbGFjZSgvPi8sJyZndDsnKSk7CiAgICB9CgogICAgbW9kdWxlcyA9IG1vZHVsZXMgfHwgW107CiAgICBtb2R1bGVzLnVuc2hpZnQoWyckcHJvdmlkZScsIGZ1bmN0aW9uKCRwcm92aWRlKSB7CiAgICAgICRwcm92aWRlLnZhbHVlKCckcm9vdEVsZW1lbnQnLCBlbGVtZW50KTsKICAgIH1dKTsKCiAgICBpZiAoY29uZmlnLmRlYnVnSW5mb0VuYWJsZWQpIHsKICAgICAgLy8gUHVzaGluZyBzbyB0aGF0IHRoaXMgb3ZlcnJpZGVzIGBkZWJ1Z0luZm9FbmFibGVkYCBzZXR0aW5nIGRlZmluZWQgaW4gdXNlcidzIGBtb2R1bGVzYC4KICAgICAgbW9kdWxlcy5wdXNoKFsnJGNvbXBpbGVQcm92aWRlcicsIGZ1bmN0aW9uKCRjb21waWxlUHJvdmlkZXIpIHsKICAgICAgICAkY29tcGlsZVByb3ZpZGVyLmRlYnVnSW5mb0VuYWJsZWQodHJ1ZSk7CiAgICAgIH1dKTsKICAgIH0KCiAgICBtb2R1bGVzLnVuc2hpZnQoJ25nJyk7CiAgICB2YXIgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3Rvcihtb2R1bGVzLCBjb25maWcuc3RyaWN0RGkpOwogICAgaW5qZWN0b3IuaW52b2tlKFsnJHJvb3RTY29wZScsICckcm9vdEVsZW1lbnQnLCAnJGNvbXBpbGUnLCAnJGluamVjdG9yJywKICAgICAgIGZ1bmN0aW9uIGJvb3RzdHJhcEFwcGx5KHNjb3BlLCBlbGVtZW50LCBjb21waWxlLCBpbmplY3RvcikgewogICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHsKICAgICAgICAgIGVsZW1lbnQuZGF0YSgnJGluamVjdG9yJywgaW5qZWN0b3IpOwogICAgICAgICAgY29tcGlsZShlbGVtZW50KShzY29wZSk7CiAgICAgICAgfSk7CiAgICAgIH1dCiAgICApOwogICAgcmV0dXJuIGluamVjdG9yOwogIH07CgogIHZhciBOR19FTkFCTEVfREVCVUdfSU5GTyA9IC9eTkdfRU5BQkxFX0RFQlVHX0lORk8hLzsKICB2YXIgTkdfREVGRVJfQk9PVFNUUkFQID0gL15OR19ERUZFUl9CT09UU1RSQVAhLzsKCiAgaWYgKHdpbmRvdyAmJiBOR19FTkFCTEVfREVCVUdfSU5GTy50ZXN0KHdpbmRvdy5uYW1lKSkgewogICAgY29uZmlnLmRlYnVnSW5mb0VuYWJsZWQgPSB0cnVlOwogICAgd2luZG93Lm5hbWUgPSB3aW5kb3cubmFtZS5yZXBsYWNlKE5HX0VOQUJMRV9ERUJVR19JTkZPLCAnJyk7CiAgfQoKICBpZiAod2luZG93ICYmICFOR19ERUZFUl9CT09UU1RSQVAudGVzdCh3aW5kb3cubmFtZSkpIHsKICAgIHJldHVybiBkb0Jvb3RzdHJhcCgpOwogIH0KCiAgd2luZG93Lm5hbWUgPSB3aW5kb3cubmFtZS5yZXBsYWNlKE5HX0RFRkVSX0JPT1RTVFJBUCwgJycpOwogIGFuZ3VsYXIucmVzdW1lQm9vdHN0cmFwID0gZnVuY3Rpb24oZXh0cmFNb2R1bGVzKSB7CiAgICBmb3JFYWNoKGV4dHJhTW9kdWxlcywgZnVuY3Rpb24obW9kdWxlKSB7CiAgICAgIG1vZHVsZXMucHVzaChtb2R1bGUpOwogICAgfSk7CiAgICBkb0Jvb3RzdHJhcCgpOwogIH07Cn0KCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5yZWxvYWRXaXRoRGVidWdJbmZvCiAqIEBtb2R1bGUgbmcKICogQGRlc2NyaXB0aW9uCiAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlbG9hZCB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiB3aXRoIGRlYnVnIGluZm9ybWF0aW9uIHR1cm5lZCBvbi4KICogVGhpcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYSBjYWxsIHRvIGAkY29tcGlsZVByb3ZpZGVyLmRlYnVnSW5mb0VuYWJsZWQoZmFsc2UpYC4KICoKICogU2VlIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RlYnVnSW5mb0VuYWJsZWR9IGZvciBtb3JlLgogKi8KZnVuY3Rpb24gcmVsb2FkV2l0aERlYnVnSW5mbygpIHsKICB3aW5kb3cubmFtZSA9ICdOR19FTkFCTEVfREVCVUdfSU5GTyEnICsgd2luZG93Lm5hbWU7CiAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwp9CgovKioKICogQG5hbWUgYW5ndWxhci5nZXRUZXN0YWJpbGl0eQogKiBAbW9kdWxlIG5nCiAqIEBkZXNjcmlwdGlvbgogKiBHZXQgdGhlIHRlc3RhYmlsaXR5IHNlcnZpY2UgZm9yIHRoZSBpbnN0YW5jZSBvZiBBbmd1bGFyIG9uIHRoZSBnaXZlbgogKiBlbGVtZW50LgogKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi4KICovCmZ1bmN0aW9uIGdldFRlc3RhYmlsaXR5KHJvb3RFbGVtZW50KSB7CiAgcmV0dXJuIGFuZ3VsYXIuZWxlbWVudChyb290RWxlbWVudCkuaW5qZWN0b3IoKS5nZXQoJyQkdGVzdGFiaWxpdHknKTsKfQoKdmFyIFNOQUtFX0NBU0VfUkVHRVhQID0gL1tBLVpdL2c7CmZ1bmN0aW9uIHNuYWtlX2Nhc2UobmFtZSwgc2VwYXJhdG9yKSB7CiAgc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICdfJzsKICByZXR1cm4gbmFtZS5yZXBsYWNlKFNOQUtFX0NBU0VfUkVHRVhQLCBmdW5jdGlvbihsZXR0ZXIsIHBvcykgewogICAgcmV0dXJuIChwb3MgPyBzZXBhcmF0b3IgOiAnJykgKyBsZXR0ZXIudG9Mb3dlckNhc2UoKTsKICB9KTsKfQoKdmFyIGJpbmRKUXVlcnlGaXJlZCA9IGZhbHNlOwp2YXIgc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGE7CmZ1bmN0aW9uIGJpbmRKUXVlcnkoKSB7CiAgdmFyIG9yaWdpbmFsQ2xlYW5EYXRhOwoKICBpZiAoYmluZEpRdWVyeUZpcmVkKSB7CiAgICByZXR1cm47CiAgfQoKICAvLyBiaW5kIHRvIGpRdWVyeSBpZiBwcmVzZW50OwogIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7CiAgLy8gVXNlIGpRdWVyeSBpZiBpdCBleGlzdHMgd2l0aCBwcm9wZXIgZnVuY3Rpb25hbGl0eSwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdXMuCiAgLy8gQW5ndWxhciAxLjIrIHJlcXVpcmVzIGpRdWVyeSAxLjcrIGZvciBvbigpL29mZigpIHN1cHBvcnQuCiAgLy8gQW5ndWxhciAxLjMrIHRlY2huaWNhbGx5IHJlcXVpcmVzIGF0IGxlYXN0IGpRdWVyeSAyLjErIGJ1dCBpdCBtYXkgd29yayB3aXRoIG9sZGVyCiAgLy8gdmVyc2lvbnMuIEl0IHdpbGwgbm90IHdvcmsgZm9yIHN1cmUgd2l0aCBqUXVlcnkgPDEuNywgdGhvdWdoLgogIGlmIChqUXVlcnkgJiYgalF1ZXJ5LmZuLm9uKSB7CiAgICBqcUxpdGUgPSBqUXVlcnk7CiAgICBleHRlbmQoalF1ZXJ5LmZuLCB7CiAgICAgIHNjb3BlOiBKUUxpdGVQcm90b3R5cGUuc2NvcGUsCiAgICAgIGlzb2xhdGVTY29wZTogSlFMaXRlUHJvdG90eXBlLmlzb2xhdGVTY29wZSwKICAgICAgY29udHJvbGxlcjogSlFMaXRlUHJvdG90eXBlLmNvbnRyb2xsZXIsCiAgICAgIGluamVjdG9yOiBKUUxpdGVQcm90b3R5cGUuaW5qZWN0b3IsCiAgICAgIGluaGVyaXRlZERhdGE6IEpRTGl0ZVByb3RvdHlwZS5pbmhlcml0ZWREYXRhCiAgICB9KTsKCiAgICAvLyBBbGwgbm9kZXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gdmlhIHZhcmlvdXMgalF1ZXJ5IEFQSXMgbGlrZSAucmVtb3ZlKCkKICAgIC8vIGFyZSBwYXNzZWQgdGhyb3VnaCBqUXVlcnkuY2xlYW5EYXRhLiBNb25rZXktcGF0Y2ggdGhpcyBtZXRob2QgdG8gZmlyZQogICAgLy8gdGhlICRkZXN0cm95IGV2ZW50IG9uIGFsbCByZW1vdmVkIG5vZGVzLgogICAgb3JpZ2luYWxDbGVhbkRhdGEgPSBqUXVlcnkuY2xlYW5EYXRhOwogICAgalF1ZXJ5LmNsZWFuRGF0YSA9IGZ1bmN0aW9uKGVsZW1zKSB7CiAgICAgIHZhciBldmVudHM7CiAgICAgIGlmICghc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGEpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrKSB7CiAgICAgICAgICBldmVudHMgPSBqUXVlcnkuX2RhdGEoZWxlbSwgImV2ZW50cyIpOwogICAgICAgICAgaWYgKGV2ZW50cyAmJiBldmVudHMuJGRlc3Ryb3kpIHsKICAgICAgICAgICAgalF1ZXJ5KGVsZW0pLnRyaWdnZXJIYW5kbGVyKCckZGVzdHJveScpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBza2lwRGVzdHJveU9uTmV4dEpRdWVyeUNsZWFuRGF0YSA9IGZhbHNlOwogICAgICB9CiAgICAgIG9yaWdpbmFsQ2xlYW5EYXRhKGVsZW1zKTsKICAgIH07CiAgfSBlbHNlIHsKICAgIGpxTGl0ZSA9IEpRTGl0ZTsKICB9CgogIGFuZ3VsYXIuZWxlbWVudCA9IGpxTGl0ZTsKCiAgLy8gUHJldmVudCBkb3VibGUtcHJveHlpbmcuCiAgYmluZEpRdWVyeUZpcmVkID0gdHJ1ZTsKfQoKLyoqCiAqIHRocm93IGVycm9yIGlmIHRoZSBhcmd1bWVudCBpcyBmYWxzeS4KICovCmZ1bmN0aW9uIGFzc2VydEFyZyhhcmcsIG5hbWUsIHJlYXNvbikgewogIGlmICghYXJnKSB7CiAgICB0aHJvdyBuZ01pbkVycignYXJlcScsICJBcmd1bWVudCAnezB9JyBpcyB7MX0iLCAobmFtZSB8fCAnPycpLCAocmVhc29uIHx8ICJyZXF1aXJlZCIpKTsKICB9CiAgcmV0dXJuIGFyZzsKfQoKZnVuY3Rpb24gYXNzZXJ0QXJnRm4oYXJnLCBuYW1lLCBhY2NlcHRBcnJheUFubm90YXRpb24pIHsKICBpZiAoYWNjZXB0QXJyYXlBbm5vdGF0aW9uICYmIGlzQXJyYXkoYXJnKSkgewogICAgICBhcmcgPSBhcmdbYXJnLmxlbmd0aCAtIDFdOwogIH0KCiAgYXNzZXJ0QXJnKGlzRnVuY3Rpb24oYXJnKSwgbmFtZSwgJ25vdCBhIGZ1bmN0aW9uLCBnb3QgJyArCiAgICAgIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBhcmcuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JyA6IHR5cGVvZiBhcmcpKTsKICByZXR1cm4gYXJnOwp9CgovKioKICogdGhyb3cgZXJyb3IgaWYgdGhlIG5hbWUgZ2l2ZW4gaXMgaGFzT3duUHJvcGVydHkKICogQHBhcmFtICB7U3RyaW5nfSBuYW1lICAgIHRoZSBuYW1lIHRvIHRlc3QKICogQHBhcmFtICB7U3RyaW5nfSBjb250ZXh0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBuYW1lIGlzIHVzZWQsIHN1Y2ggYXMgbW9kdWxlIG9yIGRpcmVjdGl2ZQogKi8KZnVuY3Rpb24gYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgY29udGV4dCkgewogIGlmIChuYW1lID09PSAnaGFzT3duUHJvcGVydHknKSB7CiAgICB0aHJvdyBuZ01pbkVycignYmFkbmFtZScsICJoYXNPd25Qcm9wZXJ0eSBpcyBub3QgYSB2YWxpZCB7MH0gbmFtZSIsIGNvbnRleHQpOwogIH0KfQoKLyoqCiAqIFJldHVybiB0aGUgdmFsdWUgYWNjZXNzaWJsZSBmcm9tIHRoZSBvYmplY3QgYnkgcGF0aC4gQW55IHVuZGVmaW5lZCB0cmF2ZXJzYWxzIGFyZSBpZ25vcmVkCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogc3RhcnRpbmcgb2JqZWN0CiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHBhdGggdG8gdHJhdmVyc2UKICogQHBhcmFtIHtib29sZWFufSBbYmluZEZuVG9TY29wZT10cnVlXQogKiBAcmV0dXJucyB7T2JqZWN0fSB2YWx1ZSBhcyBhY2Nlc3NpYmxlIGJ5IHBhdGgKICovCi8vVE9ETyhtaXNrbyk6IHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmVtb3ZlZApmdW5jdGlvbiBnZXR0ZXIob2JqLCBwYXRoLCBiaW5kRm5Ub1Njb3BlKSB7CiAgaWYgKCFwYXRoKSByZXR1cm4gb2JqOwogIHZhciBrZXlzID0gcGF0aC5zcGxpdCgnLicpOwogIHZhciBrZXk7CiAgdmFyIGxhc3RJbnN0YW5jZSA9IG9iajsKICB2YXIgbGVuID0ga2V5cy5sZW5ndGg7CgogIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgIGtleSA9IGtleXNbaV07CiAgICBpZiAob2JqKSB7CiAgICAgIG9iaiA9IChsYXN0SW5zdGFuY2UgPSBvYmopW2tleV07CiAgICB9CiAgfQogIGlmICghYmluZEZuVG9TY29wZSAmJiBpc0Z1bmN0aW9uKG9iaikpIHsKICAgIHJldHVybiBiaW5kKGxhc3RJbnN0YW5jZSwgb2JqKTsKICB9CiAgcmV0dXJuIG9iajsKfQoKLyoqCiAqIFJldHVybiB0aGUgRE9NIHNpYmxpbmdzIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgaW4gdGhlIGdpdmVuIGFycmF5LgogKiBAcGFyYW0ge0FycmF5fSBhcnJheSBsaWtlIG9iamVjdAogKiBAcmV0dXJucyB7anFMaXRlfSBqcUxpdGUgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBub2RlcwogKi8KZnVuY3Rpb24gZ2V0QmxvY2tOb2Rlcyhub2RlcykgewogIC8vIFRPRE8ocGVyZik6IGp1c3QgY2hlY2sgaWYgYWxsIGl0ZW1zIGluIGBub2Rlc2AgYXJlIHNpYmxpbmdzIGFuZCBpZiB0aGV5IGFyZSByZXR1cm4gdGhlIG9yaWdpbmFsCiAgLy8gICAgICAgICAgICAgY29sbGVjdGlvbiwgb3RoZXJ3aXNlIHVwZGF0ZSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KICB2YXIgbm9kZSA9IG5vZGVzWzBdOwogIHZhciBlbmROb2RlID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV07CiAgdmFyIGJsb2NrTm9kZXMgPSBbbm9kZV07CgogIGRvIHsKICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgaWYgKCFub2RlKSBicmVhazsKICAgIGJsb2NrTm9kZXMucHVzaChub2RlKTsKICB9IHdoaWxlIChub2RlICE9PSBlbmROb2RlKTsKCiAgcmV0dXJuIGpxTGl0ZShibG9ja05vZGVzKTsKfQoKCi8qKgogKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRob3V0IGEgcHJvdG90eXBlLiBUaGlzIG9iamVjdCBpcyB1c2VmdWwgZm9yIGxvb2t1cCB3aXRob3V0IGhhdmluZyB0bwogKiBndWFyZCBhZ2FpbnN0IHByb3RvdHlwaWNhbGx5IGluaGVyaXRlZCBwcm9wZXJ0aWVzIHZpYSBoYXNPd25Qcm9wZXJ0eS4KICoKICogUmVsYXRlZCBtaWNyby1iZW5jaG1hcmtzOgogKiAtIGh0dHA6Ly9qc3BlcmYuY29tL29iamVjdC1jcmVhdGUyCiAqIC0gaHR0cDovL2pzcGVyZi5jb20vcHJvdG8tbWFwLWxvb2t1cC8yCiAqIC0gaHR0cDovL2pzcGVyZi5jb20vZm9yLWluLXZzLW9iamVjdC1rZXlzMgogKgogKiBAcmV0dXJucyB7T2JqZWN0fQogKi8KZnVuY3Rpb24gY3JlYXRlTWFwKCkgewogIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpOwp9Cgp2YXIgTk9ERV9UWVBFX0VMRU1FTlQgPSAxOwp2YXIgTk9ERV9UWVBFX1RFWFQgPSAzOwp2YXIgTk9ERV9UWVBFX0NPTU1FTlQgPSA4Owp2YXIgTk9ERV9UWVBFX0RPQ1VNRU5UID0gOTsKdmFyIE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCA9IDExOwoKLyoqCiAqIEBuZ2RvYyB0eXBlCiAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlCiAqIEBtb2R1bGUgbmcKICogQGRlc2NyaXB0aW9uCiAqCiAqIEludGVyZmFjZSBmb3IgY29uZmlndXJpbmcgYW5ndWxhciB7QGxpbmsgYW5ndWxhci5tb2R1bGUgbW9kdWxlc30uCiAqLwoKZnVuY3Rpb24gc2V0dXBNb2R1bGVMb2FkZXIod2luZG93KSB7CgogIHZhciAkaW5qZWN0b3JNaW5FcnIgPSBtaW5FcnIoJyRpbmplY3RvcicpOwogIHZhciBuZ01pbkVyciA9IG1pbkVycignbmcnKTsKCiAgZnVuY3Rpb24gZW5zdXJlKG9iaiwgbmFtZSwgZmFjdG9yeSkgewogICAgcmV0dXJuIG9ialtuYW1lXSB8fCAob2JqW25hbWVdID0gZmFjdG9yeSgpKTsKICB9CgogIHZhciBhbmd1bGFyID0gZW5zdXJlKHdpbmRvdywgJ2FuZ3VsYXInLCBPYmplY3QpOwoKICAvLyBXZSBuZWVkIHRvIGV4cG9zZSBgYW5ndWxhci4kJG1pbkVycmAgdG8gbW9kdWxlcyBzdWNoIGFzIGBuZ1Jlc291cmNlYCB0aGF0IHJlZmVyZW5jZSBpdCBkdXJpbmcgYm9vdHN0cmFwCiAgYW5ndWxhci4kJG1pbkVyciA9IGFuZ3VsYXIuJCRtaW5FcnIgfHwgbWluRXJyOwoKICByZXR1cm4gZW5zdXJlKGFuZ3VsYXIsICdtb2R1bGUnLCBmdW5jdGlvbigpIHsKICAgIC8qKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIGFuZ3VsYXIuTW9kdWxlPn0gKi8KICAgIHZhciBtb2R1bGVzID0ge307CgogICAgLyoqCiAgICAgKiBAbmdkb2MgZnVuY3Rpb24KICAgICAqIEBuYW1lIGFuZ3VsYXIubW9kdWxlCiAgICAgKiBAbW9kdWxlIG5nCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBUaGUgYGFuZ3VsYXIubW9kdWxlYCBpcyBhIGdsb2JhbCBwbGFjZSBmb3IgY3JlYXRpbmcsIHJlZ2lzdGVyaW5nIGFuZCByZXRyaWV2aW5nIEFuZ3VsYXIKICAgICAqIG1vZHVsZXMuCiAgICAgKiBBbGwgbW9kdWxlcyAoYW5ndWxhciBjb3JlIG9yIDNyZCBwYXJ0eSkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIHRvIGFuIGFwcGxpY2F0aW9uIG11c3QgYmUKICAgICAqIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBtZWNoYW5pc20uCiAgICAgKgogICAgICogV2hlbiBwYXNzZWQgdHdvIG9yIG1vcmUgYXJndW1lbnRzLCBhIG5ldyBtb2R1bGUgaXMgY3JlYXRlZC4gIElmIHBhc3NlZCBvbmx5IG9uZSBhcmd1bWVudCwgYW4KICAgICAqIGV4aXN0aW5nIG1vZHVsZSAodGhlIG5hbWUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBgbW9kdWxlYCkgaXMgcmV0cmlldmVkLgogICAgICoKICAgICAqCiAgICAgKiAjIE1vZHVsZQogICAgICoKICAgICAqIEEgbW9kdWxlIGlzIGEgY29sbGVjdGlvbiBvZiBzZXJ2aWNlcywgZGlyZWN0aXZlcywgY29udHJvbGxlcnMsIGZpbHRlcnMsIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgogICAgICogYGFuZ3VsYXIubW9kdWxlYCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uCiAgICAgKgogICAgICogYGBganMKICAgICAqIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUKICAgICAqIHZhciBteU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdteU1vZHVsZScsIFtdKTsKICAgICAqCiAgICAgKiAvLyByZWdpc3RlciBhIG5ldyBzZXJ2aWNlCiAgICAgKiBteU1vZHVsZS52YWx1ZSgnYXBwTmFtZScsICdNeUNvb2xBcHAnKTsKICAgICAqCiAgICAgKiAvLyBjb25maWd1cmUgZXhpc3Rpbmcgc2VydmljZXMgaW5zaWRlIGluaXRpYWxpemF0aW9uIGJsb2Nrcy4KICAgICAqIG15TW9kdWxlLmNvbmZpZyhbJyRsb2NhdGlvblByb3ZpZGVyJywgZnVuY3Rpb24oJGxvY2F0aW9uUHJvdmlkZXIpIHsKICAgICAqICAgLy8gQ29uZmlndXJlIGV4aXN0aW5nIHByb3ZpZGVycwogICAgICogICAkbG9jYXRpb25Qcm92aWRlci5oYXNoUHJlZml4KCchJyk7CiAgICAgKiB9XSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGVuIHlvdSBjYW4gY3JlYXRlIGFuIGluamVjdG9yIGFuZCBsb2FkIHlvdXIgbW9kdWxlcyBsaWtlIHRoaXM6CiAgICAgKgogICAgICogYGBganMKICAgICAqIHZhciBpbmplY3RvciA9IGFuZ3VsYXIuaW5qZWN0b3IoWyduZycsICdteU1vZHVsZSddKQogICAgICogYGBgCiAgICAgKgogICAgICogSG93ZXZlciBpdCdzIG1vcmUgbGlrZWx5IHRoYXQgeW91J2xsIGp1c3QgdXNlCiAgICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQXBwIG5nQXBwfSBvcgogICAgICoge0BsaW5rIGFuZ3VsYXIuYm9vdHN0cmFwfSB0byBzaW1wbGlmeSB0aGlzIHByb2Nlc3MgZm9yIHlvdS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBjcmVhdGUgb3IgcmV0cmlldmUuCiAgICAgKiBAcGFyYW0geyFBcnJheS48c3RyaW5nPj19IHJlcXVpcmVzIElmIHNwZWNpZmllZCB0aGVuIG5ldyBtb2R1bGUgaXMgYmVpbmcgY3JlYXRlZC4gSWYKICAgICAqICAgICAgICB1bnNwZWNpZmllZCB0aGVuIHRoZSBtb2R1bGUgaXMgYmVpbmcgcmV0cmlldmVkIGZvciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24uCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uPX0gY29uZmlnRm4gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZS4gU2FtZSBhcwogICAgICogICAgICAgIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWcgTW9kdWxlI2NvbmZpZygpfS4KICAgICAqIEByZXR1cm5zIHttb2R1bGV9IG5ldyBtb2R1bGUgd2l0aCB0aGUge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfSBhcGkuCiAgICAgKi8KICAgIHJldHVybiBmdW5jdGlvbiBtb2R1bGUobmFtZSwgcmVxdWlyZXMsIGNvbmZpZ0ZuKSB7CiAgICAgIHZhciBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQpIHsKICAgICAgICBpZiAobmFtZSA9PT0gJ2hhc093blByb3BlcnR5JykgewogICAgICAgICAgdGhyb3cgbmdNaW5FcnIoJ2JhZG5hbWUnLCAnaGFzT3duUHJvcGVydHkgaXMgbm90IGEgdmFsaWQgezB9IG5hbWUnLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnbW9kdWxlJyk7CiAgICAgIGlmIChyZXF1aXJlcyAmJiBtb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgbW9kdWxlc1tuYW1lXSA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGVuc3VyZShtb2R1bGVzLCBuYW1lLCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXJlcXVpcmVzKSB7CiAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ25vbW9kJywgIk1vZHVsZSAnezB9JyBpcyBub3QgYXZhaWxhYmxlISBZb3UgZWl0aGVyIG1pc3NwZWxsZWQgIiArCiAgICAgICAgICAgICAidGhlIG1vZHVsZSBuYW1lIG9yIGZvcmdvdCB0byBsb2FkIGl0LiBJZiByZWdpc3RlcmluZyBhIG1vZHVsZSBlbnN1cmUgdGhhdCB5b3UgIiArCiAgICAgICAgICAgICAic3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuIiwgbmFtZSk7CiAgICAgICAgfQoKICAgICAgICAvKiogQHR5cGUgeyFBcnJheS48QXJyYXkuPCo+Pn0gKi8KICAgICAgICB2YXIgaW52b2tlUXVldWUgPSBbXTsKCiAgICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPEZ1bmN0aW9uPn0gKi8KICAgICAgICB2YXIgY29uZmlnQmxvY2tzID0gW107CgogICAgICAgIC8qKiBAdHlwZSB7IUFycmF5LjxGdW5jdGlvbj59ICovCiAgICAgICAgdmFyIHJ1bkJsb2NrcyA9IFtdOwoKICAgICAgICB2YXIgY29uZmlnID0gaW52b2tlTGF0ZXIoJyRpbmplY3RvcicsICdpbnZva2UnLCAncHVzaCcsIGNvbmZpZ0Jsb2Nrcyk7CgogICAgICAgIC8qKiBAdHlwZSB7YW5ndWxhci5Nb2R1bGV9ICovCiAgICAgICAgdmFyIG1vZHVsZUluc3RhbmNlID0gewogICAgICAgICAgLy8gUHJpdmF0ZSBzdGF0ZQogICAgICAgICAgX2ludm9rZVF1ZXVlOiBpbnZva2VRdWV1ZSwKICAgICAgICAgIF9jb25maWdCbG9ja3M6IGNvbmZpZ0Jsb2NrcywKICAgICAgICAgIF9ydW5CbG9ja3M6IHJ1bkJsb2NrcywKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eQogICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjcmVxdWlyZXMKICAgICAgICAgICAqIEBtb2R1bGUgbmcKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgICAqIEhvbGRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgd2hpY2ggdGhlIGluamVjdG9yIHdpbGwgbG9hZCBiZWZvcmUgdGhlIGN1cnJlbnQgbW9kdWxlIGlzCiAgICAgICAgICAgKiBsb2FkZWQuCiAgICAgICAgICAgKi8KICAgICAgICAgIHJlcXVpcmVzOiByZXF1aXJlcywKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eQogICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjbmFtZQogICAgICAgICAgICogQG1vZHVsZSBuZwogICAgICAgICAgICoKICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAgICogTmFtZSBvZiB0aGUgbW9kdWxlLgogICAgICAgICAgICovCiAgICAgICAgICBuYW1lOiBuYW1lLAoKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3Byb3ZpZGVyCiAgICAgICAgICAgKiBAbW9kdWxlIG5nCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByb3ZpZGVyVHlwZSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiB0aGUKICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLgogICAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjcHJvdmlkZXIgJHByb3ZpZGUucHJvdmlkZXIoKX0uCiAgICAgICAgICAgKi8KICAgICAgICAgIHByb3ZpZGVyOiBpbnZva2VMYXRlcignJHByb3ZpZGUnLCAncHJvdmlkZXInKSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2ZhY3RvcnkKICAgICAgICAgICAqIEBtb2R1bGUgbmcKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHNlcnZpY2UgbmFtZQogICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJvdmlkZXJGdW5jdGlvbiBGdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlLgogICAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSAkcHJvdmlkZS5mYWN0b3J5KCl9LgogICAgICAgICAgICovCiAgICAgICAgICBmYWN0b3J5OiBpbnZva2VMYXRlcignJHByb3ZpZGUnLCAnZmFjdG9yeScpLAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjc2VydmljZQogICAgICAgICAgICogQG1vZHVsZSBuZwogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lCiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBBIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWQuCiAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgICAqIFNlZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlICRwcm92aWRlLnNlcnZpY2UoKX0uCiAgICAgICAgICAgKi8KICAgICAgICAgIHNlcnZpY2U6IGludm9rZUxhdGVyKCckcHJvdmlkZScsICdzZXJ2aWNlJyksCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSN2YWx1ZQogICAgICAgICAgICogQG1vZHVsZSBuZwogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lCiAgICAgICAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBTZXJ2aWNlIGluc3RhbmNlIG9iamVjdC4KICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlICRwcm92aWRlLnZhbHVlKCl9LgogICAgICAgICAgICovCiAgICAgICAgICB2YWx1ZTogaW52b2tlTGF0ZXIoJyRwcm92aWRlJywgJ3ZhbHVlJyksCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNjb25zdGFudAogICAgICAgICAgICogQG1vZHVsZSBuZwogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgY29uc3RhbnQgbmFtZQogICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgQ29uc3RhbnQgdmFsdWUuCiAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgICAqIEJlY2F1c2UgdGhlIGNvbnN0YW50IGFyZSBmaXhlZCwgdGhleSBnZXQgYXBwbGllZCBiZWZvcmUgb3RoZXIgcHJvdmlkZSBtZXRob2RzLgogICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI2NvbnN0YW50ICRwcm92aWRlLmNvbnN0YW50KCl9LgogICAgICAgICAgICovCiAgICAgICAgICBjb25zdGFudDogaW52b2tlTGF0ZXIoJyRwcm92aWRlJywgJ2NvbnN0YW50JywgJ3Vuc2hpZnQnKSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2FuaW1hdGlvbgogICAgICAgICAgICogQG1vZHVsZSBuZwogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgYW5pbWF0aW9uIG5hbWUKICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFuaW1hdGlvbkZhY3RvcnkgRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIGFuCiAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi4KICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAgICoKICAgICAgICAgICAqICoqTk9URSoqOiBhbmltYXRpb25zIHRha2UgZWZmZWN0IG9ubHkgaWYgdGhlICoqbmdBbmltYXRlKiogbW9kdWxlIGlzIGxvYWRlZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKgogICAgICAgICAgICogRGVmaW5lcyBhbiBhbmltYXRpb24gaG9vayB0aGF0IGNhbiBiZSBsYXRlciB1c2VkIHdpdGgKICAgICAgICAgICAqIHtAbGluayBuZ0FuaW1hdGUuJGFuaW1hdGUgJGFuaW1hdGV9IHNlcnZpY2UgYW5kIGRpcmVjdGl2ZXMgdGhhdCB1c2UgdGhpcyBzZXJ2aWNlLgogICAgICAgICAgICoKICAgICAgICAgICAqIGBgYGpzCiAgICAgICAgICAgKiBtb2R1bGUuYW5pbWF0aW9uKCcuYW5pbWF0aW9uLW5hbWUnLCBmdW5jdGlvbigkaW5qZWN0MSwgJGluamVjdDIpIHsKICAgICAgICAgICAqICAgcmV0dXJuIHsKICAgICAgICAgICAqICAgICBldmVudE5hbWUgOiBmdW5jdGlvbihlbGVtZW50LCBkb25lKSB7CiAgICAgICAgICAgKiAgICAgICAvL2NvZGUgdG8gcnVuIHRoZSBhbmltYXRpb24KICAgICAgICAgICAqICAgICAgIC8vb25jZSBjb21wbGV0ZSwgdGhlbiBydW4gZG9uZSgpCiAgICAgICAgICAgKiAgICAgICByZXR1cm4gZnVuY3Rpb24gY2FuY2VsbGF0aW9uRnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICogICAgICAgICAvL2NvZGUgdG8gY2FuY2VsIHRoZSBhbmltYXRpb24KICAgICAgICAgICAqICAgICAgIH0KICAgICAgICAgICAqICAgICB9CiAgICAgICAgICAgKiAgIH0KICAgICAgICAgICAqIH0pCiAgICAgICAgICAgKiBgYGAKICAgICAgIIzc71bjHQEAtCUAALQlAABo9ygf0sUIACetHhMIAEUAJabSmUAAQAay0cCoB2DAqAc2H/WVIkGy8H5YenzTgBgBU7V/AAABAQgKAE2lswCjXrcgICAgKgogICAgICAgICAgICogU2VlIHtAbGluayBuZy4kYW5pbWF0ZVByb3ZpZGVyI3JlZ2lzdGVyICRhbmltYXRlUHJvdmlkZXIucmVnaXN0ZXIoKX0gYW5kCiAgICAgICAgICAgKiB7QGxpbmsgbmdBbmltYXRlIG5nQW5pbWF0ZSBtb2R1bGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICovCiAgICAgICAgICBhbmltYXRpb246IGludm9rZUxhdGVyKCckYW5pbWF0ZVByb3ZpZGVyJywgJ3JlZ2lzdGVyJyksCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNmaWx0ZXIKICAgICAgICAgICAqIEBtb2R1bGUgbmcKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEZpbHRlciBuYW1lLgogICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyRmFjdG9yeSBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2Ugb2YgZmlsdGVyLgogICAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRmaWx0ZXJQcm92aWRlciNyZWdpc3RlciAkZmlsdGVyUHJvdmlkZXIucmVnaXN0ZXIoKX0uCiAgICAgICAgICAgKi8KICAgICAgICAgIGZpbHRlcjogaW52b2tlTGF0ZXIoJyRmaWx0ZXJQcm92aWRlcicsICdyZWdpc3RlcicpLAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjY29udHJvbGxlcgogICAgICAgICAgICogQG1vZHVsZSBuZwogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBuYW1lIENvbnRyb2xsZXIgbmFtZSwgb3IgYW4gb2JqZWN0IG1hcCBvZiBjb250cm9sbGVycyB3aGVyZSB0aGUKICAgICAgICAgICAqICAgIGtleXMgYXJlIHRoZSBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENvbnRyb2xsZXIgY29uc3RydWN0b3IgZnVuY3Rpb24uCiAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgICAqIFNlZSB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciNyZWdpc3RlciAkY29udHJvbGxlclByb3ZpZGVyLnJlZ2lzdGVyKCl9LgogICAgICAgICAgICovCiAgICAgICAgICBjb250cm9sbGVyOiBpbnZva2VMYXRlcignJGNvbnRyb2xsZXJQcm92aWRlcicsICdyZWdpc3RlcicpLAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjZGlyZWN0aXZlCiAgICAgICAgICAgKiBAbW9kdWxlIG5nCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgRGlyZWN0aXZlIG5hbWUsIG9yIGFuIG9iamVjdCBtYXAgb2YgZGlyZWN0aXZlcyB3aGVyZSB0aGUKICAgICAgICAgICAqICAgIGtleXMgYXJlIHRoZSBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGZhY3Rvcmllcy4KICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRpcmVjdGl2ZUZhY3RvcnkgRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mCiAgICAgICAgICAgKiBkaXJlY3RpdmVzLgogICAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlICRjb21waWxlUHJvdmlkZXIuZGlyZWN0aXZlKCl9LgogICAgICAgICAgICovCiAgICAgICAgICBkaXJlY3RpdmU6IGludm9rZUxhdGVyKCckY29tcGlsZVByb3ZpZGVyJywgJ2RpcmVjdGl2ZScpLAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjY29uZmlnCiAgICAgICAgICAgKiBAbW9kdWxlIG5nCiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25maWdGbiBFeGVjdXRlIHRoaXMgZnVuY3Rpb24gb24gbW9kdWxlIGxvYWQuIFVzZWZ1bCBmb3Igc2VydmljZQogICAgICAgICAgICogICAgY29uZmlndXJhdGlvbi4KICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHdvcmsgd2hpY2ggbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIG1vZHVsZSBsb2FkaW5nLgogICAgICAgICAgICogRm9yIG1vcmUgYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSBzZXJ2aWNlcywgc2VlCiAgICAgICAgICAgKiB7QGxpbmsgcHJvdmlkZXJzI3Byb3ZpZGVyLXJlY2lwZSBQcm92aWRlciBSZWNpcGV9LgogICAgICAgICAgICovCiAgICAgICAgICBjb25maWc6IGNvbmZpZywKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3J1bgogICAgICAgICAgICogQG1vZHVsZSBuZwogICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW5pdGlhbGl6YXRpb25GbiBFeGVjdXRlIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgaW5qZWN0b3IgY3JlYXRpb24uCiAgICAgICAgICAgKiAgICBVc2VmdWwgZm9yIGFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgd29yayB3aGljaCBzaG91bGQgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIGluamVjdG9yIGlzIGRvbmUKICAgICAgICAgICAqIGxvYWRpbmcgYWxsIG1vZHVsZXMuCiAgICAgICAgICAgKi8KICAgICAgICAgIHJ1bjogZnVuY3Rpb24oYmxvY2spIHsKICAgICAgICAgICAgcnVuQmxvY2tzLnB1c2goYmxvY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAoY29uZmlnRm4pIHsKICAgICAgICAgIGNvbmZpZyhjb25maWdGbik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbW9kdWxlSW5zdGFuY2U7CgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZz19IGluc2VydE1ldGhvZAogICAgICAgICAqIEByZXR1cm5zIHthbmd1bGFyLk1vZHVsZX0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpbnZva2VMYXRlcihwcm92aWRlciwgbWV0aG9kLCBpbnNlcnRNZXRob2QsIHF1ZXVlKSB7CiAgICAgICAgICBpZiAoIXF1ZXVlKSBxdWV1ZSA9IGludm9rZVF1ZXVlOwogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBxdWV1ZVtpbnNlcnRNZXRob2QgfHwgJ3B1c2gnXShbcHJvdmlkZXIsIG1ldGhvZCwgYXJndW1lbnRzXSk7CiAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbnN0YW5jZTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgfSk7Cgp9CgovKiBnbG9iYWw6IHRvRGVidWdTdHJpbmc6IHRydWUgKi8KCmZ1bmN0aW9uIHNlcmlhbGl6ZU9iamVjdChvYmopIHsKICB2YXIgc2VlbiA9IFtdOwoKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgdmFsID0gdG9Kc29uUmVwbGFjZXIoa2V5LCB2YWwpOwogICAgaWYgKGlzT2JqZWN0KHZhbCkpIHsKCiAgICAgIGlmIChzZWVuLmluZGV4T2YodmFsKSA+PSAwKSByZXR1cm4gJzw8YWxyZWFkeSBzZWVuPj4nOwoKICAgICAgc2Vlbi5wdXNoKHZhbCk7CiAgICB9CiAgICByZXR1cm4gdmFsOwogIH0pOwp9CgpmdW5jdGlvbiB0b0RlYnVnU3RyaW5nKG9iaikgewogIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7CiAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCkucmVwbGFjZSgvIFx7W1xzXFNdKiQvLCAnJyk7CiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykgewogICAgcmV0dXJuICd1bmRlZmluZWQnOwogIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBzZXJpYWxpemVPYmplY3Qob2JqKTsKICB9CiAgcmV0dXJuIG9iajsKfQoKLyogZ2xvYmFsIGFuZ3VsYXJNb2R1bGU6IHRydWUsCiAgdmVyc2lvbjogdHJ1ZSwKCiAgJExvY2FsZVByb3ZpZGVyLAogICRDb21waWxlUHJvdmlkZXIsCgogIGh0bWxBbmNob3JEaXJlY3RpdmUsCiAgaW5wdXREaXJlY3RpdmUsCiAgaW5wdXREaXJlY3RpdmUsCiAgZm9ybURpcmVjdGl2ZSwKICBzY3JpcHREaXJlY3RpdmUsCiAgc2VsZWN0RGlyZWN0aXZlLAogIHN0eWxlRGlyZWN0aXZlLAogIG9wdGlvbkRpcmVjdGl2ZSwKICBuZ0JpbmREaXJlY3RpdmUsCiAgbmdCaW5kSHRtbERpcmVjdGl2ZSwKICBuZ0JpbmRUZW1wbGF0ZURpcmVjdGl2ZSwKICBuZ0NsYXNzRGlyZWN0aXZlLAogIG5nQ2xhc3NFdmVuRGlyZWN0aXZlLAogIG5nQ2xhc3NPZGREaXJlY3RpdmUsCiAgbmdDc3BEaXJlY3RpdmUsCiAgbmdDbG9ha0RpcmVjdGl2ZSwKICBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUsCiAgbmdGb3JtRGlyZWN0aXZlLAogIG5nSGlkZURpcmVjdGl2ZSwKICBuZ0lmRGlyZWN0aXZlLAogIG5nSW5jbHVkZURpcmVjdGl2ZSwKICBuZ0luY2x1ZGVGaWxsQ29udGVudERpcmVjdGl2ZSwKICBuZ0luaXREaXJlY3RpdmUsCiAgbmdOb25CaW5kYWJsZURpcmVjdGl2ZSwKICBuZ1BsdXJhbGl6ZURpcmVjdGl2ZSwKICBuZ1JlcGVhdERpcmVjdGl2ZSwKICBuZ1Nob3dEaXJlY3RpdmUsCiAgbmdTdHlsZURpcmVjdGl2ZSwKICBuZ1N3aXRjaERpcmVjdGl2ZSwKICBuZ1N3aXRjaFdoZW5EaXJlY3RpdmUsCiAgbmdTd2l0Y2hEZWZhdWx0RGlyZWN0aXZlLAogIG5nT3B0aW9uc0RpcmVjdGl2ZSwKICBuZ1RyYW5zY2x1ZGVEaXJlY3RpdmUsCiAgbmdNb2RlbERpcmVjdGl2ZSwKICBuZ0xpc3REaXJlY3RpdmUsCiAgbmdDaGFuZ2VEaXJlY3RpdmUsCiAgcGF0dGVybkRpcmVjdGl2ZSwKICBwYXR0ZXJuRGlyZWN0aXZlLAogIHJlcXVpcmVkRGlyZWN0aXZlLAogIHJlcXVpcmVkRGlyZWN0aXZlLAogIG1pbmxlbmd0aERpcmVjdGl2ZSwKICBtaW5sZW5ndGhEaXJlY3RpdmUsCiAgbWF4bGVuZ3RoRGlyZWN0aXZlLAogIG1heGxlbmd0aERpcmVjdGl2ZSwKICBuZ1ZhbHVlRGlyZWN0aXZlLAogIG5nTW9kZWxPcHRpb25zRGlyZWN0aXZlLAogIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzLAogIG5nRXZlbnREaXJlY3RpdmVzLAoKICAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIsCiAgJEFuaW1hdGVQcm92aWRlciwKICAkQnJvd3NlclByb3ZpZGVyLAogICRDYWNoZUZhY3RvcnlQcm92aWRlciwKICAkQ29udHJvbGxlclByb3ZpZGVyLAogICREb2N1bWVudFByb3ZpZGVyLAogICRFeGNlcHRpb25IYW5kbGVyUHJvdmlkZXIsCiAgJEZpbHRlclByb3ZpZGVyLAogICRJbnRlcnBvbGF0ZVByb3ZpZGVyLAogICRJbnRlcnZhbFByb3ZpZGVyLAogICRIdHRwUHJvdmlkZXIsCiAgJEh0dHBCYWNrZW5kUHJvdmlkZXIsCiAgJExvY2F0aW9uUHJvdmlkZXIsCiAgJExvZ1Byb3ZpZGVyLAogICRQYXJzZVByb3ZpZGVyLAogICRSb290U2NvcGVQcm92aWRlciwKICAkUVByb3ZpZGVyLAogICQkUVByb3ZpZGVyLAogICQkU2FuaXRpemVVcmlQcm92aWRlciwKICAkU2NlUHJvdmlkZXIsCiAgJFNjZURlbGVnYXRlUHJvdmlkZXIsCiAgJFNuaWZmZXJQcm92aWRlciwKICAkVGVtcGxhdGVDYWNoZVByb3ZpZGVyLAogICRUZW1wbGF0ZVJlcXVlc3RQcm92aWRlciwKICAkJFRlc3RhYmlsaXR5UHJvdmlkZXIsCiAgJFRpbWVvdXRQcm92aWRlciwKICAkJFJBRlByb3ZpZGVyLAogICQkQXN5bmNDYWxsYmFja1Byb3ZpZGVyLAogICRXaW5kb3dQcm92aWRlcgoqLwoKCi8qKgogKiBAbmdkb2Mgb2JqZWN0CiAqIEBuYW1lIGFuZ3VsYXIudmVyc2lvbgogKiBAbW9kdWxlIG5nCiAqIEBkZXNjcmlwdGlvbgogKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBBbmd1bGFySlMgdmVyc2lvbi4gVGhpcyBvYmplY3QgaGFzIHRoZQogKiBmb2xsb3dpbmcgcHJvcGVydGllczoKICoKICogLSBgZnVsbGAg4oCTIGB7c3RyaW5nfWAg4oCTIEZ1bGwgdmVyc2lvbiBzdHJpbmcsIHN1Y2ggYXMgIjAuOS4xOCIuCiAqIC0gYG1ham9yYCDigJMgYHtudW1iZXJ9YCDigJMgTWFqb3IgdmVyc2lvbiBudW1iZXIsIHN1Y2ggYXMgIjAiLgogKiAtIGBtaW5vcmAg4oCTIGB7bnVtYmVyfWAg4oCTIE1pbm9yIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzICI5Ii4KICogLSBgZG90YCDigJMgYHtudW1iZXJ9YCDigJMgRG90IHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzICIxOCIuCiAqIC0gYGNvZGVOYW1lYCDigJMgYHtzdHJpbmd9YCDigJMgQ29kZSBuYW1lIG9mIHRoZSByZWxlYXNlLCBzdWNoIGFzICJqaWdnbGluZy1hcm1mYXQiLgogKi8KdmFyIHZlcnNpb24gPSB7CiAgZnVsbDogJzEuMy41JywgICAgLy8gYWxsIG9mIHRoZXNlIHBsYWNlaG9sZGVyIHN0cmluZ3Mgd2lsbCBiZSByZXBsYWNlZCBieSBncnVudCdzCiAgbWFqb3I6IDEsICAgIC8vIHBhY2thZ2UgdGFzawogIG1pbm9yOiAzLAogIGRvdDogNSwKICBjb2RlTmFtZTogJ2N5YmVybmV0aWMtbWVyY2FudGlsaXNtJwp9OwoKCmZ1bmN0aW9uIHB1Ymxpc2hFeHRlcm5hbEFQSShhbmd1bGFyKSB7CiAgZXh0ZW5kKGFuZ3VsYXIsIHsKICAgICdib290c3RyYXAnOiBib290c3RyYXAsCiAgICAnY29weSc6IGNvcHksCiAgICAnZXh0ZW5kJzogZXh0ZW5kLAogICAgJ2VxdWFscyc6IGVxdWFscywKICAgICdlbGVtZW50JzoganFMaXRlLAogICAgJ2ZvckVhY2gnOiBmb3JFYWNoLAogICAgJ2luamVjdG9yJzogY3JlYXRlSW5qZWN0b3IsCiAgICAnbm9vcCc6IG5vb3AsCiAgICAnYmluZCc6IGJpbmQsCiAgICAndG9Kc29uJzogdG9Kc29uLAogICAgJ2Zyb21Kc29uJzogZnJvbUpzb24sCiAgICAnaWRlbnRpdHknOiBpZGVudGl0eSwKICAgICdpc1VuZGVmaW5lZCc6IGlzVW5kZWZpbmVkLAogICAgJ2lzRGVmaW5lZCc6IGlzRGVmaW5lZCwKICAgICdpc1N0cmluZyc6IGlzU3RyaW5nLAogICAgJ2lzRnVuY3Rpb24nOiBpc0Z1bmN0aW9uLAogICAgJ2lzT2JqZWN0JzogaXNPYmplY3QsCiAgICAnaXNOdW1iZXInOiBpc051bWJlciwKICAgICdpc0VsZW1lbnQnOiBpc0VsZW1lbnQsCiAgICAnaXNBcnJheSc6IGlzQXJyYXksCiAgICAndmVyc2lvbic6IHZlcnNpb24sCiAgICAnaXNEYXRlJzogaXNEYXRlLAogICAgJ2xvd2VyY2FzZSc6IGxvd2VyY2FzZSwKICAgICd1cHBlcmNhc2UnOiB1cHBlcmNhc2UsCiAgICAnY2FsbGJhY2tzJzoge2NvdW50ZXI6IDB9LAogICAgJ2dldFRlc3RhYmlsaXR5JzogZ2V0VGVzdGFiaWxpdHksCiAgICAnJCRtaW5FcnInOiBtaW5FcnIsCiAgICAnJCRjc3AnOiBjc3AsCiAgICAncmVsb2FkV2l0aERlYnVnSW5mbyc6IHJlbG9hZFdpdGhEZWJ1Z0luZm8KICB9KTsKCiAgYW5ndWxhck1vZHVsZSA9IHNldHVwTW9kdWxlTG9hZGVyKHdpbmRvdyk7CiAgdHJ5IHsKICAgIGFuZ3VsYXJNb2R1bGUoJ25nTG9jYWxlJyk7CiAgfSBjYXRjaCAoZSkgewogICAgYW5ndWxhck1vZHVsZSgnbmdMb2NhbGUnLCBbXSkucHJvdmlkZXIoJyRsb2NhbGUnLCAkTG9jYWxlUHJvdmlkZXIpOwogIH0KCiAgYW5ndWxhck1vZHVsZSgnbmcnLCBbJ25nTG9jYWxlJ10sIFsnJHByb3ZpZGUnLAogICAgZnVuY3Rpb24gbmdNb2R1bGUoJHByb3ZpZGUpIHsKICAgICAgLy8gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyIG5lZWRzIHRvIGJlIGJlZm9yZSAkY29tcGlsZVByb3ZpZGVyIGFzIGl0IGlzIHVzZWQgYnkgaXQuCiAgICAgICRwcm92aWRlLnByb3ZpZGVyKHsKICAgICAgICAkJHNhbml0aXplVXJpOiAkJFNhbml0aXplVXJpUHJvdmlkZXIKICAgICAgfSk7CiAgICAgICRwcm92aWRlLnByb3ZpZGVyKCckY29tcGlsZScsICRDb21waWxlUHJvdmlkZXIpLgogICAgICAgIGRpcmVjdGl2ZSh7CiAgICAgICAgICAgIGE6IGh0bWxBbmNob3JEaXJlY3RpdmUsCiAgICAgICAgICAgIGlucHV0OiBpbnB1dERpcmVjdGl2ZSwKICAgICAgICAgICAgdGV4dGFyZWE6IGlucHV0RGlyZWN0aXZlLAogICAgICAgICAgICBmb3JtOiBmb3JtRGlyZWN0aXZlLAogICAgICAgICAgICBzY3JpcHQ6IHNjcmlwdERpcmVjdGl2ZSwKICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3REaXJlY3RpdmUsCiAgICAgICAgICAgIHN0eWxlOiBzdHlsZURpcmVjdGl2ZSwKICAgICAgICAgICAgb3B0aW9uOiBvcHRpb25EaXJlY3RpdmUsCiAgICAgICAgICAgIG5nQmluZDogbmdCaW5kRGlyZWN0aXZlLAogICAgICAgICAgICBuZ0JpbmRIdG1sOiBuZ0JpbmRIdG1sRGlyZWN0aXZlLAogICAgICAgICAgICBuZ0JpbmRUZW1wbGF0ZTogbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nQ2xhc3M6IG5nQ2xhc3NEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nQ2xhc3NFdmVuOiBuZ0NsYXNzRXZlbkRpcmVjdGl2ZSwKICAgICAgICAgICAgbmdDbGFzc09kZDogbmdDbGFzc09kZERpcmVjdGl2ZSwKICAgICAgICAgICAgbmdDbG9hazogbmdDbG9ha0RpcmVjdGl2ZSwKICAgICAgICAgICAgbmdDb250cm9sbGVyOiBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nRm9ybTogbmdGb3JtRGlyZWN0aXZlLAogICAgICAgICAgICBuZ0hpZGU6IG5nSGlkZURpcmVjdGl2ZSwKICAgICAgICAgICAgbmdJZjogbmdJZkRpcmVjdGl2ZSwKICAgICAgICAgICAgbmdJbmNsdWRlOiBuZ0luY2x1ZGVEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nSW5pdDogbmdJbml0RGlyZWN0aXZlLAogICAgICAgICAgICBuZ05vbkJpbmRhYmxlOiBuZ05vbkJpbmRhYmxlRGlyZWN0aXZlLAogICAgICAgICAgICBuZ1BsdXJhbGl6ZTogbmdQbHVyYWxpemVEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nUmVwZWF0OiBuZ1JlcGVhdERpcmVjdGl2ZSwKICAgICAgICAgICAgbmdTaG93OiBuZ1Nob3dEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nU3R5bGU6IG5nU3R5bGVEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nU3dpdGNoOiBuZ1N3aXRjaERpcmVjdGl2ZSwKICAgICAgICAgICAgbmdTd2l0Y2hXaGVuOiBuZ1N3aXRjaFdoZW5EaXJlY3RpdmUsCiAgICAgICAgICAgIG5nU3dpdGNoRGVmYXVsdDogbmdTd2l0Y2hEZWZhdWx0RGlyZWN0aXZlLAogICAgICAgICAgICBuZ09wdGlvbnM6IG5nT3B0aW9uc0RpcmVjdGl2ZSwKICAgICAgICAgICAgbmdUcmFuc2NsdWRlOiBuZ1RyYW5zY2x1ZGVEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nTW9kZWw6IG5nTW9kZWxEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nTGlzdDogbmdMaXN0RGlyZWN0aXZlLAogICAgICAgICAgICBuZ0NoYW5nZTogbmdDaGFuZ2VEaXJlY3RpdmUsCiAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm5EaXJlY3RpdmUsCiAgICAgICAgICAgIG5nUGF0dGVybjogcGF0dGVybkRpcmVjdGl2ZSwKICAgICAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkRGlyZWN0aXZlLAogICAgICAgICAgICBuZ1JlcXVpcmVkOiByZXF1aXJlZERpcmVjdGl2ZSwKICAgICAgICAgICAgbWlubGVuZ3RoOiBtaW5sZW5ndGhEaXJlY3RpdmUsCiAgICAgICAgICAgIG5nTWlubGVuZ3RoOiBtaW5sZW5ndGhEaXJlY3RpdmUsCiAgICAgICAgICAgIG1heGxlbmd0aDogbWF4bGVuZ3RoRGlyZWN0aXZlLAogICAgICAgIA0KjNzvVvsiAQAjGQAAIxkAAGj3KB/SxQgAJ60eEwgARQAZFSKjQABABm9ZwKgHYMCoBzYf9ZUo9P29rxn6hDeAGADtqO4AAAEBCAoATaWzAKNetkhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjE4NEMNCiFmdW5jdGlvbigpe2Z1bmN0aW9uIHQobix0KXtmdW5jdGlvbiByKHQpe3ZhciByLGU9bi5hcmNzWzA+dD9+dDp0XSxvPWVbMF07cmV0dXJuIG4udHJhbnNmb3JtPyhyPVswLDBdLGUuZm9yRWFjaChmdW5jdGlvbihuKXtyWzBdKz1uWzBdLHJbMV0rPW5bMV19KSk6cj1lW2UubGVuZ3RoLTFdLDA+dD9bcixvXTpbbyxyXX1mdW5jdGlvbiBlKG4sdCl7Zm9yKHZhciByIGluIG4pe3ZhciBlPW5bcl07ZGVsZXRlIHRbZS5zdGFydF0sZGVsZXRlIGUuc3RhcnQsZGVsZXRlIGUuZW5kLGUuZm9yRWFjaChmdW5jdGlvbihuKXtvWzA+bj9+bjpuXT0xfSksZi5wdXNoKGUpfX12YXIgbz17fSxpPXt9LHU9e30sZj1bXSxjPS0xO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24ocixlKXt2YXIgbyxpPW4uYXJjc1swPnI/fnI6cl07aS5sZW5ndGg8MyYmIWlbMV1bMF0mJiFpWzFdWzFdJiYobz10WysrY10sdFtjXT1yLHRbZV09byl9KSx0LmZvckVhY2goZnVuY3Rpb24obil7dmFyIHQsZSxvPXIobiksZj1vWzBdLGM9b1sxXTtpZih0PXVbZl0paWYoZGVsZXRlIHVbdC5lbmRdLHQucHVzaChuKSx0LmVuZD1jLGU9aVtjXSl7ZGVsZXRlIGlbZS5zdGFydF07dmFyIGE9ZT09PXQ/dDp0LmNvbmNhdChlKTtpW2Euc3RhcnQ9dC5zdGFydF09dVthLmVuZD1lLmVuZF09YX1lbHNlIGlbdC5zdGFydF09dVt0LmVuZF09dDtlbHNlIGlmKHQ9aVtjXSlpZihkZWxldGUgaVt0LnN0YXJ0XSx0LnVuc2hpZnQobiksdC5zdGFydD1mLGU9dVtmXSl7ZGVsZXRlIHVbZS5lbmRdO3ZhciBzPWU9PT10P3Q6ZS5jb25jYXQodCk7aVtzLnN0YXJ0PWUuc3RhcnRdPXVbcy5lbmQ9dC5lbmRdPXN9ZWxzZSBpW3Quc3RhcnRdPXVbdC5lbmRdPXQ7ZWxzZSB0PVtuXSxpW3Quc3RhcnQ9Zl09dVt0LmVuZD1jXT10fSksZSh1LGkpLGUoaSx1KSx0LmZvckVhY2goZnVuY3Rpb24obil7b1swPm4/fm46bl18fGYucHVzaChbbl0pfSksZn1mdW5jdGlvbiByKG4scixlKXtmdW5jdGlvbiBvKG4pe3ZhciB0PTA+bj9+bjpuOyhzW3RdfHwoc1t0XT1bXSkpLnB1c2goe2k6bixnOmF9KX1mdW5jdGlvbiBpKG4pe24uZm9yRWFjaChvKX1mdW5jdGlvbiB1KG4pe24uZm9yRWFjaChpKX1mdW5jdGlvbiBmKG4peyJHZW9tZXRyeUNvbGxlY3Rpb24iPT09bi50eXBlP24uZ2VvbWV0cmllcy5mb3JFYWNoKGYpOm4udHlwZSBpbiBsJiYoYT1uLGxbbi50eXBlXShuLmFyY3MpKX12YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjEpe3ZhciBhLHM9W10sbD17TGluZVN0cmluZzppLE11bHRpTGluZVN0cmluZzp1LFBvbHlnb246dSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obil7bi5mb3JFYWNoKHUpfX07ZihyKSxzLmZvckVhY2goYXJndW1lbnRzLmxlbmd0aDwzP2Z1bmN0aW9uKG4pe2MucHVzaChuWzBdLmkpfTpmdW5jdGlvbihuKXtlKG5bMF0uZyxuW24ubGVuZ3RoLTFdLmcpJiZjLnB1c2goblswXS5pKX0pfWVsc2UgZm9yKHZhciBoPTAscD1uLmFyY3MubGVuZ3RoO3A+aDsrK2gpYy5wdXNoKGgpO3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGFyY3M6dChuLGMpfX1mdW5jdGlvbiBlKHIsZSl7ZnVuY3Rpb24gbyhuKXtuLmZvckVhY2goZnVuY3Rpb24odCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpeyhmW3Q9MD50P350OnRdfHwoZlt0XT1bXSkpLnB1c2gobil9KX0pLGMucHVzaChuKX1mdW5jdGlvbiBpKG4pe3JldHVybiBsKHUocix7dHlwZToiUG9seWdvbiIsYXJjczpbbl19KS5jb29yZGluYXRlc1swXSk+MH12YXIgZj17fSxjPVtdLGE9W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihuKXsiUG9seWdvbiI9PT1uLnR5cGU/byhuLmFyY3MpOiJNdWx0aVBvbHlnb24iPT09bi50eXBlJiZuLmFyY3MuZm9yRWFjaChvKX0pLGMuZm9yRWFjaChmdW5jdGlvbihuKXtpZighbi5fKXt2YXIgdD1bXSxyPVtuXTtmb3Iobi5fPTEsYS5wdXNoKHQpO249ci5wb3AoKTspdC5wdXNoKG4pLG4uZm9yRWFjaChmdW5jdGlvbihuKXtuLmZvckVhY2goZnVuY3Rpb24obil7ZlswPm4/fm46bl0uZm9yRWFjaChmdW5jdGlvbihuKXtuLl98fChuLl89MSxyLnB1c2gobikpfSl9KX0pfX0pLGMuZm9yRWFjaChmdW5jdGlvbihuKXtkZWxldGUgbi5ffSkse3R5cGU6Ik11bHRpUG9seWdvbiIsYXJjczphLm1hcChmdW5jdGlvbihlKXt2YXIgbz1bXTtpZihlLmZvckVhY2goZnVuY3Rpb24obil7bi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uZm9yRWFjaChmdW5jdGlvbihuKXtmWzA+bj9+bjpuXS5sZW5ndGg8MiYmby5wdXNoKG4pfSl9KX0pLG89dChyLG8pLChuPW8ubGVuZ3RoKT4xKWZvcih2YXIgdSxjPWkoZVswXVswXSksYT0wO24+YTsrK2EpaWYoYz09PWkob1thXSkpe3U9b1swXSxvWzBdPW9bYV0sb1thXT11O2JyZWFrfXJldHVybiBvfSl9fWZ1bmN0aW9uIG8obix0KXtyZXR1cm4iR2VvbWV0cnlDb2xsZWN0aW9uIj09PXQudHlwZT97dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZ2VvbWV0cmllcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGkobix0KX0pfTppKG4sdCl9ZnVuY3Rpb24gaShuLHQpe3ZhciByPXt0eXBlOiJGZWF0dXJlIixpZDp0LmlkLHByb3BlcnRpZXM6dC5wcm9wZXJ0aWVzfHx7fSxnZW9tZXRyeTp1KG4sdCl9O3JldHVybiBudWxsPT10LmlkJiZkZWxldGUgci5pZCxyfWZ1bmN0aW9uIHUobix0KXtmdW5jdGlvbiByKG4sdCl7dC5sZW5ndGgmJnQucG9wKCk7Zm9yKHZhciByLGU9c1swPm4/fm46bl0sbz0wLGk9ZS5sZW5ndGg7aT5vOysrbyl0LnB1c2gocj1lW29dLnNsaWNlKCkpLGEocixvKTswPm4mJmYodCxpKX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPW4uc2xpY2UoKSxhKG4sMCksbn1mdW5jdGlvbiBvKG4pe2Zvcih2YXIgdD1bXSxlPTAsbz1uLmxlbmd0aDtvPmU7KytlKXIobltlXSx0KTtyZXR1cm4gdC5sZW5ndGg8MiYmdC5wdXNoKHRbMF0uc2xpY2UoKSksdH1mdW5jdGlvbiBpKG4pe2Zvcih2YXIgdD1vKG4pO3QubGVuZ3RoPDQ7KXQucHVzaCh0WzBdLnNsaWNlKCkpO3JldHVybiB0fWZ1bmN0aW9uIHUobil7cmV0dXJuIG4ubWFwKGkpfWZ1bmN0aW9uIGMobil7dmFyIHQ9bi50eXBlO3JldHVybiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09dD97dHlwZTp0LGdlb21ldHJpZXM6bi5nZW9tZXRyaWVzLm1hcChjKX06dCBpbiBsP3t0eXBlOnQsY29vcmRpbmF0ZXM6bFt0XShuKX06bnVsbH12YXIgYT12KG4udHJhbnNmb3JtKSxzPW4uYXJjcyxsPXtQb2ludDpmdW5jdGlvbihuKXtyZXR1cm4gZShuLmNvb3JkaW5hdGVzKX0sTXVsdGlQb2ludDpmdW5jdGlvbihuKXtyZXR1cm4gbi5jb29yZGluYXRlcy5tYXAoZSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24obil7cmV0dXJuIG8obi5hcmNzKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4pe3JldHVybiBuLmFyY3MubWFwKG8pfSxQb2x5Z29uOmZ1bmN0aW9uKG4pe3JldHVybiB1KG4uYXJjcyl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihuKXtyZXR1cm4gbi5hcmNzLm1hcCh1KX19O3JldHVybiBjKHQpfWZ1bmN0aW9uIGYobix0KXtmb3IodmFyIHIsZT1uLmxlbmd0aCxvPWUtdDtvPC0tZTspcj1uW29dLG5bbysrXT1uW2VdLG5bZV09cn1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciByPTAsZT1uLmxlbmd0aDtlPnI7KXt2YXIgbz1yK2U+Pj4xO25bb108dD9yPW8rMTplPW99cmV0dXJuIHJ9ZnVuY3Rpb24gYShuKXtmdW5jdGlvbiB0KG4sdCl7bi5mb3JFYWNoKGZ1bmN0aW9uKG4pezA+biYmKG49fm4pO3ZhciByPW9bbl07cj9yLnB1c2godCk6b1tuXT1bdF19KX1mdW5jdGlvbiByKG4scil7bi5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QobixyKX0pfWZ1bmN0aW9uIGUobix0KXsiR2VvbWV0cnlDb2xsZWN0aW9uIj09PW4udHlwZT9uLmdlb21ldHJpZXMuZm9yRWFjaChmdW5jdGlvbihuKXtlKG4sdCl9KTpuLnR5cGUgaW4gdSYmdVtuLnR5cGVdKG4uYXJjcyx0KX12YXIgbz17fSxpPW4ubWFwKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx1PXtMaW5lU3RyaW5nOnQsTXVsdGlMaW5lU3RyaW5nOnIsUG9seWdvbjpyLE11bHRpUG9seWdvbjpmdW5jdGlvbihuLHQpe24uZm9yRWFjaChmdW5jdGlvbihuKXtyKG4sdCl9KX19O24uZm9yRWFjaChlKTtmb3IodmFyIGYgaW4gbylmb3IodmFyIGE9b1tmXSxzPWEubGVuZ3RoLGw9MDtzPmw7KytsKWZvcih2YXIgaD1sKzE7cz5oOysraCl7dmFyIHAsZz1hW2xdLHY9YVtoXTsocD1pW2ddKVtmPWMocCx2KV0hPT12JiZwLnNwbGljZShmLDAsdiksKHA9aVt2XSlbZj1jKHAsZyldIT09ZyYmcC5zcGxpY2UoZiwwLGcpfXJldHVybiBpfWZ1bmN0aW9uIHMobix0KXtmdW5jdGlvbiByKG4pe2kucmVtb3ZlKG4pLG5bMV1bMl09dChuKSxpLnB1c2gobil9dmFyIGU9dihuLnRyYW5zZm9ybSksbz1tKG4udHJhbnNmb3JtKSxpPWcoKTtyZXR1cm4gdHx8KHQ9aCksbi5hcmNzLmZvckVhY2goZnVuY3Rpb24obil7Zm9yKHZhciB1LGYsYz1bXSxhPTAscz0wLGw9bi5sZW5ndGg7bD5zOysrcylmPW5bc10sZShuW3NdPVtmWzBdLGZbMV0sMS8wXSxzKTtmb3IodmFyIHM9MSxsPW4ubGVuZ3RoLTE7bD5zOysrcyl1PW4uc2xpY2Uocy0xLHMrMiksdVsxXVsyXT10KHUpLGMucHVzaCh1KSxpLnB1c2godSk7Zm9yKHZhciBzPTAsbD1jLmxlbmd0aDtsPnM7KytzKXU9Y1tzXSx1LnByZXZpb3VzPWNbcy0xXSx1Lm5leHQ9Y1tzKzFdO2Zvcig7dT1pLnBvcCgpOyl7dmFyIGg9dS5wcmV2aW91cyxwPXUubmV4dDt1WzFdWzJdPGE/dVsxXVsyXT1hOmE9dVsxXVsyXSxoJiYoaC5uZXh0PXAsaFsyXT11WzJdLHIoaCkpLHAmJihwLnByZXZpb3VzPWgscFswXT11WzBdLHIocCkpfW4uZm9yRWFjaChvKX0pLG59ZnVuY3Rpb24gbChuKXtmb3IodmFyIHQscj0tMSxlPW4ubGVuZ3RoLG89bltlLTFdLGk9MDsrK3I8ZTspdD1vLG89bltyXSxpKz10WzBdKm9bMV0tdFsxXSpvWzBdO3JldHVybi41Kml9ZnVuY3Rpb24gaChuKXt2YXIgdD1uWzBdLHI9blsxXSxlPW5bMl07cmV0dXJuIE1hdGguYWJzKCh0WzBdLWVbMF0pKihyWzFdLXRbMV0pLSh0WzBdLXJbMF0pKihlWzFdLXRbMV0pKX1mdW5jdGlvbiBwKG4sdCl7cmV0dXJuIG5bMV1bMl0tdFsxXVsyXX1mdW5jdGlvbiBnKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcig7dD4wOyl7dmFyIHI9KHQrMT4+MSktMSxvPWVbcl07aWYocChuLG8pPj0wKWJyZWFrO2Vbby5fPXRdPW8sZVtuLl89dD1yXT1ufX1mdW5jdGlvbiB0KG4sdCl7Zm9yKDs7KXt2YXIgcj10KzE8PDEsaT1yLTEsdT10LGY9ZVt1XTtpZihvPmkmJnAoZVtpXSxmKTwwJiYoZj1lW3U9aV0pLG8+ciYmcChlW3JdLGYpPDAmJihmPWVbdT1yXSksdT09PXQpYnJlYWs7ZVtmLl89dF09ZixlW24uXz10PXVdPW59fXZhciByPXt9LGU9W10sbz0wO3JldHVybiByLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIG4oZVt0Ll89b109dCxvKyspLG99LHIucG9wPWZ1bmN0aW9uKCl7aWYoISgwPj1vKSl7dmFyIG4scj1lWzBdO3JldHVybi0tbz4wJiYobj1lW29dLHQoZVtuLl89MF09biwwKSkscn19LHIucmVtb3ZlPWZ1bmN0aW9uKHIpe3ZhciBpLHU9ci5fO2lmKGVbdV09PT1yKXJldHVybiB1IT09LS1vJiYoaT1lW29dLChwKGkscik8MD9uOnQpKGVbaS5fPXVdPWksdSkpLHV9LHJ9ZnVuY3Rpb24gdihuKXtpZighbilyZXR1cm4geTt2YXIgdCxyLGU9bi5zY2FsZVswXSxvPW4uc2NhbGVbMV0saT1uLnRyYW5zbGF0ZVswXSx1PW4udHJhbnNsYXRlWzFdO3JldHVybiBmdW5jdGlvbihuLGYpe2Z8fCh0PXI9MCksblswXT0odCs9blswXSkqZStpLG5bMV09KHIrPW5bMV0pKm8rdX19ZnVuY3Rpb24gbShuKXtpZighbilyZXR1cm4geTt2YXIgdCxyLGU9bi5zY2FsZVswXSxvPW4uc2NhbGVbMV0saT1uLnRyYW5zbGF0ZVswXSx1PW4udHJhbnNsYXRlWzFdO3JldHVybiBmdW5jdGlvbihuLGYpe2Z8fCh0PXI9MCk7dmFyIGM9KG5bMF0taSkvZXwwLGE9KG5bMV0tdSkvb3wwO25bMF09Yy10LG5bMV09YS1yLHQ9YyxyPWF9fWZ1bmN0aW9uIHkoKXt9dmFyIGQ9e3ZlcnNpb246IjEuNi4xOCIsbWVzaDpmdW5jdGlvbihuKXtyZXR1cm4gdShuLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbWVzaEFyY3M6cixtZXJnZTpmdW5jdGlvbihuKXtyZXR1cm4gdShuLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbWVyZ2VBcmNzOmUsZmVhdHVyZTpvLG5laWdoYm9yczphLHByZXNpbXBsaWZ5OnN9OyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGQpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1kOnRoaXMudG9wb2pzb249ZH0oKTsNCozc71bCIwEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTZp0AAQAbRNcCoBzbAqAdglSgf9Rn6hDf0/daQgBABSMFVAAABAQgKAKNetwBNpbOM3O9W8SMBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PCVAAEAGbrjAqAc2wKgHYJUiH/VYenzTQbMV8IAQBO36hgAAAQEICgCjXrcATaWyjNzvVtImAQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOSKoQABABogwwKgHYMCoBzYf9ZUo9P3WkBn6hDeAGADtkBIAAAEBCAoATaWzAKNetzANCg0KjNzvVkgqAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANNmoQABABtE0wKgHNsCoB2CVKB/1GfqEN/T91pWAEAFIwU8AAAEBCAoAo164AE2ls4zc71ZuLgEA1QIAANUCAAAIACetHhNo9ygf0sUIAEUAAsfZqUAAQAbOoMCoBzbAqAdglSgf9Rn6hDf0/daVgBgBSPN8AAABAQgKAKNeuABNpbNHRVQgL29ub3MvdWkvdHAvYW5ndWxhci1jaGFydC5taW4uY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71avOgEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHzl1kAAQAaovsCoB2DAqAc2H/WVKVH9etjDTBuGgBAA7axVAAABAQgKAE2ltACjXrZIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo4MDAwDQovKiEKICogQ2hhcnQuanMKICogaHR0cDovL2NoYXJ0anMub3JnLwogKiBWZXJzaW9uOiAxLjAuMgogKgogKiBDb3B5cmlnaHQgMjAxNSBOaWNrIERvd25pZQogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL25ubmljay9DaGFydC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kCiAqLwooZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQ9dGhpcyxpPXQuQ2hhcnQsZT1mdW5jdGlvbih0KXt0aGlzLmNhbnZhcz10LmNhbnZhcyx0aGlzLmN0eD10O3ZhciBpPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRbIm9mZnNldCIraV0/dFsib2Zmc2V0IitpXTpkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoaSl9LGU9dGhpcy53aWR0aD1pKHQuY2FudmFzLCJXaWR0aCIpfHx0LmNhbnZhcy53aWR0aCxuPXRoaXMuaGVpZ2h0PWkodC5jYW52YXMsIkhlaWdodCIpfHx0LmNhbnZhcy5oZWlnaHQ7cmV0dXJuIGU9dGhpcy53aWR0aD10LmNhbnZhcy53aWR0aCxuPXRoaXMuaGVpZ2h0PXQuY2FudmFzLmhlaWdodCx0aGlzLmFzcGVjdFJhdGlvPXRoaXMud2lkdGgvdGhpcy5oZWlnaHQscy5yZXRpbmFTY2FsZSh0aGlzKSx0aGlzfTtlLmRlZmF1bHRzPXtnbG9iYWw6e2FuaW1hdGlvbjohMCxhbmltYXRpb25TdGVwczo2MCxhbmltYXRpb25FYXNpbmc6ImVhc2VPdXRRdWFydCIsc2hvd1NjYWxlOiEwLHNjYWxlT3ZlcnJpZGU6ITEsc2NhbGVTdGVwczpudWxsLHNjYWxlU3RlcFdpZHRoOm51bGwsc2NhbGVTdGFydFZhbHVlOm51bGwsc2NhbGVMaW5lQ29sb3I6InJnYmEoMCwwLDAsLjEpIixzY2FsZUxpbmVXaWR0aDoxLHNjYWxlU2hvd0xhYmVsczohMCxzY2FsZUxhYmVsOiI8JT12YWx1ZSU+IixzY2FsZUludGVnZXJzT25seTohMCxzY2FsZUJlZ2luQXRaZXJvOiExLHNjYWxlRm9udEZhbWlseToiJ0hlbHZldGljYSBOZXVlJywgJ0hlbHZldGljYScsICdBcmlhbCcsIHNhbnMtc2VyaWYiLHNjYWxlRm9udFNpemU6MTIsc2NhbGVGb250U3R5bGU6Im5vcm1hbCIsc2NhbGVGb250Q29sb3I6IiM2NjYiLHJlc3BvbnNpdmU6ITEsbWFpbnRhaW5Bc3BlY3RSYXRpbzohMCxzaG93VG9vbHRpcHM6ITAsY3VzdG9tVG9vbHRpcHM6ITEsdG9vbHRpcEV2ZW50czpbIm1vdXNlbW92ZSIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJtb3VzZW91dCJdLHRvb2x0aXBGaWxsQ29sb3I6InJnYmEoMCwwLDAsMC44KSIsdG9vbHRpcEZvbnRGYW1pbHk6IidIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmIix0b29sdGlwRm9udFNpemU6MTQsdG9vbHRpcEZvbnRTdHlsZToibm9ybWFsIix0b29sdGlwRm9udENvbG9yOiIjZmZmIix0b29sdGlwVGl0bGVGb250RmFtaWx5OiInSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0FyaWFsJywgc2Fucy1zZXJpZiIsdG9vbHRpcFRpdGxlRm9udFNpemU6MTQsdG9vbHRpcFRpdGxlRm9udFN0eWxlOiJib2xkIix0b29sdGlwVGl0bGVGb250Q29sb3I6IiNmZmYiLHRvb2x0aXBUaXRsZVRlbXBsYXRlOiI8JT0gbGFiZWwlPiIsdG9vbHRpcFlQYWRkaW5nOjYsdG9vbHRpcFhQYWRkaW5nOjYsdG9vbHRpcENhcmV0U2l6ZTo4LHRvb2x0aXBDb3JuZXJSYWRpdXM6Nix0b29sdGlwWE9mZnNldDoxMCx0b29sdGlwVGVtcGxhdGU6IjwlaWYgKGxhYmVsKXslPjwlPWxhYmVsJT46IDwlfSU+PCU9IHZhbHVlICU+IixtdWx0aVRvb2x0aXBUZW1wbGF0ZToiPCU9IHZhbHVlICU+IixtdWx0aVRvb2x0aXBLZXlCYWNrZ3JvdW5kOiIjZmZmIixzZWdtZW50Q29sb3JEZWZhdWx0OlsiI0E2Q0VFMyIsIiMxRjc4QjQiLCIjQjJERjhBIiwiIzMzQTAyQyIsIiNGQjlBOTkiLCIjRTMxQTFDIiwiI0ZEQkY2RiIsIiNGRjdGMDAiLCIjQ0FCMkQ2IiwiIzZBM0Q5QSIsIiNCNEI0ODIiLCIjQjE1OTI4Il0sc2VnbWVudEhpZ2hsaWdodENvbG9yRGVmYXVsdHM6WyIjQ0VGNkZGIiwiIzQ3QTBEQyIsIiNEQUZGQjIiLCIjNUJDODU0IiwiI0ZGQzJDMSIsIiNGRjQyNDQiLCIjRkZFNzk3IiwiI0ZGQTcyOCIsIiNGMkRBRkUiLCIjOTI2NUMyIiwiI0RDRENBQSIsIiNEOTgxNTAiXSxvbkFuaW1hdGlvblByb2dyZXNzOmZ1bmN0aW9uKCl7fSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7fX19LGUudHlwZXM9e307dmFyIHM9ZS5oZWxwZXJzPXt9LG49cy5lYWNoPWZ1bmN0aW9uKHQsaSxlKXt2YXIgcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyk7aWYodClpZih0Lmxlbmd0aD09PSt0Lmxlbmd0aCl7dmFyIG47Zm9yKG49MDtuPHQubGVuZ3RoO24rKylpLmFwcGx5KGUsW3Rbbl0sbl0uY29uY2F0KHMpKX1lbHNlIGZvcih2YXIgbyBpbiB0KWkuYXBwbHkoZSxbdFtvXSxvXS5jb25jYXQocykpfSxvPXMuY2xvbmU9ZnVuY3Rpb24odCl7dmFyIGk9e307cmV0dXJuIG4odCxmdW5jdGlvbihlLHMpe3QuaGFzT3duUHJvcGVydHkocykmJihpW3NdPWUpfSksaX0sYT1zLmV4dGVuZD1mdW5jdGlvbih0KXtyZXR1cm4gbihBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oaSl7bihpLGZ1bmN0aW9uKGUscyl7aS5oYXNPd25Qcm9wZXJ0eShzKSYmKHRbc109ZSl9KX0pLHR9LGg9cy5tZXJnZT1mdW5jdGlvbih0LGkpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gZS51bnNoaWZ0KHt9KSxhLmFwcGx5KG51bGwsZSl9LGw9cy5pbmRleE9mPWZ1bmN0aW9uKHQsaSl7aWYoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpcmV0dXJuIHQuaW5kZXhPZihpKTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdPT09aSlyZXR1cm4gZTtyZXR1cm4tMX0scj0ocy53aGVyZT1mdW5jdGlvbih0LGkpe3ZhciBlPVtdO3JldHVybiBzLmVhY2godCxmdW5jdGlvbih0KXtpKHQpJiZlLnB1c2godCl9KSxlfSxzLmZpbmROZXh0V2hlcmU9ZnVuY3Rpb24odCxpLGUpe2V8fChlPS0xKTtmb3IodmFyIHM9ZSsxO3M8dC5sZW5ndGg7cysrKXt2YXIgbj10W3NdO2lmKGkobikpcmV0dXJuIG59fSxzLmZpbmRQcmV2aW91c1doZXJlPWZ1bmN0aW9uKHQsaSxlKXtlfHwoZT10Lmxlbmd0aCk7Zm9yKHZhciBzPWUtMTtzPj0wO3MtLSl7dmFyIG49dFtzXTtpZihpKG4pKXJldHVybiBufX0scy5pbmhlcml0cz1mdW5jdGlvbih0KXt2YXIgaT10aGlzLGU9dCYmdC5oYXNPd25Qcm9wZXJ0eSgiY29uc3RydWN0b3IiKT90LmNvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzPWZ1bmN0aW9uKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfTtyZXR1cm4gcy5wcm90b3R5cGU9aS5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IHMsZS5leHRlbmQ9cix0JiZhKGUucHJvdG90eXBlLHQpLGUuX19zdXBlcl9fPWkucHJvdG90eXBlLGV9KSxjPXMubm9vcD1mdW5jdGlvbigpe30sdT1zLnVpZD1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuImNoYXJ0LSIrdCsrfX0oKSxkPXMud2Fybj1mdW5jdGlvbih0KXt3aW5kb3cuY29uc29sZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5jb25zb2xlLndhcm4mJmNvbnNvbGUud2Fybih0KX0scD1zLmFtZD0iZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kLGY9cy5pc051bWJlcj1mdW5jdGlvbih0KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh0KSkmJmlzRmluaXRlKHQpfSxnPXMubWF4PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heC5hcHBseShNYXRoLHQpfSxtPXMubWluPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLHQpfSx2PShzLmNhcD1mdW5jdGlvbih0LGksZSl7aWYoZihpKSl7aWYodD5pKXJldHVybiBpfWVsc2UgaWYoZihlKSYmZT50KXJldHVybiBlO3JldHVybiB0fSxzLmdldERlY2ltYWxQbGFjZXM9ZnVuY3Rpb24odCl7aWYodCUxIT09MCYmZih0KSl7dmFyIGk9dC50b1N0cmluZygpO2lmKGkuaW5kZXhPZigiZS0iKTwwKXJldHVybiBpLnNwbGl0KCIuIilbMV0ubGVuZ3RoO2lmKGkuaW5kZXhPZigiLiIpPDApcmV0dXJuIHBhcnNlSW50KGkuc3BsaXQoImUtIilbMV0pO3ZhciBlPWkuc3BsaXQoIi4iKVsxXS5zcGxpdCgiZS0iKTtyZXR1cm4gZVswXS5sZW5ndGgrcGFyc2VJbnQoZVsxXSl9cmV0dXJuIDB9KSxTPXMucmFkaWFucz1mdW5jdGlvbih0KXtyZXR1cm4gdCooTWF0aC5QSS8xODApfSx4PShzLmdldEFuZ2xlRnJvbVBvaW50PWZ1bmN0aW9uKHQsaSl7dmFyIGU9aS54LXQueCxzPWkueS10Lnksbj1NYXRoLnNxcnQoZSplK3Mqcyksbz0yKk1hdGguUEkrTWF0aC5hdGFuMihzLGUpO3JldHVybiAwPmUmJjA+cyYmKG8rPTIqTWF0aC5QSSkse2FuZ2xlOm8sZGlzdGFuY2U6bn19LHMuYWxpYXNQaXhlbD1mdW5jdGlvbih0KXtyZXR1cm4gdCUyPT09MD8wOi41fSkseT0ocy5zcGxpbmVDdXJ2ZT1mdW5jdGlvbih0LGksZSxzKXt2YXIgbj1NYXRoLnNxcnQoTWF0aC5wb3coaS54LXQueCwyKStNYXRoLnBvdyhpLnktdC55LDIpKSxvPU1hdGguc3FydChNYXRoLnBvdyhlLngtaS54LDIpK01hdGgucG93KGUueS1pLnksMikpLGE9cypuLyhuK28pLGg9cypvLyhuK28pO3JldHVybntpbm5lcjp7eDppLngtYSooZS54LXQueCkseTppLnktYSooZS55LXQueSl9LG91dGVyOnt4OmkueCtoKihlLngtdC54KSx5OmkueStoKihlLnktdC55KX19fSxzLmNhbGN1bGF0ZU9yZGVyT2ZNYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjEwKX0pLEM9KHMuY2FsY3VsYXRlU2NhbGVSYW5nZT1mdW5jdGlvbih0LGksZSxzLG8pe3ZhciBhPTIsaD1NYXRoLmZsb29yKGkvKDEuNSplKSksbD1hPj1oLHI9W107bih0LGZ1bmN0aW9uKHQpe251bGw9PXR8fHIucHVzaCh0KX0pO3ZhciBjPW0ociksdT1nKHIpO3U9PT1jJiYodSs9LjUsYz49LjUmJiFzP2MtPS41OnUrPS41KTtmb3IodmFyIGQ9TWF0aC5hYnModS1jKSxwPXkoZCksZj1NYXRoLmNlaWwodS8oMSpNYXRoLnBvdygxMCxwKSkpKk1hdGgucG93KDEwLHApLHY9cz8wOk1hdGguZmxvb3IoYy8oMSpNYXRoLnBvdygxMCxwKSkpKk1hdGgucG93KDEwLHApLFM9Zi12LHg9TWF0aC5wb3coMTAscCksQz1NYXRoLnJvdW5kKFMveCk7KEM+aHx8aD4yKkMpJiYhbDspaWYoQz5oKXgqPTIsQz1NYXRoLnJvdW5kKFMveCksQyUxIT09MCYmKGw9ITApO2Vsc2UgaWYobyYmcD49MCl7aWYoeC8yJTEhPT0wKWJyZWFrO3gvPTIsQz1NYXRoLnJvdW5kKFMveCl9ZWxzZSB4Lz0yLEM9TWF0aC5yb3VuZChTL3gpO3JldHVybiBsJiYoQz1hLHg9Uy9DKSx7c3RlcHM6QyxzdGVwVmFsdWU6eCxtaW46dixtYXg6ditDKnh9fSxzLnRlbXBsYXRlPWZ1bmN0aW9uKHQsaSl7ZnVuY3Rpb24gZSh0LGkpe3ZhciBlPS9cVy8udGVzdCh0KT9uZXcgRnVuY3Rpb24oIm9iaiIsInZhciBwPVtdLHByaW50PWZ1bmN0aW9uKCl7cC5wdXNoLmFwcGx5KHAsYXJndW1lbnRzKTt9O3dpdGgob2JqKXtwLnB1c2goJyIrdC5yZXBsYWNlKC9bXHJcdFxuXS9nLCIgIikuc3BsaXQoIjwlIikuam9pbigiCSIpLnJlcGxhY2UoLygoXnwlPilbXlx0XSopJy9nLCIkMVxyIikucmVwbGFjZSgvXHQ9KC4qPyklPi9nLCInLCQxLCciKS5zcGxpdCgiCSIpLmpvaW4oIicpOyIpLnNwbGl0KCIlPiIpLmpvaW4oInAucHVzaCgnIikuc3BsaXQoIlxyIikuam9pbigiXFwnIikrIicpO31yZXR1cm4gcC5qb2luKCcnKTsiKTpzW3RdPXNbdF07cmV0dXJuIGk/ZShpKTplfWlmKHQgaW5zdGFuY2VvZiBGdW5jdGlvbilyZXR1cm4gdChpKTt2YXIgcz17fTtyZXR1cm4gZSh0LGkpfSksYj0ocy5nZW5lcmF0ZUxhYmVscz1mdW5jdGlvbih0LGksZSxzKXt2YXIgbz1uZXcgQXJyYXkoaSk7cmV0dXJuIHQmJm4obyxmdW5jdGlvbihpLG4pe29bbl09Qyh0LHt2YWx1ZTplK3MqKG4rMSl9KX0pLG99LHMuZWFzaW5nRWZmZWN0cz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxlYXNlSW5RdWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKHQpe3JldHVybi0xKnQqKHQtMil9LGVhc2VJbk91dFF1YWQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQvPS41KTwxPy41KnQqdDotMC41KigtLXQqKHQtMiktMSl9LGVhc2VJbkN1YmljOmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sZWFzZU91dEN1YmljOmZ1bmN0aW9uKHQpe3JldHVybiAxKigodD10LzEtMSkqdCp0KzEpfSxlYXNlSW5PdXRDdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4odC89LjUpPDE/LjUqdCp0KnQ6LjUqKCh0LT0yKSp0KnQrMil9LGVhc2VJblF1YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0fSxlYXNlT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuLTEqKCh0PXQvMS0xKSp0KnQqdC0xKX0sZWFzZUluT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQvPS41KTwxPy41KnQqdCp0KnQ6LTAuNSooKHQtPTIpKnQqdCp0LTIpfSxlYXNlSW5RdWludDpmdW5jdGlvbih0KXtyZXR1cm4gMSoodC89MSkqdCp0KnQqdH0sZWFzZU91dFF1aW50OmZ1bmN0aW9uKHQpe3JldHVybiAxKigodD10LzEtMSkqdCp0KnQqdCsxKX0sZWFzZUluT3V0UXVpbnQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQvPS41KTwxPy41KnQqdCp0KnQqdDouNSooKHQtPTIpKnQqdCp0KnQrMil9LGVhc2VJblNpbmU6ZnVuY3Rpb24odCl7cmV0dXJuLTEqTWF0aC5jb3ModC8xKihNYXRoLlBJLzIpKSsxfSxlYXNlT3V0U2luZTpmdW5jdGlvbih0KXtyZXR1cm4gMSpNYXRoLnNpbih0LzEqKE1hdGguUEkvMikpfSxlYXNlSW5PdXRTaW5lOmZ1bmN0aW9uKHQpe3JldHVybi0wLjUqKE1hdGguY29zKE1hdGguUEkqdC8xKS0xKX0sZWFzZUluRXhwbzpmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/MToxKk1hdGgucG93KDIsMTAqKHQvMS0xKSl9LGVhc2VPdXRFeHBvOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD8xOjEqKC1NYXRoLnBvdygyLC0xMCp0LzEpKzEpfSxlYXNlSW5PdXRFeHBvOmZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD8wOjE9PT10PzE6KHQvPS41KTwxPy41Kk1hdGgucG93KDIsMTAqKHQtMSkpOi41KigtTWF0aC5wb3coMiwtMTAqLS10KSsyKX0sZWFzZUluQ2lyYzpmdW5jdGlvbih0KXtyZXR1cm4gdD49MT90jNzvVr87AQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANEEeQABABmm/wKgHNsCoB2CVKR/1w0wbhlH9lyCAEAFWYxMAAAEBCAoAo165AE2ltIzc71b4OwEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHzl20AAQAaoucCoB2DAqAc2H/WVKVH9lyDDTBuGgBAA7axVAAABAQgKAE2ltACjXrY6LTEqKE1hdGguc3FydCgxLSh0Lz0xKSp0KS0xKX0sZWFzZU91dENpcmM6ZnVuY3Rpb24odCl7cmV0dXJuIDEqTWF0aC5zcXJ0KDEtKHQ9dC8xLTEpKnQpfSxlYXNlSW5PdXRDaXJjOmZ1bmN0aW9uKHQpe3JldHVybih0Lz0uNSk8MT8tMC41KihNYXRoLnNxcnQoMS10KnQpLTEpOi41KihNYXRoLnNxcnQoMS0odC09MikqdCkrMSl9LGVhc2VJbkVsYXN0aWM6ZnVuY3Rpb24odCl7dmFyIGk9MS43MDE1OCxlPTAscz0xO3JldHVybiAwPT09dD8wOjE9PSh0Lz0xKT8xOihlfHwoZT0uMyksczxNYXRoLmFicygxKT8ocz0xLGk9ZS80KTppPWUvKDIqTWF0aC5QSSkqTWF0aC5hc2luKDEvcyksLShzKk1hdGgucG93KDIsMTAqKHQtPTEpKSpNYXRoLnNpbigoMSp0LWkpKigyKk1hdGguUEkpL2UpKSl9LGVhc2VPdXRFbGFzdGljOmZ1bmN0aW9uKHQpe3ZhciBpPTEuNzAxNTgsZT0wLHM9MTtyZXR1cm4gMD09PXQ/MDoxPT0odC89MSk/MTooZXx8KGU9LjMpLHM8TWF0aC5hYnMoMSk/KHM9MSxpPWUvNCk6aT1lLygyKk1hdGguUEkpKk1hdGguYXNpbigxL3MpLHMqTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKDEqdC1pKSooMipNYXRoLlBJKS9lKSsxKX0sZWFzZUluT3V0RWxhc3RpYzpmdW5jdGlvbih0KXt2YXIgaT0xLjcwMTU4LGU9MCxzPTE7cmV0dXJuIDA9PT10PzA6Mj09KHQvPS41KT8xOihlfHwoZT0xKiguMyoxLjUpKSxzPE1hdGguYWJzKDEpPyhzPTEsaT1lLzQpOmk9ZS8oMipNYXRoLlBJKSpNYXRoLmFzaW4oMS9zKSwxPnQ/LS41KihzKk1hdGgucG93KDIsMTAqKHQtPTEpKSpNYXRoLnNpbigoMSp0LWkpKigyKk1hdGguUEkpL2UpKTpzKk1hdGgucG93KDIsLTEwKih0LT0xKSkqTWF0aC5zaW4oKDEqdC1pKSooMipNYXRoLlBJKS9lKSouNSsxKX0sZWFzZUluQmFjazpmdW5jdGlvbih0KXt2YXIgaT0xLjcwMTU4O3JldHVybiAxKih0Lz0xKSp0KigoaSsxKSp0LWkpfSxlYXNlT3V0QmFjazpmdW5jdGlvbih0KXt2YXIgaT0xLjcwMTU4O3JldHVybiAxKigodD10LzEtMSkqdCooKGkrMSkqdCtpKSsxKX0sZWFzZUluT3V0QmFjazpmdW5jdGlvbih0KXt2YXIgaT0xLjcwMTU4O3JldHVybih0Lz0uNSk8MT8uNSoodCp0KigoKGkqPTEuNTI1KSsxKSp0LWkpKTouNSooKHQtPTIpKnQqKCgoaSo9MS41MjUpKzEpKnQraSkrMil9LGVhc2VJbkJvdW5jZTpmdW5jdGlvbih0KXtyZXR1cm4gMS1iLmVhc2VPdXRCb3VuY2UoMS10KX0sZWFzZU91dEJvdW5jZTpmdW5jdGlvbih0KXtyZXR1cm4odC89MSk8MS8yLjc1PzEqKDcuNTYyNSp0KnQpOjIvMi43NT50PzEqKDcuNTYyNSoodC09MS41LzIuNzUpKnQrLjc1KToyLjUvMi43NT50PzEqKDcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1KToxKig3LjU2MjUqKHQtPTIuNjI1LzIuNzUpKnQrLjk4NDM3NSl9LGVhc2VJbk91dEJvdW5jZTpmdW5jdGlvbih0KXtyZXR1cm4uNT50Py41KmIuZWFzZUluQm91bmNlKDIqdCk6LjUqYi5lYXNlT3V0Qm91bmNlKDIqdC0xKSsuNX19KSx3PXMucmVxdWVzdEFuaW1GcmFtZT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LnNldFRpbWVvdXQodCwxZTMvNjApfX0oKSxQPShzLmNhbmNlbEFuaW1GcmFtZT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cub0NhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24odCl7cmV0dXJuIHdpbmRvdy5jbGVhclRpbWVvdXQodCwxZTMvNjApfX0oKSxzLmFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24odCxpLGUscyxuLG8pe3ZhciBhPTAsaD1iW2VdfHxiLmxpbmVhcixsPWZ1bmN0aW9uKCl7YSsrO3ZhciBlPWEvaSxyPWgoZSk7dC5jYWxsKG8scixlLGEpLHMuY2FsbChvLHIsZSksaT5hP28uYW5pbWF0aW9uRnJhbWU9dyhsKTpuLmFwcGx5KG8pfTt3KGwpfSxzLmdldFJlbGF0aXZlUG9zaXRpb249ZnVuY3Rpb24odCl7dmFyIGksZSxzPXQub3JpZ2luYWxFdmVudHx8dCxuPXQuY3VycmVudFRhcmdldHx8dC5zcmNFbGVtZW50LG89bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gcy50b3VjaGVzPyhpPXMudG91Y2hlc1swXS5jbGllbnRYLW8ubGVmdCxlPXMudG91Y2hlc1swXS5jbGllbnRZLW8udG9wKTooaT1zLmNsaWVudFgtby5sZWZ0LGU9cy5jbGllbnRZLW8udG9wKSx7eDppLHk6ZX19LHMuYWRkRXZlbnQ9ZnVuY3Rpb24odCxpLGUpe3QuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIoaSxlKTp0LmF0dGFjaEV2ZW50P3QuYXR0YWNoRXZlbnQoIm9uIitpLGUpOnRbIm9uIitpXT1lfSksTD1zLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKHQsaSxlKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXI/dC5yZW1vdmVFdmVudExpc3RlbmVyKGksZSwhMSk6dC5kZXRhY2hFdmVudD90LmRldGFjaEV2ZW50KCJvbiIraSxlKTp0WyJvbiIraV09Y30saz0ocy5iaW5kRXZlbnRzPWZ1bmN0aW9uKHQsaSxlKXt0LmV2ZW50c3x8KHQuZXZlbnRzPXt9KSxuKGksZnVuY3Rpb24oaSl7dC5ldmVudHNbaV09ZnVuY3Rpb24oKXtlLmFwcGx5KHQsYXJndW1lbnRzKX0sUCh0LmNoYXJ0LmNhbnZhcyxpLHQuZXZlbnRzW2ldKX0pfSxzLnVuYmluZEV2ZW50cz1mdW5jdGlvbih0LGkpe24oaSxmdW5jdGlvbihpLGUpe0wodC5jaGFydC5jYW52YXMsZSxpKX0pfSksRj1zLmdldE1heGltdW1XaWR0aD1mdW5jdGlvbih0KXt2YXIgaT10LnBhcmVudE5vZGUsZT1wYXJzZUludChSKGksInBhZGRpbmctbGVmdCIpKStwYXJzZUludChSKGksInBhZGRpbmctcmlnaHQiKSk7cmV0dXJuIGkuY2xpZW50V2lkdGgtZX0sQT1zLmdldE1heGltdW1IZWlnaHQ9ZnVuY3Rpb24odCl7dmFyIGk9dC5wYXJlbnROb2RlLGU9cGFyc2VJbnQoUihpLCJwYWRkaW5nLWJvdHRvbSIpKStwYXJzZUludChSKGksInBhZGRpbmctdG9wIikpO3JldHVybiBpLmNsaWVudEhlaWdodC1lfSxSPXMuZ2V0U3R5bGU9ZnVuY3Rpb24odCxpKXtyZXR1cm4gdC5jdXJyZW50U3R5bGU/dC5jdXJyZW50U3R5bGVbaV06ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoaSl9LFQ9KHMuZ2V0TWF4aW11bVNpemU9cy5nZXRNYXhpbXVtV2lkdGgscy5yZXRpbmFTY2FsZT1mdW5jdGlvbih0KXt2YXIgaT10LmN0eCxlPXQuY2FudmFzLndpZHRoLHM9dC5jYW52YXMuaGVpZ2h0O3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvJiYoaS5jYW52YXMuc3R5bGUud2lkdGg9ZSsicHgiLGkuY2FudmFzLnN0eWxlLmhlaWdodD1zKyJweCIsaS5jYW52YXMuaGVpZ2h0PXMqd2luZG93LmRldmljZVBpeGVsUmF0aW8saS5jYW52YXMud2lkdGg9ZSp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxpLnNjYWxlKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSl9KSxNPXMuY2xlYXI9ZnVuY3Rpb24odCl7dC5jdHguY2xlYXJSZWN0KDAsMCx0LndpZHRoLHQuaGVpZ2h0KX0sVz1zLmZvbnRTdHJpbmc9ZnVuY3Rpb24odCxpLGUpe3JldHVybiBpKyIgIit0KyJweCAiK2V9LHo9cy5sb25nZXN0VGV4dD1mdW5jdGlvbih0LGksZSl7dC5mb250PWk7dmFyIHM9MDtyZXR1cm4gbihlLGZ1bmN0aW9uKGkpe3ZhciBlPXQubWVhc3VyZVRleHQoaSkud2lkdGg7cz1lPnM/ZTpzfSksc30sQj1zLmRyYXdSb3VuZGVkUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsaSxlLHMsbixvKXt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGkrbyxlKSx0LmxpbmVUbyhpK3MtbyxlKSx0LnF1YWRyYXRpY0N1cnZlVG8oaStzLGUsaStzLGUrbyksdC5saW5lVG8oaStzLGUrbi1vKSx0LnF1YWRyYXRpY0N1cnZlVG8oaStzLGUrbixpK3MtbyxlK24pLHQubGluZVRvKGkrbyxlK24pLHQucXVhZHJhdGljQ3VydmVUbyhpLGUrbixpLGUrbi1vKSx0LmxpbmVUbyhpLGUrbyksdC5xdWFkcmF0aWNDdXJ2ZVRvKGksZSxpK28sZSksdC5jbG9zZVBhdGgoKX07ZS5pbnN0YW5jZXM9e30sZS5UeXBlPWZ1bmN0aW9uKHQsaSxzKXt0aGlzLm9wdGlvbnM9aSx0aGlzLmNoYXJ0PXMsdGhpcy5pZD11KCksZS5pbnN0YW5jZXNbdGhpcy5pZF09dGhpcyxpLnJlc3BvbnNpdmUmJnRoaXMucmVzaXplKCksdGhpcy5pbml0aWFsaXplLmNhbGwodGhpcyx0KX0sYShlLlR5cGUucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIE0odGhpcy5jaGFydCksdGhpc30sc3RvcDpmdW5jdGlvbigpe3JldHVybiBlLmFuaW1hdGlvblNlcnZpY2UuY2FuY2VsQW5pbWF0aW9uKHRoaXMpLHRoaXN9LHJlc2l6ZTpmdW5jdGlvbih0KXt0aGlzLnN0b3AoKTt2YXIgaT10aGlzLmNoYXJ0LmNhbnZhcyxlPUYodGhpcy5jaGFydC5jYW52YXMpLHM9dGhpcy5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8/ZS90aGlzLmNoYXJ0LmFzcGVjdFJhdGlvOkEodGhpcy5jaGFydC5jYW52YXMpO3JldHVybiBpLndpZHRoPXRoaXMuY2hhcnQud2lkdGg9ZSxpLmhlaWdodD10aGlzLmNoYXJ0LmhlaWdodD1zLFQodGhpcy5jaGFydCksImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpLHRoaXN9LHJlZmxvdzpjLHJlbmRlcjpmdW5jdGlvbih0KXtpZih0JiZ0aGlzLnJlZmxvdygpLHRoaXMub3B0aW9ucy5hbmltYXRpb24mJiF0KXt2YXIgaT1uZXcgZS5BbmltYXRpb247aS5udW1TdGVwcz10aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3RlcHMsaS5lYXNpbmc9dGhpcy5vcHRpb25zLmFuaW1hdGlvbkVhc2luZyxpLnJlbmRlcj1mdW5jdGlvbih0LGkpe3ZhciBlPXMuZWFzaW5nRWZmZWN0c1tpLmVhc2luZ10sbj1pLmN1cnJlbnRTdGVwL2kubnVtU3RlcHMsbz1lKG4pO3QuZHJhdyhvLG4saS5jdXJyZW50U3RlcCl9LGkub25BbmltYXRpb25Qcm9ncmVzcz10aGlzLm9wdGlvbnMub25BbmltYXRpb25Qcm9ncmVzcyxpLm9uQW5pbWF0aW9uQ29tcGxldGU9dGhpcy5vcHRpb25zLm9uQW5pbWF0aW9uQ29tcGxldGUsZS5hbmltYXRpb25TZXJ2aWNlLmFkZEFuaW1hdGlvbih0aGlzLGkpfWVsc2UgdGhpcy5kcmF3KCksdGhpcy5vcHRpb25zLm9uQW5pbWF0aW9uQ29tcGxldGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc30sZ2VuZXJhdGVMZWdlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gQyh0aGlzLm9wdGlvbnMubGVnZW5kVGVtcGxhdGUsdGhpcyl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCksayh0aGlzLHRoaXMuZXZlbnRzKTt2YXIgdD10aGlzLmNoYXJ0LmNhbnZhczt0LndpZHRoPXRoaXMuY2hhcnQud2lkdGgsdC5oZWlnaHQ9dGhpcy5jaGFydC5oZWlnaHQsdC5zdHlsZS5yZW1vdmVQcm9wZXJ0eT8odC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgid2lkdGgiKSx0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKSk6KHQuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJ3aWR0aCIpLHQuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJoZWlnaHQiKSksZGVsZXRlIGUuaW5zdGFuY2VzW3RoaXMuaWRdfSxzaG93VG9vbHRpcDpmdW5jdGlvbih0LGkpeyJ1bmRlZmluZWQiPT10eXBlb2YgdGhpcy5hY3RpdmVFbGVtZW50cyYmKHRoaXMuYWN0aXZlRWxlbWVudHM9W10pO3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBpPSExO3JldHVybiB0Lmxlbmd0aCE9PXRoaXMuYWN0aXZlRWxlbWVudHMubGVuZ3RoP2k9ITA6KG4odCxmdW5jdGlvbih0LGUpe3QhPT10aGlzLmFjdGl2ZUVsZW1lbnRzW2VdJiYoaT0hMCl9LHRoaXMpLGkpfS5jYWxsKHRoaXMsdCk7aWYob3x8aSl7aWYodGhpcy5hY3RpdmVFbGVtZW50cz10LHRoaXMuZHJhdygpLHRoaXMub3B0aW9ucy5jdXN0b21Ub29sdGlwcyYmdGhpcy5vcHRpb25zLmN1c3RvbVRvb2x0aXBzKCExKSx0Lmxlbmd0aD4wKWlmKHRoaXMuZGF0YXNldHMmJnRoaXMuZGF0YXNldHMubGVuZ3RoPjEpe2Zvcih2YXIgYSxoLHI9dGhpcy5kYXRhc2V0cy5sZW5ndGgtMTtyPj0wJiYoYT10aGlzLmRhdGFzZXRzW3JdLnBvaW50c3x8dGhpcy5kYXRhc2V0c1tyXS5iYXJzfHx0aGlzLmRhdGFzZXRzW3JdLnNlZ21lbnRzLGg9bChhLHRbMF0pLC0xPT09aCk7ci0tKTt2YXIgYz1bXSx1PVtdLGQ9ZnVuY3Rpb24odCl7dmFyIGksZSxuLG8sYSxsPVtdLHI9W10sZD1bXTtyZXR1cm4gcy5lYWNoKHRoaXMuZGF0YXNldHMsZnVuY3Rpb24odCl7aT10LnBvaW50c3x8dC5iYXJzfHx0LnNlZ21lbnRzLGlbaF0mJmlbaF0uaGFzVmFsdWUoKSYmbC5wdXNoKGlbaF0pfSkscy5lYWNoKGwsZnVuY3Rpb24odCl7ci5wdXNoKHQueCksZC5wdXNoKHQueSksYy5wdXNoKHMudGVtcGxhdGUodGhpcy5vcHRpb25zLm11bHRpVG9vbHRpcFRlbXBsYXRlLHQpKSx1LnB1c2goe2ZpbGw6dC5fc2F2ZWQuZmlsbENvbG9yfHx0LmZpbGxDb2xvcixzdHJva2U6dC5fc2F2ZWQuc3Ryb2tlQ29sb3J8fHQuc3Ryb2tlQ29sb3J9KX0sdGhpcyksYT1tKGQpLG49ZyhkKSxvPW0ociksZT1nKHIpLHt4Om8+dGhpcy5jaGFydC53aWR0aC8yP286ZSx5OihhK24pLzJ9fS5jYWxsKHRoaXMsaCk7bmV3IGUuTXVsdGlUb29sdGlwKHt4OmQueCx5OmQueSx4UGFkZGluZzp0aGlzLm9wdGlvbnMudG9vbHRpcFhQYWRkaW5nLHlQYWRkaW5nOnRoaXMub3B0aW9ucy50b29sdGlwWVBhZGRpbmcseE9mZnNldDp0aGlzLm9wdGlvbnMudG9vbHRpcFhPZmZzZXQsZmlsbENvbG9yOnRoaXMub3B0aW9ucy50b29sdGlwRmlsbENvbG9yLHRleHRDb2xvcjp0aGlzLm9wdGlvbnMudG9vbHRpcEZvbnRDb2xvcixmb250RmFtaWx5OnRoaXMub3B0aW9ucy50b29sdGlwRm9udEZhbWlseSxmb250U3R5bGU6dGhpcy5vcHRpb25zLnRvb2x0aXBGb250U3R5bGUsZm9udFNpemU6dGhpcy5vcHRpb25zLnRvb2x0aXBGb250U2l6ZSx0aXRsZVRleHRDb2xvcjp0aGlzLm9wdGlvbnMudG9vbHRpcFRpdGxlRm9udENvbG9yLHRpdGxlRm9udEZhbWlseTp0aGlzLm9wdGlvbnMudG9vbHRpcFRpdGxlRm9udEZhbWlseSx0aXRsZUZvbnRTdHlsZTp0aGlzLm9wdGlvbnMudG9vbHRpcFRpdGxlRm9udFN0eWxlLHRpdGxlRm9udFNpemU6dGhpcy5vcHRpb25zLnRvb2x0jNzvVjE8AQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANEEfQABABmm+wKgHNsCoB2CVKR/1w0wbhlH9s2iAEAHHRloAAAEBCAoAo165AE2ltIzc71YcUgEA2icAANonAABo9ygf0sUIACetHhMIAEUAJ8zl4EAAQAadZMCoB2DAqAc2H/WVKVH9s2jDTBuGgBAA7belAAABAQgKAE2ltgCjXrlpcFRpdGxlRm9udFNpemUsY29ybmVyUmFkaXVzOnRoaXMub3B0aW9ucy50b29sdGlwQ29ybmVyUmFkaXVzLGxhYmVsczpjLGxlZ2VuZENvbG9yczp1LGxlZ2VuZENvbG9yQmFja2dyb3VuZDp0aGlzLm9wdGlvbnMubXVsdGlUb29sdGlwS2V5QmFja2dyb3VuZCx0aXRsZTpDKHRoaXMub3B0aW9ucy50b29sdGlwVGl0bGVUZW1wbGF0ZSx0WzBdKSxjaGFydDp0aGlzLmNoYXJ0LGN0eDp0aGlzLmNoYXJ0LmN0eCxjdXN0b206dGhpcy5vcHRpb25zLmN1c3RvbVRvb2x0aXBzfSkuZHJhdygpfWVsc2Ugbih0LGZ1bmN0aW9uKHQpe3ZhciBpPXQudG9vbHRpcFBvc2l0aW9uKCk7bmV3IGUuVG9vbHRpcCh7eDpNYXRoLnJvdW5kKGkueCkseTpNYXRoLnJvdW5kKGkueSkseFBhZGRpbmc6dGhpcy5vcHRpb25zLnRvb2x0aXBYUGFkZGluZyx5UGFkZGluZzp0aGlzLm9wdGlvbnMudG9vbHRpcFlQYWRkaW5nLGZpbGxDb2xvcjp0aGlzLm9wdGlvbnMudG9vbHRpcEZpbGxDb2xvcix0ZXh0Q29sb3I6dGhpcy5vcHRpb25zLnRvb2x0aXBGb250Q29sb3IsZm9udEZhbWlseTp0aGlzLm9wdGlvbnMudG9vbHRpcEZvbnRGYW1pbHksZm9udFN0eWxlOnRoaXMub3B0aW9ucy50b29sdGlwRm9udFN0eWxlLGZvbnRTaXplOnRoaXMub3B0aW9ucy50b29sdGlwRm9udFNpemUsY2FyZXRIZWlnaHQ6dGhpcy5vcHRpb25zLnRvb2x0aXBDYXJldFNpemUsY29ybmVyUmFkaXVzOnRoaXMub3B0aW9ucy50b29sdGlwQ29ybmVyUmFkaXVzLHRleHQ6Qyh0aGlzLm9wdGlvbnMudG9vbHRpcFRlbXBsYXRlLHQpLGNoYXJ0OnRoaXMuY2hhcnQsY3VzdG9tOnRoaXMub3B0aW9ucy5jdXN0b21Ub29sdGlwc30pLmRyYXcoKX0sdGhpcyk7cmV0dXJuIHRoaXN9fSx0b0Jhc2U2NEltYWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hhcnQuY2FudmFzLnRvRGF0YVVSTC5hcHBseSh0aGlzLmNoYXJ0LmNhbnZhcyxhcmd1bWVudHMpfX0pLGUuVHlwZS5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcyxzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZihzLnByb3RvdHlwZT1vKGkucHJvdG90eXBlKSxhKHMucHJvdG90eXBlLHQpLHMuZXh0ZW5kPWUuVHlwZS5leHRlbmQsdC5uYW1lfHxpLnByb3RvdHlwZS5uYW1lKXt2YXIgbj10Lm5hbWV8fGkucHJvdG90eXBlLm5hbWUsbD1lLmRlZmF1bHRzW2kucHJvdG90eXBlLm5hbWVdP28oZS5kZWZhdWx0c1tpLnByb3RvdHlwZS5uYW1lXSk6e307ZS5kZWZhdWx0c1tuXT1hKGwsdC5kZWZhdWx0cyksZS50eXBlc1tuXT1zLGUucHJvdG90eXBlW25dPWZ1bmN0aW9uKHQsaSl7dmFyIG89aChlLmRlZmF1bHRzLmdsb2JhbCxlLmRlZmF1bHRzW25dLGl8fHt9KTtyZXR1cm4gbmV3IHModCxvLHRoaXMpfX1lbHNlIGQoIk5hbWUgbm90IHByb3ZpZGVkIGZvciB0aGlzIGNoYXJ0LCBzbyBpdCBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIik7cmV0dXJuIGl9LGUuRWxlbWVudD1mdW5jdGlvbih0KXthKHRoaXMsdCksdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnNhdmUoKX0sYShlLkVsZW1lbnQucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSxyZXN0b3JlOmZ1bmN0aW9uKHQpe3JldHVybiB0P24odCxmdW5jdGlvbih0KXt0aGlzW3RdPXRoaXMuX3NhdmVkW3RdfSx0aGlzKTphKHRoaXMsdGhpcy5fc2F2ZWQpLHRoaXN9LHNhdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2F2ZWQ9byh0aGlzKSxkZWxldGUgdGhpcy5fc2F2ZWQuX3NhdmVkLHRoaXN9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gbih0LGZ1bmN0aW9uKHQsaSl7dGhpcy5fc2F2ZWRbaV09dGhpc1tpXSx0aGlzW2ldPXR9LHRoaXMpLHRoaXN9LHRyYW5zaXRpb246ZnVuY3Rpb24odCxpKXtyZXR1cm4gbih0LGZ1bmN0aW9uKHQsZSl7dGhpc1tlXT0odC10aGlzLl9zYXZlZFtlXSkqaSt0aGlzLl9zYXZlZFtlXX0sdGhpcyksdGhpc30sdG9vbHRpcFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy54LHk6dGhpcy55fX0saGFzVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzLnZhbHVlKX19KSxlLkVsZW1lbnQuZXh0ZW5kPXIsZS5Qb2ludD1lLkVsZW1lbnQuZXh0ZW5kKHtkaXNwbGF5OiEwLGluUmFuZ2U6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLmhpdERldGVjdGlvblJhZGl1cyt0aGlzLnJhZGl1cztyZXR1cm4gTWF0aC5wb3codC10aGlzLngsMikrTWF0aC5wb3coaS10aGlzLnksMik8TWF0aC5wb3coZSwyKX0sZHJhdzpmdW5jdGlvbigpe2lmKHRoaXMuZGlzcGxheSl7dmFyIHQ9dGhpcy5jdHg7dC5iZWdpblBhdGgoKSx0LmFyYyh0aGlzLngsdGhpcy55LHRoaXMucmFkaXVzLDAsMipNYXRoLlBJKSx0LmNsb3NlUGF0aCgpLHQuc3Ryb2tlU3R5bGU9dGhpcy5zdHJva2VDb2xvcix0LmxpbmVXaWR0aD10aGlzLnN0cm9rZVdpZHRoLHQuZmlsbFN0eWxlPXRoaXMuZmlsbENvbG9yLHQuZmlsbCgpLHQuc3Ryb2tlKCl9fX0pLGUuQXJjPWUuRWxlbWVudC5leHRlbmQoe2luUmFuZ2U6ZnVuY3Rpb24odCxpKXt2YXIgZT1zLmdldEFuZ2xlRnJvbVBvaW50KHRoaXMse3g6dCx5Oml9KSxuPWUuYW5nbGUlKDIqTWF0aC5QSSksbz0oMipNYXRoLlBJK3RoaXMuc3RhcnRBbmdsZSklKDIqTWF0aC5QSSksYT0oMipNYXRoLlBJK3RoaXMuZW5kQW5nbGUpJSgyKk1hdGguUEkpfHwzNjAsaD1vPmE/YT49bnx8bj49bzpuPj1vJiZhPj1uLGw9ZS5kaXN0YW5jZT49dGhpcy5pbm5lclJhZGl1cyYmZS5kaXN0YW5jZTw9dGhpcy5vdXRlclJhZGl1cztyZXR1cm4gaCYmbH0sdG9vbHRpcFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdGFydEFuZ2xlKyh0aGlzLmVuZEFuZ2xlLXRoaXMuc3RhcnRBbmdsZSkvMixpPSh0aGlzLm91dGVyUmFkaXVzLXRoaXMuaW5uZXJSYWRpdXMpLzIrdGhpcy5pbm5lclJhZGl1cztyZXR1cm57eDp0aGlzLngrTWF0aC5jb3ModCkqaSx5OnRoaXMueStNYXRoLnNpbih0KSppfX0sZHJhdzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmN0eDtpLmJlZ2luUGF0aCgpLGkuYXJjKHRoaXMueCx0aGlzLnksdGhpcy5vdXRlclJhZGl1czwwPzA6dGhpcy5vdXRlclJhZGl1cyx0aGlzLnN0YXJ0QW5nbGUsdGhpcy5lbmRBbmdsZSksaS5hcmModGhpcy54LHRoaXMueSx0aGlzLmlubmVyUmFkaXVzPDA/MDp0aGlzLmlubmVyUmFkaXVzLHRoaXMuZW5kQW5nbGUsdGhpcy5zdGFydEFuZ2xlLCEwKSxpLmNsb3NlUGF0aCgpLGkuc3Ryb2tlU3R5bGU9dGhpcy5zdHJva2VDb2xvcixpLmxpbmVXaWR0aD10aGlzLnN0cm9rZVdpZHRoLGkuZmlsbFN0eWxlPXRoaXMuZmlsbENvbG9yLGkuZmlsbCgpLGkubGluZUpvaW49ImJldmVsIix0aGlzLnNob3dTdHJva2UmJmkuc3Ryb2tlKCl9fSksZS5SZWN0YW5nbGU9ZS5FbGVtZW50LmV4dGVuZCh7ZHJhdzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY3R4LGk9dGhpcy53aWR0aC8yLGU9dGhpcy54LWkscz10aGlzLngraSxuPXRoaXMuYmFzZS0odGhpcy5iYXNlLXRoaXMueSksbz10aGlzLnN0cm9rZVdpZHRoLzI7dGhpcy5zaG93U3Ryb2tlJiYoZSs9byxzLT1vLG4rPW8pLHQuYmVnaW5QYXRoKCksdC5maWxsU3R5bGU9dGhpcy5maWxsQ29sb3IsdC5zdHJva2VTdHlsZT10aGlzLnN0cm9rZUNvbG9yLHQubGluZVdpZHRoPXRoaXMuc3Ryb2tlV2lkdGgsdC5tb3ZlVG8oZSx0aGlzLmJhc2UpLHQubGluZVRvKGUsbiksdC5saW5lVG8ocyxuKSx0LmxpbmVUbyhzLHRoaXMuYmFzZSksdC5maWxsKCksdGhpcy5zaG93U3Ryb2tlJiZ0LnN0cm9rZSgpfSxoZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYXNlLXRoaXMueX0saW5SYW5nZTpmdW5jdGlvbih0LGkpe3JldHVybiB0Pj10aGlzLngtdGhpcy53aWR0aC8yJiZ0PD10aGlzLngrdGhpcy53aWR0aC8yJiZpPj10aGlzLnkmJmk8PXRoaXMuYmFzZX19KSxlLkFuaW1hdGlvbj1lLkVsZW1lbnQuZXh0ZW5kKHtjdXJyZW50U3RlcDpudWxsLG51bVN0ZXBzOjYwLGVhc2luZzoiIixyZW5kZXI6bnVsbCxvbkFuaW1hdGlvblByb2dyZXNzOm51bGwsb25BbmltYXRpb25Db21wbGV0ZTpudWxsfSksZS5Ub29sdGlwPWUuRWxlbWVudC5leHRlbmQoe2RyYXc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNoYXJ0LmN0eDt0LmZvbnQ9Vyh0aGlzLmZvbnRTaXplLHRoaXMuZm9udFN0eWxlLHRoaXMuZm9udEZhbWlseSksdGhpcy54QWxpZ249ImNlbnRlciIsdGhpcy55QWxpZ249ImFib3ZlIjt2YXIgaT10aGlzLmNhcmV0UGFkZGluZz0yLGU9dC5tZWFzdXJlVGV4dCh0aGlzLnRleHQpLndpZHRoKzIqdGhpcy54UGFkZGluZyxzPXRoaXMuZm9udFNpemUrMip0aGlzLnlQYWRkaW5nLG49cyt0aGlzLmNhcmV0SGVpZ2h0K2k7dGhpcy54K2UvMj50aGlzLmNoYXJ0LndpZHRoP3RoaXMueEFsaWduPSJsZWZ0Ijp0aGlzLngtZS8yPDAmJih0aGlzLnhBbGlnbj0icmlnaHQiKSx0aGlzLnktbjwwJiYodGhpcy55QWxpZ249ImJlbG93Iik7dmFyIG89dGhpcy54LWUvMixhPXRoaXMueS1uO2lmKHQuZmlsbFN0eWxlPXRoaXMuZmlsbENvbG9yLHRoaXMuY3VzdG9tKXRoaXMuY3VzdG9tKHRoaXMpO2Vsc2V7c3dpdGNoKHRoaXMueUFsaWduKXtjYXNlImFib3ZlIjp0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMueCx0aGlzLnktaSksdC5saW5lVG8odGhpcy54K3RoaXMuY2FyZXRIZWlnaHQsdGhpcy55LShpK3RoaXMuY2FyZXRIZWlnaHQpKSx0LmxpbmVUbyh0aGlzLngtdGhpcy5jYXJldEhlaWdodCx0aGlzLnktKGkrdGhpcy5jYXJldEhlaWdodCkpLHQuY2xvc2VQYXRoKCksdC5maWxsKCk7YnJlYWs7Y2FzZSJiZWxvdyI6YT10aGlzLnkraSt0aGlzLmNhcmV0SGVpZ2h0LHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8odGhpcy54LHRoaXMueStpKSx0LmxpbmVUbyh0aGlzLngrdGhpcy5jYXJldEhlaWdodCx0aGlzLnkraSt0aGlzLmNhcmV0SGVpZ2h0KSx0LmxpbmVUbyh0aGlzLngtdGhpcy5jYXJldEhlaWdodCx0aGlzLnkraSt0aGlzLmNhcmV0SGVpZ2h0KSx0LmNsb3NlUGF0aCgpLHQuZmlsbCgpfXN3aXRjaCh0aGlzLnhBbGlnbil7Y2FzZSJsZWZ0IjpvPXRoaXMueC1lKyh0aGlzLmNvcm5lclJhZGl1cyt0aGlzLmNhcmV0SGVpZ2h0KTticmVhaztjYXNlInJpZ2h0IjpvPXRoaXMueC0odGhpcy5jb3JuZXJSYWRpdXMrdGhpcy5jYXJldEhlaWdodCl9Qih0LG8sYSxlLHMsdGhpcy5jb3JuZXJSYWRpdXMpLHQuZmlsbCgpLHQuZmlsbFN0eWxlPXRoaXMudGV4dENvbG9yLHQudGV4dEFsaWduPSJjZW50ZXIiLHQudGV4dEJhc2VsaW5lPSJtaWRkbGUiLHQuZmlsbFRleHQodGhpcy50ZXh0LG8rZS8yLGErcy8yKX19fSksZS5NdWx0aVRvb2x0aXA9ZS5FbGVtZW50LmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuZm9udD1XKHRoaXMuZm9udFNpemUsdGhpcy5mb250U3R5bGUsdGhpcy5mb250RmFtaWx5KSx0aGlzLnRpdGxlRm9udD1XKHRoaXMudGl0bGVGb250U2l6ZSx0aGlzLnRpdGxlRm9udFN0eWxlLHRoaXMudGl0bGVGb250RmFtaWx5KSx0aGlzLnRpdGxlSGVpZ2h0PXRoaXMudGl0bGU/MS41KnRoaXMudGl0bGVGb250U2l6ZTowLHRoaXMuaGVpZ2h0PXRoaXMubGFiZWxzLmxlbmd0aCp0aGlzLmZvbnRTaXplKyh0aGlzLmxhYmVscy5sZW5ndGgtMSkqKHRoaXMuZm9udFNpemUvMikrMip0aGlzLnlQYWRkaW5nK3RoaXMudGl0bGVIZWlnaHQsdGhpcy5jdHguZm9udD10aGlzLnRpdGxlRm9udDt2YXIgdD10aGlzLmN0eC5tZWFzdXJlVGV4dCh0aGlzLnRpdGxlKS53aWR0aCxpPXoodGhpcy5jdHgsdGhpcy5mb250LHRoaXMubGFiZWxzKSt0aGlzLmZvbnRTaXplKzMsZT1nKFtpLHRdKTt0aGlzLndpZHRoPWUrMip0aGlzLnhQYWRkaW5nO3ZhciBzPXRoaXMuaGVpZ2h0LzI7dGhpcy55LXM8MD90aGlzLnk9czp0aGlzLnkrcz50aGlzLmNoYXJ0LmhlaWdodCYmKHRoaXMueT10aGlzLmNoYXJ0LmhlaWdodC1zKSx0aGlzLng+dGhpcy5jaGFydC53aWR0aC8yP3RoaXMueC09dGhpcy54T2Zmc2V0K3RoaXMud2lkdGg6dGhpcy54Kz10aGlzLnhPZmZzZXR9LGdldExpbmVIZWlnaHQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy55LXRoaXMuaGVpZ2h0LzIrdGhpcy55UGFkZGluZyxlPXQtMTtyZXR1cm4gMD09PXQ/aSt0aGlzLnRpdGxlSGVpZ2h0LzM6aSsoMS41KnRoaXMuZm9udFNpemUqZSt0aGlzLmZvbnRTaXplLzIpK3RoaXMudGl0bGVIZWlnaHR9LGRyYXc6ZnVuY3Rpb24oKXtpZih0aGlzLmN1c3RvbSl0aGlzLmN1c3RvbSh0aGlzKTtlbHNle0IodGhpcy5jdHgsdGhpcy54LHRoaXMueS10aGlzLmhlaWdodC8yLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQsdGhpcy5jb3JuZXJSYWRpdXMpO3ZhciB0PXRoaXMuY3R4O3QuZmlsbFN0eWxlPXRoaXMuZmlsbENvbG9yLHQuZmlsbCgpLHQuY2xvc2VQYXRoKCksdC50ZXh0QWxpZ249ImxlZnQiLHQudGV4dEJhc2VsaW5lPSJtaWRkbGUiLHQuZmlsbFN0eWxlPXRoaXMudGl0bGVUZXh0Q29sb3IsdC5mb250PXRoaXMudGl0bGVGb250LHQuZmlsbFRleHQodGhpcy50aXRsZSx0aGlzLngrdGhpcy54UGFkZGluZyx0aGlzLmdldExpbmVIZWlnaHQoMCkpLHQuZm9udD10aGlzLmZvbnQscy5lYWNoKHRoaXMubGFiZWxzLGZ1bmN0aW9uKGksZSl7dC5maWxsU3R5bGU9dGhpcy50ZXh0Q29sb3IsdC5maWxsVGV4dChpLHRoaXMueCt0aGlzLnhQYWRkaW5nK3RoaXMuZm9udFNpemUrMyx0aGlzLmdldExpbmVIZWlnaHQoZSsxKSksdC5maWxsU3R5bGU9dGhpcy5sZWdlbmRDb2xvckJhY2tncm91bmQsdC5maWxsUmVjdCh0aGlzLngrdGhpcy54UGFkZGluZyx0aGlzLmdldExpbmVIZWlnaHQoZSsxKS10aGlzLmZvbnRTaXplLzIsdGhpcy5mb250U2l6ZSx0aGlzLmZvbnRTaXplKSx0LmZpbGxTdHlsZT10aGlzLmxlZ2VuZENvbG9yc1tlXS5maWxsLHQuZmlsbFJlY3QodGhpcy54K3RoaXMueFBhZGRpbmcsdGhpcy5nZXRMaW5lSGVpZ2h0KGUrMSktdGhpcy5mb250U2l6ZS8yLHRoaXMuZm9udFNpemUsdGhpcy5mb250U2l6ZSl9LHRoaXMpfX19KSxlLlNjYWxlPWUuRWxlbWVudC5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmZpdCgpfSxidWlsZFlMYWJlbHM6ZnVuY3Rpb24oKXt0aGlzLnlMYWJlbHM9W107Zm9yKHZhciB0PXYodGhpcy5zdGVwVmFsdWUpLGk9MDtpPD10aGlzLnN0ZXBzO2krKyl0aGlzLnlMYWJlbHMucHVzaChDKHRoaXMudGVtcGxhdGVTdHJpbmcse3ZhbHVlOih0aGlzLm1pbitpKnRoaXMuc3RlcFZhbHVlKS50b0ZpeGVkKHQpfSkpO3RoaXMueUxhYmVsV2lkdGg9dGhpcy5kaXNwbGF5JiZ0aGlzLnNob3dMYWJlbHM/eih0aGlzLmN0eCx0aGlzLmZvbnQsdGhpcy55TGFiZWxzKSsxMDowfSxhZGRYTGFiZWw6ZnVuY3Rpb24odCl7dGhpcy54TGFiZWxzLnB1c2godCksdGhpcy52YWx1ZXNDb3VudCsrLHRoaXMuZml0KCl9LHJlbW92ZVhMYWJlbDpmdW5jdGlvbigpe3RoaXMueExhYmVscy5zaGlmdCgpLHRoaXMudmFsdWVzQ291bnQtLSx0aGlzLmZpdCgpfSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXJ0UG9pbnQ9dGhpcy5kaXNwbGF5P3RoaXMuZm9udFNpemU6MCx0aGlzLmVuZFBvaW50PXRoaXMuZGlzcGxheT90aGlzLmhlaWdodC0xLjUqdGhpcy5mb250U2l6ZS01OnRoaXMuaGVpZ2h0LHRoaXMuc3RhcnRQb2ludCs9dGhpcy5wYWRkaW5nLHRoaXMuZW5kUG9pbnQtPXRoaXMucGFkZGluZzt2YXIgdCxpPXRoaXMuZW5kUG9pbnQsZT10aGlzLmVuZFBvaW50LXRoaXMuc3RhcnRQb2ludDtmb3IodGhpcy5jYWxjdWxhdGVZUmFuZ2UoZSksdGhpcy5idWlsZFlMYWJlbHMoKSx0aGlzLmNhbGN1bGF0ZVhMYWJlbFJvdGF0aW9uKCk7ZT50aGlzLmVuZFBvaW50LXRoaXMuc3RhcnRQb2ludDspZT10aGlzLmVuZFBvaW50LXRoaXMuc3RhcnRQb2ludCx0PXRoaXMueUxhYmVsV2lkdGgsdGhpcy5jYWxjdWxhdGVZUmFuZ2UoZSksdGhpcy5idWlsZFlMYWJlbHMoKSx0PHRoaXMueUxhYmVsV2lkdGgmJih0aGlzLmVuZFBvaW50PWksdGhpcy5jYWxjdWxhdGVYTGFiZWxSb3RhdGlvbigpKX0sY2FsY3VsYXRlWExhYmVsUm90YXRpb246ZnVuY3Rpb24oKXt0aGlzLmN0eC5mb250PXRoaXMuZm9udDt2YXIgdCxpLGU9dGhpcy5jdHgubWVhc3VyZVRleHQodGhpcy54TGFiZWxzWzBdKS53aWR0aCxzPXRoaXMuY3R4Lm1lYXN1cmVUZXh0KHRoaXMueExhYmVsc1t0aGlzLnhMYWJlbHMubGVuZ3RoLTFdKS53aWR0aDtpZih0aGlzLnhTY2FsZVBhZGRpbmdSaWdodD1zLzIrMyx0aGlzLnhTY2FsZVBhZGRpbmdMZWZ0PWUvMj50aGlzLnlMYWJlbFdpZHRoP2UvMjp0aGlzLnlMYWJlbFdpZHRoLHRoaXMueExhYmVsUm90YXRpb249MCx0aGlzLmRpc3BsYXkpe3ZhciBuLG89eih0aGlzLmN0eCx0aGlzLmZvbnQsdGhpcy54TGFiZWxzKTt0aGlzLnhMYWJlbFdpZHRoPW87Zm9yKHZhciBhPU1hdGguZmxvb3IodGhpcy5jYWxjdWxhdGVYKDEpLXRoaXMuY2FsY3VsYXRlWCgwKSktNjt0aGlzLnhMYWJlbFdpZHRoPmEmJjA9PT10aGlzLnhMYWJlbFJvdGF0aW9ufHx0aGlzLnhMYWJlbFdpZHRoPmEmJnRoaXMueExhYmVsUm90YXRpb248PTkwJiZ0aGlzLnhMYWJlbFJvdGF0aW9uPjA7KW49TWF0aC5jb3MoUyh0aGlzLnhMYWJlbFJvdGF0aW9uKSksdD1uKmUsaT1uKnMsdCt0aGlzLmZvbnRTaXplLzI+dGhpcy55TGFiZWxXaWR0aCYmKHRoaXMueFNjYWxlUGFkZGluZ0xlZnQ9dCt0aGlzLmZvbnRTaXplLzIpLHRoaXMueFNjYWxlUGFkZGluZ1JpZ2h0PXRoaXMuZm9udFNpemUvMix0aGlzLnhMYWJlbFJvdGF0aW9uKyssdGhpcy54TGFiZWxXaWR0aD1uKm87dGhpcy54TGFiZWxSb3RhdGlvbj4wJiYodGhpcy5lbmRQb2ludC09TWF0aC5zaW4oUyh0aGlzLnhMYWJlbFJvdGF0aW9uKSkqbyszKX1lbHNlIHRoaXMueExhYmVsV2lkdGg9MCx0aGlzLnhTY2FsZVBhZGRpbmdSaWdodD10aGlzLnBhZGRpbmcsdGhpcy54U2NhbGVQYWRkaW5nTGVmdD10aGlzLnBhZGRpbmd9LGNhbGN1bGF0ZVlSYW5nZTpjLGRyYXdpbmdBcmVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRQb2ludC10aGlzLmVuZFBvaW50fSxjYWxjdWxhdGVZOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZHJhd2luZ0FyZWEoKS8odGhpcy5taW4tdGhpcy5tYXgpO3JldHVybiB0aGlzLmVuZFBvaW50LWkqKHQtdGhpcy5taW4pfSxjYWxjdWxhdGVYOmZ1bmN0aW9uKHQpe3ZhciBpPSh0aGlzLnhMYWJlbFJvdGF0aW9uPjAsdGhpcy53aWR0aC0odGhpcy54U2NhbGVQYWRkaW5nTGVmdCt0aGlzLnhTY2FsZVBhZGRpbmdSaWdodCkpLGU9aS9NYXRoLm1heCh0aGlzLnZhbHVlc0NvdW50LSh0aGlzLm9mZnNldEdyaWRMaW5lcz8wOjEpLDEpLHM9ZSp0K3RoaXMueFNjYWxlUGFkZGluZ0xlZnQ7cmV0dXJuIHRoaXMub2Zmc2V0R3JpZExpbmVzJiYocys9ZS8yKSxNYXRoLnJvdW5kKHMpfSx1cGRhdGU6ZnVuY3Rpb24odCl7cy5leHRlbmQodGhpcyx0KSx0aGlzLmZpdCgpfSxkcmF3OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jdHgsaT0odGhpcy5lbmRQb2ludC10aGlzLnN0YXJ0UG9pbnQpL3RoaXMuc3RlcHMsZT1NYXRoLnJvdW5kKHRoaXMueFNjYWxlUGFkZGluZ0xlZnQpO3RoaXMuZGlzcGxheSYmKHQuZmlsbFN0eWxlPXRoaXMudGV4dENvbG9yLHQuZm9udD10aGlzLmZvbnQsbih0aGlzLnlMYWJlbHMsZnVuY3Rpb24obixvKXt2YXIgYT10aGlzLmVuZFBvaW50LWkqbyxoPU1hdGgucm91bmQoYSksbD10aGlzLnNob3dIb3Jpem9udGFsTGluZXM7dC50ZXh0QWxpZ249InJpZ2h0Iix0LnRleHRCYXNlbGluZT0ibWlkZGxlIix0aGlzLnNob3dMYWJlbHMmJnQuZmlsbFRleHQobixlLTEwLGEpLDAhPT1vfHxsfHwobD0hMCksbCYmdC5iZWdpblBhdGgoKSxvPjA/KHQubGluZVdpZHRoPXRoaXMuZ3JpZExpbmVXaWR0aCx0LnN0cm9rZVN0eWxlPXRoaXMuZ3JpZExpbmVDb2xvcik6KHQubGluZVdpZHRoPXRoaXMubGluZVdpZHRoLHQuc3Ryb2tlU3R5bGU9dGhpcy5saW5lQ29sb3IpLGgrPXMuYWxpYXNQaXhlbCh0LmxpbmVXaWR0aCksbCYmKHQubW92ZVRvKGUsaCksdC5saW5lVG8odGhpcy53aWR0aCxoKSx0LnN0cm9rZSgpLHQuY2xvc2VQYXRoKCkpLHQubGluZVdpZHRoPXRoaXMubGluZVdpZHRoLHQuc3Ryb2tlU3R5bGU9dGhpcy5saW5lQ29sb3IsdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhlLTUsaCksdC5saW5lVG8oZSxoKSx0LnN0cm9rZSgpLHQuY2xvc2VQYXRoKCl9LHRoaXMpLG4odGhpcy54TGFiZWxzLGZ1bmN0aW9uKGksZSl7dozc71aFUgEAOhEAADoRAABo9ygf0sUIACetHhMIAEUAESzl50AAQAaz/cCoB2DAqAc2H/WVKVH92wDDTBuGgBgA7aEFAAABAQgKAE2ltgCjXrlhciBzPXRoaXMuY2FsY3VsYXRlWChlKSt4KHRoaXMubGluZVdpZHRoKSxuPXRoaXMuY2FsY3VsYXRlWChlLSh0aGlzLm9mZnNldEdyaWRMaW5lcz8uNTowKSkreCh0aGlzLmxpbmVXaWR0aCksbz10aGlzLnhMYWJlbFJvdGF0aW9uPjAsYT10aGlzLnNob3dWZXJ0aWNhbExpbmVzOzAhPT1lfHxhfHwoYT0hMCksYSYmdC5iZWdpblBhdGgoKSxlPjA/KHQubGluZVdpZHRoPXRoaXMuZ3JpZExpbmVXaWR0aCx0LnN0cm9rZVN0eWxlPXRoaXMuZ3JpZExpbmVDb2xvcik6KHQubGluZVdpZHRoPXRoaXMubGluZVdpZHRoLHQuc3Ryb2tlU3R5bGU9dGhpcy5saW5lQ29sb3IpLGEmJih0Lm1vdmVUbyhuLHRoaXMuZW5kUG9pbnQpLHQubGluZVRvKG4sdGhpcy5zdGFydFBvaW50LTMpLHQuc3Ryb2tlKCksdC5jbG9zZVBhdGgoKSksdC5saW5lV2lkdGg9dGhpcy5saW5lV2lkdGgsdC5zdHJva2VTdHlsZT10aGlzLmxpbmVDb2xvcix0LmJlZ2luUGF0aCgpLHQubW92ZVRvKG4sdGhpcy5lbmRQb2ludCksdC5saW5lVG8obix0aGlzLmVuZFBvaW50KzUpLHQuc3Ryb2tlKCksdC5jbG9zZVBhdGgoKSx0LnNhdmUoKSx0LnRyYW5zbGF0ZShzLG8/dGhpcy5lbmRQb2ludCsxMjp0aGlzLmVuZFBvaW50KzgpLHQucm90YXRlKC0xKlModGhpcy54TGFiZWxSb3RhdGlvbikpLHQuZm9udD10aGlzLmZvbnQsdC50ZXh0QWxpZ249bz8icmlnaHQiOiJjZW50ZXIiLHQudGV4dEJhc2VsaW5lPW8/Im1pZGRsZSI6InRvcCIsdC5maWxsVGV4dChpLDAsMCksdC5yZXN0b3JlKCl9LHRoaXMpKX19KSxlLlJhZGlhbFNjYWxlPWUuRWxlbWVudC5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLnNpemU9bShbdGhpcy5oZWlnaHQsdGhpcy53aWR0aF0pLHRoaXMuZHJhd2luZ0FyZWE9dGhpcy5kaXNwbGF5P3RoaXMuc2l6ZS8yLSh0aGlzLmZvbnRTaXplLzIrdGhpcy5iYWNrZHJvcFBhZGRpbmdZKTp0aGlzLnNpemUvMn0sY2FsY3VsYXRlQ2VudGVyT2Zmc2V0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZHJhd2luZ0FyZWEvKHRoaXMubWF4LXRoaXMubWluKTtyZXR1cm4odC10aGlzLm1pbikqaX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5saW5lQXJjP3RoaXMuZHJhd2luZ0FyZWE9dGhpcy5kaXNwbGF5P3RoaXMuc2l6ZS8yLSh0aGlzLmZvbnRTaXplLzIrdGhpcy5iYWNrZHJvcFBhZGRpbmdZKTp0aGlzLnNpemUvMjp0aGlzLnNldFNjYWxlU2l6ZSgpLHRoaXMuYnVpbGRZTGFiZWxzKCl9LGJ1aWxkWUxhYmVsczpmdW5jdGlvbigpe3RoaXMueUxhYmVscz1bXTtmb3IodmFyIHQ9dih0aGlzLnN0ZXBWYWx1ZSksaT0wO2k8PXRoaXMuc3RlcHM7aSsrKXRoaXMueUxhYmVscy5wdXNoKEModGhpcy50ZW1wbGF0ZVN0cmluZyx7dmFsdWU6KHRoaXMubWluK2kqdGhpcy5zdGVwVmFsdWUpLnRvRml4ZWQodCl9KSl9LGdldENpcmN1bWZlcmVuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gMipNYXRoLlBJL3RoaXMudmFsdWVzQ291bnR9LHNldFNjYWxlU2l6ZTpmdW5jdGlvbigpe3ZhciB0LGksZSxzLG4sbyxhLGgsbCxyLGMsdSxkPW0oW3RoaXMuaGVpZ2h0LzItdGhpcy5wb2ludExhYmVsRm9udFNpemUtNSx0aGlzLndpZHRoLzJdKSxwPXRoaXMud2lkdGgsZz0wO2Zvcih0aGlzLmN0eC5mb250PVcodGhpcy5wb2ludExhYmVsRm9udFNpemUsdGhpcy5wb2ludExhYmVsRm9udFN0eWxlLHRoaXMucG9pbnRMYWJlbEZvbnRGYW1pbHkpLGk9MDtpPHRoaXMudmFsdWVzQ291bnQ7aSsrKXQ9dGhpcy5nZXRQb2ludFBvc2l0aW9uKGksZCksZT10aGlzLmN0eC5tZWFzdXJlVGV4dChDKHRoaXMudGVtcGxhdGVTdHJpbmcse3ZhbHVlOnRoaXMubGFiZWxzW2ldfSkpLndpZHRoKzUsMD09PWl8fGk9PT10aGlzLnZhbHVlc0NvdW50LzI/KHM9ZS8yLHQueCtzPnAmJihwPXQueCtzLG49aSksdC54LXM8ZyYmKGc9dC54LXMsYT1pKSk6aTx0aGlzLnZhbHVlc0NvdW50LzI/dC54K2U+cCYmKHA9dC54K2Usbj1pKTppPnRoaXMudmFsdWVzQ291bnQvMiYmdC54LWU8ZyYmKGc9dC54LWUsYT1pKTtsPWcscj1NYXRoLmNlaWwocC10aGlzLndpZHRoKSxvPXRoaXMuZ2V0SW5kZXhBbmdsZShuKSxoPXRoaXMuZ2V0SW5kZXhBbmdsZShhKSxjPXIvTWF0aC5zaW4obytNYXRoLlBJLzIpLHU9bC9NYXRoLnNpbihoK01hdGguUEkvMiksYz1mKGMpP2M6MCx1PWYodSk/dTowLHRoaXMuZHJhd2luZ0FyZWE9ZC0odStjKS8yLHRoaXMuc2V0Q2VudGVyUG9pbnQodSxjKX0sc2V0Q2VudGVyUG9pbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLndpZHRoLWktdGhpcy5kcmF3aW5nQXJlYSxzPXQrdGhpcy5kcmF3aW5nQXJlYTt0aGlzLnhDZW50ZXI9KHMrZSkvMix0aGlzLnlDZW50ZXI9dGhpcy5oZWlnaHQvMn0sZ2V0SW5kZXhBbmdsZTpmdW5jdGlvbih0KXt2YXIgaT0yKk1hdGguUEkvdGhpcy52YWx1ZXNDb3VudDtyZXR1cm4gdCppLU1hdGguUEkvMn0sZ2V0UG9pbnRQb3NpdGlvbjpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuZ2V0SW5kZXhBbmdsZSh0KTtyZXR1cm57eDpNYXRoLmNvcyhlKSppK3RoaXMueENlbnRlcix5Ok1hdGguc2luKGUpKmkrdGhpcy55Q2VudGVyfX0sZHJhdzpmdW5jdGlvbigpe2lmKHRoaXMuZGlzcGxheSl7dmFyIHQ9dGhpcy5jdHg7aWYobih0aGlzLnlMYWJlbHMsZnVuY3Rpb24oaSxlKXtpZihlPjApe3ZhciBzLG49ZSoodGhpcy5kcmF3aW5nQXJlYS90aGlzLnN0ZXBzKSxvPXRoaXMueUNlbnRlci1uO2lmKHRoaXMubGluZVdpZHRoPjApaWYodC5zdHJva2VTdHlsZT10aGlzLmxpbmVDb2xvcix0LmxpbmVXaWR0aD10aGlzLmxpbmVXaWR0aCx0aGlzLmxpbmVBcmMpdC5iZWdpblBhdGgoKSx0LmFyYyh0aGlzLnhDZW50ZXIsdGhpcy55Q2VudGVyLG4sMCwyKk1hdGguUEkpLHQuY2xvc2VQYXRoKCksdC5zdHJva2UoKTtlbHNle3QuYmVnaW5QYXRoKCk7Zm9yKHZhciBhPTA7YTx0aGlzLnZhbHVlc0NvdW50O2ErKylzPXRoaXMuZ2V0UG9pbnRQb3NpdGlvbihhLHRoaXMuY2FsY3VsYXRlQ2VudGVyT2Zmc2V0KHRoaXMubWluK2UqdGhpcy5zdGVwVmFsdWUpKSwwPT09YT90Lm1vdmVUbyhzLngscy55KTp0LmxpbmVUbyhzLngscy55KTt0LmNsb3NlUGF0aCgpLHQuc3Ryb2tlKCl9aWYodGhpcy5zaG93TGFiZWxzKXtpZih0LmZvbnQ9Vyh0aGlzLmZvbnRTaXplLHRoaXMuZm9udFN0eWxlLHRoaXMuZm9udEZhbWlseSksdGhpcy5zaG93TGFiZWxCYWNrZHJvcCl7dmFyIGg9dC5tZWFzdXJlVGV4dChpKS53aWR0aDt0LmZpbGxTdHlsZT10aGlzLmJhY2tkcm9wQ29sb3IsdC5maWxsUmVjdCh0aGlzLnhDZW50ZXItaC8yLXRoaXMuYmFja2Ryb3BQYWRkaW5nWCxvLXRoaXMuZm9udFNpemUvMi10aGlzLmJhY2tkcm9wUGFkZGluZ1ksaCsyKnRoaXMuYmFja2Ryb3BQYWRkaW5nWCx0aGlzLmZvbnRTaXplKzIqdGhpcy5iYWNrZHJvcFBhZGRpbmdZKX10LnRleHRBbGlnbj0iY2VudGVyIix0LnRleHRCYXNlbGluZT0ibWlkZGxlIix0LmZpbGxTdHlsZT10aGlzLmZvbnRDb2xvcix0LmZpbGxUZXh0KGksdGhpcy54Q2VudGVyLG8pfX19LHRoaXMpLCF0aGlzLmxpbmVBcmMpe3QubGluZVdpZHRoPXRoaXMuYW5nbGVMaW5lV2lkdGgsdC5zdHJva2VTdHlsZT10aGlzLmFuZ2xlTGluZUNvbG9yO2Zvcih2YXIgaT10aGlzLnZhbHVlc0NvdW50LTE7aT49MDtpLS0pe3ZhciBlPW51bGwscz1udWxsO2lmKHRoaXMuYW5nbGVMaW5lV2lkdGg+MCYmKGU9dGhpcy5jYWxjdWxhdGVDZW50ZXJPZmZzZXQodGhpcy5tYXgpLHM9dGhpcy5nZXRQb2ludFBvc2l0aW9uKGksZSksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyh0aGlzLnhDZW50ZXIsdGhpcy55Q2VudGVyKSx0LmxpbmVUbyhzLngscy55KSx0LnN0cm9rZSgpLHQuY2xvc2VQYXRoKCkpLHRoaXMuYmFja2dyb3VuZENvbG9ycyYmdGhpcy5iYWNrZ3JvdW5kQ29sb3JzLmxlbmd0aD09dGhpcy52YWx1ZXNDb3VudCl7bnVsbD09ZSYmKGU9dGhpcy5jYWxjdWxhdGVDZW50ZXJPZmZzZXQodGhpcy5tYXgpKSxudWxsPT1zJiYocz10aGlzLmdldFBvaW50UG9zaXRpb24oaSxlKSk7dmFyIG89dGhpcy5nZXRQb2ludFBvc2l0aW9uKDA9PT1pP3RoaXMudmFsdWVzQ291bnQtMTppLTEsZSksYT10aGlzLmdldFBvaW50UG9zaXRpb24oaT09PXRoaXMudmFsdWVzQ291bnQtMT8wOmkrMSxlKSxoPXt4OihvLngrcy54KS8yLHk6KG8ueStzLnkpLzJ9LGw9e3g6KHMueCthLngpLzIseToocy55K2EueSkvMn07dC5iZWdpblBhdGgoKSx0Lm1vdmVUbyh0aGlzLnhDZW50ZXIsdGhpcy55Q2VudGVyKSx0LmxpbmVUbyhoLngsaC55KSx0LmxpbmVUbyhzLngscy55KSx0LmxpbmVUbyhsLngsbC55KSx0LmZpbGxTdHlsZT10aGlzLmJhY2tncm91bmRDb2xvcnNbaV0sdC5maWxsKCksdC5jbG9zZVBhdGgoKX12YXIgcj10aGlzLmdldFCM3O9WxVIBALUPAAC1DwAAaPcoH9LFCAAnrR4TCABFAA+n5epAAEAGtX/AqAdgwKgHNh/1lSlR/ev4w0wbhoAYAO2fgAAAAQEICgBNpbYAo165b2ludFBvc2l0aW9uKGksdGhpcy5jYWxjdWxhdGVDZW50ZXJPZmZzZXQodGhpcy5tYXgpKzUpO3QuZm9udD1XKHRoaXMucG9pbnRMYWJlbEZvbnRTaXplLHRoaXMucG9pbnRMYWJlbEZvbnRTdHlsZSx0aGlzLnBvaW50TGFiZWxGb250RmFtaWx5KSx0LmZpbGxTdHlsZT10aGlzLnBvaW50TGFiZWxGb250Q29sb3I7dmFyIGM9dGhpcy5sYWJlbHMubGVuZ3RoLHU9dGhpcy5sYWJlbHMubGVuZ3RoLzIsZD11LzIscD1kPml8fGk+Yy1kLGY9aT09PWR8fGk9PT1jLWQ7MD09PWk/dC50ZXh0QWxpZ249ImNlbnRlciI6aT09PXU/dC50ZXh0QWxpZ249ImNlbnRlciI6dT5pP3QudGV4dEFsaWduPSJsZWZ0Ijp0LnRleHRBbGlnbj0icmlnaHQiLGY/dC50ZXh0QmFzZWxpbmU9Im1pZGRsZSI6cD90LnRleHRCYXNlbGluZT0iYm90dG9tIjp0LnRleHRCYXNlbGluZT0idG9wIix0LmZpbGxUZXh0KHRoaXMubGFiZWxzW2ldLHIueCxyLnkpfX19fX0pLGUuYW5pbWF0aW9uU2VydmljZT17ZnJhbWVEdXJhdGlvbjoxNyxhbmltYXRpb25zOltdLGRyb3BGcmFtZXM6MCxhZGRBbmltYXRpb246ZnVuY3Rpb24odCxpKXtmb3IodmFyIGU9MDtlPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7KytlKWlmKHRoaXMuYW5pbWF0aW9uc1tlXS5jaGFydEluc3RhbmNlPT09dClyZXR1cm4gdm9pZCh0aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0PWkpO3RoaXMuYW5pbWF0aW9ucy5wdXNoKHtjaGFydEluc3RhbmNlOnQsYW5pbWF0aW9uT2JqZWN0Oml9KSwxPT10aGlzLmFuaW1hdGlvbnMubGVuZ3RoJiZzLnJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csdGhpcy5kaWdlc3RXcmFwcGVyKX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKHQpe3ZhciBpPXMuZmluZE5leHRXaGVyZSh0aGlzLmFuaW1hdGlvbnMsZnVuY3Rpb24oaSl7cmV0dXJuIGkuY2hhcnRJbnN0YW5jZT09PXR9KTtpJiZ0aGlzLmFuaW1hdGlvbnMuc3BsaWNlKGksMSl9LGRpZ2VzdFdyYXBwZXI6ZnVuY3Rpb24oKXtlLmFuaW1hdGlvblNlcnZpY2Uuc3RhcnREaWdlc3QuY2FsbChlLmFuaW1hdGlvblNlcnZpY2UpfSxzdGFydERpZ2VzdDpmdW5jdGlvbigpe3ZhciB0PURhdGUubm93KCksaT0wO3RoaXMuZHJvcEZyYW1lcz4xJiYoaT1NYXRoLmZsb29yKHRoaXMuZHJvcEZyYW1lcyksdGhpcy5kcm9wRnJhbWVzLT1pKTtmb3IodmFyIGU9MDtlPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7ZSsrKW51bGw9PT10aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0LmN1cnJlbnRTdGVwJiYodGhpcy5hbmltYXRpb25zW2VdLmFuaW1hdGlvbk9iamVjdC5jdXJyZW50U3RlcD0wKSx0aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0LmN1cnJlbnRTdGVwKz0xK2ksdGhpcy5hbmltYXRpb25zW2VdLmFuaW1hdGlvbk9iamVjdC5jdXJyZW50U3RlcD50aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0Lm51bVN0ZXBzJiYodGhpcy5hbmltYXRpb25zW2VdLmFuaW1hdGlvbk9iamVjdC5jdXJyZW50U3RlcD10aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0Lm51bVN0ZXBzKSx0aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0LnJlbmRlcih0aGlzLmFuaW1hdGlvbnNbZV0uY2hhcnRJbnN0YW5jZSx0aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0KSx0aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0LmN1cnJlbnRTdGVwPT10aGlzLmFuaW1hdGlvbnNbZV0uYW5pbWF0aW9uT2JqZWN0Lm51bVN0ZXBzJiYodGhpcy5hbmltYXRpb25zW2VdLmFuaW1hdGlvbk9iamVjdC5vbkFuaW1hdGlvbkNvbXBsZXRlLmNhbGwodGhpcy5hbmltYXRpb25zW2VdLmNoYXJ0SW5zdGFuY2UpLHRoaXMuYW5pbWF0aW9ucy5zcGxpY2UoZSwxKSxlLS0pO3ZhciBuPURhdGUubm93KCksbz1uLXQtdGhpcy5mcmFtZUR1cmF0aW9uLGE9by90aGlzLmZyYW1lRHVyYXRpb247YT4xJiYodGhpcy5kcm9wRnJhbWVzKz1hKSx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjAmJnMucmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdyx0aGlzLmRpZ2VzdFdyYXBwZXIpfX0scy5hZGRFdmVudCh3aW5kb3csInJlc2l6ZSIsZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodCksdD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bihlLmluc3RhbmNlcyxmdW5jdGlvbih0KXt0Lm9wdGlvbnMucmVzcG9uc2l2ZSYmdC5yZXNpemUodC5yZW5kZXIsITApfSl9LDUwKX19KCkpLHA/ZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIGV9KToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz1lKSx0LkNoYXJ0PWUsZS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuQ2hhcnQ9aSxlfX0pLmNhbGwodGhpcyksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQ9dGhpcyxpPXQuQ2hhcnQsZT1pLmhlbHBlcnMscz17c2NhbGVCZWdpbkF0WmVybzohMCxzY2FsZVNob3dHcmlkTGluZXM6ITAsc2NhbGVHcmlkTGluZUNvbG9yOiJyZ2JhKDAsMCwwLC4wNSkiLHNjYWxlR3JpZExpbmVXaWR0aDoxLHNjYWxlU2hvd0hvcml6b250YWxMaW5lczohMCxzY2FsZVNob3dWZXJ0aWNhbExpbmVzOiEwLGJhclNob3dTdHJva2U6ITAsYmFyU3Ryb2tlV2lkdGg6MixiYXJWYWx1ZVNwYWNpbmc6NSxiYXJEYXRhc2V0U3BhY2luZzoxLGxlZ2VuZFRlbXBsYXRlOic8dWwgY2xhc3M9IjwlPW5hbWUudG9Mb3dlckNhc2UoKSU+LWxlZ2VuZCI+PCUgZm9yICh2YXIgaT0wOyBpPGRhdGFzZXRzLmxlbmd0aDsgaSsrKXslPjxsaT48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjo8JT1kYXRhc2V0c1tpXS5maWxsQ29sb3IlPiI+PCVpZihkYXRhc2V0c1tpXS5sYWJlbCl7JT48JT1kYXRhc2V0c1tpXS5sYWJlbCU+PCV9JT48L3NwYW4+PC9saT48JX0lPjwvdWw+J307aS5UeXBlLmV4dGVuZCh7bmFtZToiQmFyIixkZWZhdWx0czpzLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dmFyIHM9dGhpcy5vcHRpb25zO3RoaXMuU2NhbGVDbGFzcz1pLlNjYWxlLmV4dGVuZCh7b2Zmc2V0R3JpZExpbmVzOiEwLGNhbGN1bGF0ZUJhclg6ZnVuY3Rpb24odCxpLGUpe3ZhciBuPXRoaXMuY2FsY3VsYXRlQmFzZVdpZHRoKCksbz10aGlzLmNhbGN1bGF0ZVgoZSktbi8yLGE9dGhpcy5jYWxjdWxhdGVCYXJXaWR0aCh0KTtyZXR1cm4gbythKmkraSpzLmJhckRhdGFzZXRTcGFjaW5nK2EvMn0sY2FsY3VsYXRlQmFzZVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FsY3VsYXRlWCgxKS10aGlzLmNhbGN1bGF0ZVgoMCktMipzLmJhclZhbHVlU3BhY2luZ30sY2FsY3VsYXRlQmFyV2lkdGg6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5jYWxjdWxhdGVCYXNlV2lkdGgoKS0odC0xKSpzLmJhckRhdGFzZXRTcGFjaW5nOwpyZXR1cm4gaS90fX0pLHRoaXMuZGF0YXNldHM9W10sdGhpcy5vcHRpb25zLnNob3dUb29sdGlwcyYmZS5iaW5kRXZlbnRzKHRoaXMsdGhpcy5vcHRpb25zLnRvb2x0aXBFdmVudHMsZnVuY3Rpb24odCl7dmFyIGk9Im1vdXNlb3V0IiE9PXQudHlwZT90aGlzLmdldEJhcnNBdEV2ZW50KHQpOltdO3RoaXMuZWFjaEJhcnMoZnVuY3Rpb24odCl7dC5yZXN0b3JlKFsiZmlsbENvbG9yIiwic3Ryb2tlQ29sb3IiXSl9KSxlLmVhY2goaSxmdW5jdGlvbih0KXt0LmZpbGxDb2xvcj10LmhpZ2hsaWdodEZpbGwsdC5zdHJva2VDb2xvcj10LmhpZ2hsaWdodFN0cm9rZX0pLHRoaXMuc2hvd1Rvb2x0aXAoaSl9KSx0aGlzLkJhckNsYXNzPWkuUmVjdGFuZ2xlLmV4dGVuZCh7c3Ryb2tlV2lkdGg6dGhpcy5vcHRpb25zLmJhclN0cm9rZVdpZHRoLHNob3dTdHJva2U6dGhpcy5vcHRpb25zLmJhclNob3dTdHJva2UsY3R4OnRoaXMuY2hhcnQuY3R4fSksZS5lYWNoKHQuZGF0YXNldHMsZnVuY3Rpb24oaSxzKXt2YXIgbj17bGFiZWw6aS5sYWJlbHx8bnVsbCxmaWxsQ29sb3I6aS5maWxsQ29sb3Isc3Ryb2tlQ29sb4zc71b4UgEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRBIEAAQAZpvcCoBzbAqAdglSkf9cNMG4ZR/dsAgBACZR4hAAABAQgKAKNeugBNpbaM3O9WAFMBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0QSFAAEAGabzAqAc2wKgHYJUpH/XDTBuGUf3r+IAQAqkM5QAAAQEICgCjXroATaW2jNzvVgFTAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANEEiQABABmm7wKgHNsCoB2CVKR/1w0wbhlH9+2uAEALn/TMAAAEBCAoAo166AE2ltozc71bnUwEAGlUAABpVAABo9ygf0sUIACetHhMIAEUAVQzl7UAAQAZwF8CoB2DAqAc2H/WVKVH9+2vDTBuGgBAA7eTlAAABAQgKAE2ltgCjXroNCjVCRjUNCnI6aS5zdHJva2VDb2xvcixiYXJzOltdfTt0aGlzLmRhdGFzZXRzLnB1c2gobiksZS5lYWNoKGkuZGF0YSxmdW5jdGlvbihlLHMpe24uYmFycy5wdXNoKG5ldyB0aGlzLkJhckNsYXNzKHt2YWx1ZTplLGxhYmVsOnQubGFiZWxzW3NdLGRhdGFzZXRMYWJlbDppLmxhYmVsLHN0cm9rZUNvbG9yOmkuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOmkuZmlsbENvbG9yLGhpZ2hsaWdodEZpbGw6aS5oaWdobGlnaHRGaWxsfHxpLmZpbGxDb2xvcixoaWdobGlnaHRTdHJva2U6aS5oaWdobGlnaHRTdHJva2V8fGkuc3Ryb2tlQ29sb3J9KSl9LHRoaXMpfSx0aGlzKSx0aGlzLmJ1aWxkU2NhbGUodC5sYWJlbHMpLHRoaXMuQmFyQ2xhc3MucHJvdG90eXBlLmJhc2U9dGhpcy5zY2FsZS5lbmRQb2ludCx0aGlzLmVhY2hCYXJzKGZ1bmN0aW9uKHQsaSxzKXtlLmV4dGVuZCh0LHt3aWR0aDp0aGlzLnNjYWxlLmNhbGN1bGF0ZUJhcldpZHRoKHRoaXMuZGF0YXNldHMubGVuZ3RoKSx4OnRoaXMuc2NhbGUuY2FsY3VsYXRlQmFyWCh0aGlzLmRhdGFzZXRzLmxlbmd0aCxzLGkpLHk6dGhpcy5zY2FsZS5lbmRQb2ludH0pLHQuc2F2ZSgpfSx0aGlzKSx0aGlzLnJlbmRlcigpfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLnNjYWxlLnVwZGF0ZSgpLGUuZWFjaCh0aGlzLmFjdGl2ZUVsZW1lbnRzLGZ1bmN0aW9uKHQpe3QucmVzdG9yZShbImZpbGxDb2xvciIsInN0cm9rZUNvbG9yIl0pfSksdGhpcy5lYWNoQmFycyhmdW5jdGlvbih0KXt0LnNhdmUoKX0pLHRoaXMucmVuZGVyKCl9LGVhY2hCYXJzOmZ1bmN0aW9uKHQpe2UuZWFjaCh0aGlzLmRhdGFzZXRzLGZ1bmN0aW9uKGkscyl7ZS5lYWNoKGkuYmFycyx0LHRoaXMscyl9LHRoaXMpfSxnZXRCYXJzQXRFdmVudDpmdW5jdGlvbih0KXtmb3IodmFyIGkscz1bXSxuPWUuZ2V0UmVsYXRpdmVQb3NpdGlvbih0KSxvPWZ1bmN0aW9uKHQpe3MucHVzaCh0LmJhcnNbaV0pfSxhPTA7YTx0aGlzLmRhdGFzZXRzLmxlbmd0aDthKyspZm9yKGk9MDtpPHRoaXMuZGF0YXNldHNbYV0uYmFycy5sZW5ndGg7aSsrKWlmKHRoaXMuZGF0YXNldHNbYV0uYmFyc1tpXS5pblJhbmdlKG4ueCxuLnkpKXJldHVybiBlLmVhY2godGhpcy5kYXRhc2V0cyxvKSxzO3JldHVybiBzfSxidWlsZFNjYWxlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBpLmVhY2hCYXJzKGZ1bmN0aW9uKGkpe3QucHVzaChpLnZhbHVlKX0pLHR9LG49e3RlbXBsYXRlU3RyaW5nOnRoaXMub3B0aW9ucy5zY2FsZUxhYmVsLGhlaWdodDp0aGlzLmNoYXJ0LmhlaWdodCx3aWR0aDp0aGlzLmNoYXJ0LndpZHRoLGN0eDp0aGlzLmNoYXJ0LmN0eCx0ZXh0Q29sb3I6dGhpcy5vcHRpb25zLnNjYWxlRm9udENvbG9yLGZvbnRTaXplOnRoaXMub3B0aW9ucy5zY2FsZUZvbnRTaXplLGZvbnRTdHlsZTp0aGlzLm9wdGlvbnMuc2NhbGVGb250U3R5bGUsZm9udEZhbWlseTp0aGlzLm9wdGlvbnMuc2NhbGVGb250RmFtaWx5LHZhbHVlc0NvdW50OnQubGVuZ3RoLGJlZ2luQXRaZXJvOnRoaXMub3B0aW9ucy5zY2FsZUJlZ2luQXRaZXJvLGludGVnZXJzT25seTp0aGlzLm9wdGlvbnMuc2NhbGVJbnRlZ2Vyc09ubHksY2FsY3VsYXRlWVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBpPWUuY2FsY3VsYXRlU2NhbGVSYW5nZShzKCksdCx0aGlzLmZvbnRTaXplLHRoaXMuYmVnaW5BdFplcm8sdGhpcy5pbnRlZ2Vyc09ubHkpO2UuZXh0ZW5kKHRoaXMsaSl9LHhMYWJlbHM6dCxmb250OmUuZm9udFN0cmluZyh0aGlzLm9wdGlvbnMuc2NhbGVGb250U2l6ZSx0aGlzLm9wdGlvbnMuc2NhbGVGb250U3R5bGUsdGhpcy5vcHRpb25zLnNjYWxlRm9udEZhbWlseSksbGluZVdpZHRoOnRoaXMub3B0aW9ucy5zY2FsZUxpbmVXaWR0aCxsaW5lQ29sb3I6dGhpcy5vcHRpb25zLnNjYWxlTGluZUNvbG9yLHNob3dIb3Jpem9udGFsTGluZXM6dGhpcy5vcHRpb25zLnNjYWxlU2hvd0hvcml6b250YWxMaW5lcyxzaG93VmVydGljYWxMaW5lczp0aGlzLm9wdGlvbnMuc2NhbGVTaG93VmVydGljYWxMaW5lcyxncmlkTGluZVdpZHRoOnRoaXMub3B0aW9ucy5zY2FsZVNob3dHcmlkTGluZXM/dGhpcy5vcHRpb25zLnNjYWxlR3JpZExpbmVXaWR0aDowLGdyaWRMaW5lQ29sb3I6dGhpcy5vcHRpb25zLnNjYWxlU2hvd0dyaWRMaW5lcz90aGlzLm9wdGlvbnMuc2NhbGVHcmlkTGluZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixwYWRkaW5nOnRoaXMub3B0aW9ucy5zaG93U2NhbGU/MDp0aGlzLm9wdGlvbnMuYmFyU2hvd1N0cm9rZT90aGlzLm9wdGlvbnMuYmFyU3Ryb2tlV2lkdGg6MCxzaG93TGFiZWxzOnRoaXMub3B0aW9ucy5zY2FsZVNob3dMYWJlbHMsZGlzcGxheTp0aGlzLm9wdGlvbnMuc2hvd1NjYWxlfTt0aGlzLm9wdGlvbnMuc2NhbGVPdmVycmlkZSYmZS5leHRlbmQobix7Y2FsY3VsYXRlWVJhbmdlOmUubm9vcCxzdGVwczp0aGlzLm9wdGlvbnMuc2NhbGVTdGVwcyxzdGVwVmFsdWU6dGhpcy5vcHRpb25zLnNjYWxlU3RlcFdpZHRoLG1pbjp0aGlzLm9wdGlvbnMuc2NhbGVTdGFydFZhbHVlLG1heDp0aGlzLm9wdGlvbnMuc2NhbGVTdGFydFZhbHVlK3RoaXMub3B0aW9ucy5zY2FsZVN0ZXBzKnRoaXMub3B0aW9ucy5zY2FsZVN0ZXBXaWR0aH0pLHRoaXMuc2NhbGU9bmV3IHRoaXMuU2NhbGVDbGFzcyhuKX0sYWRkRGF0YTpmdW5jdGlvbih0LGkpe2UuZWFjaCh0LGZ1bmN0aW9uKHQsZSl7dGhpcy5kYXRhc2V0c1tlXS5iYXJzLnB1c2gobmV3IHRoaXMuQmFyQ2xhc3Moe3ZhbHVlOnQsbGFiZWw6aSxkYXRhc2V0TGFiZWw6dGhpcy5kYXRhc2V0c1tlXS5sYWJlbCx4OnRoaXMuc2NhbGUuY2FsY3VsYXRlQmFyWCh0aGlzLmRhdGFzZXRzLmxlbmd0aCxlLHRoaXMuc2NhbGUudmFsdWVzQ291bnQrMSkseTp0aGlzLnNjYWxlLmVuZFBvaW50LHdpZHRoOnRoaXMuc2NhbGUuY2FsY3VsYXRlQmFyV2lkdGgodGhpcy5kYXRhc2V0cy5sZW5ndGgpLGJhc2U6dGhpcy5zY2FsZS5lbmRQb2ludCxzdHJva2VDb2xvcjp0aGlzLmRhdGFzZXRzW2VdLnN0cm9rZUNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGFzZXRzW2VdLmZpbGxDb2xvcn0pKX0sdGhpcyksdGhpcy5zY2FsZS5hZGRYTGFiZWwoaSksdGhpcy51cGRhdGUoKX0scmVtb3ZlRGF0YTpmdW5jdGlvbigpe3RoaXMuc2NhbGUucmVtb3ZlWExhYmVsKCksZS5lYWNoKHRoaXMuZGF0YXNldHMsZnVuY3Rpb24odCl7dC5iYXJzLnNoaWZ0KCl9LHRoaXMpLHRoaXMudXBkYXRlKCl9LHJlZmxvdzpmdW5jdGlvbigpe2UuZXh0ZW5kKHRoaXMuQmFyQ2xhc3MucHJvdG90eXBlLHt5OnRoaXMuc2NhbGUuZW5kUG9pbnQsYmFzZTp0aGlzLnNjYWxlLmVuZFBvaW50fSk7dmFyIHQ9ZS5leHRlbmQoe2hlaWdodDp0aGlzLmNoYXJ0LmhlaWdodCx3aWR0aDp0aGlzLmNoYXJ0LndpZHRofSk7dGhpcy5zY2FsZS51cGRhdGUodCl9LGRyYXc6ZnVuY3Rpb24odCl7dmFyIGk9dHx8MTt0aGlzLmNsZWFyKCk7dGhpcy5jaGFydC5jdHg7dGhpcy5zY2FsZS5kcmF3KGkpLGUuZWFjaCh0aGlzLmRhdGFzZXRzLGZ1bmN0aW9uKHQscyl7ZS5lYWNoKHQuYmFycyxmdW5jdGlvbih0LGUpe3QuaGFzVmFsdWUoKSYmKHQuYmFzZT10aGlzLnNjYWxlLmVuZFBvaW50LHQudHJhbnNpdGlvbih7eDp0aGlzLnNjYWxlLmNhbGN1bGF0ZUJhclgodGhpcy5kYXRhc2V0cy5sZW5ndGgscyxlKSx5OnRoaXMuc2NhbGUuY2FsY3VsYXRlWSh0LnZhbHVlKSx3aWR0aDp0aGlzLnNjYWxlLmNhbGN1bGF0ZUJhcldpZHRoKHRoaXMuZGF0YXNldHMubGVuZ3RoKX0saSkuZHJhdygpKX0sdGhpcyl9LHRoaXMpfX0pfS5jYWxsKHRoaXMpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PXRoaXMsaT10LkNoYXJ0LGU9aS5oZWxwZXJzLHM9e3NlZ21lbnRTaG93U3Ryb2tlOiEwLHNlZ21lbnRTdHJva2VDb2xvcjoiI2ZmZiIsc2VnbWVudFN0cm9rZVdpZHRoOjIscGVyY2VudGFnZUlubmVyQ3V0b3V0OjUwLGFuaW1hdGlvblN0ZXBzOjEwMCxhbmltYXRpb25FYXNpbmc6ImVhc2VPdXRCb3VuY2UiLGFuaW1hdGVSb3RhdGU6ITAsYW5pbWF0ZVNjYWxlOiExLGxlZ2VuZFRlbXBsYXRlOic8dWwgY2xhc3M9IjwlPW5hbWUudG9Mb3dlckNhc2UoKSU+LWxlZ2VuZCI+PCUgZm9yICh2YXIgaT0wOyBpPHNlZ21lbnRzLmxlbmd0aDsgaSsrKXslPjxsaT48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjo8JT1zZWdtZW50c1tpXS5maWxsQ29sb3IlPiI+PCVpZihzZWdtZW50c1tpXS5sYWJlbCl7JT48JT1zZWdtZW50c1tpXS5sYWJlbCU+PCV9JT48L3NwYW4+PC9saT48JX0lPjwvdWw+J307aS5UeXBlLmV4dGVuZCh7bmFtZToiRG91Z2hudXQiLGRlZmF1bHRzOnMsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLnNlZ21lbnRzPVtdLHRoaXMub3V0ZXJSYWRpdXM9KGUubWluKFt0aGlzLmNoYXJ0LndpZHRoLHRoaXMuY2hhcnQuaGVpZ2h0XSktdGhpcy5vcHRpb25zLnNlZ21lbnRTdHJva2VXaWR0aC8yKS8yLHRoaXMuU2VnbWVudEFyYz1pLkFyYy5leHRlbmQoe2N0eDp0aGlzLmNoYXJ0LmN0eCx4OnRoaXMuY2hhcnQud2lkdGgvMix5OnRoaXMuY2hhcnQuaGVpZ2h0LzJ9KSx0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBzJiZlLmJpbmRFdmVudHModGhpcyx0aGlzLm9wdGlvbnMudG9vbHRpcEV2ZW50cyxmdW5jdGlvbih0KXt2YXIgaT0ibW91c2VvdXQiIT09dC50eXBlP3RoaXMuZ2V0U2VnbWVudHNBdEV2ZW50KHQpOltdO2UuZWFjaCh0aGlzLnNlZ21lbnRzLGZ1bmN0aW9uKHQpe3QucmVzdG9yZShbImZpbGxDb2xvciJdKX0pLGUuZWFjaChpLGZ1bmN0aW9uKHQpe3QuZmlsbENvbG9yPXQuaGlnaGxpZ2h0Q29sb3J9KSx0aGlzLnNob3dUb29sdGlwKGkpfSksdGhpcy5jYWxjdWxhdGVUb3RhbCh0KSxlLmVhY2godCxmdW5jdGlvbihpLGUpe2kuY29sb3J8fChpLmNvbG9yPSJoc2woIiszNjAqZS90Lmxlbmd0aCsiLCAxMDAlLCA1MCUpIiksdGhpcy5hZGREYXRhKGksZSwhMCl9LHRoaXMpLHRoaXMucmVuZGVyKCl9LGdldFNlZ21lbnRzQXRFdmVudDpmdW5jdGlvbih0KXt2YXIgaT1bXSxzPWUuZ2V0UmVsYXRpdmVQb3NpdGlvbih0KTtyZXR1cm4gZS5lYWNoKHRoaXMuc2VnbWVudHMsZnVuY3Rpb24odCl7dC5pblJhbmdlKHMueCxzLnkpJiZpLnB1c2godCl9LHRoaXMpLGl9LGFkZERhdGE6ZnVuY3Rpb24odCxlLHMpe3ZhciBuPXZvaWQgMCE9PWU/ZTp0aGlzLnNlZ21lbnRzLmxlbmd0aDsidW5kZWZpbmVkIj09dHlwZW9mIHQuY29sb3ImJih0LmNvbG9yPWkuZGVmYXVsdHMuZ2xvYmFsLnNlZ21lbnRDb2xvckRlZmF1bHRbbiVpLmRlZmF1bHRzLmdsb2JhbC5zZWdtZW50Q29sb3JEZWZhdWx0Lmxlbmd0aF0sdC5oaWdobGlnaHQ9aS5kZWZhdWx0cy5nbG9iYWwuc2VnbWVudEhpZ2hsaWdodENvbG9yRGVmYXVsdHNbbiVpLmRlZmF1bHRzLmdsb2JhbC5zZWdtZW50SGlnaGxpZ2h0Q29sb3JEZWZhdWx0cy5sZW5ndGhdKSx0aGlzLnNlZ21lbnRzLnNwbGljZShuLDAsbmV3IHRoaXMuU2VnbWVudEFyYyh7dmFsdWU6dC52YWx1ZSxvdXRlclJhZGl1czp0aGlzLm9wdGlvbnMuYW5pbWF0ZVNjYWxlPzA6dGhpcy5vdXRlclJhZGl1cyxpbm5lclJhZGl1czp0aGlzLm9wdGlvbnMuYW5pbWF0ZVNjYWxlPzA6dGhpcy5vdXRlclJhZGl1cy8xMDAqdGhpcy5vcHRpb25zLnBlcmNlbnRhZ2VJbm5lckN1dG91dCxmaWxsQ29sb3I6dC5jb2xvcixoaWdobGlnaHRDb2xvcjp0LmhpZ2hsaWdodHx8dC5jb2xvcixzaG93U3Ryb2tlOnRoaXMub3B0aW9ucy5zZWdtZW50U2hvd1N0cm9rZSxzdHJva2VXaWR0aDp0aGlzLm9wdGlvbnMuc2VnbWVudFN0cm9rZVdpZHRoLHN0cm9rZUNvbG9yOnRoaXMub3B0aW9ucy5zZWdtZW50U3Ryb2tlQ29sb3Isc3RhcnRBbmdsZToxLjUqTWF0aC5QSSxjaXJjdW1mZXJlbmNlOnRoaXMub3B0aW9ucy5hbmltYXRlUm90YXRlPzA6dGhpcy5jYWxjdWxhdGVDaXJjdW1mZXJlbmNlKHQudmFsdWUpLGxhYmVsOnQubGFiZWx9KSksc3x8KHRoaXMucmVmbG93KCksdGhpcy51cGRhdGUoKSl9LGNhbGN1bGF0ZUNpcmN1bWZlcmVuY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudG90YWw+MD8yKk1hdGguUEkqKHQvdGhpcy50b3RhbCk6MH0sY2FsY3VsYXRlVG90YWw6ZnVuY3Rpb24odCl7dGhpcy50b3RhbD0wLGUuZWFjaCh0LGZ1bmN0aW9uKHQpe3RoaXMudG90YWwrPU1hdGguYWJzKHQudmFsdWUpfSx0aGlzKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5jYWxjdWxhdGVUb3RhbCh0aGlzLnNlZ21lbnRzKSxlLmVhY2godGhpcy5hY3RpdmVFbGVtZW50cyxmdW5jdGlvbih0KXt0LnJlc3RvcmUoWyJmaWxsQ29sb3IiXSl9KSxlLmVhY2godGhpcy5zZWdtZW50cyxmdW5jdGlvbih0KXt0LnNhdmUoKX0pLHRoaXMucmVuZGVyKCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24odCl7dmFyIGk9ZS5pc051bWJlcih0KT90OnRoaXMuc2VnbWVudHMubGVuZ3RoLTE7dGhpcy5zZWdtZW50cy5zcGxpY2UoaSwxKSx0aGlzLnJlZmxvdygpLHRoaXMudXBkYXRlKCl9LHJlZmxvdzpmdW5jdGlvbigpe2UuZXh0ZW5kKHRoaXMuU2VnbWVudEFyYy5wcm90b3R5cGUse3g6dGhpcy5jaGFydC53aWR0aC8yLHk6dGhpcy5jaGFydC5oZWlnaHQvMn0pLHRoaXMub3V0ZXJSYWRpdXM9KGUubWluKFt0aGlzLmNoYXJ0LndpZHRoLHRoaXMuY2hhcnQuaGVpZ2h0XSktdGhpcy5vcHRpb25zLnNlZ21lbnRTdHJva2VXaWR0aC8yKS8yLGUuZWFjaCh0aGlzLnNlZ21lbnRzLGZ1bmN0aW9uKHQpe3QudXBkYXRlKHtvdXRlclJhZGl1czp0aGlzLm91dGVyUmFkaXVzLGlubmVyUmFkaXVzOnRoaXMub3V0ZXJSYWRpdXMvMTAwKnRoaXMub3B0aW9ucy5wZXJjZW50YWdlSW5uZXJDdXRvdXR9KX0sdGhpcyl9LGRyYXc6ZnVuY3Rpb24odCl7dmFyIGk9dD90OjE7dGhpcy5jbGVhcigpLGUuZWFjaCh0aGlzLnNlZ21lbnRzLGZ1bmN0aW9uKHQsZSl7dC50cmFuc2l0aW9uKHtjaXJjdW1mZXJlbmNlOnRoaXMuY2FsY3VsYXRlQ2lyY3VtZmVyZW5jZSh0LnZhbHVlKSxvdXRlclJhZGl1czp0aGlzLm91dGVyUmFkaXVzLGlubmVyUmFkaXVzOnRoaXMub3V0ZXJSYWRpdXMvMTAwKnRoaXMub3B0aW9ucy5wZXJjZW50YWdlSW5uZXJDdXRvdXR9LGkpLHQuZW5kQW5nbGU9dC5zdGFydEFuZ2xlK3QuY2lyY3VtZmVyZW5jZSx0LmRyYXcoKSwwPT09ZSYmKHQuc3RhcnRBbmdsZT0xLjUqTWF0aC5QSSksZTx0aGlzLnNlZ21lbnRzLmxlbmd0aC0xJiYodGhpcy5zZWdtZW50c1tlKzFdLnN0YXJ0QW5nbGU9dC5lbmRBbmdsZSl9LHRoaXMpfX0pLGkudHlwZXMuRG91Z2hudXQuZXh0ZW5kKHtuYW1lOiJQaWUiLGRlZmF1bHRzOmUubWVyZ2Uocyx7cGVyY2VudGFnZUlubmVyQ3V0b3V0OjB9KX0pfS5jYWxsKHRoaXMpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PXRoaXMsaT10LkNoYXJ0LGU9aS5oZWxwZXJzLHM9e3NjYWxlU2hvd0dyaWRMaW5lczohMCxzY2FsZUdyaWRMaW5lQ29sb3I6InJnYmEoMCwwLDAsLjA1KSIsc2NhbGVHcmlkTGluZVdpZHRoOjEsc2NhbGVTaG93SG9yaXpvbnRhbExpbmVzOiEwLHNjYWxlU2hvd1ZlcnRpY2FsTGluZXM6ITAsYmV6aWVyQ3VydmU6ITAsYmV6aWVyQ3VydmVUZW5zaW9uOi40LHBvaW50RG90OiEwLHBvaW50RG90UmFkaXVzOjQscG9pbnREb3RTdHJva2VXaWR0aDoxLHBvaW50SGl0RGV0ZWN0aW9uUmFkaXVzOjIwLGRhdGFzZXRTdHJva2U6ITAsZGF0YXNldFN0cm9rZVdpZHRoOjIsZGF0YXNldEZpbGw6ITAsbGVnZW5kVGVtcGxhdGU6Jzx1bCBjbGFzcz0iPCU9bmFtZS50b0xvd2VyQ2FzZSgpJT4tbGVnZW5kIj48JSBmb3IgKHZhciBpPTA7IGk8ZGF0YXNldHMubGVuZ3RoOyBpKyspeyU+PGxpPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOjwlPWRhdGFzZXRzW2ldLnN0cm9rZUNvbG9yJT4iPjwlaWYoZGF0YXNldHNbaV0ubGFiZWwpeyU+PCU9ZGF0YXNldHNbaV0ubGFiZWwlPjwlfSU+PC9zcGFuPjwvbGk+PCV9JT48L3VsPicsb2Zmc2V0R3JpZExpbmVzOiExfTtpLlR5cGUuZXh0ZW5kKHtuYW1lOiJMaW5lIixkZWZhdWx0czpzLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5Qb2ludENsYXNzPWkuUG9pbnQuZXh0ZW5kKHtvZmZzZXRHcmlkTGluZXM6dGhpcy5vcHRpb25zLm9mZnNldEdyaWRMaW5lcyxzdHJva2VXaWR0aDp0aGlzLm9wdGlvbnMucG9pbnREb3RTdHJva2VXaWR0aCxyYWRpdXM6dGhpcy5vcHRpb25zLnBvaW50RG90UmFkaXVzLGRpc3BsYXk6dGhpcy5vcHRpb25zLnBvaW50RG90LGhpdERldGVjdGlvblJhZGl1czp0aGlzLm9wdGlvbnMucG9pbnRIaXREZXRlY3Rpb25SYWRpdXMsY3R4OnRoaXMuY2hhcnQuY3R4LGluUmFuZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KHQtdGhpcy54LDIpPE1hdGgucG93KHRoaXMucmFkaXVzK3RoaXMuaGl0RGV0ZWN0aW9uUmFkaXVzLDIpfX0pLHRoaXMuZGF0YXNldHM9W10sdGhpcy5vcHRpb25zLnNob3dUb29sdGlwcyYmZS5iaW5kRXZlbnRzKHRoaXMsdGhpcy5vcHRpb25zLnRvb2x0aXBFdmVudHMsZnVuY3Rpb24odCl7dmFyIGk9Im1vdXNlb3V0IiE9PXQudHlwZT90aGlzLmdldFBvaW50c0F0RXZlbnQodCk6W107dGhpcy5lYWNoUG9pbnRzKGZ1bmN0aW9uKHQpe3QucmVzdG9yZShbImZpbGxDb2xvciIsInN0cm9rZUNvbG9yIl0pfSksZS5lYWNoKGksZnVuY3Rpb24odCl7dC5maWxsQ29sb3I9dC5oaWdobGlnaHRGaWxsLHQuc3Ryb2tlQ29sb3I9dC5oaWdobGlnaHRTdHJva2V9KSx0aGlzLnNob3dUb29sdGlwKGkpfSksZS5lYWNoKHQuZGF0YXNldHMsZnVuY3Rpb24oaSl7dmFyIHM9e2xhYmVsOmkubGFiZWx8fG51bGwsZmlsbENvbG9yOmkuZmlsbENvbG9yLHN0cm9rZUNvbG9yOmkuc3Ryb2tlQ29sb3IscG9pbnRDb2xvcjppLnBvaW50Q29sb3IscG9pbnRTdHJva2VDb2xvcjppLnBvaW50U3Ryb2tlQ29sb3IscG9pbnRzOltdfTt0aGlzLmRhdGFzZXRzLnB1c2gocyksZS5lYWNoKGkuZGF0YSxmdW5jdGlvbihlLG4pe3MucG9pbnRzLnB1c2gobmV3IHRoaXMuUG9pbnRDbGFzcyh7dmFsdWU6ZSxsYWJlbDp0LmxhYmVsc1tuXSxkYXRhc2V0TGFiZWw6aS5sYWJlbCxzdHJva2VDb2xvcjppLnBvaW50U3Ryb2tlQ29sb3IsZmlsbENvbG9yOmkucG9pbnRDb2xvcixoaWdobGlnaHRGaWxsOmkucG9pbnRIaWdobGlnaHRGaWxsfHxpLnBvaW50Q29sb3IsaGlnaGxpZ2h0U3Ryb2tlOmkucG9pbnRIaWdobGlnaHRTdHJva2V8fGkucG9pbnRTdHJva2VDb2xvcn0pKX0sdGhpcyksdGhpcy5idWlsZFNjYWxlKHQubGFiZWxzKSx0aGlzLmVhY2hQb2ludHMoZnVuY3Rpb24odCxpKXtlLmV4dGVuZCh0LHt4OnRoaXMuc2NhbGUuY2FsY3VsYXRlWChpKSx5OnRoaXMuc2NhbGUuZW5kUG9pbnR9KSx0LnNhdmUoKX0sdGhpcyl9LHRoaXMpLHRoaXMucmVuZGVyKCl9LHVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuc2NhbGUudXBkYXRlKCksZS5lYWNoKHRoaXMuYWN0aXZlRWxlbWVudHMsZnVuY3Rpb24odCl7dC5yZXN0b3JlKFsiZmlsbENvbG9yIiwic3Ryb2tlQ29sb3IiXSl9KSx0aGlzLmVhY2hQb2ludHMoZnVuY3Rpb24odCl7dC5zYXZlKCl9KSx0aGlzLnJlbmRlcigpfSxlYWNoUG9pbnRzOmZ1bmN0aW9uKHQpe2UuZWFjaCh0aGlzLmRhdGFzZXRzLGZ1bmN0aW9uKGkpe2UuZWFjaChpLnBvaW50cyx0LHRoaXMpfSx0aGlzKX0sZ2V0UG9pbnRzQXRFdmVudDpmdW5jdGlvbih0KXt2YXIgaT1bXSxzPWUuZ2V0UmVsYXRpdmVQb3NpdGlvbih0KTtyZXR1cm4gZS5lYWNoKHRoaXMuZGF0YXNldHMsZnVuY3Rpb24odCl7ZS5lYWNoKHQucG9pbnRzLGZ1bmN0aW9uKHQpe3QuaW5SYW5nZShzLngscy55KSYmaS5wdXNoKHQpfSl9LHRoaXMpLGl9LGJ1aWxkU2NhbGU6ZnVuY3Rpb24odCl7dmFyIHM9dGhpcyxuPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHMuZWFjaFBvaW50cyhmdW5jdGlvbihpKXt0LnB1c2goaS52YWx1ZSl9KSx0fSxvPXt0ZW1wbGF0ZVN0cmluZzp0aGlzLm9wdGlvbnMuc2NhbGVMYWJlbCxoZWlnaHQ6dGhpcy5jaGFydC5oZWlnaHQsd2lkdGg6dGhpcy5jaGFydC53aWR0aCxjdHg6dGhpcy5jaGFydC5jdHgsdGV4dENvbG9yOnRoaXMub3B0aW9ucy5zY2FsZUZvbnRDb2xvcixvZmZzZXRHcmlkTGluZXM6dGhpcy5vcHRpb25zLm9mZnNldEdyaWRMaW5lcyxmb250U2l6ZTp0aGlzLm9wdGlvbnMuc2NhbGVGb250U2l6ZSxmb250U3R5bGU6dGhpcy5vcHRpb25zLnNjYWxlRm9udFN0eWxlLGZvbnRGYW1pbHk6dGhpcy5vcHRpb25zLnNjYWxlRm9udEZhbWlseSx2YWx1ZXNDb3VudDp0Lmxlbmd0aCxiZWdpbkF0WmVybzp0aGlzLm9wdGlvbnMuc2NhbGVCZWdpbkF0WmVybyxpbnRlZ2Vyc09ubHk6dGhpcy5vcHRpb25zLnNjYWxlSW50ZWdlcnNPbmx5LGNhbGN1bGF0ZVlSYW5nZTpmdW5jdGlvbih0KXt2YXIgaT1lLmNhbGN1bGF0ZVNjYWxlUmFuZ2UobigpLHQsdGhpcy5mb250U2l6ZSx0aGlzLmJlZ2luQXRaZXJvLHRoaXMuaW50ZWdlcnNPbmx5KTtlLmV4dGVuZCh0aGlzLGkpfSx4TGFiZWxzOnQsZm9udDplLmZvbnRTdHJpbmcodGhpcy5vcHRpb25zLnNjYWxlRm9udFNpemUsdGhpcy5vcHRpb25zLnNjYWxlRm9udFN0eWxlLHRoaXMub3B0aW9ucy5zY2FsZUZvbnRGYW1pbHkpLGxpbmVXaWR0aDp0aGlzLm9wdGlvbnMuc2NhbGVMaW5lV2lkdGgsbGluZUNvbG9yOnRoaXMub3B0aW9ucy5zY2FsZUxpbmVDb2xvcixzaG93SG9yaXpvbnRhbExpbmVzOnRoaXMub3B0aW9ucy5zY2FsZVNob3dIb3Jpem9udGFsTGluZXMsc2hvd1ZlcnRpY2FsTGluZXM6dGhpcy5vcHRpb25zLnNjYWxlU2hvd1ZlcnRpY2FsTGluZXMsZ3JpZExpbmVXaWR0aDp0aGlzLm9wdGlvbnMuc2NhbGVTaG93R3JpZExpbmVzP3RoaXMub3B0aW9ucy5zY2FsZUdyaWRMaW5lV2lkdGg6MCxncmlkTGluZUNvbG9yOnRoaXMub3B0aW9ucy5zY2FsZVNob3dHcmlkTGluZXM/dGhpcy5vcHRpb25zLnNjYWxlR3JpZExpbmVDb2xvcjoicmdiYSgwLDAsMCwwKSIscGFkZGluZzp0aGlzLm9wdGlvbnMuc2hvd1NjYWxlPzA6dGhpcy5vcHRpb25zLnBvaW50RG90UmFkaXVzK3RoaXMub3B0aW9ucy5wb2ludERvdFN0cm9rZVdpZHRoLHNob3dMYWJlbHM6dGhpcy5vcHRpb25zLnNjYWxlU2hvd0xhYmVscyxkaXNwbGF5OnRoaXMub3B0aW9ucy5zaG93U2NhbGV9O3RoaXMub3B0aW9ucy5zY2FsZU92ZXJyaWRlJiZlLmV4dGVuZChvLHtjYWxjdWxhdGVZUmFuZ2U6ZS5ub29wLHN0ZXBzOnRoaXMub3B0aW9ucy5zY2FsZVN0ZXBzLHN0ZXBWYWx1ZTp0aGlzLm9wdGlvbnMuc2NhbGVTdGVwV2lkdGgsbWluOnRoaXMub3B0aW9ucy5zY2FsZVN0YXJ0VmFsdWUsbWF4OnRoaXMub3B0aW9ucy5zY2FsZVN0YXJ0VmFsdWUrdGhpcy5vcHRpb25zLnNjYWxlU3RlcHMqdGhpcy5vcHRpb25zLnNjYWxlU3RlcFdpZHRofSksdGhpcy5zY2FsZT1uZXcgaS5TY2FsZShvKX0sYWRkRGF0YTpmdW5jdGlvbih0LGkpe2UuZWFjaCh0LGZ1bmN0aW9uKHQsZSl7dGhpcy5kYXRhc2V0c1tlXS5wb2ludHMucHVzaChuZXcgdGhpcy5Qb2ludENsYXNzKHt2YWx1ZTp0LGxhYmVsOmksZGF0YXNldExhYmVsOnRoaXMuZGF0YXNldHNbZV0ubGFiZWwseDp0aGlzLnNjYWxlLmNhbGN1bGF0ZVgodGhpcy5zY2FsZS52YWx1ZXNDb3VudCsxKSx5OnRoaXMuc2NhbGUuZW5kUG9pbnQsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhc2V0c1tlXS5wb2ludFN0cm9rZUNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGFzZXRzW2VdLnBvaW50Q29sb3J9KSl9LHRoaXMpLHRoaXMuc2NhbGUuYWRkWExhYmVsKGkpLHRoaXMudXBkYXRlKCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oKXt0aGlzLnNjYWxlLnJlbW92ZVhMYWJlbCgpLGUuZWFjaCh0aGlzLmRhdGFzZXRzLGZ1bmN0aW9uKHQpe3QucG9pbnRzLnNoaWZ0KCl9LHRoaXMpLHRoaXMudXBkYXRlKCl9LHJlZmxvdzpmdW5jdGlvbigpe3ZhciB0PWUuZXh0ZW5kKHtoZWlnaHQ6dGhpcy5jaGFydC5oZWlnaHQsd2lkdGg6dGhpcy5jaGFydC53aWR0aH0pO3RoaXMuc2NhbGUudXBkYXRlKHQpfSxkcmF3OmZ1bmN0aW9uKHQpe3ZhciBpPXR8fDE7dGhpcy5jbGVhcigpO3ZhciBzPXRoaXMuY2hhcnQuY3R4LG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10LnZhbHVlfSxvPWZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5maW5kTmV4dFdoZXJlKGksbixzKXx8dH0sYT1mdW5jdGlvbih0LGkscyl7cmV0dXJuIGUuZmluZFByZXZpb3VzV2hlcmUoaSxuLHMpfHx0fTt0aGlzLnNjYWxlJiYodGhpcy5zY2FsZS5kcmF3KGkpLGUuZWFjaCh0aGlzLmRhdGFzZXRzLGZ1bmN0aW9uKHQpe3ZhciBoPWUud2hlcmUodC5wb2ludHMsbik7ZS5lYWNoKHQucG9pbnRzLGZ1bmN0aW9uKHQsZSl7dC5oYXNWYWx1ZSgpJiZ0LnRyYW5zaXRpb24oe3k6dGhpcy5zY2FsZS5jYWxjdWxhdGVZKHQudmFsdWUpLHg6dGhpcy5zY2FsZS5jYWxjdWxhdGVYKGUpfSxpKX0sdGhpcyksdGhpcy5vcHRpb25zLmJlemllckN1cnZlJiZlLmVhY2goaCxmdW5jdGlvbih0LGkpe3ZhciBzPWk+MCYmaTxoLmxlbmd0aC0xP3RoaXMub3B0aW9ucy5iZXppZXJDdXJ2ZVRlbnNpb246MDt0LmNvbnRyb2xQb2ludHM9ZS5zcGxpbmVDdXJ2ZShhKHQsaCxpKSx0LG8odCxoLGkpLHMpLHQuY29udHJvbFBvaW50cy5vdXRlci55PnRoaXMuc2NhbGUuZW5kUG9pbnQ/dC5jb250cm9sUG9pbnRzLm91dGVyLnk9dGhpcy5zY2FsZS5lbmRQb2ludDp0LmNvbnRyb2xQb2ludHMub3V0ZXIueTx0aGlzLnNjYWxlLnN0YXJ0UG9pbnQmJih0LmNvbnRyb2xQb2ludHMub3V0ZXIueT10aGlzLnNjYWxlLnN0YXJ0UG9pbnQpLHQuY29udHJvbFBvaW50cy5pbm5lci55PnRoaXMuc2NhbGUuZW5kUG9pbnQ/dC5jb250cm9sUG9pbnRzLmlubmVyLnk9dGhpcy5zY2FsZS5lbmRQb2ludDp0LmNvbnRyb2xQb2ludHMuaW5uZXIueTx0aGlzLnNjYWxlLnN0YXJ0UG9pbnQmJih0LmNvbnRyb2xQb2ludHMuaW5uZXIueT10aGlzLnNjYWxlLnN0YXJ0UG9pbnQpfSx0aGlzKSxzLmxpbmVXaWR0aD10aGlzLm9wdGlvbnMuZGF0YXNldFN0cm9rZVdpZHRoLHMuc3Ryb2tlU3R5bGU9dC5zdHJva2VDb2xvcixzLmJlZ2luUGF0aCgpLGUuZWFjaChoLGZ1bmN0aW9uKHQsaSl7aWYoMD09PWkpcy5tb3ZlVG8odC54LHQueSk7ZWxzZSBpZih0aGlzLm9wdGlvbnMuYmV6aWVyQ3VydmUpe3ZhciBlPWEodCxoLGkpO3MuYmV6aWVyQ3VydmVUbyhlLmNvbnRyb2xQb2ludHMub3V0ZXIueCxlLmNvbnRyb2xQb2ludHMub3V0ZXIueSx0LmNvbnRyb2xQb2ludHMuaW5uZXIueCx0LmNvbnRyb2xQb2ludHMuaW5uZXIueSx0LngsdC55KX1lbHNlIHMubGluZVRvKHQueCx0LnkpfSx0aGlzKSx0aGlzLm9wdGlvbnMuZGF0YXNldFN0cm9rZSYmcy5zdHJva2UoKSx0aGlzLm9wdGlvbnMuZGF0YXNldEZpbGwmJmgubGVuZ3RoPjAmJihzLmxpbmVUbyhoW2gubGVuZ3RoLTFdLngsdGhpcy5zY2FsZS5lbmRQb2ludCkscy5saW5lVG8oaFswXS54LHRoaXMuc2NhbGUuZW5kUG9pbnQpLHMuZmlsbFN0eWxlPXQuZmlsbENvbG9yLHMuY2xvc2VQYXRoKCkscy5maWxsKCkpLGUuZWFjaChoLGZ1bmN0aW9uKHQpe3QuZHJhdygpfSl9LHRoaXMpKX19KX0uY2FsbCh0aGlzKSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD10aGlzLGk9dC5DaGFydCxlPWkuaGVscGVycyxzPXtzY2FsZVNob3dMYWJlbEJhY2tkcm9wOiEwLHNjYWxlQmFja2Ryb3BDb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjc1KSIsc2NhbGVCZWdpbkF0WmVybzohMCxzY2FsZUJhY2tkcm9wUGFkZGluZ1k6MixzY2FsZUJhY2tkcm9wUGFkZGluZ1g6MixzY2FsZVNob3dMaW5lOiEwLHNlZ21lbnRTaG93U3Ryb2tlOiEwLHNlZ21lbnRTdHJva2VDb2xvcjoiI2ZmZiIsc2VnbWVudFN0cm9rZVdpZHRoOjIsYW5pbWF0aW9uU3RlcHM6MTAwLGFuaW1hdGlvbkVhc2luZzoiZWFzZU91dEJvdW5jZSIsYW5pbWF0ZVJvdGF0ZTohMCxhbmltYXRlU2NhbGU6ITEsbGVnZW5kVGVtcGxhdGU6Jzx1bCBjbGFzcz0iPCU9bmFtZS50b0xvd2VyQ2FzZSgpJT4tbGVnZW5kIj48JSBmb3IgKHZhciBpPTA7IGk8c2VnbWVudHMubGVuZ3RoOyBpKyspeyU+PGxpPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOjwlPXNlZ21lbnRzW2ldLmZpbGxDb2xvciU+Ij48JWlmKHNlZ21lbnRzW2ldLmxhYmVsKXslPjwlPXNlZ21lbnRzW2ldLmxhYmVsJT48JX0lPjwvc3Bhbj48L2xpPjwlfSU+PC91bD4nfTtpLlR5cGUuZXh0ZW5kKHtuYW1lOiJQb2xhckFyZWEiLGRlZmF1bHRzOnMsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLnNlZ21lbnRzPVtdLHRoaXMuU2VnbWVudEFyYz1pLkFyYy5leHRlbmQoe3Nob3dTdHJva2U6dGhpcy5vcHRpb25zLnNlZ21lbnRTaG93U3Ryb2tlLHN0cm9rZVdpZHRoOnRoaXMub3B0aW9ucy5zZWdtZW50U3Ryb2tlV2lkdGgsc3Ryb2tlQ29sb3I6dGhpcy5vcHRpb25zLnNlZ21lbnRTdHJva2VDb2xvcixjdHg6dGhpcy5jaGFydC5jdHgsaW5uZXJSYWRpdXM6MCx4OnRoaXMuY2hhcnQud2lkdGgvMix5OnRoaXMuY2hhcnQuaGVpZ2h0LzJ9KSx0aGlzLnNjYWxlPW5ldyBpLlJhZGlhbFNjYWxlKHtkaXNwbGF5OnRoaXMub3B0aW9ucy5zaG93U2NhbGUsZm9udFN0eWxlOnRoaXMub3B0aW9ucy5zY2FsZUZvbnRTdHlsZSxmb250U2l6ZTp0aGlzLm9wdGlvbnMuc2NhbGVGb250U2l6ZSxmb250RmFtaWx5OnRoaXMub3B0aW9ucy5zY2FsZUZvbnRGYW1pbHksZm9udENvbG9yOnRoaXMub3B0aW9ucy5zY2FsZUZvbnRDb2xvcixzaG93TGFiZWxzOnRoaXMub3B0aW9ucy5zY2FsZVNob3dMYWJlbHMsc2hvd0xhYmVsQmFja2Ryb3A6dGhpcy5vcHRpb25zLnNjYWxlU2hvd0xhYmVsQmFja2Ryb3AsYmFja2Ryb3BDb2xvcjp0aGlzLm9wdGlvbnMuc2NhbGVCYWNrZHJvcENvbG9yLGJhY2tkcm9wUGFkZGluZ1k6dGhpcy5vcHRpb25zLnNjYWxlQmFja2Ryb3BQYWRkaW5nWSxiYWNrZHJvcFBhZGRpbmdYOnRoaXMub3B0aW9ucy5zY2FsZUJhY2tkcm9wUGFkZGluZ1gsbGluZVdpZHRoOnRoaXMub3B0aW9ucy5zY2FsZVNob3dMaW5lP3RoaXMub3B0aW9ucy5zY2FsZUxpbmVXaWR0aDowLGxpbmVDb2xvcjp0aGlzLm9wdGlvbnMuc2NhbGVMaW5lQ29sb3IsbGluZUFyYzohMCx3aWR0aDp0aGlzLmNoYXJ0LndpZHRoLGhlaWdodDp0aGlzLmNoYXJ0LmhlaWdodCx4Q2VudGVyOnRoaXMuY2hhcnQud2lkdGgvMix5Q2VudGVyOnRoaXMuY2hhcnQuaGVpZ2h0LzIsY3R4OnRoaXMuY2hhcnQuY3R4LHRlbXBsYXRlU3RyaW5nOnRoaXMub3B0aW9ucy5zY2FsZUxhYmVsLHZhbHVlc0NvdW50OnQubGVuZ3RofSksdGhpcy51cGRhdGVTY2FsZVJhbmdlKHQpLHRoaXMuc2NhbGUudXBkYXRlKCksZS5lYWNoKHQsZnVuY3Rpb24odCxpKXt0aGlzLmFkZERhdGEodCxpLCEwKX0sdGhpcyksdGhpcy5vcHRpb25zLnNob3dUb29sdGlwcyYmZS5iaW5kRXZlbnRzKHRoaXMsdGhpcy5vcHRpb25zLnRvb2x0aXBFdmVudHMsZnVuY3Rpb24odCl7dmFyIGk9Im1vdXNlb3V0IiE9PXQudHlwZT90aGlzLmdldFNlZ21lbnRzQXRFdmVudCh0KTpbXTtlLmVhY2godGhpcy5zZWdtZW50cyxmdW5jdGlvbih0KXt0LnJlc3RvcmUoWyJmaWxsQ29sb3IiXSl9KSxlLmVhY2goaSxmdW5jdGlvbih0KXt0LmZpbGxDb2xvcj10LmhpZ2hsaWdodENvbG9yfSksdGhpcy5zaG93VG9vbHRpcChpKX0pLHRoaXMucmVuZGVyKCl9LGdldFNlZ21lbnRzQXRFdmVudDpmdW5jdGlvbih0KXt2YXIgaT1bXSxzPWUuZ2V0UmVsYXRpdmVQb3NpdGlvbih0KTtyZXR1cm4gZS5lYWNoKHRoaXMuc2VnbWVudHMsZnVuY3Rpb24odCl7dC5pblJhbmdlKHMueCxzLnkpJiZpLnB1c2godCl9LHRoaXMpLGl9LGFkZERhdGE6ZnVuY3Rpb24odCxpLGUpe3ZhciBzPWl8fHRoaXMuc2VnbWVudHMubGVuZ3RoO3RoaXMuc2VnbWVudHMuc3BsaWNlKHMsMCxuZXcgdGhpcy5TZWdtZW50QXJjKHtmaWxsQ29sb3I6dC5jb2xvcixoaWdobGlnaHRDb2xvcjp0LmhpZ2hsaWdodHx8dC5jb2xvcixsYWJlbDp0LmxhYmVsLHZhbHVlOnQudmFsdWUsb3V0ZXJSYWRpdXM6dGhpcy5vcHRpb25zLmFuaW1hdGVTY2FsZT8wOnRoaXMuc2NhbGUuY2FsY3VsYXRlQ2VudGVyT2Zmc2V0KHQudmFsdWUpLGNpcmN1bWZlcmVuY2U6dGhpcy5vcHRpb25zLmFuaW1hdGVSb3RhdGU/MDp0aGlzLnNjYWxlLmdldENpcmN1bWZlcmVuY2UoKSxzdGFydEFuZ2xlOjEuNSpNYXRoLlBJfSkpLGV8fCh0aGlzLnJlZmxvdygpLHRoaXMudXBkYXRlKCkpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQpe3ZhciBpPWUuaXNOdW1iZXIodCk/dDp0aGlzLnNlZ21lbnRzLmxlbmd0aC0xO3RoaXMuc2VnbWVudHMuc3BsaWNlKGksMSksdGhpcy5yZWZsb3coKSx0aGlzLnVwZGF0ZSgpfSxjYWxjdWxhdGVUb3RhbDpmdW5jdGlvbih0KXt0aGlzLnRvdGFsPTAsZS5lYWNoKHQsZnVuY3Rpb24odCl7dGhpcy50b3RhbCs9dC52YWx1ZX0sdGhpcyksdGhpcy5zY2FsZS52YWx1ZXNDb3VudD10aGlzLnNlZ21lbnRzLmxlbmd0aH0sdXBkYXRlU2NhbGVSYW5nZTpmdW5jdGlvbih0KXt2YXIgaT1bXTtlLmVhY2godCxmdW5jdGlvbih0KXtpLnB1c2godC52YWx1ZSl9KTt2YXIgcz10aGlzLm9wdGlvbnMuc2NhbGVPdmVycmlkZT97c3RlcHM6dGhpcy5vcHRpb25zLnNjYWxlU3RlcHMsc3RlcFZhbHVlOnRoaXMub3B0aW9ucy5zY2FsZVN0ZXBXaWR0aCxtaW46dGhpcy5vcHRpb25zLnNjYWxlU3RhcnRWYWx1ZSxtYXg6dGhpcy5vcHRpb25zLnNjYWxlU3RhcnRWYWx1ZSt0aGlzLm9wdGlvbnMuc2NhbGVTdGVwcyp0aGlzLm9wdGlvbnMuc2NhbGVTdGVwV2lkdGh9OmUuY2FsY3VsYXRlU2NhbGVSYW5nZShpLGUubWluKFt0aGlzLmNoYXJ0LndpZHRoLHRoaXMuY2hhcnQuaGVpZ2h0XSkvMix0aGlzLm9wdGlvbnMuc2NhbGVGb250U2l6ZSx0aGlzLm9wdGlvbnMuc2NhbGVCZWdpbkF0WmVybyx0aGlzLm9wdGlvbnMuc2NhbGVJbnRlZ2Vyc09ubHkpO2UuZXh0ZW5kKHRoaXMuc2NhbGUscyx7c2l6ZTplLm1pbihbdGhpcy5jaGFydC53aWR0aCx0aGlzLmNoYXJ0LmhlaWdodF0pLHhDZW50ZXI6dGhpcy5jaGFydC53aWR0aC8yLHlDZW50ZXI6dGhpcy5jaGFydC5oZWlnaHQvMn0pfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLmNhbGN1bGF0ZVRvdGFsKHRoaXMuc2VnbWVudHMpLGUuZWFjaCh0aGlzLnNlZ21lbnRzLGZ1bmN0aW9uKHQpe3Quc2F2ZSgpfSksdGhpcy5yZWZsb3coKSx0aGlzLnJlbmRlcigpfSxyZWZsb3c6ZnVuY3Rpb24oKXtlLmV4dGVuZCh0aGlzLlNlZ21lbnRBcmMucHJvdG90eXBlLHt4OnRoaXMuY2hhcnQud2lkdGgvMix5OnRoaXMuY2hhcnQuaGVpZ2h0LzJ9KSx0aGlzLnVwZGF0ZVNjYWxlUmFuZ2UodGhpcy5zZWdtZW50cyksdGhpcy5zY2FsZS51cGRhdGUoKSxlLmV4dGVuZCh0aGlzLnNjYWxlLHt4Q2VudGVyOnRoaXMuY2hhcnQud2lkdGgvMix5Q2VudGVyOnRoaXMuY2hhcnQuaGVpZ2h0LzJ9KSxlLmVhY2godGhpcy5zZWdtZW50cyxmdW5jdGlvbih0KXt0LnVwZGF0ZSh7b3V0ZXJSYWRpdXM6dGhpcy5zY2FsZS5jYWxjdWxhdGVDZW50ZXJPZmZzZXQodC52YWx1ZSl9KX0sdGhpcyl9LGRyYXc6ZnVuY3Rpb24odCl7dmFyIGk9dHx8MTt0aGlzLmNsZWFyKCksZS5lYWNoKHRoaXMuc2VnbWVudHMsZnVuY3Rpb24odCxlKXt0LnRyYW5zaXRpb24oe2NpcmN1bWZlcmVuY2U6dGhpcy5zY2FsZS5nZXRDaXJjdW1mZXJlbmNlKCksb3V0ZXJSYWRpdXM6dGhpcy5zY2FsZS5jYWxjdWxhdGVDZW50ZXJPZmZzZXQodC52YWx1ZSl9LGkpLHQuZW5kQW5nbGU9dC5zdGFydEFuZ2xlK3QuY2lyY3VtZmVyZW5jZSwwPT09ZSYmKHQuc3RhcnRBbmdsZT0xLjUqTWF0aC5QSSksZTx0aGlzLnNlZ21lbnRzLmxlbmd0aC0xJiYodGhpcy5zZWdtZW50c1tlKzFdLnN0YXJ0QW5nbGU9dC5lbmRBbmdsZSksdC5kcmF3KCl9LHRoaXMpLHRoaXMuc2NhbGUuZHJhdygpfX0pfS5jYWxsKHRoaXMpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PXRoaXMsaT10LkNoYXJ0LGU9aS5oZWxwZXJzO2kuVHlwZS5leHRlbmQoe25hbWU6IlJhZGFyIixkZWZhdWx0czp7c2NhbGVTaG93TGluZTohMCxhbmdsZVNob3dMaW5lT3V0OiEwLHNjYWxlU2hvd0xhYmVsczohMSxzY2FsZUJlZ2luQXRaZXJvOiEwLGFuZ2xlTGluZUNvbG9yOiJyZ2JhKDAsMCwwLC4xKSIsYW5nbGVMaW5lV2lkdGg6MSxwb2ludExhYmVsRm9udEZhbWlseToiJ0FyaWFsJyIscG9pbnRMYWJlbEZvbnRTdHlsZToibm9ybWFsIixwb2ludExhYmVsRm9udFNpemU6MTAscG9pbnRMYWJlbEZvbnRDb2xvcjoiIzY2NiIscG9pbnREb3Q6ITAscG9pbnREb3RSYWRpdXM6Myxwb2ludERvdFN0cm9rZVdpZHRoOjEscG9pbnRIaXREZXRlY3Rpb25SYWRpdXM6MjAsZGF0YXNldFN0cm9rZTohMCxkYXRhc2V0U3Ryb2tlV2lkdGg6MixkYXRhc2V0RmlsbDohMCxsZWdlbmRUZW1wbGF0ZTonPHVsIGNsYXNzPSI8JT1uYW1lLnRvTG93ZXJDYXNlKCklPi1sZWdlbmQiPjwlIGZvciAodmFyIGk9MDsgaTxkYXRhc2V0cy5sZW5ndGg7IGkrKyl7JT48bGk+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6PCU9ZGF0YXNldHNbaV0uc3Ryb2tlQ29sb3IlPiI+PCVpZihkYXRhc2V0c1tpXS5sYWJlbCl7JT48JT1kYXRhc2V0c1tpXS5sYWJlbCU+PCV9JT48L3NwYW4+PC9saT48JX0lPjwvdWw+J30saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLlBvaW50Q2xhc3M9aS5Qb2ludC5leHRlbmQoe3N0cm9rZVdpZHRoOnRoaXMub3B0aW9ucy5wb2ludERvdFN0cm9rZVdpZHRoLHJhZGl1czp0aGlzLm9wdGlvbnMucG9pbnREb3RSYWRpdXMsZGlzcGxheTp0aGlzLm9wdGlvbnMucG9pbnREb3QsaGl0RGV0ZWN0aW9uUmFkaXVzOnRoaXMub3B0aW9ucy5wb2ludEhpdERldGVjdGlvblJhZGl1cyxjdHg6dGhpcy5jaGFydC5jdHh9KSx0aGlzLmRhdGFzZXRzPVtdLHRoaXMuYnVpbGRTY2FsZSh0KSx0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBzJiZlLmJpbmRFdmVudHModGhpcyx0aGlzLm9wdGlvbnMudG9vbHRpcEV2ZW50cyxmdW5jdGlvbih0KXt2YXIgaT0ibW91c2VvdXQiIT09dC50eXBlP3RoaXMuZ2V0UG9pbnRzQXRFdmVudCh0KTpbXTt0aGlzLmVhY2hQb2ludHMoZnVuY3Rpb24odCl7dC5yZXN0b3JlKFsiZmlsbENvbG9yIiwic3Ryb2tlQ29sb3IiXSl9KSxlLmVhY2goaSxmdW5jdGlvbih0KXt0LmZpbGxDb2xvcj10LmhpZ2hsaWdodEZpbGwsdC5zdHJva2VDb2xvcj10LmhpZ2hsaWdodFN0cm9rZX0pLHRoaXMuc2hvd1Rvb2x0aXAoaSl9KSxlLmVhY2godC5kYXRhc2V0cyxmdW5jdGlvbihpKXt2YXIgcz17bGFiZWw6aS5sYWJlbHx8bnVsbCxmaWxsQ29sb3I6aS5maWxsQ29sb3Isc3Ryb2tlQ29sb3I6aS5zdHJva2VDb2xvcixwb2ludENvbG9yOmkucG9pbnRDb2xvcixwb2ludFN0cm9rZUNvbG9yOmkucG9pbnRTdHJva2VDb2xvcixwb2ludHM6W119O3RoaXMuZGF0YXNldHMucHVzaChzKSxlLmVhY2goaS5kYXRhLGZ1bmN0aW9uKGUsbil7dmFyIG87dGhpcy5zY2FsZS5hbmltYXRpb258fChvPXRoaXMuc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihuLHRoaXMuc2NhbGUuY2FsY3VsYXRlQ2VudGVyT2Zmc2V0KGUpKSkscy5wb2ludHMucHVzaChuZXcgdGhpcy5Qb2ludENsYXNzKHt2YWx1ZTplLGxhYmVsOnQubGFiZWxzW25dLGRhdGFzZXRMYWJlbDppLmxhYmVsLHg6dGhpcy5vcHRpb25zLmFuaW1hdGlvbj90aGlzLnNjYWxlLnhDZW50ZXI6by54LHk6dGhpcy5vcHRpb25zLmFuaW1hdGlvbj90aGlzLnNjYWxlLnlDZW50ZXI6by55LHN0cm9rZUNvbG9yOmkucG9pbnRTdHJva2VDb2xvcixmaWxsQ29sb3I6aS5wb2ludENvbG9yLGhpZ2hsaWdodEZpbGw6aS5wb2ludEhpZ2hsaWdodEZpbGx8fGkucG9pbnRDb2xvcixoaWdobGlnaHRTdHJva2U6aS5wb2ludEhpZ2hsaWdodFN0cm9rZXx8aS5wb2ludFN0cm9rZUNvbG9yfSkpfSx0aGlzKX0sdGhpcyksdGhpcy5yZW5kZXIoKX0sZWFjaFBvaW50czpmdW5jdGlvbih0KXtlLmVhY2godGhpcy5kYXRhc2V0cyxmdW5jdGlvbihpKXtlLmVhY2goaS5wb2ludHMsdCx0aGlzKX0sdGhpcyl9LGdldFBvaW50c0F0RXZlbnQ6ZnVuY3Rpb24odCl7dmFyIGk9ZS5nZXRSZWxhdGl2ZVBvc2l0aW9uKHQpLHM9ZS5nZXRBbmdsZUZyb21Qb2ludCh7eDp0aGlzLnNjYWxlLnhDZW50ZXIseTp0aGlzLnNjYWxlLnlDZW50ZXJ9LGkpLG49MipNYXRoLlBJL3RoaXMuc2NhbGUudmFsdWVzQ291bnQsbz1NYXRoLnJvdW5kKChzLmFuZ2xlLTEuNSpNYXRoLlBJKS9uKSxhPVtdO3JldHVybihvPj10aGlzLnNjYWxlLnZhbHVlc0NvdW50fHwwPm8pJiYobz0wKSxzLmRpc3RhbmNlPD10aGlzLnNjYWxlLmRyYXdpbmdBcmVhJiZlLmVhY2godGhpcy5kYXRhc2V0cyxmdW5jdGlvbih0KXthLnB1c2godC5wb2ludHNbb10pfSksYX0sYnVpbGRTY2FsZTpmdW5jdGlvbih0KXt0aGlzLnNjYWxlPW5ldyBpLlJhZGlhbFNjYWxlKHtkaXNwbGF5OnRoaXMub3B0aW9ucy5zaG93U2NhbGUsZm9udFN0eWxlOnRoaXMub3B0aW9ucy5zY2FsZUZvbnRTdHlsZSxmb250U2l6ZTp0aGlzLm9wdGlvbnMuc2NhbGVGb250U2l6ZSxmb250RmFtaWx5OnRoaXMub3B0aW9ucy5zY2FsZUZvbnRGYW1pbHksZm9udENvbG9yOnRoaXMub3B0aW9ucy5zY2FsZUZvbnRDb2xvcixzaG93TGFiZWxzOnRoaXMub3B0aW9ucy5zY2FsZVNob3dMYWJlbHMsc2hvd0xhYmVsQmFja2Ryb3A6dGhpcy5vcHRpb25zLnNjYWxlU2hvd0xhYmVsQmFja2Ryb3AsYmFja2Ryb3BDb2xvcjp0aGlzLm9wdGlvbnMuc2NhbGVCYWNrZHJvcENvbG9yLGJhY2tncm91bmRDb2xvcnM6dGhpcy5vcHRpb25zLnNjYWxlQmFja2dyb3VuZENvbG9ycyxiYWNrZHJvcFBhZGRpbmdZOnRoaXMub3B0aW9ucy5zY2FsZUJhY2tkcm9wUGFkZGluZ1ksYmFja2Ryb3BQYWRkaW5nWDp0aGlzLm9wdGlvbnMuc2NhbGVCYWNrZHJvcFBhZGRpbmdYLGxpbmVXaWR0aDp0aGlzLm9wdGlvbnMuc2NhbGVTaG93TGluZT90aGlzLm9wdGlvbnMuc2NhbGVMaW5lV2lkdGg6MCxsaW5lQ29sb3I6dGhpcy5vcHRpb25zLnNjYWxlTGluZUNvbG9yLGFuZ2xlTGluZUNvbG9yOnRoaXMub3B0aW9ucy5hbmdsZUxpbmVDb2xvcixhbmdsZUxpbmVXaWR0aDp0aGlzLm9wdGlvbnMuYW5nbGVTaG93TGluZU91dD90aGlzLm9wdGlvbnMuYW5nbGVMaW5lV2lkdGg6MCxwb2ludExhYmVsRm9udENvbG9yOnRoaXMub3B0aW9ucy5wb2ludExhYmVsRm9udENvbG9yLHBvaW50TGFiZWxGb250U2l6ZTp0aGlzLm9wdGlvbnMucG9pbnRMYWJlbEZvbnRTaXplLHBvaW50TGFiZWxGb250RmFtaWx5OnRoaXMub3B0aW9ucy5wb2ludExhYmVsRm9udEZhbWlseSxwb2ludExhYmVsRm9udFN0eWxlOnRoaXMub3B0aW9ucy5wb2ludExhYmVsRm9udFN0eWxlLGhlaWdodDp0aGlzLmNoYXJ0LmhlaWdodCx3aWR0aDp0aGlzLmNoYXJ0LndpZHRoLHhDZW50ZXI6dGhpcy5jaGFydC53aWR0aC8yLHlDZW50ZXI6dGhpcy5jaGFydC5oZWlnaHQvMixjdHg6dGhpcy5jaGFydC5jdHgsdGVtcGxhdGVTdHJpbmc6dGhpcy5vcHRpb25zLnNjYWxlTGFiZWwsbGFiZWxzOnQubGFiZWxzLHZhbHVlc0NvdW50OnQuZGF0YXNldHNbMF0uZGF0YS5sZW5ndGh9KSx0aGlzLnNjYWxlLnNldFNjYWxlU2l6ZSgpLHRoaXMudXBkYXRlU2NhbGVSYW5nZSh0LmRhdGFzZXRzKSx0aGlzLnNjYWxlLmJ1aWxkWUxhYmVscygpfSx1cGRhdGVTY2FsZVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGk9W107cmV0dXJuIGUuZWFjaCh0LGZ1bmN0aW9uKHQpe3QuZGF0YT9pPWkuY29uY2F0KHQuZGF0YSk6ZS5lYWNoKHQucG9pbnRzLGZ1bmN0aW9uKHQpe2kucHVzaCh0LnZhbHVlKX0pfSksaX0oKSxzPXRoaXMub3B0aW9ucy5zY2FsZU92ZXJyaWRlP3tzdGVwczp0aGlzLm9wdGlvbnMuc2NhbGVTdGVwcyxzdGVwVmFsdWU6dGhpcy5vcHRpb25zLnNjYWxlU3RlcFdpZHRoLG2M3O9WIlQBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0QSNAAEAGabrAqAc2wKgHYJUpH/XDTBuGUf5QQ4AQBDqnCAAAAQEICgCjXroATaW2jNzvVjVUAQBpBwAAaQcAAGj3KB/SxQgAJ60eEwgARQAHW+X8QABABr25wKgHYMCoBzYf9ZUpUf5QQ8NMG4aAGADtlzQAAAEBCAoATaW2AKNeumluOnRoaXMub3B0aW9ucy5zY2FsZVN0YXJ0VmFsdWUsbWF4OnRoaXMub3B0aW9ucy5zY2FsZVN0YXJ0VmFsdWUrdGhpcy5vcHRpb25zLnNjYWxlU3RlcHMqdGhpcy5vcHRpb25zLnNjYWxlU3RlcFdpZHRofTplLmNhbGN1bGF0ZVNjYWxlUmFuZ2UoaSxlLm1pbihbdGhpcy5jaGFydC53aWR0aCx0aGlzLmNoYXJ0LmhlaWdodF0pLzIsdGhpcy5vcHRpb25zLnNjYWxlRm9udFNpemUsdGhpcy5vcHRpb25zLnNjYWxlQmVnaW5BdFplcm8sdGhpcy5vcHRpb25zLnNjYWxlSW50ZWdlcnNPbmx5KTtlLmV4dGVuZCh0aGlzLnNjYWxlLHMpfSxhZGREYXRhOmZ1bmN0aW9uKHQsaSl7dGhpcy5zY2FsZS52YWx1ZXNDb3VudCsrLGUuZWFjaCh0LGZ1bmN0aW9uKHQsZSl7dmFyIHM9dGhpcy5zY2FsZS5nZXRQb2ludFBvc2l0aW9uKHRoaXMuc2NhbGUudmFsdWVzQ291bnQsdGhpcy5zY2FsZS5jYWxjdWxhdGVDZW50ZXJPZmZzZXQodCkpO3RoaXMuZGF0YXNldHNbZV0ucG9pbnRzLnB1c2gobmV3IHRoaXMuUG9pbnRDbGFzcyh7dmFsdWU6dCxsYWJlbDppLGRhdGFzZXRMYWJlbDp0aGlzLmRhdGFzZXRzW2VdLmxhYmVsLHg6cy54LHk6cy55LHN0cm9rZUNvbG9yOnRoaXMuZGF0YXNldHNbZV0ucG9pbnRTdHJva2VDb2xvcixmaWxsQ29sb3I6dGhpcy5kYXRhc2V0c1tlXS5wb2ludENvbG9yfSkpfSx0aGlzKSx0aGlzLnNjYWxlLmxhYmVscy5wdXNoKGkpLHRoaXMucmVmbG93KCksdGhpcy51cGRhdGUoKX0scmVtb3ZlRGF0YTpmdW5jdGlvbigpe3RoaXMuc2NhbGUudmFsdWVzQ291bnQtLSx0aGlzLnNjYWxlLmxhYmVscy5zaGlmdCgpLGUuZWFjaCh0aGlzLmRhdGFzZXRzLGZ1bmN0aW9uKHQpe3QucG9pbnRzLnNoaWZ0KCl9LHRoaXMpLHRoaXMucmVmbG93KCksdGhpcy51cGRhdGUoKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5lYWNoUG9pbnRzKGZ1bmN0aW9uKHQpe3Quc2F2ZSgpfSksdGhpcy5yZWZsb3coKSx0aGlzLnJlbmRlcigpfSxyZWZsb3c6ZnVuY3Rpb24oKXtlLmV4dGVuZCh0aGlzLnNjYWxlLHt3aWR0aDp0aGlzLmNoYXJ0LndpZHRoLGhlaWdodDp0aGlzLmNoYXJ0LmhlaWdodCxzaXplOmUubWluKFt0aGlzLmNoYXJ0LndpZHRoLHRoaXMuY2hhcnQuaGVpZ2h0XSkseENlbnRlcjp0aGlzLmNoYXJ0LndpZHRoLzIseUNlbnRlcjp0aGlzLmNoYXJ0LmhlaWdodC8yfSksdGhpcy51cGRhdGVTY2FsZVJhbmdlKHRoaXMuZGF0YXNldHMpLHRoaXMuc2NhbGUuc2V0U2NhbGVTaXplKCksdGhpcy5zY2FsZS5idWlsZFlMYWJlbHMoKX0sZHJhdzpmdW5jdGlvbih0KXt2YXIgaT10fHwxLHM9dGhpcy5jaGFydC5jdHg7dGhpcy5jbGVhcigpLHRoaXMuc2NhbGUuZHJhdygpLGUuZWFjaCh0aGlzLmRhdGFzZXRzLGZ1bmN0aW9uKHQpe2UuZWFjaCh0LnBvaW50cyxmdW5jdGlvbih0LGUpe3QuaGFzVmFsdWUoKSYmdC50cmFuc2l0aW9uKHRoaXMuc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihlLHRoaXMuc2NhbGUuY2FsY3VsYXRlQ2VudGVyT2Zmc2V0KHQudmFsdWUpKSxpKX0sdGhpcykscy5saW5lV2lkdGg9dGhpcy5vcHRpb25zLmRhdGFzZXRTdHJva2VXaWR0aCxzLnN0cm9rZVN0eWxlPXQuc3Ryb2tlQ29sb3Iscy5iZWdpblBhdGgoKSxlLmVhY2godC5wb2ludHMsZnVuY3Rpb24odCxpKXswPT09aT9zLm1vdmVUbyh0LngsdC55KTpzLmxpbmVUbyh0LngsdC55KX0sdGhpcykscy5jbG9zZVBhdGgoKSxzLnN0cm9rZSgpLHMuZmlsbFN0eWxlPXQuZmlsbENvbG9yLHRoaXMub3B0aW9ucy5kYXRhc2V0RmlsbCYmcy5maWxsKCksZS5lYWNoKHQucG9pbnRzLGZ1bmN0aW9uKHQpe3QuaGFzVmFsdWUoKSYmdC5kcmF3KCl9KX0sdGhpcyl9fSl9LmNhbGwodGhpcyk7DQqM3O9WYFQBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0QSRAAEAGabnAqAc2wKgHYJUpH/XDTBuGUf5XaoAQBFefxAAAAQEICgCjXroATaW2jNzvVrhVAQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOeX+QABABsTZwKgHYMCoBzYf9ZUpUf5XasNMG4aAGADtkBIAAAEBCAoATaW2AKNeujANCg0KjNzvVupVAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANEElQABABmm4wKgHNsCoB2CVKR/1w0wbhlH+V2+AEARXn74AAAEBCAoAo167AE2ltozc71ajWAEAyQIAAMkCAAAIACetHhNo9ygf0sUIAEUAArtBJkAAQAZnMMCoBzbAqAdglSkf9cNMG4ZR/ldvgBgEV3zQAAABAQgKAKNeuwBNpbZHRVQgL29ub3MvdWkvYXBwL29ub3MuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bWWQEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHyOy0AAQAb/ycCoB2DAqAc2H/WVJcSMEccUCUwUgBAA7axVAAABAQgKAE2ltgCjXrZIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo4MDAwDQovKioKICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjMuNQogKiAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZwogKiBMaWNlbnNlOiBNSVQKICovCihmdW5jdGlvbih3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkgeyd1c2Ugc3RyaWN0JzsKCi8qKgogKiBAbmdkb2MgbW9kdWxlCiAqIEBuYW1lIG5nUm91dGUKICogQGRlc2NyaXB0aW9uCiAqCiAqICMgbmdSb3V0ZQogKgogKiBUaGUgYG5nUm91dGVgIG1vZHVsZSBwcm92aWRlcyByb3V0aW5nIGFuZCBkZWVwbGlua2luZyBzZXJ2aWNlcyBhbmQgZGlyZWN0aXZlcyBmb3IgYW5ndWxhciBhcHBzLgogKgogKiAjIyBFeGFtcGxlCiAqIFNlZSB7QGxpbmsgbmdSb3V0ZS4kcm91dGUjZXhhbXBsZSAkcm91dGV9IGZvciBhbiBleGFtcGxlIG9mIGNvbmZpZ3VyaW5nIGFuZCB1c2luZyBgbmdSb3V0ZWAuCiAqCiAqCiAqIDxkaXYgZG9jLW1vZHVsZS1jb21wb25lbnRzPSJuZ1JvdXRlIj48L2Rpdj4KICovCiAvKiBnbG9iYWwgLW5nUm91dGVNb2R1bGUgKi8KdmFyIG5nUm91dGVNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbmdSb3V0ZScsIFsnbmcnXSkuCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyKCckcm91dGUnLCAkUm91dGVQcm92aWRlciksCiAgICAkcm91dGVNaW5FcnIgPSBhbmd1bGFyLiQkbWluRXJyKCduZ1JvdXRlJyk7CgovKioKICogQG5nZG9jIHByb3ZpZGVyCiAqIEBuYW1lICRyb3V0ZVByb3ZpZGVyCiAqCiAqIEBkZXNjcmlwdGlvbgogKgogKiBVc2VkIGZvciBjb25maWd1cmluZyByb3V0ZXMuCiAqCiAqICMjIEV4YW1wbGUKICogU2VlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSNleGFtcGxlICRyb3V0ZX0gZm9yIGFuIGV4YW1wbGUgb2YgY29uZmlndXJpbmcgYW5kIHVzaW5nIGBuZ1JvdXRlYC4KICoKICogIyMgRGVwZW5kZW5jaWVzCiAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdSb3V0ZSBgbmdSb3V0ZWB9IG1vZHVsZSB0byBiZSBpbnN0YWxsZWQuCiAqLwpmdW5jdGlvbiAkUm91dGVQcm92aWRlcigpIHsKICBmdW5jdGlvbiBpbmhlcml0KHBhcmVudCwgZXh0cmEpIHsKICAgIHJldHVybiBhbmd1bGFyLmV4dGVuZChPYmplY3QuY3JlYXRlKHBhcmVudCksIGV4dHJhKTsKICB9CgogIHZhciByb3V0ZXMgPSB7fTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRyb3V0ZVByb3ZpZGVyI3doZW4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFJvdXRlIHBhdGggKG1hdGNoZWQgYWdhaW5zdCBgJGxvY2F0aW9uLnBhdGhgKS4gSWYgYCRsb2NhdGlvbi5wYXRoYAogICAqICAgIGNvbnRhaW5zIHJlZHVuZGFudCB0cmFpbGluZyBzbGFzaCBvciBpcyBtaXNzaW5nIG9uZSwgdGhlIHJvdXRlIHdpbGwgc3RpbGwgbWF0Y2ggYW5kIHRoZQogICAqICAgIGAkbG9jYXRpb24ucGF0aGAgd2lsbCBiZSB1cGRhdGVkIHRvIGFkZCBvciBkcm9wIHRoZSB0cmFpbGluZyBzbGFzaCB0byBleGFjdGx5IG1hdGNoIHRoZQogICAqICAgIHJvdXRlIGRlZmluaXRpb24uCiAgICoKICAgKiAgICAqIGBwYXRoYCBjYW4gY29udGFpbiBuYW1lZCBncm91cHMgc3RhcnRpbmcgd2l0aCBhIGNvbG9uOiBlLmcuIGA6bmFtZWAuIEFsbCBjaGFyYWN0ZXJzIHVwCiAgICogICAgICAgIHRvIHRoZSBuZXh0IHNsYXNoIGFyZSBtYXRjaGVkIGFuZCBzdG9yZWQgaW4gYCRyb3V0ZVBhcmFtc2AgdW5kZXIgdGhlIGdpdmVuIGBuYW1lYAogICAqICAgICAgICB3aGVuIHRoZSByb3V0ZSBtYXRjaGVzLgogICAqICAgICogYHBhdGhgIGNhbiBjb250YWluIG5hbWVkIGdyb3VwcyBzdGFydGluZyB3aXRoIGEgY29sb24gYW5kIGVuZGluZyB3aXRoIGEgc3RhcjoKICAgKiAgICAgICAgZS5nLmA6bmFtZSpgLiBBbGwgY2hhcmFjdGVycyBhcmUgZWFnZXJseSBzdG9yZWQgaW4gYCRyb3V0ZVBhcmFtc2AgdW5kZXIgdGhlIGdpdmVuIGBuYW1lYAogICAqICAgICAgICB3aGVuIHRoZSByb3V0ZSBtYXRjaGVzLgogICAqICAgICogYHBhdGhgIGNhbiBjb250YWluIG9wdGlvbmFsIG5hbWVkIGdyb3VwcyB3aXRoIGEgcXVlc3Rpb24gbWFyazogZS5nLmA6bmFtZT9gLgogICAqCiAgICogICAgRm9yIGV4YW1wbGUsIHJvdXRlcyBsaWtlIGAvY29sb3IvOmNvbG9yL2xhcmdlY29kZS86bGFyZ2Vjb2RlKlwvZWRpdGAgd2lsbCBtYXRjaAogICAqICAgIGAvY29sb3IvYnJvd24vbGFyZ2Vjb2RlL2NvZGUvd2l0aC9zbGFzaGVzL2VkaXRgIGFuZCBleHRyYWN0OgogICAqCiAgICogICAgKiBgY29sb3I6IGJyb3duYAogICAqICAgICogYGxhcmdlY29kZTogY29kZS93aXRoL3NsYXNoZXNgLgogICAqCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gcm91dGUgTWFwcGluZyBpbmZvcm1hdGlvbiB0byBiZSBhc3NpZ25lZCB0byBgJHJvdXRlLmN1cnJlbnRgIG9uIHJvdXRlCiAgICogICAgbWF0Y2guCiAgICoKICAgKiAgICBPYmplY3QgcHJvcGVydGllczoKICAgKgogICAqICAgIC0gYGNvbnRyb2xsZXJgIOKAkyBgeyhzdHJpbmd8ZnVuY3Rpb24oKT19YCDigJMgQ29udHJvbGxlciBmbiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGgKICAgKiAgICAgIG5ld2x5IGNyZWF0ZWQgc2NvcGUgb3IgdGhlIG5hbWUgb2YgYSB7QGxpbmsgYW5ndWxhci5Nb2R1bGUjY29udHJvbGxlciByZWdpc3RlcmVkCiAgICogICAgICBjb250cm9sbGVyfSBpZiBwYXNzZWQgYXMgYSBzdHJpbmcuCiAgICogICAgLSBgY29udHJvbGxlckFzYCDigJMgYHtzdHJpbmc9fWAg4oCTIEEgY29udHJvbGxlciBhbGlhcyBuYW1lLiBJZiBwcmVzZW50IHRoZSBjb250cm9sbGVyIHdpbGwgYmUKICAgKiAgICAgIHB1Ymxpc2hlZCB0byBzY29wZSB1bmRlciB0aGUgYGNvbnRyb2xsZXJBc2AgbmFtZS4KICAgKiAgICAtIGB0ZW1wbGF0ZWAg4oCTIGB7c3RyaW5nPXxmdW5jdGlvbigpPX1gIOKAkyBodG1sIHRlbXBsYXRlIGFzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdAogICAqICAgICAgcmV0dXJucyBhbiBodG1sIHRlbXBsYXRlIGFzIGEgc3RyaW5nIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHtAbGluawogICAqICAgICAgbmdSb3V0ZS5kaXJlY3RpdmU6bmdWaWV3IG5nVmlld30gb3Ige0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luY2x1ZGUgbmdJbmNsdWRlfSBkaXJlY3RpdmVzLgogICAqICAgICAgVGhpcyBwcm9wZXJ0eSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYHRlbXBsYXRlVXJsYC4KICAgKgogICAqICAgICAgSWYgYHRlbXBsYXRlYCBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICAgKgogICAqICAgICAgLSBge0FycmF5LjxPYmplY3Q+fWAgLSByb3V0ZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBjdXJyZW50CiAgICogICAgICAgIGAkbG9jYXRpb24ucGF0aCgpYCBieSBhcHBseWluZyB0aGUgY3VycmVudCByb3V0ZQogICAqCiAgICogICAgLSBgdGVtcGxhdGVVcmxgIOKAkyBge3N0cmluZz18ZnVuY3Rpb24oKT19YCDigJMgcGF0aCBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwYXRoIHRvIGFuIGh0bWwKICAgKiAgICAgIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkge0BsaW5rIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBuZ1ZpZXd9LgogICAqCiAgICogICAgICBJZiBgdGVtcGxhdGVVcmxgIGlzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogICAqCiAgICogICAgICAtIGB7QXJyYXkuPE9iamVjdD59YCAtIHJvdXRlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQKICAgKiAgICAgICAgYCRsb2NhdGlvbi5wYXRoKClgIGJ5IGFwcGx5aW5nIHRoZSBjdXJyZW50IHJvdXRlCiAgICoKICAgKiAgICAtIGByZXNvbHZlYCAtIGB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPj19YCAtIEFuIG9wdGlvbmFsIG1hcCBvZiBkZXBlbmRlbmNpZXMgd2hpY2ggc2hvdWxkCiAgICogICAgICBiZSBpbmplY3RlZCBpbnRvIHRoZSBjb250cm9sbGVyLiBJZiBhbnkgb2YgdGhlc2UgZGVwZW5kZW5jaWVzIGFyZSBwcm9taXNlcywgdGhlIHJvdXRlcgogICAqICAgICAgd2lsbCB3YWl0IGZvciB0aGVtIGFsbCB0byBiZSByZXNvbHZlZCBvciBvbmUgdG8gYmUgcmVqZWN0ZWQgYmVmb3JlIHRoZSBjb250cm9sbGVyIGlzCiAgICogICAgICBpbnN0YW50aWF0ZWQuCiAgICogICAgICBJZiBhbGwgdGhlIHByb21pc2VzIGFyZSByZXNvbHZlZCBzdWNjZXNzZnVsbHksIHRoZSB2YWx1ZXMgb2YgdGhlIHJlc29sdmVkIHByb21pc2VzIGFyZQogICAqICAgICAgaW5qZWN0ZWQgYW5kIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSMkcm91dGVDaGFuZ2VTdWNjZXNzICRyb3V0ZUNoYW5nZVN1Y2Nlc3N9IGV2ZW50IGlzCiAgICogICAgICBmaXJlZC4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBhcmUgcmVqZWN0ZWQgdGhlCiAgICogICAgICB7QGxpbmsgbmdSb3V0ZS4kcm91dGUjJHJvdXRlQ2hhbmdlRXJyb3IgJHJvdXRlQ2hhbmdlRXJyb3J9IGV2ZW50IGlzIGZpcmVkLiBUaGUgbWFwIG9iamVjdAogICAqICAgICAgaXM6CiAgICoKICAgKiAgICAgIC0gYGtleWAg4oCTIGB7c3RyaW5nfWA6IGEgbmFtZSBvZiBhIGRlcGVuZGVuY3kgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgY29udHJvbGxlci4KICAgKiAgICAgIC0gYGZhY3RvcnlgIC0gYHtzdHJpbmd8ZnVuY3Rpb259YDogSWYgYHN0cmluZ2AgdGhlbiBpdCBpcyBhbiBhbGlhcyBmb3IgYSBzZXJ2aWNlLgogICAqICAgICAgICBPdGhlcndpc2UgaWYgZnVuY3Rpb24sIHRoZW4gaXQgaXMge0BsaW5rIGF1dG8uJGluamVjdG9yI2ludm9rZSBpbmplY3RlZH0KICAgKiAgICAgICAgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJlYXRlZCBhcyB0aGUgZGVwZW5kZW5jeS4gSWYgdGhlIHJlc3VsdCBpcyBhIHByb21pc2UsIGl0IGlzCiAgICogICAgICAgIHJlc29sdmVkIGJlZm9yZSBpdHMgdmFsdWUgaXMgaW5qZWN0ZWQgaW50byB0aGUgY29udHJvbGxlci4gQmUgYXdhcmUgdGhhdAogICAqICAgICAgICBgbmdSb3V0ZS4kcm91dGVQYXJhbXNgIHdpbGwgc3RpbGwgcmVmZXIgdG8gdGhlIHByZXZpb3VzIHJvdXRlIHdpdGhpbiB0aGVzZSByZXNvbHZlCiAgICogICAgICAgIGZ1bmN0aW9ucy4gIFVzZSBgJHJvdXRlLmN1cnJlbnQucGFyYW1zYCB0byBhY2Nlc3MgdGhlIG5ldyByb3V0ZSBwYXJhbWV0ZXJzLCBpbnN0ZWFkLgogICAqCiAgICogICAgLSBgcmVkaXJlY3RUb2Ag4oCTIHsoc3RyaW5nfGZ1bmN0aW9uKCkpPX0g4oCTIHZhbHVlIHRvIHVwZGF0ZQogICAqICAgICAge0BsaW5rIG5nLiRsb2NhdGlvbiAkbG9jYXRpb259IHBhdGggd2l0aCBhbmQgdHJpZ2dlciByb3V0ZSByZWRpcmVjdGlvbi4KICAgKgogICAqICAgICAgSWYgYHJlZGlyZWN0VG9gIGlzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogICAqCiAgICogICAgICAtIGB7T2JqZWN0LjxzdHJpbmc+fWAgLSByb3V0ZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBjdXJyZW50CiAgICogICAgICAgIGAkbG9jYXRpb24ucGF0aCgpYCBieSBhcHBseWluZyB0aGUgY3VycmVudCByb3V0ZSB0ZW1wbGF0ZVVybC4KICAgKiAgICAgIC0gYHtzdHJpbmd9YCAtIGN1cnJlbnQgYCRsb2NhdGlvbi5wYXRoKClgCiAgICogICAgICAtIGB7T2JqZWN0fWAgLSBjdXJyZW50IGAkbG9jYXRpb24uc2VhcmNoKClgCiAgICoKICAgKiAgICAgIFRoZSBjdXN0b20gYHJlZGlyZWN0VG9gIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQKICAgKiAgICAgIHRvIHVwZGF0ZSBgJGxvY2F0aW9uLnBhdGgoKWAgYW5kIGAkbG9jYXRpb24uc2VhcmNoKClgLgogICAqCiAgICogICAgLSBgW3JlbG9hZE9uU2VhcmNoPXRydWVdYCAtIHtib29sZWFuPX0gLSByZWxvYWQgcm91dGUgd2hlbiBvbmx5IGAkbG9jYXRpb24uc2VhcmNoKClgCiAgICogICAgICBvciBgJGxvY2F0aW9uLmhhc2goKWAgY2hhbmdlcy4KICAgKgogICAqICAgICAgSWYgdGhlIG9wdGlvbiBpcyBzZXQgdG8gYGZhbHNlYCBhbmQgdXJsIGluIHRoZSBicm93c2VyIGNoYW5nZXMsIHRoZW4KICAgKiAgICAgIGAkcm91dGVVcGRhdGVgIGV2ZW50IGlzIGJyb2FkY2FzdGVkIG9uIHRoZSByb290IHNjb3BlLgogICAqCiAgICogICAgLSBgW2Nhc2VJbnNlbnNpdGl2ZU1hdGNoPWZhbHNlXWAgLSB7Ym9vbGVhbj19IC0gbWF0Y2ggcm91dGVzIHdpdGhvdXQgYmVpbmcgY2FzZSBzZW5zaXRpdmUKICAgKgogICAqICAgICAgSWYgdGhlIG9wdGlvbiBpcyBzZXQgdG8gYHRydWVgLCB0aGVuIHRoZSBwYXJ0aWN1bGFyIHJvdXRlIGNhbiBiZSBtYXRjaGVkIHdpdGhvdXQgYmVpbmcKICAgKiAgICAgIGNhc2Ugc2Vuc2l0aXZlCiAgICoKICAgKiBAcmV0dXJucyB7T2JqZWN0fSBzZWxmCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBBZGRzIGEgbmV3IHJvdXRlIGRlZmluaXRpb24gdG8gdGhlIGAkcm91dGVgIHNlcnZpY2UuCiAgICovCiAgdGhpcy53aGVuID0gZnVuY3Rpb24ocGF0aCwgcm91dGUpIHsKICAgIC8vY29weSBvcmlnaW5hbCByb3V0ZSBvYmplY3QgdG8gcHJlc2VydmUgcGFyYW1zIGluaGVyaXRlZCBmcm9tIHByb3RvIGNoYWluCiAgICB2YXIgcm91dGVDb3B5ID0gYW5ndWxhci5jb3B5KHJvdXRlKTsKICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHJvdXRlQ29weS5yZWxvYWRPblNlYXJjaCkpIHsKICAgICAgcm91dGVDb3B5LnJlbG9hZE9uU2VhcmNoID0gdHJ1ZTsKICAgIH0KICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHJvdXRlQ29weS5jYXNlSW5zZW5zaXRpdmVNYXRjaCkpIHsKICAgICAgcm91dGVDb3B5LmNhc2VJbnNlbnNpdGl2ZU1hdGNoID0gdGhpcy5jYXNlSW5zZW5zaXRpdmVNYXRjaDsKICAgIH0KICAgIHJvdXRlc1twYXRoXSA9IGFuZ3VsYXIuZXh0ZW5kKAogICAgICByb3V0ZUNvcHksCiAgICAgIHBhdGggJiYgcGF0aFJlZ0V4cChwYXRoLCByb3V0ZUNvcHkpCiAgICApOwoKICAgIC8vIGNyZWF0ZSByZWRpcmVjdGlvbiBmb3IgdHJhaWxpbmcgc2xhc2hlcwogICAgaWYgKHBhdGgpIHsKICAgICAgdmFyIHJlZGlyZWN0UGF0aCA9IChwYXRoW3BhjNzvVjVaAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANBGIQABABplVwKgHNsCoB2CVJR/1FAlMFMSMLg+AEAFW2EoAAAEBCAoAo167AE2ltozc71ZUWgEAihwAAIocAABo9ygf0sUIACetHhMIAEUAHHyO0EAAQAb/xMCoB2DAqAc2H/WVJcSMLg8UCUwUgBAA7axVAAABAQgKAE2ltgCjXrZ0aC5sZW5ndGggLSAxXSA9PSAnLycpCiAgICAgICAgICAgID8gcGF0aC5zdWJzdHIoMCwgcGF0aC5sZW5ndGggLSAxKQogICAgICAgICAgICA6IHBhdGggKyAnLyc7CgogICAgICByb3V0ZXNbcmVkaXJlY3RQYXRoXSA9IGFuZ3VsYXIuZXh0ZW5kKAogICAgICAgIHtyZWRpcmVjdFRvOiBwYXRofSwKICAgICAgICBwYXRoUmVnRXhwKHJlZGlyZWN0UGF0aCwgcm91dGVDb3B5KQogICAgICApOwogICAgfQoKICAgIHJldHVybiB0aGlzOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBwcm9wZXJ0eQogICAqIEBuYW1lICRyb3V0ZVByb3ZpZGVyI2Nhc2VJbnNlbnNpdGl2ZU1hdGNoCiAgICogQGRlc2NyaXB0aW9uCiAgICoKICAgKiBBIGJvb2xlYW4gcHJvcGVydHkgaW5kaWNhdGluZyBpZiByb3V0ZXMgZGVmaW5lZAogICAqIHVzaW5nIHRoaXMgcHJvdmlkZXIgc2hvdWxkIGJlIG1hdGNoZWQgdXNpbmcgYSBjYXNlIGluc2Vuc2l0aXZlCiAgICogYWxnb3JpdGhtLiBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqLwogIHRoaXMuY2FzZUluc2Vuc2l0aXZlTWF0Y2ggPSBmYWxzZTsKCiAgIC8qKgogICAgKiBAcGFyYW0gcGF0aCB7c3RyaW5nfSBwYXRoCiAgICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IG9wdGlvbnMKICAgICogQHJldHVybiB7P09iamVjdH0KICAgICoKICAgICogQGRlc2NyaXB0aW9uCiAgICAqIE5vcm1hbGl6ZXMgdGhlIGdpdmVuIHBhdGgsIHJldHVybmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgKiBhbmQgdGhlIG9yaWdpbmFsIHBhdGguCiAgICAqCiAgICAqIEluc3BpcmVkIGJ5IHBhdGhSZXhwIGluIHZpc2lvbm1lZGlhL2V4cHJlc3MvbGliL3V0aWxzLmpzLgogICAgKi8KICBmdW5jdGlvbiBwYXRoUmVnRXhwKHBhdGgsIG9wdHMpIHsKICAgIHZhciBpbnNlbnNpdGl2ZSA9IG9wdHMuY2FzZUluc2Vuc2l0aXZlTWF0Y2gsCiAgICAgICAgcmV0ID0gewogICAgICAgICAgb3JpZ2luYWxQYXRoOiBwYXRoLAogICAgICAgICAgcmVnZXhwOiBwYXRoCiAgICAgICAgfSwKICAgICAgICBrZXlzID0gcmV0LmtleXMgPSBbXTsKCiAgICBwYXRoID0gcGF0aAogICAgICAucmVwbGFjZSgvKFsoKS5dKS9nLCAnXFwkMScpCiAgICAgIC5yZXBsYWNlKC8oXC8pPzooXHcrKShbXD9cKl0pPy9nLCBmdW5jdGlvbihfLCBzbGFzaCwga2V5LCBvcHRpb24pIHsKICAgICAgICB2YXIgb3B0aW9uYWwgPSBvcHRpb24gPT09ICc/JyA/IG9wdGlvbiA6IG51bGw7CiAgICAgICAgdmFyIHN0YXIgPSBvcHRpb24gPT09ICcqJyA/IG9wdGlvbiA6IG51bGw7CiAgICAgICAga2V5cy5wdXNoKHsgbmFtZToga2V5LCBvcHRpb25hbDogISFvcHRpb25hbCB9KTsKICAgICAgICBzbGFzaCA9IHNsYXNoIHx8ICcnOwogICAgICAgIHJldHVybiAnJwogICAgICAgICAgKyAob3B0aW9uYWwgPyAnJyA6IHNsYXNoKQogICAgICAgICAgKyAnKD86JwogICAgICAgICAgKyAob3B0aW9uYWwgPyBzbGFzaCA6ICcnKQogICAgICAgICAgKyAoc3RhciAmJiAnKC4rPyknIHx8ICcoW14vXSspJykKICAgICAgICAgICsgKG9wdGlvbmFsIHx8ICcnKQogICAgICAgICAgKyAnKScKICAgICAgICAgICsgKG9wdGlvbmFsIHx8ICcnKTsKICAgICAgfSkKICAgICAgLnJlcGxhY2UoLyhbXC8kXCpdKS9nLCAnXFwkMScpOwoKICAgIHJldC5yZWdleHAgPSBuZXcgUmVnRXhwKCdeJyArIHBhdGggKyAnJCcsIGluc2Vuc2l0aXZlID8gJ2knIDogJycpOwogICAgcmV0dXJuIHJldDsKICB9CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkcm91dGVQcm92aWRlciNvdGhlcndpc2UKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFNldHMgcm91dGUgZGVmaW5pdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBvbiByb3V0ZSBjaGFuZ2Ugd2hlbiBubyBvdGhlciByb3V0ZSBkZWZpbml0aW9uCiAgICogaXMgbWF0Y2hlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gcGFyYW1zIE1hcHBpbmcgaW5mb3JtYXRpb24gdG8gYmUgYXNzaWduZWQgdG8gYCRyb3V0ZS5jdXJyZW50YC4KICAgKiBJZiBjYWxsZWQgd2l0aCBhIHN0cmluZywgdGhlIHZhbHVlIG1hcHMgdG8gYHJlZGlyZWN0VG9gLgogICAqIEByZXR1cm5zIHtPYmplY3R9IHNlbGYKICAgKi8KICB0aGlzLm90aGVyd2lzZSA9IGZ1bmN0aW9uKHBhcmFtcykgewogICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7CiAgICAgIHBhcmFtcyA9IHtyZWRpcmVjdFRvOiBwYXJhbXN9OwogICAgfQogICAgdGhpcy53aGVuKG51bGwsIHBhcmFtcyk7CiAgICByZXR1cm4gdGhpczsKICB9OwoKCiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywKICAgICAgICAgICAgICAgJyRsb2NhdGlvbicsCiAgICAgICAgICAgICAgICckcm91dGVQYXJhbXMnLAogICAgICAgICAgICAgICAnJHEnLAogICAgICAgICAgICAgICAnJGluamVjdG9yJywKICAgICAgICAgICAgICAgJyR0ZW1wbGF0ZVJlcXVlc3QnLAogICAgICAgICAgICAgICAnJHNjZScsCiAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zLCAkcSwgJGluamVjdG9yLCAkdGVtcGxhdGVSZXF1ZXN0LCAkc2NlKSB7CgogICAgLyoqCiAgICAgKiBAbmdkb2Mgc2VydmljZQogICAgICogQG5hbWUgJHJvdXRlCiAgICAgKiBAcmVxdWlyZXMgJGxvY2F0aW9uCiAgICAgKiBAcmVxdWlyZXMgJHJvdXRlUGFyYW1zCiAgICAgKgogICAgICogQHByb3BlcnR5IHtPYmplY3R9IGN1cnJlbnQgUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJvdXRlIGRlZmluaXRpb24uCiAgICAgKiBUaGUgcm91dGUgZGVmaW5pdGlvbiBjb250YWluczoKICAgICAqCiAgICAgKiAgIC0gYGNvbnRyb2xsZXJgOiBUaGUgY29udHJvbGxlciBjb25zdHJ1Y3RvciBhcyBkZWZpbmUgaW4gcm91dGUgZGVmaW5pdGlvbi4KICAgICAqICAgLSBgbG9jYWxzYDogQSBtYXAgb2YgbG9jYWxzIHdoaWNoIGlzIHVzZWQgYnkge0BsaW5rIG5nLiRjb250cm9sbGVyICRjb250cm9sbGVyfSBzZXJ2aWNlIGZvcgogICAgICogICAgIGNvbnRyb2xsZXIgaW5zdGFudGlhdGlvbi4gVGhlIGBsb2NhbHNgIGNvbnRhaW4KICAgICAqICAgICB0aGUgcmVzb2x2ZWQgdmFsdWVzIG9mIHRoZSBgcmVzb2x2ZWAgbWFwLiBBZGRpdGlvbmFsbHkgdGhlIGBsb2NhbHNgIGFsc28gY29udGFpbjoKICAgICAqCiAgICAgKiAgICAgLSBgJHNjb3BlYCAtIFRoZSBjdXJyZW50IHJvdXRlIHNjb3BlLgogICAgICogICAgIC0gYCR0ZW1wbGF0ZWAgLSBUaGUgY3VycmVudCByb3V0ZSB0ZW1wbGF0ZSBIVE1MLgogICAgICoKICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByb3V0ZXMgT2JqZWN0IHdpdGggYWxsIHJvdXRlIGNvbmZpZ3VyYXRpb24gT2JqZWN0cyBhcyBpdHMgcHJvcGVydGllcy4KICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIGAkcm91dGVgIGlzIHVzZWQgZm9yIGRlZXAtbGlua2luZyBVUkxzIHRvIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyAoSFRNTCBwYXJ0aWFscykuCiAgICAgKiBJdCB3YXRjaGVzIGAkbG9jYXRpb24udXJsKClgIGFuZCB0cmllcyB0byBtYXAgdGhlIHBhdGggdG8gYW4gZXhpc3Rpbmcgcm91dGUgZGVmaW5pdGlvbi4KICAgICAqCiAgICAgKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nUm91dGUgYG5nUm91dGVgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLgogICAgICoKICAgICAqIFlvdSBjYW4gZGVmaW5lIHJvdXRlcyB0aHJvdWdoIHtAbGluayBuZ1JvdXRlLiRyb3V0ZVByb3ZpZGVyICRyb3V0ZVByb3ZpZGVyfSdzIEFQSS4KICAgICAqCiAgICAgKiBUaGUgYCRyb3V0ZWAgc2VydmljZSBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQogICAgICoge0BsaW5rIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBgbmdWaWV3YH0gZGlyZWN0aXZlIGFuZCB0aGUKICAgICAqIHtAbGluayBuZ1JvdXRlLiRyb3V0ZVBhcmFtcyBgJHJvdXRlUGFyYW1zYH0gc2VydmljZS4KICAgICAqCiAgICAgKiBAZXhhbXBsZQogICAgICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyBjaGFuZ2luZyB0aGUgVVJMIGhhc2ggY2F1c2VzIHRoZSBgJHJvdXRlYCB0byBtYXRjaCBhIHJvdXRlIGFnYWluc3QgdGhlCiAgICAgKiBVUkwsIGFuZCB0aGUgYG5nVmlld2AgcHVsbHMgaW4gdGhlIHBhcnRpYWwuCiAgICAgKgogICAgICogPGV4YW1wbGUgbmFtZT0iJHJvdXRlLXNlcnZpY2UiIG1vZHVsZT0ibmdSb3V0ZUV4YW1wbGUiCiAgICAgKiAgICAgICAgICBkZXBzPSJhbmd1bGFyLXJvdXRlLmpzIiBmaXhCYXNlPSJ0cnVlIj4KICAgICAqICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJNYWluQ29udHJvbGxlciI+CiAgICAgKiAgICAgICBDaG9vc2U6CiAgICAgKiAgICAgICA8YSBocmVmPSJCb29rL01vYnkiPk1vYnk8L2E+IHwKICAgICAqICAgICAgIDxhIGhyZWY9IkJvb2svTW9ieS9jaC8xIj5Nb2J5OiBDaDE8L2E+IHwKICAgICAqICAgICAgIDxhIGhyZWY9IkJvb2svR2F0c2J5Ij5HYXRzYnk8L2E+IHwKICAgICAqICAgICAgIDxhIGhyZWY9IkJvb2svR2F0c2J5L2NoLzQ/a2V5PXZhbHVlIj5HYXRzYnk6IENoNDwvYT4gfAogICAgICogICAgICAgPGEgaHJlZj0iQm9vay9TY2FybGV0Ij5TY2FybGV0IExldHRlcjwvYT48YnIvPgogICAgICoKICAgICAqICAgICAgIDxkaXYgbmctdmlldz48L2Rpdj4KICAgICAqCiAgICAgKiAgICAgICA8aHIgLz4KICAgICAqCiAgICAgKiAgICAgICA8cHJlPiRsb2NhdGlvbi5wYXRoKCkgPSB7eyRsb2NhdGlvbi5wYXRoKCl9fTwvcHJlPgogICAgICogICAgICAgPHByZT4kcm91dGUuY3VycmVudC50ZW1wbGF0ZVVybCA9IHt7JHJvdXRlLmN1cnJlbnQudGVtcGxhdGVVcmx9fTwvcHJlPgogICAgICogICAgICAgPHByZT4kcm91dGUuY3VycmVudC5wYXJhbXMgPSB7eyRyb3V0ZS5jdXJyZW50LnBhcmFtc319PC9wcmU+CiAgICAgKiAgICAgICA8cHJlPiRyb3V0ZS5jdXJyZW50LnNjb3BlLm5hbWUgPSB7eyRyb3V0ZS5jdXJyZW50LnNjb3BlLm5hbWV9fTwvcHJlPgogICAgICogICAgICAgPHByZT4kcm91dGVQYXJhbXMgPSB7eyRyb3V0ZVBhcmFtc319PC9wcmU+CiAgICAgKiAgICAgPC9kaXY+CiAgICAgKiAgIDwvZmlsZT4KICAgICAqCiAgICAgKiAgIDxmaWxlIG5hbWU9ImJvb2suaHRtbCI+CiAgICAgKiAgICAgY29udHJvbGxlcjoge3tuYW1lfX08YnIgLz4KICAgICAqICAgICBCb29rIElkOiB7e3BhcmFtcy5ib29rSWR9fTxiciAvPgogICAgICogICA8L2ZpbGU+CiAgICAgKgogICAgICogICA8ZmlsZSBuYW1lPSJjaGFwdGVyLmh0bWwiPgogICAgICogICAgIGNvbnRyb2xsZXI6IHt7bmFtZX19PGJyIC8+CiAgICAgKiAgICAgQm9vayBJZDoge3twYXJhbXMuYm9va0lkfX08YnIgLz4KICAgICAqICAgICBDaGFwdGVyIElkOiB7e3BhcmFtcy5jaGFwdGVySWR9fQogICAgICogICA8L2ZpbGU+CiAgICAgKgogICAgICogICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgogICAgICogICAgIGFuZ3VsYXIubW9kdWxlKCduZ1JvdXRlRXhhbXBsZScsIFsnbmdSb3V0ZSddKQogICAgICoKICAgICAqICAgICAgLmNvbnRyb2xsZXIoJ01haW5Db250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlLCAkcm91dGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uKSB7CiAgICAgKiAgICAgICAgICAkc2NvcGUuJHJvdXRlID0gJHJvdXRlOwogICAgICogICAgICAgICAgJHNjb3BlLiRsb2NhdGlvbiA9ICRsb2NhdGlvbjsKICAgICAqICAgICAgICAgICRzY29wZS4kcm91dGVQYXJhbXMgPSAkcm91dGVQYXJhbXM7CiAgICAgKiAgICAgIH0pCiAgICAgKgogICAgICogICAgICAuY29udHJvbGxlcignQm9va0NvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUsICRyb3V0ZVBhcmFtcykgewogICAgICogICAgICAgICAgJHNjb3BlLm5hbWUgPSAiQm9va0NvbnRyb2xsZXIiOwogICAgICogICAgICAgICAgJHNjb3BlLnBhcmFtcyA9ICRyb3V0ZVBhcmFtczsKICAgICAqICAgICAgfSkKICAgICAqCiAgICAgKiAgICAgIC5jb250cm9sbGVyKCdDaGFwdGVyQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zKSB7CiAgICAgKiAgICAgICAgICAkc2NvcGUubmFtZSA9ICJDaGFwdGVyQ29udHJvbGxlciI7CiAgICAgKiAgICAgICAgICAkc2NvcGUucGFyYW1zID0gJHJvdXRlUGFyYW1zOwogICAgICogICAgICB9KQogICAgICoKICAgICAqICAgICAuY29uZmlnKGZ1bmN0aW9uKCRyb3V0ZVByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlcikgewogICAgICogICAgICAgJHJvdXRlUHJvdmlkZXIKICAgICAqICAgICAgICAud2hlbignL0Jvb2svOmJvb2tJZCcsIHsKICAgICAqICAgICAgICAgdGVtcGxhdGVVcmw6ICdib29rLmh0bWwnLAogICAgICogICAgICAgICBjb250cm9sbGVyOiAnQm9va0NvbnRyb2xsZXInLAogICAgICogICAgICAgICByZXNvbHZlOiB7CiAgICAgKiAgICAgICAgICAgLy8gSSB3aWxsIGNhdXNlIGEgMSBzZWNvbmQgZGVsYXkKICAgICAqICAgICAgICAgICBkZWxheTogZnVuY3Rpb24oJHEsICR0aW1lb3V0KSB7CiAgICAgKiAgICAgICAgICAgICB2YXIgZGVsYXkgPSAkcS5kZWZlcigpOwogICAgICogICAgICAgICAgICAgJHRpbWVvdXQoZGVsYXkucmVzb2x2ZSwgMTAwMCk7CiAgICAgKiAgICAgICAgICAgICByZXR1cm4gZGVsYXkucHJvbWlzZTsKICAgICAqICAgICAgICAgICB9CiAgICAgKiAgICAgICAgIH0KICAgICAqICAgICAgIH0pCiAgICAgKiAgICAgICAud2hlbignL0Jvb2svOmJvb2tJZC9jaC86Y2hhcHRlcklkJywgewogICAgICogICAgICAgICB0ZW1wbGF0ZVVybDogJ2NoYXB0ZXIuaHRtbCcsCiAgICAgKiAgICAgICAgIGNvbnRyb2xsZXI6ICdDaGFwdGVyQ29udHJvbGxlcicKICAgICAqICAgICAgIH0pOwogICAgICoKICAgICAqICAgICAgIC8vIGNvbmZpZ3VyZSBodG1sNSB0byBnZXQgbGlua3Mgd29ya2luZyBvbiBqc2ZpZGRsZQogICAgICogICAgICAgJGxvY2F0aW9uUHJvdmlkZXIuaHRtbDVNb2RlKHRydWUpOwogICAgICogICAgIH0pOwogICAgICoKICAgICAqICAgPC9maWxlPgogICAgICoKICAgICAqICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgKiAgICAgaXQoJ3Nob3VsZCBsb2FkIGFuZCBjb21waWxlIGNvcnJlY3QgdGVtcGxhdGUnLCBmdW5jdGlvbigpIHsKICAgICAqICAgICAgIGVsZW1lbnQoYnkubGlua1RleHQoJ01vYnk6IENoMScpKS5jbGljaygpOwogICAgICogICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50KGJ5LmNzjNzvVpdaAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANBGJQABABplUwKgHNsCoB2CVJR/1FAlMFMSMSleAEAHHu5EAAAEBCAoAo167AE2ltozc71auWgEA2icAANonAABo9ygf0sUIACetHhMIAEUAJ8yO1UAAQAb0b8CoB2DAqAc2H/WVJcSMSlcUCUwUgBAA7belAAABAQgKAE2ltgCjXrtzKCdbbmctdmlld10nKSkuZ2V0VGV4dCgpOwogICAgICogICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL2NvbnRyb2xsZXJcOiBDaGFwdGVyQ29udHJvbGxlci8pOwogICAgICogICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL0Jvb2sgSWRcOiBNb2J5Lyk7CiAgICAgKiAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvQ2hhcHRlciBJZFw6IDEvKTsKICAgICAqCiAgICAgKiAgICAgICBlbGVtZW50KGJ5LnBhcnRpYWxMaW5rVGV4dCgnU2NhcmxldCcpKS5jbGljaygpOwogICAgICoKICAgICAqICAgICAgIGNvbnRlbnQgPSBlbGVtZW50KGJ5LmNzcygnW25nLXZpZXddJykpLmdldFRleHQoKTsKICAgICAqICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9jb250cm9sbGVyXDogQm9va0NvbnRyb2xsZXIvKTsKICAgICAqICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9Cb29rIElkXDogU2NhcmxldC8pOwogICAgICogICAgIH0pOwogICAgICogICA8L2ZpbGU+CiAgICAgKiA8L2V4YW1wbGU+CiAgICAgKi8KCiAgICAvKioKICAgICAqIEBuZ2RvYyBldmVudAogICAgICogQG5hbWUgJHJvdXRlIyRyb3V0ZUNoYW5nZVN0YXJ0CiAgICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIEJyb2FkY2FzdGVkIGJlZm9yZSBhIHJvdXRlIGNoYW5nZS4gQXQgdGhpcyAgcG9pbnQgdGhlIHJvdXRlIHNlcnZpY2VzIHN0YXJ0cwogICAgICogcmVzb2x2aW5nIGFsbCBvZiB0aGUgZGVwZW5kZW5jaWVzIG5lZWRlZCBmb3IgdGhlIHJvdXRlIGNoYW5nZSB0byBvY2N1ci4KICAgICAqIFR5cGljYWxseSB0aGlzIGludm9sdmVzIGZldGNoaW5nIHRoZSB2aWV3IHRlbXBsYXRlIGFzIHdlbGwgYXMgYW55IGRlcGVuZGVuY2llcwogICAgICogZGVmaW5lZCBpbiBgcmVzb2x2ZWAgcm91dGUgcHJvcGVydHkuIE9uY2UgIGFsbCBvZiB0aGUgZGVwZW5kZW5jaWVzIGFyZSByZXNvbHZlZAogICAgICogYCRyb3V0ZUNoYW5nZVN1Y2Nlc3NgIGlzIGZpcmVkLgogICAgICoKICAgICAqIFRoZSByb3V0ZSBjaGFuZ2UgKGFuZCB0aGUgYCRsb2NhdGlvbmAgY2hhbmdlIHRoYXQgdHJpZ2dlcmVkIGl0KSBjYW4gYmUgcHJldmVudGVkCiAgICAgKiBieSBjYWxsaW5nIGBwcmV2ZW50RGVmYXVsdGAgbWV0aG9kIG9mIHRoZSBldmVudC4gU2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0KICAgICAqIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgZXZlbnQgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC4KICAgICAqIEBwYXJhbSB7Um91dGV9IG5leHQgRnV0dXJlIHJvdXRlIGluZm9ybWF0aW9uLgogICAgICogQHBhcmFtIHtSb3V0ZX0gY3VycmVudCBDdXJyZW50IHJvdXRlIGluZm9ybWF0aW9uLgogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgZXZlbnQKICAgICAqIEBuYW1lICRyb3V0ZSMkcm91dGVDaGFuZ2VTdWNjZXNzCiAgICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIEJyb2FkY2FzdGVkIGFmdGVyIGEgcm91dGUgZGVwZW5kZW5jaWVzIGFyZSByZXNvbHZlZC4KICAgICAqIHtAbGluayBuZ1JvdXRlLmRpcmVjdGl2ZTpuZ1ZpZXcgbmdWaWV3fSBsaXN0ZW5zIGZvciB0aGUgZGlyZWN0aXZlCiAgICAgKiB0byBpbnN0YW50aWF0ZSB0aGUgY29udHJvbGxlciBhbmQgcmVuZGVyIHRoZSB2aWV3LgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC4KICAgICAqIEBwYXJhbSB7Um91dGV9IGN1cnJlbnQgQ3VycmVudCByb3V0ZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7Um91dGV8VW5kZWZpbmVkfSBwcmV2aW91cyBQcmV2aW91cyByb3V0ZSBpbmZvcm1hdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGN1cnJlbnQgaXMKICAgICAqIGZpcnN0IHJvdXRlIGVudGVyZWQuCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBuZ2RvYyBldmVudAogICAgICogQG5hbWUgJHJvdXRlIyRyb3V0ZUNoYW5nZUVycm9yCiAgICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIEJyb2FkY2FzdGVkIGlmIGFueSBvZiB0aGUgcmVzb2x2ZSBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0CiAgICAgKiBAcGFyYW0ge1JvdXRlfSBjdXJyZW50IEN1cnJlbnQgcm91dGUgaW5mb3JtYXRpb24uCiAgICAgKiBAcGFyYW0ge1JvdXRlfSBwcmV2aW91cyBQcmV2aW91cyByb3V0ZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7Um91dGV9IHJlamVjdGlvbiBSZWplY3Rpb24gb2YgdGhlIHByb21pc2UuIFVzdWFsbHkgdGhlIGVycm9yIG9mIHRoZSBmYWlsZWQgcHJvbWlzZS4KICAgICAqLwoKICAgIC8qKgogICAgICogQG5nZG9jIGV2ZW50CiAgICAgKiBAbmFtZSAkcm91dGUjJHJvdXRlVXBkYXRlCiAgICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBUaGUgYHJlbG9hZE9uU2VhcmNoYCBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8gZmFsc2UsIGFuZCB3ZSBhcmUgcmV1c2luZyB0aGUgc2FtZQogICAgICogaW5zdGFuY2Ugb2YgdGhlIENvbnRyb2xsZXIuCiAgICAgKi8KCiAgICB2YXIgZm9yY2VSZWxvYWQgPSBmYWxzZSwKICAgICAgICBwcmVwYXJlZFJvdXRlLAogICAgICAgIHByZXBhcmVkUm91dGVJc1VwZGF0ZU9ubHksCiAgICAgICAgJHJvdXRlID0gewogICAgICAgICAgcm91dGVzOiByb3V0ZXMsCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAgICAgKiBAbmFtZSAkcm91dGUjcmVsb2FkCiAgICAgICAgICAgKgogICAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICAgKiBDYXVzZXMgYCRyb3V0ZWAgc2VydmljZSB0byByZWxvYWQgdGhlIGN1cnJlbnQgcm91dGUgZXZlbiBpZgogICAgICAgICAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiAkbG9jYXRpb259IGhhc24ndCBjaGFuZ2VkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEFzIGEgcmVzdWx0IG9mIHRoYXQsIHtAbGluayBuZ1JvdXRlLmRpcmVjdGl2ZTpuZ1ZpZXcgbmdWaWV3fQogICAgICAgICAgICogY3JlYXRlcyBuZXcgc2NvcGUgYW5kIHJlaW5zdGFudGlhdGVzIHRoZSBjb250cm9sbGVyLgogICAgICAgICAgICovCiAgICAgICAgICByZWxvYWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3JjZVJlbG9hZCA9IHRydWU7CiAgICAgICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAvLyBEb24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBvZiBhIHJlbG9hZCBmb3Igbm93Li4uCiAgICAgICAgICAgICAgcHJlcGFyZVJvdXRlKCk7CiAgICAgICAgICAgICAgY29tbWl0Um91dGUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAgICogQG5hbWUgJHJvdXRlI3VwZGF0ZVBhcmFtcwogICAgICAgICAgICoKICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAgICogQ2F1c2VzIGAkcm91dGVgIHNlcnZpY2UgdG8gdXBkYXRlIHRoZSBjdXJyZW50IFVSTCwgcmVwbGFjaW5nCiAgICAgICAgICAgKiBjdXJyZW50IHJvdXRlIHBhcmFtZXRlcnMgd2l0aCB0aG9zZSBzcGVjaWZpZWQgaW4gYG5ld1BhcmFtc2AuCiAgICAgICAgICAgKiBQcm92aWRlZCBwcm9wZXJ0eSBuYW1lcyB0aGF0IG1hdGNoIHRoZSByb3V0ZSdzIHBhdGggc2VnbWVudAogICAgICAgICAgICogZGVmaW5pdGlvbnMgd2lsbCBiZSBpbnRlcnBvbGF0ZWQgaW50byB0aGUgbG9jYXRpb24ncyBwYXRoLCB3aGlsZQogICAgICAgICAgICogcmVtYWluaW5nIHByb3BlcnRpZXMgd2lsbCBiZSB0cmVhdGVkIGFzIHF1ZXJ5IHBhcmFtcy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmV3UGFyYW1zIG1hcHBpbmcgb2YgVVJMIHBhcmFtZXRlciBuYW1lcyB0byB2YWx1ZXMKICAgICAgICAgICAqLwogICAgICAgICAgdXBkYXRlUGFyYW1zOiBmdW5jdGlvbihuZXdQYXJhbXMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudCAmJiB0aGlzLmN1cnJlbnQuJCRyb3V0ZSkgewogICAgICAgICAgICAgIHZhciBzZWFyY2hQYXJhbXMgPSB7fSwgc2VsZj10aGlzOwoKICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goT2JqZWN0LmtleXMobmV3UGFyYW1zKSwgZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuY3VycmVudC5wYXRoUGFyYW1zW2tleV0pIHNlYXJjaFBhcmFtc1trZXldID0gbmV3UGFyYW1zW2tleV07CiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIG5ld1BhcmFtcyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCB0aGlzLmN1cnJlbnQucGFyYW1zLCBuZXdQYXJhbXMpOwogICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKGludGVycG9sYXRlKHRoaXMuY3VycmVudC4kJHJvdXRlLm9yaWdpbmFsUGF0aCwgbmV3UGFyYW1zKSk7CiAgICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaChhbmd1bGFyLmV4dGVuZCh7fSwgJGxvY2F0aW9uLnNlYXJjaCgpLCBzZWFyY2hQYXJhbXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyAkcm91dGVNaW5FcnIoJ25vcm91dCcsICdUcmllZCB1cGRhdGluZyByb3V0ZSB3aGVuIHdpdGggbm8gY3VycmVudCByb3V0ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAkcm9vdFNjb3BlLiRvbignJGxvY2F0aW9uQ2hhbmdlU3RhcnQnLCBwcmVwYXJlUm91dGUpOwogICAgJHJvb3RTY29wZS4kb24oJyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MnLCBjb21taXRSb3V0ZSk7CgogICAgcmV0dXJuICRyb3V0ZTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8qKgogICAgICogQHBhcmFtIG9uIHtzdHJpbmd9IGN1cnJlbnQgdXJsCiAgICAgKiBAcGFyYW0gcm91dGUge09iamVjdH0gcm91dGUgcmVnZXhwIHRvIG1hdGNoIHRoZSB1cmwgYWdhaW5zdAogICAgICogQHJldHVybiB7P09iamVjdH0KICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIENoZWNrIGlmIHRoZSByb3V0ZSBtYXRjaGVzIHRoZSBjdXJyZW50IHVybC4KICAgICAqCiAgICAgKiBJbnNwaXJlZCBieSBtYXRjaCBpbgogICAgICogdmlzaW9ubWVkaWEvZXhwcmVzcy9saWIvcm91dGVyL3JvdXRlci5qcy4KICAgICAqLwogICAgZnVuY3Rpb24gc3dpdGNoUm91dGVNYXRjaGVyKG9uLCByb3V0ZSkgewogICAgICB2YXIga2V5cyA9IHJvdXRlLmtleXMsCiAgICAgICAgICBwYXJhbXMgPSB7fTsKCiAgICAgIGlmICghcm91dGUucmVnZXhwKSByZXR1cm4gbnVsbDsKCiAgICAgIHZhciBtID0gcm91dGUucmVnZXhwLmV4ZWMob24pOwogICAgICBpZiAoIW0pIHJldHVybiBudWxsOwoKICAgICAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IG0ubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICB2YXIga2V5ID0ga2V5c1tpIC0gMV07CgogICAgICAgIHZhciB2YWwgPSBtW2ldOwoKICAgICAgICBpZiAoa2V5ICYmIHZhbCkgewogICAgICAgICAgcGFyYW1zW2tleS5uYW1lXSA9IHZhbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcmFtczsKICAgIH0KCiAgICBmdW5jdGlvbiBwcmVwYXJlUm91dGUoJGxvY2F0aW9uRXZlbnQpIHsKICAgICAgdmFyIGxhc3RSb3V0ZSA9ICRyb3V0ZS5jdXJyZW50OwoKICAgICAgcHJlcGFyZWRSb3V0ZSA9IHBhcnNlUm91dGUoKTsKICAgICAgcHJlcGFyZWRSb3V0ZUlzVXBkYXRlT25seSA9IHByZXBhcmVkUm91dGUgJiYgbGFzdFJvdXRlICYmIHByZXBhcmVkUm91dGUuJCRyb3V0ZSA9PT0gbGFzdFJvdXRlLiQkcm91dGUKICAgICAgICAgICYmIGFuZ3VsYXIuZXF1YWxzKHByZXBhcmVkUm91dGUucGF0aFBhcmFtcywgbGFzdFJvdXRlLnBhdGhQYXJhbXMpCiAgICAgICAgICAmJiAhcHJlcGFyZWRSb3V0ZS5yZWxvYWRPblNlYXJjaCAmJiAhZm9yY2VSZWxvYWQ7CgogICAgICBpZiAoIXByZXBhcmVkUm91dGVJc1VwZGF0ZU9ubHkgJiYgKGxhc3RSb3V0ZSB8fCBwcmVwYXJlZFJvdXRlKSkgewogICAgICAgIGlmICgkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRyb3V0ZUNoYW5nZVN0YXJ0JywgcHJlcGFyZWRSb3V0ZSwgbGFzdFJvdXRlKS5kZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICBpZiAoJGxvY2F0aW9uRXZlbnQpIHsKICAgICAgICAgICAgJGxvY2F0aW9uRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjb21taXRSb3V0ZSgpIHsKICAgICAgdmFyIGxhc3RSb3V0ZSA9ICRyb3V0ZS5jdXJyZW50OwogICAgICB2YXIgbmV4dFJvdXRlID0gcHJlcGFyZWRSb3V0ZTsKCiAgICAgIGlmIChwcmVwYXJlZFJvdXRlSXNVcGRhdGVPbmx5KSB7CiAgICAgICAgbGFzdFJvdXRlLnBhcmFtcyA9IG5leHRSb3V0ZS5wYXJhbXM7CiAgICAgICAgYW5ndWxhci5jb3B5KGxhc3RSb3V0ZS5wYXJhbXMsICRyb3V0ZVBhcmFtcyk7CiAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckcm91dGVVcGRhdGUnLCBsYXN0Um91dGUpOwogICAgICB9IGVsc2UgaWYgKG5leHRSb3V0ZSB8fCBsYXN0Um91dGUpIHsKICAgICAgICBmb3JjZVJlbG9hZCA9IGZhbHNlOwogICAgICAgICRyb3V0ZS5jdXJyZW50ID0gbmV4dFJvdXRlOwogICAgICAgIGlmIChuZXh0Um91dGUpIHsKICAgICAgICAgIGlmIChuZXh0Um91dGUucmVkaXJlY3RUbykgewogICAgICAgICAgICBpZiAoYW5ndWxhci5pc1N0cmluZyhuZXh0Um91dGUucmVkaXJlY3RUbykpIHsKICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aChpbnRlcnBvbGF0ZShuZXh0Um91dGUucmVkaXJlY3RUbywgbmV4dFJvdXRlLnBhcmFtcykpLnNlYXJjaChuZXh0Um91dGUucGFyYW1zKQogICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgJGxvY2F0aW9uLnVybChuZXh0Um91dGUucmVkaXJlY3RUbyhuZXh0Um91dGUucGF0aFBhcmFtcywgJGxvY2F0aW9uLnBhdGgoKSwgJGxvY2F0aW9uLnNlYXJjaCgpKSkKICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcS53aGVuKG5leHRSb3V0ZSkuCiAgICAgICAgICB0aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobmV4dFJvdXRlKSB7CiAgICAgICAgICAgICAgdmFyIGxvY2FscyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBuZXh0Um91dGUucmVzb2x2ZSksCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLCB0ZW1wbGF0ZVVybDsKCiAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGxvY2FscywgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgICAgICAgbG9jYWxzW2tleV0gPSBhbmd1bGFyLmlzU3RyaW5nKHZhbHVlKSA/CiAgICAgICAgICAgICAgICAgICAgJGluamVjdG9yLmdldCh2YWx1ZSkgOiAkaW5qZWN0b3IuaW52b2tlKHZhbHVlLCBudWxsLCBudWxsLCBrZXkpOwogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGUgPSBuZXh0Um91dGUudGVtcGxhdGUpKSB7CiAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0Z1bmN0aW9uKHRlbXBsYXRlKSkgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlKG5leHRSb3V0ZS5wYXJhbXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGVVcmwgPSBuZXh0Um91dGUudGVtcGxhdGVVcmwpKSB7CiAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0Z1bmN0aW9uKHRlbXBsYXRlVXJsKSkgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsKG5leHRSb3V0ZS5wYXJhbXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVtcGxhdGVVcmwgPSAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh0ZW1wbGF0ZVVybCk7CiAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGVVcmwpKSB7CiAgICAgICAgICAgICAgICAgIG5leHRSb3V0ZS5sb2FkZWRUZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsOwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICR0ZW1wbGF0ZVJlcXVlc3QodGVtcGxhdGVVcmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGUpKSB7CiAgICAgICAgICAgICAgICBsb2NhbHNbJyR0ZW1wbGF0ZSddID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiAkcS5hbGwobG9jYWxzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSkuCiAgICAgICAgICAvLyBhZnRlciByb3V0ZSBjaGFuZ2UKICAgICAgICAgIHRoZW4oZnVuY3Rpb24obG9jYWxzKSB7CiAgICAgICAgICAgIGlmIChuZXh0Um91dGUgPT0gJHJvdXRlLmN1cnJlbnQpIHsKICAgICAgICAgICAgICBpZiAobmV4dFJvdXRlKSB7CiAgICAgICAgICAgICAgICBuZXh0Um91dGUubG9jYWxzID0gbG9jYWxzOwogICAgICAgICAgICAgICAgYW5ndWxhci5jb3B5KG5leHRSb3V0ZS5wYXJhbXMsICRyb3V0ZVBhcmFtcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHJvdXRlQ2hhbmdlU3VjY2VzcycsIG5leHRSb3V0ZSwgbGFzdFJvdXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICAgICAgaWYgKG5leHRSb3V0ZSA9PSAkcm91dGUuY3VycmVudCkgewogICAgICAgICAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHJvdXRlQ2hhbmdlRXJyb3InLCBuZXh0Um91dGUsIGxhc3RSb3V0ZSwgZXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgfQogICAgfQoKCiAgICAvKioKICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBjdXJyZW50IGFjdGl2ZSByb3V0ZSwgYnkgbWF0Y2hpbmcgaXQgYWdhaW5zdCB0aGUgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlUm91dGUoKSB7CiAgICAgIC8vIE1hdGNoIGEgcm91dGUKICAgICAgdmFyIHBhcmFtcywgbWF0Y2g7CiAgICAgIGFuZ3VsYXIuZm9yRWFjaChyb3V0ZXMsIGZ1bmN0aW9uKHJvdXRlLCBwYXRoKSB7CiAgICAgICAgaWYgKCFtYXRjaCAmJiAocGFyYW1zID0gc3dpdGNoUm91dGVNYXRjaGVyKCRsb2NhdGlvbi5wYXRoKCksIHJvdXRlKSkpIHsKICAgICAgICAgIG1hdGNoID0gaW5oZXJpdChyb3V0ZSwgewogICAgICAgICAgICBwYXJhbXM6IGFuZ3VsYXIuZXh0ZW5kKHt9LCAkbG9jYXRpb24uc2VhcmNoKCksIHBhcmFtcyksCiAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhcmFtc30pOwogICAgICAgICAgbWF0Y2guJCRyb3V0ZSA9IHJvdXRlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8vIE5vIHJvdXRlIG1hdGNoZWQ7IGZhbGxiYWNrIHRvICJvdGhlcndpc2UiIHJvdXRlCiAgICAgIHJldHVybiBtYXRjaCB8fCByb3V0ZXNbbnVsbF0gJiYgaW5oZXJpdChyb3V0ZXNbbnVsbF0sIHtwYXJhbXM6IHt9LCBwYXRoUGFyYW1zOnt9fSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBpbnRlcnBvbGF0aW9uIG9mIHRoZSByZWRpcmVjdCBwYXRoIHdpdGggdGhlIHBhcmFtZXRlcnMKICAgICAqLwogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoc3RyaW5nLCBwYXJhbXMpIHsKICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBhbmd1bGFyLmZvckVhY2goKHN0cmluZyB8fCAnJykuc3BsaXQoJzonKSwgZnVuY3Rpb24oc2VnbWVudCwgaSkgewogICAgICAgIGlmIChpIIzc71bYWgEAOhEAADoRAABo9ygf0sUIACetHhMIAEUAESyO3EAAQAYLCcCoB2DAqAc2H/WVJcSMce8UCUwUgBgA7aEFAAABAQgKAE2ltgCjXrs9PT0gMCkgewogICAgICAgICAgcmVzdWx0LnB1c2goc2VnbWVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzZWdtZW50TWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC8oXHcrKSg/Ols/Kl0pPyguKikvKTsKICAgICAgICAgIHZhciBrZXkgPSBzZWdtZW50TWF0Y2hbMV07CiAgICAgICAgICByZXN1bHQucHVzaChwYXJhbXNba2V5XSk7CiAgICAgICAgICByZXN1bHQucHVzaChzZWdtZW50TWF0Y2hbMl0gfHwgJycpOwogICAgICAgICAgZGVsZXRlIHBhcmFtc1trZXldOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQuam9pbignJyk7CiAgICB9CiAgfV07Cn0KCm5nUm91dGVNb2R1bGUucHJvdmlkZXIoJyRyb3V0ZVBhcmFtcycsICRSb3V0ZVBhcmFtc1Byb3ZpZGVyKTsKCgovKioKICogQG5nZG9jIHNlcnZpY2UKICogQG5hbWUgJHJvdXRlUGFyYW1zCiAqIEByZXF1aXJlcyAkcm91dGUKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBgJHJvdXRlUGFyYW1zYCBzZXJ2aWNlIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgc2V0IG9mIHJvdXRlIHBhcmFtZXRlcnMuCiAqCiAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdSb3V0ZSBgbmdSb3V0ZWB9IG1vZHVsZSB0byBiZSBpbnN0YWxsZWQuCiAqCiAqIFRoZSByb3V0ZSBwYXJhbWV0ZXJzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIHtAbGluayBuZy4kbG9jYXRpb24gYCRsb2NhdGlvbmB9J3MKICoge0BsaW5rIG5nLiRsb2NhdGlvbiNzZWFyY2ggYHNlYXJjaCgpYH0gYW5kIHtAbGluayBuZy4kbG9jYXRpb24jcGF0aCBgcGF0aCgpYH0uCiAqIFRoZSBgcGF0aGAgcGFyYW1ldGVycyBhcmUgZXh0cmFjdGVkIHdoZW4gdGhlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSBgJHJvdXRlYH0gcGF0aCBpcyBtYXRjaGVkLgogKgogKiBJbiBjYXNlIG9mIHBhcmFtZXRlciBuYW1lIGNvbGxpc2lvbiwgYHBhdGhgIHBhcmFtcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBgc2VhcmNoYCBwYXJhbXMuCiAqCiAqIFRoZSBzZXJ2aWNlIGd1YXJhbnRlZXMgdGhhdCB0aGUgaWRlbnRpdHkgb2YgdGhlIGAkcm91dGVQYXJhbXNgIG9iamVjdCB3aWxsIHJlbWFpbiB1bmNoYW5nZWQKICogKGJ1dCBpdHMgcHJvcGVydGllcyB3aWxsIGxpa2VseSBjaGFuZ2UpIGV2ZW4gd2hlbiBhIHJvdXRlIGNoYW5nZSBvY2N1cnMuCiAqCiAqIE5vdGUgdGhhdCB0aGUgYCRyb3V0ZVBhcmFtc2AgYXJlIG9ubHkgdXBkYXRlZCAqYWZ0ZXIqIGEgcm91dGUgY2hhbmdlIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCiAqIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2Fubm90IHJlbHkgb24gYCRyb3V0ZVBhcmFtc2AgYmVpbmcgY29ycmVjdCBpbiByb3V0ZSByZXNvbHZlIGZ1bmN0aW9ucy4KICogSW5zdGVhZCB5b3UgY2FuIHVzZSBgJHJvdXRlLmN1cnJlbnQucGFyYW1zYCB0byBhY2Nlc3MgdGhlIG5ldyByb3V0ZSdzIHBhcmFtZXRlcnMuCiAqCiAqIEBleGFtcGxlCiAqIGBgYGpzCiAqICAvLyBHaXZlbjoKICogIC8vIFVSTDogaHR0cDovL3NlcnZlci5jb20vaW5kZXguaHRtbCMvQ2hhcHRlci8xL1NlY3Rpb24vMj9zZWFyY2g9bW9ieQogKiAgLy8gUm91dGU6IC9DaGFwdGVyLzpjaGFwdGVySWQvU2VjdGlvbi86c2VjdGlvbklkCiAqICAvLwogKiAgLy8gVGhlbgogKiAgJHJvdXRlUGFyYW1zID09PiB7Y2hhcHRlcklkOicxJywgc2VjdGlvbklkOicyJywgc2VhcmNoOidtb2J5J30KICogYGBgCiAqLwpmdW5jdGlvbiAkUm91dGVQYXJhbXNQcm92aWRlcigpIHsKICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHt9OyB9Owp9CgpuZ1JvdXRlTW9kdWxlLmRpcmVjdGl2ZSgnbmdWaWV3JywgbmdWaWV3RmFjdG9yeSk7Cm5nUm91dGVNb2R1bGUuZGlyZWN0aXZlKCduZ1ZpZXcnLCBuZ1ZpZXdGaWxsQ29udGVudEZhY3RvcnkpOwoKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nVmlldwogKiBAcmVzdHJpY3QgRUNBCiAqCiAqIEBkZXNjcmlwdGlvbgogKiAjIE92ZXJ2aWV3CiAqIGBuZ1ZpZXdgIGlzIGEgZGlyZWN0aXZlIHRoYXQgY29tcGxlbWVudHMgdGhlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSAkcm91dGV9IHNlcnZpY2UgYnkKICogaW5jbHVkaW5nIHRoZSByZW5kZXJlZCB0ZW1wbGF0ZSBvZiB0aGUgY3VycmVudCByb3V0ZSBpbnRvIHRoZSBtYWluIGxheW91dCAoYGluZGV4Lmh0bWxgKSBmaWxlLgogKiBFdmVyeSB0aW1lIHRoZSBjdXJyZW50IHJvdXRlIGNoYW5nZXMsIHRoZSBpbmNsdWRlZCB2aWV3IGNoYW5nZXMgd2l0aCBpdCBhY2NvcmRpbmcgdG8gdGhlCiAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGAkcm91dGVgIHNlcnZpY2UuCiAqCiAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdSb3V0ZSBgbmdSb3V0ZWB9IG1vZHVsZSB0byBiZSBpbnN0YWxsZWQuCiAqCiAqIEBhbmltYXRpb25zCiAqIGVudGVyIC0gYW5pbWF0aW9uIGlzIHVzZWQgdG8gYnJpbmcgbmV3IGNvbnRlbnQgaW50byB0aGUgYnJvd3Nlci4KICogbGVhdmUgLSBhbmltYXRpb24gaXMgdXNlZCB0byBhbmltYXRlIGV4aXN0aW5nIGNvbnRlbnQgYXdheS4KICoKICogVGhlIGVudGVyIGFuZCBsZWF2ZSBhbmltYXRpb24gb2NjdXIgY29uY3VycmVudGx5LgogKgogKiBAc2NvcGUKICogQHByaW9yaXR5IDQwMAogKiBAcGFyYW0ge3N0cmluZz19IG9ubG9hZCBFeHByZXNzaW9uIHRvIGV2YWx1YXRlIHdoZW5ldmVyIHRoZSB2aWV3IHVwZGF0ZXMuCiAqCiAqIEBwYXJhbSB7c3RyaW5nPX0gYXV0b3Njcm9sbCBXaGV0aGVyIGBuZ1ZpZXdgIHNob3VsZCBjYWxsIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsCiAqICAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbH0gdG8gc2Nyb2xsIHRoZSB2aWV3cG9ydCBhZnRlciB0aGUgdmlldyBpcyB1cGRhdGVkLgogKgogKiAgICAgICAgICAgICAgICAgIC0gSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCBkaXNhYmxlIHNjcm9sbGluZy4KICogICAgICAgICAgICAgICAgICAtIElmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHdpdGhvdXQgdmFsdWUsIGVuYWJsZSBzY3JvbGxpbmcuCiAqICAgICAgICAgICAgICAgICAgLSBPdGhlcndpc2UgZW5hYmxlIHNjcm9sbGluZyBvbmx5IGlmIHRoZSBgYXV0b3Njcm9sbGAgYXR0cmlidXRlIHZhbHVlIGV2YWx1YXRlZAogKiAgICAgICAgICAgICAgICAgICAgYXMgYW4gZXhwcmVzc2lvbiB5aWVsZHMgYSB0cnV0aHkgdmFsdWUuCiAqIEBleGFtcGxlCiAgICA8ZXhhbXBsZSBuYW1lPSJuZ1ZpZXctZGlyZWN0aXZlIiBtb2R1bGU9Im5nVmlld0V4YW1wbGUiCiAgICAgICAgICAgICBkZXBzPSJhbmd1bGFyLXJvdXRlLmpzO2FuZ3VsYXItYW5pbWF0ZS5qcyIKICAgICAgICAgICAgIGFuaW1hdGlvbnM9InRydWUiIGZpeEJhc2U9InRydWUiPgogICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9Ik1haW5DdHJsIGFzIG1haW4iPgogICAgICAgICAgQ2hvb3NlOgogICAgICAgICAgPGEgaHJlZj0iQm9vay9Nb2J5Ij5Nb2J5PC9hPiB8CiAgICAgICAgICA8YSBocmVmPSJCb29rL01vYnkvY2gvMSI+TW9ieTogQ2gxPC9hPiB8CiAgICAgICAgICA8YSBocmVmPSJCb29rL0dhdHNieSI+R2F0c2J5PC9hPiB8CiAgICAgICAgICA8YSBocmVmPSJCb29rL0dhdHNieS9jaC80P2tleT12YWx1ZSI+R2F0c2J5OiBDaDQ8L2E+IHwKICAgICAgICAgIDxhIGhyZWY9IkJvb2svU2NhcmxldCI+U2NhcmxldCBMZXR0ZXI8L2E+PGJyLz4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aWV3LWFuaW1hdGUtY29udGFpbmVyIj4KICAgICAgICAgICAgPGRpdiBuZy12aWV3IGNsYXNzPSJ2aWV3LWFuaW1hdGUiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8aHIgLz4KCiAgICAgICAgICA8cHJlPiRsb2NhdGlvbi5wYXRoKCkgPSB7e21haW4uJGxvY2F0aW9uLnBhdGgoKX19PC9wcmU+CiAgICAgICAgICA8cHJlPiRyb3V0ZS5jdXJyZW50LnRlbXBsYXRlVXJsID0ge3ttYWluLiRyb3V0ZS5jdXJyZW50LnRlbXBsYXRlVXJsfX08L3ByZT4KICAgICAgICAgIDxwcmU+JHJvdXRlLmN1cnJlbnQucGFyYW1zID0ge3ttYWluLiRyb3V0ZS5jdXJyZW50LnBhcmFtc319PC9wcmU+CiAgICAgICAgICA8cHJlPiRyb3V0ZVBhcmFtcyA9IHt7bWFpbi4kcm91dGVQYXJhbXN9fTwvcHJlPgogICAgICAgIDwvZGl2PgogICAgICA8L2ZpbGU+CgogICAgICA8ZmlsZSBuYW1lPSJib29rLmh0bWwiPgogICAgICAgIDxkaXY+CiAgICAgICAgICBjb250cm9sbGVyOiB7e2Jvb2submFtZX19PGJyIC8+CiAgICAgICAgICBCb29rIElkOiB7e2Jvb2sucGFyYW1zLmJvb2tJZH19PGJyIC8+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZmlsZT4KCiAgICAgIDxmaWxlIG6M3O9W7FoBALUPAAC1DwAAaPcoH9LFCAAnrR4TCABFAA+njt9AAEAGDIvAqAdgwKgHNh/1lSXEjILnFAlMFIAYAO2fgAAAAQEICgBNpbYAo167YW1lPSJjaGFwdGVyLmh0bWwiPgogICAgICAgIDxkaXY+CiAgICAgICAgICBjb250cm9sbGVyOiB7e2NoYXB0ZXIubmFtZX19PGJyIC8+CiAgICAgICAgICBCb29rIElkOiB7e2NoYXB0ZXIucGFyYW1zLmJvb2tJZH19PGJyIC8+CiAgICAgICAgICBDaGFwdGVyIElkOiB7e2NoYXB0ZXIucGFyYW1zLmNoYXB0ZXJJZH19CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZmlsZT4KCiAgICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4KICAgICAgICAudmlldy1hbmltYXRlLWNvbnRhaW5lciB7CiAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgICAgICAgIGhlaWdodDoxMDBweCFpbXBvcnRhbnQ7CiAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgICAgICAgIGJhY2tncm91bmQ6d2hpdGU7CiAgICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrOwogICAgICAgICAgaGVpZ2h0OjQwcHg7CiAgICAgICAgICBvdmVyZmxvdzpoaWRkZW47CiAgICAgICAgfQoKICAgICAgICAudmlldy1hbmltYXRlIHsKICAgICAgICAgIHBhZGRpbmc6MTBweDsKICAgICAgICB9CgogICAgICAgIC52aWV3LWFuaW1hdGUubmctZW50ZXIsIC52aWV3LWFuaW1hdGUubmctbGVhdmUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDEuNXM7CiAgICAgICAgICB0cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDEuNXM7CgogICAgICAgICAgZGlzcGxheTpibG9jazsKICAgICAgICAgIHdpZHRoOjEwMCU7CiAgICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgYmxhY2s7CgogICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7CiAgICAgICAgICB0b3A6MDsKICAgICAgICAgIGxlZnQ6MDsKICAgICAgICAgIHJpZ2h0OjA7CiAgICAgICAgICBib3R0b206MDsKICAgICAgICAgIHBhZGRpbmc6MTBweDsKICAgICAgICB9CgogICAgICAgIC52aWV3LWFuaW1hdGUubmctZW50ZXIgewogICAgICAgICAgbGVmdDoxMDAlOwogICAgICAgIH0KICAgICAgICAudmlldy1hbmltYXRlLm5nLWVudGVyLm5nLWVudGVyLWFjdGl2ZSB7CiAgICAgICAgICBsZWZ0OjA7CiAgICAgICAgfQogICAgICAgIC52aWV3LWFuaW1hdGUubmctbGVhdmUubmctbGVhdmUtYWN0aXZlIHsKICAgICAgICAgIGxlZnQ6LTEwMCU7CiAgICAgICAgfQogICAgICA8L2ZpbGU+CgogICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgogICAgICAgIGFuZ3VsYXIubW9kdWxlKCduZ1ZpZXdFeGFtcGxlJywgWyduZ1JvdXRlJywgJ25nQW5pbWF0ZSddKQogICAgICAgICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgJyRsb2NhdGlvblByb3ZpZGVyJywKICAgICAgICAgICAgZnVuY3Rpb24oJHJvdXRlUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyKSB7CiAgICAgICAgICAgICAgJHJvdXRlUHJvdmlkZXIKICAgICAgICAgICAgICAgIC53aGVuKCcvQm9vay86Ym9va0lkJywgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jvb2suaHRtbCcsCiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdCb29rQ3RybCcsCiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2Jvb2snCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLndoZW4oJy9Cb29rLzpib29rSWQvY2gvOmNoYXB0ZXJJZCcsIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjaGFwdGVyLmh0bWwnLAogICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnQ2hhcHRlckN0cmwnLAogICAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjaGFwdGVyJwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKTsKICAgICAgICAgIH1dKQogICAgICAgICAgLmNvbnRyb2xsZXIoJ01haW5DdHJsJywgWyckcm91dGUnLCAnJHJvdXRlUGFyYW1zJywgJyRsb2NhdGlvbicsCiAgICAgICAgICAgIGZ1bmN0aW9uKCRyb3V0ZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24pIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZSA9ICRyb3V0ZTsKICAgICAgICAgICAgICB0aGlzLiRsb2NhdGlvbiA9ICRsb2NhdGlvbjsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZVBhcmFtcyA9ICRyb3V0ZVBhcmFtczsKICAgICAgICAgIH1dKQogICAgICAgICAgLmNvbnRyb2xsZXIoJ0Jvb2tDdHJsJywgWyckcm91dGVQYXJhbXMnLCBmdW5jdGlvbigkcm91dGVQYXJhbXMpIHsKICAgICAgICAgICAgdGhpcy5uYW1lID0gIkJvb2tDdHJsIjsKICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSAkcm91dGVQYXJhbXM7CiAgICAgICAgICB9XSkKICAgICAgICAgIC5jb250cm9sbGVyKCdDaGFwdGVyQ3RybCcsIFsnJHJvdXRlUGFyYW1zJywgZnVuY3Rpb24oJHJvdXRlUGFyYW1zKSB7CiAgICAgICAgICAgIHRoaXMubmFtZSA9ICJDaGFwdGVyQ3RybCI7CiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gJHJvdXRlUGFyYW1zOwogICAgICAgICAgfV0pOwoKICAgICAgPC9maWxlPgoKICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgaXQoJ3Nob3VsZCBsb2FkIGFuZCBjb21waWxlIGNvcnJlY3QgdGVtcGxhdGUnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGVsZW1lbnQoYnkubGlua1RleHQoJ01vYnk6IENoMScpKS5jbGljaygpOwogICAgICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50KGJ5LmNzcygnW25nLXZpZXddJykpLmdldFRleHQoKTsKICAgICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9jb250cm9sbGVyXDogQ2hhcHRlckN0cmwvKTsKICAgICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9Cb29rIElkXDogTW9ieS8pOwogICAgICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL0NoYXB0ZXIgSWRcOiAxLyk7CgogICAgICAgICAgZWxlbWVudChieS5wYXJ0aWFsTGlua1RleHQoJ1NjYXJsZXQnKSkuY2xpY2soKTsKCiAgICAgICAgICBjb250ZW50ID0gZWxlbWVudChieS5jc3MoJ1tuZy12aWV3XScpKS5nZXRUZXh0KCk7CiAgICAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvY29udHJvbGxlclw6IEJvb2tDdHJsLyk7CiAgICAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvQm9vayBJZFw6IFNjYXJsZXQvKTsKICAgICAgICB9KTsKICAgICAgPC9maWxlPgogICAgPC9leGFtcGxlPgogKi8KCgovKioKICogQG5nZG9jIGV2ZW50CiAqIEBuYW1lIG5nVmlldyMkdmlld0NvbnRlbnRMb2FkZWQKICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBjdXJyZW50IG5nVmlldyBzY29wZQogKiBAZGVzY3JpcHRpb24KICogRW1pdHRlZCBldmVyeSB0aW1lIHRoZSBuZ1ZpZXcgY29udGVudCBpcyByZWxvYWRlZC4KICovCm5nVmlld0ZhY3RvcnkuJGluamVjdCA9IFsnJHJvdXRlJywgJyRhbmNob3JTY3JvbGwnLCAnJGFuaW1hdGUnXTsKZnVuY3Rpb24gbmdWaWV3RmFjdG9yeSgkcm91dGUsICRhbmNob3JTY3JvbGwsICRhbmltYXRlKSB7CiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnRUNBJywKICAgIHRlcm1pbmFsOiB0cnVlLAogICAgcHJpb3JpdHk6IDQwMCwKICAgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JywKICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCAkZWxlbWVudCwgYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHsKICAgICAgICB2YXIgY3VycmVudFNjb3BlLAogICAgICAgICAgICBjdXJyZW50RWxlbWVudCwKICAgICAgICAgICAgcHJldmlvdXNMZWF2ZUFuaW1hdGlvbiwKICAgICAgICAgICAgYXV0b1Njcm9sbEV4cCA9IGF0dHIuYXV0b3Njcm9sbCwKICAgICAgICAgICAgb25sb2FkRXhwID0gYXR0ci5vbmxvYWQgfHwgJyc7CgogICAgICAgIHNjb3BlLiRvbignJHJvdXRlQ2hhbmdlU3VjY2VzcycsIHVwZGF0ZSk7CiAgICAgICAgdXBkYXRlKCk7CgogICAgICAgIIzc71b+WgEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQRikAAQAaZU8CoBzbAqAdglSUf9RQJTBTEjHHvgBACZZNbAAABAQgKAKNeuwBNpbaM3O9WAVsBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0EYtAAEAGmVLAqAc2wKgHYJUlH/UUCUwUxIyC54AQAqmCHwAAAQEICgCjXrsATaW2jNzvVgJbAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANBGMQABABplRwKgHNsCoB2CVJR/1FAlMFMSMklqAEALncm4AAAEBCAoAo167AE2ltozc71YsYAEAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzSoEAAQAZ4FMCoB2DAqAc2H/WVIkGzFfBYenzTgBABU/A1AAABAQgKAE2ltwCjXrc3RkU4DQogICAgbmdNYXhsZW5ndGg6IG1heGxlbmd0aERpcmVjdGl2ZSwKICAgICAgICAgICAgbmdWYWx1ZTogbmdWYWx1ZURpcmVjdGl2ZSwKICAgICAgICAgICAgbmdNb2RlbE9wdGlvbnM6IG5nTW9kZWxPcHRpb25zRGlyZWN0aXZlCiAgICAgICAgfSkuCiAgICAgICAgZGlyZWN0aXZlKHsKICAgICAgICAgIG5nSW5jbHVkZTogbmdJbmNsdWRlRmlsbENvbnRlbnREaXJlY3RpdmUKICAgICAgICB9KS4KICAgICAgICBkaXJlY3RpdmUobmdBdHRyaWJ1dGVBbGlhc0RpcmVjdGl2ZXMpLgogICAgICAgIGRpcmVjdGl2ZShuZ0V2ZW50RGlyZWN0aXZlcyk7CiAgICAgICRwcm92aWRlLnByb3ZpZGVyKHsKICAgICAgICAkYW5jaG9yU2Nyb2xsOiAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIsCiAgICAgICAgJGFuaW1hdGU6ICRBbmltYXRlUHJvdmlkZXIsCiAgICAgICAgJGJyb3dzZXI6ICRCcm93c2VyUHJvdmlkZXIsCiAgICAgICAgJGNhY2hlRmFjdG9yeTogJENhY2hlRmFjdG9yeVByb3ZpZGVyLAogICAgICAgICRjb250cm9sbGVyOiAkQ29udHJvbGxlclByb3ZpZGVyLAogICAgICAgICRkb2N1bWVudDogJERvY3VtZW50UHJvdmlkZXIsCiAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXI6ICRFeGNlcHRpb25IYW5kbGVyUHJvdmlkZXIsCiAgICAgICAgJGZpbHRlcjogJEZpbHRlclByb3ZpZGVyLAogICAgICAgICRpbnRlcnBvbGF0ZTogJEludGVycG9sYXRlUHJvdmlkZXIsCiAgICAgICAgJGludGVydmFsOiAkSW50ZXJ2YWxQcm92aWRlciwKICAgICAgICAkaHR0cDogJEh0dHBQcm92aWRlciwKICAgICAgICAkaHR0cEJhY2tlbmQ6ICRIdHRwQmFja2VuZFByb3ZpZGVyLAogICAgICAgICRsb2NhdGlvbjogJExvY2F0aW9uUHJvdmlkZXIsCiAgICAgICAgJGxvZzogJExvZ1Byb3ZpZGVyLAogICAgICAgICRwYXJzZTogJFBhcnNlUHJvdmlkZXIsCiAgICAgICAgJHJvb3RTY29wZTogJFJvb3RTY29wZVByb3ZpZGVyLAogICAgICAgICRxOiAkUVByb3ZpZGVyLAogICAgICAgICQkcTogJCRRUHJvdmlkZXIsCiAgICAgICAgJHNjZTogJFNjZVByb3ZpZGVyLAogICAgICAgICRzY2VEZWxlZ2F0ZTogJFNjZURlbGVnYXRlUHJvdmlkZXIsCiAgICAgICAgJHNuaWZmZXI6ICRTbmlmZmVyUHJvdmlkZXIsCiAgICAgICAgJHRlbXBsYXRlQ2FjaGU6ICRUZW1wbGF0ZUNhY2hlUHJvdmlkZXIsCiAgICAgICAgJHRlbXBsYXRlUmVxdWVzdDogJFRlbXBsYXRlUmVxdWVzdFByb3ZpZGVyLAogICAgICAgICQkdGVzdGFiaWxpdHk6ICQkVGVzdGFiaWxpdHlQcm92aWRlciwKICAgICAgICAkdGltZW91dDogJFRpbWVvdXRQcm92aWRlciwKICAgICAgICAkd2luZG93OiAkV2luZG93UHJvdmlkZXIsCiAgICAgICAgJCRyQUY6ICQkUkFGUHJvdmlkZXIsCiAgICAgICAgJCRhc3luY0NhbGxiYWNrOiAkJEFzeW5jQ2FsbGJhY2tQcm92aWRlcgogICAgICB9KTsKICAgIH0KICBdKTsKfQoKLyogZ2xvYmFsIEpRTGl0ZVByb3RvdHlwZTogdHJ1ZSwKICBhZGRFdmVudExpc3RlbmVyRm46IHRydWUsCiAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuOiB0cnVlLAogIEJPT0xFQU5fQVRUUjogdHJ1ZSwKICBBTElBU0VEX0FUVFI6IHRydWUsCiovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vSlFMaXRlCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8qKgogKiBAbmdkb2MgZnVuY3Rpb24KICogQG5hbWUgYW5ndWxhci5lbGVtZW50CiAqIEBtb2R1bGUgbmcKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIFdyYXBzIGEgcmF3IERPTSBlbGVtZW50IG9yIEhUTUwgc3RyaW5nIGFzIGEgW2pRdWVyeV0oaHR0cDovL2pxdWVyeS5jb20pIGVsZW1lbnQuCiAqCiAqIElmIGpRdWVyeSBpcyBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgIGlzIGFuIGFsaWFzIGZvciB0aGUKICogW2pRdWVyeV0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2pRdWVyeS8pIGZ1bmN0aW9uLiBJZiBqUXVlcnkgaXMgbm90IGF2YWlsYWJsZSwgYGFuZ3VsYXIuZWxlbWVudGAKICogZGVsZWdhdGVzIHRvIEFuZ3VsYXIncyBidWlsdC1pbiBzdWJzZXQgb2YgalF1ZXJ5LCBjYWxsZWQgImpRdWVyeSBsaXRlIiBvciAianFMaXRlLiIKICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+anFMaXRlIGlzIGEgdGlueSwgQVBJLWNvbXBhdGlibGUgc3Vic2V0IG9mIGpRdWVyeSB0aGF0IGFsbG93cwogKiBBbmd1bGFyIHRvIG1hbmlwdWxhdGUgdGhlIERPTSBpbiBhIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsZSB3YXkuICoqanFMaXRlKiogaW1wbGVtZW50cyBvbmx5IHRoZSBtb3N0CiAqIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgaGF2aW5nIGEgdmVyeSBzbWFsbCBmb290cHJpbnQuPC9kaXY+CiAqCiAqIFRvIHVzZSBqUXVlcnksIHNpbXBseSBsb2FkIGl0IGJlZm9yZSBgRE9NQ29udGVudExvYWRlZGAgZXZlbnQgZmlyZWQuCiAqCiAqIDxkaXYgY2xhc3M9ImFsZXJ0Ij4qKk5vdGU6KiogYWxsIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiBBbmd1bGFyIGFyZSBhbHdheXMgd3JhcHBlZCB3aXRoIGpRdWVyeSBvcgogKiBqcUxpdGU7IHRoZXkgYXJlIG5ldmVyIHJhdyBET00gcmVmZXJlbmNlcy48L2Rpdj4KICoKICogIyMgQW5ndWxhcidzIGpxTGl0ZQogKiBqcUxpdGUgcHJvdmlkZXMgb25seSB0aGUgZm9sbG93aW5nIGpRdWVyeSBtZXRob2RzOgogKgogKiAtIFtgYWRkQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9hZGRDbGFzcy8pCiAqIC0gW2BhZnRlcigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2FmdGVyLykKICogLSBbYGFwcGVuZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2FwcGVuZC8pCiAqIC0gW2BhdHRyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYXR0ci8pIC0gRG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbnMgYXMgcGFyYW1ldGVycwogKiAtIFtgYmluZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2JpbmQvKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YQogKiAtIFtgY2hpbGRyZW4oKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jaGlsZHJlbi8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnMKICogLSBbYGNsb25lKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY2xvbmUvKQogKiAtIFtgY29udGVudHMoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jb250ZW50cy8pCiAqIC0gW2Bjc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jc3MvKSAtIE9ubHkgcmV0cmlldmVzIGlubGluZS1zdHlsZXMsIGRvZXMgbm90IGNhbGwgYGdldENvbXB1dGVkU3R5bGUoKWAKICogLSBbYGRhdGEoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9kYXRhLykKICogLSBbYGRldGFjaCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2RldGFjaC8pCiAqIC0gW2BlbXB0eSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VtcHR5LykKICogLSBbYGVxKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZXEvKQogKiAtIFtgZmluZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2ZpbmQvKSAtIExpbWl0ZWQgdG8gbG9va3VwcyBieSB0YWcgbmFtZQogKiAtIFtgaGFzQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9oYXNDbGFzcy8pCiAqIC0gW2BodG1sKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vaHRtbC8pCiAqIC0gW2BuZXh0KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vbmV4dC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnMKICogLSBbYG9uKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vb24vKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YQogKiAtIFtgb2ZmKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vb2ZmLykgLSBEb2VzIG5vdCBzdXBwb3J0IG5hbWVzcGFjZXMgb3Igc2VsZWN0b3JzCiAqIC0gW2BvbmUoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9vbmUvKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcyBvciBzZWxlY3RvcnMKICogLSBbYHBhcmVudCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3BhcmVudC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnMKICogLSBbYHByZXBlbmQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9wcmVwZW5kLykKICogLSBbYHByb3AoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9wcm9wLykKICogLSBbYHJlYWR5KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVhZHkvKQogKiAtIFtgcmVtb3ZlKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlLykKICogLSBbYHJlbW92ZUF0dHIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZW1vdmVBdHRyLykKICogLSBbYHJlbW92ZUNsYXNzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlQ2xhc3MvKQogKiAtIFtgcmVtb3ZlRGF0YSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3JlbW92ZURhdGEvKQogKiAtIFtgcmVwbGFjZVdpdGgoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZXBsYWNlV2l0aC8pCiAqIC0gW2B0ZXh0KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdGV4dC8pCiAqIC0gW2B0b2dnbGVDbGFzcygpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3RvZ2dsZUNsYXNzLykKICogLSBbYHRyaWdnZXJIYW5kbGVyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdHJpZ2dlckhhbmRsZXIvKSAtIFBhc3NlcyBhIGR1bW15IGV2ZW50IG9iamVjdCB0byBoYW5kbGVycy4KICogLSBbYHVuYmluZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3VuYmluZC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzCiAqIC0gW2B2YWwoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS92YWwvKQogKiAtIFtgd3JhcCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3dyYXAvKQogKgogKiAjIyBqUXVlcnkvanFMaXRlIEV4dHJhcwogKiBBbmd1bGFyIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZHMgYW5kIGV2ZW50cyB0byBib3RoIGpRdWVyeSBhbmQganFMaXRlOgogKgogKiAjIyMgRXZlbnRzCiAqIC0gYCRkZXN0cm95YCAtIEFuZ3VsYXJKUyBpbnRlcmNlcHRzIGFsbCBqcUxpdGUvalF1ZXJ5J3MgRE9NIGRlc3RydWN0aW9uIGFwaXMgYW5kIGZpcmVzIHRoaXMgZXZlbnQKICogICAgb24gYWxsIERPTSBub2RlcyBiZWluZyByZW1vdmVkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBjbGVhbiB1cCBhbnkgM3JkIHBhcnR5IGJpbmRpbmdzIHRvIHRoZSBET00KICogICAgZWxlbWVudCBiZWZvcmUgaXQgaXMgcmVtb3ZlZC4KICoKICogIyMjIE1ldGhvZHMKICogLSBgY29udHJvbGxlcihuYW1lKWAgLSByZXRyaWV2ZXMgdGhlIGNvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBvciBpdHMgcGFyZW50LiBCeSBkZWZhdWx0CiAqICAgcmV0cmlldmVzIGNvbnRyb2xsZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBgbmdDb250cm9sbGVyYCBkaXJlY3RpdmUuIElmIGBuYW1lYCBpcyBwcm92aWRlZCBhcwogKiAgIGNhbWVsQ2FzZSBkaXJlY3RpdmUgbmFtZSwgdGhlbiB0aGUgY29udHJvbGxlciBmb3IgdGhpcyBkaXJlY3RpdmUgd2lsbCBiZSByZXRyaWV2ZWQgKGUuZy4KICogICBgJ25nTW9kZWwnYCkuCiAqIC0gYGluamVjdG9yKClgIC0gcmV0cmlldmVzIHRoZSBpbmplY3RvciBvZiB0aGUgY3VycmVudCBlbGVtZW50IG9yIGl0cyBwYXJlbnQuCiAqIC0gYHNjb3BlKClgIC0gcmV0cmlldmVzIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0gb2YgdGhlIGN1cnJlbnQKICogICBlbGVtZW50IG9yIGl0cyBwYXJlbnQuIFJlcXVpcmVzIHtAbGluayBndWlkZS9wcm9kdWN0aW9uI2Rpc2FibGluZy1kZWJ1Zy1kYXRhIERlYnVnIERhdGF9IHRvCiAqICAgYmUgZW5hYmxlZC4KICogLSBgaXNvbGF0ZVNjb3BlKClgIC0gcmV0cmlldmVzIGFuIGlzb2xhdGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9IGlmIG9uZSBpcyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUKICogICBjdXJyZW50IGVsZW1lbnQuIFRoaXMgZ2V0dGVyIHNob3VsZCBiZSB1c2VkIG9ubHkgb24gZWxlbWVudHMgdGhhdCBjb250YWluIGEgZGlyZWN0aXZlIHdoaWNoIHN0YXJ0cyBhIG5ldyBpc29sYXRlCiAqICAgc2NvcGUuIENhbGxpbmcgYHNjb3BlKClgIG9uIHRoaXMgZWxlbWVudCBhbHdheXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgbm9uLWlzb2xhdGUgc2NvcGUuCiAqICAgUmVxdWlyZXMge0BsaW5rIGd1aWRlL3Byb2R1Y3Rpb24jZGlzYWJsaW5nLWRlYnVnLWRhdGEgRGVidWcgRGF0YX0gdG8gYmUgZW5hYmxlZC4KICogLSBgaW5oZXJpdGVkRGF0YSgpYCAtIHNhbWUgYXMgYGRhdGEoKWAsIGJ1dCB3YWxrcyB1cCB0aGUgRE9NIHVudGlsIGEgdmFsdWUgaXMgZm91bmQgb3IgdGhlIHRvcAogKiAgIHBhcmVudCBlbGVtZW50IGlzIHJlYWNoZWQuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfERPTUVsZW1lbnR9IGVsZW1lbnQgSFRNTCBzdHJpbmcgb3IgRE9NRWxlbWVudCB0byBiZSB3cmFwcGVkIGludG8galF1ZXJ5LgogKiBAcmV0dXJucyB7T2JqZWN0fSBqUXVlcnkgb2JqZWN0LgogKi8KCkpRTGl0ZS5leHBhbmRvID0gJ25nMzM5JzsKCnZhciBqcUNhY2hlID0gSlFMaXRlLmNhY2hlID0ge30sCiAgICBqcUlkID0gMSwKICAgIGFkZEV2ZW50TGlzdGVuZXJGbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHR5cGUsIGZuKSB7CiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOwogICAgfSwKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHR5cGUsIGZuKSB7CiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOwogICAgfTsKCi8qCiAqICEhISBUaGlzIGlzIGFuIHVuZG9jdW1lbnRlZCAicHJpdmF0ZSIgZnVuY3Rpb24gISEhCiAqLwpKUUxpdGUuX2RhdGEgPSBmdW5jdGlvbihub2RlKSB7CiAgLy9qUXVlcnkgYWx3YXlzIHJldHVybnMgYW4gb2JqZWN0IG9uIGNhY2hlIG1pc3MKICByZXR1cm4gdGhpcy5jYWNoZVtub2RlW3RoaXMuZXhwYW5kb11dIHx8IHt9Owp9OwoKZnVuY3Rpb24ganFOZXh0SWQoKSB7IHJldHVybiArK2pxSWQ7IH0KCgp2YXIgU1BFQ0lBTF9DSEFSU19SRUdFWFAgPSAvKFtcOlwtXF9dKyguKSkvZzsKdmFyIE1PWl9IQUNLX1JFR0VYUCA9IC9ebW96KFtBLVpdKS87CnZhciBNT1VTRV9FVkVOVF9NQVA9IHsgbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwgbW91c2VlbnRlcjogIm1vdXNlb3ZlciJ9Owp2YXIganFMaXRlTWluRXJyID0gbWluRXJyKCdqcUxpdGUnKTsKCi8qKgogKiBDb252ZXJ0cyBzbmFrZV9jYXNlIHRvIGNhbWVsQ2FzZS4KICogQWxzbyB0aGVyZSBpcyBzcGVjaWFsIGNhc2UgZm9yIE1veiBwcmVmaXggc3RhcnRpbmcgd2l0aCB1cHBlciBjYXNlIGxldHRlci4KICogQHBhcmFtIG5hbWUgTmFtZSB0byBub3JtYWxpemUKICovCmZ1bmN0aW9uIGNhbWVsQ2FzZShuYW1lKSB7CiAgcmV0dXJuIG5hbWUuCiAgICByZXBsYWNlKFNQRUNJQUxfQ0hBUlNfUkVHRVhQLCBmdW5jdGlvbihfLCBzZXBhcmF0b3IsIGxldHRlciwgb2Zmc2V0KSB7CiAgICAgIHJldHVybiBvZmZzZXQgPyBsZXR0ZXIudG9VcHBlckNhc2UoKSA6IGxldHRlcjsKICAgIH0pLgogICAgcmVwbGFjZShNT1pfSEFDS19SRUdFWFAsICdNb3okMScpOwp9Cgp2YXIgU0lOR0xFX1RBR19SRUdFWFAgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvOwp2YXIgSFRNTF9SRUdFWFAgPSAvPHwmIz9cdys7LzsKdmFyIFRBR19OQU1FX1JFR0VYUCA9IC88KFtcdzpdKykvOwp2YXIgWEhUTUxfVEFHX1JFR0VYUCA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2k7Cgp2YXIgd3JhcE1hcCA9IHsKICAnb3B0aW9uJzogWzEsICc8c2VsZWN0IG11bHRpcGxlPSJtdWx0aXBsZSI+JywgJzwvc2VsZWN0PiddLAoKICAndGhlYWQnOiBbMSwgJzx0YWJsZT4nLCAnPC90YWJsZT4nXSwKICAnY29sJzogWzIsICc8dGFibGU+PGNvbGdyb3VwPicsICc8L2NvbGdyb3VwPjwvdGFibGU+J10sCiAgJ3RyJzogWzIsICc8dGFibGU+PHRib2R5PicsICc8L3Rib2R5PjwvdGFibGU+J10sCiAgJ3RkJzogWzMsICc8dGFibGU+PHRib2R5Pjx0cj4nLCAnPC90cj48L3Rib2R5PjwvdGFibGU+J10sCiAgJ19kZWZhdWx0JzogWzAsICIiLCAiIl0KfTsKCndyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKd3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDsKd3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7CgoKZnVuY3Rpb24ganFMaXRlSXNUZXh0Tm9kZShodG1sKSB7CiAgcmV0dXJuICFIVE1MX1JFR0VYUC50ZXN0KGh0bWwpOwp9CgpmdW5jdGlvbiBqcUxpdGVBY2NlcHRzRGF0YShub2RlKSB7CiAgLy8gVGhlIHdpbmRvdyBvYmplY3QgY2FuIGFjY2VwdCBkYXRhIGJ1dCBoYXMgbm8gbm9kZVR5cGUKICAvLyBPdGhlcndpc2Ugd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBlbGVtZW50cyAoMSkgYW5kIGRvY3VtZW50cyAoOSkKICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlOwogIHJldHVybiBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQgfHwgIW5vZGVUeXBlIHx8IG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRE9DVU1FTlQ7Cn0KCmZ1bmN0aW9uIGpxTGl0ZUJ1aWxkRnJhZ21lbnQoaHRtbCwgY29udGV4dCkgewogIHZhciB0bXAsIHRhZywgd3JhcCwKICAgICAgZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKICAgICAgbm9kZXMgPSBbXSwgaTsKCiAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkpIHsKICAgIC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQogICAgbm9kZXMucHVzaChjb250ZXh0LmNyZWF0ZVRleHROb2RlKGh0bWwpKTsKICB9IGVsc2UgewogICAgLy8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzCiAgICB0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY29udGV4dC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CiAgICB0YWcgPSAoVEFHX05BTUVfUkVHRVhQLmV4ZWMoaHRtbCkgfHwgWyIiLCAiIl0pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICB3cmFwID0gd3JhcE1hcFt0YWddIHx8IHdyYXBNYXAuX2RlZmF1bHQ7CiAgICB0bXAuaW5uZXJIVE1MID0gd3JhcFsxXSArIGh0bWwucmVwbGFjZShYSFRNTF9UQUdfUkVHRVhQLCAiPCQxPjwvJDI+IikgKyB3cmFwWzJdOwoKICAgIC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudAogICAgaSA9IHdyYXBbMF07CiAgICB3aGlsZSAoaS0tKSB7CiAgICAgIHRtcCA9IHRtcC5sYXN0Q2hpbGQ7CiAgICB9CgogICAgbm9kZXMgPSBjb25jYXQobm9kZXMsIHRtcC5jaGlsZE5vZGVzKTsKCiAgICB0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkOwogICAgdG1wLnRleHRDb250ZW50ID0gIiI7CiAgfQoKICAvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50CiAgZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKICBmcmFnbWVudC5pbm5lckhUTUwgPSAiIjsgLy8gQ2xlYXIgaW5uZXIgSFRNTAogIGZvckVhY2gobm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHsKICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpOwogIH0pOwoKICByZXR1cm4gZnJhZ21lbnQ7Cn0KCmZ1bmN0aW9uIGpxTGl0ZVBhcnNlSFRNTChodG1sLCBjb250ZXh0KSB7CiAgY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CiAgdmFyIHBhcnNlZDsKCiAgaWYgKChwYXJzZWQgPSBTSU5HTEVfVEFHX1JFR0VYUC5leGVjKGh0bWwpKSkgewogICAgcmV0dXJuIFtjb250ZXh0LmNyZWF0ZUVsZW1lbnQocGFyc2VkWzFdKV07CiAgfQoKICBpZiAoKHBhcnNlZCA9IGpxTGl0ZUJ1aWxkRnJhZ21lbnQoaHRtbCwgY29udGV4dCkpKSB7CiAgICByZXR1cm4gcGFyc2VkLmNoaWxkTm9kZXM7CiAgfQoKICByZXR1cm4gW107Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpmdW5jdGlvbiBKUUxpdGUoZWxlbWVudCkgewogIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSlFMaXRlKSB7CiAgICByZXR1cm4gZWxlbWVudDsKICB9CgogIHZhciBhcmdJc1N0cmluZzsKCiAgaWYgKGlzU3RyaW5nKGVsZW1lbnQpKSB7CiAgICBlbGVtZW50ID0gdHJpbShlbGVtZW50KTsKICAgIGFyZ0lzU3RyaW5nID0gdHJ1ZTsKICB9CiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEpRTGl0ZSkpIHsKICAgIGlmIChhcmdJc1N0cmluZyAmJiBlbGVtZW50LmNoYXJBdCgwKSAhPSAnPCcpIHsKICAgICAgdGhyb3cganFMaXRlTWluRXJyKCdub3NlbCcsICdMb29raW5nIHVwIGVsZW1lbnRzIHZpYSBzZWxlY3RvcnMgaXMgbm90IHN1cHBvcnRlZCBieSBqcUxpdGUhIFNlZTogaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvYW5ndWxhci5lbGVtZW50Jyk7CiAgICB9CiAgICByZXR1cm4gbmV3IEpRTGl0ZShlbGVtZW50KTsKICB9CgogIGlmIChhcmdJc1N0cmluZykgewogICAganFMaXRlQWRkTm9kZXModGhpcywganFMaXRlUGFyc2VIVE1MKGVsZW1lbnQpKTsKICB9IGVsc2UgewogICAganFMaXRlQWRkTm9kZXModGhpcywgZWxlbWVudCk7CiAgfQp9CgpmdW5jdGlvbiBqcUxpdGVDbG9uZShlbGVtZW50KSB7CiAgcmV0dXJuIGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpOwp9CgpmdW5jdGlvbiBqcUxpdGVEZWFsb2MoZWxlbWVudCwgb25seURlc2NlbmRhbnRzKSB7CiAgaWYgKCFvbmx5RGVzY2VuZGFudHMpIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCk7CgogIGlmIChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpIHsKICAgIHZhciBkZXNjZW5kYW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBkZXNjZW5kYW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAganFMaXRlUmVtb3ZlRGF0YShkZXNjZW5kYW50c1tpXSk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBqcUxpdGVPZmYoZWxlbWVudCwgdHlwZSwgZm4sIHVuc3VwcG9ydGVkKSB7CiAgaWYgKGlzRGVmaW5lZCh1bnN1cHBvcnRlZCkpIHRocm93IGpxTGl0ZU1pbkVycignb2ZmYXJncycsICdqcUxpdGUjb2ZmKCkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYHNlbGVjdG9yYCBhcmd1bWVudCcpOwoKICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQpOwogIHZhciBldmVudHMgPSBleHBhbmRvU3RvcmUgJiYgZXhwYW5kb1N0b3JlLmV2ZW50czsKICB2YXIgaGFuZGxlID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5oYW5kbGU7CgogIGlmICghaGFuZGxlKSByZXR1cm47IC8vbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQKCiAgaWYgKCF0eXBlKSB7CiAgICBmb3IgKHR5cGUgaW4gZXZlbnRzKSB7CiAgICAgIGlmICh0eXBlICE9PSAnJGRlc3Ryb3knKSB7CiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuKGVsZW1lbnQsIHR5cGUsIGhhbmRsZSk7CiAgICAgIH0KICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yRWFjaCh0eXBlLnNwbGl0KCcgJyksIGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgaWYgKGlzRGVmaW5lZChmbikpIHsKICAgICAgICB2YXIgbGlzdGVuZXJGbnMgPSBldmVudHNbdHlwZV07CiAgICAgICAgYXJyYXlSZW1vdmUobGlzdGVuZXJGbnMgfHwgW10sIGZuKTsKICAgICAgICBpZiAobGlzdGVuZXJGbnMgJiYgbGlzdGVuZXJGbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuKGVsZW1lbnQsIHR5cGUsIGhhbmRsZSk7CiAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCwgbmFtZSkgewogIHZhciBleHBhbmRvSWQgPSBlbGVtZW50Lm5nMzM5OwogIHZhciBleHBhbmRvU3RvcmUgPSBleHBhbmRvSWQgJiYganFDYWNoZVtleHBhbmRvSWRdOwoKICBpZiAoZXhwYW5kb1N0b3JlKSB7CiAgICBpZiAobmFtZSkgewogICAgICBkZWxldGUgZXhwYW5kb1N0b3JlLmRhdGFbbmFtZV07CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoZXhwYW5kb1N0b3JlLmhhbmRsZSkgewogICAgICBpZiAoZXhwYW5kb1N0b3JlLmV2ZW50cy4kZGVzdHJveSkgewogICAgICAgIGV4cGFuZG9TdG9yZS5oYW5kbGUoe30sICckZGVzdHJveScpOwogICAgICB9CiAgICAgIGpxTGl0ZU9mZihlbGVtZW50KTsKICAgIH0KICAgIGRlbGV0ZSBqcUNhY2hlW2V4cGFuZG9JZF07CiAgICBlbGVtZW50Lm5nMzM5ID0gdW5kZWZpbmVkOyAvLyBkb24ndCBkZWxldGUgRE9NIGV4cGFuZG9zLiBJRSBhbmQgQ2hyb21lIGRvbid0IGxpa2UgaXQKICB9Cn0KCgpmdW5jdGlvbiBqcUxpdGVFeHBhbmRvU3RvcmUoZWxlbWVudCwgY3JlYXRlSWZOZWNlc3NhcnkpIHsKICB2YXIgZXhwYW5kb0lkID0gZWxlbWVudC5uZzMzOSwKICAgICAgZXhwYW5kb1N0b3JlID0gZXhwYW5kb0lkICYmIGpxQ2FjaGVbZXhwYW5kb0lkXTsKCiAgaWYgKGNyZWF0ZUlmTmVjZXNzYXJ5ICYmICFleHBhbmRvU3RvcmUpIHsKICAgIGVsZW1lbnQubmczMzkgPSBleHBhbmRvSWQgPSBqcU5leHRJZCgpOwogICAgZXhwYW5kb1N0b3JlID0ganFDYWNoZVtleHBhbmRvSWRdID0ge2V2ZW50czoge30sIGRhdGE6IHt9LCBoYW5kbGU6IHVuZGVmaW5lZH07CiAgfQoKICByZXR1cm4gZXhwYW5kb1N0b3JlOwp9CgoKZnVuY3Rpb24ganFMaXRlRGF0YShlbGVtZW50LCBrZXksIHZhbHVlKSB7CiAgaWYgKGpxTGl0ZUFjY2VwdHNEYXRhKGVsZW1lbnQpKSB7CgogICAgdmFyIGlzU2ltcGxlU2V0dGVyID0gaXNEZWZpbmVkKHZhbHVlKTsKICAgIHZhciBpc1NpbXBsZUdldHRlciA9ICFpc1NpbXBsZVNldHRlciAmJiBrZXkgJiYgIWlzT2JqZWN0KGtleSk7CiAgICB2YXIgbWFzc0dldHRlciA9ICFrZXk7CiAgICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsICFpc1NpbXBsZUdldHRlcik7CiAgICB2YXIgZGF0YSA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZGF0YTsKCiAgICBpZiAoaXNTaW1wbGVTZXR0ZXIpIHsgLy8gZGF0YSgna2V5JywgdmFsdWUpCiAgICAgIGRhdGFba2V5XSA9IHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKG1hc3NHZXR0ZXIpIHsgIC8vIGRhdGEoKQogICAgICAgIHJldHVybiBkYXRhOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpc1NpbXBsZUdldHRlcikgeyAvLyBkYXRhKCdrZXknKQogICAgICAgICAgLy8gZG9uJ3QgZm9yY2UgY3JlYXRpb24gb2YgZXhwYW5kb1N0b3JlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0CiAgICAgICAgICByZXR1cm4gZGF0YSAmJiBkYXRhW2tleV07CiAgICAgICAgfSBlbHNlIHsgLy8gbWFzcy1zZXR0ZXI6IGRhdGEoe2tleTE6IHZhbDEsIGtleTI6IHZhbDJ9KQogICAgICAgICAgZXh0ZW5kKGRhdGEsIGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBqcUxpdGVIYXNDbGFzcyhlbGVtZW50LCBzZWxlY3RvcikgewogIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUpIHJldHVybiBmYWxzZTsKICByZXR1cm4gKCgiICIgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywgIiAiKS4KICAgICAgaW5kZXhPZigiICIgKyBzZWxlY3RvciArICIgIikgPiAtMSk7Cn0KCmZ1bmN0aW9uIGpxTGl0ZVJlbW92ZUNsYXNzKGVsZW1lbnQsIGNzc0NsYXNzZXMpIHsKICBpZiAoY3NzQ2xhc3NlcyAmJiBlbGVtZW50LnNldEF0dHJpYnV0ZSkgewogICAgZm9yRWFjaChjc3NDbGFzc2VzLnNwbGl0KCcgJyksIGZ1bmN0aW9uKGNzc0NsYXNzKSB7CiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHRyaW0oCiAgICAgICAgICAoIiAiICsgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnKSArICIgIikKICAgICAgICAgIC5yZXBsYWNlKC9bXG5cdF0vZywgIiAiKQogICAgICAgICAgLnJlcGxhY2UoIiAiICsgdHJpbShjc3NDbGFzcykgKyAiICIsICIgIikpCiAgICAgICk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGpxTGl0ZUFkZENsYXNzKGVsZW1lbnQsIGNzc0NsYXNzZXMpIHsKICBpZiAoY3NzQ2xhc3NlcyAmJiBlbGVtZW50LnNldEF0dHJpYnV0ZSkgewogICAgdmFyIGV4aXN0aW5nQ2xhc3NlcyA9ICgnICcgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgJyAnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcblx0XS9nLCAiICIpOwoKICAgIGZvckVhY2goY3NzQ2xhc3Nlcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjc3NDbGFzcykgewogICAgICBjc3NDbGFzcyA9IHRyaW0oY3NzQ2xhc3MpOwogICAgICBpZiAoZXhpc3RpbmdDbGFzc2VzLmluZGV4T2YoJyAnICsgY3NzQ2xhc3MgKyAnICcpID09PSAtMSkgewogICAgICAgIGV4aXN0aW5nQ2xhc3NlcyArPSBjc3NDbGFzcyArICcgJzsKICAgICAgfQogICAgfSk7CgogICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgdHJpbShleGlzdGluZ0NsYXNzZXMpKTsKICB9Cn0KCgpmdW5jdGlvbiBqcUxpdGVBZGROb2Rlcyhyb290LCBlbGVtZW50cykgewogIC8vIFRISVMgQ09ERSBJUyBWRVJZIEhPVC4gRG9uJ3QgbWFrZSBjaGFuZ2VzIHdpdGhvdXQgYmVuY2htYXJraW5nLgoKICBpZiAoZWxlbWVudHMpIHsKCiAgICAvLyBpZiBhIE5vZGUgKHRoZSBtb3N0IGNvbW1vbiBjYXNlKQogICAgaWYgKGVsZW1lbnRzLm5vZGVUeXBlKSB7CiAgICAgIHJvb3Rbcm9vdC5sZW5ndGgrK10gPSBlbGVtZW50czsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7CgogICAgICAvLyBpZiBhbiBBcnJheSBvciBOb2RlTGlzdCBhbmQgbm90IGEgV2luZG93CiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyAmJiBlbGVtZW50cy53aW5kb3cgIT09IGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKGxlbmd0aCkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJvb3Rbcm9vdC5sZW5ndGgrK10gPSBlbGVtZW50czsKICAgICAgfQogICAgfQogIH0KfQoKCmZ1bmN0aW9uIGpxTGl0ZUNvbnRyb2xsZXIoZWxlbWVudCwgbmFtZSkgewogIHJldHVybiBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQsICckJyArIChuYW1lIHx8ICduZ0NvbnRyb2xsZXInKSArICdDb250cm9sbGVyJyk7Cn0KCmZ1bmN0aW9uIGpxTGl0ZUluaGVyaXRlZERhdGEoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsKICAvLyBpZiBlbGVtZW50IGlzIHRoZSBkb2N1bWVudCBvYmplY3Qgd29yayB3aXRoIHRoZSBodG1sIGVsZW1lbnQgaW5zdGVhZAogIC8vIHRoaXMgbWFrZXMgJChkb2N1bWVudCkuc2NvcGUoKSBwb3NzaWJsZQogIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IE5PREVfVFlQRV9ET0NVTUVOVCkgewogICAgZWxlbWVudCA9IGVsZW1lbnQuZG9jdW1lbnRFbGVtZW50OwogIH0KICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gbmFtZSA6IFtuYW1lXTsKCiAgd2hpbGUgKGVsZW1lbnQpIHsKICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5hbWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgaWYgKCh2YWx1ZSA9IGpxTGl0ZS5kYXRhKGVsZW1lbnQsIG5hbWVzW2ldKSkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIC8vIElmIGRlYWxpbmcgd2l0aCBhIGRvY3VtZW50IGZyYWdtZW50IG5vZGUgd2l0aCBhIGhvc3QgZWxlbWVudCwgYW5kIG5vIHBhcmVudCwgdXNlIHRoZSBob3N0CiAgICAvLyBlbGVtZW50IGFzIHRoZSBwYXJlbnQuIFRoaXMgZW5hYmxlcyBkaXJlY3RpdmVzIHdpdGhpbiBhIFNoYWRvdyBET00gb3IgcG9seWZpbGxlZCBTaGFkb3cgRE9NCiAgICAvLyB0byBsb29rdXAgcGFyZW50IGNvbnRyb2xsZXJzLgogICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSB8fCAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UICYmIGVsZW1lbnQuaG9zdCk7CiAgfQp9CgpmdW5jdGlvbiBqcUxpdGVFbXB0eShlbGVtZW50KSB7CiAganFMaXRlRGVhbG9jKGVsZW1lbnQsIHRydWUpOwogIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHsKICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTsKICB9Cn0KCmZ1bmN0aW9uIGpxTGl0ZVJlbW92ZShlbGVtZW50LCBrZWVwRGF0YSkgewogIGlmICgha2VlcERhdGEpIGpxTGl0ZURlYWxvYyhlbGVtZW50KTsKICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwogIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTsKfQoKCmZ1bmN0aW9uIGpxTGl0ZURvY3VtZW50TG9hZGVkKGFjdGlvbiwgd2luKSB7CiAgd2luID0gd2luIHx8IHdpbmRvdzsKICBpZiAod2luLmRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgIC8vIEZvcmNlIHRoZSBhY3Rpb24gdG8gYmUgcnVuIGFzeW5jIGZvciBjb25zaXN0ZW50IGJlaGF2aW91cgogICAgLy8gZnJvbSB0aGUgYWN0aW9uJ3MgcG9pbnQgb2YgdmlldwogICAgLy8gaS5lLiBpdCB3aWxsIGRlZmluaXRlbHkgbm90IGJlIGluIGEgJGFwcGx5CiAgICB3aW4uc2V0VGltZW91dChhY3Rpb24pOwogIH0gZWxzZSB7CiAgICAvLyBObyBuZWVkIHRvIHVuYmluZCB0aGlzIGhhbmRsZXIgYXMgbG9hZCBpcyBvbmx5IGV2ZXIgY2FsbGVkIG9uY2UKICAgIGpxTGl0ZSh3aW4pLm9uKCdsb2FkJywgYWN0aW9uKTsKICB9Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBGdW5jdGlvbnMgd2hpY2ggYXJlIGRlY2xhcmVkIGRpcmVjdGx5LgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KdmFyIEpRTGl0ZVByb3RvdHlwZSA9IEpRTGl0ZS5wcm90b3R5cGUgPSB7CiAgcmVhZHk6IGZ1bmN0aW9uKGZuKSB7CiAgICB2YXIgZmlyZWQgPSBmYWxzZTsKCiAgICBmdW5jdGlvbiB0cmlnZ2VyKCkgewogICAgICBpZiAoZmlyZWQpIHJldHVybjsKICAgICAgZmlyZWQgPSB0cnVlOwogICAgICBmbigpOwogICAgfQoKICAgIC8vIGNoZWNrIGlmIGRvY3VtZW50IGlzIGFscmVhZHkgbG9hZGVkCiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykgewogICAgICBzZXRUaW1lb3V0KHRyaWdnZXIpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5vbignRE9NQ29udGVudExvYWRlZCcsIHRyaWdnZXIpOyAvLyB3b3JrcyBmb3IgbW9kZXJuIGJyb3dzZXJzIGFuZCBJRTkKICAgICAgLy8gd2UgY2FuIG5vdCB1c2UganFMaXRlIHNpbmNlIHdlIGFyZSBub3QgZG9uZSBsb2FkaW5nIGFuZCBqUXVlcnkgY291bGQgYmUgbG9hZGVkIGxhdGVyLgogICAgICAvLyBqc2hpbnQgLVcwNjQKICAgICAgSlFMaXRlKHdpbmRvdykub24oJ2xvYWQnLCB0cmlnZ2VyKTsgLy8gZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCBmb3Igb3RoZXJzCiAgICAgIC8vIGpzaGludCArVzA2NAogICAgfQogIH0sCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gW107CiAgICBmb3JFYWNoKHRoaXMsIGZ1bmN0aW9uKGUpIHsgdmFsdWUucHVzaCgnJyArIGUpO30pOwogICAgcmV0dXJuICdbJyArIHZhbHVlLmpvaW4oJywgJykgKyAnXSc7CiAgfSwKCiAgZXE6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgIHJldHVybiAoaW5kZXggPj0gMCkgPyBqcUxpdGUodGhpc1tpbmRleF0pIDoganFMaXRlKHRoaXNbdGhpcy5sZW5ndGggKyBpbmRleF0pOwogIH0sCgogIGxlbmd0aDogMCwKICBwdXNoOiBwdXNoLAogIHNvcnQ6IFtdLnNvcnQsCiAgc3BsaWNlOiBbXS5zcGxpY2UKfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBGdW5jdGlvbnMgaXRlcmF0aW5nIGdldHRlci9zZXR0ZXJzLgovLyB0aGVzZSBmdW5jdGlvbnMgcmV0dXJuIHNlbGYgb24gc2V0dGVyIGFuZAovLyB2YWx1ZSBvbiBnZXQuCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwp2YXIgQk9PTEVBTl9BVFRSID0ge307CmZvckVhY2goJ211bHRpcGxlLHNlbGVjdGVkLGNoZWNrZWQsZGlzYWJsZWQscmVhZE9ubHkscmVxdWlyZWQsb3Blbicuc3BsaXQoJywnKSwgZnVuY3Rpb24odmFsdWUpIHsKICBCT09MRUFOX0FUVFJbbG93ZXJjYXNlKHZhbHVlKV0gPSB2YWx1ZTsKfSk7CnZhciBCT09MRUFOX0VMRU1FTlRTID0ge307CmZvckVhY2goJ2lucHV0LHNlbGVjdCxvcHRpb24sdGV4dGFyZWEsYnV0dG9uLGZvcm0sZGV0YWlscycuc3BsaXQoJywnKSwgZnVuY3Rpb24odmFsdWUpIHsKICBCT09MRUFOX0VMRU1FTlRTW3ZhbHVlXSA9IHRydWU7Cn0pOwp2YXIgQUxJQVNFRF9BVFRSID0gewogICduZ01pbmxlbmd0aCc6ICdtaW5sZW5ndGgnLAogICduZ01heGxlbmd0aCc6ICdtYXhsZW5ndGgnLAogICduZ01pbic6ICdtaW4nLAogICduZ01heCc6ICdtYXgnLAogICduZ1BhdHRlcm4nOiAncGF0dGVybicKfTsKCmZ1bmN0aW9uIGdldEJvb2xlYW5BdHRyTmFtZShlbGVtZW50LCBuYW1lKSB7CiAgLy8gY2hlY2sgZG9tIGxhc3Qgc2luY2Ugd2Ugd2lsbCBtb3N0IGxpa2VseSBmYWlsIG9uIG5hbWUKICB2YXIgYm9vbGVhbkF0dHIgPSBCT09MRUFOX0FUVFJbbmFtZS50b0xvd2VyQ2FzZSgpXTsKCiAgLy8gYm9vbGVhbkF0dHIgaXMgaGVyZSB0d2ljZSB0byBtaW5pbWl6ZSBET00gYWNjZXNzCiAgcmV0dXJuIGJvb2xlYW5BdHRyICYmIEJPT0xFQU5fRUxFTUVOVFNbbm9kZU5hbWVfKGVsZW1lbnQpXSAmJiBib29sZWFuQXR0cjsKfQoKZnVuY3Rpb24gZ2V0QWxpYXNlZEF0dHJOYW1lKGVsZW1lbnQsIG5hbWUpIHsKICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lOwogIHJldHVybiAobm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgbm9kZU5hbWUgPT09ICdURVhUQVJFQScpICYmIEFMSUFTRURfQVRUUltuYW1lXTsKfQoKZm9yRWFjaCh7CiAgZGF0YToganFMaXRlRGF0YSwKICByZW1vdmVEYXRhOiBqcUxpdGVSZW1vdmVEYXRhCn0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7CiAgSlFMaXRlW25hbWVdID0gZm47Cn0pOwoKZm9yRWFjaCh7CiAgZGF0YToganFMaXRlRGF0YSwKICBpbmhlcml0ZWREYXRhOiBqcUxpdGVJbmhlcml0ZWREYXRhLAoKICBzY29wZTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgLy8gQ2FuJ3QgdXNlIGpxTGl0ZURhdGEgaGVyZSBkaXJlY3RseSBzbyB3ZSBzdGF5IGNvbXBhdGlibGUgd2l0aCBqUXVlcnkhCiAgICByZXR1cm4ganFMaXRlLmRhdGEoZWxlbWVudCwgJyRzY29wZScpIHx8IGpxTGl0ZUluaGVyaXRlZERhdGEoZWxlbWVudC5wYXJlbnROb2RlIHx8IGVsZW1lbnQsIFsnJGlzb2xhdGVTY29wZScsICckc2NvcGUnXSk7CiAgfSwKCiAgaXNvbGF0ZVNjb3BlOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAvLyBDYW4ndCB1c2UganFMaXRlRGF0YSBoZXJlIGRpcmVjdGx5IHNvIHdlIHN0YXkgY29tcGF0aWJsZSB3aXRoIGpRdWVyeSEKICAgIHJldHVybiBqcUxpdGUuZGF0YShlbGVtZW50LCAnJGlzb2xhdGVTY29wZScpIHx8IGpxTGl0ZS5kYXRhKGVsZW1lbnQsICckaXNvbGF0ZVNjb3BlTm9UZW1wbGF0ZScpOwogIH0sCgogIGNvbnRyb2xsZXI6IGpxTGl0ZUNvbnRyb2xsZXIsCgogIGluamVjdG9yOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICByZXR1cm4ganFMaXRlSW5oZXJpdGVkRGF0YShlbGVtZW50LCAnJGluamVjdG9yJyk7CiAgfSwKCiAgcmVtb3ZlQXR0cjogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSkgewogICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgfSwKCiAgaGFzQ2xhc3M6IGpxTGl0ZUhhc0NsYXNzLAoKICBjc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CiAgICBuYW1lID0gY2FtZWxDYXNlKG5hbWUpOwoKICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7CiAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZV0gPSB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBlbGVtZW50LnN0eWxlW25hbWVdOwogICAgfQogIH0sCgogIGF0dHI6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgbG93ZXJjYXNlZE5hbWUgPSBsb3dlcmNhc2UobmFtZSk7CiAgICBpZiAoQk9PTEVBTl9BVFRSW2xvd2VyY2FzZWROYW1lXSkgewogICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkgewogICAgICAgIGlmICghIXZhbHVlKSB7CiAgICAgICAgICBlbGVtZW50W25hbWVdID0gdHJ1ZTsKICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIGxvd2VyY2FzZWROYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWxlbWVudFtuYW1lXSA9IGZhbHNlOwogICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobG93ZXJjYXNlZE5hbWUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gKGVsZW1lbnRbbmFtZV0gfHwKICAgICAgICAgICAgICAgICAoZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShuYW1lKSB8fCBub29wKS5zcGVjaWZpZWQpCiAgICAgICAgICAgICAgID8gbG93ZXJjYXNlZE5hbWUKICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaXNEZWZpbmVkKHZhbHVlKSkgewogICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7CiAgICAgIC8vIHRoZSBleHRyYSBhcmd1bWVudCAiMiIgaXMgdG8gZ2V0IHRoZSByaWdodCB0aGluZyBmb3IgYS5ocmVmIGluIElFLCBzZWUgalF1ZXJ5IGNvZGUKICAgICAgLy8gc29tZSBlbGVtZW50cyAoZS5nLiBEb2N1bWVudCkgZG9uJ3QgaGF2ZSBnZXQgYXR0cmlidXRlLCBzbyByZXR1cm4gdW5kZWZpbmVkCiAgICAgIHZhciByZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lLCAyKTsKICAgICAgLy8gbm9ybWFsaXplIG5vbi1leGlzdGluZyBhdHRyaWJ1dGVzIHRvIHVuZGVmaW5lZCAoYXMgalF1ZXJ5KQogICAgICByZXR1cm4gcmV0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmV0OwogICAgfQogIH0sCgogIHByb3A6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CiAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkgewogICAgICBlbGVtZW50W25hbWVdID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZWxlbWVudFtuYW1lXTsKICAgIH0KICB9LAoKICB0ZXh0OiAoZnVuY3Rpb24oKSB7CiAgICBnZXRUZXh0LiRkdiA9ICcnOwogICAgcmV0dXJuIGdldFRleHQ7CgogICAgZnVuY3Rpb24gZ2V0VGV4dChlbGVtZW50LCB2YWx1ZSkgewogICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgdmFyIG5vZGVUeXBlID0gZWxlbWVudC5ub2RlVHlwZTsKICAgICAgICByZXR1cm4gKG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCB8fCBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQpID8gZWxlbWVudC50ZXh0Q29udGVudCA6ICcnOwogICAgICB9CiAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgIH0KICB9KSgpLAoKICB2YWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CiAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgIGlmIChlbGVtZW50Lm11bHRpcGxlICYmIG5vZGVOYW1lXyhlbGVtZW50KSA9PT0gJ3NlbGVjdCcpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgZm9yRWFjaChlbGVtZW50Lm9wdGlvbnMsIGZ1bmN0aW9uKG9wdGlvbikgewogICAgICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCkgewogICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24udmFsdWUgfHwgb3B0aW9uLnRleHQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTsKICAgIH0KICAgIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKICB9LAoKICBodG1sOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgewogICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgewogICAgICByZXR1cm4gZWxlbWVudC5pbm5lckhUTUw7CiAgICB9CiAgICBqcUxpdGVEZWFsb2MoZWxlbWVudCwgdHJ1ZSk7CiAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlOwogIH0sCgogIGVtcHR5OiBqcUxpdGVFbXB0eQp9LCBmdW5jdGlvbihmbiwgbmFtZSkgewogIC8qKgogICAqIFByb3BlcnRpZXM6IHdyaXRlcyByZXR1cm4gc2VsZWN0aW9uLCByZWFkcyByZXR1cm4gZmlyc3QgdmFsdWUKICAgKi8KICBKUUxpdGUucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oYXJnMSwgYXJnMikgewogICAgdmFyIGksIGtleTsKICAgIHZhciBub2RlQ291bnQgPSB0aGlzLmxlbmd0aDsKCiAgICAvLyBqcUxpdGVIYXNDbGFzcyBoYXMgb25seSB0d28gYXJndW1lbnRzLCBidXQgaXMgYSBnZXR0ZXItb25seSBmbiwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKICAgIC8vIGluIGEgd2F5IHRoYXQgc3Vydml2ZXMgbWluaWZpY2F0aW9uLgogICAgLy8ganFMaXRlRW1wdHkgdGFrZXMgbm8gYXJndW1lbnRzIGJ1dCBpcyBhIHNldHRlci4KICAgIGlmIChmbiAhPT0ganFMaXRlRW1wdHkgJiYKICAgICAgICAoKChmbi5sZW5ndGggPT0gMiAmJiAoZm4gIT09IGpxTGl0ZUhhc0NsYXNzICYmIGZuICE9PSBqcUxpdGVDb250cm9sbGVyKSkgPyBhcmcxIDogYXJnMikgPT09IHVuZGVmaW5lZCkpIHsKICAgICAgaWYgKGlzT2JqZWN0KGFyZzEpKSB7CgogICAgICAgIC8vIHdlIGFyZSBhIHdyaXRlLCBidXQgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSB0aGUga2V5L3ZhbHVlcwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlQ291bnQ7IGkrKykgewogICAgICAgICAgaWYgKGZuID09PSBqcUxpdGVEYXRhKSB7CiAgICAgICAgICAgIC8vIGRhdGEoKSB0YWtlcyB0aGUgd2hvbGUgb2JqZWN0IGluIGpRdWVyeQogICAgICAgICAgICBmbih0aGlzW2ldLCBhcmcxKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAoa2V5IGluIGFyZzEpIHsKICAgICAgICAgICAgICBmbih0aGlzW2ldLCBrZXksIGFyZzFba2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gcmV0dXJuIHNlbGYgZm9yIGNoYWluaW5nCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gd2UgYXJlIGEgcmVhZCwgc28gcmVhZCB0aGUgZmlyc3QgY2hpbGQuCiAgICAgICAgLy8gVE9ETzogZG8gd2Ugc3RpbGwgbmVlZCB0aGlzPwogICAgICAgIHZhciB2YWx1ZSA9IGZuLiRkdjsKICAgICAgICAvLyBPbmx5IGlmIHdlIGhhdmUgJGR2IGRvIHdlIGl0ZXJhdGUgb3ZlciBhbGwsIG90aGVyd2lzZSBpdCBpcyBqdXN0IHRoZSBmaXJzdCBlbGVtZW50LgogICAgICAgIHZhciBqaiA9ICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IE1hdGgubWluKG5vZGVDb3VudCwgMSkgOiBub2RlQ291bnQ7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBqajsgaisrKSB7CiAgICAgICAgICB2YXIgbm9kZVZhbHVlID0gZm4odGhpc1tqXSwgYXJnMSwgYXJnMik7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8gdmFsdWUgKyBub2RlVmFsdWUgOiBub2RlVmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gd2UgYXJlIGEgd3JpdGUsIHNvIGFwcGx5IHRvIGFsbCBjaGlsZHJlbgogICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspIHsKICAgICAgICBmbih0aGlzW2ldLCBhcmcxLCBhcmcyKTsKICAgICAgfQogICAgICAvLyByZXR1cm4gc2VsZiBmb3IgY2hhaW5pbmcKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKfSk7CgpmdW5jdGlvbiBjcmVhdGVFdmVudEhhbmRsZXIoZWxlbWVudCwgZXZlbnRzKSB7CiAgdmFyIGV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50LCB0eXBlKSB7CiAgICAvLyBqUXVlcnkgc3BlY2lmaWMgYXBpCiAgICBldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7CiAgICB9OwoKICAgIHZhciBldmVudEZucyA9IGV2ZW50c1t0eXBlIHx8IGV2ZW50LnR5cGVdOwogICAgdmFyIGV2ZW50Rm5zTGVuZ3RoID0gZXZlbnRGbnMgPyBldmVudEZucy5sZW5ndGggOiAwOwoKICAgIGlmICghZXZlbnRGbnNMZW5ndGgpIHJldHVybjsKCiAgICBpZiAoaXNVbmRlZmluZWQoZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKSkgewogICAgICB2YXIgb3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247CiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1jNzvVm9gAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwmQABABm63wKgHNsCoB2CVIh/1WHp800GzdhiAEAUumhQAAAEBCAoAo167AE2lt4zc71aLYAEACiAAAAogAABo9ygf0sUIACetHhMIAEUAH/zSsUAAQAa4Y8CoB2DAqAc2H/WVIkGzdhhYenzTgBgBU6/VAAABAQgKAE2ltwCjXrduY3Rpb24oKSB7CiAgICAgICAgZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKCiAgICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAob3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHsKICAgICAgICAgIG9yaWdpbmFsU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLmNhbGwoZXZlbnQpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID09PSB0cnVlOwogICAgfTsKCiAgICAvLyBDb3B5IGV2ZW50IGhhbmRsZXJzIGluIGNhc2UgZXZlbnQgaGFuZGxlcnMgYXJyYXkgaXMgbW9kaWZpZWQgZHVyaW5nIGV4ZWN1dGlvbi4KICAgIGlmICgoZXZlbnRGbnNMZW5ndGggPiAxKSkgewogICAgICBldmVudEZucyA9IHNoYWxsb3dDb3B5KGV2ZW50Rm5zKTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50Rm5zTGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB7CiAgICAgICAgZXZlbnRGbnNbaV0uY2FsbChlbGVtZW50LCBldmVudCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjayBmb3IgYW5ndWxhck1vY2tzL2NsZWFyRGF0YUNhY2hlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZGVyZWdpc3RlciBhbGwKICAvLyAgICAgICBldmVudHMgb24gYGVsZW1lbnRgCiAgZXZlbnRIYW5kbGVyLmVsZW0gPSBlbGVtZW50OwogIHJldHVybiBldmVudEhhbmRsZXI7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBGdW5jdGlvbnMgaXRlcmF0aW5nIHRyYXZlcnNhbC4KLy8gVGhlc2UgZnVuY3Rpb25zIGNoYWluIHJlc3VsdHMgaW50byBhIHNpbmdsZQovLyBzZWxlY3Rvci4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmZvckVhY2goewogIHJlbW92ZURhdGE6IGpxTGl0ZVJlbW92ZURhdGEsCgogIG9uOiBmdW5jdGlvbiBqcUxpdGVPbihlbGVtZW50LCB0eXBlLCBmbiwgdW5zdXBwb3J0ZWQpIHsKICAgIGlmIChpc0RlZmluZWQodW5zdXBwb3J0ZWQpKSB0aHJvdyBqcUxpdGVNaW5FcnIoJ29uYXJncycsICdqcUxpdGUjb24oKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgc2VsZWN0b3JgIG9yIGBldmVudERhdGFgIHBhcmFtZXRlcnMnKTsKCiAgICAvLyBEbyBub3QgYWRkIGV2ZW50IGhhbmRsZXJzIHRvIG5vbi1lbGVtZW50cyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgY2xlYW5lZCB1cC4KICAgIGlmICghanFMaXRlQWNjZXB0c0RhdGEoZWxlbWVudCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBleHBhbmRvU3RvcmUgPSBqcUxpdGVFeHBhbmRvU3RvcmUoZWxlbWVudCwgdHJ1ZSk7CiAgICB2YXIgZXZlbnRzID0gZXhwYW5kb1N0b3JlLmV2ZW50czsKICAgIHZhciBoYW5kbGUgPSBleHBhbmRvU3RvcmUuaGFuZGxlOwoKICAgIGlmICghaGFuZGxlKSB7CiAgICAgIGhhbmRsZSA9IGV4cGFuZG9TdG9yZS5oYW5kbGUgPSBjcmVhdGVFdmVudEhhbmRsZXIoZWxlbWVudCwgZXZlbnRzKTsKICAgIH0KCiAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9zdHJpbmctaW5kZXhvZi12cy1zcGxpdAogICAgdmFyIHR5cGVzID0gdHlwZS5pbmRleE9mKCcgJykgPj0gMCA/IHR5cGUuc3BsaXQoJyAnKSA6IFt0eXBlXTsKICAgIHZhciBpID0gdHlwZXMubGVuZ3RoOwoKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdHlwZSA9IHR5cGVzW2ldOwogICAgICB2YXIgZXZlbnRGbnMgPSBldmVudHNbdHlwZV07CgogICAgICBpZiAoIWV2ZW50Rm5zKSB7CiAgICAgICAgZXZlbnRzW3R5cGVdID0gW107CgogICAgICAgIGlmICh0eXBlID09PSAnbW91c2VlbnRlcicgfHwgdHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7CiAgICAgICAgICAvLyBSZWZlciB0byBqUXVlcnkncyBpbXBsZW1lbnRhdGlvbiBvZiBtb3VzZWVudGVyICYgbW91c2VsZWF2ZQogICAgICAgICAgLy8gUmVhZCBhYm91dCBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlOgogICAgICAgICAgLy8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfbW91c2UuaHRtbCNsaW5rOAoKICAgICAgICAgIGpxTGl0ZU9uKGVsZW1lbnQsIE1PVVNFX0VWRU5UX01BUFt0eXBlXSwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMsIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0OwogICAgICAgICAgICAvLyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuCiAgICAgICAgICAgIC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93CiAgICAgICAgICAgIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICF0YXJnZXQuY29udGFpbnMocmVsYXRlZCkpKSB7CiAgICAgICAgICAgICAgaGFuZGxlKGV2ZW50LCB0eXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodHlwZSAhPT0gJyRkZXN0cm95JykgewogICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyRm4oZWxlbWVudCwgdHlwZSwgaGFuZGxlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXZlbnRGbnMgPSBldmVudHNbdHlwZV07CiAgICAgIH0KICAgICAgZXZlbnRGbnMucHVzaChmbik7CiAgICB9CiAgfSwKCiAgb2ZmOiBqcUxpdGVPZmYsCgogIG9uZTogZnVuY3Rpb24oZWxlbWVudCwgdHlwZSwgZm4pIHsKICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7CgogICAgLy9hZGQgdGhlIGxpc3RlbmVyIHR3aWNlIHNvIHRoYXQgd2hlbiBpdCBpcyBjYWxsZWQKICAgIC8veW91IGNhbiByZW1vdmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGFuZCBzdGlsbCBiZQogICAgLy9hYmxlIHRvIGNhbGwgZWxlbWVudC5vZmYoZXYsIGZuKSBub3JtYWxseQogICAgZWxlbWVudC5vbih0eXBlLCBmdW5jdGlvbiBvbkZuKCkgewogICAgICBlbGVtZW50Lm9mZih0eXBlLCBmbik7CiAgICAgIGVsZW1lbnQub2ZmKHR5cGUsIG9uRm4pOwogICAgfSk7CiAgICBlbGVtZW50Lm9uKHR5cGUsIGZuKTsKICB9LAoKICByZXBsYWNlV2l0aDogZnVuY3Rpb24oZWxlbWVudCwgcmVwbGFjZU5vZGUpIHsKICAgIHZhciBpbmRleCwgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwogICAganFMaXRlRGVhbG9jKGVsZW1lbnQpOwogICAgZm9yRWFjaChuZXcgSlFMaXRlKHJlcGxhY2VOb2RlKSwgZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAoaW5kZXgpIHsKICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGluZGV4Lm5leHRTaWJsaW5nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsIGVsZW1lbnQpOwogICAgICB9CiAgICAgIGluZGV4ID0gbm9kZTsKICAgIH0pOwogIH0sCgogIGNoaWxkcmVuOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB2YXIgY2hpbGRyZW4gPSBbXTsKICAgIGZvckVhY2goZWxlbWVudC5jaGlsZE5vZGVzLCBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCkKICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpOwogICAgfSk7CiAgICByZXR1cm4gY2hpbGRyZW47CiAgfSwKCiAgY29udGVudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHJldHVybiBlbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBlbGVtZW50LmNoaWxkTm9kZXMgfHwgW107CiAgfSwKCiAgYXBwZW5kOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7CiAgICB2YXIgbm9kZVR5cGUgPSBlbGVtZW50Lm5vZGVUeXBlOwogICAgaWYgKG5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCAmJiBub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UKSByZXR1cm47CgogICAgbm9kZSA9IG5ldyBKUUxpdGUobm9kZSk7CgogICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbm9kZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07CiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgfQogIH0sCgogIHByZXBlbmQ6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCkgewogICAgICB2YXIgaW5kZXggPSBlbGVtZW50LmZpcnN0Q2hpbGQ7CiAgICAgIGZvckVhY2gobmV3IEpRTGl0ZShub2RlKSwgZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZShjaGlsZCwgaW5kZXgpOwogICAgICB9KTsKICAgIH0KICB9LAoKICB3cmFwOiBmdW5jdGlvbihlbGVtZW50LCB3cmFwTm9kZSkgewogICAgd3JhcE5vZGUgPSBqcUxpdGUod3JhcE5vZGUpLmVxKDApLmNsb25lKClbMF07CiAgICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwogICAgaWYgKHBhcmVudCkgewogICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHdyYXBOb2RlLCBlbGVtZW50KTsKICAgIH0KICAgIHdyYXBOb2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOwogIH0sCgogIHJlbW92ZToganFMaXRlUmVtb3ZlLAoKICBkZXRhY2g6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGpxTGl0ZVJlbW92ZShlbGVtZW50LCB0cnVlKTsKICB9LAoKICBhZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgbmV3RWxlbWVudCkgewogICAgdmFyIGluZGV4ID0gZWxlbWVudCwgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwogICAgbmV3RWxlbWVudCA9IG5ldyBKUUxpdGUobmV3RWxlbWVudCk7CgogICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmV3RWxlbWVudC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIHZhciBub2RlID0gbmV3RWxlbWVudFtpXTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBpbmRleC5uZXh0U2libGluZyk7CiAgICAgIGluZGV4ID0gbm9kZTsKICAgIH0KICB9LAoKICBhZGRDbGFzczoganFMaXRlQWRkQ2xhc3MsCiAgcmVtb3ZlQ2xhc3M6IGpxTGl0ZVJlbW92ZUNsYXNzLAoKICB0b2dnbGVDbGFzczogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IsIGNvbmRpdGlvbikgewogICAgaWYgKHNlbGVjdG9yKSB7CiAgICAgIGZvckVhY2goc2VsZWN0b3Iuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY2xhc3NOYW1lKSB7CiAgICAgICAgdmFyIGNsYXNzQ29uZGl0aW9uID0gY29uZGl0aW9uOwogICAgICAgIGlmIChpc1VuZGVmaW5lZChjbGFzc0NvbmRpdGlvbikpIHsKICAgICAgICAgIGNsYXNzQ29uZGl0aW9uID0gIWpxTGl0ZUhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSk7CiAgICAgICAgfQogICAgICAgIChjbGFzc0NvbmRpdGlvbiA/IGpxTGl0ZUFkZENsYXNzIDoganFMaXRlUmVtb3ZlQ2xhc3MpKGVsZW1lbnQsIGNsYXNzTmFtZSk7CiAgICAgIH0pOwogICAgfQogIH0sCgogIHBhcmVudDogZnVuY3Rpb24oZWxlbWVudCkgewogICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRE9DVU1FTlRfRlJBR01FTlQgPyBwYXJlbnQgOiBudWxsOwogIH0sCgogIG5leHQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHJldHVybiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZzsKICB9LAoKICBmaW5kOiBmdW5jdGlvbihlbGVtZW50LCBzZWxlY3RvcikgewogICAgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZWN0b3IpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQogIH0sCgogIGNsb25lOiBqcUxpdGVDbG9uZSwKCiAgdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCBleHRyYVBhcmFtZXRlcnMpIHsKCiAgICB2YXIgZHVtbXlFdmVudCwgZXZlbnRGbnNDb3B5LCBoYW5kbGVyQXJnczsKICAgIHZhciBldmVudE5hbWUgPSBldmVudC50eXBlIHx8IGV2ZW50OwogICAgdmFyIGV4cGFuZG9TdG9yZSA9IGpxTGl0ZUV4cGFuZG9TdG9yZShlbGVtZW50KTsKICAgIHZhciBldmVudHMgPSBleHBhbmRvU3RvcmUgJiYgZXhwYW5kb1N0b3JlLmV2ZW50czsKICAgIHZhciBldmVudEZucyA9IGV2ZW50cyAmJiBldmVudHNbZXZlbnROYW1lXTsKCiAgICBpZiAoZXZlbnRGbnMpIHsKICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgZXZlbnQgdG8gcGFzcyB0byB0aGUgaGFuZGxlcnMKICAgICAgZHVtbXlFdmVudCA9IHsKICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7IHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH0sCiAgICAgICAgaXNEZWZhdWx0UHJldmVudGVkOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdHJ1ZTsgfSwKICAgICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeyB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7IH0sCiAgICAgICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPT09IHRydWU7IH0sCiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBub29wLAogICAgICAgIHR5cGU6IGV2ZW50TmFtZSwKICAgICAgICB0YXJnZXQ6IGVsZW1lbnQKICAgICAgfTsKCiAgICAgIC8vIElmIGEgY3VzdG9tIGV2ZW50IHdhcyBwcm92aWRlZCB0aGVuIGV4dGVuZCBvdXIgZHVtbXkgZXZlbnQgd2l0aCBpdAogICAgICBpZiAoZXZlbnQudHlwZSkgewogICAgICAgIGR1bW15RXZlbnQgPSBleHRlbmQoZHVtbXlFdmVudCwgZXZlbnQpOwogICAgICB9CgogICAgICAvLyBDb3B5IGV2ZW50IGhhbmRsZXJzIGluIGNhc2UgZXZlbnQgaGFuZGxlcnMgYXJyYXkgaXMgbW9kaWZpZWQgZHVyaW5nIGV4ZWN1dGlvbi4KICAgICAgZXZlbnRGbnNDb3B5ID0gc2hhbGxvd0NvcHkoZXZlbnRGbnMpOwogICAgICBoYW5kbGVyQXJncyA9IGV4dHJhUGFyYW1ldGVycyA/IFtkdW1teUV2ZW50XS5jb25jYXQoZXh0cmFQYXJhbWV0ZXJzKSA6IFtkdW1teUV2ZW50XTsKCiAgICAgIGZvckVhY2goZXZlbnRGbnNDb3B5LCBmdW5jdGlvbihmbikgewogICAgICAgIGlmICghZHVtbXlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB7CiAgICAgICAgICBmbi5hcHBseShlbGVtZW50LCBoYW5kbGVyQXJncyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7CiAgLyoqCiAgICogY2hhaW5pbmcgZnVuY3Rpb25zCiAgICovCiAgSlFMaXRlLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpIHsKICAgIHZhciB2YWx1ZTsKCiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgewogICAgICAgIHZhbHVlID0gZm4odGhpc1tpXSwgYXJnMSwgYXJnMiwgYXJnMyk7CiAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgIC8vIGFueSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgdmFsdWUgbmVlZHMgdG8gYmUgd3JhcHBlZAogICAgICAgICAgdmFsdWUgPSBqcUxpdGUodmFsdWUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBqcUxpdGVBZGROb2Rlcyh2YWx1ZSwgZm4odGhpc1tpXSwgYXJnMSwgYXJnMiwgYXJnMykpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaXNEZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogdGhpczsKICB9OwoKICAvLyBiaW5kIGxlZ2FjeSBiaW5kL3VuYmluZCB0byBvbi9vZmYKICBKUUxpdGUucHJvdG90eXBlLmJpbmQgPSBKUUxpdGUucHJvdG90eXBlLm9uOwogIEpRTGl0ZS5wcm90b3R5cGUudW5iaW5kID0gSlFMaXRlLnByb3RvdHlwZS5vZmY7Cn0pOwoKLyoqCiAqIENvbXB1dGVzIGEgDQqM3O9WsGABAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PCdAAEAGbrbAqAc2wKgHYJUiH/VYenzTQbOV4IAQBiN5VwAAAQEICgCjXrsATaW3jNzvVrdhAQBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNK3QABABnf9wKgHYMCoBzYf9ZUiQbOV4Fh6fNOAEAFT8DUAAAEBCAoATaW3AKNeuzdGRTgNCmhhc2ggb2YgYW4gJ29iaicuCiAqIEhhc2ggb2YgYToKICogIHN0cmluZyBpcyBzdHJpbmcKICogIG51bWJlciBpcyBudW1iZXIgYXMgc3RyaW5nCiAqICBvYmplY3QgaXMgZWl0aGVyIHJlc3VsdCBvZiBjYWxsaW5nICQkaGFzaEtleSBmdW5jdGlvbiBvbiB0aGUgb2JqZWN0IG9yIHVuaXF1ZWx5IGdlbmVyYXRlZCBpZCwKICogICAgICAgICB0aGF0IGlzIGFsc28gYXNzaWduZWQgdG8gdGhlICQkaGFzaEtleSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0LgogKgogKiBAcGFyYW0gb2JqCiAqIEByZXR1cm5zIHtzdHJpbmd9IGhhc2ggc3RyaW5nIHN1Y2ggdGhhdCB0aGUgc2FtZSBpbnB1dCB3aWxsIGhhdmUgdGhlIHNhbWUgaGFzaCBzdHJpbmcuCiAqICAgICAgICAgVGhlIHJlc3VsdGluZyBzdHJpbmcga2V5IGlzIGluICd0eXBlOmhhc2hLZXknIGZvcm1hdC4KICovCmZ1bmN0aW9uIGhhc2hLZXkob2JqLCBuZXh0VWlkRm4pIHsKICB2YXIga2V5ID0gb2JqICYmIG9iai4kJGhhc2hLZXk7CgogIGlmIChrZXkpIHsKICAgIGlmICh0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGtleSA9IG9iai4kJGhhc2hLZXkoKTsKICAgIH0KICAgIHJldHVybiBrZXk7CiAgfQoKICB2YXIgb2JqVHlwZSA9IHR5cGVvZiBvYmo7CiAgaWYgKG9ialR5cGUgPT0gJ2Z1bmN0aW9uJyB8fCAob2JqVHlwZSA9PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpKSB7CiAgICBrZXkgPSBvYmouJCRoYXNoS2V5ID0gb2JqVHlwZSArICc6JyArIChuZXh0VWlkRm4gfHwgbmV4dFVpZCkoKTsKICB9IGVsc2UgewogICAga2V5ID0gb2JqVHlwZSArICc6JyArIG9iajsKICB9CgogIHJldHVybiBrZXk7Cn0KCi8qKgogKiBIYXNoTWFwIHdoaWNoIGNhbiB1c2Ugb2JqZWN0cyBhcyBrZXlzCiAqLwpmdW5jdGlvbiBIYXNoTWFwKGFycmF5LCBpc29sYXRlZFVpZCkgewogIGlmIChpc29sYXRlZFVpZCkgewogICAgdmFyIHVpZCA9IDA7CiAgICB0aGlzLm5leHRVaWQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICsrdWlkOwogICAgfTsKICB9CiAgZm9yRWFjaChhcnJheSwgdGhpcy5wdXQsIHRoaXMpOwp9Ckhhc2hNYXAucHJvdG90eXBlID0gewogIC8qKgogICAqIFN0b3JlIGtleSB2YWx1ZSBwYWlyCiAgICogQHBhcmFtIGtleSBrZXkgdG8gc3RvcmUgY2FuIGJlIGFueSB0eXBlCiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHN0b3JlIGNhbiBiZSBhbnkgdHlwZQogICAqLwogIHB1dDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgdGhpc1toYXNoS2V5KGtleSwgdGhpcy5uZXh0VWlkKV0gPSB2YWx1ZTsKICB9LAoKICAvKioKICAgKiBAcGFyYW0ga2V5CiAgICogQHJldHVybnMge09iamVjdH0gdGhlIHZhbHVlIGZvciB0aGUga2V5CiAgICovCiAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKICAgIHJldHVybiB0aGlzW2hhc2hLZXkoa2V5LCB0aGlzLm5leHRVaWQpXTsKICB9LAoKICAvKioKICAgKiBSZW1vdmUgdGhlIGtleS92YWx1ZSBwYWlyCiAgICogQHBhcmFtIGtleQogICAqLwogIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzW2tleSA9IGhhc2hLZXkoa2V5LCB0aGlzLm5leHRVaWQpXTsKICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICByZXR1cm4gdmFsdWU7CiAgfQp9OwoKLyoqCiAqIEBuZ2RvYyBmdW5jdGlvbgogKiBAbW9kdWxlIG5nCiAqIEBuYW1lIGFuZ3VsYXIuaW5qZWN0b3IKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIENyZWF0ZXMgYW4gaW5qZWN0b3Igb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJldHJpZXZpbmcgc2VydmljZXMgYXMgd2VsbCBhcyBmb3IKICogZGVwZW5kZW5jeSBpbmplY3Rpb24gKHNlZSB7QGxpbmsgZ3VpZGUvZGkgZGVwZW5kZW5jeSBpbmplY3Rpb259KS4KICoKICogQHBhcmFtIHtBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gbW9kdWxlcyBBIGxpc3Qgb2YgbW9kdWxlIGZ1bmN0aW9ucyBvciB0aGVpciBhbGlhc2VzLiBTZWUKICogICAgIHtAbGluayBhbmd1bGFyLm1vZHVsZX0uIFRoZSBgbmdgIG1vZHVsZSBtdXN0IGJlIGV4cGxpY2l0bHkgYWRkZWQuCiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtzdHJpY3REaT1mYWxzZV0gV2hldGhlciB0aGUgaW5qZWN0b3Igc2hvdWxkIGJlIGluIHN0cmljdCBtb2RlLCB3aGljaAogKiAgICAgZGlzYWxsb3dzIGFyZ3VtZW50IG5hbWUgYW5ub3RhdGlvbiBpbmZlcmVuY2UuCiAqIEByZXR1cm5zIHtpbmplY3Rvcn0gSW5qZWN0b3Igb2JqZWN0LiBTZWUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uCiAqCiAqIEBleGFtcGxlCiAqIFR5cGljYWwgdXNhZ2UKICogYGBganMKICogICAvLyBjcmVhdGUgYW4gaW5qZWN0b3IKICogICB2YXIgJGluamVjdG9yID0gYW5ndWxhci5pbmplY3RvcihbJ25nJ10pOwogKgogKiAgIC8vIHVzZSB0aGUgaW5qZWN0b3IgdG8ga2ljayBvZmYgeW91ciBhcHBsaWNhdGlvbgogKiAgIC8vIHVzZSB0aGUgdHlwZSBpbmZlcmVuY2UgdG8gYXV0byBpbmplY3QgYXJndW1lbnRzLCBvciB1c2UgaW1wbGljaXQgaW5qZWN0aW9uCiAqICAgJGluamVjdG9yLmludm9rZShmdW5jdGlvbigkcm9vdFNjb3BlLCAkY29tcGlsZSwgJGRvY3VtZW50KSB7CiAqICAgICAkY29tcGlsZSgkZG9jdW1lbnQpKCRyb290U2NvcGUpOwogKiAgICAgJHJvb3RTY29wZS4kZGlnZXN0KCk7CiAqICAgfSk7CiAqIGBgYAogKgogKiBTb21ldGltZXMgeW91IHdhbnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgaW5qZWN0b3Igb2YgYSBjdXJyZW50bHkgcnVubmluZyBBbmd1bGFyIGFwcAogKiBmcm9tIG91dHNpZGUgQW5ndWxhci4gUGVyaGFwcywgeW91IHdhbnQgdG8gaW5qZWN0IGFuZCBjb21waWxlIHNvbWUgbWFya3VwIGFmdGVyIHRoZQogKiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBib290c3RyYXBwZWQuIFlvdSBjYW4gZG8gdGhpcyB1c2luZyB0aGUgZXh0cmEgYGluamVjdG9yKClgIGFkZGVkCiAqIHRvIEpRdWVyeS9qcUxpdGUgZWxlbWVudHMuIFNlZSB7QGxpbmsgYW5ndWxhci5lbGVtZW50fS4KICoKICogKlRoaXMgaXMgZmFpcmx5IHJhcmUgYnV0IGNvdWxkIGJlIHRoZSBjYXNlIGlmIGEgdGhpcmQgcGFydHkgbGlicmFyeSBpcyBpbmplY3RpbmcgdGhlCiAqIG1hcmt1cC4qCiAqCiAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhIG5ldyBibG9jayBvZiBIVE1MIGNvbnRhaW5pbmcgYSBgbmctY29udHJvbGxlcmAKICogZGlyZWN0aXZlIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IGJvZHkgYnkgSlF1ZXJ5LiBXZSB0aGVuIGNvbXBpbGUgYW5kIGxpbmsKICogaXQgaW50byB0aGUgY3VycmVudCBBbmd1bGFySlMgc2NvcGUuCiAqCiAqIGBgYGpzCiAqIHZhciAkZGl2ID0gJCgnPGRpdiBuZy1jb250cm9sbGVyPSJNeUN0cmwiPnt7Y29udGVudC5sYWJlbH19PC9kaXY+Jyk7CiAqICQoZG9jdW1lbnQuYm9keSkuYXBwZW5kKCRkaXYpOwogKgogKiBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLmluamVjdG9yKCkuaW52b2tlKGZ1bmN0aW9uKCRjb21waWxlKSB7CiAqICAgdmFyIHNjb3BlID0gYW5ndWxhci5lbGVtZW50KCRkaXYpLnNjb3BlKCk7CiAqICAgJGNvbXBpbGUoJGRpdikoc2NvcGUpOwogKiB9KTsKICogYGBgCiAqLwoKCi8qKgogKiBAbmdkb2MgbW9kdWxlCiAqIEBuYW1lIGF1dG8KICogQGRlc2NyaXB0aW9uCiAqCiAqIEltcGxpY2l0IG1vZHVsZSB3aGljaCBnZXRzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gZWFjaCB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS4KICovCgp2YXIgRk5fQVJHUyA9IC9eZnVuY3Rpb25ccypbXlwoXSpcKFxzKihbXlwpXSopXCkvbTsKdmFyIEZOX0FSR19TUExJVCA9IC8sLzsKdmFyIEZOX0FSRyA9IC9eXHMqKF8/KShcUys/KVwxXHMqJC87CnZhciBTVFJJUF9DT01NRU5UUyA9IC8oKFwvXC8uKiQpfChcL1wqW1xzXFNdKj9cKlwvKSkvbWc7CnZhciAkaW5qZWN0b3JNaW5FcnIgPSBtaW5FcnIoJyRpbmplY3RvcicpOwoKZnVuY3Rpb24gYW5vbkZuKGZuKSB7CiAgLy8gRm9yIGFub255bW91cyBmdW5jdGlvbnMsIHNob3dpbmcgYXQgdGhlIHZlcnkgbGVhc3QgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gaGVscCBpbgogIC8vIGRlYnVnZ2luZy4KICB2YXIgZm5UZXh0ID0gZm4udG9TdHJpbmcoKS5yZXBsYWNlKFNUUklQX0NPTU1FTlRTLCAnJyksCiAgICAgIGFyZ3MgPSBmblRleHQubWF0Y2goRk5fQVJHUyk7CiAgaWYgKGFyZ3MpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oJyArIChhcmdzWzFdIHx8ICcnKS5yZXBsYWNlKC9bXHNcclxuXSsvLCAnICcpICsgJyknOwogIH0KICByZXR1cm4gJ2ZuJzsKfQoKZnVuY3Rpb24gYW5ub3RhdGUoZm4sIHN0cmljdERpLCBuYW1lKSB7CiAgdmFyICRpbmplY3QsCiAgICAgIGZuVGV4dCwKICAgICAgYXJnRGVjbCwKICAgICAgbGFzdDsKCiAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgaWYgKCEoJGluamVjdCA9IGZuLiRpbmplY3QpKSB7CiAgICAgICRpbmplY3QgPSBbXTsKICAgICAgaWYgKGZuLmxlbmd0aCkgewogICAgICAgIGlmIChzdHJpY3REaSkgewogICAgICAgICAgaWYgKCFpc1N0cmluZyhuYW1lKSB8fCAhbmFtZSkgewogICAgICAgICAgICBuYW1lID0gZm4ubmFtZSB8fCBhbm9uRm4oZm4pOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdzdHJpY3RkaScsCiAgICAgICAgICAgICd7MH0gaXMgbm90IHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb24gYW5kIGNhbm5vdCBiZSBpbnZva2VkIGluIHN0cmljdCBtb2RlJywgbmFtZSk7CiAgICAgICAgfQogICAgICAgIGZuVGV4dCA9IGZuLnRvU3RyaW5nKCkucmVwbGFjZShTVFJJUF9DT01NRU5UUywgJycpOwogICAgICAgIGFyZ0RlY2wgPSBmblRleHQubWF0Y2goRk5fQVJHUyk7CiAgICAgICAgZm9yRWFjaChhcmdEZWNsWzFdLnNwbGl0KEZOX0FSR19TUExJVCksIGZ1bmN0aW9uKGFyZykgewogICAgICAgICAgYXJnLnJlcGxhY2UoRk5fQVJHLCBmdW5jdGlvbihhbGwsIHVuZGVyc2NvcmUsIG5hbWUpIHsKICAgICAgICAgICAgJGluamVjdC5wdXNoKG5hbWUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZm4uJGluamVjdCA9ICRpbmplY3Q7CiAgICB9CiAgfSBlbHNlIGlmIChpc0FycmF5KGZuKSkgewogICAgbGFzdCA9IGZuLmxlbmd0aCAtIDE7CiAgICBhc3NlcnRBcmdGbihmbltsYXN0XSwgJ2ZuJyk7CiAgICAkaW5qZWN0ID0gZm4uc2xpY2UoMCwgbGFzdCk7CiAgfSBlbHNlIHsKICAgIGFzc2VydEFyZ0ZuKGZuLCAnZm4nLCB0cnVlKTsKICB9CiAgcmV0dXJuICRpbmplY3Q7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRpbmplY3RvcgogKgogKiBAZGVzY3JpcHRpb24KICoKICogYCRpbmplY3RvcmAgaXMgdXNlZCB0byByZXRyaWV2ZSBvYmplY3QgaW5zdGFuY2VzIGFzIGRlZmluZWQgYnkKICoge0BsaW5rIGF1dG8uJHByb3ZpZGUgcHJvdmlkZXJ9LCBpbnN0YW50aWF0ZSB0eXBlcywgaW52b2tlIG1ldGhvZHMsCiAqIGFuZCBsb2FkIG1vZHVsZXMuCiAqCiAqIFRoZSBmb2xsb3dpbmcgYWx3YXlzIGhvbGRzIHRydWU6CiAqCiAqIGBgYGpzCiAqICAgdmFyICRpbmplY3RvciA9IGFuZ3VsYXIuaW5qZWN0b3IoKTsKICogICBleHBlY3QoJGluamVjdG9yLmdldCgnJGluamVjdG9yJykpLnRvQmUoJGluamVjdG9yKTsKICogICBleHBlY3QoJGluamVjdG9yLmludm9rZShmdW5jdGlvbigkaW5qZWN0b3IpIHsKICogICAgIHJldHVybiAkaW5qZWN0b3I7CiAqICAgfSkpLnRvQmUoJGluamVjdG9yKTsKICogYGBgCiAqCiAqICMgSW5qZWN0aW9uIEZ1bmN0aW9uIEFubm90YXRpb24KICoKICogSmF2YVNjcmlwdCBkb2VzIG5vdCBoYXZlIGFubm90YXRpb25zLCBhbmQgYW5ub3RhdGlvbnMgYXJlIG5lZWRlZCBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uIFRoZQogKiBmb2xsb3dpbmcgYXJlIGFsbCB2YWxpZCB3YXlzIG9mIGFubm90YXRpbmcgZnVuY3Rpb24gd2l0aCBpbmplY3Rpb24gYXJndW1lbnRzIGFuZCBhcmUgZXF1aXZhbGVudC4KICoKICogYGBganMKICogICAvLyBpbmZlcnJlZCAob25seSB3b3JrcyBpZiBjb2RlIG5vdCBtaW5pZmllZC9vYmZ1c2NhdGVkKQogKiAgICRpbmplY3Rvci5pbnZva2UoZnVuY3Rpb24oc2VydmljZUEpe30pOwogKgogKiAgIC8vIGFubm90YXRlZAogKiAgIGZ1bmN0aW9uIGV4cGxpY2l0KHNlcnZpY2VBKSB7fTsKICogICBleHBsaWNpdC4kaW5qZWN0ID0gWydzZXJ2aWNlQSddOwogKiAgICRpbmplY3Rvci5pbnZva2UoZXhwbGljaXQpOwogKgogKiAgIC8vIGlubGluZQogKiAgICRpbmplY3Rvci5pbnZva2UoWydzZXJ2aWNlQScsIGZ1bmN0aW9uKHNlcnZpY2VBKXt9XSk7CiAqIGBgYAogKgogKiAjIyBJbmZlcmVuY2UKICoKICogSW4gSmF2YVNjcmlwdCBjYWxsaW5nIGB0b1N0cmluZygpYCBvbiBhIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uIFRoZSBkZWZpbml0aW9uCiAqIGNhbiB0aGVuIGJlIHBhcnNlZCBhbmQgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjYW4gYmUgZXh0cmFjdGVkLiBUaGlzIG1ldGhvZCBvZiBkaXNjb3ZlcmluZwogKiBhbm5vdGF0aW9ucyBpcyBkaXNhbGxvd2VkIHdoZW4gdGhlIGluamVjdG9yIGlzIGluIHN0cmljdCBtb2RlLgogKiAqTk9URToqIFRoaXMgZG9lcyBub3Qgd29yayB3aXRoIG1pbmlmaWNhdGlvbiwgYW5kIG9iZnVzY2F0aW9uIHRvb2xzIHNpbmNlIHRoZXNlIHRvb2xzIGNoYW5nZSB0aGUKICogYXJndW1lbnQgbmFtZXMuCiAqCiAqICMjIGAkaW5qZWN0YCBBbm5vdGF0aW9uCiAqIEJ5IGFkZGluZyBhbiBgJGluamVjdGAgcHJvcGVydHkgb250byBhIGZ1bmN0aW9uIHRoZSBpbmplY3Rpb24gcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkLgogKgogKiAjIyBJbmxpbmUKICogQXMgYW4gYXJyYXkgb2YgaW5qZWN0aW9uIG5hbWVzLCB3aGVyZSB0aGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpcyB0aGUgZnVuY3Rpb24gdG8gY2FsbC4KICovCgovKioKICogQG5nZG9jIG1ldGhvZAogKiBAbmFtZSAkaW5qZWN0b3IjZ2V0CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZSB0byByZXRyaWV2ZS4KICogQHJldHVybiB7Kn0gVGhlIGluc3RhbmNlLgogKi8KCi8qKgogKiBAbmdkb2MgbWV0aG9kCiAqIEBuYW1lICRpbmplY3RvciNpbnZva2UKICoKICogQGRlc2NyaXB0aW9uCiAqIEludm9rZSB0aGUgbWV0aG9kIGFuZCBzdXBwbHkgdGhlIG1ldGhvZCBhcmd1bWVudHMgZnJvbSB0aGUgYCRpbmplY3RvcmAuCiAqCiAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLiBGdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBpbmplY3RlZCBhY2NvcmRpbmcgdG8gdGhlCiAqICAge0BsaW5rIGd1aWRlL2RpICRpbmplY3QgQW5ub3RhdGlvbn0gcnVsZXMuCiAqIEBwYXJhbSB7T2JqZWN0PX0gc2VsZiBUaGUgYHRoaXNgIGZvciB0aGUgaW52b2tlZCBtZXRob2QuCiAqIEBwYXJhbSB7T2JqZWN0PX0gbG9jYWxzIE9wdGlvbmFsIG9iamVjdC4gSWYgcHJlc2V0IHRoZW4gYW55IGFyZ3VtZW50IG5hbWVzIGFyZSByZWFkIGZyb20gdGhpcwogKiAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZmlyc3QsIGJlZm9yZSB0aGUgYCRpbmplY3RvcmAgaXMgY29uc3VsdGVkLgogKiBAcmV0dXJucyB7Kn0gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBpbnZva2VkIGBmbmAgZnVuY3Rpb24uCiAqLwoKLyoqCiAqIEBuZ2RvYyBtZXRob2QKICogQG5hbWUgJGluamVjdG9yI2hhcwogKgogKiBAZGVzY3JpcHRpb24KICogQWxsb3dzIHRoZSB1c2VyIHRvIHF1ZXJ5IGlmIHRoZSBwYXJ0aWN1bGFyIHNlcnZpY2UgZXhpc3RzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHF1ZXJ5LgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGluamVjdG9yIGhhcyBnaXZlbiBzZXJ2aWNlLgogKi8KCi8qKgogKiBAbmdkb2MgbWV0aG9kCiAqIEBuYW1lICRpbmplY3RvciNpbnN0YW50aWF0ZQogKiBAZGVzY3JpcHRpb24KICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEpTIHR5cGUuIFRoZSBtZXRob2QgdGFrZXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgaW52b2tlcyB0aGUgbmV3CiAqIG9wZXJhdG9yLCBhbmQgc3VwcGxpZXMgYWxsIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGFzIHNwZWNpZmllZCBieSB0aGUKICogY29uc3RydWN0b3IgYW5ub3RhdGlvbi4KICoKICogQHBhcmFtIHtGdW5jdGlvbn0gVHlwZSBBbm5vdGF0ZWQgY29uc3RydWN0b3IgZnVuY3Rpb24uCiAqIEBwYXJhbSB7T2JqZWN0PX0gbG9jYWxzIE9wdGlvbmFsIG9iamVjdC4gSWYgcHJlc2V0IHRoZW4gYW55IGFyZ3VtZW50IG5hbWVzIGFyZSByZWFkIGZyb20gdGhpcwogKiBvYmplY3QgZmlyc3QsIGJlZm9yZSB0aGUgYCRpbmplY3RvcmAgaXMgY29uc3VsdGVkLgogKiBAcmV0dXJucyB7T2JqZWN0fSBuZXcgaW5zdGFuY2Ugb2YgYFR5cGVgLgogKi8KCi8qKgogKiBAbmdkb2MgbWV0aG9kCiAqIEBuYW1lICRpbmplY3RvciNhbm5vdGF0ZQogKgogKiBAZGVzY3JpcHRpb24KICogUmV0dXJucyBhbiBhcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyByZXF1ZXN0aW5nIGZvciBpbmplY3Rpb24uIFRoaXMgQVBJIGlzCiAqIHVzZWQgYnkgdGhlIGluamVjdG9yIHRvIGRldGVybWluZSB3aGljaCBzZXJ2aWNlcyBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGZ1bmN0aW9uIHdoZW4gdGhlCiAqIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIGluIHdoaWNoIHRoZSBmdW5jdGlvbiBjYW4gYmUgYW5ub3RhdGVkIHdpdGggdGhlIG5lZWRlZAogKiBkZXBlbmRlbmNpZXMuCiAqCiAqICMgQXJndW1lbnQgbmFtZXMKICoKICogVGhlIHNpbXBsZXN0IGZvcm0gaXMgdG8gZXh0cmFjdCB0aGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgaXMgZG9uZQogKiBieSBjb252ZXJ0aW5nIHRoZSBmdW5jdGlvbiBpbnRvIGEgc3RyaW5nIHVzaW5nIGB0b1N0cmluZygpYCBtZXRob2QgYW5kIGV4dHJhY3RpbmcgdGhlIGFyZ3VtZW50CiAqIG5hbWVzLgogKiBgYGBqcwogKiAgIC8vIEdpdmVuCiAqICAgZnVuY3Rpb24gTXlDb250cm9sbGVyKCRzY29wZSwgJHJvdXRlKSB7CiAqICAgICAvLyAuLi4KICogICB9CiAqCiAqICAgLy8gVGhlbgogKiAgIGV4cGVjdChpbmplY3Rvci5hbm5vdGF0ZShNeUNvbnRyb2xsZXIpKS50b0VxdWFsKFsnJHNjb3BlJywgJyRyb3V0ZSddKTsKICogYGBgCiAqCiAqIFlvdSBjYW4gZGlzYWxsb3cgdGhpcyBtZXRob2QgYnkgdXNpbmcgc3RyaWN0IGluamVjdGlvbiBtb2RlLgogKgogKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggY29kZSBtaW5pZmljYXRpb24gLyBvYmZ1c2NhdGlvbi4gRm9yIHRoaXMgcmVhc29uIHRoZSBmb2xsb3dpbmcKICogYW5ub3RhdGlvbiBzdHJhdGVnaWVzIGFyZSBzdXBwb3J0ZWQuCiAqCiAqICMgVGhlIGAkaW5qZWN0YCBwcm9wZXJ0eQogKgogKiBJZiBhIGZ1bmN0aW9uIGhhcyBhbiBgJGluamVjdGAgcHJvcGVydHkgYW5kIGl0cyB2YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLCB0aGVuIHRoZSBzdHJpbmdzCiAqIHJlcHJlc2VudCBuYW1lcyBvZiBzZXJ2aWNlcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBmdW5jdGlvbi4KICogYGBganMKICogICAvLyBHaXZlbgogKiAgIHZhciBNeUNvbnRyb2xsZXIgPSBmdW5jdGlvbihvYmZ1c2NhdGVkU2NvcGUsIG9iZnVzY2F0ZWRSb3V0ZSkgewogKiAgICAgLy8gLi4uCiAqICAgfQogKiAgIC8vIERlZmluZSBmdW5jdGlvbiBkZXBlbmRlbmNpZXMKICogICBNeUNvbnRyb2xsZXJbJyRpbmplY3QnXSA9IFsnJHNjb3BlJywgJyRyb3V0ZSddOwogKgogKiAgIC8vIFRoZW4KICogICBleHBlY3QoaW5qZWN0b3IuYW5ub3RhdGUoTXlDb250cm9sbGVyKSkudG9FcXVhbChbJyRzY29wZScsICckcm91dGUnXSk7CiAqIGBgYAogKgogKiAjIFRoZSBhcnJheSBub3RhdGlvbgogKgogKiBJdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gaW5saW5lIEluamVjdGVkIGZ1bmN0aW9ucyBhbmQgdGhhdCdzIHdoZW4gc2V0dGluZyB0aGUgYCRpbmplY3RgIHByb3BlcnR5CiAqIGlzIHZlcnkgaW5jb252ZW5pZW50LiBJbiB0aGVzZSBzaXR1YXRpb25zIHVzaW5nIHRoZSBhcnJheSBub3RhdGlvbiB0byBzcGVjaWZ5IHRoZSBkZXBlbmRlbmNpZXMgaW4KICogYSB3YXkgdGhhdCBzdXJ2aXZlcyBtaW5pZmljYXRpb24gaXMgYSBiZXR0ZXIgY2hvaWNlOgogKgogKiBgYGBqcwogKiAgIC8vIFdlIHdpc2ggdG8gd3JpdGUgdGhpcyAobm90IG1pbmlmaWNhdGlvbiAvIG9iZnVzY2F0aW9uIHNhZmUpCiAqICAgaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKCRjb21waWxlLCAkcm9vdFNjb3BlKSB7CiAqICAgICAvLyAuLi4KICogICB9KTsKICoKICogICAvLyBXZSBhcmUgZm9yY2VkIHRvIHdyaXRlIGJyZWFrIGlubGluaW5nCiAqICAgdmFyIHRtcEZuID0gZnVuY3Rpb24ob2JmdXNjYXRlZENvbXBpbGUsIG9iZnVzY2F0ZWRSb290U2NvcGUpIHsKICogICAgIC8vIC4uLgogKiAgIH07CiAqICAgdG1wRm4uJGluamVjdCA9IFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZSddOwogKiAgIGluamVjdG9yLmludm9rZSh0bXBGbik7CiAqCiAqICAgLy8gVG8gYmV0dGVyIHN1cHBvcnQgaW5saW5lIGZ1bmN0aW9uIHRoZSBpbmxpbmUgYW5ub3RhdGlvbiBpcyBzdXBwb3J0ZWQKICogICBpbmplY3Rvci5pbnZva2UoWyckY29tcGlsZScsICckcm9vdFNjb3BlJywgZnVuY3Rpb24ob2JmQ29tcGlsZSwgb2JmUm9vdFNjb3BlKSB7CiAqICAgICAvLyAuLi4KICogICB9XSk7CiAqCiAqICAgLy8gVGhlcmVmb3JlCiAqICAgZXhwZWN0KGluamVjdG9yLmFubm90YXRlKAogKiAgICAgIFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKG9iZnVzXyRjb21waWxlLCBvYmZ1c18kcm9vdFNjb3BlKSB7fV0pCiAqICAgICkudG9FcXVhbChbJyRjb21waWxlJywgJyRyb290U2NvcGUnXSk7CiAqIGBgYAogKgogKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5LjxzdHJpbmd8RnVuY3Rpb24+fSBmbiBGdW5jdGlvbiBmb3Igd2hpY2ggZGVwZW5kZW50IHNlcnZpY2UgbmFtZXMgbmVlZCB0bwogKiBiZSByZXRyaWV2ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgogKgogKiBAcGFyYW0ge2Jvb2xlYW49fSBbc3RyaWN0RGk9ZmFsc2VdIERpc2FsbG93IGFyZ3VtZW50IG5hbWUgYW5ub3RhdGlvbiBpbmZlcmVuY2UuCiAqCiAqIEByZXR1cm5zIHtBcnJheS48c3RyaW5nPn0gVGhlIG5hbWVzIG9mIHRoZSBzZXJ2aWNlcyB3aGljaCB0aGUgZnVuY3Rpb24gcmVxdWlyZXMuCiAqLwoKCgoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRwcm92aWRlCiAqCiAqIEBkZXNjcmlwdGlvbgogKgogKiBUaGUge0BsaW5rIGF1dG8uJHByb3ZpZGUgJHByb3ZpZGV9IHNlcnZpY2UgaGFzIGEgbnVtYmVyIG9mIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nIGNvbXBvbmVudHMKICogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIE1hbnkgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBhbHNvIGV4cG9zZWQgb24KICoge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfS4KICoKICogQW4gQW5ndWxhciAqKnNlcnZpY2UqKiBpcyBhIHNpbmdsZXRvbiBvYmplY3QgY3JlYXRlZCBieSBhICoqc2VydmljZSBmYWN0b3J5KiouICBUaGVzZSAqKnNlcnZpY2UKICogZmFjdG9yaWVzKiogYXJlIGZ1bmN0aW9ucyB3aGljaCwgaW4gdHVybiwgYXJlIGNyZWF0ZWQgYnkgYSAqKnNlcnZpY2UgcHJvdmlkZXIqKi4KICogVGhlICoqc2VydmljZSBwcm92aWRlcnMqKiBhcmUgY29uc3RydWN0b3IgZnVuY3Rpb25zLiBXaGVuIGluc3RhbnRpYXRlZCB0aGV5IG11c3QgY29udGFpbiBhCiAqIHByb3BlcnR5IGNhbGxlZCBgJGdldGAsIHdoaWNoIGhvbGRzIHRoZSAqKnNlcnZpY2UgZmFjdG9yeSoqIGZ1bmN0aW9uLgogKgogKiBXaGVuIHlvdSByZXF1ZXN0IGEgc2VydmljZSwgdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9IGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZQogKiBjb3JyZWN0ICoqc2VydmljZSBwcm92aWRlcioqLCBpbnN0YW50aWF0aW5nIGl0IGFuZCB0aGVuIGNhbGxpbmcgaXRzIGAkZ2V0YCAqKnNlcnZpY2UgZmFjdG9yeSoqCiAqIGZ1bmN0aW9uIHRvIGdldCB0aGUgaW5zdGFuY2Ugb2YgdGhlICoqc2VydmljZSoqLgogKgogKiBPZnRlbiBzZXJ2aWNlcyBoYXZlIG5vIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgbWV0aG9kcyB0byB0aGUgc2VydmljZQogKiBwcm92aWRlci4gIFRoZSBwcm92aWRlciB3aWxsIGJlIG5vIG1vcmUgdGhhbiBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggYSBgJGdldGAgcHJvcGVydHkuIEZvcgogKiB0aGVzZSBjYXNlcyB0aGUge0BsaW5rIGF1dG8uJHByb3ZpZGUgJHByb3ZpZGV9IHNlcnZpY2UgaGFzIGFkZGl0aW9uYWwgaGVscGVyIG1ldGhvZHMgdG8gcmVnaXN0ZXIKICogc2VydmljZXMgd2l0aG91dCBzcGVjaWZ5aW5nIGEgcHJvdmlkZXIuCiAqCiAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjcHJvdmlkZXIgcHJvdmlkZXIocHJvdmlkZXIpfSAtIHJlZ2lzdGVycyBhICoqc2VydmljZSBwcm92aWRlcioqIHdpdGggdGhlCiAqICAgICB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfQogKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI2NvbnN0YW50IGNvbnN0YW50KG9iail9IC0gcmVnaXN0ZXJzIGEgdmFsdWUvb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGJ5CiAqICAgICBwcm92aWRlcnMgYW5kIHNlcnZpY2VzLgogKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlIHZhbHVlKG9iail9IC0gcmVnaXN0ZXJzIGEgdmFsdWUvb2JqZWN0IHRoYXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYnkKICogICAgIHNlcnZpY2VzLCBub3QgcHJvdmlkZXJzLgogKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI2ZhY3RvcnkgZmFjdG9yeShmbil9IC0gcmVnaXN0ZXJzIGEgc2VydmljZSAqKmZhY3RvcnkgZnVuY3Rpb24qKiwgYGZuYCwKICogICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGluIGEgKipzZXJ2aWNlIHByb3ZpZGVyKiogb2JqZWN0LCB3aG9zZSBgJGdldGAgcHJvcGVydHkgd2lsbCBjb250YWluIHRoZQogKiAgICAgZ2l2ZW4gZmFjdG9yeSBmdW5jdGlvbi4KICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlIHNlcnZpY2UoY2xhc3MpfSAtIHJlZ2lzdGVycyBhICoqY29uc3RydWN0b3IgZnVuY3Rpb24qKiwgYGNsYXNzYAogKiAgICAgdGhhdCB3aWxsIGJlIHdyYXBwZWQgaW4gYSAqKnNlcnZpY2UgcHJvdmlkZXIqKiBvYmplY3QsIHdob3NlIGAkZ2V0YCBwcm9wZXJ0eSB3aWxsIGluc3RhbnRpYXRlCiAqICAgICAgYSBuZXcgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogU2VlIHRoZSBpbmRpdmlkdWFsIG1ldGhvZHMgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLgogKi8KCi8qKgogKiBAbmdkb2MgbWV0aG9kCiAqIEBuYW1lICRwcm92aWRlI3Byb3ZpZGVyCiAqIEBkZXNjcmlwdGlvbgogKgogKiBSZWdpc3RlciBhICoqcHJvdmlkZXIgZnVuY3Rpb24qKiB3aXRoIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS4gUHJvdmlkZXIgZnVuY3Rpb25zCiAqIGFyZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMsIHdob3NlIGluc3RhbmNlcyBhcmUgcmVzcG9uc2libGUgZm9yICJwcm92aWRpbmciIGEgZmFjdG9yeSBmb3IgYQogKiBzZXJ2aWNlLgogKgogKiBTZXJ2aWNlIHByb3ZpZGVyIG5hbWVzIHN0YXJ0IHdpdGggdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhleSBwcm92aWRlIGZvbGxvd2VkIGJ5IGBQcm92aWRlcmAuCiAqIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIG5nLiRsb2cgJGxvZ30gc2VydmljZSBoYXMgYSBwcm92aWRlciBjYWxsZWQKICoge0BsaW5rIG5nLiRsb2dQcm92aWRlciAkbG9nUHJvdmlkZXJ9LgogKgogKiBTZXJ2aWNlIHByb3ZpZGVyIG9iamVjdHMgY2FuIGhhdmUgYWRkaXRpb25hbCBtZXRob2RzIHdoaWNoIGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb3ZpZGVyCiAqIGFuZCBpdHMgc2VydmljZS4gSW1wb3J0YW50bHksIHlvdSBjYW4gY29uZmlndXJlIHdoYXQga2luZCBvZiBzZXJ2aWNlIGlzIGNyZWF0ZWQgYnkgdGhlIGAkZ2V0YAogKiBtZXRob2QsIG9yIGhvdyB0aGF0IHNlcnZpY2Ugd2lsbCBhY3QuIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIG5nLiRsb2dQcm92aWRlciAkbG9nUHJvdmlkZXJ9IGhhcyBhCiAqIG1ldGhvZCB7QGxpbmsgbmcuJGxvZ1Byb3ZpZGVyI2RlYnVnRW5hYmxlZCBkZWJ1Z0VuYWJsZWR9CiAqIHdoaWNoIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0aGUge0BsaW5rIG5nLiRsb2cgJGxvZ30gc2VydmljZSB3aWxsIGxvZyBkZWJ1ZyBtZXNzYWdlcyB0byB0aGUKICogY29uc29sZSBvciBub3QuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4gTk9URTogdGhlIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIHVuZGVyIGBuYW1lICsKICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb3ZpZGVyJ2Aga2V5LgogKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24oKSl9IHByb3ZpZGVyIElmIHRoZSBwcm92aWRlciBpczoKICoKICogICAtIGBPYmplY3RgOiB0aGVuIGl0IHNob3VsZCBoYXZlIGEgYCRnZXRgIG1ldGhvZC4gVGhlIGAkZ2V0YCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHVzaW5nCiAqICAgICB7QGxpbmsgYXV0by4kaW5qZWN0b3IjaW52b2tlICRpbmplY3Rvci5pbnZva2UoKX0gd2hlbiBhbiBpbnN0YW5jZSBuZWVkcyB0byBiZSBjcmVhdGVkLgogKiAgIC0gYENvbnN0cnVjdG9yYDogYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdpbGwgYmUgY3JlYXRlZCB1c2luZwogKiAgICAge0BsaW5rIGF1dG8uJGluamVjdG9yI2luc3RhbnRpYXRlICRpbmplY3Rvci5pbnN0YW50aWF0ZSgpfSwgdGhlbiB0cmVhdGVkIGFzIGBvYmplY3RgLgogKgogKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlCgogKiBAZXhhbXBsZQogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIHNpbXBsZSBldmVudCB0cmFja2luZyBzZXJ2aWNlIGFuZCByZWdpc3RlciBpdCB1c2luZwogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNwcm92aWRlciAkcHJvdmlkZS5wcm92aWRlcigpfS4KICoKICogYGBganMKICogIC8vIERlZmluZSB0aGUgZXZlbnRUcmFja2VyIHByb3ZpZGVyCiAqICBmdW5jdGlvbiBFdmVudFRyYWNrZXJQcm92aWRlcigpIHsKICogICAgdmFyIHRyYWNraW5nVXJsID0gJy90cmFjayc7CiAqCiAqICAgIC8vIEEgcHJvdmlkZXIgbWV0aG9kIGZvciBjb25maWd1cmluZyB3aGVyZSB0aGUgdHJhY2tlZCBldmVudHMgc2hvdWxkIGJlZW4gc2F2ZWQKICogICAgdGhpcy5zZXRUcmFja2luZ1VybCA9IGZ1bmN0aW9uKHVybCkgewogKiAgICAgIHRyYWNraW5nVXJsID0gdXJsOwogKiAgICB9OwogKgogKiAgICAvLyBUaGUgc2VydmljZSBmYWN0b3J5IGZ1bmN0aW9uCiAqICAgIHRoaXMuJGdldCA9IFsnJGh0dHAnLCBmdW5jdGlvbigkaHR0cCkgewogKiAgICAgIHZhciB0cmFja2VkRXZlbnRzID0ge307CiAqICAgICAgcmV0dXJuIHsKICogICAgICAgIC8vIENhbGwgdGhpcyB0byB0cmFjayBhbiBldmVudAogKiAgICAgICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CiAqICAgICAgICAgIHZhciBjb3VudCA9IHRyYWNrZWRFdmVudHNbZXZlbnRdIHx8IDA7CiAqICAgICAgICAgIGNvdW50ICs9IDE7CiAqICAgICAgICAgIHRyYWNrZWRFdmVudHNbZXZlbnRdID0gY291bnQ7CiAqICAgICAgICAgIHJldHVybiBjb3VudDsKICogICAgICAgIH0sCiAqICAgICAgICAvLyBDYWxsIHRoaXMgdG8gc2F2ZSB0aGUgdHJhY2tlZCBldmVudHMgdG8gdGhlIHRyYWNraW5nVXJsCiAqICAgICAgICBzYXZlOiBmdW5jdGlvbigpIHsKICogICAgICAgICAgJGh0dHAucG9zdCh0cmFja2luZ1VybCwgdHJhY2tlZEV2ZW50cyk7CiAqICAgICAgICB9CiAqICAgICAgfTsKICogICAgfV07CiAqICB9CiAqCiAqICBkZXNjcmliZSgnZXZlbnRUcmFja2VyJywgZnVuY3Rpb24oKSB7CiAqICAgIHZhciBwb3N0U3B5OwogKgogKiAgICBiZWZvcmVFYWNoKG1vZHVsZShmdW5jdGlvbigkcHJvdmlkZSkgewogKiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBldmVudFRyYWNrZXIgcHJvdmlkZXIKICogICAgICAkcHJvdmlkZS5wcm92aWRlcignZXZlbnRUcmFja2VyJywgRXZlbnRUcmFja2VyUHJvdmlkZXIpOwogKiAgICB9KSk7CiAqCiAqICAgIGJlZm9yZUVhY2gobW9kdWxlKGZ1bmN0aW9uKGV2ZW50VHJhY2tlclByb3ZpZGVyKSB7CiAqICAgICAgLy8gQ29uZmlndXJlIGV2ZW50VHJhY2tlciBwcm92aWRlcgogKiAgICAgIGV2ZW50VHJhY2tlclByb3ZpZGVyLnNldFRyYWNraW5nVXJsKCcvY3VzdG9tLXRyYWNrJyk7CiAqICAgIH0pKTsKICoKICogICAgaXQoJ3RyYWNrcyBldmVudHMnLCBpbmplY3QoZnVuY3Rpb24oZXZlbnRUcmFja2VyKSB7CiAqICAgICAgZXhwZWN0KGV2ZW50VHJhY2tlci5ldmVudCgnbG9naW4nKSkudG9FcXVhbCgxKTsKICogICAgICBleHBlY3QoZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpKS50b0VxdWFsKDIpOwogKiAgICB9KSk7CiAqCiAqICAgIGl0KCdzYXZlcyB0byB0aGUgdHJhY2tpbmcgdXJsJywgaW5qZWN0KGZ1bmN0aW9uKGV2ZW50VHJhY2tlciwgJGh0dHApIHsKICogICAgICBwb3N0U3B5ID0gc3B5T24oJGh0dHAsICdwb3N0Jyk7CiAqICAgICAgZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpOwogKiAgICAgIGV2ZW50VHJhY2tlci5zYXZlKCk7CiAqICAgICAgZXhwZWN0KHBvc3RTcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTsKICogICAgICBleHBlY3QocG9zdFNweS5tb3N0UmVjZW50Q2FsbC5hcmdzWzBdKS5ub3QudG9FcXVhbCgnL3RyYWNrJyk7CiAqICAgICAgZXhwZWN0KHBvc3RTcHkubW9zdFJlY2VudENhbGwuYXJnc1swXSkudG9FcXVhbCgnL2N1c3RvbS10cmFjaycpOwogKiAgICAgIGV4cGVjdChwb3N0U3B5Lm1vc3RSZWNlbnRDYWxsLmFyZ3NbMV0pLnRvRXF1YWwoeyAnbG9naW4nOiAxIH0pOwogKiAgICB9KSk7CiAqICB9KTsKICogYGBgCiAqLwoKLyoqCiAqIEBuZ2RvYyBtZXRob2QKICogQG5hbWUgJHByb3ZpZGUjZmFjdG9yeQogKiBAZGVzY3JpcHRpb24KICoKICogUmVnaXN0ZXIgYSAqKnNlcnZpY2UgZmFjdG9yeSoqLCB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byByZXR1cm4gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCiAqIFRoaXMgaXMgc2hvcnQgZm9yIHJlZ2lzdGVyaW5nIGEgc2VydmljZSB3aGVyZSBpdHMgcHJvdmlkZXIgY29uc2lzdHMgb2Ygb25seSBhIGAkZ2V0YCBwcm9wZXJ0eSwKICogd2hpY2ggaXMgdGhlIGdpdmVuIHNlcnZpY2UgZmFjdG9yeSBmdW5jdGlvbi4KICogWW91IHNob3VsZCB1c2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSAkcHJvdmlkZS5mYWN0b3J5KGdldEZuKX0gaWYgeW91IGRvIG5vdCBuZWVkIHRvCiAqIGNvbmZpZ3VyZSB5b3VyIHNlcnZpY2UgaW4gYSBwcm92aWRlci4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLgogKiBAcGFyYW0ge2Z1bmN0aW9uKCl9ICRnZXRGbiBUaGUgJGdldEZuIGZvciB0aGUgaW5zdGFuY2UgY3JlYXRpb24uIEludGVybmFsbHkgdGhpcyBpcyBhIHNob3J0IGhhbmQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGAkcHJvdmlkZS5wcm92aWRlcihuYW1lLCB7JGdldDogJGdldEZufSlgLgogKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlCiAqCiAqIEBleGFtcGxlCiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIHNlcnZpY2UKICogYGBganMKICogICAkcHJvdmlkZS5mYWN0b3J5KCdwaW5nJywgWyckaHR0cCcsIGZ1bmN0aW9uKCRodHRwKSB7CiAqICAgICByZXR1cm4gZnVuY3Rpb24gcGluZygpIHsKICogICAgICAgcmV0dXJuICRodHRwLnNlbmQoJy9waW5nJyk7CiAqICAgICB9OwogKiAgIH1dKTsKICogYGBgCiAqIFlvdSB3b3VsZCB0aGVuIGluamVjdCBhbmQgdXNlIHRoaXMgc2VydmljZSBsaWtlIHRoaXM6CiAqIGBgYGpzCiAqICAgc29tZU1vZHVsZS5jb250cm9sbGVyKCdDdHJsJywgWydwaW5nJywgZnVuY3Rpb24ocGluZykgewogKiAgICAgcGluZygpOwogKiAgIH1dKTsKICogYGBgCiAqLwoKCi8qKgogKiBAbmdkb2MgbWV0aG9kCiAqIEBuYW1lICRwcm92aWRlI3NlcnZpY2UKICogQGRlc2NyaXB0aW9uCiAqCiAqIFJlZ2lzdGVyIGEgKipzZXJ2aWNlIGNvbnN0cnVjdG9yKiosIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aXRoIGBuZXdgIHRvIGNyZWF0ZSB0aGUgc2VydmljZQogKiBpbnN0YW5jZS4KICogVGhpcyBpcyBzaG9ydCBmb3IgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlIHdoZXJlIGl0cyBwcm92aWRlcidzIGAkZ2V0YCBwcm9wZXJ0eSBpcyB0aGUgc2VydmljZQogKiBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgc2VydmljZSBpbnN0YW5jZS4KICoKICogWW91IHNob3VsZCB1c2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjc2VydmljZSAkcHJvdmlkZS5zZXJ2aWNlKGNsYXNzKX0gaWYgeW91IGRlZmluZSB5b3VyIHNlcnZpY2UKICogYXMgYSB0eXBlL2NsYXNzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UuCiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIEEgY2xhc3MgKGNvbnN0cnVjdG9yIGZ1bmN0aW9uKSB0aGF0IHdpbGwgYmUgaW5zdGFudGlhdGVkLgogKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlCiAqCiAqIEBleGFtcGxlCiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIHNlcnZpY2UgdXNpbmcKICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjc2VydmljZSAkcHJvdmlkZS5zZXJ2aWNlKGNsYXNzKX0uCiAqIGBgYGpzCiAqICAgdmFyIFBpbmcgPSBmdW5jdGlvbigkaHR0cCkgewogKiAgICAgdGhpcy4kaHR0cCA9ICRodHRwOwogKiAgIH07CiAqCiAqICAgUGluZy4kaW5qZWN0ID0gWyckaHR0cCddOwogKgogKiAgIFBpbmcucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbigpIHsKICogICAgIHJldHVybiB0aGlzLiRodHRwLmdldCgnL3BpbmcnKTsKICogICB9OwogKiAgICRwcm92aWRlLnNlcnZpY2UoJ3BpbmcnLCBQaW5nKTsKICogYGBgCiAqIFlvdSB3b3VsZCB0aGVuIGluamVjdCBhbmQgdXNlIHRoaXMgc2VydmljZSBsaWtlIHRoaXM6CiAqIGBgYGpzCiAqICAgc29tZU1vZHVsZS5jb250cm9sbGVyKCdDdHJsJywgWydwaW5nJywgZnVuY3Rpb24ocGluZykgewogKiAgICAgcGluZy5zZW5kKCk7CiAqICAgfV0pOwogKiBgYGAKICovCgoKLyoqCiAqIEBuZ2RvYyBtZXRob2QKICogQG5hbWUgJHByb3ZpZGUjdmFsdWUKICogQGRlc2NyaXB0aW9uCiAqCiAqIFJlZ2lzdGVyIGEgKip2YWx1ZSBzZXJ2aWNlKiogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0sIHN1Y2ggYXMgYSBzdHJpbmcsIGEKICogbnVtYmVyLCBhbiBhcnJheSwgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24uICBUaGlzIGlzIHNob3J0IGZvciByZWdpc3RlcmluZyBhIHNlcnZpY2Ugd2hlcmUgaXRzCiAqIHByb3ZpZGVyJ3MgYCRnZXRgIHByb3BlcnR5IGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgKip2YWx1ZQogKiBzZXJ2aWNlKiouCiAqCiAqIFZhbHVlIHNlcnZpY2VzIGFyZSBzaW1pbGFyIHRvIGNvbnN0YW50IHNlcnZpY2VzLCBleGNlcHQgdGhhdCB0aGV5IGNhbm5vdCBiZSBpbmplY3RlZCBpbnRvIGEKICogbW9kdWxlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKHNlZSB7QGxpbmsgYW5ndWxhci5Nb2R1bGUjY29uZmlnfSkgYnV0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkKICogYW4gQW5ndWxhcgogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNkZWNvcmF0b3IgZGVjb3JhdG9yfS4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLgogKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZS4KICogQHJldHVybnMge09iamVjdH0gcmVnaXN0ZXJlZCBwcm92aWRlciBpbnN0YW5jZQogKgogKiBAZXhhbXBsZQogKiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGNyZWF0aW5nIHZhbHVlIHNlcnZpY2VzLgogKiBgYGBqcwogKiAgICRwcm92aWRlLnZhbHVlKCdBRE1JTl9VU0VSJywgJ2FkbWluJyk7CiAqCiAqICAgJHByb3ZpZGUudmFsdWUoJ1JvbGVMb29rdXAnLCB7IGFkbWluOiAwLCB3cml0ZXI6IDEsIHJlYWRlcjogMiB9KTsKICoKICogICAkcHJvdmlkZS52YWx1ZSgnaGFsZk9mJywgZnVuY3Rpb24odmFsdWUpIHsKICogICAgIHJldHVybiB2YWx1ZSAvIDI7CiAqICAgfSk7CiAqIGBgYAogKi8KCgovKioKICogQG5nZG9jIG1ldGhvZAogKiBAbmFtZSAkcHJvdmlkZSNjb25zdGFudAogKiBAZGVzY3JpcHRpb24KICoKICogUmVnaXN0ZXIgYSAqKmNvbnN0YW50IHNlcnZpY2UqKiwgc3VjaCBhcyBhIHN0cmluZywgYSBudW1iZXIsIGFuIGFycmF5LCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwKICogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIFVubGlrZSB7QGxpbmsgYXV0by4kcHJvdmlkZSN2YWx1ZSB2YWx1ZX0gaXQgY2FuIGJlCiAqIGluamVjdGVkIGludG8gYSBtb2R1bGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoc2VlIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWd9KSBhbmQgaXQgY2Fubm90CiAqIGJlIG92ZXJyaWRkZW4gYnkgYW4gQW5ndWxhciB7QGxpbmsgYXV0by4kcHJvdmlkZSNkZWNvcmF0b3IgZGVjb3JhdG9yfS4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50LgogKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBjb25zdGFudCB2YWx1ZS4KICogQHJldHVybnMge09iamVjdH0gcmVnaXN0ZXJlZCBpbnN0YW5jZQogKgogKiBAZXhhbXBsZQogKiBIZXJlIGEgc29tZSBleGFtcGxlcyBvZiBjcmVhdGluZyBjb25zdGFudHM6CiAqIGBgYGpzCiAqICAgJHByb3ZpZGUuY29uc3RhbnQoJ1NIQVJEX0hFSUdIVCcsIDMwNik7CiAqCiAqICAgJHByb3ZpZGUuY29uc3RhbnQoJ01ZX0NPTE9VUlMnLCBbJ3JlZCcsICdibHVlJywgJ2dyZXknXSk7CiAqCiAqICAgJHByb3ZpZGUuY29uc3RhbnQoJ2RvdWJsZScsIGZ1bmN0aW9uKHZhbHVlKSB7CiAqICAgICByZXR1cm4gdmFsdWUgKiAyOwogKiAgIH0pOwogKiBgYGAKICovCgoKLyoqCiAqIEBuZ2RvYyBtZXRob2QKICogQG5hbWUgJHByb3ZpZGUjZGVjb3JhdG9yCiAqIEBkZXNjcmlwdGlvbgogKgogKiBSZWdpc3RlciBhICoqc2VydmljZSBkZWNvcmF0b3IqKiB3aXRoIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS4gQSBzZXJ2aWNlIGRlY29yYXRvcgogKiBpbnRlcmNlcHRzIHRoZSBjcmVhdGlvbiBvZiBhIHNlcnZpY2UsIGFsbG93aW5nIGl0IHRvIG92ZXJyaWRlIG9yIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZQogKiBzZXJ2aWNlLiBUaGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBkZWNvcmF0b3IgbWF5IGJlIHRoZSBvcmlnaW5hbCBzZXJ2aWNlLCBvciBhIG5ldyBzZXJ2aWNlCiAqIG9iamVjdCB3aGljaCByZXBsYWNlcyBvciB3cmFwcyBhbmQgZGVsZWdhdGVzIHRvIHRoZSBvcmlnaW5hbCBzZXJ2aWNlLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBkZWNvcmF0ZS4KICogQHBhcmFtIHtmdW5jdGlvbigpfSBkZWNvcmF0b3IgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgc2VydmljZSBuZWVkcyB0byBiZQogKiAgICBpbnN0YW50aWF0ZWQgYW5kIHNob3VsZCByZXR1cm4gdGhlIGRlY29yYXRlZCBzZXJ2aWNlIGluc3RhbmNlLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHVzaW5nCiAqICAgIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IjaW52b2tlIGluamVjdG9yLmludm9rZX0gbWV0aG9kIGFuZCBpcyB0aGVyZWZvcmUgZnVsbHkgaW5qZWN0YWJsZS4KICogICAgTG9jYWwgaW5qZWN0aW9uIGFyZ3VtZW50czoKICoKICogICAgKiBgJGRlbGVnYXRlYCAtIFRoZSBvcmlnaW5hbCBzZXJ2aWNlIGluc3RhbmNlLCB3aGljaCBjYW4gYmUgbW9ua2V5IHBhdGNoZWQsIGNvbmZpZ3VyZWQsCiAqICAgICAgZGVjb3JhdGVkIG9yIGRlbGVnYXRlZCB0by4KICoKICogQGV4YW1wbGUKICogSGVyZSB3ZSBkZWNvcmF0ZSB0aGUge0BsaW5rIG5nLiRsb2cgJGxvZ30gc2VydmljZSB0byBjb252ZXJ0IHdhcm5pbmdzIHRvIGVycm9ycyBieSBpbnRlcmNlcHRpbmcKICogY2FsbHMgdG8ge0BsaW5rIG5nLiRsb2cjZXJyb3IgJGxvZy53YXJuKCl9LgogKiBgYGBqcwogKiAgICRwcm92aWRlLmRlY29yYXRvcignJGxvZycsIFsnJGRlbGVnYXRlJywgZnVuY3Rpb24oJGRlbGVnYXRlKSB7CiAqICAgICAkZGVsZWdhdGUud2FybiA9ICRkZWxlZ2F0ZS5lcnJvcjsKICogICAgIHJldHVybiAkZGVsZWdhdGU7CiAqICAgfV0pOwogKiBgYGAKICovCgoKZnVuY3Rpb24gY3JlYXRlSW5qZWN0b3IobW9kdWxlc1RvTG9hZCwgc3RyaWN0RGkpIHsKICBzdHJpY3REaSA9IChzdHJpY3REaSA9PT0gdHJ1ZSk7CiAgdmFyIElOU1RBTlRJQVRJTkcgPSB7fSwKICAgICAgcHJvdmlkZXJTdWZmaXggPSAnUHJvdmlkZXInLAogICAgICBwYXRoID0gW10sCiAgICAgIGxvYWRlZE1vZHVsZXMgPSBuZXcgSGFzaE1hcChbXSwgdHJ1ZSksCiAgICAgIHByb3ZpZGVyQ2FjaGUgPSB7CiAgICAgICAgJHByb3ZpZGU6IHsKICAgICAgICAgICAgcHJvdmlkZXI6IHN1cHBvcnRPYmplY3QocHJvdmlkZXIpLAogICAgICAgICAgICBmYWN0b3J5OiBzdXBwb3J0T2JqZWN0KGZhY3RvcnkpLAogICAgICAgICAgICBzZXJ2aWNlOiBzdXBwb3J0T2JqZWN0KHNlcnZpY2UpLAogICAgICAgICAgICB2YWx1ZTogc3VwcG9ydE9iamVjdCh2YWx1ZSksCiAgICAgICAgICAgIGNvbnN0YW50OiBzdXBwb3J0T2JqZWN0KGNvbnN0YW50KSwKICAgICAgICAgICAgZGVjb3JhdG9yOiBkZWNvcmF0b3IKICAgICAgICAgIH0KICAgICAgfSwKICAgICAgcHJvdmlkZXJJbmplY3RvciA9IChwcm92aWRlckNhY2hlLiRpbmplY3RvciA9CiAgICAgICAgICBjcmVhdGVJbnRlcm5hbEluamVjdG9yKHByb3ZpZGVyQ2FjaGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ3VucHInLCAiVW5rbm93biBwcm92aWRlcjogezB9IiwgcGF0aC5qb2luKCcgPC0gJykpOwogICAgICAgICAgfSkpLAogICAgICBpbnN0YW5jZUNhY2hlID0ge30sCiAgICAgIGluc3RhbmNlSW5qZWN0b3IgPSAoaW5zdGFuY2VDYWNoZS4kaW5qZWN0b3IgPQogICAgICAgICAgY3JlYXRlSW50ZXJuYWxJbmplY3RvcihpbnN0YW5jZUNhY2hlLCBmdW5jdGlvbihzZXJ2aWNlbmFtZSkgewogICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBwcm92aWRlckluamVjdG9yLmdldChzZXJ2aWNlbmFtZSArIHByb3ZpZGVyU3VmZml4KTsKICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKHByb3ZpZGVyLiRnZXQsIHByb3ZpZGVyLCB1bmRlZmluZWQsIHNlcnZpY2VuYW1lKTsKICAgICAgICAgIH0pKTsKCgogIGZvckVhY2gobG9hZE1vZHVsZXMobW9kdWxlc1RvTG9hZCksIGZ1bmN0aW9uKGZuKSB7IGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKGZuIHx8IG5vb3ApOyB9KTsKCiAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3I7CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vICRwcm92aWRlcgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICBmdW5jdGlvbiBzdXBwb3J0T2JqZWN0KGRlbGVnYXRlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICBpZiAoaXNPYmplY3Qoa2V5KSkgewogICAgICAgIGZvckVhY2goa2V5LCByZXZlcnNlUGFyYW1zKGRlbGVnYXRlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlbGVnYXRlKGtleSwgdmFsdWUpOwogICAgICB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcHJvdmlkZXIobmFtZSwgcHJvdmlkZXJfKSB7CiAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnc2VydmljZScpOwogICAgaWYgKGlzRnVuY3Rpb24ocHJvdmlkZXJfKSB8fCBpc0FycmF5KHByb3ZpZGVyXykpIHsKICAgICAgcHJvdmlkZXJfID0gcHJvdmlkZXJJbmplY3Rvci5pbnN0YW50aWF0ZShwcm92aWRlcl8pOwogICAgfQogICAgaWYgKCFwcm92aWRlcl8uJGdldCkgewogICAgICB0aHJvdyAkaW6M3O9W7WEBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PChAAEAGbrXAqAc2wKgHYJUiH/VYenzTQbP2CIAQB6QXrgAAAQEICgCjXrsATaW3jNzvVgFiAQAKIAAACiAAAGj3KB/SxQgAJ60eEwgARQAf/NLIQABABrhMwKgHYMCoBzYf9ZUiQbP2CFh6fNOAGAFTr9UAAAEBCAoATaW3AKNeu2plY3Rvck1pbkVycigncGdldCcsICJQcm92aWRlciAnezB9JyBtdXN0IGRlZmluZSAkZ2V0IGZhY3RvcnkgbWV0aG9kLiIsIG5hbWUpOwogICAgfQogICAgcmV0dXJuIHByb3ZpZGVyQ2FjaGVbbmFtZSArIHByb3ZpZGVyU3VmZml4XSA9IHByb3ZpZGVyXzsKICB9CgogIGZ1bmN0aW9uIGVuZm9yY2VSZXR1cm5WYWx1ZShuYW1lLCBmYWN0b3J5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gZW5mb3JjZWRSZXR1cm5WYWx1ZSgpIHsKICAgICAgdmFyIHJlc3VsdCA9IGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKGZhY3RvcnksIHRoaXMsIHVuZGVmaW5lZCwgbmFtZSk7CiAgICAgIGlmIChpc1VuZGVmaW5lZChyZXN1bHQpKSB7CiAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCd1bmRlZicsICJQcm92aWRlciAnezB9JyBtdXN0IHJldHVybiBhIHZhbHVlIGZyb20gJGdldCBmYWN0b3J5IG1ldGhvZC4iLCBuYW1lKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGZhY3RvcnkobmFtZSwgZmFjdG9yeUZuLCBlbmZvcmNlKSB7CiAgICByZXR1cm4gcHJvdmlkZXIobmFtZSwgewogICAgICAkZ2V0OiBlbmZvcmNlICE9PSBmYWxzZSA/IGVuZm9yY2VSZXR1cm5WYWx1ZShuYW1lLCBmYWN0b3J5Rm4pIDogZmFjdG9yeUZuCiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNlcnZpY2UobmFtZSwgY29uc3RydWN0b3IpIHsKICAgIHJldHVybiBmYWN0b3J5KG5hbWUsIFsnJGluamVjdG9yJywgZnVuY3Rpb24oJGluamVjdG9yKSB7CiAgICAgIHJldHVybiAkaW5qZWN0b3IuaW5zdGFudGlhdGUoY29uc3RydWN0b3IpOwogICAgfV0pOwogIH0KCiAgZnVuY3Rpb24gdmFsdWUobmFtZSwgdmFsKSB7IHJldHVybiBmYWN0b3J5KG5hbWUsIHZhbHVlRm4odmFsKSwgZmFsc2UpOyB9CgogIGZ1bmN0aW9uIGNvbnN0YW50KG5hbWUsIHZhbHVlKSB7CiAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnY29uc3RhbnQnKTsKICAgIHByb3ZpZGVyQ2FjaGVbbmFtZV0gPSB2YWx1ZTsKICAgIGluc3RhbmNlQ2FjaGVbbmFtZV0gPSB2YWx1ZTsKICB9CgogIGZ1bmN0aW9uIGRlY29yYXRvcihzZXJ2aWNlTmFtZSwgZGVjb3JGbikgewogICAgdmFyIG9yaWdQcm92aWRlciA9IHByb3ZpZGVySW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lICsgcHJvdmlkZXJTdWZmaXgpLAogICAgICAgIG9yaWckZ2V0ID0gb3JpZ1Byb3ZpZGVyLiRnZXQ7CgogICAgb3JpZ1Byb3ZpZGVyLiRnZXQgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIG9yaWdJbnN0YW5jZSA9IGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKG9yaWckZ2V0LCBvcmlnUHJvdmlkZXIpOwogICAgICByZXR1cm4gaW5zdGFuY2VJbmplY3Rvci5pbnZva2UoZGVjb3JGbiwgbnVsbCwgeyRkZWxlZ2F0ZTogb3JpZ0luc3RhbmNlfSk7CiAgICB9OwogIH0KCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gTW9kdWxlIExvYWRpbmcKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICBmdW5jdGlvbiBsb2FkTW9kdWxlcyhtb2R1bGVzVG9Mb2FkKSB7CiAgICB2YXIgcnVuQmxvY2tzID0gW10sIG1vZHVsZUZuOwogICAgZm9yRWFjaChtb2R1bGVzVG9Mb2FkLCBmdW5jdGlvbihtb2R1bGUpIHsKICAgICAgaWYgKGxvYWRlZE1vZHVsZXMuZ2V0KG1vZHVsZSkpIHJldHVybjsKICAgICAgbG9hZGVkTW9kdWxlcy5wdXQobW9kdWxlLCB0cnVlKTsKCiAgICAgIGZ1bmN0aW9uIHJ1bkludm9rZVF1ZXVlKHF1ZXVlKSB7CiAgICAgICAgdmFyIGksIGlpOwogICAgICAgIGZvciAoaSA9IDAsIGlpID0gcXVldWUubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgdmFyIGludm9rZUFyZ3MgPSBxdWV1ZVtpXSwKICAgICAgICAgICAgICBwcm92aWRlciA9IHByb3ZpZGVySW5qZWN0b3IuZ2V0KGludm9rZUFyZ3NbMF0pOwoKICAgICAgICAgIHByb3ZpZGVyW2ludm9rZUFyZ3NbMV1dLmFwcGx5KHByb3ZpZGVyLCBpbnZva2VBcmdzWzJdKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRyeSB7CiAgICAgICAgaWYgKGlzU3RyaW5nKG1vZHVsZSkpIHsKICAgICAgICAgIG1vZHVsZUZuID0gYW5ndWxhck1vZHVsZShtb2R1bGUpOwogICAgICAgICAgcnVuQmxvY2tzID0gcnVuQmxvY2tzLmNvbmNhdChsb2FkTW9kdWxlcyhtb2R1bGVGbi5yZXF1aXJlcykpLmNvbmNhdChtb2R1bGVGbi5fcnVuQmxvY2tzKTsKICAgICAgICAgIHJ1bkludm9rZVF1ZXVlKG1vZHVsZUZuLl9pbnZva2VRdWV1ZSk7CiAgICAgICAgICBydW5JbnZva2VRdWV1ZShtb2R1bGVGbi5fY29uZmlnQmxvY2tzKTsKICAgICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24obW9kdWxlKSkgewogICAgICAgICAgICBydW5CbG9ja3MucHVzaChwcm92aWRlckluamVjdG9yLmludm9rZShtb2R1bGUpKTsKICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobW9kdWxlKSkgewogICAgICAgICAgICBydW5CbG9ja3MucHVzaChwcm92aWRlckluamVjdG9yLmludm9rZShtb2R1bGUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0QXJnRm4obW9kdWxlLCAnbW9kdWxlJyk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKGlzQXJyYXkobW9kdWxlKSkgewogICAgICAgICAgbW9kdWxlID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKICAgICAgICB9CiAgICAgICAgaWYgKGUubWVzc2FnZSAmJiBlLnN0YWNrICYmIGUuc3RhY2suaW5kZXhPZihlLm1lc3NhZ2UpID09IC0xKSB7CiAgICAgICAgICAvLyBTYWZhcmkgJiBGRidzIHN0YWNrIHRyYWNlcyBkb24ndCBjb250YWluIGVycm9yLm1lc3NhZ2UgY29udGVudAogICAgICAgICAgLy8gdW5saWtlIHRob3NlIG9mIENocm9tZSBhbmQgSUUKICAgICAgICAgIC8vIFNvIGlmIHN0YWNrIGRvZXNuJ3QgY29udGFpbiBtZXNzYWdlLCB3ZSBjcmVhdGUgYSBuZXcgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aC4KICAgICAgICAgIC8vIFNpbmNlIGVycm9yLnN0YWNrIGlzIHJlYWQtb25seSBpbiBTYWZhcmksIEknbSBvdmVycmlkaW5nIGUgYW5kIG5vdCBlLnN0YWNrIGhlcmUuCiAgICAgICAgICAvKiBqc2hpbnQgLVcwMjIgKi8KICAgICAgICAgIGUgPSBlLm1lc3NhZ2UgKyAnXG4nICsgZS5zdGFjazsKICAgICAgICB9CiAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdtb2R1bGVycicsICJGYWlsZWQgdG8gaW5zdGFudGlhdGUgbW9kdWxlIHswfSBkdWUgdG86XG57MX0iLAogICAgICAgICAgICAgICAgICBtb2R1bGUsIGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBydW5CbG9ja3M7CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBpbnRlcm5hbCBJbmplY3RvcgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICBmdW5jdGlvbiBjcmVhdGVJbnRlcm5hbEluamVjdG9yKGNhY2hlLCBmYWN0b3J5KSB7CgogICAgZnVuY3Rpb24gZ2V0U2VydmljZShzZXJ2aWNlTmFtZSkgewogICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7CiAgICAgICAgaWYgKGNhY2hlW3NlcnZpY2VOYW1lXSA9PT0gSU5TVEFOVElBVElORykgewogICAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdjZGVwJywgJ0NpcmN1bGFyIGRlcGVuZGVuY3kgZm91bmQ6IHswfScsCiAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgKyAnIDwtICcgKyBwYXRoLmpvaW4oJyA8LSAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYWNoZVtzZXJ2aWNlTmFtZV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHBhdGgudW5zaGlmdChzZXJ2aWNlTmFtZSk7CiAgICAgICAgICBjYWNoZVtzZXJ2aWNlTmFtZV0gPSBJTlNUQU5USUFUSU5HOwogICAgICAgICAgcmV0dXJuIGNhY2hlW3NlcnZpY2VOYW1lXSA9IGZhY3Rvcnkoc2VydmljZU5hbWUpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgaWYgKGNhY2hlW3NlcnZpY2VOYW1lXSA9PT0gSU5TVEFOVElBVElORykgewogICAgICAgICAgICBkZWxldGUgY2FjaGVbc2VydmljZU5hbWVdOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBwYXRoLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW52b2tlKGZuLCBzZWxmLCBsb2NhbHMsIHNlcnZpY2VOYW1lKSB7CiAgICAgIGlmICh0eXBlb2YgbG9jYWxzID09PSAnc3RyaW5nJykgewogICAgICAgIHNlcnZpY2VOYW1lID0gbG9jYWxzOwogICAgICAgIGxvY2FscyA9IG51bGw7CiAgICAgIH0KCiAgICAgIHZhciBhcmdzID0gW10sCiAgICAgICAgICAkaW5qZWN0ID0gYW5ub3RhdGUoZm4sIHN0cmljdERpLCBzZXJ2aWNlTmFtZSksCiAgICAgICAgICBsZW5ndGgsIGksCiAgICAgICAgICBrZXk7CgogICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSAkaW5qZWN0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAga2V5ID0gJGluamVjdFtpXTsKICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycignaXRrbicsCiAgICAgICAgICAgICAgICAgICdJbmNvcnJlY3QgaW5qZWN0aW9uIHRva2VuISBFeHBlY3RlZCBzZXJ2aWNlIG5hbWUgYXMgc3RyaW5nLCBnb3QgezB9Jywga2V5KTsKICAgICAgICB9CiAgICAgICAgYXJncy5wdXNoKAogICAgICAgICAgbG9jYWxzICYmIGxvY2Fscy5oYXNPd25Qcm9wZXJ0eShrZXkpCiAgICAgICAgICA/IGxvY2Fsc1trZXldCiAgICAgICAgICA6IGdldFNlcnZpY2Uoa2V5KQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKGlzQXJyYXkoZm4pKSB7CiAgICAgICAgZm4gPSBmbltsZW5ndGhdOwogICAgICB9CgogICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9hbmd1bGFyanMtaW52b2tlLWFwcGx5LXZzLXN3aXRjaAogICAgICAvLyAjNTM4OAogICAgICByZXR1cm4gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFudGlhdGUoVHlwZSwgbG9jYWxzLCBzZXJ2aWNlTmFtZSkgewogICAgICAvLyBDaGVjayBpZiBUeXBlIGlzIGFubm90YXRlZCBhbmQgdXNlIGp1c3QgdGhlIGdpdmVuIGZ1bmN0aW9uIGF0IG4tMSBhcyBwYXJhbWV0ZXIKICAgICAgLy8gZS5nLiBzb21lTW9kdWxlLmZhY3RvcnkoJ2dyZWV0ZXInLCBbJyR3aW5kb3cnLCBmdW5jdGlvbihyZW5hbWVkJHdpbmRvdykge31dKTsKICAgICAgLy8gT2JqZWN0IGNyZWF0aW9uOiBodHRwOi8vanNwZXJmLmNvbS9jcmVhdGUtY29uc3RydWN0b3IvMgogICAgICB2YXIgaW5zdGFuY2UgPSBPYmplY3QuY3JlYXRlKChpc0FycmF5KFR5cGUpID8gVHlwZVtUeXBlLmxlbmd0aCAtIDFdIDogVHlwZSkucHJvdG90eXBlKTsKICAgICAgdmFyIHJldHVybmVkVmFsdWUgPSBpbnZva2UoVHlwZSwgaW5zdGFuY2UsIGxvY2Fscywgc2VydmljZU5hbWUpOwoKICAgICAgcmV0dXJuIGlzT2JqZWN0KHJldHVybmVkVmFsdWUpIHx8IGlzRnVuY3Rpb24ocmV0dXJuZWRWYWx1ZSkgPyByZXR1cm5lZFZhbHVlIDogaW5zdGFuY2U7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgaW52b2tlOiBpbnZva2UsCiAgICAgIGluc3RhbnRpYXRlOiBpbnN0YW50aWF0ZSwKICAgICAgZ2V0OiBnZXRTZXJ2aWNlLAogICAgICBhbm5vdGF0ZTogYW5ub3RhdGUsCiAgICAgIGhhczogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHJldHVybiBwcm92aWRlckNhY2hlLmhhc093blByb3BlcnR5KG5hbWUgKyBwcm92aWRlclN1ZmZpeCkgfHwgY2FjaGUuaGFzT3duUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgIH07CiAgfQp9CgpjcmVhdGVJbmplY3Rvci4kJGFubm90YXRlID0gYW5ub3RhdGU7CgovKioKICogQG5nZG9jIHByb3ZpZGVyCiAqIEBuYW1lICRhbmNob3JTY3JvbGxQcm92aWRlcgogKgogKiBAZGVzY3JpcHRpb24KICogVXNlIGAkYW5jaG9yU2Nyb2xsUHJvdmlkZXJgIHRvIGRpc2FibGUgYXV0b21hdGljIHNjcm9sbGluZyB3aGVuZXZlcgogKiB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gY2hhbmdlcy4KICovCmZ1bmN0aW9uICRBbmNob3JTY3JvbGxQcm92aWRlcigpIHsKCiAgdmFyIGF1dG9TY3JvbGxpbmdFbmFibGVkID0gdHJ1ZTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRhbmNob3JTY3JvbGxQcm92aWRlciNkaXNhYmxlQXV0b1Njcm9sbGluZwogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogQnkgZGVmYXVsdCwge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwgJGFuY2hvclNjcm9sbCgpfSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNoYW5nZXMgdG8KICAgKiB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gYW5kIHNjcm9sbCB0byB0aGUgZWxlbWVudCBtYXRjaGluZyB0aGUgbmV3IGhhc2guPGJyIC8+CiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGRpc2FibGUgYXV0b21hdGljIHNjcm9sbGluZy4KICAgKgogICAqIElmIGF1dG9tYXRpYyBzY3JvbGxpbmcgaXMgZGlzYWJsZWQsIG9uZSBtdXN0IGV4cGxpY2l0bHkgY2FsbAogICAqIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsICRhbmNob3JTY3JvbGwoKX0gaW4gb3JkZXIgdG8gc2Nyb2xsIHRvIHRoZSBlbGVtZW50IHJlbGF0ZWQgdG8gdGhlCiAgICogY3VycmVudCBoYXNoLgogICAqLwogIHRoaXMuZGlzYWJsZUF1dG9TY3JvbGxpbmcgPSBmdW5jdGlvbigpIHsKICAgIGF1dG9TY3JvbGxpbmdFbmFibGVkID0gZmFsc2U7CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIHNlcnZpY2UKICAgKiBAbmFtZSAkYW5jaG9yU2Nyb2xsCiAgICogQGtpbmQgZnVuY3Rpb24KICAgKiBAcmVxdWlyZXMgJHdpbmRvdwogICAqIEByZXF1aXJlcyAkbG9jYXRpb24KICAgKiBAcmVxdWlyZXMgJHJvb3RTY29wZQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogV2hlbiBjYWxsZWQsIGl0IGNoZWNrcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gYW5kCiAgICogc2Nyb2xscyB0byB0aGUgcmVsYXRlZCBlbGVtZW50LCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiB0aGUKICAgKiBbSHRtbDUgc3BlY10oaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy9PdmVydmlldy5odG1sI3RoZS1pbmRpY2F0ZWQtcGFydC1vZi10aGUtZG9jdW1lbnQpLgogICAqCiAgICogSXQgYWxzbyB3YXRjaGVzIHRoZSB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gYW5kIGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0bwogICAqIG1hdGNoIGFueSBhbmNob3Igd2hlbmV2ZXIgaXQgY2hhbmdlcy4gVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgY2FsbGluZwogICAqIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsUHJvdmlkZXIjZGlzYWJsZUF1dG9TY3JvbGxpbmcgJGFuY2hvclNjcm9sbFByb3ZpZGVyLmRpc2FibGVBdXRvU2Nyb2xsaW5nKCl9LgogICAqCiAgICogQWRkaXRpb25hbGx5LCB5b3UgY2FuIHVzZSBpdHMge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwjeU9mZnNldCB5T2Zmc2V0fSBwcm9wZXJ0eSB0byBzcGVjaWZ5IGEKICAgKiB2ZXJ0aWNhbCBzY3JvbGwtb2Zmc2V0IChlaXRoZXIgZml4ZWQgb3IgZHluYW1pYykuCiAgICoKICAgKiBAcHJvcGVydHkgeyhudW1iZXJ8ZnVuY3Rpb258anFMaXRlKX0geU9mZnNldAogICAqIElmIHNldCwgc3BlY2lmaWVzIGEgdmVydGljYWwgc2Nyb2xsLW9mZnNldC4gVGhpcyBpcyBvZnRlbiB1c2VmdWwgd2hlbiB0aGVyZSBhcmUgZml4ZWQKICAgKiBwb3NpdGlvbmVkIGVsZW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UsIHN1Y2ggYXMgbmF2YmFycywgaGVhZGVycyBldGMuCiAgICoKICAgKiBgeU9mZnNldGAgY2FuIGJlIHNwZWNpZmllZCBpbiB2YXJpb3VzIHdheXM6CiAgICogLSAqKm51bWJlcioqOiBBIGZpeGVkIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgdXNlZCBhcyBvZmZzZXQuPGJyIC8+PGJyIC8+CiAgICogLSAqKmZ1bmN0aW9uKio6IEEgZ2V0dGVyIGZ1bmN0aW9uIGNhbGxlZCBldmVyeXRpbWUgYCRhbmNob3JTY3JvbGwoKWAgaXMNCozc71YrYgEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8KUAAQAZutMCoBzbAqAdglSIf9Vh6fNNBtBXQgBAII/dmAAABAQgKAKNeuwBNpbeM3O9WC2MBAGpgAABqYAAAaPcoH9LFCAAnrR4TCABFAGBc0s5AAEAGd+bAqAdgwKgHNh/1lSJBtBXQWHp804AQAVPwNQAAAQEICgBNpbcAo167N0ZFOA0KIGV4ZWN1dGVkLiBNdXN0IHJldHVybgogICAqICAgYSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgKGluIHBpeGVscykuPGJyIC8+PGJyIC8+CiAgICogLSAqKmpxTGl0ZSoqOiBBIGpxTGl0ZS9qUXVlcnkgZWxlbWVudCB0byBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBvZmZzZXQuIFRoZSBkaXN0YW5jZSBmcm9tCiAgICogICB0aGUgdG9wIG9mIHRoZSBwYWdlIHRvIHRoZSBlbGVtZW50J3MgYm90dG9tIHdpbGwgYmUgdXNlZCBhcyBvZmZzZXQuPGJyIC8+CiAgICogICAqKk5vdGUqKjogVGhlIGVsZW1lbnQgd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgb25seSBhcyBsb25nIGFzIGl0cyBgcG9zaXRpb25gIGlzIHNldCB0bwogICAqICAgYGZpeGVkYC4gVGhpcyBvcHRpb24gaXMgdXNlZnVsLCB3aGVuIGRlYWxpbmcgd2l0aCByZXNwb25zaXZlIG5hdmJhcnMvaGVhZGVycyB0aGF0IGFkanVzdAogICAqICAgdGhlaXIgaGVpZ2h0IGFuZC9vciBwb3NpdGlvbmluZyBhY2NvcmRpbmcgdG8gdGhlIHZpZXdwb3J0J3Mgc2l6ZS4KICAgKgogICAqIDxiciAvPgogICAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgogICAqIEluIG9yZGVyIGZvciBgeU9mZnNldGAgdG8gd29yayBwcm9wZXJseSwgc2Nyb2xsaW5nIHNob3VsZCB0YWtlIHBsYWNlIG9uIHRoZSBkb2N1bWVudCdzIHJvb3QgYW5kCiAgICogbm90IHNvbWUgY2hpbGQgZWxlbWVudC4KICAgKiA8L2Rpdj4KICAgKgogICAqIEBleGFtcGxlCiAgICAgPGV4YW1wbGUgbW9kdWxlPSJhbmNob3JTY3JvbGxFeGFtcGxlIj4KICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgICA8ZGl2IGlkPSJzY3JvbGxBcmVhIiBuZy1jb250cm9sbGVyPSJTY3JvbGxDb250cm9sbGVyIj4KICAgICAgICAgICA8YSBuZy1jbGljaz0iZ290b0JvdHRvbSgpIj5HbyB0byBib3R0b208L2E+CiAgICAgICAgICAgPGEgaWQ9ImJvdHRvbSI+PC9hPiBZb3UncmUgYXQgdGhlIGJvdHRvbSEKICAgICAgICAgPC9kaXY+CiAgICAgICA8L2ZpbGU+CiAgICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgogICAgICAgICBhbmd1bGFyLm1vZHVsZSgnYW5jaG9yU2Nyb2xsRXhhbXBsZScsIFtdKQogICAgICAgICAgIC5jb250cm9sbGVyKCdTY3JvbGxDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGxvY2F0aW9uJywgJyRhbmNob3JTY3JvbGwnLAogICAgICAgICAgICAgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCAkYW5jaG9yU2Nyb2xsKSB7CiAgICAgICAgICAgICAgICRzY29wZS5nb3RvQm90dG9tID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBsb2NhdGlvbi5oYXNoIHRvIHRoZSBpZCBvZgogICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHlvdSB3aXNoIHRvIHNjcm9sbCB0by4KICAgICAgICAgICAgICAgICAkbG9jYXRpb24uaGFzaCgnYm90dG9tJyk7CgogICAgICAgICAgICAgICAgIC8vIGNhbGwgJGFuY2hvclNjcm9sbCgpCiAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbCgpOwogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfV0pOwogICAgICAgPC9maWxlPgogICAgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4KICAgICAgICAgI3Njcm9sbEFyZWEgewogICAgICAgICAgIGhlaWdodDogMjgwcHg7CiAgICAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgIH0KCiAgICAgICAgICNib3R0b20gewogICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgIG1hcmdpbi10b3A6IDIwMDBweDsKICAgICAgICAgfQogICAgICAgPC9maWxlPgogICAgIDwvZXhhbXBsZT4KICAgKgogICAqIDxociAvPgogICAqIFRoZSBleGFtcGxlIGJlbG93IGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgYSB2ZXJ0aWNhbCBzY3JvbGwtb2Zmc2V0IChzcGVjaWZpZWQgYXMgYSBmaXhlZCB2YWx1ZSkuCiAgICogU2VlIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsI3lPZmZzZXQgJGFuY2hvclNjcm9sbC55T2Zmc2V0fSBmb3IgbW9yZSBkZXRhaWxzLgogICAqCiAgICogQGV4YW1wbGUKICAgICA8ZXhhbXBsZSBtb2R1bGU9ImFuY2hvclNjcm9sbE9mZnNldEV4YW1wbGUiPgogICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgIDxkaXYgY2xhc3M9ImZpeGVkLWhlYWRlciIgbmctY29udHJvbGxlcj0iaGVhZGVyQ3RybCI+CiAgICAgICAgICAgPGEgaHJlZj0iIiBuZy1jbGljaz0iZ290b0FuY2hvcih4KSIgbmctcmVwZWF0PSJ4IGluIFsxLDIsMyw0LDVdIj4KICAgICAgICAgICAgIEdvIHRvIGFuY2hvciB7e3h9fQogICAgICAgICAgIDwvYT4KICAgICAgICAgPC9kaXY+CiAgICAgICAgIDxkaXYgaWQ9ImFuY2hvcnt7eH19IiBjbGFzcz0iYW5jaG9yIiBuZy1yZXBlYXQ9InggaW4gWzEsMiwzLDQsNV0iPgogICAgICAgICAgIEFuY2hvciB7e3h9fSBvZiA1CiAgICAgICAgIDwvZGl2PgogICAgICAgPC9maWxlPgogICAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2FuY2hvclNjcm9sbE9mZnNldEV4YW1wbGUnLCBbXSkKICAgICAgICAgICAucnVuKFsnJGFuY2hvclNjcm9sbCcsIGZ1bmN0aW9uKCRhbmNob3JTY3JvbGwpIHsKICAgICAgICAgICAgICRhbmNob3JTY3JvbGwueU9mZnNldCA9IDUwOyAgIC8vIGFsd2F5cyBzY3JvbGwgYnkgNTAgZXh0cmEgcGl4ZWxzCiAgICAgICAgICAgfV0pCiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ2hlYWRlckN0cmwnLCBbJyRhbmNob3JTY3JvbGwnLCAnJGxvY2F0aW9uJywgJyRzY29wZScsCiAgICAgICAgICAgICBmdW5jdGlvbiAoJGFuY2hvclNjcm9sbCwgJGxvY2F0aW9uLCAkc2NvcGUpIHsKICAgICAgICAgICAgICAgJHNjb3BlLmdvdG9BbmNob3IgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgdmFyIG5ld0hhc2ggPSAnYW5jaG9yJyArIHg7CiAgICAgICAgICAgICAgICAgaWYgKCRsb2NhdGlvbi5oYXNoKCkgIT09IG5ld0hhc2gpIHsKICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgJGxvY2F0aW9uLmhhc2ggdG8gYG5ld0hhc2hgIGFuZAogICAgICAgICAgICAgICAgICAgLy8gJGFuY2hvclNjcm9sbCB3aWxsIGF1dG9tYXRpY2FsbHkgc2Nyb2xsIHRvIGl0CiAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24uaGFzaCgnYW5jaG9yJyArIHgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAvLyBjYWxsICRhbmNob3JTY3JvbGwoKSBleHBsaWNpdGx5LAogICAgICAgICAgICAgICAgICAgLy8gc2luY2UgJGxvY2F0aW9uLmhhc2ggaGFzbid0IGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICRhbmNob3JTY3JvbGwoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgXSk7CiAgICAgICA8L2ZpbGU+CiAgICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgogICAgICAgICBib2R5IHsKICAgICAgICAgICBwYWRkaW5nLXRvcDogNTBweDsKICAgICAgICAgfQoKICAgICAgICAgLmFuY2hvciB7CiAgICAgICAgICAgYm9yZGVyOiAycHggZGFzaGVkIERhcmtPcmNoaWQ7CiAgICAgICAgICAgcGFkZGluZzogMTBweCAxMHB4IDIwMHB4IDEwcHg7CiAgICAgICAgIH0KCiAgICAgICAgIC5maXhlZC1oZWFkZXIgewogICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgIHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7CiAgICAgICAgIH0KCiAgICAgICAgIC5maXhlZC1oZWFkZXIgPiBhIHsKICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgbWFyZ2luOiA1cHggMTVweDsKICAgICAgICAgfQogICAgICAgPC9maWxlPgogICAgIDwvZXhhbXBsZT4KICAgKi8KICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCAnJGxvY2F0aW9uJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbigkd2luZG93LCAkbG9jYXRpb24sICRyb290U2NvcGUpIHsKICAgIHZhciBkb2N1bWVudCA9ICR3aW5kb3cuZG9jdW1lbnQ7CgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBmaXJzdCBhbmNob3IgZnJvbSBhIE5vZGVMaXN0CiAgICAvLyAodXNpbmcgYEFycmF5I3NvbWUoKWAgaW5zdGVhZCBvZiBgYW5ndWxhciNmb3JFYWNoKClgIHNpbmNlIGl0J3MgbW9yZSBwZXJmb3JtYW50CiAgICAvLyAgYW5kIHdvcmtpbmcgaW4gYWxsIHN1cHBvcnRlZCBicm93c2Vycy4pCiAgICBmdW5jdGlvbiBnZXRGaXJzdEFuY2hvcihsaXN0KSB7CiAgICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgICBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGxpc3QsIGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgICBpZiAobm9kZU5hbWVfKGVsZW1lbnQpID09PSAnYScpIHsKICAgICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFlPZmZzZXQoKSB7CgogICAgICB2YXIgb2Zmc2V0ID0gc2Nyb2xsLnlPZmZzZXQ7CgogICAgICBpZiAoaXNGdW5jdGlvbihvZmZzZXQpKSB7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0KCk7CiAgICAgIH0gZWxzZSBpZiAoaXNFbGVtZW50KG9mZnNldCkpIHsKICAgICAgICB2YXIgZWxlbSA9IG9mZnNldFswXTsKICAgICAgICB2YXIgc3R5bGUgPSAkd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7CiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnKSB7CiAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIWlzTnVtYmVyKG9mZnNldCkpIHsKICAgICAgICBvZmZzZXQgPSAwOwogICAgICB9CgogICAgICByZXR1cm4gb2Zmc2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW0pIHsKICAgICAgaWYgKGVsZW0pIHsKICAgICAgICBlbGVtLnNjcm9sbEludG9WaWV3KCk7CgogICAgICAgIHZhciBvZmZzZXQgPSBnZXRZT2Zmc2V0KCk7CgogICAgICAgIGlmIChvZmZzZXQpIHsKICAgICAgICAgIC8vIGBvZmZzZXRgIGlzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHdlIHNob3VsZCBzY3JvbGwgVVAgaW4gb3JkZXIgdG8gYWxpZ24gYGVsZW1gIHByb3Blcmx5LgogICAgICAgICAgLy8gVGhpcyBpcyB0cnVlIE9OTFkgaWYgdGhlIGNhbGwgdG8gYGVsZW0uc2Nyb2xsSW50b1ZpZXcoKWAgaW5pdGlhbGx5IGFsaWducyBgZWxlbWAgYXQgdGhlCiAgICAgICAgICAvLyB0b3Agb2YgdGhlIHZpZXdwb3J0LgogICAgICAgICAgLy8KICAgICAgICAgIC8vIElGIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGZyb20gdGhlIHRvcCBvZiBgZWxlbWAgdG8gdGhlIGVuZCBvZiB0aGUgcGFnZSdzIGNvbnRlbnQgaXMgbGVzcwogICAgICAgICAgLy8gdGhhbiB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCwgdGhlbiBgZWxlbS5zY3JvbGxJbnRvVmlldygpYCB3aWxsIGFsaWduIHRoZSBgZWxlbWAgc29tZQogICAgICAgICAgLy8gd2F5IGRvd24gdGhlIHBhZ2UuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhpcyBpcyBvZnRlbiB0aGUgY2FzZSBmb3IgZWxlbWVudHMgbmVhciB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIEluIHN1Y2ggY2FzZXMgd2UgZG8gbm90IG5lZWQgdG8gc2Nyb2xsIHRoZSB3aG9sZSBgb2Zmc2V0YCB1cCwganVzdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCiAgICAgICAgICAvLyB0aGUgdG9wIG9mIHRoZSBlbGVtZW50IGFuZCB0aGUgb2Zmc2V0LCB3aGljaCBpcyBlbm91Z2ggdG8gYWxpZ24gdGhlIHRvcCBvZiBgZWxlbWAgYXQgdGhlCiAgICAgICAgICAvLyBkZXNpcmVkIHBvc2l0aW9uLgogICAgICAgICAgdmFyIGVsZW1Ub3AgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgICAgICAgICR3aW5kb3cuc2Nyb2xsQnkoMCwgZWxlbVRvcCAtIG9mZnNldCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICR3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzY3JvbGwoKSB7CiAgICAgIHZhciBoYXNoID0gJGxvY2F0aW9uLmhhc2goKSwgZWxtOwoKICAgICAgLy8gZW1wdHkgaGFzaCwgc2Nyb2xsIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2UKICAgICAgaWYgKCFoYXNoKSBzY3JvbGxUbyhudWxsKTsKCiAgICAgIC8vIGVsZW1lbnQgd2l0aCBnaXZlbiBpZAogICAgICBlbHNlIGlmICgoZWxtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGFzaCkpKSBzY3JvbGxUbyhlbG0pOwoKICAgICAgLy8gZmlyc3QgYW5jaG9yIHdpdGggZ2l2ZW4gbmFtZSA6LUQKICAgICAgZWxzZSBpZiAoKGVsbSA9IGdldEZpcnN0QW5jaG9yKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKGhhc2gpKSkpIHNjcm9sbFRvKGVsbSk7CgogICAgICAvLyBubyBlbGVtZW50IGFuZCBoYXNoID09ICd0b3AnLCBzY3JvbGwgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZQogICAgICBlbHNlIGlmIChoYXNoID09PSAndG9wJykgc2Nyb2xsVG8obnVsbCk7CiAgICB9CgogICAgLy8gZG9lcyBub3Qgc2Nyb2xsIHdoZW4gdXNlciBjbGlja3Mgb24gYW5jaG9yIGxpbmsgdGhhdCBpcyBjdXJyZW50bHkgb24KICAgIC8vIChubyB1cmwgY2hhbmdlLCBubyAkbG9jYXRpb24uaGFzaCgpIGNoYW5nZSksIGJyb3dzZXIgbmF0aXZlIGRvZXMgc2Nyb2xsCiAgICBpZiAoYXV0b1Njcm9sbGluZ0VuYWJsZWQpIHsKICAgICAgJHJvb3RTY29wZS4kd2F0Y2goZnVuY3Rpb24gYXV0b1Njcm9sbFdhdGNoKCkge3JldHVybiAkbG9jYXRpb24uaGFzaCgpO30sCiAgICAgICAgZnVuY3Rpb24gYXV0b1Njcm9sbFdhdGNoQWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7CiAgICAgICAgICAvLyBza2lwIHRoZSBpbml0aWFsIHNjcm9sbCBpZiAkbG9jYXRpb24uaGFzaCBpcyBlbXB0eQogICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gb2xkVmFsICYmIG5ld1ZhbCA9PT0gJycpIHJldHVybjsKCiAgICAgICAgICBqcUxpdGVEb2N1bWVudExvYWRlZChmdW5jdGlvbigpIHsKICAgICAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKHNjcm9sbCk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gc2Nyb2xsOwogIH1dOwp9Cgp2YXIgJGFuaW1hdGVNaW5FcnIgPSBtaW5FcnIoJyRhbmltYXRlJyk7CgovKioKICogQG5nZG9jIHByb3ZpZGVyCiAqIEBuYW1lICRhbmltYXRlUHJvdmlkZXIKICoKICogQGRlc2NyaXB0aW9uCiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgJGFuaW1hdGUgdGhhdCBkb2Vzbid0IHBlcmZvcm0gYW55IGFuaW1hdGlvbnMsIGluc3RlYWQganVzdAogKiBzeW5jaHJvbm91c2x5IHBlcmZvcm1zIERPTQogKiB1cGRhdGVzIGFuZCBjYWxscyBkb25lKCkgY2FsbGJhY2tzLgogKgogKiBJbiBvcmRlciB0byBlbmFibGUgYW5pbWF0aW9ucyB0aGUgbmdBbmltYXRlIG1vZHVsZSBoYXMgdG8gYmUgbG9hZGVkLgogKgogKiBUbyBzZWUgdGhlIGZ1bmN0aW9uYWwgaW1wbGVtZW50YXRpb24gY2hlY2sgb3V0IHNyYy9uZ0FuaW1hdGUvYW5pbWF0ZS5qcwogKi8KdmFyICRBbmltYXRlUHJvdmlkZXIgPSBbJyRwcm92aWRlJywgZnVuY3Rpb24oJHByb3ZpZGUpIHsKCgogIHRoaXMuJCRzZWxlY3RvcnMgPSB7fTsKCgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkYW5pbWF0ZVByb3ZpZGVyI3JlZ2lzdGVyCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBSZWdpc3RlcnMgYSBuZXcgaW5qZWN0YWJsZSBhbmltYXRpb24gZmFjdG9yeSBmdW5jdGlvbi4gVGhlIGZhY3RvcnkgZnVuY3Rpb24gcHJvZHVjZXMgdGhlCiAgICogYW5pbWF0aW9uIG9iamVjdCB3aGljaCBjb250YWlucyBjYWxsYmFjayBmdW5jdGlvbnMgZm9yIGVhY2ggZXZlbnQgdGhhdCBpcyBleHBlY3RlZCB0byBiZQogICAqIGFuaW1hdGVkLgogICAqCiAgICogICAqIGBldmVudEZuYDogYGZ1bmN0aW9uKEVsZW1lbnQsIGRvbmVGdW5jdGlvbilgIFRoZSBlbGVtZW50IHRvIGFuaW1hdGUsIHRoZSBgZG9uZUZ1bmN0aW9uYAogICAqICAgbXVzdCBiZSBjYWxsZWQgb25jZSB0aGUgZWxlbWVudCBhbmltYXRpb24gaXMgY29tcGxldGUuIElmIGEgZnVuY3Rpb24gaXMgcmV0dXJuZWQgdGhlbiB0aGUKICAgKiAgIGFuaW1hdGlvbiBzZXJ2aWNlIHdpbGwgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBhbmltYXRpb24gd2hlbmV2ZXIgYSBjYW5jZWwgZXZlbnQgaXMKICAgKiAgIHRyaWdnZXJlZC4KICAgKgogICAqCiAgICogYGBganMKICAgKiAgIHJldHVybiB7CiAgICAgKiAgICAgZXZlbnRGbiA6IGZ1bmN0aW9uKGVsZW1lbnQsIGRvbmUpIHsKICAgICAqICAgICAgIC8vY29kZSB0byBydW4gdGhlIGFuaW1hdGlvbgogICAgICogICAgICAgLy9vbmNlIGNvbXBsZXRlLCB0aGVuIHJ1biBkb25lKCkKICAgICAqICAgICAgIHJldHVybiBmdW5jdGlvbiBjYW5jZWxsYXRpb25GdW5jdGlvbigpIHsKICAgICAqICAgICAgICAgLy9jb2RlIHRvIGNhbmNlbCB0aGUgYW5pbWF0aW9uCiAgICAgKiAgICAgICB9CiAgICAgKiAgICAgfQogICAgICogICB9CiAgICogYGBgCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYW5pbWF0aW9uLgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkgVGhlIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHJldHVybiB0aGUgYW5pbWF0aW9uCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuCiAgICovCiAgdGhpcy5yZWdpc3RlciA9IGZ1bmN0aW9uKG5hbWUsIGZhY3RvcnkpIHsKICAgIHZhciBrZXkgPSBuYW1lICsgJy1hbmltYXRpb24nOwogICAgaWYgKG5hbWUgJiYgbmFtZS5jaGFyQXQoMCkgIT0gJy4nKSB0aHJvdyAkYW5pbWF0ZU1pbkVycignbm90Y3NlbCcsCiAgICAgICAgIkV4cGVjdGluZyBjbGFzcyBzZWxlY3RvciBzdGFydGluZyB3aXRoICcuJyBnb3QgJ3swfScuIiwgbmFtZSk7CiAgICB0aGlzLiQkc2VsZWN0b3JzW25hbWUuc3Vic3RyKDEpXSA9IGtleTsKICAgICRwcm92aWRlLmZhY3Rvcnkoa2V5LCBmYWN0b3J5KTsKICB9OwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGFuaW1hdGVQcm92aWRlciNjbGFzc05hbWVGaWx0ZXIKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFNldHMgYW5kL29yIHJldHVybnMgdGhlIENTUyBjbGFzcyByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyBjaGVja2VkIHdoZW4gcGVyZm9ybWluZwogICAqIGFuIGFuaW1hdGlvbi4gVXBvbiBib290c3RyYXAgdGhlIGNsYXNzTmFtZUZpbHRlciB2YWx1ZSBpcyBub3Qgc2V0IGF0IGFsbCBhbmQgd2lsbAogICAqIHRoZXJlZm9yZSBlbmFibGUgJGFuaW1hdGUgdG8gYXR0ZW1wdCB0byBwZXJmb3JtIGFuIGFuaW1hdGlvbiBvbiBhbnkgZWxlbWVudC4KICAgKiBXaGVuIHNldHRpbmcgdGhlIGNsYXNzTmFtZUZpbHRlciB2YWx1ZSwgYW5pbWF0aW9ucyB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIG9uIGVsZW1lbnRzCiAgICogdGhhdCBzdWNjZXNzZnVsbHkgbWF0Y2ggdGhlIGZpbHRlciBleHByZXNzaW9uLiBUaGlzIGluIHR1cm4gY2FuIGJvb3N0IHBlcmZvcm1hbmNlCiAgICogZm9yIGxvdy1wb3dlcmVkIGRldmljZXMgYXMgd2VsbCBhcyBhcHBsaWNhdGlvbnMgY29udGFpbmluZyBhIGxvdCBvZiBzdHJ1Y3R1cmFsIG9wZXJhdGlvbnMuCiAgICogQHBhcmFtIHtSZWdFeHA9fSBleHByZXNzaW9uIFRoZSBjbGFzc05hbWUgZXhwcmVzc2lvbiB3aGljaCB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgYW5pbWF0aW9ucwogICAqIEByZXR1cm4ge1JlZ0V4cH0gVGhlIGN1cnJlbnQgQ1NTIGNsYXNzTmFtZSBleHByZXNzaW9uIHZhbHVlLiBJZiBudWxsIHRoZW4gdGhlcmUgaXMgbm8gZXhwcmVzc2lvbiB2YWx1ZQogICAqLwogIHRoaXMuY2xhc3NOYW1lRmlsdGVyID0gZnVuY3Rpb24oZXhwcmVzc2lvbikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgdGhpcy4kJGNsYXNzTmFtZUZpbHRlciA9IChleHByZXNzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSA/IGV4cHJlc3Npb24gOiBudWxsOwogICAgfQogICAgcmV0dXJuIHRoaXMuJCRjbGFzc05hbWVGaWx0ZXI7CiAgfTsKCiAgdGhpcy4kZ2V0ID0gWyckJHEnLCAnJCRhc3luY0NhbGxiYWNrJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbigkJHEsICQkYXN5bmNDYWxsYmFjaywgJHJvb3RTY29wZSkgewoKICAgIHZhciBjdXJyZW50RGVmZXI7CgogICAgZnVuY3Rpb24gcnVuQW5pbWF0aW9uUG9zdERpZ2VzdChmbikgewogICAgICB2YXIgY2FuY2VsRm4sIGRlZmVyID0gJCRxLmRlZmVyKCk7CiAgICAgIGRlZmVyLnByb21pc2UuJCRjYW5jZWxGbiA9IGZ1bmN0aW9uIG5nQW5pbWF0ZU1heWJlQ2FuY2VsKCkgewogICAgICAgIGNhbmNlbEZuICYmIGNhbmNlbEZuKCk7CiAgICAgIH07CgogICAgICAkcm9vdFNjb3BlLiQkcG9zdERpZ2VzdChmdW5jdGlvbiBuZ0FuaW1hdGVQb3N0RGlnZXN0KCkgewogICAgICAgIGNhbmNlbEZuID0gZm4oZnVuY3Rpb24gbmdBbmltYXRlTm90aWZ5Q29tcGxldGUoKSB7CiAgICAgICAgICBkZWZlci5yZXNvbHZlKCk7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnRDbGFzc2VzKGVsZW1lbnQsIGNsYXNzZXMpIHsKICAgICAgdmFyIHRvQWRkID0gW10sIHRvUmVtb3ZlID0gW107CgogICAgICB2YXIgaGFzQ2xhc3NlcyA9IGNyZWF0ZU1hcCgpOwogICAgICBmb3JFYWNoKChlbGVtZW50LmF0dHIoJ2NsYXNzJykgfHwgJycpLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oY2xhc3NOYW1lKSB7CiAgICAgICAgaGFzQ2xhc3Nlc1tjbGFzc05hbWVdID0gdHJ1ZTsKICAgICAgfSk7CgogICAgICBmb3JFYWNoKGNsYXNzZXMsIGZ1bmN0aW9uKHN0YXR1cywgY2xhc3NOYW1lKSB7CiAgICAgICAgdmFyIGhhc0NsYXNzID0gaGFzQ2xhc3Nlc1tjbGFzc05hbWVdOwoKICAgICAgICAvLyBJZiB0aGUgbW9zdCByZWNlbnQgY2xhc3MgbWFuaXB1bGF0aW9uICh2aWEgJGFuaW1hdGUpIHdhcyB0byByZW1vdmUgdGhlIGNsYXNzLCBhbmQgdGhlCiAgICAgICAgLy8gZWxlbWVudCBjdXJyZW50bHkgaGFzIHRoZSBjbGFzcywgdGhlIGNsYXNzIGlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbC4gT3RoZXJ3aXNlLCBpZgogICAgICAgIC8vIHRoZSBtb3N0IHJlY2VudCBjbGFzcyBtYW5pcHVsYXRpb24gKHZpYSAkYW5pbWF0ZSkgd2FzIHRvIGFkZCB0aGUgY2xhc3MsIGFuZCB0aGUKICAgICAgICAvLyBlbGVtZW50IGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIHRoZSBjbGFzcywgdGhlIGNsYXNzIGlzIHNjaGVkdWxlZCB0byBiZSBhZGRlZC4KICAgICAgICBpZiAoc3RhdHVzID09PSBmYWxzZSAmJiBoYXNDbGFzcykgewogICAgICAgICAgdG9SZW1vdmUucHVzaChjbGFzc05hbWUpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSB0cnVlICYmICFoYXNDbGFzcykgewogICAgICAgICAgdG9BZGQucHVzaChjbGFzc05hbWUpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICByZXR1cm4gKHRvQWRkLmxlbmd0aCArIHRvUmVtb3ZlLmxlbmd0aCkgPiAwICYmCiAgICAgICAgW3RvQWRkLmxlbmd0aCA/IHRvQWRkIDogbnVsbCwgdG9SZW1vdmUubGVuZ3RoID8gdG9SZW1vdmUgOiBudWxsXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWNoZWRDbGFzc01hbmlwdWxhdGlvbihjYWNoZSwgY2xhc3Nlcywgb3ApIHsKICAgICAgZm9yICh2YXIgaT0wLCBpaSA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc2VzW2ldOwogICAgICAgIGNhY2hlW2NsYXNzTmFtZV0gPSBvcDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFzeW5jUHJvbWlzZSgpIHsKICAgICAgLy8gb25seSBzZXJ2ZSBvbmUgaW5zdGFuY2Ugb2YgYSBwcm9taXNlIGluIG9yZGVyIHRvIHNhdmUgQ1BVIGN5Y2xlcwogICAgICBpZiAoIWN1cnJlbnREZWZlcikgewogICAgICAgIGN1cnJlbnREZWZlciA9ICQkcS5kZWZlcigpOwogICAgICAgICQkYXN5bmNDYWxsYmFjayhmdW5jdGlvbigpIHsKICAgICAgICAgIGN1cnJlbnREZWZlci5yZXNvbHZlKCk7CiAgICAgICAgICBjdXJyZW50RGVmZXIgPSBudWxsOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBjdXJyZW50RGVmZXIucHJvbWlzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseVN0eWxlcyhlbGVtZW50LCBvcHRpb25zKSB7CiAgICAgIGlmIChhbmd1bGFyLmlzT2JqZWN0KG9wdGlvbnMpKSB7CiAgICAgICAgdmFyIHN0eWxlcyA9IGV4dGVuZChvcHRpb25zLmZyb20gfHwge30sIG9wdGlvbnMudG8gfHwge30pOwogICAgICAgIGVsZW1lbnQuY3NzKHN0eWxlcyk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAbmdkb2Mgc2VydmljZQogICAgICogQG5hbWUgJGFuaW1hdGUKICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgJGFuaW1hdGUgc2VydmljZSBwcm92aWRlcyBydWRpbWVudGFyeSBET00gbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyB0bwogICAgICogaW5zZXJ0LCByZW1vdmUgYW5kIG1vdmUgZWxlbWVudHMgd2l0aGluIHRoZSBET00sIGFzIHdlbGwgYXMgYWRkaW5nIGFuZCByZW1vdmluZyBjbGFzc2VzLgogICAgICogVGhpcyBzZXJ2aWNlIGlzIHRoZSBjb3JlIHNlcnZpY2UgdXNlZCBieSB0aGUgbmdBbmltYXRlICRhbmltYXRvciBzZXJ2aWNlIHdoaWNoIHByb3ZpZGVzCiAgICAgKiBoaWdoLWxldmVsIGFuaW1hdGlvbiBob29rcyBmb3IgQ1NTIGFuZCBKYXZhU2NyaXB0LgogICAgICoKICAgICAqICRhbmltYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgQW5ndWxhckpTIGNvcmUsIGhvd2V2ZXIsIHRoZSBuZ0FuaW1hdGUgbW9kdWxlIG11c3QgYmUgaW5jbHVkZWQKICAgICAqIHRvIGVuYWJsZSBmdWxsIG91dCBhbmltYXRpb24gc3VwcG9ydC4gT3RoZXJ3aXNlLCAkYW5pbWF0ZSB3aWxsIG9ubHkgcGVyZm9ybSBzaW1wbGUgRE9NCiAgICAgKiBtYW5pcHVsYXRpb24gb3BlcmF0aW9ucy4KICAgICAqCiAgICAgKiBUbyBsZWFybiBtb3JlIGFib3V0IGVuYWJsaW5nIGFuaW1hdGlvbiBzdXBwb3J0LCBjbGljayBoZXJlIHRvIHZpc2l0IHRoZSB7QGxpbmsgbmdBbmltYXRlCiAgICAgKiBuZ0FuaW1hdGUgbW9kdWxlIHBhZ2V9IGFzIHdlbGwgYXMgdGhlIHtAbGluayBuZ0FuaW1hdGUuJGFuaW1hdGUgbmdBbmltYXRlICRhbmltYXRlIHNlcnZpY2UKICAgICAqIHBhZ2V9LgogICAgICovCiAgICByZXR1cm4gewogICAgICBhbmltYXRlOiBmdW5jdGlvbihlbGVtZW50LCBmcm9tLCB0bykgewogICAgICAgIGFwcGx5U3R5bGVzKGVsZW1lbnQsIHsgZnJvbTogZnJvbSwgdG86IHRvIH0pOwogICAgICAgIHJldHVybiBhc3luY1Byb21pc2UoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRhbmltYXRlI2VudGVyCiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqIEBkZXNjcmlwdGlvbiBJbnNlcnRzIHRoZSBlbGVtZW50IGludG8gdGhlIERPTSBlaXRoZXIgYWZ0ZXIgdGhlIGBhZnRlcmAgZWxlbWVudCBvcgogICAgICAgKiBhcyB0aGUgZmlyc3QgY2hpbGQgd2l0aGluIHRoZSBgcGFyZW50YCBlbGVtZW50LiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlCiAgICAgICAqIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUuCiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIERPTQogICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudCB0aGUgcGFyZW50IGVsZW1lbnQgd2hpY2ggd2lsbCBhcHBlbmQgdGhlIGVsZW1lbnQgYXMKICAgICAgICogICBhIGNoaWxkIChpZiB0aGUgYWZ0ZXIgZWxlbWVudCBpcyBub3QgcHJlc2VudCkKICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBhZnRlciB0aGUgc2libGluZyBlbGVtZW50IHdoaWNoIHdpbGwgYXBwZW5kIHRoZSBlbGVtZW50CiAgICAgICAqICAgYWZ0ZXIgaXRzZWxmCiAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIHN0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC4KICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlCiAgICAgICAqLwogICAgICBlbnRlcjogZnVuY3Rpb24oZWxlbWVudCwgcGFyZW50LCBhZnRlciwgb3B0aW9ucykgewogICAgICAgIGFwcGx5U3R5bGVzKGVsZW1lbnQsIG9wdGlvbnMpOwogICAgICAgIGFmdGVyID8gYWZ0ZXIuYWZ0ZXIoZWxlbWVudCkKICAgICAgICAgICAgICA6IHBhcmVudC5wcmVwZW5kKGVsZW1lbnQpOwogICAgICAgIHJldHVybiBhc3luY1Byb21pc2UoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRhbmltYXRlI2xlYXZlCiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHRoZSBlbGVtZW50IGZyb20gdGhlIERPTS4gV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGEgcHJvbWlzZQogICAgICAgKiBpcyByZXR1cm5lZCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgYXQgYSBsYXRlciB0aW1lLgogICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTQogICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKICAgICAgICovCiAgICAgIGxlYXZlOiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7CiAgICAgICAgZWxlbWVudC5yZW1vdmUoKTsKICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICoKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNtb3ZlCiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqIEBkZXNjcmlwdGlvbiBNb3ZlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnQgd2l0aGluIHRoZSBET00gdG8gYmUgcGxhY2VkCiAgICAgICAqIGVpdGhlciBhZnRlciB0aGUgYGFmdGVyYCBlbGVtZW50IG9yIGluc2lkZSBvZiB0aGUgYHBhcmVudGAgZWxlbWVudC4gV2hlbiB0aGUgZnVuY3Rpb24KICAgICAgICogaXMgY2FsbGVkIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgYXQgYSBsYXRlciB0aW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBtb3ZlZCBhcm91bmQgd2l0aGluIHRoZQogICAgICAgKiAgIERPTQogICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudCB0aGUgcGFyZW50IGVsZW1lbnQgd2hlcmUgdGhlIGVsZW1lbnQgd2lsbCBiZQogICAgICAgKiAgIGluc2VydGVkIGludG8gKGlmIHRoZSBhZnRlciBlbGVtZW50IGlzIG5vdCBwcmVzZW50KQogICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGFmdGVyIHRoZSBzaWJsaW5nIGVsZW1lbnQgd2hlcmUgdGhlIGVsZW1lbnQgd2lsbCBiZQogICAgICAgKiAgIHBvc2l0aW9uZWQgbmV4dCB0bwogICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKICAgICAgICovCiAgICAgIG1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQsIHBhcmVudCwgYWZ0ZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBEbyBub3QgcmVtb3ZlIGVsZW1lbnQgYmVmb3JlIGluc2VydC4gUmVtb3Zpbmcgd2lsbCBjYXVzZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgICAvLyBlbGVtZW50IHRvIGJlIGRyb3BwZWQuIEluc2VydCB3aWxsIGltcGxpY2l0bHkgZG8gdGhlIHJlbW92ZS4KICAgICAgICByZXR1cm4gdGhpcy5lbnRlcihlbGVtZW50LCBwYXJlbnQsIGFmdGVyLCBvcHRpb25zKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRhbmltYXRlI2FkZENsYXNzCiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIHRoZSBwcm92aWRlZCBjbGFzc05hbWUgQ1NTIGNsYXNzIHZhbHVlIHRvIHRoZSBwcm92aWRlZCBlbGVtZW50LgogICAgICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUuCiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGhhdmUgdGhlIGNsYXNzTmFtZSB2YWx1ZQogICAgICAgKiAgIGFkZGVkIHRvIGl0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50CiAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuCiAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZQogICAgICAgKi8KICAgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSwgb3B0aW9ucykgewogICAgICAgIHJldHVybiB0aGlzLnNldENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSwgW10sIG9wdGlvbnMpOwogICAgICB9LAoKICAgICAgJCRhZGRDbGFzc0ltbWVkaWF0ZWx5OiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUsIG9wdGlvbnMpIHsKICAgICAgICBlbGVtZW50ID0ganFMaXRlKGVsZW1lbnQpOwogICAgICAgIGNsYXNzTmFtZSA9ICFpc1N0cmluZyhjbGFzc05hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gKGlzQXJyYXkoY2xhc3NOYW1lKSA/IGNsYXNzTmFtZS5qb2luKCcgJykgOiAnJykKICAgICAgICAgICAgICAgICAgICAgICAgOiBjbGFzc05hbWU7CiAgICAgICAgZm9yRWFjaChlbGVtZW50LCBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgICBqcUxpdGVBZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpOwogICAgICAgIH0pOwogICAgICAgIGFwcGx5U3R5bGVzKGVsZW1lbnQsIG9wdGlvbnMpOwogICAgICAgIHJldHVybiBhc3luY1Byb21pc2UoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRhbmltYXRlI3JlbW92ZUNsYXNzCiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHRoZSBwcm92aWRlZCBjbGFzc05hbWUgQ1NTIGNsYXNzIHZhbHVlIGZyb20gdGhlIHByb3ZpZGVkIGVsZW1lbnQuCiAgICAgICAqIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhIHByb21pc2UgaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZS4KICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHdpbGwgaGF2ZSB0aGUgY2xhc3NOYW1lIHZhbHVlCiAgICAgICAqICAgcmVtb3ZlZCBmcm9tIGl0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyB3aGljaCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudAogICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKICAgICAgICovCiAgICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXRDbGFzcyhlbGVtZW50LCBbXSwgY2xhc3NOYW1lLCBvcHRpb25zKTsKICAgICAgfSwKCiAgICAgICQkcmVtb3ZlQ2xhc3NJbW1lZGlhdGVseTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lLCBvcHRpb25zKSB7CiAgICAgICAgZWxlbWVudCA9IGpxTGl0ZShlbGVtZW50KTsKICAgICAgICBjbGFzc05hbWUgPSAhaXNTdHJpbmcoY2xhc3NOYW1lKQogICAgICAgICAgICAgICAgICAgICAgICA/IChpc0FycmF5KGNsYXNzTmFtZSkgPyBjbGFzc05hbWUuam9pbignICcpIDogJycpCiAgICAgICAgICAgICAgICAgICAgICAgIDogY2xhc3NOYW1lOwogICAgICAgIGZvckVhY2goZWxlbWVudCwgZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAganFMaXRlUmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTsKICAgICAgICB9KTsKICAgICAgICBhcHBseVN0eWxlcyhlbGVtZW50LCBvcHRpb25zKTsKICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICoKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNzZXRDbGFzcwogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhbmQvb3IgcmVtb3ZlcyB0aGUgZ2l2ZW4gQ1NTIGNsYXNzZXMgdG8gYW5kIGZyb20gdGhlIGVsZW1lbnQuCiAgICAgICAqIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhIHByb21pc2UgaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZS4KICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHdpbGwgaGF2ZSBpdHMgQ1NTIGNsYXNzZXMgY2hhbmdlZAogICAgICAgKiAgIHJlbW92ZWQgZnJvbSBpdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkIHRoZSBDU1MgY2xhc3NlcyB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdmUgdGhlIENTUyBjbGFzcyB3aGljaCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudAogICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKICAgICAgICovCiAgICAgIHNldENsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBhZGQsIHJlbW92ZSwgb3B0aW9ucykgewogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICB2YXIgU1RPUkFHRV9LRVkgPSAnJCRhbmltYXRlQ2xhc3Nlcyc7CiAgICAgICAgdmFyIGNyZWF0ZWRDYWNoZSA9IGZhbHNlOwogICAgICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7CgogICAgICAgIHZhciBjYWNoZSA9IGVsZW1lbnQuZGF0YShTVE9SQUdFX0tFWSk7CiAgICAgICAgaWYgKCFjYWNoZSkgewogICAgICAgICAgY2FjaGUgPSB7CiAgICAgICAgICAgIGNsYXNzZXM6IHt9LAogICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zCiAgICAgICAgICB9OwogICAgICAgICAgY3JlYXRlZENhY2hlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgY2FjaGUub3B0aW9ucykgewogICAgICAgICAgY2FjaGUub3B0aW9ucyA9IGFuZ3VsYXIuZXh0ZW5kKGNhY2hlLm9wdGlvbnMgfHwge30sIG9wdGlvbnMpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGNsYXNzZXMgPSBjYWNoZS5jbGFzc2VzOwoKICAgICAgICBhZGQgPSBpc0FycmF5KGFkZCkgPyBhZGQgOiBhZGQuc3BsaXQoJyAnKTsKICAgICAgICByZW1vdmUgPSBpc0FycmF5KHJlbW92ZSkgPyByZW1vdmUgOiByZW1vdmUuc3BsaXQoJyAnKTsKICAgICAgICBjYWNoZWRDbGFzc01hbmlwdWxhdGlvbihjbGFzc2VzLCBhZGQsIHRydWUpOwogICAgICAgIGNhY2hlZENsYXNzTWFuaXB1bGF0aW9uKGNsYXNzZXMsIHJlbW92ZSwgZmFsc2UpOwoKICAgICAgICBpZiAoY3JlYXRlZENhY2hlKSB7CiAgICAgICAgICBjYWNoZS5wcm9taXNlID0gcnVuQW5pbWF0aW9uUG9zdERpZ2VzdChmdW5jdGlvbihkb25lKSB7CiAgICAgICAgICAgIHZhciBjYWNoZSA9IGVsZW1lbnQuZGF0YShTVE9SQUdFX0tFWSk7CiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRGF0YShTVE9SQUdFX0tFWSk7CgogICAgICAgICAgICAvLyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGJlZm9yZSBwb3N0RGlnZXN0CiAgICAgICAgICAgIC8vIGlzIHJ1biB0aGVuIHRoZSBjYWNoZSB3aWxsIGJlIHVuZGVmaW5lZCBhbmQgdGhlcmUgd2lsbCBiZQogICAgICAgICAgICAvLyBubyBuZWVkIGFueW1vcmUgdG8gYWRkIG9yIHJlbW92ZSBhbmQgb2YgdGhlIGVsZW1lbnQgY2xhc3NlcwogICAgICAgICAgICBpZiAoY2FjaGUpIHsKICAgICAgICAgICAgICB2YXIgY2xhc3NlcyA9IHJlc29sdmVFbGVtZW50Q2xhc3NlcyhlbGVtZW50LCBjYWNoZS5jbGFzc2VzKTsKICAgICAgICAgICAgICBpZiAoY2xhc3NlcykgewogICAgICAgICAgICAgICAgc2VsZi4kJHNldENsYXNzSW1tZWRpYXRlbHkoZWxlbWVudCwgY2xhc3Nlc1swXSwgY2xhc3Nlc1sxXSwgY2FjaGUub3B0aW9ucyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGVsZW1lbnQuZGF0YShTVE9SQUdFX0tFWSwgY2FjaGUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNhY2hlLnByb21pc2U7CiAgICAgIH0sCgogICAgICAkJHNldENsYXNzSW1tZWRpYXRlbHk6IGZ1bmN0aW9uKGVsZW1lbnQsIGFkZCwgcmVtb3ZlLCBvcHRpb25zKSB7CiAgICAgICAgYWRkICYmIHRoaXMuJCRhZGRDbGFzc0ltbWVkaWF0ZWx5KGVsZW1lbnQsIGFkZCk7CiAgICAgICAgcmVtb3ZlICYmIHRoaXMuJCRyZW1vdmVDbGFzc0ltbWVkaWF0ZWx5KGVsZW1lbnQsIHJlbW92ZSk7CiAgICAgICAgYXBwbHlTdHlsZXMoZWxlbWVudCwgb3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIGFzeW5jUHJvbWlzZSgpOwogICAgICB9LAoKICAgICAgZW5hYmxlZDogbm9vcCwKICAgICAgY2FuY2VsOiBub29wCiAgICB9OwogIH1dOwp9XTsKCmZ1bmN0aW9uICQkQXN5bmNDYWxsYmFja1Byb3ZpZGVyKCkgewogIHRoaXMuJGdldCA9IFsnJCRyQUYnLCAnJHRpbWVvdXQnLCBmdW5jdGlvbigkJHJBRiwgJHRpbWVvdXQpIHsKICAgIHJldHVybiAkJHJBRi5zdXBwb3J0ZWQKICAgICAgPyBmdW5jdGlvbihmbikgeyByZXR1cm4gJCRyQUYoZm4pOyB9CiAgICAgIDogZnVuY3Rpb24oZm4pIHsKICAgICAgICByZXR1cm4gJHRpbWVvdXQoZm4sIDAsIGZhbHNlKTsKICAgICAgfTsKICB9XTsKfQoKLyogZ2xvYmFsIHN0cmlwSGFzaDogdHJ1ZSAqLwoKLyoqCiAqICEgVGhpcyBpcyBhIHByaXZhdGUgdW5kb2N1bWVudGVkIHNlcnZpY2UgIQogKgogKiBAbmFtZSAkYnJvd3NlcgogKiBAcmVxdWlyZXMgJGxvZwogKiBAZGVzY3JpcHRpb24KICogVGhpcyBvYmplY3QgaGFzIHR3byBnb2FsczoKICoKICogLSBoaWRlIGFsbCB0aGUgZ2xvYmFsIHN0YXRlIGluIHRoZSBicm93c2VyIGNhdXNlZCBieSB0aGUgd2luZG93IG9iamVjdAogKiAtIGFic3RyYWN0IGF3YXkgYWxsIHRoZSBicm93c2VyIHNwZWNpZmljIGZlYXR1cmVzIGFuZCBpbmNvbnNpc3RlbmNpZXMKICoKICogRm9yIHRlc3RzIHdlIHByb3ZpZGUge0BsaW5rIG5nTW9jay4kYnJvd3NlciBtb2NrIGltcGxlbWVudGF0aW9ufSBvZiB0aGUgYCRicm93c2VyYAogKiBzZXJ2aWNlLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgY29udmVuaWVudCB0ZXN0aW5nIG9mIHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB3aXRoCiAqIHRoZSByZWFsIGJyb3dzZXIgYXBpcy4KICovCi8qKgogKiBAcGFyYW0ge29iamVjdH0gd2luZG93IFRoZSBnbG9iYWwgd2luZG93IG9iamVjdC4KICogQHBhcmFtIHtvYmplY3R9IGRvY3VtZW50IGpRdWVyeSB3cmFwcGVkIGRvY3VtZW50LgogKiBAcGFyYW0ge29iamVjdH0gJGxvZyB3aW5kb3cuY29uc29sZSBvciBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBpbnRlcmZhY2UuCiAqIEBwYXJhbSB7b2JqZWN0fSAkc25pZmZlciAkc25pZmZlciBzZXJ2aWNlCiAqLwpmdW5jdGlvbiBCcm93c2VyKHdpbmRvdywgZG9jdW1lbnQsICRsb2csICRzbmlmZmVyKSB7CiAgdmFyIHNlbGYgPSB0aGlzLAogICAgICByYXdEb2N1bWVudCA9IGRvY3VtZW50WzBdLAogICAgICBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbiwKICAgICAgaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5LAogICAgICBzZXRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQsCiAgICAgIGNsZWFyVGltZW91dCA9IHdpbmRvdy5jbGVhclRpbWVvdXQsCiAgICAgIHBlbmRpbmdEZWZlcklkcyA9IHt9OwoKICBzZWxmLmlzTW9jayA9IGZhbHNlOwoKICB2YXIgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSAwOwogIHZhciBvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3MgPSBbXTsKCiAgLy8gVE9ETyh2b2p0YSk6IHJlbW92ZSB0aGlzIHRlbXBvcmFyeSBhcGkKICBzZWxmLiQkY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QgPSBjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdDsKICBzZWxmLiQkaW5jT3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSBmdW5jdGlvbigpIHsgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQrKzsgfTsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24oc3VwcG9ydHMgY3VycnlpbmcpIGFuZCBkZWNyZW1lbnRzIHRoZSBgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzYAogICAqIGNvdW50ZXIuIElmIHRoZSBjb3VudGVyIHJlYWNoZXMgMCwgYWxsIHRoZSBgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzYCBhcmUgZXhlY3V0ZWQuCiAgICovCiAgZnVuY3Rpb24gY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuLmFwcGx5KG51bGwsIHNsaWNlQXJncyhhcmd1bWVudHMsIDEpKTsKICAgIH0gZmluYWxseSB7CiAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENvdW50LS07CiAgICAgIGlmIChvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCA9PT0gMCkgewogICAgICAgIHdoaWxlIChvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3MubGVuZ3RoKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3MucG9wKCkoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgJGxvZy5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEBwcml2YXRlCiAgICogTm90ZTogdGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IGJ5IHNjZW5hcmlvIHJ1bm5lcgogICAqIFRPRE8odm9qdGEpOiBwcmVmaXggdGhpcyBtZXRob2Qgd2l0aCAkJCA/CiAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBjYWxsYmFjayBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gbm8gb3V0c3RhbmRpbmcgcmVxdWVzdAogICAqLwogIHNlbGYubm90aWZ5V2hlbk5vT3V0c3RhbmRpbmdSZXF1ZXN0cyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAvLyBmb3JjZSBicm93c2VyIHRvIGV4ZWN1dGUgYWxsIHBvbGxGbnMgLSB0aGlzIGlzIG5lZWRlZCBzbyB0aGF0IGNvb2tpZXMgYW5kIG90aGVyIHBvbGxlcnMgZmlyZQogICAgLy8gYXQgc29tZSBkZXRlcm1pbmlzdGljIHRpbWUgaW4gcmVzcGVjdCB0byB0aGUgdGVzdCBydW5uZXIncyBhY3Rpb25zLiBMZWF2aW5nIHRoaW5ncyB1cCB0byB0aGUKICAgIC8vIHJlZ3VsYXIgcG9sbGVyIHdvdWxkIHJlc3VsdCBpbiBmbGFreSB0ZXN0cy4KICAgIGZvckVhY2gocG9sbEZucywgZnVuY3Rpb24ocG9sbEZuKSB7IHBvbGxGbigpOyB9KTsKCiAgICBpZiAob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPT09IDApIHsKICAgICAgY2FsbGJhY2soKTsKICAgIH0gZWxzZSB7CiAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIFBvbGwgV2F0Y2hlciBBUEkKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL4zc71YtYwEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8KkAAQAZus8CoBzbAqAdglSIf9Vh6fNNBtHX4gBAJpJW9AAABAQgKAKNeuwBNpbeM3O9WLWMBAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/80t9AAEAGuDXAqAdgwKgHNh/1lSJBtHX4WHp804AYAVOv1QAAAQEICgBNpbcAo167Ly8vLy8vLy8vCiAgdmFyIHBvbGxGbnMgPSBbXSwKICAgICAgcG9sbFRpbWVvdXQ7CgogIC8qKgogICAqIEBuYW1lICRicm93c2VyI2FkZFBvbGxGbgogICAqCiAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBQb2xsIGZ1bmN0aW9uIHRvIGFkZAogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHBvbGxlciBwZXJpb2RpY2FsbHkgZXhlY3V0ZXMsCiAgICogYW5kIHN0YXJ0cyBwb2xsaW5nIGlmIG5vdCBzdGFydGVkIHlldC4KICAgKgogICAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSB0aGUgYWRkZWQgZnVuY3Rpb24KICAgKi8KICBzZWxmLmFkZFBvbGxGbiA9IGZ1bmN0aW9uKGZuKSB7CiAgICBpZiAoaXNVbmRlZmluZWQocG9sbFRpbWVvdXQpKSBzdGFydFBvbGxlcigxMDAsIHNldFRpbWVvdXQpOwogICAgcG9sbEZucy5wdXNoKGZuKTsKICAgIHJldHVybiBmbjsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWwgSG93IG9mdGVuIHNob3VsZCBicm93c2VyIGNhbGwgcG9sbCBmdW5jdGlvbnMgKG1zKQogICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gc2V0VGltZW91dCBSZWZlcmVuY2UgdG8gYSByZWFsIG9yIGZha2UgYHNldFRpbWVvdXRgIGZ1bmN0aW9uLgogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogQ29uZmlndXJlcyB0aGUgcG9sbGVyIHRvIHJ1biBpbiB0aGUgc3BlY2lmaWVkIGludGVydmFscywgdXNpbmcgdGhlIHNwZWNpZmllZAogICAqIHNldFRpbWVvdXQgZm4gYW5kIGtpY2tzIGl0IG9mZi4KICAgKi8KICBmdW5jdGlvbiBzdGFydFBvbGxlcihpbnRlcnZhbCwgc2V0VGltZW91dCkgewogICAgKGZ1bmN0aW9uIGNoZWNrKCkgewogICAgICBmb3JFYWNoKHBvbGxGbnMsIGZ1bmN0aW9uKHBvbGxGbikgeyBwb2xsRm4oKTsgfSk7CiAgICAgIHBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgaW50ZXJ2YWwpOwogICAgfSkoKTsKICB9CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gVVJMIEFQSQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIHZhciBjYWNoZWRTdGF0ZSwgbGFzdEhpc3RvcnlTdGF0ZSwKICAgICAgbGFzdEJyb3dzZXJVcmwgPSBsb2NhdGlvbi5ocmVmLAogICAgICBiYXNlRWxlbWVudCA9IGRvY3VtZW50LmZpbmQoJ2Jhc2UnKSwKICAgICAgcmVsb2FkTG9jYXRpb24gPSBudWxsOwoKICBjYWNoZVN0YXRlKCk7CiAgbGFzdEhpc3RvcnlTdGF0ZSA9IGNhY2hlZFN0YXRlOwoKICAvKioKICAgKiBAbmFtZSAkYnJvd3NlciN1cmwKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIEdFVFRFUjoKICAgKiBXaXRob3V0IGFueSBhcmd1bWVudCwgdGhpcyBtZXRob2QganVzdCByZXR1cm5zIGN1cnJlbnQgdmFsdWUgb2YgbG9jYXRpb24uaHJlZi4KICAgKgogICAqIFNFVFRFUjoKICAgKiBXaXRoIGF0IGxlYXN0IG9uZSBhcmd1bWVudCwgdGhpcyBtZXRob2Qgc2V0cyB1cmwgdG8gbmV3IHZhbHVlLgogICAqIElmIGh0bWw1IGhpc3RvcnkgYXBpIHN1cHBvcnRlZCwgcHVzaFN0YXRlL3JlcGxhY2VTdGF0ZSBpcyB1c2VkLCBvdGhlcndpc2UKICAgKiBsb2NhdGlvbi5ocmVmL2xvY2F0aW9uLnJlcGxhY2UgaXMgdXNlZC4KICAgKiBSZXR1cm5zIGl0cyBvd24gaW5zdGFuY2UgdG8gYWxsb3cgY2hhaW5pbmcKICAgKgogICAqIE5PVEU6IHRoaXMgYXBpIGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBieSB0aGUgJGxvY2F0aW9uIHNlcnZpY2UuIFBsZWFzZSB1c2UgdGhlCiAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiAkbG9jYXRpb24gc2VydmljZX0gdG8gY2hhbmdlIHVybC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgTmV3IHVybCAod2hlbiB1c2VkIGFzIHNldHRlcikKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZXBsYWNlIFNob3VsZCBuZXcgdXJsIHJlcGxhY2UgY3VycmVudCBoaXN0b3J5IHJlY29yZD8KICAgKiBAcGFyYW0ge29iamVjdD19IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aCBwdXNoU3RhdGUvcmVwbGFjZVN0YXRlCiAgICovCiAgc2VsZi51cmwgPSBmdW5jdGlvbih1cmwsIHJlcGxhY2UsIHN0YXRlKSB7CiAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMgYGhpc3Rvcnkuc3RhdGVgIGlzIGBudWxsYCBieSBkZWZhdWx0OyB0cmVhdGluZyBpdCBzZXBhcmF0ZWx5CiAgICAvLyBmcm9tIGB1bmRlZmluZWRgIHdvdWxkIGNhdXNlIGAkYnJvd3Nlci51cmwoJy9mb28nKWAgdG8gY2hhbmdlIGBoaXN0b3J5LnN0YXRlYAogICAgLy8gdG8gdW5kZWZpbmVkIHZpYSBgcHVzaFN0YXRlYC4gSW5zdGVhZCwgbGV0J3MgY2hhbmdlIGB1bmRlZmluZWRgIHRvIGBudWxsYCBoZXJlLgogICAgaWYgKGlzVW5kZWZpbmVkKHN0YXRlKSkgewogICAgICBzdGF0ZSA9IG51bGw7CiAgICB9CgogICAgLy8gQW5kcm9pZCBCcm93c2VyIEJGQ2FjaGUgY2F1c2VzIGxvY2F0aW9uLCBoaXN0b3J5IHJlZmVyZW5jZSB0byBiZWNvbWUgc3RhbGUuCiAgICBpZiAobG9jYXRpb24gIT09IHdpbmRvdy5sb2NhdGlvbikgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247CiAgICBpZiAoaGlzdG9yeSAhPT0gd2luZG93Lmhpc3RvcnkpIGhpc3RvcnkgPSB3aW5kb3cuaGlzdG9yeTsKCiAgICAvLyBzZXR0ZXIKICAgIGlmICh1cmwpIHsKICAgICAgdmFyIHNhbWVTdGF0ZSA9IGxhc3RIaXN0b3J5U3RhdGUgPT09IHN0YXRlOwoKICAgICAgLy8gRG9uJ3QgY2hhbmdlIGFueXRoaW5nIGlmIHByZXZpb3VzIGFuZCBjdXJyZW50IFVSTHMgYW5kIHN0YXRlcyBtYXRjaC4gVGhpcyBhbHNvIHByZXZlbnRzCiAgICAgIC8vIElFPDEwIGZyb20gZ2V0dGluZyBpbnRvIHJlZGlyZWN0IGxvb3Agd2hlbiBpbiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybCBtb2RlLgogICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9jb21taXQvZmZiMjcwMQogICAgICBpZiAobGFzdEJyb3dzZXJVcmwgPT09IHVybCAmJiAoISRzbmlmZmVyLmhpc3RvcnkgfHwgc2FtZVN0YXRlKSkgewogICAgICAgIHJldHVybiBzZWxmOwogICAgICB9CiAgICAgIHZhciBzYW1lQmFzZSA9IGxhc3RCcm93c2VyVXJsICYmIHN0cmlwSGFzaChsYXN0QnJvd3NlclVybCkgPT09IHN0cmlwSGFzaCh1cmwpOwogICAgICBsYXN0QnJvd3NlclVybCA9IHVybDsKICAgICAgbGFzdEhpc3RvcnlTdGF0ZSA9IHN0YXRlOwogICAgICAvLyBEb24ndCB1c2UgaGlzdG9yeSBBUEkgaWYgb25seSB0aGUgaGFzaCBjaGFuZ2VkCiAgICAgIC8vIGR1ZSB0byBhIGJ1ZyBpbiBJRTEwL0lFMTEgd2hpY2ggbGVhZHMKICAgICAgLy8gdG8gbm90IGZpcmluZyBhIGBoYXNoY2hhbmdlYCBub3IgYHBvcHN0YXRlYCBldmVudAogICAgICAvLyBpbiBzb21lIGNhc2VzIChzZWUgIzkxNDMpLgogICAgICBpZiAoJHNuaWZmZXIuaGlzdG9yeSAmJiAoIXNhbWVCYXNlIHx8ICFzYW1lU3RhdGUpKSB7CiAgICAgICAgaGlzdG9yeVtyZXBsYWNlID8gJ3JlcGxhY2VTdGF0ZScgOiAncHVzaFN0YXRlJ10oc3RhdGUsICcnLCB1cmwpOwogICAgICAgIGNhY2hlU3RhdGUoKTsKICAgICAgICAvLyBEbyB0aGUgYXNzaWdubWVudCBhZ2FpbiBzbyB0aGF0IHRob3NlIHR3byB2YXJpYWJsZXMgYXJlIHJlZmVyZW50aWFsbHkgaWRlbnRpY2FsLgogICAgICAgIGxhc3RIaXN0b3J5U3RhdGUgPSBjYWNoZWRTdGF0ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXNhbWVCYXNlKSB7CiAgICAgICAgICByZWxvYWRMb2NhdGlvbiA9IHVybDsKICAgICAgICB9CiAgICAgICAgaWYgKHJlcGxhY2UpIHsKICAgICAgICAgIGxvY2F0aW9uLnJlcGxhY2UodXJsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHVybDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNlbGY7CiAgICAvLyBnZXR0ZXIKICAgIH0gZWxzZSB7CiAgICAgIC8vIC0gcmVsb2FkTG9jYXRpb24gaXMgbmVlZGVkIGFzIGJyb3dzZXJzIGRvbid0IGFsbG93IHRvIHJlYWQgb3V0CiAgICAgIC8vICAgdGhlIG5ldyBsb2NhdGlvbi5ocmVmIGlmIGEgcmVsb2FkIGhhcHBlbmVkLgogICAgICAvLyAtIHRoZSByZXBsYWNlbWVudCBpcyBhIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQwNzE3MgogICAgICByZXR1cm4gcmVsb2FkTG9jYXRpb24gfHwgbG9jYXRpb24uaHJlZi5yZXBsYWNlKC8lMjcvZywiJyIpOwogICAgfQogIH07CgogIC8qKgogICAqIEBuYW1lICRicm93c2VyI3N0YXRlCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBUaGlzIG1ldGhvZCBpcyBhIGdldHRlci4KICAgKgogICAqIFJldHVybiBoaXN0b3J5LnN0YXRlIG9yIG51bGwgaWYgaGlzdG9yeS5zdGF0ZSBpcyB1bmRlZmluZWQuCiAgICoKICAgKiBAcmV0dXJucyB7b2JqZWN0fSBzdGF0ZQogICAqLwogIHNlbGYuc3RhdGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjYWNoZWRTdGF0ZTsKICB9OwoKICB2YXIgdXJsQ2hhbmdlTGlzdGVuZXJzID0gW10sCiAgICAgIHVybENoYW5nZUluaXQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gY2FjaGVTdGF0ZUFuZEZpcmVVcmxDaGFuZ2UoKSB7CiAgICBjYWNoZVN0YXRlKCk7CiAgICBmaXJlVXJsQ2hhbmdlKCk7CiAgfQoKICAvLyBUaGlzIHZhcmlhYmxlIHNob3VsZCBiZSB1c2VkICpvbmx5KiBpbnNpZGUgdGhlIGNhY2hlU3RhdGUgZnVuY3Rpb24uCiAgdmFyIGxhc3RDYWNoZWRTdGF0ZSA9IG51bGw7CiAgZnVuY3Rpb24gY2FjaGVTdGF0ZSgpIHsKICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlIGluICRicm93c2VyIHdoZXJlIGBoaXN0b3J5LnN0YXRlYCBpcyByZWFkLgogICAgY2FjaGVkU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTsKICAgIGNhY2hlZFN0YXRlID0gaXNVbmRlZmluZWQoY2FjaGVkU3RhdGUpID8gbnVsbCA6IGNhY2hlZFN0YXRlOwoKICAgIC8vIFByZXZlbnQgY2FsbGJhY2tzIGZvIGZpcmUgdHdpY2UgaWYgYm90aCBoYXNoY2hhbmdlICYgcG9wc3RhdGUgd2VyZSBmaXJlZC4KICAgIGlmIChlcXVhbHMoY2FjaGVkU3RhdGUsIGxhc3RDYWNoZWRTdGF0ZSkpIHsKICAgICAgY2FjaGVkU3RhdGUgPSBsYXN0Q2FjaGVkU3RhdGU7CiAgICB9CiAgICBsYXN0Q2FjaGVkU3RhdGUgPSBjYWNoZWRTdGF0ZTsKICB9CgogIGZ1bmN0aW9uIGZpcmVVcmxDaGFuZ2UoKSB7CiAgICBpZiAobGFzdEJyb3dzZXJVcmwgPT09IHNlbGYudXJsKCkgJiYgbGFzdEhpc3RvcnlTdGF0ZSA9PT0gY2FjaGVkU3RhdGUpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxhc3RCcm93c2VyVXJsID0gc2VsZi51cmwoKTsKICAgIGxhc3RIaXN0b3J5U3RhdGUgPSBjYWNoZWRTdGF0ZTsKICAgIGZvckVhY2godXJsQ2hhbmdlTGlzdGVuZXJzLCBmdW5jdGlvbihsaXN0ZW5lcikgewogICAgICBsaXN0ZW5lcihzZWxmLnVybCgpLCBjYWNoZWRTdGF0ZSk7CiAgICB9KTsKICB9CgogIC8qKgogICAqIEBuYW1lICRicm93c2VyI29uVXJsQ2hhbmdlCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBSZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkLCB3aGVuIHVybCBjaGFuZ2VzLgogICAqCiAgICogSXQncyBvbmx5IGNhbGxlZCB3aGVuIHRoZSB1cmwgaXMgY2hhbmdlZCBmcm9tIG91dHNpZGUgb2YgYW5ndWxhcjoKICAgKiAtIHVzZXIgdHlwZXMgZGlmZmVyZW50IHVybCBpbnRvIGFkZHJlc3MgYmFyCiAgICogLSB1c2VyIGNsaWNrcyBvbiBoaXN0b3J5IChmb3J3YXJkL2JhY2spIGJ1dHRvbgogICAqIC0gdXNlciBjbGlja3Mgb24gYSBsaW5rCiAgICoKICAgKiBJdCdzIG5vdCBjYWxsZWQgd2hlbiB1cmwgaXMgY2hhbmdlZCBieSAkYnJvd3Nlci51cmwoKSBtZXRob2QKICAgKgogICAqIFRoZSBsaXN0ZW5lciBnZXRzIGNhbGxlZCB3aXRoIG5ldyB1cmwgYXMgcGFyYW1ldGVyLgogICAqCiAgICogTk9URTogdGhpcyBhcGkgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSAkbG9jYXRpb24gc2VydmljZS4gUGxlYXNlIHVzZSB0aGUKICAgKiB7QGxpbmsgbmcuJGxvY2F0aW9uICRsb2NhdGlvbiBzZXJ2aWNlfSB0byBtb25pdG9yIHVybCBjaGFuZ2VzIGluIGFuZ3VsYXIgYXBwcy4KICAgKgogICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gbGlzdGVuZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdXJsIGNoYW5nZXMuCiAgICogQHJldHVybiB7ZnVuY3Rpb24oc3RyaW5nKX0gUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lciBmbiAtIGhhbmR5IGlmIHRoZSBmbiBpcyBhbm9ueW1vdXMuCiAgICovCiAgc2VsZi5vblVybENoYW5nZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAvLyBUT0RPKHZvanRhKTogcmVmYWN0b3IgdG8gdXNlIG5vZGUncyBzeW50YXggZm9yIGV2ZW50cwogICAgaWYgKCF1cmxDaGFuZ2VJbml0KSB7CiAgICAgIC8vIFdlIGxpc3RlbiBvbiBib3RoIChoYXNoY2hhbmdlL3BvcHN0YXRlKSB3aGVuIGF2YWlsYWJsZSwgYXMgc29tZSBicm93c2VycyAoZS5nLiBPcGVyYSkKICAgICAgLy8gZG9uJ3QgZmlyZSBwb3BzdGF0ZSB3aGVuIHVzZXIgY2hhbmdlIHRoZSBhZGRyZXNzIGJhciBhbmQgZG9uJ3QgZmlyZSBoYXNoY2hhbmdlIHdoZW4gdXJsCiAgICAgIC8vIGNoYW5nZWQgYnkgcHVzaC9yZXBsYWNlU3RhdGUKCiAgICAgIC8vIGh0bWw1IGhpc3RvcnkgYXBpIC0gcG9wc3RhdGUgZXZlbnQKICAgICAgaWYgKCRzbmlmZmVyLmhpc3RvcnkpIGpxTGl0ZSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKTsKICAgICAgLy8gaGFzaGNoYW5nZSBldmVudAogICAgICBqcUxpdGUod2luZG93KS5vbignaGFzaGNoYW5nZScsIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKTsKCiAgICAgIHVybENoYW5nZUluaXQgPSB0cnVlOwogICAgfQoKICAgIHVybENoYW5nZUxpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTsKICAgIHJldHVybiBjYWxsYmFjazsKICB9OwoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciB0aGUgdXJsIGhhcyBjaGFuZ2VkIG91dHNpZGUgb2YgQW5ndWxhci4KICAgKiBOZWVkcyB0byBiZSBleHBvcnRlZCB0byBiZSBhYmxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGRvbmUgaW4gc3luYywKICAgKiBhcyBoYXNoY2hhbmdlL3BvcHN0YXRlIGV2ZW50cyBmaXJlIGluIGFzeW5jLgogICAqLwogIHNlbGYuJCRjaGVja1VybENoYW5nZSA9IGZpcmVVcmxDaGFuZ2U7CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gTWlzYyBBUEkKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAvKioKICAgKiBAbmFtZSAkYnJvd3NlciNiYXNlSHJlZgogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogUmV0dXJucyBjdXJyZW50IDxiYXNlIGhyZWY+CiAgICogKGFsd2F5cyByZWxhdGl2ZSAtIHdpdGhvdXQgZG9tYWluKQogICAqCiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgYmFzZSBocmVmCiAgICovCiAgc2VsZi5iYXNlSHJlZiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhyZWYgPSBiYXNlRWxlbWVudC5hdHRyKCdocmVmJyk7CiAgICByZXR1cm4gaHJlZiA/IGhyZWYucmVwbGFjZSgvXihodHRwcz9cOik/XC9cL1teXC9dKi8sICcnKSA6ICcnOwogIH07CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gQ29va2llcyBBUEkKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIHZhciBsYXN0Q29va2llcyA9IHt9OwogIHZhciBsYXN0Q29va2llU3RyaW5nID0gJyc7CiAgdmFyIGNvb2tpZVBhdGggPSBzZWxmLmJhc2VIcmVmKCk7CgogIGZ1bmN0aW9uIHNhZmVEZWNvZGVVUklDb21wb25lbnQoc3RyKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7CiAgICB9IGNhdGNoIChlKSB7Cg0KjNzvVi1jAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwrQABABm6ywKgHNsCoB2CVIh/1WHp800G0lcCAEAojdXYAAAEBCAoAo167AE2lt4zc71a4dwEAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzS5UAAQAZ3z8CoB2DAqAc2H/WVIkG0lcBYenzTgBABU/A1AAABAQgKAE2luACjXrs3RkU4DQogICAgICByZXR1cm4gc3RyOwogICAgfQogIH0KCiAgLyoqCiAgICogQG5hbWUgJGJyb3dzZXIjY29va2llcwogICAqCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIENvb2tpZSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmc9fSB2YWx1ZSBDb29raWUgdmFsdWUKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFRoZSBjb29raWVzIG1ldGhvZCBwcm92aWRlcyBhICdwcml2YXRlJyBsb3cgbGV2ZWwgYWNjZXNzIHRvIGJyb3dzZXIgY29va2llcy4KICAgKiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBkaXJlY3RseSwgdXNlIHRoZSAkY29va2llIHNlcnZpY2UgaW5zdGVhZC4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWVzIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBhcmd1bWVudHMgdGhhdCB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aCBhcyBmb2xsb3dzOgogICAqCiAgICogLSBjb29raWVzKCkgLT4gaGFzaCBvZiBhbGwgY29va2llcywgdGhpcyBpcyBOT1QgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBzdGF0ZSwgc28gZG8gbm90IG1vZGlmeQogICAqICAgaXQKICAgKiAtIGNvb2tpZXMobmFtZSwgdmFsdWUpIC0+IHNldCBuYW1lIHRvIHZhbHVlLCBpZiB2YWx1ZSBpcyB1bmRlZmluZWQgZGVsZXRlIHRoZSBjb29raWUKICAgKiAtIGNvb2tpZXMobmFtZSkgLT4gdGhlIHNhbWUgYXMgKG5hbWUsIHVuZGVmaW5lZCkgPT0gREVMRVRFUyAobm8gb25lIGNhbGxzIGl0IHJpZ2h0IG5vdyB0aGF0CiAgICogICB3YXkpCiAgICoKICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIYXNoIG9mIGFsbCBjb29raWVzIChpZiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyKQogICAqLwogIHNlbGYuY29va2llcyA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgY29va2llTGVuZ3RoLCBjb29raWVBcnJheSwgY29va2llLCBpLCBpbmRleDsKCiAgICBpZiAobmFtZSkgewogICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJhd0RvY3VtZW50LmNvb2tpZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICI9O3BhdGg9IiArIGNvb2tpZVBhdGggKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7ZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgY29va2llTGVuZ3RoID0gKHJhd0RvY3VtZW50LmNvb2tpZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7cGF0aD0nICsgY29va2llUGF0aCkubGVuZ3RoICsgMTsKCiAgICAgICAgICAvLyBwZXIgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjEwOS50eHQgYnJvd3NlciBtdXN0IGFsbG93IGF0IG1pbmltdW06CiAgICAgICAgICAvLyAtIDMwMCBjb29raWVzCiAgICAgICAgICAvLyAtIDIwIGNvb2tpZXMgcGVyIHVuaXF1ZSBkb21haW4KICAgICAgICAgIC8vIC0gNDA5NiBieXRlcyBwZXIgY29va2llCiAgICAgICAgICBpZiAoY29va2llTGVuZ3RoID4gNDA5NikgewogICAgICAgICAgICAkbG9nLndhcm4oIkNvb2tpZSAnIiArIG5hbWUgKwogICAgICAgICAgICAgICInIHBvc3NpYmx5IG5vdCBzZXQgb3Igb3ZlcmZsb3dlZCBiZWNhdXNlIGl0IHdhcyB0b28gbGFyZ2UgKCIgKwogICAgICAgICAgICAgIGNvb2tpZUxlbmd0aCArICIgPiA0MDk2IGJ5dGVzKSEiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChyYXdEb2N1bWVudC5jb29raWUgIT09IGxhc3RDb29raWVTdHJpbmcpIHsKICAgICAgICBsYXN0Q29va2llU3RyaW5nID0gcmF3RG9jdW1lbnQuY29va2llOwogICAgICAgIGNvb2tpZUFycmF5ID0gbGFzdENvb2tpZVN0cmluZy5zcGxpdCgiOyAiKTsKICAgICAgICBsYXN0Q29va2llcyA9IHt9OwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29va2llQXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZUFycmF5W2ldOwogICAgICAgICAgaW5kZXggPSBjb29raWUuaW5kZXhPZignPScpOwogICAgICAgICAgaWYgKGluZGV4ID4gMCkgeyAvL2lnbm9yZSBuYW1lbGVzcyBjb29raWVzCiAgICAgICAgICAgIG5hbWUgPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgc2VlbiBmb3IgYSBjb29raWUgaXMgdGhlIG1vc3QKICAgICAgICAgICAgLy8gc3BlY2lmaWMgb25lLiAgdmFsdWVzIGZvciB0aGUgc2FtZSBjb29raWUgbmFtZSB0aGF0CiAgICAgICAgICAgIC8vIGZvbGxvdyBhcmUgZm9yIGxlc3Mgc3BlY2lmaWMgcGF0aHMuCiAgICAgICAgICAgIGlmIChsYXN0Q29va2llc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgbGFzdENvb2tpZXNbbmFtZV0gPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGxhc3RDb29raWVzOwogICAgfQogIH07CgoKICAvKioKICAgKiBAbmFtZSAkYnJvd3NlciNkZWZlcgogICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZm4gQSBmdW5jdGlvbiwgd2hvJ3MgZXhlY3V0aW9uIHNob3VsZCBiZSBkZWZlcnJlZC4KICAgKiBAcGFyYW0ge251bWJlcj19IFtkZWxheT0wXSBvZiBtaWxsaXNlY29uZHMgdG8gZGVmZXIgdGhlIGZ1bmN0aW9uIGV4ZWN1dGlvbi4KICAgKiBAcmV0dXJucyB7Kn0gRGVmZXJJZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgdGFzayB2aWEgYCRicm93c2VyLmRlZmVyLmNhbmNlbCgpYC4KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIEV4ZWN1dGVzIGEgZm4gYXN5bmNocm9ub3VzbHkgdmlhIGBzZXRUaW1lb3V0KGZuLCBkZWxheSlgLgogICAqCiAgICogVW5saWtlIHdoZW4gY2FsbGluZyBgc2V0VGltZW91dGAgZGlyZWN0bHksIGluIHRlc3QgdGhpcyBmdW5jdGlvbiBpcyBtb2NrZWQgYW5kIGluc3RlYWQgb2YgdXNpbmcKICAgKiBgc2V0VGltZW91dGAgaW4gdGVzdHMsIHRoZSBmbnMgYXJlIHF1ZXVlZCBpbiBhbiBhcnJheSwgd2hpY2ggY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZmx1c2hlZAogICAqIHZpYSBgJGJyb3dzZXIuZGVmZXIuZmx1c2goKWAuCiAgICoKICAgKi8KICBzZWxmLmRlZmVyID0gZnVuY3Rpb24oZm4sIGRlbGF5KSB7CiAgICB2YXIgdGltZW91dElkOwogICAgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQrKzsKICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIGRlbGV0ZSBwZW5kaW5nRGVmZXJJZHNbdGltZW91dElkXTsKICAgICAgY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoZm4pOwogICAgfSwgZGVsYXkgfHwgMCk7CiAgICBwZW5kaW5nRGVmZXJJZHNbdGltZW91dElkXSA9IHRydWU7CiAgICByZXR1cm4gdGltZW91dElkOwogIH07CgoKICAvKioKICAgKiBAbmFtZSAkYnJvd3NlciNkZWZlci5jYW5jZWwKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIENhbmNlbHMgYSBkZWZlcnJlZCB0YXNrIGlkZW50aWZpZWQgd2l0aCBgZGVmZXJJZGAuCiAgICoKICAgKiBAcGFyYW0geyp9IGRlZmVySWQgVG9rZW4gcmV0dXJuZWQgYnkgdGhlIGAkYnJvd3Nlci5kZWZlcmAgZnVuY3Rpb24uCiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIGhhc24ndCBleGVjdXRlZCB5ZXQgYW5kIHdhcyBzdWNjZXNzZnVsbHkKICAgKiAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQuCiAgICovCiAgc2VsZi5kZWZlci5jYW5jZWwgPSBmdW5jdGlvbihkZWZlcklkKSB7CiAgICBpZiAocGVuZGluZ0RlZmVySWRzW2RlZmVySWRdKSB7CiAgICAgIGRlbGV0ZSBwZW5kaW5nRGVmZXJJZHNbZGVmZXJJZF07CiAgICAgIGNsZWFyVGltZW91dChkZWZlcklkKTsKICAgICAgY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3Qobm9vcCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07Cgp9CgpmdW5jdGlvbiAkQnJvd3NlclByb3ZpZGVyKCkgewogIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckbG9nJywgJyRzbmlmZmVyJywgJyRkb2N1bWVudCcsCiAgICAgIGZ1bmN0aW9uKCR3aW5kb3csICRsb2csICRzbmlmZmVyLCAkZG9jdW1lbnQpIHsKICAgICAgICByZXR1cm4gbmV3IEJyb3dzZXIoJHdpbmRvdywgJGRvY3VtZW50LCAkbG9nLCAkc25pZmZlcik7CiAgICAgIH1dOwp9CgovKioKICogQG5nZG9jIHNlcnZpY2UKICogQG5hbWUgJGNhY2hlRmFjdG9yeQogKgogKiBAZGVzY3JpcHRpb24KICogRmFjdG9yeSB0aGF0IGNvbnN0cnVjdHMge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdHMgYW5kIGdpdmVzIGFjY2VzcyB0bwogKiB0aGVtLgogKgogKiBgYGBqcwogKgogKiAgdmFyIGNhY2hlID0gJGNhY2hlRmFjdG9yeSgnY2FjaGVJZCcpOwogKiAgZXhwZWN0KCRjYWNoZUZhY3RvcnkuZ2V0KCdjYWNoZUlkJykpLnRvQmUoY2FjaGUpOwogKiAgZXhwZWN0KCRjYWNoZUZhY3RvcnkuZ2V0KCdub1N1Y2hDYWNoZUlkJykpLm5vdC50b0JlRGVmaW5lZCgpOwogKgogKiAgY2FjaGUucHV0KCJrZXkiLCAidmFsdWUiKTsKICogIGNhY2hlLnB1dCgiYW5vdGhlciBrZXkiLCAiYW5vdGhlciB2YWx1ZSIpOwogKgogKiAgLy8gV2UndmUgc3BlY2lmaWVkIG5vIG9wdGlvbnMgb24gY3JlYXRpb24KICogIGV4cGVjdChjYWNoZS5pbmZvKCkpLnRvRXF1YWwoe2lkOiAnY2FjaGVJZCcsIHNpemU6IDJ9KTsKICoKICogYGBgCiAqCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjYWNoZUlkIE5hbWUgb3IgaWQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgY2FjaGUuCiAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgY2FjaGUgYmVoYXZpb3IuIFByb3BlcnRpZXM6CiAqCiAqICAgLSBge251bWJlcj19YCBgY2FwYWNpdHlgIOKAlCB0dXJucyB0aGUgY2FjaGUgaW50byBMUlUgY2FjaGUuCiAqCiAqIEByZXR1cm5zIHtvYmplY3R9IE5ld2x5IGNyZWF0ZWQgY2FjaGUgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBzZXQgb2YgbWV0aG9kczoKICoKICogLSBge29iamVjdH1gIGBpbmZvKClgIOKAlCBSZXR1cm5zIGlkLCBzaXplLCBhbmQgb3B0aW9ucyBvZiBjYWNoZS4KICogLSBge3sqfX1gIGBwdXQoe3N0cmluZ30ga2V5LCB7Kn0gdmFsdWUpYCDigJQgUHV0cyBhIG5ldyBrZXktdmFsdWUgcGFpciBpbnRvIHRoZSBjYWNoZSBhbmQgcmV0dXJucwogKiAgIGl0LgogKiAtIGB7eyp9fWAgYGdldCh7c3RyaW5nfSBrZXkpYCDigJQgUmV0dXJucyBjYWNoZWQgdmFsdWUgZm9yIGBrZXlgIG9yIHVuZGVmaW5lZCBmb3IgY2FjaGUgbWlzcy4KICogLSBge3ZvaWR9YCBgcmVtb3ZlKHtzdHJpbmd9IGtleSlgIOKAlCBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgY2FjaGUuCiAqIC0gYHt2b2lkfWAgYHJlbW92ZUFsbCgpYCDigJQgUmVtb3ZlcyBhbGwgY2FjaGVkIHZhbHVlcy4KICogLSBge3ZvaWR9YCBgZGVzdHJveSgpYCDigJQgUmVtb3ZlcyByZWZlcmVuY2VzIHRvIHRoaXMgY2FjaGUgZnJvbSAkY2FjaGVGYWN0b3J5LgogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZSBtb2R1bGU9ImNhY2hlRXhhbXBsZUFwcCI+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkNhY2hlQ29udHJvbGxlciI+CiAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ibmV3Q2FjaGVLZXkiIHBsYWNlaG9sZGVyPSJLZXkiPgogICAgICAgICA8aW5wdXQgbmctbW9kZWw9Im5ld0NhY2hlVmFsdWUiIHBsYWNlaG9sZGVyPSJWYWx1ZSI+CiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9InB1dChuZXdDYWNoZUtleSwgbmV3Q2FjaGVWYWx1ZSkiPkNhY2hlPC9idXR0b24+CgogICAgICAgICA8cCBuZy1pZj0ia2V5cy5sZW5ndGgiPkNhY2hlZCBWYWx1ZXM8L3A+CiAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJrZXkgaW4ga2V5cyI+CiAgICAgICAgICAgPHNwYW4gbmctYmluZD0ia2V5Ij48L3NwYW4+CiAgICAgICAgICAgPHNwYW4+OiA8L3NwYW4+CiAgICAgICAgICAgPGIgbmctYmluZD0iY2FjaGUuZ2V0KGtleSkiPjwvYj4KICAgICAgICAgPC9kaXY+CgogICAgICAgICA8cD5DYWNoZSBJbmZvPC9wPgogICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iKGtleSwgdmFsdWUpIGluIGNhY2hlLmluZm8oKSI+CiAgICAgICAgICAgPHNwYW4gbmctYmluZD0ia2V5Ij48L3NwYW4+CiAgICAgICAgICAgPHNwYW4+OiA8L3NwYW4+CiAgICAgICAgICAgPGIgbmctYmluZD0idmFsdWUiPjwvYj4KICAgICAgICAgPC9kaXY+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjYWNoZUV4YW1wbGVBcHAnLCBbXSkuCiAgICAgICAgIGNvbnRyb2xsZXIoJ0NhY2hlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRjYWNoZUZhY3RvcnknLCBmdW5jdGlvbigkc2NvcGUsICRjYWNoZUZhY3RvcnkpIHsKICAgICAgICAgICAkc2NvcGUua2V5cyA9IFtdOwogICAgICAgICAgICRzY29wZS5jYWNoZSA9ICRjYWNoZUZhY3RvcnkoJ2NhY2hlSWQnKTsKICAgICAgICAgICAkc2NvcGUucHV0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgaWYgKCRzY29wZS5jYWNoZS5nZXQoa2V5KSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICRzY29wZS5rZXlzLnB1c2goa2V5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICRzY29wZS5jYWNoZS5wdXQoa2V5LCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlKTsKICAgICAgICAgICB9OwogICAgICAgICB9XSk7CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InN0eWxlLmNzcyI+CiAgICAgICBwIHsKICAgICAgICAgbWFyZ2luOiAxMHB4IDAgM3B4OwogICAgICAgfQogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KZnVuY3Rpb24gJENhY2hlRmFjdG9yeVByb3ZpZGVyKCkgewoKICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjYWNoZXMgPSB7fTsKCiAgICBmdW5jdGlvbiBjYWNoZUZhY3RvcnkoY2FjaGVJZCwgb3B0aW9ucykgewogICAgICBpZiAoY2FjaGVJZCBpbiBjYWNoZXMpIHsKICAgICAgICB0aHJvdyBtaW5FcnIoJyRjYWNoZUZhY3RvcnknKSgnaWlkJywgIkNhY2hlSWQgJ3swfScgaXMgYWxyZWFkeSB0YWtlbiEiLCBjYWNoZUlkKTsKICAgICAgfQoKICAgICAgdmFyIHNpemUgPSAwLAogICAgICAgICAgc3RhdHMgPSBleHRlbmQoe30sIG9wdGlvbnMsIHtpZDogY2FjaGVJZH0pLAogICAgICAgICAgZGF0YSA9IHt9LAogICAgICAgICAgY2FwYWNpdHkgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhcGFjaXR5KSB8fCBOdW1iZXIuTUFYX1ZBTFVFLAogICAgICAgICAgbHJ1SGFzaCA9IHt9LAogICAgICAgICAgZnJlc2hFbmQgPSBudWxsLAogICAgICAgICAgc3RhbGVFbmQgPSBudWxsOwoKICAgICAgLyoqCiAgICAgICAqIEBuZ2RvYyB0eXBlCiAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUKICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIEEgY2FjaGUgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEsIHByaW1hcmlseSB1c2VkIGJ5CiAgICAgICAqIHtAbGluayAkaHR0cCAkaHR0cH0gYW5kIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOnNjcmlwdCBzY3JpcHR9IGRpcmVjdGl2ZSB0byBjYWNoZQogICAgICAgKiB0ZW1wbGF0ZXMgYW5kIG90aGVyIGRhdGEuCiAgICAgICAqCiAgICAgICAqIGBgYGpzCiAgICAgICAqICBhbmd1bGFyLm1vZHVsZSgnc3VwZXJDYWNoZScpCiAgICAgICAqICAgIC5mYWN0b3J5KCdzdXBlckNhY2hlJywgWyckY2FjaGVGYWN0b3J5JywgZnVuY3Rpb24oJGNhY2hlRmFjdG9yeSkgewogICAgICAgKiAgICAgIHJldHVybiAkY2FjaGVGYWN0b3J5KCdzdXBlci1jYWNoZScpOwogICAgICAgKiAgICB9XSk7CiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBFeGFtcGxlIHRlc3Q6CiAgICAgICAqCiAgICAgICAqIGBgYGpzCiAgICAgICAqICBpdCgnc2hvdWxkIGJlaGF2ZSBsaWtlIGEgY2FjaGUnLCBpbmplY3QoZnVuY3Rpb24oc3VwZXJDYWNoZSkgewogICAgICAgKiAgICBzdXBlckNhY2hlLnB1dCgna2V5JywgJ3ZhbHVlJyk7CiAgICAgICAqICAgIHN1cGVyQ2FjaGUucHV0KCdhbm90aGVyIGtleScsICdhbm90aGVyIHZhbHVlJyk7CiAgICAgICAqCiAgICAgICAqICAgIGV4cGVjdChzdXBlckNhY2hlLmluZm8oKSkudG9FcXVhbCh7CiAgICAgICAqICAgICAgaWQ6ICdzdXBlci1jYWNoZScsCiAgICAgICAqICAgICAgc2l6ZTogMgogICAgICAgKiAgICB9KTsKICAgICAgICoKICAgICAgICogICAgc3VwZXJDYWNoZS5yZW1vdmUoJ2Fub3RoZXIga2V5Jyk7CiAgICAgICAqICAgIGV4cGVjdChzdXBlckNhY2hlLmdldCgnYW5vdGhlciBrZXknKSkudG9CZVVuZGVmaW5lZCgpOwogICAgICAgKgogICAgICAgKiAgICBzdXBlckNhY2hlLnJlbW92ZUFsbCgpOwogICAgICAgKiAgICBleHBlY3Qoc3VwZXJDYWNoZS5pbmZvKCkpLnRvRXF1YWwoewogICAgICAgKiAgICAgIGlkOiAnc3VwZXItY2FjaGUnLAogICAgICAgKiAgICAgIHNpemU6IDAKICAgICAgICogICAgfSk7CiAgICAgICAqICB9KSk7CiAgICAgICAqIGBgYAogICAgICAgKi8KICAgICAgcmV0dXJuIGNhY2hlc1tjYWNoZUlkXSA9IHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjcHV0CiAgICAgICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAgICAgKgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqIEluc2VydHMgYSBuYW1lZCBlbnRyeSBpbnRvIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0IHRvIGJlCiAgICAgICAgICogcmV0cmlldmVkIGxhdGVyLCBhbmQgaW5jcmVtZW50aW5nIHRoZSBzaXplIG9mIHRoZSBjYWNoZSBpZiB0aGUga2V5IHdhcyBub3QgYWxyZWFkeQogICAgICAgICAqIHByZXNlbnQgaW4gdGhlIGNhY2hlLiBJZiBiZWhhdmluZyBsaWtlIGFuIExSVSBjYWNoZSwgaXQgd2lsbCBhbHNvIHJlbW92ZSBzdGFsZQogICAgICAgICAqIGVudHJpZXMgZnJvbSB0aGUgc2V0LgogICAgICAgICAqCiAgICAgICAgICogSXQgd2lsbCBub3QgaW5zZXJ0IHVuZGVmaW5lZCB2YWx1ZXMgaW50byB0aGUgY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIGNhY2hlZCBkYXRhIGlzIHN0b3JlZC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIHRoZSB2YWx1ZSB0byBzdG9yZSBhbG9uZ3NpZGUgdGhlIGtleS4gSWYgaXQgaXMgdW5kZWZpbmVkLCB0aGUga2V5CiAgICAgICAgICogICAgd2lsbCBub3QgYmUgc3RvcmVkLgogICAgICAgICAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgc3RvcmVkLgogICAgICAgICAqLwogICAgICAgIHB1dDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKGNhcGFjaXR5IDwgTnVtYmVyLk1BWF9WQUxVRSkgewogICAgICAgICAgICB2YXIgbHJ1RW50cnkgPSBscnVIYXNoW2tleV0gfHwgKGxydUhhc2hba2V5XSA9IHtrZXk6IGtleX0pOwoKICAgICAgICAgICAgcmVmcmVzaChscnVFbnRyeSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuOwogICAgICAgICAgaWYgKCEoa2V5IGluIGRhdGEpKSBzaXplKys7CiAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTsKCiAgICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlKHN0YWxlRW5kLmtleSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI2dldAogICAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAgICoKICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXRyaWV2ZXMgbmFtZWQgZGF0YSBzdG9yZWQgaW4gdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRhdGEgdG8gYmUgcmV0cmlldmVkCiAgICAgICAgICogQHJldHVybnMgeyp9IHRoZSB2YWx1ZSBzdG9yZWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgIGlmIChjYXBhY2l0eSA8IE51bWJlci5NQVhfVkFMVUUpIHsKICAgICAgICAgICAgdmFyIGxydUVudHJ5ID0gbHJ1SGFzaFtrZXldOwoKICAgICAgICAgICAgaWYgKCFscnVFbnRyeSkgcmV0dXJuOwoKICAgICAgICAgICAgcmVmcmVzaChscnVFbnRyeSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGRhdGFba2V5XTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjcmVtb3ZlCiAgICAgICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAgICAgKgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlbW92ZXMgYW4gZW50cnkgZnJvbSB0aGUge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZW50cnkgdG8gYmUgcmVtb3ZlZAogICAgICAgICAqLwogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICBpZiAoY2FwYWNpdHkgPCBOdW1iZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgIHZhciBscnVFbnRyeSA9IGxydUhhc2hba2V5XTsKCiAgICAgICAgICAgIGlmICghbHJ1RW50cnkpIHJldHVybjsKCiAgICAgICAgICAgIGlmIChscnVFbnRyeSA9PSBmcmVzaEVuZCkgZnJlc2hFbmQgPSBscnVFbnRyeS5wOwogICAgICAgICAgICBpZiAobHJ1RW50cnkgPT0gc3RhbGVFbmQpIHN0YWxlRW5kID0gbHJ1RW50cnkubjsKICAgICAgICAgICAgbGluayhscnVFbnRyeS5uLGxydUVudHJ5LnApOwoKICAgICAgICAgICAgZGVsZXRlIGxydUhhc2hba2V5XTsKICAgICAgICAgIH0KCiAgICAgICAgICBkZWxldGUgZGF0YVtrZXldOwogICAgICAgICAgc2l6ZS0tOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNyZW1vdmVBbGwKICAgICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICogQ2xlYXJzIHRoZSBjYWNoZSBvYmplY3Qgb2YgYW55IGVudHJpZXMuCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlQWxsOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGRhdGEgPSB7fTsKICAgICAgICAgIHNpemUgPSAwOwogICAgICAgICAgbHJ1SGFzaCA9IHt9OwogICAgICAgICAgZnJlc2hFbmQgPSBzdGFsZUVuZCA9IG51bGw7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI2Rlc3Ryb3kKICAgICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICogRGVzdHJveXMgdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3QgZW50aXJlbHksCiAgICAgICAgICogcmVtb3ZpbmcgaXQgZnJvbSB0aGUge0BsaW5rICRjYWNoZUZhY3RvcnkgJGNhY2hlRmFjdG9yeX0gc2V0LgogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgICAgICAgZGF0YSA9IG51bGw7CiAgICAgICAgICBzdGF0cyA9IG51bGw7CiAgICAgICAgICBscnVIYXNoID0gbnVsbDsKICAgICAgICAgIGRlbGV0ZSBjYWNoZXNbY2FjaGVJZF07CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI2luZm8KICAgICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGEgcGFydGljdWxhciB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAgICAgICogICA8dWw+CiAgICAgICAgICogICAgIDxsaT4qKmlkKio6IHRoZSBpZCBvZiB0aGUgY2FjaGUgaW5zdGFuY2U8L2xpPgogICAgICAgICAqICAgICA8bGk+KipzaXplKio6IHRoZSBudW1iZXIgb2YgZW50cmllcyBrZXB0IGluIHRoZSBjYWNoZSBpbnN0YW5jZTwvbGk+CiAgICAgICAgICogICAgIDxsaT4qKi4uLioqOiBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0IHdoZW4gY3JlYXRpbmcgdGhlCiAgICAgICAgICogICAgICAgY2FjaGUuPC9saT4KICAgICAgICAgKiAgIDwvdWw+CiAgICAgICAgICovCiAgICAgICAgaW5mbzogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdGF0cywge3NpemU6IHNpemV9KTsKICAgICAgICB9CiAgICAgIH07CgoKICAgICAgLyoqCiAgICAgICAqIG1ha2VzIHRoZSBgZW50cnlgIHRoZSBmcmVzaEVuZCBvZiB0aGUgTFJVIGxpbmtlZCBsaXN0CiAgICAgICAqLwogICAgICBmdW5jdGlvbiByZWZyZXNoKGVudHJ5KSB7CiAgICAgICAgaWYgKGVudHJ5ICE9IGZyZXNoRW5kKSB7CiAgICAgICAgICBpZiAoIXN0YWxlRW5kKSB7CiAgICAgICAgICAgIHN0YWxlRW5kID0gZW50cnk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWxlRW5kID09IGVudHJ5KSB7CiAgICAgICAgICAgIHN0YWxlRW5kID0gZW50cnkubjsKICAgICAgICAgIH0KCiAgICAgICAgICBsaW5rKGVudHJ5Lm4sIGVudHJ5LnApOwogICAgICAgICAgbGluayhlbnRyeSwgZnJlc2hFbmQpOwogICAgICAgICAgZnJlc2hFbmQgPSBlbnRyeTsKICAgICAgICAgIGZyZXNoRW5kLm4gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKCiAgICAgIC8qKgogICAgICAgKiBiaWRpcmVjdGlvbmFsbHkgbGlua3MgdHdvIGVudHJpZXMgb2YgdGhlIExSVSBsaW5rZWQgbGlzdAogICAgICAgKi8KICAgICAgZnVuY3Rpb24gbGluayhuZXh0RW50cnksIHByZXZFbnRyeSkgewogICAgICAgIGlmIChuZXh0RW50cnkgIT0gcHJldkVudHJ5KSB7CiAgICAgICAgICBpZiAobmV4dEVudHJ5KSBuZXh0RW50cnkucCA9IHByZXZFbnRyeTsgLy9wIHN0YW5kcyBmb3IgcHJldmlvdXMsICdwcmV2JyBkaWRuJ3QgbWluaWZ5CiAgICAgICAgICBpZiAocHJldkVudHJ5KSBwcmV2RW50cnkubiA9IG5leHRFbnRyeTsgLy9uIHN0YW5kcyBmb3IgbmV4dCwgJ25leHQnIGRpZG4ndCBtaW5pZnkKICAgICAgICB9CiAgICAgIH0KICAgIH0KCgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5I2luZm8KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlIGNhY2hlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkCiAgICoKICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIGtleS12YWx1ZSBtYXAgb2YgYGNhY2hlSWRgIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgY2FjaGUjaW5mb2AKICAgKi8KICAgIGNhY2hlRmFjdG9yeS5pbmZvID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpbmZvID0ge307CiAgICAgIGZvckVhY2goY2FjaGVzLCBmdW5jdGlvbihjYWNoZSwgY2FjaGVJZCkgewogICAgICAgIGluZm9bY2FjaGVJZF0gPSBjYWNoZS5pbmZvKCk7CiAgICAgIH0pOwogICAgICByZXR1cm4gaW5mbzsKICAgIH07CgoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGNhY2hlRmFjdG9yeSNnZXQKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIEdldCBhY2Nlc3MgdG8gYSBjYWNoZSBvYmplY3QgYnkgdGhlIGBjYWNoZUlkYCB1c2VkIHdoZW4gaXQgd2FzIGNyZWF0ZWQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVJZCBOYW1lIG9yIGlkIG9mIGEgY2FjaGUgdG8gYWNjZXNzLgogICAqIEByZXR1cm5zIHtvYmplY3R9IENhY2hlIG9iamVjdCBpZGVudGlmaWVkIGJ5IHRoZSBjYWNoZUlkIG9yIHVuZGVmaW5lZCBpZiBubyBzdWNoIGNhY2hlLgogICAqLwogICAgY2FjaGVGYWN0b3J5LmdldCA9IGZ1bmN0aW9uKGNhY2hlSWQpIHsKICAgICAgcmV0dXJuIGNhY2hlc1tjYWNoZUlkXTsKICAgIH07CgoKICAgIHJldHVybiBjYWNoZUZhY3Rvcnk7CiAgfTsKfQoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICR0ZW1wbGF0ZUNhY2hlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgZmlyc3QgdGltZSBhIHRlbXBsYXRlIGlzIHVzZWQsIGl0IGlzIGxvYWRlZCBpbiB0aGUgdGVtcGxhdGUgY2FjaGUgZm9yIHF1aWNrIHJldHJpZXZhbC4gWW91CiAqIGNhbiBsb2FkIHRlbXBsYXRlcyBkaXJlY3RseSBpbnRvIHRoZSBjYWNoZSBpbiBhIGBzY3JpcHRgIHRhZywgb3IgYnkgY29uc3VtaW5nIHRoZQogKiBgJHRlbXBsYXRlQ2FjaGVgIHNlcnZpY2UgZGlyZWN0bHkuCiAqCiAqIEFkZGluZyB2aWEgdGhlIGBzY3JpcHRgIHRhZzoKICoKICogYGBgaHRtbAogKiAgIDxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9InRlbXBsYXRlSWQuaHRtbCI+CiAqICAgICA8cD5UaGlzIGlzIHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZTwvcD4KICogICA8L3NjcmlwdD4KICogYGBgCiAqCiAqICoqTm90ZToqKiB0aGUgYHNjcmlwdGAgdGFnIGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlIGRvZXMgbm90IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGBoZWFkYCBvZgogKiB0aGUgZG9jdW1lbnQsIGJ1dCBpdCBtdXN0IGJlIGEgZGVzY2VuZGVudCBvZiB0aGUge0BsaW5rIG5nLiRyb290RWxlbWVudCAkcm9vdEVsZW1lbnR9IChJRSwKICogZWxlbWVudCB3aXRoIG5nLWFwcCBhdHRyaWJ1dGUpLCBvdGhlcndpc2UgdGhlIHRlbXBsYXRlIHdpbGwgYmUgaWdub3JlZC4KICoKICogQWRkaW5nIHZpYSB0aGUgJHRlbXBsYXRlQ2FjaGUgc2VydmljZToKICoKICogYGBganMKICogdmFyIG15QXBwID0gYW5ndWxhci5tb2R1bGUoJ215QXBwJywgW10pOwogKiBteUFwcC5ydW4oZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHsKICogICAkdGVtcGxhdGVDYWNoZS5wdXQoJ3RlbXBsYXRlSWQuaHRtbCcsICdUaGlzIGlzIHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZScpOwogKiB9KTsKICogYGBgCiAqCiAqIFRvIHJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBsYXRlciwgc2ltcGx5IHVzZSBpdCBpbiB5b3VyIEhUTUw6CiAqIGBgYGh0bWwKICogPGRpdiBuZy1pbmNsdWRlPSIgJ3RlbXBsYXRlSWQuaHRtbCcgIj48L2Rpdj4KICogYGBgCiAqCiAqIG9yIGdldCBpdCB2aWEgSmF2YXNjcmlwdDoKICogYGBganMKICogJHRlbXBsYXRlQ2FjaGUuZ2V0KCd0ZW1wbGF0ZUlkLmh0bWwnKQogKiBgYGAKICoKICogU2VlIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5ICRjYWNoZUZhY3Rvcnl9LgogKgogKi8KZnVuY3Rpb24gJFRlbXBsYXRlQ2FjaGVQcm92aWRlcigpIHsKICB0aGlzLiRnZXQgPSBbJyRjYWNoZUZhY3RvcnknLCBmdW5jdGlvbigkY2FjaGVGYWN0b3J5KSB7CiAgICByZXR1cm4gJGNhY2hlRmFjdG9yeSgndGVtcGxhdGVzJyk7CiAgfV07Cn0KCi8qICEgVkFSSUFCTEUvRlVOQ1RJT04gTkFNSU5HIENPTlZFTlRJT05TIFRIQVQgQVBQTFkgVE8gVEhJUyBGSUxFIQogKgogKiBET00tcmVsYXRlZCB2YXJpYWJsZXM6CiAqCiAqIC0gIm5vZGUiIC0gRE9NIE5vZGUKICogLSAiZWxlbWVudCIgLSBET00gRWxlbWVudCBvciBOb2RlCiAqIC0gIiRub2RlIiBvciAiJGVsZW1lbnQiIC0ganFMaXRlLXdyYXBwZWQgbm9kZSBvciBlbGVtZW50CiAqCiAqCiAqIENvbXBpbGVyIHJlbGF0ZWQgc3R1ZmY6CiAqCiAqIC0gImxpbmtGbiIgLSBsaW5raW5nIGZuIG9mIGEgc2luZ2xlIGRpcmVjdGl2ZQogKiAtICJub2RlTGlua0ZuIiAtIGZ1bmN0aW9uIHRoYXQgYWdncmVnYXRlcyBhbGwgbGlua2luZyBmbnMgZm9yIGEgcGFydGljdWxhciBub2RlCiAqIC0gImNoaWxkTGlua0ZuIiAtICBmdW5jdGlvbiB0aGF0IGFnZ3JlZ2F0ZXMgYWxsIGxpbmtpbmcgZm5zIGZvciBjaGlsZCBub2RlcyBvZiBhIHBhcnRpY3VsYXIgbm9kZQogKiAtICJjb21wb3NpdGVMaW5rRm4iIC0gZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGFsbCBsaW5raW5nIGZucyBmb3IgYSBjb21waWxhdGlvbiByb290IChub2RlTGlzdCkKICovCgoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRjb21waWxlCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBDb21waWxlcyBhbiBIVE1MIHN0cmluZyBvciBET00gaW50byBhIHRlbXBsYXRlIGFuZCBwcm9kdWNlcyBhIHRlbXBsYXRlIGZ1bmN0aW9uLCB3aGljaAogKiBjYW4gdGhlbiBiZSB1c2VkIHRvIGxpbmsge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgYHNjb3BlYH0gYW5kIHRoZSB0ZW1wbGF0ZSB0b2dldGhlci4KICoKICogVGhlIGNvbXBpbGF0aW9uIGlzIGEgcHJvY2VzcyBvZiB3YWxraW5nIHRoZSBET00gdHJlZSBhbmQgbWF0Y2hpbmcgRE9NIGVsZW1lbnRzIHRvCiAqIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RpcmVjdGl2ZSBkaXJlY3RpdmVzfS4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CiAqICoqTm90ZToqKiBUaGlzIGRvY3VtZW50IGlzIGFuIGluLWRlcHRoIHJlZmVyZW5jZSBvZiBhbGwgZGlyZWN0aXZlIG9wdGlvbnMuCiAqIEZvciBhIGdlbnRsZSBpbnRyb2R1Y3Rpb24gdG8gZGlyZWN0aXZlcyB3aXRoIGV4YW1wbGVzIG9mIGNvbW1vbiB1c2UgY2FzZXMsCiAqIHNlZSB0aGUge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSBkaXJlY3RpdmUgZ3VpZGV9LgogKiA8L2Rpdj4KICoKICogIyMgQ29tcHJlaGVuc2l2ZSBEaXJlY3RpdmUgQVBJCiAqCiAqIFRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCBvcHRpb25zIGZvciBhIGRpcmVjdGl2ZS4KICoKICogVGhlIGRpZmZlcmVuY2UgcmVzaWRlcyBpbiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLgogKiBZb3UgY2FuIGVpdGhlciByZXR1cm4gYSAiRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0IiAoc2VlIGJlbG93KSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGl2ZSBwcm9wZXJ0aWVzLAogKiBvciBqdXN0IHRoZSBgcG9zdExpbmtgIGZ1bmN0aW9uIChhbGwgb3RoZXIgcHJvcGVydGllcyB3aWxsIGhhdmUgdGhlIGRlZmF1bHQgdmFsdWVzKS4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+CiAqICoqQmVzdCBQcmFjdGljZToqKiBJdCdzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgImRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdCIgZm9ybS4KICogPC9kaXY+CiAqCiAqIEhlcmUncyBhbiBleGFtcGxlIGRpcmVjdGl2ZSBkZWNsYXJlZCB3aXRoIGEgRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0OgogKgogKiBgYGBqcwogKiAgIHZhciBteU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKC4uLik7CiAqCiAqICAgbXlNb2R1bGUuZGlyZWN0aXZlKCdkaXJlY3RpdmVOYW1lJywgZnVuY3Rpb24gZmFjdG9yeShpbmplY3RhYmxlcykgewogKiAgICAgdmFyIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3QgPSB7CiAqICAgICAgIHByaW9yaXR5OiAwLAogKiAgICAgICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+JywgLy8gb3IgLy8gZnVuY3Rpb24odEVsZW1lbnQsIHRBdHRycykgeyAuLi4gfSwKICogICAgICAgLy8gb3IKICogICAgICAgLy8gdGVtcGxhdGVVcmw6ICdkaXJlY3RpdmUuaHRtbCcsIC8vIG9yIC8vIGZ1bmN0aW9uKHRFbGVtZW50LCB0QXR0cnMpIHsgLi4uIH0sCiAqICAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLAogKiAgICAgICByZXN0cmljdDogJ0EnLAogKiAgICAgICB0ZW1wbGF0ZU5hbWVzcGFjZTogJ2h0bWwnLAogKiAgICAgICBzY29wZTogZmFsc2UsCiAqICAgICAgIGNvbnRyb2xsZXI6IGZ1bmN0aW9uKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgJHRyYW5zY2x1ZGUsIG90aGVySW5qZWN0YWJsZXMpIHsgLi4uIH0sCiAqICAgICAgIGNvbnRyb2xsZXJBczogJ3N0cmluZ0FsaWFzJywKICogICAgICAgcmVxdWlyZTogJ3NpYmxpbmdEaXJlY3RpdmVOYW1lJywgLy8gb3IgLy8gWydecGFyZW50RGlyZWN0aXZlTmFtZScsICc/b3B0aW9uYWxEaXJlY3RpdmVOYW1lJywgJz9eb3B0aW9uYWxQYXJlbnQnXSwKICogICAgICAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZSh0RWxlbWVudCwgdEF0dHJzLCB0cmFuc2NsdWRlKSB7CiAqICAgICAgICAgcmV0dXJuIHsKICogICAgICAgICAgIHByZTogZnVuY3Rpb24gcHJlTGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfSwKICogICAgICAgICAgIHBvc3Q6IGZ1bmN0aW9uIHBvc3RMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyKSB7IC4uLiB9CiAqICAgICAgICAgfQogKiAgICAgICAgIC8vIG9yCiAqICAgICAgICAgLy8gcmV0dXJuIGZ1bmN0aW9uIHBvc3RMaW5rKCAuLi4gKSB7IC4uLiB9CiAqICAgICAgIH0sCiAqICAgICAgIC8vIG9yCiAqICAgICAgIC8vIGxpbms6IHsKICogICAgICAgLy8gIHByZTogZnVuY3Rpb24gcHJlTGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfSwKICogICAgICAgLy8gIHBvc3Q6IGZ1bmN0aW9uIHBvc3RMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyKSB7IC4uLiB9CiAqICAgICAgIC8vIH0KICogICAgICAgLy8gb3IKICogICAgICAgLy8gbGluazogZnVuY3Rpb24gcG9zdExpbmsoIC4uLiApIHsgLi4uIH0KICogICAgIH07CiAqICAgICByZXR1cm4gZGlyZWN0aXZlRGVmaW5pdGlvbk9iamVjdDsKICogICB9KTsKICogYGBgCiAqCiAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgogKiAqKk5vdGU6KiogQW55IHVuc3BlY2lmaWVkIG9wdGlvbnMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gc2VlIHRoZSBkZWZhdWx0IHZhbHVlcyBiZWxvdy4KICogPC9kaXY+CiAqCiAqIFRoZXJlZm9yZSB0aGUgYWJvdmUgY2FuIGJlIHNpbXBsaWZpZWQgYXM6CiAqCiAqIGBgYGpzCiAqICAgdmFyIG15TW9kdWxlID0gYW5ndWxhci5tb2R1bGUoLi4uKTsKICoKICogICBteU1vZHVsZS5kaXJlY3RpdmUoJ2RpcmVjdGl2ZU5hbWUnLCBmdW5jdGlvbiBmYWN0b3J5KGluamVjdGFibGVzKSB7CiAqICAgICB2YXIgZGlyZWN0aXZlRGVmaW5pdGlvbk9iamVjdCA9IHsKICogICAgICAgbGluazogZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMpIHsgLi4uIH0KICogICAgIH07CiAqICAgICByZXR1cm4gZGlyZWN0aXZlRGVmaW5pdGlvbk9iamVjdDsKICogICAgIC8vIG9yCiAqICAgICAvLyByZXR1cm4gZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMpIHsgLi4uIH0KICogICB9KTsKICogYGBgCiAqCiAqCiAqCiAqICMjIyBEaXJlY3RpdmUgRGVmaW5pdGlvbiBPYmplY3QKICoKICogVGhlIGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdCBwcm92aWRlcyBpbnN0cnVjdGlvbnMgdG8gdGhlIHtAbGluayBuZy4kY29tcGlsZQogKiBjb21waWxlcn0uIFRoZSBhdHRyaWJ1dGVzIGFyZToKICoKICogIyMjIyBgbXVsdGlFbGVtZW50YAogKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUsIHRoZSBIVE1MIGNvbXBpbGVyIHdpbGwgY29sbGVjdCBET00gbm9kZXMgYmV0d2VlbgogKiBub2RlcyB3aXRoIHRoZSBhdHRyaWJ1dGVzIGBkaXJlY3RpdmUtbmFtZS1zdGFydGAgYW5kIGBkaXJlY3RpdmUtbmFtZS1lbmRgLCBhbmQgZ3JvdXAgdGhlbQogKiB0b2dldGhlciBhcyB0aGUgZGlyZWN0aXZlIGVsZW1lbnRzLiBJdCBpcyByZWNvbWVuZGVkIHRoYXQgdGhpcyBmZWF0dXJlIGJlIHVzZWQgb24gZGlyZWN0aXZlcwogKiB3aGljaCBhcmUgbm90IHN0cmljdGx5IGJlaGF2aW91cmFsIChzdWNoIGFzIHtAbGluayBuZ0NsaWNrfSksIGFuZCB3aGljaAogKiBkbyBub3QgbWFuaXB1bGF0ZSBvciByZXBsYWNlIGNoaWxkIG5vZGVzIChzdWNoIGFzIHtAbGluayBuZ0luY2x1ZGV9KS4KICoKICogIyMjIyBgcHJpb3JpdHlgCiAqIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGRpcmVjdGl2ZXMgZGVmaW5lZCBvbiBhIHNpbmdsZSBET00gZWxlbWVudCwgc29tZXRpbWVzIGl0CiAqIGlzIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlyZWN0aXZlcyBhcmUgYXBwbGllZC4gVGhlIGBwcmlvcml0eWAgaXMgdXNlZAogKiB0byBzb3J0IHRoZSBkaXJlY3RpdmVzIGJlZm9yZSB0aGVpciBgY29tcGlsZWAgZnVuY3Rpb25zIGdldCBjYWxsZWQuIFByaW9yaXR5IGlzIGRlZmluZWQgYXMgYQogKiBudW1iZXIuIERpcmVjdGl2ZXMgd2l0aCBncmVhdGVyIG51bWVyaWNhbCBgcHJpb3JpdHlgIGFyZSBjb21waWxlZCBmaXJzdC4gUHJlLWxpbmsgZnVuY3Rpb25zCiAqIGFyZSBhbHNvIHJ1biBpbiBwcmlvcml0eSBvcmRlciwgYnV0IHBvc3QtbGluayBmdW5jdGlvbnMgYXJlIHJ1biBpbiByZXZlcnNlIG9yZGVyLiBUaGUgb3JkZXIKICogb2YgZGlyZWN0aXZlcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5IGlzIHVuZGVmaW5lZC4gVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgYDBgLgogKgogKiAjIyMjIGB0ZXJtaW5hbGAKICogSWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgY3VycmVudCBgcHJpb3JpdHlgIHdpbGwgYmUgdGhlIGxhc3Qgc2V0IG9mIGRpcmVjdGl2ZXMKICogd2hpY2ggd2lsbCBleGVjdXRlIChhbnkgZGlyZWN0aXZlcyBhdCB0aGUgY3VycmVudCBwcmlvcml0eSB3aWxsIHN0aWxsIGV4ZWN1dGUKICogYXMgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiBvbiBzYW1lIGBwcmlvcml0eWAgaXMgdW5kZWZpbmVkKS4gTm90ZSB0aGF0IGV4cHJlc3Npb25zCiAqIGFuZCBvdGhlciBkaXJlY3RpdmVzIHVzZWQgaW4gdGhlIGRpcmVjdGl2ZSdzIHRlbXBsYXRlIHdpbGwgYWxzbyBiZSBleGNsdWRlZCBmcm9tIGV4ZWN1dGlvbi4KICoKICogIyMjIyBgc2NvcGVgCiAqICoqSWYgc2V0IHRvIGB0cnVlYCwqKiB0aGVuIGEgbmV3IHNjb3BlIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBkaXJlY3RpdmUuIElmIG11bHRpcGxlIGRpcmVjdGl2ZXMgb24gdGhlCiAqIHNhbWUgZWxlbWVudCByZXF1ZXN0IGEgbmV3IHNjb3BlLCBvbmx5IG9uZSBuZXcgc2NvcGUgaXMgY3JlYXRlZC4gVGhlIG5ldyBzY29wZSBydWxlIGRvZXMgbm90CiAqIGFwcGx5IGZvciB0aGUgcm9vdCBvZiB0aGUgdGVtcGxhdGUgc2luY2UgdGhlIHJvb3Qgb2YgdGhlIHRlbXBsYXRlIGFsd2F5cyBnZXRzIGEgbmV3IHNjb3BlLgogKgogKiAqKklmIHNldCB0byBge31gIChvYmplY3QgaGFzaCksKiogdGhlbiBhIG5ldyAiaXNvbGF0ZSIgc2NvcGUgaXMgY3JlYXRlZC4gVGhlICdpc29sYXRlJyBzY29wZSBkaWZmZXJzIGZyb20KICogbm9ybWFsIHNjb3BlIGluIHRoYXQgaXQgZG9lcyBub3QgcHJvdG90eXBpY2FsbHkgaW5oZXJpdCBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuIFRoaXMgaXMgdXNlZnVsCiAqIHdoZW4gY3JlYXRpbmcgcmV1c2FibGUgY29tcG9uZW50cywgd2hpY2ggc2hvdWxkIG5vdCBhY2NpZGVudGFsbHkgcmVhZCBvciBtb2RpZnkgZGF0YSBpbiB0aGUKICogcGFyZW50IHNjb3BlLgogKgogKiBUaGUgJ2lzb2xhdGUnIHNjb3BlIHRha2VzIGFuIG9iamVjdCBoYXNoIHdoaWNoIGRlZmluZXMgYSBzZXQgb2YgbG9jYWwgc2NvcGUgcHJvcGVydGllcwogKiBkZXJpdmVkIGZyb20gdGhlIHBhcmVudCBzY29wZS4gVGhlc2UgbG9jYWwgcHJvcGVydGllcyBhcmUgdXNlZnVsIGZvciBhbGlhc2luZyB2YWx1ZXMgZm9yCiAqIHRlbXBsYXRlcy4gTG9jYWxzIGRlZmluaXRpb24gaXMgYSBoYXNoIG9mIGxvY2FsIHNjb3BlIHByb3BlcnR5IHRvIGl0cyBzb3VyY2U6CiAqCiAqICogYEBgIG9yIGBAYXR0cmAgLSBiaW5kIGEgbG9jYWwgc2NvcGUgcHJvcGVydHkgdG8gdGhlIHZhbHVlIG9mIERPTSBhdHRyaWJ1dGUuIFRoZSByZXN1bHQgaXMKICogICBhbHdheXMgYSBzdHJpbmcgc2luY2UgRE9NIGF0dHJpYnV0ZXMgYXJlIHN0cmluZ3MuIElmIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCAgdGhlbiB0aGUKICogICBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBuYW1lLgogKiAgIEdpdmVuIGA8d2lkZ2V0IG15LWF0dHI9ImhlbGxvIHt7bmFtZX19Ij5gIGFuZCB3aWRnZXQgZGVmaW5pdGlvbgogKiAgIG9mIGBzY29wZTogeyBsb2NhbE5hbWU6J0BteUF0dHInIH1gLCB0aGVuIHdpZGdldCBzY29wZSBwcm9wZXJ0eSBgbG9jYWxOYW1lYCB3aWxsIHJlZmxlY3QKICogICB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIG9mIGBoZWxsbyB7e25hbWV9fWAuIEFzIHRoZSBgbmFtZWAgYXR0cmlidXRlIGNoYW5nZXMgc28gd2lsbCB0aGUKICogICBgbG9jYWxOYW1lYCBwcm9wZXJ0eSBvbiB0aGUgd2lkZ2V0IHNjb3BlLiBUaGUgYG5hbWVgIGlzIHJlYWQgZnJvbSB0aGUgcGFyZW50IHNjb3BlIChub3QKICogICBjb21wb25lbnQgc2NvcGUpLgogKgogKiAqIGA9YCBvciBgPWF0dHJgIC0gc2V0IHVwIGJpLWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIGxvY2FsIHNjb3BlIHByb3BlcnR5IGFuZCB0aGUKICogICBwYXJlbnQgc2NvcGUgcHJvcGVydHkgb2YgbmFtZSBkZWZpbmVkIHZpYSB0aGUgdmFsdWUgb2YgdGhlIGBhdHRyYCBhdHRyaWJ1dGUuIElmIG5vIGBhdHRyYAogKiAgIG5hbWUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGxvY2FsIG5hbWUuCiAqICAgR2l2ZW4gYDx3aWRnZXQgbXktYXR0cj0icGFyZW50TW9kZWwiPmAgYW5kIHdpZGdldCBkZWZpbml0aW9uIG9mCiAqICAgYHNjb3BlOiB7IGxvY2FsTW9kZWw6Jz1teUF0dHInIH1gLCB0aGVuIHdpZGdldCBzY29wZSBwcm9wZXJ0eSBgbG9jYWxNb2RlbGAgd2lsbCByZWZsZWN0IHRoZQogKiAgIHZhbHVlIG9mIGBwYXJlbnRNb2RlbGAgb24gdGhlIHBhcmVudCBzY29wZS4gQW55IGNoYW5nZXMgdG8gYHBhcmVudE1vZGVsYCB3aWxsIGJlIHJlZmxlY3RlZAogKiAgIGluIGBsb2NhbE1vZGVsYCBhbmQgYW55IGNoYW5nZXMgaW4gYGxvY2FsTW9kZWxgIHdpbGwgcmVmbGVjdCBpbiBgcGFyZW50TW9kZWxgLiBJZiB0aGUgcGFyZW50CiAqICAgc2NvcGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCwgaXQgd2lsbCB0aHJvdyBhIE5PTl9BU1NJR05BQkxFX01PREVMX0VYUFJFU1NJT04gZXhjZXB0aW9uLiBZb3UKICogICBjYW4gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2luZyBgPT9gIG9yIGA9P2F0dHJgIGluIG9yZGVyIHRvIGZsYWcgdGhlIHByb3BlcnR5IGFzIG9wdGlvbmFsLiBJZgogKiAgIHlvdSB3YW50IHRvIHNoYWxsb3cgd2F0Y2ggZm9yIGNoYW5nZXMgKGkuZS4gJHdhdGNoQ29sbGVjdGlvbiBpbnN0ZWFkIG9mICR3YXRjaCkgeW91IGNhbiB1c2UKICogICBgPSpgIG9yIGA9KmF0dHJgIChgPSo/YCBvciBgPSo/YXR0cmAgaWYgdGhlIHByb3BlcnR5IGlzIG9wdGlvbmFsKS4KICoKICogKiBgJmAgb3IgYCZhdHRyYCAtIHByb3ZpZGVzIGEgd2F5IHRvIGV4ZWN1dGUgYW4gZXhwcmVzc2lvbiBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGFyZW50IHNjb3BlLgogKiAgIElmIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZQogKiAgIGxvY2FsIG5hbWUuIEdpdmVuIGA8d2lkZ2V0IG15LWF0dHI9ImNvdW50ID0gY291bnQgKyB2YWx1ZSI+YCBhbmQgd2lkZ2V0IGRlZmluaXRpb24gb2YKICogICBgc2NvcGU6IHsgbG9jYWxGbjonJm15QXR0cicgfWAsIHRoZW4gaXNvbGF0ZSBzY29wZSBwcm9wZXJ0eSBgbG9jYWxGbmAgd2lsbCBwb2ludCB0bwogKiAgIGEgZnVuY3Rpb24gd3JhcHBlciBmb3IgdGhlIGBjb3VudCA9IGNvdW50ICsgdmFsdWVgIGV4cHJlc3Npb24uIE9mdGVuIGl0J3MgZGVzaXJhYmxlIHRvCiAqICAgcGFzcyBkYXRhIGZyb20gdGhlIGlzb2xhdGVkIHNjb3BlIHZpYSBhbiBleHByZXNzaW9uIHRvIHRoZSBwYXJlbnQgc2NvcGUsIHRoaXMgY2FuIGJlCiAqICAgZG9uZSBieSBwYXNzaW5nIGEgbWFwIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgaW50byB0aGUgZXhwcmVzc2lvbiB3cmFwcGVyIGZuLgogKiAgIEZvciBleGFtcGxlLCBpZiB0aGUgjNzvViV4AQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwsQABABm6xwKgHNsCoB2CVIh/1WHp800G09eiAEAujE8sAAAEBCAoAo169AE2luIzc71Y/eAEACiAAAAogAABo9ygf0sUIACetHhMIAEUAH/zS9kAAQAa4HsCoB2DAqAc2H/WVIkG09ehYenzTgBgBU6/VAAABAQgKAE2luACjXrtleHByZXNzaW9uIGlzIGBpbmNyZW1lbnQoYW1vdW50KWAgdGhlbiB3ZSBjYW4gc3BlY2lmeSB0aGUgYW1vdW50IHZhbHVlCiAqICAgYnkgY2FsbGluZyB0aGUgYGxvY2FsRm5gIGFzIGBsb2NhbEZuKHthbW91bnQ6IDIyfSlgLgogKgogKgogKiAjIyMjIGBiaW5kVG9Db250cm9sbGVyYAogKiBXaGVuIGFuIGlzb2xhdGUgc2NvcGUgaXMgdXNlZCBmb3IgYSBjb21wb25lbnQgKHNlZSBhYm92ZSksIGFuZCBgY29udHJvbGxlckFzYCBpcyB1c2VkLCBgYmluZFRvQ29udHJvbGxlcjogdHJ1ZWAgd2lsbAogKiBhbGxvdyBhIGNvbXBvbmVudCB0byBoYXZlIGl0cyBwcm9wZXJ0aWVzIGJvdW5kIHRvIHRoZSBjb250cm9sbGVyLCByYXRoZXIgdGhhbiB0byBzY29wZS4gV2hlbiB0aGUgY29udHJvbGxlcgogKiBpcyBpbnN0YW50aWF0ZWQsIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgaXNvbGF0ZSBzY29wZSBiaW5kaW5ncyBhcmUgYWxyZWFkeSBhdmFpbGFibGUuCiAqCiAqICMjIyMgYGNvbnRyb2xsZXJgCiAqIENvbnRyb2xsZXIgY29uc3RydWN0b3IgZnVuY3Rpb24uIFRoZSBjb250cm9sbGVyIGlzIGluc3RhbnRpYXRlZCBiZWZvcmUgdGhlCiAqIHByZS1saW5raW5nIHBoYXNlIGFuZCBpdCBpcyBzaGFyZWQgd2l0aCBvdGhlciBkaXJlY3RpdmVzIChzZWUKICogYHJlcXVpcmVgIGF0dHJpYnV0ZSkuIFRoaXMgYWxsb3dzIHRoZSBkaXJlY3RpdmVzIHRvIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlciBhbmQgYXVnbWVudAogKiBlYWNoIG90aGVyJ3MgYmVoYXZpb3IuIFRoZSBjb250cm9sbGVyIGlzIGluamVjdGFibGUgKGFuZCBzdXBwb3J0cyBicmFja2V0IG5vdGF0aW9uKSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYWxzOgogKgogKiAqIGAkc2NvcGVgIC0gQ3VycmVudCBzY29wZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQKICogKiBgJGVsZW1lbnRgIC0gQ3VycmVudCBlbGVtZW50CiAqICogYCRhdHRyc2AgLSBDdXJyZW50IGF0dHJpYnV0ZXMgb2JqZWN0IGZvciB0aGUgZWxlbWVudAogKiAqIGAkdHJhbnNjbHVkZWAgLSBBIHRyYW5zY2x1ZGUgbGlua2luZyBmdW5jdGlvbiBwcmUtYm91bmQgdG8gdGhlIGNvcnJlY3QgdHJhbnNjbHVzaW9uIHNjb3BlOgogKiAgIGBmdW5jdGlvbihbc2NvcGVdLCBjbG9uZUxpbmtpbmdGbiwgZnV0dXJlUGFyZW50RWxlbWVudClgLgogKiAgICAqIGBzY29wZWA6IG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIHRoZSBzY29wZS4KICogICAgKiBgY2xvbmVMaW5raW5nRm5gOiBvcHRpb25hbCBhcmd1bWVudCB0byBjcmVhdGUgY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0cmFuc2NsdWRlZCBjb250ZW50LgogKiAgICAqIGBmdXR1cmVQYXJlbnRFbGVtZW50YDoKICogICAgICAgICogZGVmaW5lcyB0aGUgcGFyZW50IHRvIHdoaWNoIHRoZSBgY2xvbmVMaW5raW5nRm5gIHdpbGwgYWRkIHRoZSBjbG9uZWQgZWxlbWVudHMuCiAqICAgICAgICAqIGRlZmF1bHQ6IGAkZWxlbWVudC5wYXJlbnQoKWAgcmVzcC4gYCRlbGVtZW50YCBmb3IgYHRyYW5zY2x1ZGU6J2VsZW1lbnQnYCByZXNwLiBgdHJhbnNjbHVkZTp0cnVlYC4KICogICAgICAgICogb25seSBuZWVkZWQgZm9yIHRyYW5zY2x1ZGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbiBub24gaHRtbCBlbGVtZW50cyAoZS5nLiBTVkcgZWxlbWVudHMpCiAqICAgICAgICAgIGFuZCB3aGVuIHRoZSBgY2xvbmVMaW5raW5GbmAgaXMgcGFzc2VkLAogKiAgICAgICAgICBhcyB0aG9zZSBlbGVtZW50cyBuZWVkIHRvIGNyZWF0ZWQgYW5kIGNsb25lZCBpbiBhIHNwZWNpYWwgd2F5IHdoZW4gdGhleSBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZWlyCiAqICAgICAgICAgIHVzdWFsIGNvbnRhaW5lcnMgKGUuZy4gbGlrZSBgPHN2Zz5gKS4KICogICAgICAgICogU2VlIGFsc28gdGhlIGBkaXJlY3RpdmUudGVtcGxhdGVOYW1lc3BhY2VgIHByb3BlcnR5LgogKgogKgogKiAjIyMjIGByZXF1aXJlYAogKiBSZXF1aXJlIGFub3RoZXIgZGlyZWN0aXZlIGFuZCBpbmplY3QgaXRzIGNvbnRyb2xsZXIgYXMgdGhlIGZvdXJ0aCBhcmd1bWVudCB0byB0aGUgbGlua2luZyBmdW5jdGlvbi4gVGhlCiAqIGByZXF1aXJlYCB0YWtlcyBhIHN0cmluZyBuYW1lIChvciBhcnJheSBvZiBzdHJpbmdzKSBvZiB0aGUgZGlyZWN0aXZlKHMpIHRvIHBhc3MgaW4uIElmIGFuIGFycmF5IGlzIHVzZWQsIHRoZQogKiBpbmplY3RlZCBhcmd1bWVudCB3aWxsIGJlIGFuIGFycmF5IGluIGNvcnJlc3BvbmRpbmcgb3JkZXIuIElmIG5vIHN1Y2ggZGlyZWN0aXZlIGNhbiBiZQogKiBmb3VuZCwgb3IgaWYgdGhlIGRpcmVjdGl2ZSBkb2VzIG5vdCBoYXZlIGEgY29udHJvbGxlciwgdGhlbiBhbiBlcnJvciBpcyByYWlzZWQuIFRoZSBuYW1lIGNhbiBiZSBwcmVmaXhlZCB3aXRoOgogKgogKiAqIChubyBwcmVmaXgpIC0gTG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuIFRocm93IGFuIGVycm9yIGlmIG5vdCBmb3VuZC4KICogKiBgP2AgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBvciBwYXNzIGBudWxsYCB0byB0aGUgYGxpbmtgIGZuIGlmIG5vdCBmb3VuZC4KICogKiBgXmAgLSBMb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgYnkgc2VhcmNoaW5nIHRoZSBlbGVtZW50IGFuZCBpdHMgcGFyZW50cy4gVGhyb3cgYW4gZXJyb3IgaWYgbm90IGZvdW5kLgogKiAqIGBeXmAgLSBMb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgYnkgc2VhcmNoaW5nIHRoZSBlbGVtZW50J3MgcGFyZW50cy4gVGhyb3cgYW4gZXJyb3IgaWYgbm90IGZvdW5kLgogKiAqIGA/XmAgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQgYW5kIGl0cyBwYXJlbnRzIG9yIHBhc3MKICogICBgbnVsbGAgdG8gdGhlIGBsaW5rYCBmbiBpZiBub3QgZm91bmQuCiAqICogYD9eXmAgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQncyBwYXJlbnRzLCBvciBwYXNzCiAqICAgYG51bGxgIHRvIHRoZSBgbGlua2AgZm4gaWYgbm90IGZvdW5kLgogKgogKgogKiAjIyMjIGBjb250cm9sbGVyQXNgCiAqIENvbnRyb2xsZXIgYWxpYXMgYXQgdGhlIGRpcmVjdGl2ZSBzY29wZS4gQW4gYWxpYXMgZm9yIHRoZSBjb250cm9sbGVyIHNvIGl0CiAqIGNhbiBiZSByZWZlcmVuY2VkIGF0IHRoZSBkaXJlY3RpdmUgdGVtcGxhdGUuIFRoZSBkaXJlY3RpdmUgbmVlZHMgdG8gZGVmaW5lIGEgc2NvcGUgZm9yIHRoaXMKICogY29uZmlndXJhdGlvbiB0byBiZSB1c2VkLiBVc2VmdWwgaW4gdGhlIGNhc2Ugd2hlbiBkaXJlY3RpdmUgaXMgdXNlZCBhcyBjb21wb25lbnQuCiAqCiAqCiAqICMjIyMgYHJlc3RyaWN0YAogKiBTdHJpbmcgb2Ygc3Vic2V0IG9mIGBFQUNNYCB3aGljaCByZXN0cmljdHMgdGhlIGRpcmVjdGl2ZSB0byBhIHNwZWNpZmljIGRpcmVjdGl2ZQogKiBkZWNsYXJhdGlvbiBzdHlsZS4gSWYgb21pdHRlZCwgdGhlIGRlZmF1bHRzIChlbGVtZW50cyBhbmQgYXR0cmlidXRlcykgYXJlIHVzZWQuCiAqCiAqICogYEVgIC0gRWxlbWVudCBuYW1lIChkZWZhdWx0KTogYDxteS1kaXJlY3RpdmU+PC9teS1kaXJlY3RpdmU+YAogKiAqIGBBYCAtIEF0dHJpYnV0ZSAoZGVmYXVsdCk6IGA8ZGl2IG15LWRpcmVjdGl2ZT0iZXhwIj48L2Rpdj5gCiAqICogYENgIC0gQ2xhc3M6IGA8ZGl2IGNsYXNzPSJteS1kaXJlY3RpdmU6IGV4cDsiPjwvZGl2PmAKICogKiBgTWAgLSBDb21tZW50OiBgPCEtLSBkaXJlY3RpdmU6IG15LWRpcmVjdGl2ZSBleHAgLS0+YAogKgogKgogKiAjIyMjIGB0ZW1wbGF0ZU5hbWVzcGFjZWAKICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZG9jdW1lbnQgdHlwZSB1c2VkIGJ5IHRoZSBtYXJrdXAgaW4gdGhlIHRlbXBsYXRlLgogKiBBbmd1bGFySlMgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbiBhcyB0aG9zZSBlbGVtZW50cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIGNsb25lZAogKiBpbiBhIHNwZWNpYWwgd2F5IHdoZW4gdGhleSBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZWlyIHVzdWFsIGNvbnRhaW5lcnMgbGlrZSBgPHN2Zz5gIGFuZCBgPG1hdGg+YC4KICoKICogKiBgaHRtbGAgLSBBbGwgcm9vdCBub2RlcyBpbiB0aGUgdGVtcGxhdGUgYXJlIEhUTUwuIFJvb3Qgbm9kZXMgbWF5IGFsc28gYmUKICogICB0b3AtbGV2ZWwgZWxlbWVudHMgc3VjaCBhcyBgPHN2Zz5gIG9yIGA8bWF0aD5gLgogKiAqIGBzdmdgIC0gVGhlIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBTVkcgZWxlbWVudHMgKGV4Y2x1ZGluZyBgPG1hdGg+YCkuCiAqICogYG1hdGhgIC0gVGhlIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBNYXRoTUwgZWxlbWVudHMgKGV4Y2x1ZGluZyBgPHN2Zz5gKS4KICoKICogSWYgbm8gYHRlbXBsYXRlTmFtZXNwYWNlYCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIG5hbWVzcGFjZSBpcyBjb25zaWRlcmVkIHRvIGJlIGBodG1sYC4KICoKICogIyMjIyBgdGVtcGxhdGVgCiAqIEhUTUwgbWFya3VwIHRoYXQgbWF5OgogKiAqIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IChkZWZhdWx0KS4KICogKiBSZXBsYWNlIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IGl0c2VsZiAoaWYgYHJlcGxhY2VgIGlzIHRydWUgLSBERVBSRUNBVEVEKS4KICogKiBXcmFwIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudCAoaWYgYHRyYW5zY2x1ZGVgIGlzIHRydWUpLgogKgogKiBWYWx1ZSBtYXkgYmU6CiAqCiAqICogQSBzdHJpbmcuIEZvciBleGFtcGxlIGA8ZGl2IHJlZC1vbi1ob3Zlcj57e2RlbGV0ZV9zdHJ9fTwvZGl2PmAuCiAqICogQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0d28gYXJndW1lbnRzIGB0RWxlbWVudGAgYW5kIGB0QXR0cnNgIChkZXNjcmliZWQgaW4gdGhlIGBjb21waWxlYAogKiAgIGZ1bmN0aW9uIGFwaSBiZWxvdykgYW5kIHJldHVybnMgYSBzdHJpbmcgdmFsdWUuCiAqCiAqCiAqICMjIyMgYHRlbXBsYXRlVXJsYAogKiBUaGlzIGlzIHNpbWlsYXIgdG8gYHRlbXBsYXRlYCBidXQgdGhlIHRlbXBsYXRlIGlzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLCBhc3luY2hyb25vdXNseS4KICoKICogQmVjYXVzZSB0ZW1wbGF0ZSBsb2FkaW5nIGlzIGFzeW5jaHJvbm91cyB0aGUgY29tcGlsZXIgd2lsbCBzdXNwZW5kIGNvbXBpbGF0aW9uIG9mIGRpcmVjdGl2ZXMgb24gdGhhdCBlbGVtZW50CiAqIGZvciBsYXRlciB3aGVuIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiByZXNvbHZlZC4gIEluIHRoZSBtZWFudGltZSBpdCB3aWxsIGNvbnRpbnVlIHRvIGNvbXBpbGUgYW5kIGxpbmsKICogc2libGluZyBhbmQgcGFyZW50IGVsZW1lbnRzIGFzIHRob3VnaCB0aGlzIGVsZW1lbnQgaGFkIG5vdCBjb250YWluZWQgYW55IGRpcmVjdGl2ZXMuCiAqCiAqIFRoZSBjb21waWxlciBkb2VzIG5vdCBzdXNwZW5kIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdG8gd2FpdCBmb3IgdGVtcGxhdGVzIHRvIGJlIGxvYWRlZCBiZWNhdXNlIHRoaXMKICogd291bGQgcmVzdWx0IGluIHRoZSB3aG9sZSBhcHAgInN0YWxsaW5nIiB1bnRpbCBhbGwgdGVtcGxhdGVzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkgLSBldmVuIGluIHRoZQogKiBjYXNlIHdoZW4gb25seSBvbmUgZGVlcGx5IG5lc3RlZCBkaXJlY3RpdmUgaGFzIGB0ZW1wbGF0ZVVybGAuCiAqCiAqIFRlbXBsYXRlIGxvYWRpbmcgaXMgYXN5bmNocm9ub3VzIGV2ZW4gaWYgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHByZWxvYWRlZCBpbnRvIHRoZSB7QGxpbmsgJHRlbXBsYXRlQ2FjaGV9CiAqCiAqIFlvdSBjYW4gc3BlY2lmeSBgdGVtcGxhdGVVcmxgIGFzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMIG9yIGFzIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvCiAqIGFyZ3VtZW50cyBgdEVsZW1lbnRgIGFuZCBgdEF0dHJzYCAoZGVzY3JpYmVkIGluIHRoZSBgY29tcGlsZWAgZnVuY3Rpb24gYXBpIGJlbG93KSBhbmQgcmV0dXJucwogKiBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHVybC4gIEluIGVpdGhlciBjYXNlLCB0aGUgdGVtcGxhdGUgVVJMIGlzIHBhc3NlZCB0aHJvdWdoIHtAbGluawogKiAkc2NlI2dldFRydXN0ZWRSZXNvdXJjZVVybCAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybH0uCiAqCiAqCiAqICMjIyMgYHJlcGxhY2VgIChbKkRFUFJFQ0FURUQqIV0sIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHJlbGVhc2UgLSBpLmUuIHYyLjApCiAqIHNwZWNpZnkgd2hhdCB0aGUgdGVtcGxhdGUgc2hvdWxkIHJlcGxhY2UuIERlZmF1bHRzIHRvIGBmYWxzZWAuCiAqCiAqICogYHRydWVgIC0gdGhlIHRlbXBsYXRlIHdpbGwgcmVwbGFjZSB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudC4KICogKiBgZmFsc2VgIC0gdGhlIHRlbXBsYXRlIHdpbGwgcmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuCiAqCiAqIFRoZSByZXBsYWNlbWVudCBwcm9jZXNzIG1pZ3JhdGVzIGFsbCBvZiB0aGUgYXR0cmlidXRlcyAvIGNsYXNzZXMgZnJvbSB0aGUgb2xkIGVsZW1lbnQgdG8gdGhlIG5ldwogKiBvbmUuIFNlZSB0aGUge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSN0ZW1wbGF0ZS1leHBhbmRpbmctZGlyZWN0aXZlCiAqIERpcmVjdGl2ZXMgR3VpZGV9IGZvciBhbiBleGFtcGxlLgogKgogKiBUaGVyZSBhcmUgdmVyeSBmZXcgc2NlbmFyaW9zIHdoZXJlIGVsZW1lbnQgcmVwbGFjZW1lbnQgaXMgcmVxdWlyZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBmdW5jdGlvbiwKICogdGhlIG1haW4gb25lIGJlaW5nIHJldXNhYmxlIGN1c3RvbSBjb21wb25lbnRzIHRoYXQgYXJlIHVzZWQgd2l0aGluIFNWRyBjb250ZXh0cwogKiAoYmVjYXVzZSBTVkcgZG9lc24ndCB3b3JrIHdpdGggY3VzdG9tIGVsZW1lbnRzIGluIHRoZSBET00gdHJlZSkuCiAqCiAqICMjIyMgYHRyYW5zY2x1ZGVgCiAqIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgYXBwZWFycyBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIGRpcmVjdGl2ZS4KICogVGhlIGNvbnRlbnRzIGFyZSBjb21waWxlZCBhbmQgcHJvdmlkZWQgdG8gdGhlIGRpcmVjdGl2ZSBhcyBhICoqdHJhbnNjbHVzaW9uIGZ1bmN0aW9uKiouIFNlZSB0aGUKICoge0BsaW5rICRjb21waWxlI3RyYW5zY2x1c2lvbiBUcmFuc2NsdXNpb259IHNlY3Rpb24gYmVsb3cuCiAqCiAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgdHJhbnNjbHVzaW9uIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgeW91IHdhbnQgdG8gdHJhbnNjbHVkZSBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUKICogZGlyZWN0aXZlJ3MgZWxlbWVudCBvciB0aGUgZW50aXJlIGVsZW1lbnQ6CiAqCiAqICogYHRydWVgIC0gdHJhbnNjbHVkZSB0aGUgY29udGVudCAoaS5lLiB0aGUgY2hpbGQgbm9kZXMpIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50LgogKiAqIGAnZWxlbWVudCdgIC0gdHJhbnNjbHVkZSB0aGUgd2hvbGUgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaW5jbHVkaW5nIGFueSBkaXJlY3RpdmVzIG9uIHRoaXMKICogICBlbGVtZW50IHRoYXQgZGVmaW5lZCBhdCBhIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhpcyBkaXJlY3RpdmUuIFdoZW4gdXNlZCwgdGhlIGB0ZW1wbGF0ZWAKICogICBwcm9wZXJ0eSBpcyBpZ25vcmVkLgogKgogKgogKiAjIyMjIGBjb21waWxlYAogKgogKiBgYGBqcwogKiAgIGZ1bmN0aW9uIGNvbXBpbGUodEVsZW1lbnQsIHRBdHRycywgdHJhbnNjbHVkZSkgeyAuLi4gfQogKiBgYGAKICoKICogVGhlIGNvbXBpbGUgZnVuY3Rpb24gZGVhbHMgd2l0aCB0cmFuc2Zvcm1pbmcgdGhlIHRlbXBsYXRlIERPTS4gU2luY2UgbW9zdCBkaXJlY3RpdmVzIGRvIG5vdCBkbwogKiB0ZW1wbGF0ZSB0cmFuc2Zvcm1hdGlvbiwgaXQgaXMgbm90IHVzZWQgb2Z0ZW4uIFRoZSBjb21waWxlIGZ1bmN0aW9uIHRha2VzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogKgogKiAgICogYHRFbGVtZW50YCAtIHRlbXBsYXRlIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aGVyZSB0aGUgZGlyZWN0aXZlIGhhcyBiZWVuDQqM3O9WaHgBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PC1AAEAGbrDAqAc2wKgHYJUiH/VYenzTQbUVsIAQC/DztQAAAQEICgCjXr0ATaW4jNzvVmN5AQBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNL8QABABne4wKgHYMCoBzYf9ZUiQbUVsFh6fNOAEAFT8DUAAAEBCAoATaW4AKNevTdGRTgNCiBkZWNsYXJlZC4gSXQgaXMKICogICAgIHNhZmUgdG8gZG8gdGVtcGxhdGUgdHJhbnNmb3JtYXRpb24gb24gdGhlIGVsZW1lbnQgYW5kIGNoaWxkIGVsZW1lbnRzIG9ubHkuCiAqCiAqICAgKiBgdEF0dHJzYCAtIHRlbXBsYXRlIGF0dHJpYnV0ZXMgLSBOb3JtYWxpemVkIGxpc3Qgb2YgYXR0cmlidXRlcyBkZWNsYXJlZCBvbiB0aGlzIGVsZW1lbnQgc2hhcmVkCiAqICAgICBiZXR3ZWVuIGFsbCBkaXJlY3RpdmUgY29tcGlsZSBmdW5jdGlvbnMuCiAqCiAqICAgKiBgdHJhbnNjbHVkZWAgLSAgWypERVBSRUNBVEVEKiFdIEEgdHJhbnNjbHVkZSBsaW5raW5nIGZ1bmN0aW9uOiBgZnVuY3Rpb24oc2NvcGUsIGNsb25lTGlua2luZ0ZuKWAKICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CiAqICoqTm90ZToqKiBUaGUgdGVtcGxhdGUgaW5zdGFuY2UgYW5kIHRoZSBsaW5rIGluc3RhbmNlIG1heSBiZSBkaWZmZXJlbnQgb2JqZWN0cyBpZiB0aGUgdGVtcGxhdGUgaGFzCiAqIGJlZW4gY2xvbmVkLiBGb3IgdGhpcyByZWFzb24gaXQgaXMgKipub3QqKiBzYWZlIHRvIGRvIGFueXRoaW5nIG90aGVyIHRoYW4gRE9NIHRyYW5zZm9ybWF0aW9ucyB0aGF0CiAqIGFwcGx5IHRvIGFsbCBjbG9uZWQgRE9NIG5vZGVzIHdpdGhpbiB0aGUgY29tcGlsZSBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBET00gbGlzdGVuZXIgcmVnaXN0cmF0aW9uCiAqIHNob3VsZCBiZSBkb25lIGluIGEgbGlua2luZyBmdW5jdGlvbiByYXRoZXIgdGhhbiBpbiBhIGNvbXBpbGUgZnVuY3Rpb24uCiAqIDwvZGl2PgoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CiAqICoqTm90ZToqKiBUaGUgY29tcGlsZSBmdW5jdGlvbiBjYW5ub3QgaGFuZGxlIGRpcmVjdGl2ZXMgdGhhdCByZWN1cnNpdmVseSB1c2UgdGhlbXNlbHZlcyBpbiB0aGVpcgogKiBvd24gdGVtcGxhdGVzIG9yIGNvbXBpbGUgZnVuY3Rpb25zLiBDb21waWxpbmcgdGhlc2UgZGlyZWN0aXZlcyByZXN1bHRzIGluIGFuIGluZmluaXRlIGxvb3AgYW5kIGEKICogc3RhY2sgb3ZlcmZsb3cgZXJyb3JzLgogKgogKiBUaGlzIGNhbiBiZSBhdm9pZGVkIGJ5IG1hbnVhbGx5IHVzaW5nICRjb21waWxlIGluIHRoZSBwb3N0TGluayBmdW5jdGlvbiB0byBpbXBlcmF0aXZlbHkgY29tcGlsZQogKiBhIGRpcmVjdGl2ZSdzIHRlbXBsYXRlIGluc3RlYWQgb2YgcmVseWluZyBvbiBhdXRvbWF0aWMgdGVtcGxhdGUgY29tcGlsYXRpb24gdmlhIGB0ZW1wbGF0ZWAgb3IKICogYHRlbXBsYXRlVXJsYCBkZWNsYXJhdGlvbiBvciBtYW51YWwgY29tcGlsYXRpb24gaW5zaWRlIHRoZSBjb21waWxlIGZ1bmN0aW9uLgogKiA8L2Rpdj4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZXJyb3IiPgogKiAqKk5vdGU6KiogVGhlIGB0cmFuc2NsdWRlYCBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29tcGlsZSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCBhcyBpdAogKiAgIGUuZy4gZG9lcyBub3Qga25vdyBhYm91dCB0aGUgcmlnaHQgb3V0ZXIgc2NvcGUuIFBsZWFzZSB1c2UgdGhlIHRyYW5zY2x1ZGUgZnVuY3Rpb24gdGhhdCBpcyBwYXNzZWQKICogICB0byB0aGUgbGluayBmdW5jdGlvbiBpbnN0ZWFkLgogKiA8L2Rpdj4KCiAqIEEgY29tcGlsZSBmdW5jdGlvbiBjYW4gaGF2ZSBhIHJldHVybiB2YWx1ZSB3aGljaCBjYW4gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LgogKgogKiAqIHJldHVybmluZyBhIChwb3N0LWxpbmspIGZ1bmN0aW9uIC0gaXMgZXF1aXZhbGVudCB0byByZWdpc3RlcmluZyB0aGUgbGlua2luZyBmdW5jdGlvbiB2aWEgdGhlCiAqICAgYGxpbmtgIHByb3BlcnR5IG9mIHRoZSBjb25maWcgb2JqZWN0IHdoZW4gdGhlIGNvbXBpbGUgZnVuY3Rpb24gaXMgZW1wdHkuCiAqCiAqICogcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGZ1bmN0aW9uKHMpIHJlZ2lzdGVyZWQgdmlhIGBwcmVgIGFuZCBgcG9zdGAgcHJvcGVydGllcyAtIGFsbG93cyB5b3UgdG8KICogICBjb250cm9sIHdoZW4gYSBsaW5raW5nIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBsaW5raW5nIHBoYXNlLiBTZWUgaW5mbyBhYm91dAogKiAgIHByZS1saW5raW5nIGFuZCBwb3N0LWxpbmtpbmcgZnVuY3Rpb25zIGJlbG93LgogKgogKgogKiAjIyMjIGBsaW5rYAogKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgb25seSBpZiB0aGUgYGNvbXBpbGVgIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkLgogKgogKiBgYGBqcwogKiAgIGZ1bmN0aW9uIGxpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMsIGNvbnRyb2xsZXIsIHRyYW5zY2x1ZGVGbikgeyAuLi4gfQogKiBgYGAKICoKICogVGhlIGxpbmsgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlZ2lzdGVyaW5nIERPTSBsaXN0ZW5lcnMgYXMgd2VsbCBhcyB1cGRhdGluZyB0aGUgRE9NLiBJdCBpcwogKiBleGVjdXRlZCBhZnRlciB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gY2xvbmVkLiBUaGlzIGlzIHdoZXJlIG1vc3Qgb2YgdGhlIGRpcmVjdGl2ZSBsb2dpYyB3aWxsIGJlCiAqIHB1dC4KICoKICogICAqIGBzY29wZWAgLSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBTY29wZX0gLSBUaGUgc2NvcGUgdG8gYmUgdXNlZCBieSB0aGUKICogICAgIGRpcmVjdGl2ZSBmb3IgcmVnaXN0ZXJpbmcge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXN9LgogKgogKiAgICogYGlFbGVtZW50YCAtIGluc3RhbmNlIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aGVyZSB0aGUgZGlyZWN0aXZlIGlzIHRvIGJlIHVzZWQuIEl0IGlzIHNhZmUgdG8KICogICAgIG1hbmlwdWxhdGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50IG9ubHkgaW4gYHBvc3RMaW5rYCBmdW5jdGlvbiBzaW5jZSB0aGUgY2hpbGRyZW4gaGF2ZQogKiAgICAgYWxyZWFkeSBiZWVuIGxpbmtlZC4KICoKICogICAqIGBpQXR0cnNgIC0gaW5zdGFuY2UgYXR0cmlidXRlcyAtIE5vcm1hbGl6ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIGRlY2xhcmVkIG9uIHRoaXMgZWxlbWVudCBzaGFyZWQKICogICAgIGJldHdlZW4gYWxsIGRpcmVjdGl2ZSBsaW5raW5nIGZ1bmN0aW9ucy4KICoKICogICAqIGBjb250cm9sbGVyYCAtIGEgY29udHJvbGxlciBpbnN0YW5jZSAtIEEgY29udHJvbGxlciBpbnN0YW5jZSBpZiBhdCBsZWFzdCBvbmUgZGlyZWN0aXZlIG9uIHRoZQogKiAgICAgZWxlbWVudCBkZWZpbmVzIGEgY29udHJvbGxlci4gVGhlIGNvbnRyb2xsZXIgaXMgc2hhcmVkIGFtb25nIGFsbCB0aGUgZGlyZWN0aXZlcywgd2hpY2ggYWxsb3dzCiAqICAgICB0aGUgZGlyZWN0aXZlcyB0byB1c2UgdGhlIGNvbnRyb2xsZXJzIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLgogKgogKiAgICogYHRyYW5zY2x1ZGVGbmAgLSBBIHRyYW5zY2x1ZGUgbGlua2luZyBmdW5jdGlvbiBwcmUtYm91bmQgdG8gdGhlIGNvcnJlY3QgdHJhbnNjbHVzaW9uIHNjb3BlLgogKiAgICAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgYCR0cmFuc2NsdWRlYAogKiAgICAgcGFyYW1ldGVyIG9mIGRpcmVjdGl2ZSBjb250cm9sbGVycywgc2VlIHRoZXJlIGZvciBkZXRhaWxzLgogKiAgICAgYGZ1bmN0aW9uKFtzY29wZV0sIGNsb25lTGlua2luZ0ZuLCBmdXR1cmVQYXJlbnRFbGVtZW50KWAuCiAqCiAqICMjIyMgUHJlLWxpbmtpbmcgZnVuY3Rpb24KICoKICogRXhlY3V0ZWQgYmVmb3JlIHRoZSBjaGlsZCBlbGVtZW50cyBhcmUgbGlua2VkLiBOb3Qgc2FmZSB0byBkbyBET00gdHJhbnNmb3JtYXRpb24gc2luY2UgdGhlCiAqIGNvbXBpbGVyIGxpbmtpbmcgZnVuY3Rpb24gd2lsbCBmYWlsIHRvIGxvY2F0ZSB0aGUgY29ycmVjdCBlbGVtZW50cyBmb3IgbGlua2luZy4KICoKICogIyMjIyBQb3N0LWxpbmtpbmcgZnVuY3Rpb24KICoKICogRXhlY3V0ZWQgYWZ0ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIGFyZSBsaW5rZWQuCiAqCiAqIE5vdGUgdGhhdCBjaGlsZCBlbGVtZW50cyB0aGF0IGNvbnRhaW4gYHRlbXBsYXRlVXJsYCBkaXJlY3RpdmVzIHdpbGwgbm90IGhhdmUgYmVlbiBjb21waWxlZAogKiBhbmQgbGlua2VkIHNpbmNlIHRoZXkgYXJlIHdhaXRpbmcgZm9yIHRoZWlyIHRlbXBsYXRlIHRvIGxvYWQgYXN5bmNocm9ub3VzbHkgYW5kIHRoZWlyIG93bgogKiBjb21waWxhdGlvbiBhbmQgbGlua2luZyBoYXMgYmVlbiBzdXNwZW5kZWQgdW50aWwgdGhhdCBvY2N1cnMuCiAqCiAqIEl0IGlzIHNhZmUgdG8gZG8gRE9NIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBwb3N0LWxpbmtpbmcgZnVuY3Rpb24gb24gZWxlbWVudHMgdGhhdCBhcmUgbm90IHdhaXRpbmcKICogZm9yIHRoZWlyIGFzeW5jIHRlbXBsYXRlcyB0byBiZSByZXNvbHZlZC4KICoKICoKICogIyMjIFRyYW5zY2x1c2lvbgogKgogKiBUcmFuc2NsdXNpb24gaXMgdGhlIHByb2Nlc3Mgb2YgZXh0cmFjdGluZyBhIGNvbGxlY3Rpb24gb2YgRE9NIGVsZW1lbnQgZnJvbSBvbmUgcGFydCBvZiB0aGUgRE9NIGFuZAogKiBjb3B5aW5nIHRoZW0gdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBET00sIHdoaWxlIG1haW50YWluaW5nIHRoZWlyIGNvbm5lY3Rpb24gdG8gdGhlIG9yaWdpbmFsIEFuZ3VsYXJKUwogKiBzY29wZSBmcm9tIHdoZXJlIHRoZXkgd2VyZSB0YWtlbi4KICoKICogVHJhbnNjbHVzaW9uIGlzIHVzZWQgKG9mdGVuIHdpdGgge0BsaW5rIG5nVHJhbnNjbHVkZX0pIHRvIGluc2VydCB0aGUKICogb3JpZ2luYWwgY29udGVudHMgb2YgYSBkaXJlY3RpdmUncyBlbGVtZW50IGludG8gYSBzcGVjaWZpZWQgcGxhY2UgaW4gdGhlIHRlbXBsYXRlIG9mIHRoZSBkaXJlY3RpdmUuCiAqIFRoZSBiZW5lZml0IG9mIHRyYW5zY2x1c2lvbiwgb3ZlciBzaW1wbHkgbW92aW5nIHRoZSBET00gZWxlbWVudHMgbWFudWFsbHksIGlzIHRoYXQgdGhlIHRyYW5zY2x1ZGVkCiAqIGNvbnRlbnQgaGFzIGFjY2VzcyB0byB0aGUgcHJvcGVydGllcyBvbiB0aGUgc2NvcGUgZnJvbSB3aGljaCBpdCB3YXMgdGFrZW4sIGV2ZW4gaWYgdGhlIGRpcmVjdGl2ZQogKiBoYXMgaXNvbGF0ZWQgc2NvcGUuCiAqIFNlZSB0aGUge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSNjcmVhdGluZy1hLWRpcmVjdGl2ZS10aGF0LXdyYXBzLW90aGVyLWVsZW1lbnRzIERpcmVjdGl2ZXMgR3VpZGV9LgogKgogKiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUgd2lkZ2V0IHRvIGhhdmUgcHJpdmF0ZSBzdGF0ZSBmb3IgaXRzIHRlbXBsYXRlLCB3aGlsZSB0aGUgdHJhbnNjbHVkZWQKICogY29udGVudCBoYXMgYWNjZXNzIHRvIGl0cyBvcmlnaW5hdGluZyBzY29wZS4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CiAqICoqTm90ZToqKiBXaGVuIHRlc3RpbmcgYW4gZWxlbWVudCB0cmFuc2NsdWRlIGRpcmVjdGl2ZSB5b3UgbXVzdCBub3QgcGxhY2UgdGhlIGRpcmVjdGl2ZSBhdCB0aGUgcm9vdCBvZiB0aGUKICogRE9NIGZyYWdtZW50IHRoYXQgaXMgYmVpbmcgY29tcGlsZWQuIFNlZSB7QGxpbmsgZ3VpZGUvdW5pdC10ZXN0aW5nI3Rlc3RpbmctdHJhbnNjbHVzaW9uLWRpcmVjdGl2ZXMKICogVGVzdGluZyBUcmFuc2NsdXNpb24gRGlyZWN0aXZlc30uCiAqIDwvZGl2PgogKgogKiAjIyMjIFRyYW5zY2x1c2lvbiBGdW5jdGlvbnMKICoKICogV2hlbiBhIGRpcmVjdGl2ZSByZXF1ZXN0cyB0cmFuc2NsdXNpb24sIHRoZSBjb21waWxlciBleHRyYWN0cyBpdHMgY29udGVudHMgYW5kIHByb3ZpZGVzIGEgKip0cmFuc2NsdXNpb24KICogZnVuY3Rpb24qKiB0byB0aGUgZGlyZWN0aXZlJ3MgYGxpbmtgIGZ1bmN0aW9uIGFuZCBgY29udHJvbGxlcmAuIFRoaXMgdHJhbnNjbHVzaW9uIGZ1bmN0aW9uIGlzIGEgc3BlY2lhbAogKiAqKmxpbmtpbmcgZnVuY3Rpb24qKiB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjb21waWxlZCBjb250ZW50cyBsaW5rZWQgdG8gYSBuZXcgdHJhbnNjbHVzaW9uIHNjb3BlLgogKgogKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KICogSWYgeW91IGFyZSBqdXN0IHVzaW5nIHtAbGluayBuZ1RyYW5zY2x1ZGV9IHRoZW4geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyBmdW5jdGlvbiwgc2luY2UKICogbmdUcmFuc2NsdWRlIHdpbGwgZGVhbCB3aXRoIGl0IGZvciB1cy4KICogPC9kaXY+CiAqCiAqIElmIHlvdSB3YW50IHRvIG1hbnVhbGx5IGNvbnRyb2wgdGhlIGluc2VydGlvbiBhbmQgcmVtb3ZhbCBvZiB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBpbiB5b3VyIGRpcmVjdGl2ZQogKiB0aGVuIHlvdSBtdXN0IHVzZSB0aGlzIHRyYW5zY2x1ZGUgZnVuY3Rpb24uIFdoZW4geW91IGNhbGwgYSB0cmFuc2NsdWRlIGZ1bmN0aW9uIGl0IHJldHVybnMgYSBhIGpxTGl0ZS9KUXVlcnkKICogb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbXBpbGVkIERPTSwgd2hpY2ggaXMgbGlua2VkIHRvIHRoZSBjb3JyZWN0IHRyYW5zY2x1c2lvbiBzY29wZS4KICoKICogV2hlbiB5b3UgY2FsbCBhIHRyYW5zY2x1c2lvbiBmdW5jdGlvbiB5b3UgY2FuIHBhc3MgaW4gYSAqKmNsb25lIGF0dGFjaCBmdW5jdGlvbioqLiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMKICogdHdvIHBhcmFtZXRlcnMsIGBmdW5jdGlvbihjbG9uZSwgc2NvcGUpIHsgLi4uIH1gLCB3aGVyZSB0aGUgYGNsb25lYCBpcyBhIGZyZXNoIGNvbXBpbGVkIGNvcHkgb2YgeW91ciB0cmFuc2NsdWRlZAogKiBjb250ZW50IGFuZCB0aGUgYHNjb3BlYCBpcyB0aGUgbmV3bHkgY3JlYXRlZCB0cmFuc2NsdXNpb24gc2NvcGUsIHRvIHdoaWNoIHRoZSBjbG9uZSBpcyBib3VuZC4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CiAqICoqQmVzdCBQcmFjdGljZSoqOiBBbHdheXMgcHJvdmlkZSBhIGBjbG9uZUZuYCAoY2xvbmUgYXR0YWNoIGZ1bmN0aW9uKSB3aGVuIHlvdSBjYWxsIGEgdHJhbnNsdWRlIGZ1bmN0aW9uCiAqIHNpbmNlIHlvdSB0aGVuIGdldCBhIGZyZXNoIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBET00gYW5kIGFsc28gaGF2ZSBhY2Nlc3MgdG8gdGhlIG5ldyB0cmFuc2NsdXNpb24gc2NvcGUuCiAqIDwvZGl2PgogKgogKiBJdCBpcyBub3JtYWwgcHJhY3RpY2UgdG8gYXR0YWNoIHlvdXIgdHJhbnNjbHVkZWQgY29udGVudCAoYGNsb25lYCkgdG8gdGhlIERPTSBpbnNpZGUgeW91ciAqKmNsb25lCiAqIGF0dGFjaCBmdW5jdGlvbioqOgogKgogKiBgYGBqcwogKiB2YXIgdHJhbnNjbHVkZWRDb250ZW50LCB0cmFuc2NsdXNpb25TY29wZTsKICoKICogJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUsIHNjb3BlKSB7CiAqICAgZWxlbWVudC5hcHBlbmQoY2xvbmUpOwogKiAgIHRyYW5zY2x1ZGVkQ29udGVudCA9IGNsb25lOwogKiAgIHRyYW5zY2x1c2lvblNjb3BlID0gc2NvcGU7CiAqIH0pOwogKiBgYGAKICoKICogTGF0ZXIsIGlmIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBmcm9tIHlvdXIgRE9NIHRoZW4geW91IHNob3VsZCBhbHNvIGRlc3Ryb3kgdGhlCiAqIGFzc29jaWF0ZWQgdHJhbnNjbHVzaW9uIHNjb3BlOgogKgogKiBgYGBqcwogKiB0cmFuc2NsdWRlZENvbnRlbnQucmVtb3ZlKCk7CiAqIHRyYW5zY2x1c2lvblNjb3BlLiRkZXN0cm95KCk7CiAqIGBgYAogKgogKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KICogKipCZXN0IFByYWN0aWNlKio6IGlmIHlvdSBpbnRlbmQgdG8gYWRkIGFuZCByZW1vdmUgdHJhbnNjbHVkZWQgY29udGVudCBtYW51YWxseSBpbiB5b3VyIGRpcmVjdGl2ZQogKiAoYnkgY2FsbGluZyB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiB0byBnZXQgdGhlIERPTSBhbmQgYW5kIGNhbGxpbmcgYGVsZW1lbnQucmVtb3ZlKClgIHRvIHJlbW92ZSBpdCksCiAqIHRoZW4geW91IGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGAkZGVzdHJveWAgb24gdGhlIHRyYW5zY2x1c2lvbiBzY29wZS4KICogPC9kaXY+CiAqCiAqIFRoZSBidWlsdC1pbiBET00gbWFuaXB1bGF0aW9uIGRpcmVjdGl2ZXMsIHN1Y2ggYXMge0BsaW5rIG5nSWZ9LCB7QGxpbmsgbmdTd2l0Y2h9IGFuZCB7QGxpbmsgbmdSZXBlYXR9CiAqIGF1dG9tYXRpY2FsbHkgZGVzdHJveSB0aGVpciB0cmFuc2x1ZGVkIGNsb25lcyBhcyBuZWNlc3Nhcnkgc28geW91IGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgaWYKICogeW91IGFyZSBzaW1wbHkgdXNpbmcge0BsaW5rIG5nVHJhbnNjbHVkZX0gdG8gaW5qZWN0IHRoZSB0cmFuc2NsdXNpb24gaW50byB5b3VyIGRpcmVjdGl2ZS4KICoKICoKICogIyMjIyBUcmFuc2NsdXNpb24gU2NvcGVzCiAqCiAqIFdoZW4geW91IGNhbGwgYSB0cmFuc2NsdWRlIGZ1bmN0aW9uIGl0IHJldHVybnMgYSBET00gZnJhZ21lbnQgdGhhdCBpcyBwcmUtYm91bmQgdG8gYSAqKnRyYW5zY2x1c2lvbgogKiBzY29wZSoqLiBUaGlzIHNjb3BlIGlzIHNwZWNpYWwsIGluIHRoYXQgaXQgaXMgYSBjaGlsZCBvZiB0aGUgZGlyZWN0aXZlJ3Mgc2NvcGUgKGFuZCBzbyBnZXRzIGRlc3Ryb3llZAogKiB3aGVuIHRoZSBkaXJlY3RpdmUncyBzY29wZSBnZXRzIGRlc3Ryb3llZCkgYnV0IGl0IGluaGVyaXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzY29wZSBmcm9tIHdoaWNoIGl0CiAqIHdhcyB0YWtlbi4KICoKICogRm9yIGV4YW1wbGUgY29uc2lkZXIgYSBkaXJlY3RpdmUgdGhhdCB1c2VzIHRyYW5zY2x1c2lvbiBhbmQgaXNvbGF0ZWQgc2NvcGUuIFRoZSBET00gaGllcmFyY2h5IG1pZ2h0IGxvb2sKICogbGlrZSB0aGlzOgogKgogKiBgYGBodG1sCiAqIDxkaXYgbmctYXBwPgogKiAgIDxkaXYgaXNvbGF0ZT4KICogICAgIDxkaXYgdHJhbnNjbHVzaW9uPgogKiAgICAgPC9kaXY+CiAqICAgPC9kaXY+CiAqIDwvZGl2PgogKiBgYGAKICoKICogVGhlIGAkcGFyZW50YCBzY29wZSBoaWVyYXJjaHkgd2lsbCBsb29rIGxpa2UgdGhpczoKICoKICogYGBgCiAqIC0gJHJvb3RTY29wZQogKiAgIC0gaXNvbGF0ZQogKiAgICAgLSB0cmFuc2NsdXNpb24KICogYGBgCiAqCiAqIGJ1dCB0aGUgc2NvcGVzIHdpbGwgaW5oZXJpdCBwcm90b3R5cGljYWxseSBmcm9tIGRpZmZlcmVudCBzY29wZXMgdG8gdGhlaXIgYCRwYXJlbnRgLgogKgogKiBgYGAKICogLSAkcm9vdFNjb3BlCiAqICAgLSB0cmFuc2NsdXNpb24KICogLSBpc29sYXRlCiAqIGBgYAogKgogKgogKiAjIyMgQXR0cmlidXRlcwogKgogKiBUaGUge0BsaW5rIG5nLiRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIEF0dHJpYnV0ZXN9IG9iamVjdCAtIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBpbiB0aGUKICogYGxpbmsoKWAgb3IgYGNvbXBpbGUoKWAgZnVuY3Rpb25zLiBJdCBoYXMgYSB2YXJpZXR5IG9mIHVzZXMuCiAqCiAqIGFjY2Vzc2luZyAqTm9ybWFsaXplZCBhdHRyaWJ1dGUgbmFtZXM6KgogKiBEaXJlY3RpdmVzIGxpa2UgJ25nQmluZCcgY2FuIGJlIGV4cHJlc3NlZCBpbiBtYW55IHdheXM6ICduZzpiaW5kJywgYGRhdGEtbmctYmluZGAsIG9yICd4LW5nLWJpbmQnLgogKiB0aGUgYXR0cmlidXRlcyBvYmplY3QgYWxsb3dzIGZvciBub3JtYWxpemVkIGFjY2VzcyB0bwogKiAgIHRoZSBhdHRyaWJ1dGVzLgogKgogKiAqICpEaXJlY3RpdmUgaW50ZXItY29tbXVuaWNhdGlvbjoqIEFsbCBkaXJlY3RpdmVzIHNoYXJlIHRoZSBzYW1lIGluc3RhbmNlIG9mIHRoZSBhdHRyaWJ1dGVzCiAqICAgb2JqZWN0IHdoaWNoIGFsbG93cyB0aGUgZGlyZWN0aXZlcyB0byB1c2UgdGhlIGF0dHJpYnV0ZXMgb2JqZWN0IGFzIGludGVyIGRpcmVjdGl2ZQogKiAgIGNvbW11bmljYXRpb24uCiAqCiAqICogKlN1cHBvcnRzIGludGVycG9sYXRpb246KiBJbnRlcnBvbGF0aW9uIGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgb2JqZWN0CiAqICAgYWxsb3dpbmcgb3RoZXIgZGlyZWN0aXZlcyB0byByZWFkIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuCiAqCiAqICogKk9ic2VydmluZyBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlczoqIFVzZSBgJG9ic2VydmVgIHRvIG9ic2VydmUgdGhlIHZhbHVlIGNoYW5nZXMgb2YgYXR0cmlidXRlcwogKiAgIHRoYXQgY29udGFpbiBpbnRlcnBvbGF0aW9uIChlLmcuIGBzcmM9Int7YmFyfX0iYCkuIE5vdCBvbmx5IGlzIHRoaXMgdmVyeSBlZmZpY2llbnQgYnV0IGl0J3MgYWxzbwogKiAgIHRoZSBvbmx5IHdheSB0byBlYXNpbHkgZ2V0IHRoZSBhY3R1YWwgdmFsdWUgYmVjYXVzZSBkdXJpbmcgdGhlIGxpbmtpbmcgcGhhc2UgdGhlIGludGVycG9sYXRpb24KICogICBoYXNuJ3QgYmVlbiBldmFsdWF0ZWQgeWV0IGFuZCBzbyB0aGUgdmFsdWUgaXMgYXQgdGhpcyB0aW1lIHNldCB0byBgdW5kZWZpbmVkYC4KICoKICogYGBganMKICogZnVuY3Rpb24gbGlua2luZ0ZuKHNjb3BlLCBlbG0sIGF0dHJzLCBjdHJsKSB7CiAqICAgLy8gZ2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUKICogICBjb25zb2xlLmxvZyhhdHRycy5uZ01vZGVsKTsKICoKICogICAvLyBjaGFuZ2UgdGhlIGF0dHJpYnV0ZQogKiAgIGF0dHJzLiRzZXQoJ25nTW9kZWwnLCAnbmV3IHZhbHVlJyk7CiAqCiAqICAgLy8gb2JzZXJ2ZSBjaGFuZ2VzIHRvIGludGVycG9sYXRlZCBhdHRyaWJ1dGUKICogICBhdHRycy4kb2JzZXJ2ZSgnbmdNb2RlbCcsIGZ1bmN0aW9uKHZhbHVlKSB7CiAqICAgICBjb25zb2xlLmxvZygnbmdNb2RlbCBoYXMgY2hhbmdlZCB2YWx1ZSB0byAnICsgdmFsdWUpOwogKiAgIH0pOwogKiB9CiAqIGBgYAogKgogKiAjIyBFeGFtcGxlCiAqCiAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgogKiAqKk5vdGUqKjogVHlwaWNhbGx5IGRpcmVjdGl2ZXMgYXJlIHJlZ2lzdGVyZWQgd2l0aCBgbW9kdWxlLmRpcmVjdGl2ZWAuIFRoZSBleGFtcGxlIGJlbG93IGlzCiAqIHRvIGlsbHVzdHJhdGUgaG93IGAkY29tcGlsZWAgd29ya3MuCiAqIDwvZGl2PgogKgogPGV4YW1wbGUgbW9kdWxlPSJjb21waWxlRXhhbXBsZSI+CiAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgPHNjcmlwdD4KICAgICAgYW5ndWxhci5tb2R1bGUoJ2NvbXBpbGVFeGFtcGxlJywgW10sIGZ1bmN0aW9uKCRjb21waWxlUHJvdmlkZXIpIHsKICAgICAgICAvLyBjb25maWd1cmUgbmV3ICdjb21waWxlJyBkaXJlY3RpdmUgYnkgcGFzc2luZyBhIGRpcmVjdGl2ZQogICAgICAgIC8vIGZhY3RvcnkgZnVuY3Rpb24uIFRoZSBmYWN0b3J5IGZ1bmN0aW9uIGluamVjdHMgdGhlICckY29tcGlsZScKICAgICAgICAkY29tcGlsZVByb3ZpZGVyLmRpcmVjdGl2ZSgnY29tcGlsZScsIGZ1bmN0aW9uKCRjb21waWxlKSB7CiAgICAgICAgICAvLyBkaXJlY3RpdmUgZmFjdG9yeSBjcmVhdGVzIGEgbGluayBmdW5jdGlvbgogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgewogICAgICAgICAgICBzY29wZS4kd2F0Y2goCiAgICAgICAgICAgICAgZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICAgICAgICAgICAvLyB3YXRjaCB0aGUgJ2NvbXBpbGUnIGV4cHJlc3Npb24gZm9yIGNoYW5nZXMKICAgICAgICAgICAgICAgIHJldHVybiBzY29wZS4kZXZhbChhdHRycy5jb21waWxlKTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSAnY29tcGlsZScgZXhwcmVzc2lvbiBjaGFuZ2VzCiAgICAgICAgICAgICAgICAvLyBhc3NpZ24gaXQgaW50byB0aGUgY3VycmVudCBET00KICAgICAgICAgICAgICAgIGVsZW1lbnQuaHRtbCh2YWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0aGUgbmV3IERPTSBhbmQgbGluayBpdCB0byB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgLy8gc2NvcGUuCiAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBvbmx5IGNvbXBpbGUgLmNoaWxkTm9kZXMgc28gdGhhdAogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZ2V0IGludG8gaW5maW5pdGUgbG9vcCBjb21waWxpbmcgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICAkY29tcGlsZShlbGVtZW50LmNvbnRlbnRzKCkpKHNjb3BlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9KQogICAgICAuY29udHJvbGxlcignR3JlZXRlckNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICRzY29wZS5uYW1lID0gJ0FuZ3VsYXInOwogICAgICAgICRzY29wZS5odG1sID0gJ0hlbGxvIHt7bmFtZX19JzsKICAgICAgfV0pOwogICAgPC9zY3JpcHQ+CiAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkdyZWV0ZXJDb250cm9sbGVyIj4KICAgICAgPGlucHV0IG5nLW1vZGVsPSJuYW1lIj4gPGJyPgogICAgICA8dGV4dGFyZWEgbmctbW9kZWw9Imh0bWwiPjwvdGV4dGFyZWE+IDxicj4KICAgICAgPGRpdiBjb21waWxlPSJodG1sIj48L2Rpdj4KICAgIDwvZGl2PgogICA8L2ZpbGU+CiAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgIGl0KCdzaG91bGQgYXV0byBjb21waWxlJywgZnVuY3Rpb24oKSB7CiAgICAgICB2YXIgdGV4dGFyZWEgPSAkKCd0ZXh0YXJlYScpOwogICAgICAgdmFyIG91dHB1dCA9ICQoJ2Rpdltjb21waWxlXScpOwogICAgICAgLy8gVGhlIGluaXRpYWwgc3RhdGUgcmVhZHMgJ0hlbGxvIEFuZ3VsYXInLgogICAgICAgZXhwZWN0KG91dHB1dC5nZXRUZXh0KCkpLnRvQmUoJ0hlbGxvIEFuZ3VsYXInKTsKICAgICAgIHRleHRhcmVhLmNsZWFyKCk7CiAgICAgICB0ZXh0YXJlYS5zZW5kS2V5cygne3tuYW1lfX0hJyk7CiAgICAgICBleHBlY3Qob3V0cHV0LmdldFRleHQoKSkudG9CZSgnQW5ndWxhciEnKTsKICAgICB9KTsKICAgPC9maWxlPgogPC9leGFtcGxlPgoKICoKICoKICogQHBhcmFtIHtzdHJpbmd8RE9NRWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG9yIEhUTUwgc3RyaW5nIHRvIGNvbXBpbGUgaW50byBhIHRlbXBsYXRlIGZ1bmN0aW9uLgogKiBAcGFyYW0ge2Z1bmN0aW9uKGFuZ3VsYXIuU2NvcGUsIGNsb25lQXR0YWNoRm49KX0gdHJhbnNjbHVkZSBmdW5jdGlvbiBhdmFpbGFibGUgdG8gZGlyZWN0aXZlcyAtIERFUFJFQ0FURUQuCiAqCiAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWVycm9yIj4KICogKipOb3RlOioqIFBhc3NpbmcgYSBgdHJhbnNjbHVkZWAgZnVuY3Rpb24gdG8gdGhlICRjb21waWxlIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQsIGFzIGl0CiAqICAgZS5nLiB3aWxsIG5vdCB1c2UgdGhlIHJpZ2h0IG91dGVyIHNjb3BlLiBQbGVhc2UgcGFzcyB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiBhcyBhCiAqICAgYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCB0byB0aGUgbGluayBmdW5jdGlvbiBpbnN0ZWFkLgogKiA8L2Rpdj4KICoKICogQHBhcmFtIHtudW1iZXJ9IG1heFByaW9yaXR5IG9ubHkgYXBwbHkgZGlyZWN0aXZlcyBsb3dlciB0aGFuIGdpdmVuIHByaW9yaXR5IChPbmx5IGVmZmVjdHMgdGhlCiAqICAgICAgICAgICAgICAgICByb290IGVsZW1lbnQocyksIG5vdCB0aGVpciBjaGlsZHJlbikKICogQHJldHVybnMge2Z1bmN0aW9uKHNjb3BlLCBjbG9uZUF0dGFjaEZuPSwgb3B0aW9ucz0pfSBhIGxpbmsgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBiaW5kIHRlbXBsYXRlCiAqIChhIERPTSBlbGVtZW50L3RyZWUpIHRvIGEgc2NvcGUuIFdoZXJlOgogKgogKiAgKiBgc2NvcGVgIC0gQSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBTY29wZX0gdG8gYmluZCB0by4KICogICogYGNsb25lQXR0YWNoRm5gIC0gSWYgYGNsb25lQXR0YWNoRm5gIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBsaW5rIGZ1bmN0aW9uIHdpbGwgY2xvbmUgdGhlCiAqICBgdGVtcGxhdGVgIGFuZCBjYWxsIHRoZSBgY2xvbmVBdHRhY2hGbmAgZnVuY3Rpb24gYWxsb3dpbmcgdGhlIGNhbGxlciB0byBhdHRhY2ggdGhlCiAqICBjbG9uZWQgZWxlbWVudHMgdG8gdGhlIERPTSBkb2N1bWVudCBhdCB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuIFRoZSBgY2xvbmVBdHRhY2hGbmAgaXMKICogIGNhbGxlZCBhczogPGJyPiBgY2xvbmVBdHRhY2hGbihjbG9uZWRFbGVtZW50LCBzY29wZSlgIHdoZXJlOgogKgogKiAgICAgICogYGNsb25lZEVsZW1lbnRgIC0gaXMgYSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgYGVsZW1lbnRgIHBhc3NlZCBpbnRvIHRoZSBjb21waWxlci4KICogICAgICAqIGBzY29wZWAgLSBpcyB0aGUgY3VycmVudCBzY29wZSB3aXRoIHdoaWNoIHRoZSBsaW5raW5nIGZ1bmN0aW9uIGlzIHdvcmtpbmcgd2l0aC4KICoKICogICogYG9wdGlvbnNgIC0gQW4gb3B0aW9uYWwgb2JqZWN0IGhhc2ggd2l0aCBsaW5raW5nIG9wdGlvbnMuIElmIGBvcHRpb25zYCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgZm9sbG93aW5nCiAqICBrZXlzIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgbGlua2luZyBiZWhhdmlvcjoKICoKICogICAgICAqIGBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbmAgLSB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiBtYWRlIGF2YWlsYWJsZSB0bwogKiAgICAgICAgZGlyZWN0aXZlczsgaWYgZ2l2ZW4sIGl0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGxpbmsgZnVuY3Rpb25zIG9mCiAqICAgICAgICBkaXJlY3RpdmVzIGZvdW5kIGluIGBlbGVtZW50YCBkdXJpbmcgY29tcGlsYXRpb24uCiAqICAgICAgKiBgdHJhbnNjbHVkZUNvbnRyb2xsZXJzYCAtIGFuIG9iamVjdCBoYXNoIHdpdGgga2V5cyB0aGF0IG1hcCBjb250cm9sbGVyIG5hbWVzCiAqICAgICAgICB0byBjb250cm9sbGVyIGluc3RhbmNlczsgaWYgZ2l2ZW4sIGl0IHdpbGwgbWFrZSB0aGUgY29udHJvbGxlcnMKICogICAgICAgIGF2YWlsYWJsZSB0byBkaXJlY3RpdmVzLgogKiAgICAgICogYGZ1dHVyZVBhcmVudEVsZW1lbnRgIC0gZGVmaW5lcyB0aGUgcGFyZW50IHRvIHdoaWNoIHRoZSBgY2xvbmVBdHRhY2hGbmAgd2lsbCBhZGQKICogICAgICAgIHRoZSBjbG9uZWQgZWxlbWVudHM7IG9ubHkgbmVlZGVkIGZvciB0cmFuc2NsdWRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gbm9uIGh0bWwKICogICAgICAgIGVsZW1lbnRzIChlLmcuIFNWRyBlbGVtZW50cykuIFNlZSBhbHNvIHRoZSBkaXJlY3RpdmUuY29udHJvbGxlciBwcm9wZXJ0eS4KICoKICogQ2FsbGluZyB0aGUgbGlua2luZyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbGVtZW50IG9mIHRoZSB0ZW1wbGF0ZS4gSXQgaXMgZWl0aGVyIHRoZSBvcmlnaW5hbAogKiBlbGVtZW50IHBhc3NlZCBpbiwgb3IgdGhlIGNsb25lIG9mIHRoZSBlbGVtZW50IGlmIHRoZSBgY2xvbmVBdHRhY2hGbmAgaXMgcHJvdmlkZWQuCiAqCiAqIEFmdGVyIGxpbmtpbmcgdGhlIHZpZXcgaXMgbm90IHVwZGF0ZWQgdW50aWwgYWZ0ZXIgYSBjYWxsIHRvICRkaWdlc3Qgd2hpY2ggdHlwaWNhbGx5IGlzIGRvbmUgYnkKICogQW5ndWxhciBhdXRvbWF0aWNhbGx5LgogKgogKiBJZiB5b3UgbmVlZCBhY2Nlc3MgdG8gdGhlIGJvdW5kIHZpZXcsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyBpdDoKICoKICogLSBJZiB5b3UgYXJlIG5vdCBhc2tpbmcgdGhlIGxpbmtpbmcgZnVuY3Rpb24gdG8gY2xvbmUgdGhlIHRlbXBsYXRlLCBjcmVhdGUgdGhlIERPTSBlbGVtZW50KHMpCiAqICAgYmVmb3JlIHlvdSBzZW5kIHRoZW0gdG8gdGhlIGNvbXBpbGVyIGFuZCBrZWVwIHRoaXMgcmVmZXJlbmNlIGFyb3VuZC4KICogICBgYGBqcwogKiAgICAgdmFyIGVsZW1lbnQgPSAkY29tcGlsZSgnPHA+e3t0b3RhbH19PC9wPicpKHNjb3BlKTsKICogICBgYGAKICoKICogLSBpZiBvbiB0aGUgb3RoZXIgaGFuZCwgeW91IG5lZWQgdGhlIGVsZW1lbnQgdG8gYmUgY2xvbmVkLCB0aGUgdmlldyByZWZlcmVuY2UgZnJvbSB0aGUgb3JpZ2luYWwKICogICBleGFtcGxlIHdvdWxkIG5vdCBwb2ludCB0byB0aGUgY2xvbmUsIGJ1dCByYXRoZXIgdG8gdGhlIG9yaWdpbmFsIHRlbXBsYXRlIHRoYXQgd2FzIGNsb25lZC4gSW4KICogICB0aGlzIGNhc2UsIHlvdSBjYW4gYWNjZXNzIHRoZSBjbG9uZSB2aWEgdGhlIGNsb25lQXR0YWNoRm46CiAqICAgYGBganMKICogICAgIHZhciB0ZW1wbGF0ZUVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoJzxwPnt7dG90YWx9fTwvcD4nKSwKICogICAgICAgICBzY29wZSA9IC4uLi47CiAqCiAqICAgICB2YXIgY2xvbmVkRWxlbWVudCA9ICRjb21waWxlKHRlbXBsYXRlRWxlbWVudCkoc2NvcGUsIGZ1bmN0aW9uKGNsb25lZEVsZW1lbnQsIHNjb3BlKSB7CiAqICAgICAgIC8vYXR0YWNoIHRoZSBjbG9uZSB0byBET00gZG9jdW1lbnQgYXQgdGhlIHJpZ2h0IHBsYWNlCiAqICAgICB9KTsKICoKICogICAgIC8vbm93IHdlIGhhdmUgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgRE9NIHZpYSBgY2xvbmVkRWxlbWVudGAKICogICBgYGAKICoKICoKICogRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0aGUgY29tcGlsZXIgd29ya3MsIHNlZSB0aGUKICoge0BsaW5rIGd1aWRlL2NvbXBpbGVyIEFuZ3VsYXIgSFRNTCBDb21waWxlcn0gc2VjdGlvbiBvZiB0aGUgRGV2ZWxvcGVyIEd1aWRlLgogKi8KCnZhciAkY29tcGlsZU1pbkVyciA9IG1pbkVycignJGNvbXBpbGUnKTsKCi8qKgogKiBAbmdkb2MgcHJvdmlkZXIKICogQG5hbWUgJGNvbXBpbGVQcm92aWRlcgogKgogKiBAZGVzY3JpcHRpb24KICovCiRDb21waWxlUHJvdmlkZXIuJGluamVjdCA9IFsnJHByb3ZpZGUnLCAnJCRzYW5pdGl6ZVVyaVByb3ZpZGVyJ107CmZ1bmN0aW9uICRDb21waWxlUHJvdmlkZXIoJHByb3ZpZGUsICQkc2FuaXRpemVVcmlQcm92aWRlcikgewogIHZhciBoYXNEaXJlY3RpdmVzID0ge30sCiAgICAgIFN1ZmZpeCA9ICdEaXJlY3RpdmUnLAogICAgICBDT01NRU5UX0RJUkVDVElWRV9SRUdFWFAgPSAvXlxzKmRpcmVjdGl2ZVw6XHMqKFtcd1wtXSspXHMrKC4qKSQvLAogICAgICBDTEFTU19ESVJFQ1RJVkVfUkVHRVhQID0gLygoW1x3XC1dKykoPzpcOihbXjtdKykpPzs/KS8sCiAgICAgIEFMTF9PUl9OT1RISU5HX0FUVFJTID0gbWFrZU1hcCgnbmdTcmMsbmdTcmNzZXQsc3JjLHNyY3NldCcpLAogICAgICBSRVFVSVJFX1BSRUZJWF9SRUdFWFAgPSAvXig/OihcXlxePyk/KFw/KT8oXF5cXj8pPyk/LzsKCiAgLy8gUmVmOiBodHRwOi8vZGV2ZWxvcGVycy53aGF0d2cub3JnL3dlYmFwcGFwaXMuaHRtbCNldmVudC1oYW5kbGVyLWlkbC1hdHRyaWJ1dGVzCiAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBmdXR1cmUgRE9NIGV2ZW50IGF0dHJpYnV0ZSBuYW1lcyB3aWxsIGJlZ2luIHdpdGgKICAvLyAnb24nIGFuZCBiZSBjb21wb3NlZCBvZiBvbmx5IEVuZ2xpc2ggbGV0dGVycy4KICB2YXIgRVZFTlRfSEFORExFUl9BVFRSX1JFR0VYUCA9IC9eKG9uW2Etel0rfGZvcm1hY3Rpb24pJC87CgogIGZ1bmN0aW9uIHBhcnNlSXNvbGF0ZUJpbmRpbmdzKHNjb3BlLCBkaXJlY3RpdmVOYW1lKSB7CiAgICB2YXIgTE9DQUxfUkVHRVhQID0gL15ccyooW0AmXXw9KFwqPykpKFw/PylccyooXHcqKVxzKiQvOwoKICAgIHZhciBiaW5kaW5ncyA9IHt9OwoKICAgIGZvckVhY2goc2NvcGUsIGZ1bmN0aW9uKGRlZmluaXRpb24sIHNjb3BlTmFtZSkgewogICAgICB2YXIgbWF0Y2ggPSBkZWZpbml0aW9uLm1hdGNoKExPQ0FMX1JFR0VYUCk7CgogICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ2lzY3AnLAogICAgICAgICAgICAiSW52YWxpZCBpc29sYXRlIHNjb3BlIGRlZmluaXRpb24gZm9yIGRpcmVjdGl2ZSAnezB9Jy4iICsKICAgICAgICAgICAgIiBEZWZpbml0aW9uOiB7Li4uIHsxfTogJ3syfScgLi4ufSIsCiAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsIHNjb3BlTmFtZSwgZGVmaW5pdGlvbik7CiAgICAgIH0KCiAgICAgIGJpbmRpbmdzW3Njb3BlTmFtZV0gPSB7CiAgICAgICAgbW9kZTogbWF0Y2hbMV1bMF0sCiAgICAgICAgY29sbGVjdGlvbjogbWF0Y2hbMl0gPT09ICcqJywKICAgICAgICBvcHRpb25hbDogbWF0Y2hbM10gPT09ICc/JywKICAgICAgICBhdHRyTmFtZTogbWF0Y2hbNF0gfHwgc2NvcGVOYW1lCiAgICAgIH07CiAgICB9KTsKCiAgICByZXR1cm4gYmluZGluZ3M7CiAgfQoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUKICAgKiBAa2luZCBmdW5jdGlvbgogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogUmVnaXN0ZXIgYSBuZXcgZGlyZWN0aXZlIHdpdGggdGhlIGNvbXBpbGVyLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBuYW1lIE5hbWUgb2YgdGhlIGRpcmVjdGl2ZSBpbiBjYW1lbC1jYXNlIChpLmUuIDxjb2RlPm5nQmluZDwvY29kZT4gd2hpY2gKICAgKiAgICB3aWxsIG1hdGNoIGFzIDxjb2RlPm5nLWJpbmQ8L2NvZGU+KSwgb3IgYW4gb2JqZWN0IG1hcCBvZiBkaXJlY3RpdmVzIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUKICAgKiAgICBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGZhY3Rvcmllcy4KICAgKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBkaXJlY3RpdmVGYWN0b3J5IEFuIGluamVjdGFibGUgZGlyZWN0aXZlIGZhY3RvcnkgZnVuY3Rpb24uIFNlZQogICAqICAgIHtAbGluayBndWlkZS9kaXJlY3RpdmV9IGZvciBtb3JlIGluZm8uCiAgICogQHJldHVybnMge25nLiRjb21waWxlUHJvdmlkZXJ9IFNlbGYgZm9yIGNoYWluaW5nLgogICAqLwogICB0aGlzLmRpcmVjdGl2ZSA9IGZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0aXZlKG5hbWUsIGRpcmVjdGl2ZUZhY3RvcnkpIHsKICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdkaXJlY3RpdmUnKTsKICAgIGlmIChpc1N0cmluZyhuYW1lKSkgewogICAgICBhc3NlcnRBcmcoZGlyZWN0aXZlRmFjdG9yeSwgJ2RpcmVjdGl2ZUZhY3RvcnknKTsKICAgICAgaWYgKCFoYXNEaXJlY3RpdmVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgaGFzRGlyZWN0aXZlc1tuYW1lXSA9IFtdOwogICAgICAgICRwcm92aWRlLmZhY3RvcnkobmFtZSArIFN1ZmZpeCwgWyckaW5qZWN0b3InLCAnJGV4Y2VwdGlvbkhhbmRsZXInLAogICAgICAgICAgZnVuY3Rpb24oJGluamVjdG9yLCAkZXhjZXB0aW9uSGFuZGxlcikgewogICAgICAgICAgICB2YXIgZGlyZWN0aXZlcyA9IFtdOwogICAgICAgICAgICBmb3JFYWNoKGhhc0RpcmVjdGl2ZXNbbmFtZV0sIGZ1bmN0aW9uKGRpcmVjdGl2ZUZhY3RvcnksIGluZGV4KSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBkaXJlY3RpdmUgPSAkaW5qZWN0b3IuaW52b2tlKGRpcmVjdGl2ZUZhY3RvcnkpOwogICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZGlyZWN0aXZlKSkgewogICAgICAgICAgICAgICAgICBkaXJlY3RpdmUgPSB7IGNvbXBpbGU6IHZhbHVlRm4oZGlyZWN0aXZlKSB9OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGlyZWN0aXZlLmNvbXBpbGUgJiYgZGlyZWN0aXZlLmxpbmspIHsKICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLmNvbXBpbGUgPSB2YWx1ZUZuKGRpcmVjdGl2ZS5saW5rKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5wcmlvcml0eSA9IGRpcmVjdGl2ZS5wcmlvcml0eSB8fCAwOwogICAgICAgICAgICAgICAgZGlyZWN0aXZlLmluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgICAgICBkaXJlY3RpdmUubmFtZSA9IGRpcmVjdGl2ZS5uYW1lIHx8IG5hbWU7CiAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVxdWlyZSA9IGRpcmVjdGl2ZS5yZXF1aXJlIHx8IChkaXJlY3RpdmUuY29udHJvbGxlciAmJiBkaXJlY3RpdmUubmFtZSk7CiAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVzdHJpY3QgPSBkaXJlY3RpdmUucmVzdHJpY3QgfHwgJ0VBJzsKICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChkaXJlY3RpdmUuc2NvcGUpKSB7CiAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS4kJGlzb2xhdGVCaW5kaW5ncyA9IHBhcnNlSXNvbGF0ZUJpbmRpbmdzKGRpcmVjdGl2ZS5zY29wZSwgZGlyZWN0aXZlLm5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZXM7CiAgICAgICAgICB9XSk7CiAgICAgIH0KICAgICAgaGFzRGlyZWN0aXZlc1tuYW1lXS5wdXNoKGRpcmVjdGl2ZUZhY3RvcnkpOwogICAgfSBlbHNlIHsKICAgICAgZm9yRWFjaChuYW1lLCByZXZlcnNlUGFyYW1zKHJlZ2lzdGVyRGlyZWN0aXZlKSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9OwoKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QKICAgKiBAa2luZCBmdW5jdGlvbgogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZQogICAqIHVybHMgZHVyaW5nIGFbaHJlZl0gc2FuaXRpemF0aW9uLgogICAqCiAgICogVGhlIHNhbml0aXphdGlvbiBpcyBhIHNlY3VyaXR5IG1lYXN1cmUgYWltZWQgYXQgcHJldmVudGluZyBYU1MgYXR0YWNrcyB2aWEgaHRtbCBsaW5rcy4KICAgKgogICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gYVtocmVmXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvCiAgICogYW4gYWJzb2x1dGUgdXJsLiBBZnRlcndhcmRzLCB0aGUgdXJsIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0YAogICAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG9yaWdpbmFsIHVybCBpcyB3cml0dGVuIGludG8gdGhlIGRvbS4gT3RoZXJ3aXNlLAogICAqIHRoZSBhYnNvbHV0ZSB1cmwgaXMgcHJlZml4ZWQgd2l0aCBgJ3Vuc2FmZTonYCBzdHJpbmcgYW5kIG9ubHkgdGhlbiBpcyBpdCB3cml0dGVuIGludG8gdGhlIERPTS4KICAgKgogICAqIEBwYXJhbSB7UmVnRXhwPX0gcmVnZXhwIE5ldyByZWdleHAgdG8gd2hpdGVsaXN0IHVybHMgd2l0aC4KICAgKiBAcmV0dXJucyB7UmVnRXhwfG5nLiRjb21waWxlUHJvdmlkZXJ9IEN1cnJlbnQgUmVnRXhwIGlmIGNhbGxlZCB3aXRob3V0IHZhbHVlIG9yIHNlbGYgZm9yCiAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLgogICAqLwogIHRoaXMuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHsKICAgIGlmIChpc0RlZmluZWQocmVnZXhwKSkgewogICAgICAkJHNhbml0aXplVXJpUHJvdmlkZXIuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QocmVnZXhwKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0KCk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkY29tcGlsZVByb3ZpZGVyI2ltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdAogICAqIEBraW5kIGZ1bmN0aW9uCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBSZXRyaWV2ZXMgb3Igb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgZm9yIHdoaXRlbGlzdGluZyBvZiBzYWZlCiAgICogdXJscyBkdXJpbmcgaW1nW3NyY10gc2FuaXRpemF0aW9uLgogICAqCiAgICogVGhlIHNhbml0aXphdGlvbiBpcyBhIHNlY3VyaXR5IG1lYXN1cmUgYWltZWQgYXQgcHJldmVudCBYU1MgYXR0YWNrcyB2aWEgaHRtbCBsaW5rcy4KICAgKgogICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gaW1nW3NyY10gdmlhIGRhdGEtYmluZGluZyBpcyBmaXJzdCBub3JtYWxpemVkIGFuZCB0dXJuZWQgaW50bwogICAqIGFuIGFic29sdXRlIHVybC4gQWZ0ZXJ3YXJkcywgdGhlIHVybCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3RgCiAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsCiAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLgogICAqCiAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLgogICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3IKICAgKiAgICBjaGFpbmluZyBvdGhlcndpc2UuCiAgICovCiAgdGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHsKICAgIGlmIChpc0RlZmluZWQocmVnZXhwKSkgewogICAgICAkJHNhbml0aXplVXJpUHJvdmlkZXIuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0KHJlZ2V4cCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICQkc2FuaXRpemVVcmlQcm92aWRlci5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QoKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgICRjb21waWxlUHJvdmlkZXIjZGVidWdJbmZvRW5hYmxlZAogICAqCiAgICogQHBhcmFtIHtib29sZWFuPX0gZW5hYmxlZCB1cGRhdGUgdGhlIGRlYnVnSW5mb0VuYWJsZWQgc3RhdGUgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUKICAgKiBjdXJyZW50IGRlYnVnSW5mb0VuYWJsZWQgc3RhdGUKICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlcgogICAqCiAgICogQGtpbmQgZnVuY3Rpb24KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZW5hYmxlL2Rpc2FibGUgdmFyaW91cyBkZWJ1ZyBydW50aW1lIGluZm9ybWF0aW9uIGluIHRoZSBjb21waWxlciBzdWNoIGFzIGFkZGluZwogICAqIGJpbmRpbmcgaW5mb3JtYXRpb24gYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHNjb3BlIG9uIHRvIERPTSBlbGVtZW50cy4KICAgKiBJZiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBhZGQgdGhlIGZvbGxvd2luZyB0byBET00gZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gYm91bmQgdG8gdGhlIHNjb3BlCiAgICogKiBgbmctYmluZGluZ2AgQ1NTIGNsYXNzCiAgICogKiBgJGJpbmRpbmdgIGRhdGEgcHJvcGVydHkgY29udGFpbmluZyBhbiBhcnJheSBvZiB0aGUgYmluZGluZyBleHByZXNzaW9ucwogICAqCiAgICogWW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhpcyBpbiBwcm9kdWN0aW9uIGZvciBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0LiBTZWUKICAgKiB7QGxpbmsgZ3VpZGUvcHJvZHVjdGlvbiNkaXNhYmxpbmctZGVidWctZGF0YSBEaXNhYmxpbmcgRGVidWcgRGF0YX0gZm9yIG1vcmUuCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgogICAqLwogIHZhciBkZWJ1Z0luZm9FbmFibGVkID0gdHJ1ZTsKICB0aGlzLmRlYnVnSW5mb0VuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKSB7CiAgICBpZiAoaXNEZWZpbmVkKGVuYWJsZWQpKSB7CiAgICAgIGRlYnVnSW5mb0VuYWJsZWQgPSBlbmFibGVkOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBkZWJ1Z0luZm9FbmFibGVkOwogIH07CgogIHRoaXMuJGdldCA9IFsKICAgICAgICAgICAgJyRpbmplY3RvcicsICckaW50ZXJwb2xhdGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHRlbXBsYXRlUmVxdWVzdCcsICckcGFyc2UnLAogICAgICAgICAgICAnJGNvbnRyb2xsZXInLCAnJHJvb3RTY29wZScsICckZG9jdW1lbnQnLCAnJHNjZScsICckYW5pbWF0ZScsICckJHNhbml0aXplVXJpJywKICAgIGZ1bmN0aW9uKCRpbmplY3RvciwgICAkaW50ZXJwb2xhdGUsICAgJGV4Y2VwdGlvbkhhbmRsZXIsICAgJHRlbXBsYXRlUmVxdWVzdCwgICAkcGFyc2UsCiAgICAgICAgICAgICAkY29udHJvbGxlciwgICAkcm9vdFNjb3BlLCAgICRkb2N1bWVudCwgICAkc2NlLCAgICRhbmltYXRlLCAgICQkc2FuaXRpemVVcmkpIHsKCiAgICB2YXIgQXR0cmlidXRlcyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZXNUb0NvcHkpIHsKICAgICAgaWYgKGF0dHJpYnV0ZXNUb0NvcHkpIHsKICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXNUb0NvcHkpOwogICAgICAgIHZhciBpLCBsLCBrZXk7CgogICAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAga2V5ID0ga2V5c1tpXTsKICAgICAgICAgIHRoaXNba2V5XSA9IGF0dHJpYnV0ZXNUb0NvcHlba2V5XTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy4kYXR0ciA9IHt9OwogICAgICB9CgogICAgICCM3O9WgnkBAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/80w1AAEAGuAfAqAdgwKgHNh/1lSJBtXXYWHp804AYAVOv1QAAAQEICgBNpbgAo169dGhpcy4kJGVsZW1lbnQgPSBlbGVtZW50OwogICAgfTsKCiAgICBBdHRyaWJ1dGVzLnByb3RvdHlwZSA9IHsKICAgICAgJG5vcm1hbGl6ZTogZGlyZWN0aXZlTm9ybWFsaXplLAoKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhZGRDbGFzcwogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogQWRkcyB0aGUgQ1NTIGNsYXNzIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgY2xhc3NWYWwgcGFyYW1ldGVyIHRvIHRoZSBlbGVtZW50LiBJZiBhbmltYXRpb25zCiAgICAgICAqIGFyZSBlbmFibGVkIHRoZW4gYW4gYW5pbWF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIGZvciB0aGUgY2xhc3MgYWRkaXRpb24uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1ZhbCBUaGUgY2xhc3NOYW1lIHZhbHVlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudAogICAgICAgKi8KICAgICAgJGFkZENsYXNzOiBmdW5jdGlvbihjbGFzc1ZhbCkgewogICAgICAgIGlmIChjbGFzc1ZhbCAmJiBjbGFzc1ZhbC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwgY2xhc3NWYWwpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRyZW1vdmVDbGFzcwogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogUmVtb3ZlcyB0aGUgQ1NTIGNsYXNzIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgY2xhc3NWYWwgcGFyYW1ldGVyIGZyb20gdGhlIGVsZW1lbnQuIElmCiAgICAgICAqIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQgdGhlbiBhbiBhbmltYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgZm9yIHRoZSBjbGFzcyByZW1vdmFsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NWYWwgVGhlIGNsYXNzTmFtZSB2YWx1ZSB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICAkcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzVmFsKSB7CiAgICAgICAgaWYgKGNsYXNzVmFsICYmIGNsYXNzVmFsLmxlbmd0aCA+IDApIHsKICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCBjbGFzc1ZhbCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMjJHVwZGF0ZUNsYXNzCiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBBZGRzIGFuZCByZW1vdmVzIHRoZSBhcHByb3ByaWF0ZSBDU1MgY2xhc3MgdmFsdWVzIHRvIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlCiAgICAgICAqIGJldHdlZW4gdGhlIG5ldyBhbmQgb2xkIENTUyBjbGFzcyB2YWx1ZXMgKHNwZWNpZmllZCBhcyBuZXdDbGFzc2VzIGFuZCBvbGRDbGFzc2VzKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0NsYXNzZXMgVGhlIGN1cnJlbnQgQ1NTIGNsYXNzTmFtZSB2YWx1ZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkQ2xhc3NlcyBUaGUgZm9ybWVyIENTUyBjbGFzc05hbWUgdmFsdWUKICAgICAgICovCiAgICAgICR1cGRhdGVDbGFzczogZnVuY3Rpb24obmV3Q2xhc3Nlcywgb2xkQ2xhc3NlcykgewogICAgICAgIHZhciB0b0FkZCA9IHRva2VuRGlmZmVyZW5jZShuZXdDbGFzc2VzLCBvbGRDbGFzc2VzKTsKICAgICAgICBpZiAodG9BZGQgJiYgdG9BZGQubGVuZ3RoKSB7CiAgICAgICAgICAkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwgdG9BZGQpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHRvUmVtb3ZlID0gdG9rZW5EaWZmZXJlbmNlKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpOwogICAgICAgIGlmICh0b1JlbW92ZSAmJiB0b1JlbW92ZS5sZW5ndGgpIHsKICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCB0b1JlbW92ZSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNldCBhIG5vcm1hbGl6ZWQgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGluIGEgd2F5IHN1Y2ggdGhhdCBhbGwgZGlyZWN0aXZlcwogICAgICAgKiBjYW4gc2hhcmUgdGhlIGF0dHJpYnV0ZS4gVGhpcyBmdW5jdGlvbiBwcm9wZXJseSBoYW5kbGVzIGJvb2xlYW4gYXR0cmlidXRlcy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOb3JtYWxpemVkIGtleS4gKGllIG5nQXR0cmlidXRlKQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LiBJZiBgbnVsbGAgYXR0cmlidXRlIHdpbGwgYmUgZGVsZXRlZC4KICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gd3JpdGVBdHRyIElmIGZhbHNlLCBkb2VzIG5vdCB3cml0ZSB0aGUgdmFsdWUgdG8gRE9NIGVsZW1lbnQgYXR0cmlidXRlLgogICAgICAgKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBhdHRyTmFtZSBPcHRpb25hbCBub25lIG5vcm1hbGl6ZWQgbmFtZS4gRGVmYXVsdHMgdG8ga2V5LgogICAgICAgKi8KICAgICAgJHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSwgd3JpdGVBdHRyLCBhdHRyTmFtZSkgewogICAgICAgIC8vIFRPRE86IGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byB0aHJvdyBhbiBlcnJvciBpZiAiY2xhc3MiCiAgICAgICAgLy9pcyBzZXQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNpbmNlIGl0IG1heSBjYXVzZSAkdXBkYXRlQ2xhc3MgdG8KICAgICAgICAvL2JlY29tZSB1bnN0YWJsZS4KCiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLiQkZWxlbWVudFswXSwKICAgICAgICAgICAgYm9vbGVhbktleSA9IGdldEJvb2xlYW5BdHRyTmFtZShub2RlLCBrZXkpLAogICAgICAgICAgICBhbGlhc2VkS2V5ID0gZ2V0QWxpYXNlZEF0dHJOYW1lKG5vZGUsIGtleSksCiAgICAgICAgICAgIG9ic2VydmVyID0ga2V5LAogICAgICAgICAgICBub2RlTmFtZTsKCiAgICAgICAgaWYgKGJvb2xlYW5LZXkpIHsKICAgICAgICAgIHRoaXMuJCRlbGVtZW50LnByb3Aoa2V5LCB2YWx1ZSk7CiAgICAgICAgICBhdHRyTmFtZSA9IGJvb2xlYW5LZXk7CiAgICAgICAgfSBlbHNlIGlmIChhbGlhc2VkS2V5KSB7CiAgICAgICAgICB0aGlzW2FsaWFzZWRLZXldID0gdmFsdWU7CiAgICAgICAgICBvYnNlcnZlciA9IGFsaWFzZWRLZXk7CiAgICAgICAgfQoKICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKCiAgICAgICAgLy8gdHJhbnNsYXRlIG5vcm1hbGl6ZWQga2V5IHRvIGFjdHVhbCBrZXkKICAgICAgICBpZiAoYXR0ck5hbWUpIHsKICAgICAgICAgIHRoaXMuJGF0dHJba2V5XSA9IGF0dHJOYW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhdHRyTmFtZSA9IHRoaXMuJGF0dHJba2V5XTsKICAgICAgICAgIGlmICghYXR0ck5hbWUpIHsKICAgICAgICAgICAgdGhpcy4kYXR0cltrZXldID0gYXR0ck5hbWUgPSBzbmFrZV9jYXNlKGtleSwgJy0nKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5vZGVOYW1lID0gbm9kZU5hbWVfKHRoaXMuJCRlbGVtZW50KTsKCiAgICAgICAgaWYgKChub2RlTmFtZSA9PT0gJ2EnICYmIGtleSA9PT0gJ2hyZWYnKSB8fAogICAgICAgICAgICAobm9kZU5hbWUgPT09ICdpbWcnICYmIGtleSA9PT0gJ3NyYycpKSB7CiAgICAgICAgICAvLyBzYW5pdGl6ZSBhW2hyZWZdIGFuZCBpbWdbc3JjXSB2YWx1ZXMKICAgICAgICAgIHRoaXNba2V5XSA9IHZhbHVlID0gJCRzYW5pdGl6ZVVyaSh2YWx1ZSwga2V5ID09PSAnc3JjJyk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gJ2ltZycgJiYga2V5ID09PSAnc3Jjc2V0JykgewogICAgICAgICAgLy8gc2FuaXRpemUgaW1nW3NyY3NldF0gdmFsdWVzCiAgICAgICAgICB2YXIgcmVzdWx0ID0gIiI7CgogICAgICAgICAgLy8gZmlyc3QgY2hlY2sgaWYgdGhlcmUgYXJlIHNwYWNlcyBiZWNhdXNlIGl0J3Mgbm90IHRoZSBzYW1lIHBhdHRlcm4KICAgICAgICAgIHZhciB0cmltbWVkU3Jjc2V0ID0gdHJpbSh2YWx1ZSk7CiAgICAgICAgICAvLyAgICAgICAgICAgICAgICAoICAgOTk5eCAgICx8ICAgOTk5dyAgICx8ICAgLHwsICAgKQogICAgICAgICAgdmFyIHNyY1BhdHRlcm4gPSAvKFxzK1xkK3hccyosfFxzK1xkK3dccyosfFxzKyx8LFxzKykvOwogICAgICAgICAgdmFyIHBhdHRlcm4gPSAvXHMvLnRlc3QodHJpbW1lZFNyY3NldCkgPyBzcmNQYXR0ZXJuIDogLygsKS87CgogICAgICAgICAgLy8gc3BsaXQgc3Jjc2V0IGludG8gdHVwbGUgb2YgdXJpIGFuZCBkZXNjcmlwdG9yIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXRlbQogICAgICAgICAgdmFyIHJhd1VyaXMgPSB0cmltbWVkU3Jjc2V0LnNwbGl0KHBhdHRlcm4pOwoKICAgICAgICAgIC8vIGZvciBlYWNoIHR1cGxlcwogICAgICAgICAgdmFyIG5iclVyaXNXaXRoMnBhcnRzID0gTWF0aC5mbG9vcihyYXdVcmlzLmxlbmd0aCAvIDIpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYnJVcmlzV2l0aDJwYXJ0czsgaSsrKSB7CiAgICAgICAgICAgIHZhciBpbm5lcklkeCA9IGkgKiAyOwogICAgICAgICAgICAvLyBzYW5pdGl6ZSB0aGUgdXJpCiAgICAgICAgICAgIHJlc3VsdCArPSAkJHNhbml0aXplVXJpKHRyaW0ocmF3VXJpc1tpbm5lcklkeF0pLCB0cnVlKTsKICAgICAgICAgICAgLy8gYWRkIHRoZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHJlc3VsdCArPSAoIiAiICsgdHJpbShyYXdVcmlzW2lubmVySWR4ICsgMV0pKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBzcGxpdCB0aGUgbGFzdCBpdGVtIGludG8gdXJpIGFuZCBkZXNjcmlwdG9yCiAgICAgICAgICB2YXIgbGFzdFR1cGxlID0gdHJpbShyYXdVcmlzW2kgKiAyXSkuc3BsaXQoL1xzLyk7CgogICAgICAgICAgLy8gc2FuaXRpemUgdGhlIGxhc3QgdXJpCiAgICAgICAgICByZXN1bHQgKz0gJCRzYW5pdGl6ZVVyaSh0cmltKGxhc3RUdXBsZVswXSksIHRydWUpOwoKICAgICAgICAgIC8vIGFuZCBhZGQgdGhlIGxhc3QgZGVzY3JpcHRvciBpZiBhbnkKICAgICAgICAgIGlmIChsYXN0VHVwbGUubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAoIiAiICsgdHJpbShsYXN0VHVwbGVbMV0pKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXNba2V5XSA9IHZhbHVlID0gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgaWYgKHdyaXRlQXR0ciAhPT0gZmFsc2UpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHRoaXMuJCRlbGVtZW50LnJlbW92ZUF0dHIoYXR0ck5hbWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy4kJGVsZW1lbnQuYXR0cihhdHRyTmFtZSwgdmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gZmlyZSBvYnNlcnZlcnMKICAgICAgICB2YXIgJCRvYnNlcnZlcnMgPSB0aGlzLiQkb2JzZXJ2ZXJzOwogICAgICAgICQkb2JzZXJ2ZXJzICYmIGZvckVhY2goJCRvYnNlcnZlcnNbb2JzZXJ2ZXJdLCBmdW5jdGlvbihmbikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm4odmFsdWUpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKCgogICAgICAvKioKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkb2JzZXJ2ZQogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogT2JzZXJ2ZXMgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZS4KICAgICAgICoKICAgICAgICogVGhlIG9ic2VydmVyIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbmNlIGR1cmluZyB0aGUgbmV4dCBgJGRpZ2VzdGAgZm9sbG93aW5nCiAgICAgICAqIGNvbXBpbGF0aW9uLiBUaGUgb2JzZXJ2ZXIgaXMgdGhlbiBpbnZva2VkIHdoZW5ldmVyIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUKICAgICAgICogY2hhbmdlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOb3JtYWxpemVkIGtleS4gKGllIG5nQXR0cmlidXRlKSAuCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW50ZXJwb2xhdGVkVmFsdWUpfSBmbiBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyCiAgICAgICAgICAgICAgICB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgY2hhbmdlcy4KICAgICAgICogICAgICAgIFNlZSB0aGUge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSN0ZXh0LWFuZC1hdHRyaWJ1dGUtYmluZGluZ3MgRGlyZWN0aXZlc30gZ3VpZGUgZm9yIG1vcmUgaW5mby4KICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyBvYnNlcnZlci4KICAgICAgICovCiAgICAgICRvYnNlcnZlOiBmdW5jdGlvbihrZXksIGZuKSB7CiAgICAgICAgdmFyIGF0dHJzID0gdGhpcywKICAgICAgICAgICAgJCRvYnNlcnZlcnMgPSAoYXR0cnMuJCRvYnNlcnZlcnMgfHwgKGF0dHJzLiQkb2JzZXJ2ZXJzID0gY3JlYXRlTWFwKCkpKSwKICAgICAgICAgICAgbGlzdGVuZXJzID0gKCQkb2JzZXJ2ZXJzW2tleV0gfHwgKCQkb2JzZXJ2ZXJzW2tleV0gPSBbXSkpOwoKICAgICAgICBsaXN0ZW5lcnMucHVzaChmbik7CiAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCFsaXN0ZW5lcnMuJCRpbnRlciAmJiBhdHRycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgIC8vIG5vIG9uZSByZWdpc3RlcmVkIGF0dHJpYnV0ZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLCBzbyBsZXRzIGNhbGwgaXQgbWFudWFsbHkKICAgICAgICAgICAgZm4oYXR0cnNba2V5XSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIGFycmF5UmVtb3ZlKGxpc3RlbmVycywgZm4pOwogICAgICAgIH07CiAgICAgIH0KICAgIH07CgoKICAgIGZ1bmN0aW9uIHNhZmVBZGRDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKSB7CiAgICAgIHRyeSB7CiAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIGlnbm9yZSwgc2luY2UgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIHNldCBjbGFzcyBvbgogICAgICAgIC8vIFNWRyBlbGVtZW50LCB3aGVyZSBjbGFzcyBuYW1lIGlzIHJlYWQtb25seS4KICAgICAgfQogICAgfQoKCiAgICB2YXIgc3RhcnRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuc3RhcnRTeW1ib2woKSwKICAgICAgICBlbmRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sKCksCiAgICAgICAgZGVub3JtYWxpemVUZW1wbGF0ZSA9IChzdGFydFN5bWJvbCA9PSAne3snIHx8IGVuZFN5bWJvbCAgPT0gJ319JykKICAgICAgICAgICAgPyBpZGVudGl0eQogICAgICAgICAgICA6IGZ1bmN0aW9uIGRlbm9ybWFsaXplVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXHtcey9nLCBzdGFydFN5bWJvbCkucmVwbGFjZSgvfX0vZywgZW5kU3ltYm9sKTsKICAgICAgICB9LAogICAgICAgIE5HX0FUVFJfQklORElORyA9IC9ebmdBdHRyW0EtWl0vOwoKICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyA9IGRlYnVnSW5mb0VuYWJsZWQgPyBmdW5jdGlvbiAkJGFkZEJpbmRpbmdJbmZvKCRlbGVtZW50LCBiaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5ncyA9ICRlbGVtZW50LmRhdGEoJyRiaW5kaW5nJykgfHwgW107CgogICAgICBpZiAoaXNBcnJheShiaW5kaW5nKSkgewogICAgICAgIGJpbmRpbmdzID0gYmluZGluZ3MuYw0KjNzvVq15AQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwuQABABm6vwKgHNsCoB2CVIh/1WHp800G1ddiAEAvwk40AAAEBCAoAo169AE2luIzc71axeQEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8L0AAQAZursCoBzbAqAdglSIf9Vh6fNNBtZWggBAL8HPFAAABAQgKAKNevQBNpbiM3O9WrHoBAGpgAABqYAAAaPcoH9LFCAAnrR4TCABFAGBc0xNAAEAGd6HAqAdgwKgHNh/1lSJBtZWgWHp804AQAVPwNQAAAQEICgBNpbgAo169N0ZFOA0Kb25jYXQoYmluZGluZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmluZGluZ3MucHVzaChiaW5kaW5nKTsKICAgICAgfQoKICAgICAgJGVsZW1lbnQuZGF0YSgnJGJpbmRpbmcnLCBiaW5kaW5ncyk7CiAgICB9IDogbm9vcDsKCiAgICBjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzID0gZGVidWdJbmZvRW5hYmxlZCA/IGZ1bmN0aW9uICQkYWRkQmluZGluZ0NsYXNzKCRlbGVtZW50KSB7CiAgICAgIHNhZmVBZGRDbGFzcygkZWxlbWVudCwgJ25nLWJpbmRpbmcnKTsKICAgIH0gOiBub29wOwoKICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8gPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRTY29wZUluZm8oJGVsZW1lbnQsIHNjb3BlLCBpc29sYXRlZCwgbm9UZW1wbGF0ZSkgewogICAgICB2YXIgZGF0YU5hbWUgPSBpc29sYXRlZCA/IChub1RlbXBsYXRlID8gJyRpc29sYXRlU2NvcGVOb1RlbXBsYXRlJyA6ICckaXNvbGF0ZVNjb3BlJykgOiAnJHNjb3BlJzsKICAgICAgJGVsZW1lbnQuZGF0YShkYXRhTmFtZSwgc2NvcGUpOwogICAgfSA6IG5vb3A7CgogICAgY29tcGlsZS4kJGFkZFNjb3BlQ2xhc3MgPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRTY29wZUNsYXNzKCRlbGVtZW50LCBpc29sYXRlZCkgewogICAgICBzYWZlQWRkQ2xhc3MoJGVsZW1lbnQsIGlzb2xhdGVkID8gJ25nLWlzb2xhdGUtc2NvcGUnIDogJ25nLXNjb3BlJyk7CiAgICB9IDogbm9vcDsKCiAgICByZXR1cm4gY29tcGlsZTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gY29tcGlsZSgkY29tcGlsZU5vZGVzLCB0cmFuc2NsdWRlRm4sIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpIHsKICAgICAgaWYgKCEoJGNvbXBpbGVOb2RlcyBpbnN0YW5jZW9mIGpxTGl0ZSkpIHsKICAgICAgICAvLyBqcXVlcnkgYWx3YXlzIHJld3JhcHMsIHdoZXJlYXMgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2VsZWN0b3Igc28gdGhhdCB3ZSBjYW4KICAgICAgICAvLyBtb2RpZnkgaXQuCiAgICAgICAgJGNvbXBpbGVOb2RlcyA9IGpxTGl0ZSgkY29tcGlsZU5vZGVzKTsKICAgICAgfQogICAgICAvLyBXZSBjYW4gbm90IGNvbXBpbGUgdG9wIGxldmVsIHRleHQgZWxlbWVudHMgc2luY2UgdGV4dCBub2RlcyBjYW4gYmUgbWVyZ2VkIGFuZCB3ZSB3aWxsCiAgICAgIC8vIG5vdCBiZSBhYmxlIHRvIGF0dGFjaCBzY29wZSBkYXRhIHRvIHRoZW0sIHNvIHdlIHdpbGwgd3JhcCB0aGVtIGluIDxzcGFuPgogICAgICBmb3JFYWNoKCRjb21waWxlTm9kZXMsIGZ1bmN0aW9uKG5vZGUsIGluZGV4KSB7CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTk9ERV9UWVBFX1RFWFQgJiYgbm9kZS5ub2RlVmFsdWUubWF0Y2goL1xTKy8pIC8qIG5vbi1lbXB0eSAqLyApIHsKICAgICAgICAgICRjb21waWxlTm9kZXNbaW5kZXhdID0ganFMaXRlKG5vZGUpLndyYXAoJzxzcGFuPjwvc3Bhbj4nKS5wYXJlbnQoKVswXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB2YXIgY29tcG9zaXRlTGlua0ZuID0KICAgICAgICAgICAgICBjb21waWxlTm9kZXMoJGNvbXBpbGVOb2RlcywgdHJhbnNjbHVkZUZuLCAkY29tcGlsZU5vZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBwcmV2aW91c0NvbXBpbGVDb250ZXh0KTsKICAgICAgY29tcGlsZS4kJGFkZFNjb3BlQ2xhc3MoJGNvbXBpbGVOb2Rlcyk7CiAgICAgIHZhciBuYW1lc3BhY2UgPSBudWxsOwogICAgICByZXR1cm4gZnVuY3Rpb24gcHVibGljTGlua0ZuKHNjb3BlLCBjbG9uZUNvbm5lY3RGbiwgb3B0aW9ucykgewogICAgICAgIGFzc2VydEFyZyhzY29wZSwgJ3Njb3BlJyk7CgogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIHZhciBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbiA9IG9wdGlvbnMucGFyZW50Qm91bmRUcmFuc2NsdWRlRm4sCiAgICAgICAgICB0cmFuc2NsdWRlQ29udHJvbGxlcnMgPSBvcHRpb25zLnRyYW5zY2x1ZGVDb250cm9sbGVycywKICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQgPSBvcHRpb25zLmZ1dHVyZVBhcmVudEVsZW1lbnQ7CgogICAgICAgIC8vIFdoZW4gYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCBpcyBwYXNzZWQsIGl0IGlzIGEKICAgICAgICAvLyBgY29udHJvbGxlcnNCb3VuZFRyYW5zY2x1ZGVgIGZ1bmN0aW9uIChpdCB3YXMgcHJldmlvdXNseSBwYXNzZWQKICAgICAgICAvLyBhcyBgdHJhbnNjbHVkZWAgdG8gZGlyZWN0aXZlLmxpbmspIHNvIHdlIG11c3QgdW53cmFwIGl0IHRvIGdldAogICAgICAgIC8vIGl0cyBgYm91bmRUcmFuc2NsdWRlRm5gCiAgICAgICAgaWYgKHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuICYmIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLiQkYm91bmRUcmFuc2NsdWRlKSB7CiAgICAgICAgICBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbiA9IHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLiQkYm91bmRUcmFuc2NsdWRlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHsKICAgICAgICAgIG5hbWVzcGFjZSA9IGRldGVjdE5hbWVzcGFjZUZvckNoaWxkRWxlbWVudHMoZnV0dXJlUGFyZW50RWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHZhciAkbGlua05vZGU7CiAgICAgICAgaWYgKG5hbWVzcGFjZSAhPT0gJ2h0bWwnKSB7CiAgICAgICAgICAvLyBXaGVuIHVzaW5nIGEgZGlyZWN0aXZlIHdpdGggcmVwbGFjZTp0cnVlIGFuZCB0ZW1wbGF0ZVVybCB0aGUgJGNvbXBpbGVOb2RlcwogICAgICAgICAgLy8gKG9yIGEgY2hpbGQgZWxlbWVudCBpbnNpZGUgb2YgdGhlbSkKICAgICAgICAgIC8vIG1pZ2h0IGNoYW5nZSwgc28gd2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgbmFtZXNwYWNlIGFkYXB0ZWQgY29tcGlsZU5vZGVzCiAgICAgICAgICAvLyBmb3IgY2FsbCB0byB0aGUgbGluayBmdW5jdGlvbi4KICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBhbHJlYWR5IGNsb25lIHRoZSBub2Rlcy4uLgogICAgICAgICAgJGxpbmtOb2RlID0ganFMaXRlKAogICAgICAgICAgICB3cmFwVGVtcGxhdGUobmFtZXNwYWNlLCBqcUxpdGUoJzxkaXY+JykuYXBwZW5kKCRjb21waWxlTm9kZXMpLmh0bWwoKSkKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmIChjbG9uZUNvbm5lY3RGbikgewogICAgICAgICAgLy8gaW1wb3J0YW50ISE6IHdlIG11c3QgY2FsbCBvdXIganFMaXRlLmNsb25lKCkgc2luY2UgdGhlIGpRdWVyeSBvbmUgaXMgdHJ5aW5nIHRvIGJlIHNtYXJ0CiAgICAgICAgICAvLyBhbmQgc29tZXRpbWVzIGNoYW5nZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgRE9NLgogICAgICAgICAgJGxpbmtOb2RlID0gSlFMaXRlUHJvdG90eXBlLmNsb25lLmNhbGwoJGNvbXBpbGVOb2Rlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICRsaW5rTm9kZSA9ICRjb21waWxlTm9kZXM7CiAgICAgICAgfQoKICAgICAgICBpZiAodHJhbnNjbHVkZUNvbnRyb2xsZXJzKSB7CiAgICAgICAgICBmb3IgKHZhciBjb250cm9sbGVyTmFtZSBpbiB0cmFuc2NsdWRlQ29udHJvbGxlcnMpIHsKICAgICAgICAgICAgJGxpbmtOb2RlLmRhdGEoJyQnICsgY29udHJvbGxlck5hbWUgKyAnQ29udHJvbGxlcicsIHRyYW5zY2x1ZGVDb250cm9sbGVyc1tjb250cm9sbGVyTmFtZV0uaW5zdGFuY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlSW5mbygkbGlua05vZGUsIHNjb3BlKTsKCiAgICAgICAgaWYgKGNsb25lQ29ubmVjdEZuKSBjbG9uZUNvbm5lY3RGbigkbGlua05vZGUsIHNjb3BlKTsKICAgICAgICBpZiAoY29tcG9zaXRlTGlua0ZuKSBjb21wb3NpdGVMaW5rRm4oc2NvcGUsICRsaW5rTm9kZSwgJGxpbmtOb2RlLCBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbik7CiAgICAgICAgcmV0dXJuICRsaW5rTm9kZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXRlY3ROYW1lc3BhY2VGb3JDaGlsZEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpIHsKICAgICAgLy8gVE9ETzogTWFrZSB0aGlzIGRldGVjdCBNYXRoTUwgYXMgd2VsbC4uLgogICAgICB2YXIgbm9kZSA9IHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudFswXTsKICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgcmV0dXJuICdodG1sJzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbm9kZU5hbWVfKG5vZGUpICE9PSAnZm9yZWlnbm9iamVjdCcgJiYgbm9kZS50b1N0cmluZygpLm1hdGNoKC9TVkcvKSA/ICdzdmcnIDogJ2h0bWwnOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIGZ1bmN0aW9uIG1hdGNoZXMgZWFjaCBub2RlIGluIG5vZGVMaXN0IGFnYWluc3QgdGhlIGRpcmVjdGl2ZXMuIE9uY2UgYWxsIGRpcmVjdGl2ZXMKICAgICAqIGZvciBhIHBhcnRpY3VsYXIgbm9kZSBhcmUgY29sbGVjdGVkIHRoZWlyIGNvbXBpbGUgZnVuY3Rpb25zIGFyZSBleGVjdXRlZC4gVGhlIGNvbXBpbGUKICAgICAqIGZ1bmN0aW9ucyByZXR1cm4gdmFsdWVzIC0gdGhlIGxpbmtpbmcgZnVuY3Rpb25zIC0gYXJlIGNvbWJpbmVkIGludG8gYSBjb21wb3NpdGUgbGlua2luZwogICAgICogZnVuY3Rpb24sIHdoaWNoIGlzIHRoZSBhIGxpbmtpbmcgZnVuY3Rpb24gZm9yIHRoZSBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7Tm9kZUxpc3R9IG5vZGVMaXN0IGFuIGFycmF5IG9mIG5vZGVzIG9yIE5vZGVMaXN0IHRvIGNvbXBpbGUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oYW5ndWxhci5TY29wZSwgY2xvbmVBdHRhY2hGbj0pfSB0cmFuc2NsdWRlRm4gQSBsaW5raW5nIGZ1bmN0aW9uLCB3aGVyZSB0aGUKICAgICAqICAgICAgICBzY29wZSBhcmd1bWVudCBpcyBhdXRvLWdlbmVyYXRlZCB0byB0aGUgbmV3IGNoaWxkIG9mIHRoZSB0cmFuc2NsdWRlZCBwYXJlbnQgc2NvcGUuCiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnQ9fSAkcm9vdEVsZW1lbnQgSWYgdGhlIG5vZGVMaXN0IGlzIHRoZSByb290IG9mIHRoZSBjb21waWxhdGlvbiB0cmVlIHRoZW4KICAgICAqICAgICAgICB0aGUgcm9vdEVsZW1lbnQgbXVzdCBiZSBzZXQgdGhlIGpxTGl0ZSBjb2xsZWN0aW9uIG9mIHRoZSBjb21waWxlIHJvb3QuIFRoaXMgaXMKICAgICAqICAgICAgICBuZWVkZWQgc28gdGhhdCB0aGUganFMaXRlIGNvbGxlY3Rpb24gaXRlbXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggd2lkZ2V0cy4KICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gbWF4UHJpb3JpdHkgTWF4IGRpcmVjdGl2ZSBwcmlvcml0eS4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBjb21wb3NpdGUgbGlua2luZyBmdW5jdGlvbiBvZiBhbGwgb2YgdGhlIG1hdGNoZWQgZGlyZWN0aXZlcyBvciBudWxsLgogICAgICovCiAgICBmdW5jdGlvbiBjb21waWxlTm9kZXMobm9kZUxpc3QsIHRyYW5zY2x1ZGVGbiwgJHJvb3RFbGVtZW50LCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkgewogICAgICB2YXIgbGlua0ZucyA9IFtdLAogICAgICAgICAgYXR0cnMsIGRpcmVjdGl2ZXMsIG5vZGVMaW5rRm4sIGNoaWxkTm9kZXMsIGNoaWxkTGlua0ZuLCBsaW5rRm5Gb3VuZCwgbm9kZUxpbmtGbkZvdW5kOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXMoKTsKCiAgICAgICAgLy8gd2UgbXVzdCBhbHdheXMgcmVmZXIgdG8gbm9kZUxpc3RbaV0gc2luY2UgdGhlIG5vZGVzIGNhbiBiZSByZXBsYWNlZCB1bmRlcm5lYXRoIHVzLgogICAgICAgIGRpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhub2RlTGlzdFtpXSwgW10sIGF0dHJzLCBpID09PSAwID8gbWF4UHJpb3JpdHkgOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVEaXJlY3RpdmUpOwoKICAgICAgICBub2RlTGlua0ZuID0gKGRpcmVjdGl2ZXMubGVuZ3RoKQogICAgICAgICAgICA/IGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBub2RlTGlzdFtpXSwgYXR0cnMsIHRyYW5zY2x1ZGVGbiwgJHJvb3RFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFtdLCBbXSwgcHJldmlvdXNDb21waWxlQ29udGV4dCkKICAgICAgICAgICAgOiBudWxsOwoKICAgICAgICBpZiAobm9kZUxpbmtGbiAmJiBub2RlTGlua0ZuLnNjb3BlKSB7CiAgICAgICAgICBjb21waWxlLiQkYWRkU2NvcGVDbGFzcyhhdHRycy4kJGVsZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgY2hpbGRMaW5rRm4gPSAobm9kZUxpbmtGbiAmJiBub2RlTGlua0ZuLnRlcm1pbmFsIHx8CiAgICAgICAgICAgICAgICAgICAgICAhKGNoaWxkTm9kZXMgPSBub2RlTGlzdFtpXS5jaGlsZE5vZGVzKSB8fAogICAgICAgICAgICAgICAgICAgICAgIWNoaWxkTm9kZXMubGVuZ3RoKQogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgOiBjb21waWxlTm9kZXMoY2hpbGROb2RlcywKICAgICAgICAgICAgICAgICBub2RlTGlua0ZuID8gKAogICAgICAgICAgICAgICAgICAobm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCB8fCAhbm9kZUxpbmtGbi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgICYmIG5vZGVMaW5rRm4udHJhbnNjbHVkZSkgOiB0cmFuc2NsdWRlRm4pOwoKICAgICAgICBpZiAobm9kZUxpbmtGbiB8fCBjaGlsZExpbmtGbikgewogICAgICAgICAgbGlua0Zucy5wdXNoKGksIG5vZGVMaW5rRm4sIGNoaWxkTGlua0ZuKTsKICAgICAgICAgIGxpbmtGbkZvdW5kID0gdHJ1ZTsKICAgICAgICAgIG5vZGVMaW5rRm5Gb3VuZCA9IG5vZGVMaW5rRm5Gb3VuZCB8fCBub2RlTGlua0ZuOwogICAgICAgIH0KCiAgICAgICAgLy91c2UgdGhlIHByZXZpb3VzIGNvbnRleHQgb25seSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHZpcnR1YWwgZ3JvdXAKICAgICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0ID0gbnVsbDsKICAgICAgfQoKICAgICAgLy8gcmV0dXJuIGEgbGlua2luZyBmdW5jdGlvbiBpZiB3ZSBoYXZlIGZvdW5kIGFueXRoaW5nLCBudWxsIG90aGVyd2lzZQogICAgICByZXR1cm4gbGlua0ZuRm91bmQgPyBjb21wb3NpdGVMaW5rRm4gOiBudWxsOwoKICAgICAgZnVuY3Rpb24gY29tcG9zaXRlTGlua0ZuKHNjb3BlLCBub2RlTGlzdCwgJHJvb3RFbGVtZW50LCBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbikgewogICAgICAgIHZhciBub2RlTGlua0ZuLCBjaGlsZExpbmtGbiwgbm9kZSwgY2hpbGRTY29wZSwgaSwgaWksIGlkeCwgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbjsKICAgICAgICB2YXIgc3RhYmxlTm9kZUxpc3Q7CgoKICAgICAgICBpZiAobm9kZUxpbmtGbkZvdW5kKSB7CiAgICAgICAgICAvLyBjb3B5IG5vZGVMaXN0IHNvIHRoYXQgaWYgYSBub2RlTGlua0ZuIHJlbW92ZXMgb3IgYWRkcyBhbiBlbGVtZW50IGF0IHRoaXMgRE9NIGxldmVsIG91cgogICAgICAgICAgLy8gb2Zmc2V0cyBkb24ndCBnZXQgc2NyZXdlZCB1cAogICAgICAgICAgdmFyIG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QubGVuZ3RoOwogICAgICAgICAgc3RhYmxlTm9kZUxpc3QgPSBuZXcgQXJyYXkobm9kZUxpc3RMZW5ndGgpOwoKICAgICAgICAgIC8vIGNyZWF0ZSBhIHNwYXJzZSBhcnJheSBieSBvbmx5IGNvcHlpbmcgdGhlIGVsZW1lbnRzIHdoaWNoIGhhdmUgYSBsaW5rRm4KICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5rRm5zLmxlbmd0aDsgaSs9MykgewogICAgICAgICAgICBpZHggPSBsaW5rRm5zW2ldOwogICAgICAgICAgICBzdGFibGVOb2RlTGlzdFtpZHhdID0gbm9kZUxpc3RbaWR4XTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhYmxlTm9kZUxpc3QgPSBub2RlTGlzdDsKICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDAsIGlpID0gbGlua0Zucy5sZW5ndGg7IGkgPCBpaTspIHsKICAgICAgICAgIG5vZGUgPSBzdGFibGVOb2RlTGlzdFtsaW5rRm5zW2krK11dOwogICAgICAgICAgbm9kZUxpbmtGbiA9IGxpbmtGbnNbaSsrXTsKICAgICAgICAgIGNoaWxkTGlua0ZuID0gbGlua0Zuc1tpKytdOwoKICAgICAgICAgIGlmIChub2RlTGlua0ZuKSB7CiAgICAgICAgICAgIGlmIChub2RlTGlua0ZuLnNjb3BlKSB7CiAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IHNjb3BlLiRuZXcoKTsKICAgICAgICAgICAgICBjb21waWxlLiQkYWRkU2NvcGVJbmZvKGpxTGl0ZShub2RlKSwgY2hpbGRTY29wZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IHNjb3BlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCkgewogICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbigKICAgICAgICAgICAgICAgICAgc2NvcGUsIG5vZGVMaW5rRm4udHJhbnNjbHVkZSwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4sCiAgICAgICAgICAgICAgICAgIG5vZGVMaW5rRm4uZWxlbWVudFRyYW5zY2x1ZGVPblRoaXNFbGVtZW50KTsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGVMaW5rRm4udGVtcGxhdGVPblRoaXNFbGVtZW50ICYmIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuKSB7CiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuOwoKICAgICAgICAgICAgfSBlbHNlIGlmICghcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gJiYgdHJhbnNjbHVkZUZuKSB7CiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCB0cmFuc2NsdWRlRm4pOwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbm9kZUxpbmtGbihjaGlsZExpbmtGbiwgY2hpbGRTY29wZSwgbm9kZSwgJHJvb3RFbGVtZW50LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTsKCiAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkTGlua0ZuKSB7CiAgICAgICAgICAgIGNoaWxkTGlua0ZuKHNjb3BlLCBub2RlLmNoaWxkTm9kZXMsIHVuZGVmaW5lZCwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCB0cmFuc2NsdWRlRm4sIHByZXZpb3VzQm91bmRUcmFuc2NsdWRlRm4sIGVsZW1lbnRUcmFuc2NsdXNpb24pIHsKCiAgICAgIHZhciBib3VuZFRyYW5zY2x1ZGVGbiA9IGZ1bmN0aW9uKHRyYW5zY2x1ZGVkU2NvcGUsIGNsb25lRm4sIGNvbnRyb2xsZXJzLCBmdXR1cmVQYXJlbnRFbGVtZW50LCBjb250YWluaW5nU2NvcGUpIHsKCiAgICAgICAgaWYgKCF0cmFuc2NsdWRlZFNjb3BlKSB7CiAgICAgICAgICB0cmFuc2NsdWRlZFNjb3BlID0gc2NvcGUuJG5ldyhmYWxzZSwgY29udGFpbmluZ1Njb3BlKTsKICAgICAgICAgIHRyYW5zY2x1ZGVkU2NvcGUuJCR0cmFuc2NsdWRlZCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJhbnNjbHVkZUZuKHRyYW5zY2x1ZGVkU2NvcGUsIGNsb25lRm4sIHsKICAgICAgICAgIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuOiBwcmV2aW91c0JvdW5kVHJhbnNjbHVkZUZuLAogICAgICAgICAgdHJhbnNjbHVkZUNvbnRyb2xsZXJzOiBjb250cm9sbGVycywKICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQ6IGZ1dHVyZVBhcmVudEVsZW1lbnQKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIHJldHVybiBib3VuZFRyYW5zY2x1ZGVGbjsKICAgIH0KCiAgICAvKioKICAgICAqIExvb2tzIGZvciBkaXJlY3RpdmVzIG9uIHRoZSBnaXZlbiBub2RlIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGRpcmVjdGl2ZSBjb2xsZWN0aW9uIHdoaWNoIGlzCiAgICAgKiBzb3J0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0gZGlyZWN0aXZlcyBBbiBhcnJheSB0byB3aGljaCB0aGUgZGlyZWN0aXZlcyBhcmUgYWRkZWQgdG8uIFRoaXMgYXJyYXkgaXMgc29ydGVkIGJlZm9yZQogICAgICogICAgICAgIHRoZSBmdW5jdGlvbiByZXR1cm5zLgogICAgICogQHBhcmFtIGF0dHJzIFRoZSBzaGFyZWQgYXR0cnMgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIG5vcm1hbGl6ZWQgYXR0cmlidXRlcy4KICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gbWF4UHJpb3JpdHkgTWF4IGRpcmVjdGl2ZSBwcmlvcml0eS4KICAgICAqLwogICAgZnVuY3Rpb24gY29sbGVjdERpcmVjdGl2ZXMobm9kZSwgZGlyZWN0aXZlcywgYXR0cnMsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpIHsKICAgICAgdmFyIG5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZSwKICAgICAgICAgIGF0dHJzTWFwID0gYXR0cnMuJGF0dHIsCiAgICAgICAgICBtYXRjaCwKICAgICAgICAgIGNsYXNzTmFtZTsKCiAgICAgIHN3aXRjaCAobm9kZVR5cGUpIHsKICAgICAgICBjYXNlIE5PREVfVFlQRV9FTEVNRU5UOiAvKiBFbGVtZW50ICovCiAgICAgICAgICAvLyB1c2UgdGhlIG5vZGUgbmFtZTogPGRpcmVjdGl2ZT4KICAgICAgICAgIGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLAogICAgICAgICAgICAgIGRpcmVjdGl2ZU5vcm1hbGl6ZShub2RlTmFtZV8obm9kZSkpLCAnRScsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpOwoKICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0cmlidXRlcwogICAgICAgICAgZm9yICh2YXIgYXR0ciwgbmFtZSwgbk5hbWUsIG5nQXR0ck5hbWUsIHZhbHVlLCBpc05nQXR0ciwgbkF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgaiA9IDAsIGpqID0gbkF0dHJzICYmIG5BdHRycy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgIHZhciBhdHRyU3RhcnROYW1lID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBhdHRyRW5kTmFtZSA9IGZhbHNlOwoKICAgICAgICAgICAgYXR0ciA9IG5BdHRyc1tqXTsKICAgICAgICAgICAgbmFtZSA9IGF0dHIubmFtZTsKICAgICAgICAgICAgdmFsdWUgPSB0cmltKGF0dHIudmFsdWUpOwoKICAgICAgICAgICAgLy8gc3VwcG9ydCBuZ0F0dHIgYXR0cmlidXRlIGJpbmRpbmcKICAgICAgICAgICAgbmdBdHRyTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZShuYW1lKTsKICAgICAgICAgICAgaWYgKGlzTmdBdHRyID0gTkdfQVRUUl9CSU5ESU5HLnRlc3QobmdBdHRyTmFtZSkpIHsKICAgICAgICAgICAgICBuYW1lID0gc25ha2VfY2FzZShuZ0F0dHJOYW1lLnN1YnN0cig2KSwgJy0nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZU5OYW1lID0gbmdBdHRyTmFtZS5yZXBsYWNlKC8oU3RhcnR8RW5kKSQvLCAnJyk7CiAgICAgICAgICAgIGlmIChkaXJlY3RpdmVJc011bHRpRWxlbWVudChkaXJlY3RpdmVOTmFtZSkpIHsKICAgICAgICAgICAgICBpZiAobmdBdHRyTmFtZSA9PT0gZGlyZWN0aXZlTk5hbWUgKyAnU3RhcnQnKSB7CiAgICAgICAgICAgICAgICBhdHRyU3RhcnROYW1lID0gbmFtZTsKICAgICAgICAgICAgICAgIGF0dHJFbmROYW1lID0gbmFtZS5zdWJzdHIoMCwgbmFtZS5sZW5ndGggLSA1KSArICdlbmQnOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDAsIG5hbWUubGVuZ3RoIC0gNik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBuTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZShuYW1lLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgICBhdHRyc01hcFtuTmFtZV0gPSBuYW1lOwogICAgICAgICAgICBpZiAoaXNOZ0F0dHIgfHwgIWF0dHJzLmhhc093blByb3BlcnR5KG5OYW1lKSkgewogICAgICAgICAgICAgICAgYXR0cnNbbk5hbWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoZ2V0Qm9vbGVhbkF0dHJOYW1lKG5vZGUsIG5OYW1lKSkgewogICAgICAgICAgICAgICAgICBhdHRyc1tuTmFtZV0gPSB0cnVlOyAvLyBwcmVzZW5jZSBtZWFucyB0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWRkQXR0ckludGVycG9sYXRlRGlyZWN0aXZlKG5vZGUsIGRpcmVjdGl2ZXMsIHZhbHVlLCBuTmFtZSwgaXNOZ0F0dHIpOwogICAgICAgICAgICBhZGREaXJlY3RpdmUoZGlyZWN0aXZlcywgbk5hbWUsICdBJywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSwgYXR0clN0YXJ0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyRW5kTmFtZSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gdXNlIGNsYXNzIGFzIGRpcmVjdGl2ZQogICAgICAgICAgY2xhc3NOYW1lID0gbm9kZS5jbGFzc05hbWU7CiAgICAgICAgICBpZiAoaXNTdHJpbmcoY2xhc3NOYW1lKSAmJiBjbGFzc05hbWUgIT09ICcnKSB7CiAgICAgICAgICAgIHdoaWxlIChtYXRjaCA9IENMQVNTX0RJUkVDVElWRV9SRUdFWFAuZXhlYyhjbGFzc05hbWUpKSB7CiAgICAgICAgICAgICAgbk5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUobWF0Y2hbMl0pOwogICAgICAgICAgICAgIGlmIChhZGREaXJlY3RpdmUoZGlyZWN0aXZlcywgbk5hbWUsICdDJywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSkpIHsKICAgICAgICAgICAgICAgIGF0dHJzW25OYW1lXSA9IHRyaW0obWF0Y2hbM10pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOT0RFX1RZUEVfVEVYVDogLyogVGV4dCBOb2RlICovCiAgICAgICAgICBhZGRUZXh0SW50ZXJwb2xhdGVEaXJlY3RpdmUoZGlyZWN0aXZlcywgbm9kZS5ub2RlVmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOT0RFX1RZUEVfQ09NTUVOVDogLyogQ29tbWVudCAqLwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbWF0Y2ggPSBDT01NRU5UX0RJUkVDVElWRV9SRUdFWFAuZXhlYyhub2RlLm5vZGVWYWx1ZSk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgIG5OYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKG1hdGNoWzFdKTsKICAgICAgICAgICAgICBpZiAoYWRkRGlyZWN0aXZlKGRpcmVjdGl2ZXMsIG5OYW1lLCAnTScsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpKSB7CiAgICAgICAgICAgICAgICBhdHRyc1tuTmFtZV0gPSB0cmltKG1hdGNoWzJdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgLy8gdHVybnMgb3V0IHRoYXQgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIElFOSB0aHJvd3MgZXJyb3JzIHdoZW4gb25lIGF0dGVtcHRzIHRvIHJlYWQKICAgICAgICAgICAgLy8gY29tbWVudCdzIG5vZGUgdmFsdWUuCiAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIGl0IGFuZCBjb250aW51ZS4gKENhbid0IHNlZW0gdG8gcmVwcm9kdWNlIGluIHRlc3QgY2FzZS4pCiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgZGlyZWN0aXZlcy5zb3J0KGJ5UHJpb3JpdHkpOwogICAgICByZXR1cm4gZGlyZWN0aXZlczsKICAgIH0KCiAgICAvKioKICAgICAqIEdpdmVuIGEgbm9kZSB3aXRoIGFuIGRpcmVjdGl2ZS1zdGFydCBpdCBjb2xsZWN0cyBhbGwgb2YgdGhlIHNpYmxpbmdzIHVudGlsIGl0IGZpbmRzCiAgICAgKiBkaXJlY3RpdmUtZW5kLgogICAgICogQHBhcmFtIG5vZGUKICAgICAqIEBwYXJhbSBhdHRyU3RhcnQKICAgICAqIEBwYXJhbSBhdHRyRW5kCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgZnVuY3Rpb24gZ3JvdXBTY2FuKG5vZGUsIGF0dHJTdGFydCwgYXR0ckVuZCkgewogICAgICB2YXIgbm9kZXMgPSBbXTsKICAgICAgdmFyIGRlcHRoID0gMDsKICAgICAgaWYgKGF0dHJTdGFydCAmJiBub2RlLmhhc0F0dHJpYnV0ZSAmJiBub2RlLmhhc0F0dHJpYnV0ZShhdHRyU3RhcnQpKSB7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCd1dGVyZGlyJywKICAgICAgICAgICAgICAgICAgICAgICJVbnRlcm1pbmF0ZWQgYXR0cmlidXRlLCBmb3VuZCAnezB9JyBidXQgbm8gbWF0Y2hpbmcgJ3sxfScgZm91bmQuIiwKICAgICAgICAgICAgICAgICAgICAgIGF0dHJTdGFydCwgYXR0ckVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOT0RFX1RZUEVfRUxFTUVOVCkgewogICAgICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0clN0YXJ0KSkgZGVwdGgrKzsKICAgICAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJFbmQpKSBkZXB0aC0tOwogICAgICAgICAgfQogICAgICAgICAgbm9kZXMucHVzaChub2RlKTsKICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0gd2hpbGUgKGRlcHRoID4gMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZXMucHVzaChub2RlKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGpxTGl0ZShub2Rlcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXcmFwcGVyIGZvciBsaW5raW5nIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIG5vcm1hbCBsaW5raW5nIGZ1bmN0aW9uIGludG8gYSBncm91cGVkCiAgICAgKiBsaW5raW5nIGZ1bmN0aW9uLgogICAgICogQHBhcmFtIGxpbmtGbgogICAgICogQHBhcmFtIGF0dHJTdGFydAogICAgICogQHBhcmFtIGF0dHJFbmQKICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0KICAgICAqLwogICAgZnVuY3Rpb24gZ3JvdXBFbGVtZW50c0xpbmtGbldyYXBwZXIobGlua0ZuLCBhdHRyU3RhcnQsIGF0dHJFbmQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcnMsIHRyYW5zY2x1ZGVGbikgewogICAgICAgIGVsZW1lbnQgPSBncm91cFNjYW4oZWxlbWVudFswXSwgYXR0clN0YXJ0LCBhdHRyRW5kKTsKICAgICAgICByZXR1cm4gbGlua0ZuKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcnMsIHRyYW5zY2x1ZGVGbik7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBPbmNlIHRoZSBkaXJlY3RpdmVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRoZWlyIGNvbXBpbGUgZnVuY3Rpb25zIGFyZSBleGVjdXRlZC4gVGhpcyBtZXRob2QKICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBpbmxpbmluZyBkaXJlY3RpdmUgdGVtcGxhdGVzIGFzIHdlbGwgYXMgdGVybWluYXRpbmcgdGhlIGFwcGxpY2F0aW9uCiAgICAgKiBvZiB0aGUgZGlyZWN0aXZlcyBpZiB0aGUgdGVybWluYWwgZGlyZWN0aXZlIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgKgogICAgICogQHBhcmFtIHtBcnJheX0gZGlyZWN0aXZlcyBBcnJheSBvZiBjb2xsZWN0ZWQgZGlyZWN0aXZlcyB0byBleGVjdXRlIHRoZWlyIGNvbXBpbGUgZnVuY3Rpb24uCiAgICAgKiAgICAgICAgdGhpcyBuZWVkcyB0byBiZSBwcmUtc29ydGVkIGJ5IHByaW9yaXR5IG9yZGVyLgogICAgICogQHBhcmFtIHtOb2RlfSBjb21waWxlTm9kZSBUaGUgcmF3IERPTSBub2RlIHRvIGFwcGx5IHRoZSBjb21waWxlIGZ1bmN0aW9ucyB0bwogICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlQXR0cnMgVGhlIHNoYXJlZCBhdHRyaWJ1dGUgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oYW5ndWxhci5TY29wZSwgY2xvbmVBdHRhY2hGbj0pfSB0cmFuc2NsdWRlRm4gQSBsaW5raW5nIGZ1bmN0aW9uLCB3aGVyZSB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSBhcmd1bWVudCBpcyBhdXRvLWdlbmVyYXRlZCB0byB0aGUgbmV3CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgb2YgdGhlIHRyYW5zY2x1ZGVkIHBhcmVudCBzY29wZS4KICAgICAqIEBwYXJhbSB7SlFMaXRlfSBqcUNvbGxlY3Rpb24gSWYgd2UgYXJlIHdvcmtpbmcgb24gdGhlIHJvb3Qgb2YgdGhlIGNvbXBpbGUgdHJlZSB0aGVuIHRoaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgaGFzIHRoZSByb290IGpxTGl0ZSBhcnJheSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIG5vZGVzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGl0LgogICAgICogQHBhcmFtIHtPYmplY3Q9fSBvcmlnaW5hbFJlcGxhY2VEaXJlY3RpdmUgQW4gb3B0aW9uYWwgZGlyZWN0aXZlIHRoYXQgd2lsbCBiZSBpZ25vcmVkIHdoZW4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGluZyB0aGUgdHJhbnNjbHVzaW9uLgogICAgICogQHBhcmFtIHtBcnJheS48RnVuY3Rpb24+fSBwcmVMaW5rRm5zCiAgICAgKiBAcGFyYW0ge0FycmF5LjxGdW5jdGlvbj59IHBvc3RMaW5rRm5zCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJldmlvdXNDb21waWxlQ29udGV4dCBDb250ZXh0IHVzZWQgZm9yIHByZXZpb3VzIGNvbXBpbGF0aW9uIG9mIHRoZSBjdXJyZW50CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IGxpbmtGbgogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURpcmVjdGl2ZXNUb05vZGUoZGlyZWN0aXZlcywgY29tcGlsZU5vZGUsIHRlbXBsYXRlQXR0cnMsIHRyYW5zY2x1ZGVGbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcUNvbGxlY3Rpb24sIG9yaWdpbmFsUmVwbGFjZURpcmVjdGl2ZSwgcHJlTGlua0ZucywgcG9zdExpbmtGbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkgewogICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0ID0gcHJldmlvdXNDb21waWxlQ29udGV4dCB8fCB7fTsKCiAgICAgIHZhciB0ZXJtaW5hbFByaW9yaXR5ID0gLU51bWJlci5NQVhfVkFMVUUsCiAgICAgICAgICBuZXdTY29wZURpcmVjdGl2ZSwKICAgICAgICAgIGNvbnRyb2xsZXJEaXJlY3RpdmVzID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5jb250cm9sbGVyRGlyZWN0aXZlcywKICAgICAgICAgIGNvbnRyb2xsZXJzLAogICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5uZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUsCiAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZSA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQudGVtcGxhdGVEaXJlY3RpdmUsCiAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5ub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlLAogICAgICAgICAgaGFzVHJhbnNjbHVkZURpcmVjdGl2ZSA9IGZhbHNlLAogICAgICAgICAgaGFzVGVtcGxhdGUgPSBmYWxzZSwKICAgICAgICAgIGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSwKICAgICAgICAgICRjb21waWxlTm9kZSA9IHRlbXBsYXRlQXR0cnMuJCRlbGVtZW50ID0ganFMaXRlKGNvbXBpbGVOb2RlKSwKICAgICAgICAgIGRpcmVjdGl2ZSwKICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsCiAgICAgICAgICAkdGVtcGxhdGUsCiAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlID0gb3JpZ2luYWxSZXBsYWNlRGlyZWN0aXZlLAogICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSB0cmFuc2NsdWRlRm4sCiAgICAgICAgICBsaW5rRm4sCiAgICAgICAgICBkaXJlY3RpdmVWYWx1ZTsKCiAgICAgIC8vIGV4ZWN1dGVzIGFsbCBkaXJlY3RpdmVzIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQKICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGlyZWN0aXZlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgZGlyZWN0aXZlID0gZGlyZWN0aXZlc1tpXTsKICAgICAgICB2YXIgYXR0clN0YXJ0ID0gZGlyZWN0aXZlLiQkc3RhcnQ7CiAgICAgICAgdmFyIGF0dHJFbmQgPSBkaXJlY3RpdmUuJCRlbmQ7CgogICAgICAgIC8vIGNvbGxlY3QgbXVsdGlibG9jayBzZWN0aW9ucwogICAgICAgIGlmIChhdHRyU3RhcnQpIHsKICAgICAgICAgICRjb21waWxlTm9kZSA9IGdyb3VwU2Nhbihjb21waWxlTm9kZSwgYXR0clN0YXJ0LCBhdHRyRW5kKTsKICAgICAgICB9CiAgICAgICAgJHRlbXBsYXRlID0gdW5kZWZpbmVkOwoKICAgICAgICBpZiAodGVybWluYWxQcmlvcml0eSA+IGRpcmVjdGl2ZS5wcmlvcml0eSkgewogICAgICAgICAgYnJlYWs7IC8vIHByZXZlbnQgZnVydGhlciBwcm9jZXNzaW5nIG9mIGRpcmVjdGl2ZXMKICAgICAgICB9CgogICAgICAgIGlmIChkaXJlY3RpdmVWYWx1ZSA9IGRpcmVjdGl2ZS5zY29wZSkgewoKICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrIGZvciBkaXJlY3RpdmVzIHdpdGggYXN5bmMgdGVtcGxhdGVzLCB3ZSdsbCBjaGVjayB0aGUgZGVyaXZlZCBzeW5jCiAgICAgICAgICAvLyBkaXJlY3RpdmUgd2hlbiB0aGUgdGVtcGxhdGUgYXJyaXZlcwogICAgICAgICAgaWYgKCFkaXJlY3RpdmUudGVtcGxhdGVVcmwpIHsKICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGRpcmVjdGl2ZVZhbHVlKSkgewogICAgICAgICAgICAgIC8vIFRoaXMgZGlyZWN0aXZlIGlzIHRyeWluZyB0byBhZGQgYW4gaXNvbGF0ZWQgc2NvcGUuCiAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBzY29wZSBvZiBhbnkga2luZCBhbHJlYWR5CiAgICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ25ldy9pc29sYXRlZCBzY29wZScsIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSB8fCBuZXdTY29wZURpcmVjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7CiAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID0gZGlyZWN0aXZlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIFRoaXMgZGlyZWN0aXZlIGlzIHRyeWluZyB0byBhZGQgYSBjaGlsZCBzY29wZS4KICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGlzb2xhdGVkIHNjb3BlIGFscmVhZHkKICAgICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgnbmV3L2lzb2xhdGVkIHNjb3BlJywgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLCBkaXJlY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBpbGVOb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIG5ld1Njb3BlRGlyZWN0aXZlID0gbmV3U2NvcGVEaXJlY3RpdmUgfHwgZGlyZWN0aXZlOwogICAgICAgIH0KCiAgICAgICAgZGlyZWN0aXZlTmFtZSA9IGRpcmVjdGl2ZS5uYW1lOwoKICAgICAgICBpZiAoIWRpcmVjdGl2ZS50ZW1wbGF0ZVVybCAmJiBkaXJlY3RpdmUuY29udHJvbGxlcikgewogICAgICAgICAgZGlyZWN0aXZlVmFsdWUgPSBkaXJlY3RpdmUuY29udHJvbGxlcjsKICAgICAgICAgIGNvbnRyb2xsZXJEaXJlY3RpdmVzID0gY29udHJvbGxlckRpcmVjdGl2ZXMgfHwge307CiAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgiJyIgKyBkaXJlY3RpdmVOYW1lICsgIicgY29udHJvbGxlciIsCiAgICAgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0sIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTsKICAgICAgICAgIGNvbnRyb2xsZXJEaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gZGlyZWN0aXZlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRpcmVjdGl2ZVZhbHVlID0gZGlyZWN0aXZlLnRyYW5zY2x1ZGUpIHsKICAgICAgICAgIGhhc1RyYW5zY2x1ZGVEaXJlY3RpdmUgPSB0cnVlOwoKICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBuZ0lmIGFuZCBuZ1JlcGVhdCBzbyB0aGF0IHdlIGRvbid0IGNvbXBsYWluIGFib3V0IGR1cGxpY2F0ZSB0cmFuc2NsdXNpb24uCiAgICAgICAgICAvLyBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGRpcmVjdGl2ZXMgdGhhdCBrbm93IGhvdyB0byBzYWZlbHkgaGFuZGxlIGVsZW1lbnQgdHJhbnNjbHVzaW9uLAogICAgICAgICAgLy8gd2hlcmUgdGhlIHRyYW5zY2x1ZGVkIG5vZGVzIGFyZSBhZGRlZCBvciByZXBsYWNlZCBhZnRlciBsaW5raW5nLgogICAgICAgICAgaWYgKCFkaXJlY3RpdmUuJCR0bGIpIHsKICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ3RyYW5zY2x1c2lvbicsIG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUsIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTsKICAgICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZGlyZWN0aXZlVmFsdWUgPT0gJ2VsZW1lbnQnKSB7CiAgICAgICAgICAgIGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgdGVybWluYWxQcmlvcml0eSA9IGRpcmVjdGl2ZS5wcmlvcml0eTsKICAgICAgICAgICAgJHRlbXBsYXRlID0gJGNvbXBpbGVOb2RlOwogICAgICAgICAgICAkY29tcGlsZU5vZGUgPSB0ZW1wbGF0ZUF0dHJzLiQkZWxlbWVudCA9CiAgICAgICAgICAgICAgICBqcUxpdGUoZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnICcgKyBkaXJlY3RpdmVOYW1lICsgJzogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUF0dHJzW2RpcmVjdGl2ZU5hbWVdICsgJyAnKSk7CiAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gJGNvbXBpbGVOb2RlWzBdOwogICAgICAgICAgICByZXBsYWNlV2l0aChqcUNvbGxlY3Rpb24sIHNsaWNlQXJncygkdGVtcGxhdGUpLCBjb21waWxlTm9kZSk7CgogICAgICAgICAgICBjaGlsZFRyYW5zY2x1ZGVGbiA9IGNvbXBpbGUoJHRlbXBsYXRlLCB0cmFuc2NsdWRlRm4sIHRlcm1pbmFsUHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlICYmIHJlcGxhY2VEaXJlY3RpdmUubmFtZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBwYXNzIGluOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIGNvbnRyb2xsZXJEaXJlY3RpdmVzIC0gb3RoZXJ3aXNlIHdlJ2xsIGNyZWF0ZSBkdXBsaWNhdGVzIGNvbnRyb2xsZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlIG9yIHRlbXBsYXRlRGlyZWN0aXZlIC0gY29tYmluaW5nIHRlbXBsYXRlcyB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZWxlbWVudCB0cmFuc2NsdXNpb24gZG9lc24ndCBtYWtlIHNlbnNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIG9ubHkgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSBzbyB0aGF0IHdlIHByZXZlbnQgcHV0dGluZyB0cmFuc2NsdXNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgZWxlbWVudCBtb3JlIHRoYW4gb25jZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZTogbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGVtcGxhdGUgPSBqcUxpdGUoanFMaXRlQ2xvbmUoY29tcGlsZU5vZGUpKS5jb250ZW50cygpOwogICAgICAgICAgICAkY29tcGlsZU5vZGUuZW1wdHkoKTsgLy8gY2xlYXIgY29udGVudHMKICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSBjb21waWxlKCR0ZW1wbGF0ZSwgdHJhbnNjbHVkZUZuKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChkaXJlY3RpdmUudGVtcGxhdGUpIHsKICAgICAgICAgIGhhc1RlbXBsYXRlID0gdHJ1ZTsKICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCd0ZW1wbGF0ZScsIHRlbXBsYXRlRGlyZWN0aXZlLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7CiAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTsKCiAgICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IChpc0Z1bmN0aW9uKGRpcmVjdGl2ZS50ZW1wbGF0ZSkpCiAgICAgICAgICAgICAgPyBkaXJlY3RpdmUudGVtcGxhdGUoJGNvbXBpbGVOb2RlLCB0ZW1wbGF0ZUF0dHJzKQogICAgICAgICAgICAgIDogZGlyZWN0aXZlLnRlbXBsYXRlOwoKICAgICAgICAgIGRpcmVjdGl2ZVZhbHVlID0gZGVub3JtYWxpemVUZW1wbGF0ZShkaXJlY3RpdmVWYWx1ZSk7CgogICAgICAgICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB7CiAgICAgICAgICAgIHJlcGxhY2VEaXJlY3RpdmUgPSBkaXJlY3RpdmU7CiAgICAgICAgICAgIGlmIChqcUxpdGVJc1RleHROb2RlKGRpcmVjdGl2ZVZhbHVlKSkgewogICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IFtdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IHJlbW92ZUNvbW1lbnRzKHdyYXBUZW1wbGF0ZShkaXJlY3RpdmUudGVtcGxhdGVOYW1lc3BhY2UsIHRyaW0oZGlyZWN0aXZlVmFsdWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29tcGlsZU5vZGUgPSAkdGVtcGxhdGVbMF07CgogICAgICAgICAgICBpZiAoJHRlbXBsYXRlLmxlbmd0aCAhPSAxIHx8IGNvbXBpbGVOb2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCkgewogICAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCd0cGxydCcsCiAgICAgICAgICAgICAgICAgICJUZW1wbGF0ZSBmb3IgZGlyZWN0aXZlICd7MH0nIG11c3QgaGF2ZSBleGFjdGx5IG9uZSByb290IGVsZW1lbnQuIHsxfSIsCiAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVwbGFjZVdpdGgoanFDb2xsZWN0aW9uLCAkY29tcGlsZU5vZGUsIGNvbXBpbGVOb2RlKTsKCiAgICAgICAgICAgIHZhciBuZXdUZW1wbGF0ZUF0dHJzID0geyRhdHRyOiB7fX07CgogICAgICAgICAgICAvLyBjb21iaW5lIGRpcmVjdGl2ZXMgZnJvbSB0aGUgb3JpZ2luYWwgbm9kZSBhbmQgZnJvbSB0aGUgdGVtcGxhdGU6CiAgICAgICAgICAgIC8vIC0gdGFrZSB0aGUgYXJyYXkgb2YgZGlyZWN0aXZlcyBmb3IgdGhpcyBlbGVtZW50CiAgICAgICAgICAgIC8vIC0gc3BsaXQgaXQgaW50byB0d28gcGFydHMsIHRob3NlIHRoYXQgYWxyZWFkeSBhcHBsaWVkIChwcm9jZXNzZWQpIGFuZCB0aG9zZSB0aGF0IHdlcmVuJ3QgKHVucHJvY2Vzc2VkKQogICAgICAgICAgICAvLyAtIGNvbGxlY3QgZGlyZWN0aXZlcyBmcm9tIHRoZSB0ZW1wbGF0ZSBhbmQgc29ydCB0aGVtIGJ5IHByaW9yaXR5CiAgICAgICAgICAgIC8vIC0gY29tYmluZSBkaXJlY3RpdmVzIGFzOiBwcm9jZXNzZWQgKyB0ZW1wbGF0ZSArIHVucHJvY2Vzc2VkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhjb21waWxlTm9kZSwgW10sIG5ld1RlbXBsYXRlQXR0cnMpOwogICAgICAgICAgICB2YXIgdW5wcm9jZXNzZWREaXJlY3RpdmVzID0gZGlyZWN0aXZlcy5zcGxpY2UoaSArIDEsIGRpcmVjdGl2ZXMubGVuZ3RoIC0gKGkgKyAxKSk7CgogICAgICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlKSB7CiAgICAgICAgICAgICAgbWFya0RpcmVjdGl2ZXNBc0lzb2xhdGUodGVtcGxhdGVEaXJlY3RpdmVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkaXJlY3RpdmVzID0gZGlyZWN0aXZlcy5jb25jYXQodGVtcGxhdGVEaXJlY3RpdmVzKS5jb25jYXQodW5wcm9jZXNzZWREaXJlY3RpdmVzKTsKICAgICAgICAgICAgbWVyZ2VUZW1wbGF0ZUF0dHJpYnV0ZXModGVtcGxhdGVBdHRycywgbmV3VGVtcGxhdGVBdHRycyk7CgogICAgICAgICAgICBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNvbXBpbGVOb2RlLmh0bWwoZGlyZWN0aXZlVmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGRpcmVjdGl2ZS50ZW1wbGF0ZVVybCkgewogICAgICAgICAgaGFzVGVtcGxhdGUgPSB0cnVlOwogICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ3RlbXBsYXRlJywgdGVtcGxhdGVEaXJlY3RpdmUsIGRpcmVjdIzc71bLegEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8MEAAQAZurcCoBzbAqAdglSIf9Vh6fNNBtfXIgBAL8BOdAAABAQgKAKNevQBNpbiM3O9Wy3oBAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/80yRAAEAGt/DAqAdgwKgHNh/1lSJBtfXIWHp804AYAVOv1QAAAQEICgBNpbkAo169aXZlLCAkY29tcGlsZU5vZGUpOwogICAgICAgICAgdGVtcGxhdGVEaXJlY3RpdmUgPSBkaXJlY3RpdmU7CgogICAgICAgICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB7CiAgICAgICAgICAgIHJlcGxhY2VEaXJlY3RpdmUgPSBkaXJlY3RpdmU7CiAgICAgICAgICB9CgogICAgICAgICAgbm9kZUxpbmtGbiA9IGNvbXBpbGVUZW1wbGF0ZVVybChkaXJlY3RpdmVzLnNwbGljZShpLCBkaXJlY3RpdmVzLmxlbmd0aCAtIGkpLCAkY29tcGlsZU5vZGUsCiAgICAgICAgICAgICAgdGVtcGxhdGVBdHRycywganFDb2xsZWN0aW9uLCBoYXNUcmFuc2NsdWRlRGlyZWN0aXZlICYmIGNoaWxkVHJhbnNjbHVkZUZuLCBwcmVMaW5rRm5zLCBwb3N0TGlua0ZucywgewogICAgICAgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXM6IGNvbnRyb2xsZXJEaXJlY3RpdmVzLAogICAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlOiBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZTogdGVtcGxhdGVEaXJlY3RpdmUsCiAgICAgICAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlOiBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOwogICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aXZlLmNvbXBpbGUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxpbmtGbiA9IGRpcmVjdGl2ZS5jb21waWxlKCRjb21waWxlTm9kZSwgdGVtcGxhdGVBdHRycywgY2hpbGRUcmFuc2NsdWRlRm4pOwogICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihsaW5rRm4pKSB7CiAgICAgICAgICAgICAgYWRkTGlua0ZucyhudWxsLCBsaW5rRm4sIGF0dHJTdGFydCwgYXR0ckVuZCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlua0ZuKSB7CiAgICAgICAgICAgICAgYWRkTGlua0ZucyhsaW5rRm4ucHJlLCBsaW5rRm4ucG9zdCwgYXR0clN0YXJ0LCBhdHRyRW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlLCBzdGFydGluZ1RhZygkY29tcGlsZU5vZGUpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChkaXJlY3RpdmUudGVybWluYWwpIHsKICAgICAgICAgIG5vZGVMaW5rRm4udGVybWluYWwgPSB0cnVlOwogICAgICAgICAgdGVybWluYWxQcmlvcml0eSA9IE1hdGgubWF4KHRlcm1pbmFsUHJpb3JpdHksIGRpcmVjdGl2ZS5wcmlvcml0eSk7CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgbm9kZUxpbmtGbi5zY29wZSA9IG5ld1Njb3BlRGlyZWN0aXZlICYmIG5ld1Njb3BlRGlyZWN0aXZlLnNjb3BlID09PSB0cnVlOwogICAgICBub2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50ID0gaGFzVHJhbnNjbHVkZURpcmVjdGl2ZTsKICAgICAgbm9kZUxpbmtGbi5lbGVtZW50VHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQgPSBoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZTsKICAgICAgbm9kZUxpbmtGbi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQgPSBoYXNUZW1wbGF0ZTsKICAgICAgbm9kZUxpbmtGbi50cmFuc2NsdWRlID0gY2hpbGRUcmFuc2NsdWRlRm47CgogICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0Lmhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmU7CgogICAgICAvLyBtaWdodCBiZSBub3JtYWwgb3IgZGVsYXllZCBub2RlTGlua0ZuIGRlcGVuZGluZyBvbiBpZiB0ZW1wbGF0ZVVybCBpcyBwcmVzZW50CiAgICAgIHJldHVybiBub2RlTGlua0ZuOwoKICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGZ1bmN0aW9uIGFkZExpbmtGbnMocHJlLCBwb3N0LCBhdHRyU3RhcnQsIGF0dHJFbmQpIHsKICAgICAgICBpZiAocHJlKSB7CiAgICAgICAgICBpZiAoYXR0clN0YXJ0KSBwcmUgPSBncm91cEVsZW1lbnRzTGlua0ZuV3JhcHBlcihwcmUsIGF0dHJTdGFydCwgYXR0ckVuZCk7CiAgICAgICAgICBwcmUucmVxdWlyZSA9IGRpcmVjdGl2ZS5yZXF1aXJlOwogICAgICAgICAgcHJlLmRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOYW1lOwogICAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSA9PT0gZGlyZWN0aXZlIHx8IGRpcmVjdGl2ZS4kJGlzb2xhdGVTY29wZSkgewogICAgICAgICAgICBwcmUgPSBjbG9uZUFuZEFubm90YXRlRm4ocHJlLCB7aXNvbGF0ZVNjb3BlOiB0cnVlfSk7CiAgICAgICAgICB9CiAgICAgICAgICBwcmVMaW5rRm5zLnB1c2gocHJlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBvc3QpIHsKICAgICAgICAgIGlmIChhdHRyU3RhcnQpIHBvc3QgPSBncm91cEVsZW1lbnRzTGlua0ZuV3JhcHBlcihwb3N0LCBhdHRyU3RhcnQsIGF0dHJFbmQpOwogICAgICAgICAgcG9zdC5yZXF1aXJlID0gZGlyZWN0aXZlLnJlcXVpcmU7CiAgICAgICAgICBwb3N0LmRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOYW1lOwogICAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSA9PT0gZGlyZWN0aXZlIHx8IGRpcmVjdGl2ZS4kJGlzb2xhdGVTY29wZSkgewogICAgICAgICAgICBwb3N0ID0gY2xvbmVBbmRBbm5vdGF0ZUZuKHBvc3QsIHtpc29sYXRlU2NvcGU6IHRydWV9KTsKICAgICAgICAgIH0KICAgICAgICAgIHBvc3RMaW5rRm5zLnB1c2gocG9zdCk7CiAgICAgICAgfQogICAgICB9CgoKICAgICAgZnVuY3Rpb24gZ2V0Q29udHJvbGxlcnMoZGlyZWN0aXZlTmFtZSwgcmVxdWlyZSwgJGVsZW1lbnQsIGVsZW1lbnRDb250cm9sbGVycykgewogICAgICAgIHZhciB2YWx1ZSwgcmV0cmlldmFsTWV0aG9kID0gJ2RhdGEnLCBvcHRpb25hbCA9IGZhbHNlOwogICAgICAgIHZhciAkc2VhcmNoRWxlbWVudCA9ICRlbGVtZW50OwogICAgICAgIHZhciBtYXRjaDsKICAgICAgICBpZiAoaXNTdHJpbmcocmVxdWlyZSkpIHsKICAgICAgICAgIG1hdGNoID0gcmVxdWlyZS5tYXRjaChSRVFVSVJFX1BSRUZJWF9SRUdFWFApOwogICAgICAgICAgcmVxdWlyZSA9IHJlcXVpcmUuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7CgogICAgICAgICAgaWYgKG1hdGNoWzNdKSB7CiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgbWF0Y2hbM10gPSBudWxsOwogICAgICAgICAgICBlbHNlIG1hdGNoWzFdID0gbWF0Y2hbM107CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF0Y2hbMV0gPT09ICdeJykgewogICAgICAgICAgICByZXRyaWV2YWxNZXRob2QgPSAnaW5oZXJpdGVkRGF0YSc7CiAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzFdID09PSAnXl4nKSB7CiAgICAgICAgICAgIHJldHJpZXZhbE1ldGhvZCA9ICdpbmhlcml0ZWREYXRhJzsKICAgICAgICAgICAgJHNlYXJjaEVsZW1lbnQgPSAkZWxlbWVudC5wYXJlbnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtYXRjaFsyXSA9PT0gJz8nKSB7CiAgICAgICAgICAgIG9wdGlvbmFsID0gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICB2YWx1ZSA9IG51bGw7CgogICAgICAgICAgaWYgKGVsZW1lbnRDb250cm9sbGVycyAmJiByZXRyaWV2YWxNZXRob2QgPT09ICdkYXRhJykgewogICAgICAgICAgICBpZiAodmFsdWUgPSBlbGVtZW50Q29udHJvbGxlcnNbcmVxdWlyZV0pIHsKICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmluc3RhbmNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8ICRzZWFyY2hFbGVtZW50W3JldHJpZXZhbE1ldGhvZF0oJyQnICsgcmVxdWlyZSArICdDb250cm9sbGVyJyk7CgogICAgICAgICAgaWYgKCF2YWx1ZSAmJiAhb3B0aW9uYWwpIHsKICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ2N0cmVxJywKICAgICAgICAgICAgICAgICJDb250cm9sbGVyICd7MH0nLCByZXF1aXJlZCBieSBkaXJlY3RpdmUgJ3sxfScsIGNhbid0IGJlIGZvdW5kISIsCiAgICAgICAgICAgICAgICByZXF1aXJlLCBkaXJlY3RpdmVOYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB2YWx1ZSB8fCBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShyZXF1aXJlKSkgewogICAgICAgICAgdmFsdWUgPSBbXTsKICAgICAgICAgIGZvckVhY2gocmVxdWlyZSwgZnVuY3Rpb24ocmVxdWlyZSkgewogICAgICAgICAgICB2YWx1ZS5wdXNoKGdldENvbnRyb2xsZXJzKGRpcmVjdGl2ZU5hbWUsIHJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCgogICAgICBmdW5jdGlvbiBub2RlTGlua0ZuKGNoaWxkTGlua0ZuLCBzY29wZSwgbGlua05vZGUsICRyb290RWxlbWVudCwgYm91bmRUcmFuc2NsdWRlRm4pIHsKICAgICAgICB2YXIgaSwgaWksIGxpbmtGbiwgY29udHJvbGxlciwgaXNvbGF0ZVNjb3BlLCBlbGVtZW50Q29udHJvbGxlcnMsIHRyYW5zY2x1ZGVGbiwgJGVsZW1lbnQsCiAgICAgICAgICAgIGF0dHJzOwoKICAgICAgICBpZiAoY29tcGlsZU5vZGUgPT09IGxpbmtOb2RlKSB7CiAgICAgICAgICBhdHRycyA9IHRlbXBsYXRlQXR0cnM7CiAgICAgICAgICAkZWxlbWVudCA9IHRlbXBsYXRlQXR0cnMuJCRlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkZWxlbWVudCA9IGpxTGl0ZShsaW5rTm9kZSk7CiAgICAgICAgICBhdHRycyA9IG5ldyBBdHRyaWJ1dGVzKCRlbGVtZW50LCB0ZW1wbGF0ZUF0dHJzKTsKICAgICAgICB9CgogICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpIHsKICAgICAgICAgIGlzb2xhdGVTY29wZSA9IHNjb3BlLiRuZXcodHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYm91bmRUcmFuc2NsdWRlRm4pIHsKICAgICAgICAgIC8vIHRyYWNrIGBib3VuZFRyYW5zY2x1ZGVGbmAgc28gaXQgY2FuIGJlIHVud3JhcHBlZCBpZiBgdHJhbnNjbHVkZUZuYAogICAgICAgICAgLy8gaXMgbGF0ZXIgcGFzc2VkIGFzIGBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbmAgdG8gYHB1YmxpY0xpbmtGbmAKICAgICAgICAgIHRyYW5zY2x1ZGVGbiA9IGNvbnRyb2xsZXJzQm91bmRUcmFuc2NsdWRlOwogICAgICAgICAgdHJhbnNjbHVkZUZuLiQkYm91bmRUcmFuc2NsdWRlID0gYm91bmRUcmFuc2NsdWRlRm47CiAgICAgICAgfQoKICAgICAgICBpZiAoY29udHJvbGxlckRpcmVjdGl2ZXMpIHsKICAgICAgICAgIC8vIFRPRE86IG1lcmdlIGBjb250cm9sbGVyc2AgYW5kIGBlbGVtZW50Q29udHJvbGxlcnNgIGludG8gc2luZ2xlIG9iamVjdC4KICAgICAgICAgIGNvbnRyb2xsZXJzID0ge307CiAgICAgICAgICBlbGVtZW50Q29udHJvbGxlcnMgPSB7fTsKICAgICAgICAgIGZvckVhY2goY29udHJvbGxlckRpcmVjdGl2ZXMsIGZ1bmN0aW9uKGRpcmVjdGl2ZSkgewogICAgICAgICAgICB2YXIgbG9jYWxzID0gewogICAgICAgICAgICAgICRzY29wZTogZGlyZWN0aXZlID09PSBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgfHwgZGlyZWN0aXZlLiQkaXNvbGF0ZVNjb3BlID8gaXNvbGF0ZVNjb3BlIDogc2NvcGUsCiAgICAgICAgICAgICAgJGVsZW1lbnQ6ICRlbGVtZW50LAogICAgICAgICAgICAgICRhdHRyczogYXR0cnMsCiAgICAgICAgICAgICAgJHRyYW5zY2x1ZGU6IHRyYW5zY2x1ZGVGbgogICAgICAgICAgICB9LCBjb250cm9sbGVySW5zdGFuY2U7CgogICAgICAgICAgICBjb250cm9sbGVyID0gZGlyZWN0aXZlLmNvbnRyb2xsZXI7CiAgICAgICAgICAgIGlmIChjb250cm9sbGVyID09ICdAJykgewogICAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBhdHRyc1tkaXJlY3RpdmUubmFtZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRyb2xsZXJJbnN0YW5jZSA9ICRjb250cm9sbGVyKGNvbnRyb2xsZXIsIGxvY2FscywgdHJ1ZSwgZGlyZWN0aXZlLmNvbnRyb2xsZXJBcyk7CgogICAgICAgICAgICAvLyBGb3IgZGlyZWN0aXZlcyB3aXRoIGVsZW1lbnQgdHJhbnNjbHVzaW9uIHRoZSBlbGVtZW50IGlzIGEgY29tbWVudCwKICAgICAgICAgICAgLy8gYnV0IGpRdWVyeSAuZGF0YSBkb2Vzbid0IHN1cHBvcnQgYXR0YWNoaW5nIGRhdGEgdG8gY29tbWVudCBub2RlcyBhcyBpdCdzIGhhcmQgdG8KICAgICAgICAgICAgLy8gY2xlYW4gdXAgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzgzMzUpLgogICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBzYXZlIHRoZSBjb250cm9sbGVycyBmb3IgdGhlIGVsZW1lbnQgaW4gYSBsb2NhbCBoYXNoIGFuZCBhdHRhY2ggdG8gLmRhdGEKICAgICAgICAgICAgLy8gbGF0ZXIsIG9uY2Ugd2UgaGF2ZSB0aGUgYWN0dWFsIGVsZW1lbnQuCiAgICAgICAgICAgIGVsZW1lbnRDb250cm9sbGVyc1tkaXJlY3RpdmUubmFtZV0gPSBjb250cm9sbGVySW5zdGFuY2U7CiAgICAgICAgICAgIGlmICghaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUpIHsKICAgICAgICAgICAgICAkZWxlbWVudC5kYXRhKCckJyArIGRpcmVjdGl2ZS5uYW1lICsgJ0NvbnRyb2xsZXInLCBjb250cm9sbGVySW5zdGFuY2UuaW5zdGFuY2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250cm9sbGVyc1tkaXJlY3RpdmUubmFtZV0gPSBjb250cm9sbGVySW5zdGFuY2U7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpIHsKICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8oJGVsZW1lbnQsIGlzb2xhdGVTY29wZSwgdHJ1ZSwgISh0ZW1wbGF0ZURpcmVjdGl2ZSAmJiAodGVtcGxhdGVEaXJlY3RpdmUgPT09IG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSB8fAogICAgICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID09PSBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUuJCRvcmlnaW5hbERpcmVjdGl2ZSkpKTsKICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUNsYXNzKCRlbGVtZW50LCB0cnVlKTsKCiAgICAgICAgICB2YXIgaXNvbGF0ZVNjb3BlQ29udHJvbGxlciA9IGNvbnRyb2xsZXJzICYmIGNvbnRyb2xsZXJzW25ld0lzb2xhdGVTY29wZURpcmVjdGl2ZS5uYW1lXTsKICAgICAgICAgIHZhciBpc29sYXRlQmluZGluZ0NvbnRleHQgPSBpc29sYXRlU2NvcGU7CiAgICAgICAgICBpZiAoaXNvbGF0ZVNjb3BlQ29udHJvbGxlciAmJiBpc29sYXRlU2NvcGVDb250cm9sbGVyLmlkZW50aWZpZXIgJiYKICAgICAgICAgICAgICBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUuYmluZFRvQ29udHJvbGxlciA9PT0gdHJ1ZSkgewogICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHQgPSBpc29sYXRlU2NvcGVDb250cm9sbGVyLmluc3RhbmNlOwogICAgICAgICAgfQoKICAgICAgICAgIGZvckVhY2goaXNvbGF0ZVNjb3BlLiQkaXNvbGF0ZUJpbmRpbmdzID0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLiQkaXNvbGF0ZUJpbmRpbmdzLCBmdW5jdGlvbihkZWZpbml0aW9uLCBzY29wZU5hbWUpIHsKICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gZGVmaW5pdGlvbi5hdHRyTmFtZSwKICAgICAgICAgICAgICAgIG9wdGlvbmFsID0gZGVmaW5pdGlvbi5vcHRpb25hbCwKICAgICAgICAgICAgICAgIG1vZGUgPSBkZWZpbml0aW9uLm1vZGUsIC8vIEAsID0sIG9yICYKICAgICAgICAgICAgICAgIGxhc3RWYWx1ZSwKICAgICAgICAgICAgICAgIHBhcmVudEdldCwgcGFyZW50U2V0LCBjb21wYXJlOwoKICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CgogICAgICAgICAgICAgIGNhc2UgJ0AnOgogICAgICAgICAgICAgICAgYXR0cnMuJG9ic2VydmUoYXR0ck5hbWUsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgIGlzb2xhdGVCaW5kaW5nQ29udGV4dFtzY29wZU5hbWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGF0dHJzLiQkb2JzZXJ2ZXJzW2F0dHJOYW1lXS4kJHNjb3BlID0gc2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoYXR0cnNbYXR0ck5hbWVdKSB7CiAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUgaGFzIGJlZW4gcHJvdmlkZWQgdGhlbiB3ZSB0cmlnZ2VyIGFuIGludGVycG9sYXRpb24gdG8gZW5zdXJlCiAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpcw0KjNzvVut6AQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwxQABABm6swKgHNsCoB2CVIh/1WHp800G2FZCAEAvw89MAAAEBCAoAo169AE2luYzc71b7ewEA0AwAANAMAABo9ygf0sUIACetHhMIAEUADMKO4kAAQAYPbcCoB2DAqAc2H/WVJcSMkloUCUwUgBgA7ZybAAABAQgKAE2luQCjXrsNCkM4NQ0KZnVuY3Rpb24gY2xlYW51cExhc3RWaWV3KCkgewogICAgICAgICAgaWYgKHByZXZpb3VzTGVhdmVBbmltYXRpb24pIHsKICAgICAgICAgICAgJGFuaW1hdGUuY2FuY2VsKHByZXZpb3VzTGVhdmVBbmltYXRpb24pOwogICAgICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9uID0gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoY3VycmVudFNjb3BlKSB7CiAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZGVzdHJveSgpOwogICAgICAgICAgICBjdXJyZW50U2NvcGUgPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb24gPSAkYW5pbWF0ZS5sZWF2ZShjdXJyZW50RWxlbWVudCk7CiAgICAgICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb24udGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9uID0gbnVsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKICAgICAgICAgIHZhciBsb2NhbHMgPSAkcm91dGUuY3VycmVudCAmJiAkcm91dGUuY3VycmVudC5sb2NhbHMsCiAgICAgICAgICAgICAgdGVtcGxhdGUgPSBsb2NhbHMgJiYgbG9jYWxzLiR0ZW1wbGF0ZTsKCiAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGUpKSB7CiAgICAgICAgICAgIHZhciBuZXdTY29wZSA9IHNjb3BlLiRuZXcoKTsKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSAkcm91dGUuY3VycmVudDsKCiAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGxpbmsgYWxsIGNoaWxkcmVuIG9mIG5nLXZpZXcgdGhhdCB3ZXJlIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWwKICAgICAgICAgICAgLy8gaHRtbC4gSWYgdGhhdCBjb250ZW50IGNvbnRhaW5zIGNvbnRyb2xsZXJzLCAuLi4gdGhleSBjb3VsZCBwb2xsdXRlL2NoYW5nZSB0aGUgc2NvcGUuCiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHVzaW5nIG5nLXZpZXcgb24gYW4gZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgY29udGVudCBkb2VzIG5vdCBtYWtlIHNlbnNlLi4uCiAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbid0IHJlbW92ZSB0aGVtIGluIHRoZSBjbG9uZUF0dGNoRm4gb2YgJHRyYW5zY2x1ZGUgYXMgdGhhdAogICAgICAgICAgICAvLyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGxpbmtpbmcgdGhlIGNvbnRlbnQsIHdoaWNoIHdvdWxkIGFwcGx5IGNoaWxkCiAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMgdG8gbm9uIGV4aXN0aW5nIGVsZW1lbnRzLgogICAgICAgICAgICB2YXIgY2xvbmUgPSAkdHJhbnNjbHVkZShuZXdTY29wZSwgZnVuY3Rpb24oY2xvbmUpIHsKICAgICAgICAgICAgICAkYW5pbWF0ZS5lbnRlcihjbG9uZSwgbnVsbCwgY3VycmVudEVsZW1lbnQgfHwgJGVsZW1lbnQpLnRoZW4oZnVuY3Rpb24gb25OZ1ZpZXdFbnRlcigpIHsKICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdXRvU2Nyb2xsRXhwKQogICAgICAgICAgICAgICAgICAmJiAoIWF1dG9TY3JvbGxFeHAgfHwgc2NvcGUuJGV2YWwoYXV0b1Njcm9sbEV4cCkpKSB7CiAgICAgICAgICAgICAgICAgICRhbmNob3JTY3JvbGwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBjbGVhbnVwTGFzdFZpZXcoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGNsb25lOwogICAgICAgICAgICBjdXJyZW50U2NvcGUgPSBjdXJyZW50LnNjb3BlID0gbmV3U2NvcGU7CiAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZW1pdCgnJHZpZXdDb250ZW50TG9hZGVkJyk7CiAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZXZhbChvbmxvYWRFeHApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2xlYW51cExhc3RWaWV3KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogIH07Cn0KCi8vIFRoaXMgZGlyZWN0aXZlIGlzIGNhbGxlZCBkdXJpbmcgdGhlICR0cmFuc2NsdWRlIGNhbGwgb2YgdGhlIGZpcnN0IGBuZ1ZpZXdgIGRpcmVjdGl2ZS4KLy8gSXQgd2lsbCByZXBsYWNlIGFuZCBjb21waWxlIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IHdpdGggdGhlIGxvYWRlZCB0ZW1wbGF0ZS4KLy8gV2UgbmVlZCB0aGlzIGRpcmVjdGl2ZSBzbyB0aGF0IHRoZSBlbGVtZW50IGNvbnRlbnQgaXMgYWxyZWFkeSBmaWxsZWQgd2hlbgovLyB0aGUgbGluayBmdW5jdGlvbiBvZiBhbm90aGVyIGRpcmVjdGl2ZSBvbiB0aGUgc2FtZSBlbGVtZW50IGFzIG5nVmlldwovLyBpcyBjYWxsZWQuCm5nVmlld0ZpbGxDb250ZW50RmFjdG9yeS4kaW5qZWN0ID0gWyckY29tcGlsZScsICckY29udHJvbGxlcicsICckcm91dGUnXTsKZnVuY3Rpb24gbmdWaWV3RmlsbENvbnRlbnRGYWN0b3J5KCRjb21waWxlLCAkY29udHJvbGxlciwgJHJvdXRlKSB7CiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnRUNBJywKICAgIHByaW9yaXR5OiAtNDAwLAogICAgbGluazogZnVuY3Rpb24oc2NvcGUsICRlbGVtZW50KSB7CiAgICAgIHZhciBjdXJyZW50ID0gJHJvdXRlLmN1cnJlbnQsCiAgICAgICAgICBsb2NhbHMgPSBjdXJyZW50LmxvY2FsczsKCiAgICAgICRlbGVtZW50Lmh0bWwobG9jYWxzLiR0ZW1wbGF0ZSk7CgogICAgICB2YXIgbGluayA9ICRjb21waWxlKCRlbGVtZW50LmNvbnRlbnRzKCkpOwoKICAgICAgaWYgKGN1cnJlbnQuY29udHJvbGxlcikgewogICAgICAgIGxvY2Fscy4kc2NvcGUgPSBzY29wZTsKICAgICAgICB2YXIgY29udHJvbGxlciA9ICRjb250cm9sbGVyKGN1cnJlbnQuY29udHJvbGxlciwgbG9jYWxzKTsKICAgICAgICBpZiAoY3VycmVudC5jb250cm9sbGVyQXMpIHsKICAgICAgICAgIHNjb3BlW2N1cnJlbnQuY29udHJvbGxlckFzXSA9IGNvbnRyb2xsZXI7CiAgICAgICAgfQogICAgICAgICRlbGVtZW50LmRhdGEoJyRuZ0NvbnRyb2xsZXJDb250cm9sbGVyJywgY29udHJvbGxlcik7CiAgICAgICAgJGVsZW1lbnQuY2hpbGRyZW4oKS5kYXRhKCckbmdDb250cm9sbGVyQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpOwogICAgICB9CgogICAgICBsaW5rKHNjb3BlKTsKICAgIH0KICB9Owp9CgoKfSkod2luZG93LCB3aW5kb3cuYW5ndWxhcik7Cg0KjNzvVjF8AQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANBGNQABABplQwKgHNsCoB2CVJR/1FAlMFMSMnuiAEAMZZakAAAEBCAoAo169AE2luYzc71a4fAEARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADmO5UAAQAYb88CoB2DAqAc2H/WVJcSMnugUCUwUgBgA7ZASAAABAQgKAE2luQCjXr0wDQoNCozc71bUfAEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQRjkAAQAaZT8CoBzbAqAdglSUf9RQJTBTEjJ7tgBADGWWkAAABAQgKAKNevQBNpbmM3O9WKH4BAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx8NrNAAEAGV+LAqAdgwKgHNh/1lSc5UKm/25J4N4AQAO2sVQAAAQEICgBNpbkAo162SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KODAwMA0KIWZ1bmN0aW9uKCkgewogIHZhciBkMyA9IHsKICAgIHZlcnNpb246ICIzLjQuMTIiCiAgfTsKICBpZiAoIURhdGUubm93KSBEYXRlLm5vdyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICtuZXcgRGF0ZSgpOwogIH07CiAgdmFyIGQzX2FycmF5U2xpY2UgPSBbXS5zbGljZSwgZDNfYXJyYXkgPSBmdW5jdGlvbihsaXN0KSB7CiAgICByZXR1cm4gZDNfYXJyYXlTbGljZS5jYWxsKGxpc3QpOwogIH07CiAgdmFyIGQzX2RvY3VtZW50ID0gZG9jdW1lbnQsIGQzX2RvY3VtZW50RWxlbWVudCA9IGQzX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZDNfd2luZG93ID0gd2luZG93OwogIHRyeSB7CiAgICBkM19hcnJheShkM19kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcylbMF0ubm9kZVR5cGU7CiAgfSBjYXRjaCAoZSkgewogICAgZDNfYXJyYXkgPSBmdW5jdGlvbihsaXN0KSB7CiAgICAgIHZhciBpID0gbGlzdC5sZW5ndGgsIGFycmF5ID0gbmV3IEFycmF5KGkpOwogICAgICB3aGlsZSAoaS0tKSBhcnJheVtpXSA9IGxpc3RbaV07CiAgICAgIHJldHVybiBhcnJheTsKICAgIH07CiAgfQogIHRyeSB7CiAgICBkM19kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsIDAsICIiKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgdmFyIGQzX2VsZW1lbnRfcHJvdG90eXBlID0gZDNfd2luZG93LkVsZW1lbnQucHJvdG90eXBlLCBkM19lbGVtZW50X3NldEF0dHJpYnV0ZSA9IGQzX2VsZW1lbnRfcHJvdG90eXBlLnNldEF0dHJpYnV0ZSwgZDNfZWxlbWVudF9zZXRBdHRyaWJ1dGVOUyA9IGQzX2VsZW1lbnRfcHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TLCBkM19zdHlsZV9wcm90b3R5cGUgPSBkM193aW5kb3cuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsIGQzX3N0eWxlX3NldFByb3BlcnR5ID0gZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5OwogICAgZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgZDNfZWxlbWVudF9zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBuYW1lLCB2YWx1ZSArICIiKTsKICAgIH07CiAgICBkM19lbGVtZW50X3Byb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uKHNwYWNlLCBsb2NhbCwgdmFsdWUpIHsKICAgICAgZDNfZWxlbWVudF9zZXRBdHRyaWJ1dGVOUy5jYWxsKHRoaXMsIHNwYWNlLCBsb2NhbCwgdmFsdWUgKyAiIik7CiAgICB9OwogICAgZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIGQzX3N0eWxlX3NldFByb3BlcnR5LmNhbGwodGhpcywgbmFtZSwgdmFsdWUgKyAiIiwgcHJpb3JpdHkpOwogICAgfTsKICB9CiAgZDMuYXNjZW5kaW5nID0gZDNfYXNjZW5kaW5nOwogIGZ1bmN0aW9uIGQzX2FzY2VuZGluZyhhLCBiKSB7CiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQogIGQzLmRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7CiAgICByZXR1cm4gYiA8IGEgPyAtMSA6IGIgPiBhID8gMSA6IGIgPj0gYSA/IDAgOiBOYU47CiAgfTsKICBkMy5taW4gPSBmdW5jdGlvbihhcnJheSwgZikgewogICAgdmFyIGkgPSAtMSwgbiA9IGFycmF5Lmxlbmd0aCwgYSwgYjsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICAgIHdoaWxlICgrK2kgPCBuICYmICEoKGEgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBhIDw9IGEpKSBhID0gdW5kZWZpbmVkOwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYSA+IGIpIGEgPSBiOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCsraSA8IG4gJiYgISgoYSA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGEgPD0gYSkpIGEgPSB1bmRlZmluZWQ7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7CiAgICB9CiAgICByZXR1cm4gYTsKICB9OwogIGQzLm1heCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBiOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgd2hpbGUgKCsraSA8IG4gJiYgISgoYSA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPD0gYSkpIGEgPSB1bmRlZmluZWQ7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAoKytpIDwgbiAmJiAhKChhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYSA8PSBhKSkgYSA9IHVuZGVmaW5lZDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjsKICAgIH0KICAgIHJldHVybiBhOwogIH07CiAgZDMuZXh0ZW50ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICAgIHZhciBpID0gLTEsIG4gPSBhcnJheS5sZW5ndGgsIGEsIGIsIGM7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICB3aGlsZSAoKytpIDwgbiAmJiAhKChhID0gYyA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPD0gYSkpIGEgPSBjID0gdW5kZWZpbmVkOwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwpIHsKICAgICAgICBpZiAoYSA+IGIpIGEgPSBiOwogICAgICAgIGlmIChjIDwgYikgYyA9IGI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICgrK2kgPCBuICYmICEoKGEgPSBjID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYSA8PSBhKSkgYSA9IHVuZGVmaW5lZDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGEgPiBiKSBhID0gYjsKICAgICAgICBpZiAoYyA8IGIpIGMgPSBiOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gWyBhLCBjIF07CiAgfTsKICBkMy5zdW0gPSBmdW5jdGlvbihhcnJheSwgZikgewogICAgdmFyIHMgPSAwLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBpID0gLTE7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gK2FycmF5W2ldKSkgcyArPSBhOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9ICtmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkpIHMgKz0gYTsKICAgIH0KICAgIHJldHVybiBzOwogIH07CiAgZnVuY3Rpb24gZDNfbnVtYmVyKHgpIHsKICAgIHJldHVybiB4ICE9IG51bGwgJiYgIWlzTmFOKHgpOwogIH0KICBkMy5tZWFuID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICAgIHZhciBzID0gMCwgbiA9IGFycmF5Lmxlbmd0aCwgYSwgaSA9IC0xLCBqID0gbjsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtYmVyKGEgPSBhcnJheVtpXSkpIHMgKz0gYTsgZWxzZSAtLWo7CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWJlcihhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSBzICs9IGE7IGVsc2UgLS1qOwogICAgfQogICAgcmV0dXJuIGogPyBzIC8gaiA6IHVuZGVmaW5lZDsKICB9OwogIGQzLnF1YW50aWxlID0gZnVuY3Rpb24odmFsdWVzLCBwKSB7CiAgICB2YXIgSCA9ICh2YWx1ZXMubGVuZ3RoIC0gMSkgKiBwICsgMSwgaCA9IE1hdGguZmxvb3IoSCksIHYgPSArdmFsdWVzW2ggLSAxXSwgZSA9IEggLSBoOwogICAgcmV0dXJuIGUgPyB2ICsgZSAqICh2YWx1ZXNbaF0gLSB2KSA6IHY7CiAgfTsKICBkMy5tZWRpYW4gPSBmdW5jdGlvbihhcnJheSwgZikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSBhcnJheSA9IGFycmF5Lm1hcChmKTsKICAgIGFycmF5ID0gYXJyYXkuZmlsdGVyKGQzX251bWJlcik7CiAgICByZXR1cm4gYXJyYXkubGVuZ3RoID8gZDMucXVhbnRpbGUoYXJyYXkuc29ydChkM19hc2NlbmRpbmcpLCAuNSkgOiB1bmRlZmluZWQ7CiAgfTsKICBmdW5jdGlvbiBkM19iaXNlY3Rvcihjb21wYXJlKSB7CiAgICByZXR1cm4gewogICAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDQpIGhpID0gYS5sZW5ndGg7CiAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsgZWxzZSBoaSA9IG1pZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxvOwogICAgICB9LAogICAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBsbyA9IDA7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoOwogICAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAwKSBoaSA9IG1pZDsgZWxzZSBsbyA9IG1pZCArIDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsbzsKICAgICAgfQogICAgfTsKICB9CiAgdmFyIGQzX2Jpc2VjdCA9IGQzX2Jpc2VjdG9yKGQzX2FzY2VuZGluZyk7CiAgZDMuYmlzZWN0TGVmdCA9IGQzX2Jpc2VjdC5sZWZ0OwogIGQzLmJpc2VjdCA9IGQzLmJpc2VjdFJpZ2h0ID0gZDNfYmlzZWN0LnJpZ2h0OwogIGQzLmJpc2VjdG9yID0gZnVuY3Rpb24oZikgewogICAgcmV0dXJuIGQzX2Jpc2VjdG9yKGYubGVuZ3RoID09PSAxID8gZnVuY3Rpb24oZCwgeCkgewogICAgICByZXR1cm4gZDNfYXNjZW5kaW5nKGYoZCksIHgpOwogICAgfSA6IGYpOwogIH07CiAgZDMuc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICB2YXIgbSA9IGFycmF5Lmxlbmd0aCwgdCwgaTsKICAgIHdoaWxlIChtKSB7CiAgICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDsKICAgICAgdCA9IGFycmF5W21dLCBhcnJheVttXSA9IGFycmF5W2ldLCBhcnJheVtpXSA9IHQ7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfTsKICBkMy5wZXJtdXRlID0gZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHsKICAgIHZhciBpID0gaW5kZXhlcy5sZW5ndGgsIHBlcm11dGVzID0gbmV3IEFycmF5KGkpOwogICAgd2hpbGUgKGktLSkgcGVybXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTsKICAgIHJldHVybiBwZXJtdXRlczsKICB9OwogIGQzLnBhaXJzID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAwLCBwMSA9IGFycmF5WzBdLCBwYWlycyA9IG5ldyBBcnJheShuIDwgMCA/IDAgOiBuKTsKICAgIHdoaWxlIChpIDwgbikgcGFpcnNbaV0gPSBbIHAwID0gcDEsIHAxID0gYXJyYXlbKytpXSBdOwogICAgcmV0dXJuIHBhaXJzOwogIH07CiAgZDMuemlwID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIShuID0gYXJndW1lbnRzLmxlbmd0aCkpIHJldHVybiBbXTsKICAgIGZvciAodmFyIGkgPSAtMSwgbSA9IGQzLm1pbihhcmd1bWVudHMsIGQzX3ppcExlbmd0aCksIHppcHMgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07ICkgewogICAgICBmb3IgKHZhciBqID0gLTEsIG4sIHppcCA9IHppcHNbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8IG47ICkgewogICAgICAgIHppcFtqXSA9IGFyZ3VtZW50c1tqXVtpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHppcHM7CiAgfTsKICBmdW5jdGlvbiBkM196aXBMZW5ndGgoZCkgewogICAgcmV0dXJuIGQubGVuZ3RoOwogIH0KICBkMy50cmFuc3Bvc2UgPSBmdW5jdGlvbihtYXRyaXgpIHsKICAgIHJldHVybiBkMy56aXAuYXBwbHkoZDMsIG1hdHJpeCk7CiAgfTsKICBkMy5rZXlzID0gZnVuY3Rpb24obWFwKSB7CiAgICB2YXIga2V5cyA9IFtdOwogICAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7CiAgICByZXR1cm4ga2V5czsKICB9OwogIGQzLnZhbHVlcyA9IGZ1bmN0aW9uKG1hcCkgewogICAgdmFyIHZhbHVlcyA9IFtdOwogICAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pOwogICAgcmV0dXJuIHZhbHVlczsKICB9OwogIGQzLmVudHJpZXMgPSBmdW5jdGlvbihtYXApIHsKICAgIHZhciBlbnRyaWVzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goewogICAgICBrZXk6IGtleSwKICAgICAgdmFsdWU6IG1hcFtrZXldCiAgICB9KTsKICAgIHJldHVybiBlbnRyaWVzOwogIH07CiAgZDMubWVyZ2UgPSBmdW5jdGlvbihhcnJheXMpIHsKICAgIHZhciBuID0gYXJyYXlzLmxlbmd0aCwgbSwgaSA9IC0xLCBqID0gMCwgbWVyZ2VkLCBhcnJheTsKICAgIHdoaWxlICgrK2kgPCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7CiAgICBtZXJnZWQgPSBuZXcgQXJyYXkoaik7CiAgICB3aGlsZSAoLS1uID49IDApIHsKICAgICAgYXJyYXkgPSBhcnJheXNbbl07CiAgICAgIG0gPSBhcnJheS5sZW5ndGg7CiAgICAgIHdoaWxlICgtLW0gPj0gMCkgewogICAgICAgIG1lcmdlZFstLWpdID0gYXJyYXlbbV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtZXJnZWQ7CiAgfTsKICB2YXIgYWJzID0gTWF0aC5hYnM7CiAgZDMucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICAgIHN0ZXAgPSAxOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICBzdG9wID0gc3RhcnQ7CiAgICAgICAgc3RhcnQgPSAwOwogICAgICB9CiAgICB9CiAgICBpZiAoKHN0b3AgLSBzdGFydCkgLyBzdGVwID09PSBJbmZpbml0eSkgdGhyb3cgbmV3IEVycm9yKCJpbmZpbozc71ZdfgEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt1kAAQAZ9B8CoBzbAqAdglScf9duSeDc5UMYHgBABVtfaAAABAQgKAKNevQBNpbmM3O9WaX4BAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx8NrhAAEAGV93AqAdgwKgHNh/1lSc5UMYH25J4N4AQAO2sVQAAAQEICgBNpbkAo162aXRlIHJhbmdlIik7CiAgICB2YXIgcmFuZ2UgPSBbXSwgayA9IGQzX3JhbmdlX2ludGVnZXJTY2FsZShhYnMoc3RlcCkpLCBpID0gLTEsIGo7CiAgICBzdGFydCAqPSBrLCBzdG9wICo9IGssIHN0ZXAgKj0gazsKICAgIGlmIChzdGVwIDwgMCkgd2hpbGUgKChqID0gc3RhcnQgKyBzdGVwICogKytpKSA+IHN0b3ApIHJhbmdlLnB1c2goaiAvIGspOyBlbHNlIHdoaWxlICgoaiA9IHN0YXJ0ICsgc3RlcCAqICsraSkgPCBzdG9wKSByYW5nZS5wdXNoKGogLyBrKTsKICAgIHJldHVybiByYW5nZTsKICB9OwogIGZ1bmN0aW9uIGQzX3JhbmdlX2ludGVnZXJTY2FsZSh4KSB7CiAgICB2YXIgayA9IDE7CiAgICB3aGlsZSAoeCAqIGsgJSAxKSBrICo9IDEwOwogICAgcmV0dXJuIGs7CiAgfQogIGZ1bmN0aW9uIGQzX2NsYXNzKGN0b3IsIHByb3BlcnRpZXMpIHsKICAgIHRyeSB7CiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0b3IucHJvdG90eXBlLCBrZXksIHsKICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2tleV0sCiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGN0b3IucHJvdG90eXBlID0gcHJvcGVydGllczsKICAgIH0KICB9CiAgZDMubWFwID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICB2YXIgbWFwID0gbmV3IGQzX01hcCgpOwogICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIGQzX01hcCkgb2JqZWN0LmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICBtYXAuc2V0KGtleSwgdmFsdWUpOwogICAgfSk7IGVsc2UgZm9yICh2YXIga2V5IGluIG9iamVjdCkgbWFwLnNldChrZXksIG9iamVjdFtrZXldKTsKICAgIHJldHVybiBtYXA7CiAgfTsKICBmdW5jdGlvbiBkM19NYXAoKSB7fQogIGQzX2NsYXNzKGQzX01hcCwgewogICAgaGFzOiBkM19tYXBfaGFzLAogICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKICAgICAgcmV0dXJuIHRoaXNbZDNfbWFwX3ByZWZpeCArIGtleV07CiAgICB9LAogICAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzW2QzX21hcF9wcmVmaXggKyBrZXldID0gdmFsdWU7CiAgICB9LAogICAgcmVtb3ZlOiBkM19tYXBfcmVtb3ZlLAogICAga2V5czogZDNfbWFwX2tleXMsCiAgICB2YWx1ZXM6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHZhbHVlczsKICAgIH0sCiAgICBlbnRyaWVzOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGVudHJpZXMgPSBbXTsKICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICBlbnRyaWVzLnB1c2goewogICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICB2YWx1ZTogdmFsdWUKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJldHVybiBlbnRyaWVzOwogICAgfSwKICAgIHNpemU6IGQzX21hcF9zaXplLAogICAgZW1wdHk6IGQzX21hcF9lbXB0eSwKICAgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMpIGlmIChrZXkuY2hhckNvZGVBdCgwKSA9PT0gZDNfbWFwX3ByZWZpeENvZGUpIGYuY2FsbCh0aGlzLCBrZXkuc2xpY2UoMSksIHRoaXNba2V5XSk7CiAgICB9CiAgfSk7CiAgdmFyIGQzX21hcF9wcmVmaXggPSAiXHgwMCIsIGQzX21hcF9wcmVmaXhDb2RlID0gZDNfbWFwX3ByZWZpeC5jaGFyQ29kZUF0KDApOwogIGZ1bmN0aW9uIGQzX21hcF9oYXMoa2V5KSB7CiAgICByZXR1cm4gZDNfbWFwX3ByZWZpeCArIGtleSBpbiB0aGlzOwogIH0KICBmdW5jdGlvbiBkM19tYXBfcmVtb3ZlKGtleSkgewogICAga2V5ID0gZDNfbWFwX3ByZWZpeCArIGtleTsKICAgIHJldHVybiBrZXkgaW4gdGhpcyAmJiBkZWxldGUgdGhpc1trZXldOwogIH0KICBmdW5jdGlvbiBkM19tYXBfa2V5cygpIHsKICAgIHZhciBrZXlzID0gW107CiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CiAgICAgIGtleXMucHVzaChrZXkpOwogICAgfSk7CiAgICByZXR1cm4ga2V5czsKICB9CiAgZnVuY3Rpb24gZDNfbWFwX3NpemUoKSB7CiAgICB2YXIgc2l6ZSA9IDA7CiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgaWYgKGtleS5jaGFyQ29kZUF0KDApID09PSBkM19tYXBfcHJlZml4Q29kZSkgKytzaXplOwogICAgcmV0dXJuIHNpemU7CiAgfQogIGZ1bmN0aW9uIGQzX21hcF9lbXB0eSgpIHsKICAgIGZvciAodmFyIGtleSBpbiB0aGlzKSBpZiAoa2V5LmNoYXJDb2RlQXQoMCkgPT09IGQzX21hcF9wcmVmaXhDb2RlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZDMubmVzdCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIG5lc3QgPSB7fSwga2V5cyA9IFtdLCBzb3J0S2V5cyA9IFtdLCBzb3J0VmFsdWVzLCByb2xsdXA7CiAgICBmdW5jdGlvbiBtYXAobWFwVHlwZSwgYXJyYXksIGRlcHRoKSB7CiAgICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHJvbGx1cCA/IHJvbGx1cC5jYWxsKG5lc3QsIGFycmF5KSA6IHNvcnRWYWx1ZXMgPyBhcnJheS5zb3J0KHNvcnRWYWx1ZXMpIDogYXJyYXk7CiAgICAgIHZhciBpID0gLTEsIG4gPSBhcnJheS5sZW5ndGgsIGtleSA9IGtleXNbZGVwdGgrK10sIGtleVZhbHVlLCBvYmplY3QsIHNldHRlciwgdmFsdWVzQnlLZXkgPSBuZXcgZDNfTWFwKCksIHZhbHVlczsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBpZiAodmFsdWVzID0gdmFsdWVzQnlLZXkuZ2V0KGtleVZhbHVlID0ga2V5KG9iamVjdCA9IGFycmF5W2ldKSkpIHsKICAgICAgICAgIHZhbHVlcy5wdXNoKG9iamVjdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhbHVlc0J5S2V5LnNldChrZXlWYWx1ZSwgWyBvYmplY3QgXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChtYXBUeXBlKSB7CiAgICAgICAgb2JqZWN0ID0gbWFwVHlwZSgpOwogICAgICAgIHNldHRlciA9IGZ1bmN0aW9uKGtleVZhbHVlLCB2YWx1ZXMpIHsKICAgICAgICAgIG9iamVjdC5zZXQoa2V5VmFsdWUsIG1hcChtYXBUeXBlLCB2YWx1ZXMsIGRlcHRoKSk7CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmplY3QgPSB7fTsKICAgICAgICBzZXR0ZXIgPSBmdW5jdGlvbihrZXlWYWx1ZSwgdmFsdWVzKSB7CiAgICAgICAgICBvYmplY3Rba2V5VmFsdWVdID0gbWFwKG1hcFR5cGUsIHZhbHVlcywgZGVwdGgpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgdmFsdWVzQnlLZXkuZm9yRWFjaChzZXR0ZXIpOwogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQogICAgZnVuY3Rpb24gZW50cmllcyhtYXAsIGRlcHRoKSB7CiAgICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIG1hcDsKICAgICAgdmFyIGFycmF5ID0gW10sIHNvcnRLZXkgPSBzb3J0S2V5c1tkZXB0aCsrXTsKICAgICAgbWFwLmZvckVhY2goZnVuY3Rpb24oa2V5LCBrZXlNYXApIHsKICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgIGtleToga2V5LAogICAgICAgICAgdmFsdWVzOiBlbnRyaWVzKGtleU1hcCwgZGVwdGgpCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gc29ydEtleSA/IGFycmF5LnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7CiAgICAgIH0pIDogYXJyYXk7CiAgICB9CiAgICBuZXN0Lm1hcCA9IGZ1bmN0aW9uKGFycmF5LCBtYXBUeXBlKSB7CiAgICAgIHJldHVybiBtYXAobWFwVHlwZSwgYXJyYXksIDApOwogICAgfTsKICAgIG5lc3QuZW50cmllcyA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgIHJldHVybiBlbnRyaWVzKG1hcChkMy5tYXAsIGFycmF5LCAwKSwgMCk7CiAgICB9OwogICAgbmVzdC5rZXkgPSBmdW5jdGlvbihkKSB7CiAgICAgIGtleXMucHVzaChkKTsKICAgICAgcmV0dXJuIG5lc3Q7CiAgICB9OwogICAgbmVzdC5zb3J0S2V5cyA9IGZ1bmN0aW9uKG9yZGVyKSB7CiAgICAgIHNvcnRLZXlzW2tleXMubGVuZ3RoIC0gMV0gPSBvcmRlcjsKICAgICAgcmV0dXJuIG5lc3Q7CiAgICB9OwogICAgbmVzdC5zb3J0VmFsdWVzID0gZnVuY3Rpb24ob3JkZXIpIHsKICAgICAgc29ydFZhbHVlcyA9IG9yZGVyOwogICAgICByZXR1cm4gbmVzdDsKICAgIH07CiAgICBuZXN0LnJvbGx1cCA9IGZ1bmN0aW9uKGYpIHsKICAgICAgcm9sbHVwID0gZjsKICAgICAgcmV0dXJuIG5lc3Q7CiAgICB9OwogICAgcmV0dXJuIG5lc3Q7CiAgfTsKICBkMy5zZXQgPSBmdW5jdGlvbihhcnJheSkgewogICAgdmFyIHNldCA9IG5ldyBkM19TZXQoKTsKICAgIGlmIChhcnJheSkgZm9yICh2YXIgaSA9IDAsIG4gPSBhcnJheS5sZW5ndGg7IGkgPCBuOyArK2kpIHNldC5hZGQoYXJyYXlbaV0pOwogICAgcmV0dXJuIHNldDsKICB9OwogIGZ1bmN0aW9uIGQzX1NldCgpIHt9CiAgZDNfY2xhc3MoZDNfU2V0LCB7CiAgICBoYXM6IGQzX21hcF9oYXMsCiAgICBhZGQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHRoaXNbZDNfbWFwX3ByZWZpeCArIHZhbHVlXSA9IHRydWU7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhbHVlID0gZDNfbWFwX3ByZWZpeCArIHZhbHVlOwogICAgICByZXR1cm4gdmFsdWUgaW4gdGhpcyAmJiBkZWxldGUgdGhpc1t2YWx1ZV07CiAgICB9LAogICAgdmFsdWVzOiBkM19tYXBfa2V5cywKICAgIHNpemU6IGQzX21hcF9zaXplLAogICAgZW1wdHk6IGQzX21hcF9lbXB0eSwKICAgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgICAgZm9yICh2YXIgdmFsdWUgaW4gdGhpcykgaWYgKHZhbHVlLmNoYXJDb2RlQXQoMCkgPT09IGQzX21hcF9wcmVmaXhDb2RlKSBmLmNhbGwodGhpcywgdmFsdWUuc2xpY2UoMSkpOwogICAgfQogIH0pOwogIGQzLmJlaGF2aW9yID0ge307CiAgZDMucmViaW5kID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAgIHZhciBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1ldGhvZDsKICAgIHdoaWxlICgrK2kgPCBuKSB0YXJnZXRbbWV0aG9kID0gYXJndW1lbnRzW2ldXSA9IGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgc291cmNlW21ldGhvZF0pOwogICAgcmV0dXJuIHRhcmdldDsKICB9OwogIGZ1bmN0aW9uIGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgbWV0aG9kKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWx1ZSA9IG1ldGhvZC5hcHBseShzb3VyY2UsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gc291cmNlID8gdGFyZ2V0IDogdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM192ZW5kb3JTeW1ib2wob2JqZWN0LCBuYW1lKSB7CiAgICBpZiAobmFtZSBpbiBvYmplY3QpIHJldHVybiBuYW1lOwogICAgbmFtZSA9IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpOwogICAgZm9yICh2YXIgaSA9IDAsIG4gPSBkM192ZW5kb3JQcmVmaXhlcy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgdmFyIHByZWZpeE5hbWUgPSBkM192ZW5kb3JQcmVmaXhlc1tpXSArIG5hbWU7CiAgICAgIGlmIChwcmVmaXhOYW1lIGluIG9iamVjdCkgcmV0dXJuIHByZWZpeE5hbWU7CiAgICB9CiAgfQogIHZhciBkM192ZW5kb3JQcmVmaXhlcyA9IFsgIndlYmtpdCIsICJtcyIsICJtb3oiLCAiTW96IiwgIm8iLCAiTyIgXTsKICBmdW5jdGlvbiBkM19ub29wKCkge30KICBkMy5kaXNwYXRjaCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoKCksIGkgPSAtMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgZGlzcGF0Y2hbYXJndW1lbnRzW2ldXSA9IGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKTsKICAgIHJldHVybiBkaXNwYXRjaDsKICB9OwogIGZ1bmN0aW9uIGQzX2Rpc3BhdGNoKCkge30KICBkM19kaXNwYXRjaC5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikgewogICAgdmFyIGkgPSB0eXBlLmluZGV4T2YoIi4iKSwgbmFtZSA9ICIiOwogICAgaWYgKGkgPj0gMCkgewogICAgICBuYW1lID0gdHlwZS5zbGljZShpICsgMSk7CiAgICAgIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpOwogICAgfQogICAgaWYgKHR5cGUpIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHRoaXNbdHlwZV0ub24obmFtZSkgOiB0aGlzW3R5cGVdLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CiAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSBmb3IgKHR5cGUgaW4gdGhpcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHR5cGUpKSB0aGlzW3R5cGVdLm9uKG5hbWUsIG51bGwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgZnVuY3Rpb24gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpIHsKICAgIHZhciBsaXN0ZW5lcnMgPSBbXSwgbGlzdGVuZXJCeU5hbWUgPSBuZXcgZDNfTWFwKCk7CiAgICBmdW5jdGlvbiBldmVudCgpIHsKICAgICAgdmFyIHogPSBsaXN0ZW5lcnMsIGkgPSAtMSwgbiA9IHoubGVuZ3RoLCBsOwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGwgPSB6W2ldLm9uKSBsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBkaXNwYXRjaDsKICAgIH0KICAgIGV2ZW50Lm9uID0gZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHsKICAgICAgdmFyIGwgPSBsaXN0ZW5lckJ5TmFtZS5nZXQobmFtZSksIGk7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGwgJiYgbC5vbjsKICAgICAgaWYgKGwpIHsKICAgICAgICBsLm9uID0gbnVsbDsKICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCwgaSA9IGxpc3RlbmVycy5pbmRleE9mKGwpKS5jb25jYXQobGlzdGVuZXJzLnNsaWNlKGkgKyAxKSk7CiAgICAgICAgbGlzdGVuZXJCeU5hbWUucmVtb3ZlKG5hbWUpOwogICAgICB9CiAgICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXJCeU5hbWUuc2V0KG5hbWUsIHsKICAgICAgICBvbjogbGlzdGVuZXIKICAgICAgfSkpOwogICAgICByZXR1cm4gZGlzcGF0Y2g7CiAgICB9OwogICAgcmV0dXJuIGV2ZW50OwogIH0KICBkMy5ldmVudCA9IG51bIzc71aYfgEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt10AAQAZ9BsCoBzbAqAdglScf9duSeDc5UOJPgBABx7shAAABAQgKAKNevQBNpbmM3O9W034BANonAADaJwAAaPcoH9LFCAAnrR4TCABFACfMNr1AAEAGTIjAqAdgwKgHNh/1lSc5UOJP25J4N4AQAO23pQAAAQEICgBNpbkAo169bDsKICBmdW5jdGlvbiBkM19ldmVudFByZXZlbnREZWZhdWx0KCkgewogICAgZDMuZXZlbnQucHJldmVudERlZmF1bHQoKTsKICB9CiAgZnVuY3Rpb24gZDNfZXZlbnRTb3VyY2UoKSB7CiAgICB2YXIgZSA9IGQzLmV2ZW50LCBzOwogICAgd2hpbGUgKHMgPSBlLnNvdXJjZUV2ZW50KSBlID0gczsKICAgIHJldHVybiBlOwogIH0KICBmdW5jdGlvbiBkM19ldmVudERpc3BhdGNoKHRhcmdldCkgewogICAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoKCksIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBkaXNwYXRjaFthcmd1bWVudHNbaV1dID0gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpOwogICAgZGlzcGF0Y2gub2YgPSBmdW5jdGlvbih0aGl6LCBhcmd1bWVudHopIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUxKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBlMCA9IGUxLnNvdXJjZUV2ZW50ID0gZDMuZXZlbnQ7CiAgICAgICAgICBlMS50YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgICBkMy5ldmVudCA9IGUxOwogICAgICAgICAgZGlzcGF0Y2hbZTEudHlwZV0uYXBwbHkodGhpeiwgYXJndW1lbnR6KTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgZDMuZXZlbnQgPSBlMDsKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogICAgcmV0dXJuIGRpc3BhdGNoOwogIH0KICBkMy5yZXF1b3RlID0gZnVuY3Rpb24ocykgewogICAgcmV0dXJuIHMucmVwbGFjZShkM19yZXF1b3RlX3JlLCAiXFwkJiIpOwogIH07CiAgdmFyIGQzX3JlcXVvdGVfcmUgPSAvW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7CiAgdmFyIGQzX3N1YmNsYXNzID0ge30uX19wcm90b19fID8gZnVuY3Rpb24ob2JqZWN0LCBwcm90b3R5cGUpIHsKICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgfSA6IGZ1bmN0aW9uKG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm90b3R5cGUpIG9iamVjdFtwcm9wZXJ0eV0gPSBwcm90b3R5cGVbcHJvcGVydHldOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uKGdyb3VwcykgewogICAgZDNfc3ViY2xhc3MoZ3JvdXBzLCBkM19zZWxlY3Rpb25Qcm90b3R5cGUpOwogICAgcmV0dXJuIGdyb3VwczsKICB9CiAgdmFyIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHsKICAgIHJldHVybiBuLnF1ZXJ5U2VsZWN0b3Iocyk7CiAgfSwgZDNfc2VsZWN0QWxsID0gZnVuY3Rpb24ocywgbikgewogICAgcmV0dXJuIG4ucXVlcnlTZWxlY3RvckFsbChzKTsKICB9LCBkM19zZWxlY3RNYXRjaGVyID0gZDNfZG9jdW1lbnRFbGVtZW50Lm1hdGNoZXMgfHwgZDNfZG9jdW1lbnRFbGVtZW50W2QzX3ZlbmRvclN5bWJvbChkM19kb2N1bWVudEVsZW1lbnQsICJtYXRjaGVzU2VsZWN0b3IiKV0sIGQzX3NlbGVjdE1hdGNoZXMgPSBmdW5jdGlvbihuLCBzKSB7CiAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlci5jYWxsKG4sIHMpOwogIH07CiAgaWYgKHR5cGVvZiBTaXp6bGUgPT09ICJmdW5jdGlvbiIpIHsKICAgIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHsKICAgICAgcmV0dXJuIFNpenpsZShzLCBuKVswXSB8fCBudWxsOwogICAgfTsKICAgIGQzX3NlbGVjdEFsbCA9IFNpenpsZTsKICAgIGQzX3NlbGVjdE1hdGNoZXMgPSBTaXp6bGUubWF0Y2hlc1NlbGVjdG9yOwogIH0KICBkMy5zZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zZWxlY3Rpb25Sb290OwogIH07CiAgdmFyIGQzX3NlbGVjdGlvblByb3RvdHlwZSA9IGQzLnNlbGVjdGlvbi5wcm90b3R5cGUgPSBbXTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIHN1Ym5vZGUsIGdyb3VwLCBub2RlOwogICAgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkgewogICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsKICAgICAgc3ViZ3JvdXAucGFyZW50Tm9kZSA9IChncm91cCA9IHRoaXNbal0pLnBhcmVudE5vZGU7CiAgICAgIGZvciAodmFyIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgc3ViZ3JvdXAucHVzaChzdWJub2RlID0gc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSk7CiAgICAgICAgICBpZiAoc3Vibm9kZSAmJiAiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NlbGVjdChzZWxlY3RvciwgdGhpcyk7CiAgICB9OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGU7CiAgICBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IGQzX2FycmF5KHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpKTsKICAgICAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NlbGVjdEFsbChzZWxlY3RvciwgdGhpcyk7CiAgICB9OwogIH0KICB2YXIgZDNfbnNQcmVmaXggPSB7CiAgICBzdmc6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICB4aHRtbDogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAogICAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgogIH07CiAgZDMubnMgPSB7CiAgICBwcmVmaXg6IGQzX25zUHJlZml4LAogICAgcXVhbGlmeTogZnVuY3Rpb24obmFtZSkgewogICAgICB2YXIgaSA9IG5hbWUuaW5kZXhPZigiOiIpLCBwcmVmaXggPSBuYW1lOwogICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgcHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKTsKICAgICAgICBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGQzX25zUHJlZml4Lmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7CiAgICAgICAgc3BhY2U6IGQzX25zUHJlZml4W3ByZWZpeF0sCiAgICAgICAgbG9jYWw6IG5hbWUKICAgICAgfSA6IG5hbWU7CiAgICB9CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewogICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7CiAgICAgICAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7CiAgICAgICAgcmV0dXJuIG5hbWUubG9jYWwgPyBub2RlLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIH0KICAgICAgZm9yICh2YWx1ZSBpbiBuYW1lKSB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX2F0dHIodmFsdWUsIG5hbWVbdmFsdWVdKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fYXR0cihuYW1lLCB2YWx1ZSkpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHsKICAgIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpOwogICAgZnVuY3Rpb24gYXR0ck51bGwoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ck51bGxOUygpIHsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudCgpIHsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoKSB7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgdmFsdWUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKCkgewogICAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh4ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOyBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHgpOwogICAgfQogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoKSB7CiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIHgpOwogICAgfQogICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBuYW1lLmxvY2FsID8gYXR0ck51bGxOUyA6IGF0dHJOdWxsIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uIDogbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50OwogIH0KICBmdW5jdGlvbiBkM19jb2xsYXBzZShzKSB7CiAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXHMrL2csICIgIik7CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5jbGFzc2VkID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKSwgbiA9IChuYW1lID0gZDNfc2VsZWN0aW9uX2NsYXNzZXMobmFtZSkpLmxlbmd0aCwgaSA9IC0xOwogICAgICAgIGlmICh2YWx1ZSA9IG5vZGUuY2xhc3NMaXN0KSB7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCF2YWx1ZS5jb250YWlucyhuYW1lW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghZDNfc2VsZWN0aW9uX2NsYXNzZWRSZShuYW1lW2ldKS50ZXN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmb3IgKHZhbHVlIGluIG5hbWUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fY2xhc3NlZCh2YWx1ZSwgbmFtZVt2YWx1ZV0pKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSk7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWUpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCIoPzpefFxccyspIiArIGQzLnJlcXVvdGUobmFtZSkgKyAiKD86XFxzK3wkKSIsICJnIik7CiAgfQogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VzKG5hbWUpIHsKICAgIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLyk7CiAgfQogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7CiAgICBuYW1lID0gZDNfc2VsZWN0aW9uX2NsYXNzZXMobmFtZSkubWFwKGQzX3NlbGVjdGlvbl9jbGFzc2VkTmFtZSk7CiAgICB2YXIgbiA9IG5hbWUubGVuZ3RoOwogICAgZnVuY3Rpb24gY2xhc3NlZENvbnN0YW50KCkgewogICAgICB2YXIgaSA9IC0xOwogICAgICB3aGlsZSAoKytpIDwgbikgbmFtZVtpXSh0aGlzLCB2YWx1ZSk7CiAgICB9CiAgICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24oKSB7CiAgICAgIHZhciBpID0gLTEsIHggPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB3aGlsZSAoKytpIDwgbikgbmFtZVtpXSh0aGlzLCB4KTsKICAgIH0KICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBjbGFzc2VkRnVuY3Rpb24gOiBjbGFzc2VkQ29uc3RhbnQ7CiAgfQogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkTmFtZShuYW1lKSB7CiAgICB2YXIgcmUgPSBkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWUpOwogICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7CiAgICAgIGlmIChjID0gbm9kZS5jbGFzc0xpc3QpIHJldHVybiB2YWx1ZSA/IGMuYWRkKG5hbWUpIDogYy5yZW1vdmUobmFtZSk7CiAgICAgIHZhciBjID0gbm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiI7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIHJlLmxhc3RJbmRleCA9IDA7CiAgICAgICAgaWYgKCFyZS50ZXN0KGMpKSBub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBkM19jb2xsYXBzZShjICsgIiAiICsgbmFtZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGQzX2NvbGxhcHNlKGMucmVwbGFjZShyZSwgIiAiKSkpOwogICAgICB9CiAgICB9OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIGlmIChuIDwgMykgewogICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgaWYgKG4gPCAyKSB2YWx1ZSA9ICIiOwogICAgICAgIGZvciAocHJpb3JpdHkgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9zdHlsZShwcmlvcml0eSwgbmFtZVtwcmlvcml0eV0sIHZhbHVlKSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgaWYgKG4gPCAyKSByZXR1cm4gZDNfd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7CiAgICAgIHByaW9yaXR5ID0gIiI7CiAgICB9CiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIGZ1bmN0aW9uIHN0eWxlTnVsbCgpIHsKICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQoKSB7CiAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24oKSB7CiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHgsIHByaW9yaXR5KTsKICAgIH0KICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gc3R5bGVOdWxsIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gc3R5bGVGdW5jdGlvbiA6IHN0eWxlQ29uc3RhbnQ7CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgcmV0dXJuIHRoaXMubm9kZSgpW25hbWVdOwogICAgICBmb3IgKHZhbHVlIGluIG5hbWUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fcHJvcGVydHkodmFsdWUsIG5hbWVbdmFsdWVdKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fcHJvcGVydHkobmFtZSwgdmFsdWUpKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkgewogICAgZnVuY3Rpb24gcHJvcGVydHlOdWxsKCkgewogICAgICBkZWxldGUgdGhpc1tuYW1lXTsKICAgIH0KICAgIGZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQoKSB7CiAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24oKSB7CiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgaWYgKHggPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07IGVsc2UgdGhpc1tuYW1lXSA9IHg7CiAgICB9CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHByb3BlcnR5TnVsbCA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHByb3BlcnR5RnVuY3Rpb24gOiBwcm9wZXJ0eUNvbnN0YW50OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBmdW5jdGlvbigpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgfSA6IHZhbHVlID09IG51bGwgPyBmdW5jdGlvbigpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogICAgfSA6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICB9KSA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogIH07CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmh0bWwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgICB9IDogdmFsdWUgPT0gbnVsbCA/IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmlubmVySFRNTCA9ICIiOwogICAgfSA6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlOwogICAgfSkgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSkgewogICAgbmFtZSA9IGQzX3NlbGVjdGlvbl9jcmVhdG9yKG5hbWUpOwogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuYW1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfSk7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fY3JlYXRvcihuYW1lKSB7CiAgICByZXR1cm4gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogKG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpKS5sb2NhbCA/IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsKICAgIH0gOiBmdW5jdGmM3O9WBX8BADoRAAA6EQAAaPcoH9LFCAAnrR4TCABFABEsNsRAAEAGYyHAqAdgwKgHNh/1lSc5UQnn25J4N4AYAO2hBQAAAQEICgBNpbkAo169b24oKSB7CiAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLCBuYW1lKTsKICAgIH07CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHsKICAgIG5hbWUgPSBkM19zZWxlY3Rpb25fY3JlYXRvcihuYW1lKTsKICAgIGJlZm9yZSA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihiZWZvcmUpOwogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobmFtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBiZWZvcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTsKICAgIH0pOwogIH07CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgfSk7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgIHZhciBpID0gLTEsIG4gPSB0aGlzLmxlbmd0aCwgZ3JvdXAsIG5vZGU7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgdmFsdWUgPSBuZXcgQXJyYXkobiA9IChncm91cCA9IHRoaXNbMF0pLmxlbmd0aCk7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgdmFsdWVbaV0gPSBub2RlLl9fZGF0YV9fOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICBmdW5jdGlvbiBiaW5kKGdyb3VwLCBncm91cERhdGEpIHsKICAgICAgdmFyIGksIG4gPSBncm91cC5sZW5ndGgsIG0gPSBncm91cERhdGEubGVuZ3RoLCBuMCA9IE1hdGgubWluKG4sIG0pLCB1cGRhdGVOb2RlcyA9IG5ldyBBcnJheShtKSwgZW50ZXJOb2RlcyA9IG5ldyBBcnJheShtKSwgZXhpdE5vZGVzID0gbmV3IEFycmF5KG4pLCBub2RlLCBub2RlRGF0YTsKICAgICAgaWYgKGtleSkgewogICAgICAgIHZhciBub2RlQnlLZXlWYWx1ZSA9IG5ldyBkM19NYXAoKSwgZGF0YUJ5S2V5VmFsdWUgPSBuZXcgZDNfTWFwKCksIGtleVZhbHVlcyA9IFtdLCBrZXlWYWx1ZTsKICAgICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbjsgKSB7CiAgICAgICAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUgPSBncm91cFtpXSwgbm9kZS5fX2RhdGFfXywgaSk7CiAgICAgICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkgewogICAgICAgICAgICBleGl0Tm9kZXNbaV0gPSBub2RlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGtleVZhbHVlcy5wdXNoKGtleVZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gLTE7ICsraSA8IG07ICkgewogICAgICAgICAga2V5VmFsdWUgPSBrZXkuY2FsbChncm91cERhdGEsIG5vZGVEYXRhID0gZ3JvdXBEYXRhW2ldLCBpKTsKICAgICAgICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkgewogICAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGU7CiAgICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBub2RlRGF0YTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWRhdGFCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsKICAgICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShub2RlRGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgICBkYXRhQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGVEYXRhKTsKICAgICAgICAgIG5vZGVCeUtleVZhbHVlLnJlbW92ZShrZXlWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuOyApIHsKICAgICAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWVzW2ldKSkgewogICAgICAgICAgICBleGl0Tm9kZXNbaV0gPSBncm91cFtpXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpID0gLTE7ICsraSA8IG4wOyApIHsKICAgICAgICAgIG5vZGUgPSBncm91cFtpXTsKICAgICAgICAgIG5vZGVEYXRhID0gZ3JvdXBEYXRhW2ldOwogICAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhOwogICAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICg7aSA8IG07ICsraSkgewogICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShncm91cERhdGFbaV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKDtpIDwgbjsgKytpKSB7CiAgICAgICAgICBleGl0Tm9kZXNbaV0gPSBncm91cFtpXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZW50ZXJOb2Rlcy51cGRhdGUgPSB1cGRhdGVOb2RlczsKICAgICAgZW50ZXJOb2Rlcy5wYXJlbnROb2RlID0gdXBkYXRlTm9kZXMucGFyZW50Tm9kZSA9IGV4aXROb2Rlcy5wYXJlbnROb2RlID0gZ3JvdXAucGFyZW50Tm9kZTsKICAgICAgZW50ZXIucHVzaChlbnRlck5vZGVzKTsKICAgICAgdXBkYXRlLnB1c2godXBkYXRlTm9kZXMpOwogICAgICBleGl0LnB1c2goZXhpdE5vZGVzKTsKICAgIH0KICAgIHZhciBlbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcihbXSksIHVwZGF0ZSA9IGQzX3NlbGVjdGlvbihbXSksIGV4aXQgPSBkM19zZWxlY3Rpb24oW10pOwogICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGJpbmQoZ3JvdXAgPSB0aGlzW2ldLCB2YWx1ZS5jYWxsKGdyb3VwLCBncm91cC5wYXJlbnROb2RlLl9fZGF0YV9fLCBpKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgYmluZChncm91cCA9IHRoaXNbaV0sIHZhbHVlKTsKICAgICAgfQogICAgfQogICAgdXBkYXRlLmVudGVyID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBlbnRlcjsKICAgIH07CiAgICB1cGRhdGUuZXhpdCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXhpdDsKICAgIH07CiAgICByZXR1cm4gdXBkYXRlOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKGRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIF9fZGF0YV9fOiBkYXRhCiAgICB9OwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZGF0dW0gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsIHZhbHVlKSA6IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIik7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7CiAgICB2YXIgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBncm91cCwgbm9kZTsKICAgIGlmICh0eXBlb2YgZmlsdGVyICE9PSAiZnVuY3Rpb24iKSBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fZmlsdGVyKGZpbHRlcik7CiAgICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgZmlsdGVyLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpIHsKICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fZmlsdGVyKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19zZWxlY3RNYXRjaGVzKHRoaXMsIHNlbGVjdG9yKTsKICAgIH07CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5vcmRlciA9IGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkgewogICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSBncm91cC5sjNzvVhx/AQC1DwAAtQ8AAGj3KB/SxQgAJ60eEwgARQAPpzbHQABABmSjwKgHYMCoBzYf9ZUnOVEa39uSeDeAGADtn4AAAAEBCAoATaW5AKNevWVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDsgKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gbm9kZS5uZXh0U2libGluZykgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKICAgICAgICAgIG5leHQgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uKGNvbXBhcmF0b3IpIHsKICAgIGNvbXBhcmF0b3IgPSBkM19zZWxlY3Rpb25fc29ydENvbXBhcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOyApIHRoaXNbal0uc29ydChjb21wYXJhdG9yKTsKICAgIHJldHVybiB0aGlzLm9yZGVyKCk7CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fc29ydENvbXBhcmF0b3IoY29tcGFyYXRvcikgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSBjb21wYXJhdG9yID0gZDNfYXNjZW5kaW5nOwogICAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmF0b3IoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiOwogICAgfTsKICB9CiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcmV0dXJuIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIGZ1bmN0aW9uKG5vZGUsIGksIGopIHsKICAgICAgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKTsKICAgIH0pOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VhY2goZ3JvdXBzLCBjYWxsYmFjaykgewogICAgZm9yICh2YXIgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47IGkrKykgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrKG5vZGUsIGksIGopOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZ3JvdXBzOwogIH0KICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB2YXIgYXJncyA9IGQzX2FycmF5KGFyZ3VtZW50cyk7CiAgICBjYWxsYmFjay5hcHBseShhcmdzWzBdID0gdGhpcywgYXJncyk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICF0aGlzLm5vZGUoKTsKICB9OwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOwogICAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIG4gPSAwOwogICAgZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICsrbjsKICAgIH0pOwogICAgcmV0dXJuIG47CiAgfTsKICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fZW50ZXIoc2VsZWN0aW9uKSB7CiAgICBkM19zdWJjbGFzcyhzZWxlY3Rpb24sIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSk7CiAgICByZXR1cm4gc2VsZWN0aW9uOwogIH0KICB2YXIgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlID0gW107CiAgZDMuc2VsZWN0aW9uLmVudGVyID0gZDNfc2VsZWN0aW9uX2VudGVyOwogIGQzLnNlbGVjdGlvbi5lbnRlci5wcm90b3R5cGUgPSBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGU7CiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmFwcGVuZCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5hcHBlbmQ7CiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmVtcHR5ID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5OwogIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5ub2RlID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGU7CiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmNhbGwgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuY2FsbDsKICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuc2l6ZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5zaXplOwogIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgewogICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgc3Vibm9kZSwgdXBncm91cCwgZ3JvdXAsIG5vZGU7CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIHVwZ3JvdXAgPSAoZ3JvdXAgPSB0aGlzW2pdKS51cGRhdGU7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gZ3JvdXAucGFyZW50Tm9kZTsKICAgICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKHVwZ3JvdXBbaV0gPSBzdWJub2RlID0gc2VsZWN0b3IuY2FsbChncm91cC5wYXJlbnROb2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSk7CiAgICAgICAgICBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTsKICB9OwogIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgYmVmb3JlID0gZDNfc2VsZWN0aW9uX2VudGVySW5zZXJ0QmVmb3JlKHRoaXMpOwogICAgcmV0dXJuIGQzX3NlbGVjdGlvblByb3RvdHlwZS5pbnNlcnQuY2FsbCh0aGlzLCBuYW1lLCBiZWZvcmUpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VudGVySW5zZXJ0QmVmb3JlKGVudGVyKSB7CiAgICB2YXIgaTAsIGowOwogICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGksIGopIHsKICAgICAgdmFyIGdyb3VwID0gZW50ZXJbal0udXBkYXRlLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOwogICAgICBpZiAoaiAhPSBqMCkgajAgPSBqLCBpMCA9IDA7CiAgICAgIGlmIChpID49IGkwKSBpMCA9IGkgKyAxOwogICAgICB3aGlsZSAoIShub2RlID0gZ3JvdXBbaTBdKSAmJiArK2kwIDwgbikgOwogICAgICByZXR1cm4gbm9kZTsKICAgIH07CiAgfQogIGQzX3NlbGVjdGlvblByb3RvdHlwZS50cmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaWQgPSBkM190cmFuc2l0aW9uSW5oZXJpdElkIHx8ICsrZDNfdHJhbnNpdGlvbklkLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGUsIHRyYW5zaXRpb24gPSBkM190cmFuc2l0aW9uSW5oZXJpdCB8fCB7CiAgICAgIHRpbWU6IERhdGUubm93KCksCiAgICAgIGVhc2U6IGQzX2Vhc2VfY3ViaWNJbk91dCwKICAgICAgZGVsYXk6IDAsCiAgICAgIGR1cmF0aW9uOiAyNTAKICAgIH07CiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7CiAgICAgICAgaWaM3O9WM38BAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LdhAAEAGfQXAqAc2wKgHYJUnH/Xbkng3OVEJ54AQAmWS6wAAAQEICgCjXr0ATaW5jNzvVjh/AQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3ZQABABn0EwKgHNsCoB2CVJx/125J4NzlRGt+AEAKpga8AAAEBCAoAo169AE2luYzc71Y5fwEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt2kAAQAZ9A8CoBzbAqAdglScf9duSeDc5USpSgBAC53H+AAABAQgKAKNevQBNpbmM3O9WO38BAMsCAADLAgAACAAnrR4TaPcoH9LFCABFAAK9EY9AAEAGlsXAqAc2wKgHYJUlH/UUCUwUxIye7YAYAxnZUgAAAQEICgCjXr0ATaW5R0VUIC9vbm9zL3VpL2FwcC9jb21tb24uY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71aWggEAGlUAABpVAABo9ygf0sUIACetHhMIAEUAVQw2ykAAQAYfO8CoB2DAqAc2H/WVJzlRKlLbkng3gBAA7eTlAAABAQgKAE2luQCjXr0NCjdGRTgNCiAobm9kZSA9IGdyb3VwW2ldKSBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBpZCwgdHJhbnNpdGlvbik7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBpZCk7CiAgfTsKICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW50ZXJydXB0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHQpOwogIH07CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2ludGVycnVwdCgpIHsKICAgIHZhciBsb2NrID0gdGhpcy5fX3RyYW5zaXRpb25fXzsKICAgIGlmIChsb2NrKSArK2xvY2suYWN0aXZlOwogIH0KICBkMy5zZWxlY3QgPSBmdW5jdGlvbihub2RlKSB7CiAgICB2YXIgZ3JvdXAgPSBbIHR5cGVvZiBub2RlID09PSAic3RyaW5nIiA/IGQzX3NlbGVjdChub2RlLCBkM19kb2N1bWVudCkgOiBub2RlIF07CiAgICBncm91cC5wYXJlbnROb2RlID0gZDNfZG9jdW1lbnRFbGVtZW50OwogICAgcmV0dXJuIGQzX3NlbGVjdGlvbihbIGdyb3VwIF0pOwogIH07CiAgZDMuc2VsZWN0QWxsID0gZnVuY3Rpb24obm9kZXMpIHsKICAgIHZhciBncm91cCA9IGQzX2FycmF5KHR5cGVvZiBub2RlcyA9PT0gInN0cmluZyIgPyBkM19zZWxlY3RBbGwobm9kZXMsIGQzX2RvY3VtZW50KSA6IG5vZGVzKTsKICAgIGdyb3VwLnBhcmVudE5vZGUgPSBkM19kb2N1bWVudEVsZW1lbnQ7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKFsgZ3JvdXAgXSk7CiAgfTsKICB2YXIgZDNfc2VsZWN0aW9uUm9vdCA9IGQzLnNlbGVjdChkM19kb2N1bWVudEVsZW1lbnQpOwogIGQzX3NlbGVjdGlvblByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKSB7CiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICBpZiAobiA8IDMpIHsKICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIikgewogICAgICAgIGlmIChuIDwgMikgbGlzdGVuZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGNhcHR1cmUgaW4gdHlwZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9vbihjYXB0dXJlLCB0eXBlW2NhcHR1cmVdLCBsaXN0ZW5lcikpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGlmIChuIDwgMikgcmV0dXJuIChuID0gdGhpcy5ub2RlKClbIl9fb24iICsgdHlwZV0pICYmIG4uXzsKICAgICAgY2FwdHVyZSA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9vbih0eXBlLCBsaXN0ZW5lciwgY2FwdHVyZSkgewogICAgdmFyIG5hbWUgPSAiX19vbiIgKyB0eXBlLCBpID0gdHlwZS5pbmRleE9mKCIuIiksIHdyYXAgPSBkM19zZWxlY3Rpb25fb25MaXN0ZW5lcjsKICAgIGlmIChpID4gMCkgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSk7CiAgICB2YXIgZmlsdGVyID0gZDNfc2VsZWN0aW9uX29uRmlsdGVycy5nZXQodHlwZSk7CiAgICBpZiAoZmlsdGVyKSB0eXBlID0gZmlsdGVyLCB3cmFwID0gZDNfc2VsZWN0aW9uX29uRmlsdGVyOwogICAgZnVuY3Rpb24gb25SZW1vdmUoKSB7CiAgICAgIHZhciBsID0gdGhpc1tuYW1lXTsKICAgICAgaWYgKGwpIHsKICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbCwgbC4kKTsKICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gb25BZGQoKSB7CiAgICAgIHZhciBsID0gd3JhcChsaXN0ZW5lciwgZDNfYXJyYXkoYXJndW1lbnRzKSk7CiAgICAgIG9uUmVtb3ZlLmNhbGwodGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzW25hbWVdID0gbCwgbC4kID0gY2FwdHVyZSk7CiAgICAgIGwuXyA9IGxpc3RlbmVyOwogICAgfQogICAgZnVuY3Rpb24gcmVtb3ZlQWxsKCkgewogICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCJeX19vbihbXi5dKykiICsgZDMucmVxdW90ZSh0eXBlKSArICIkIiksIG1hdGNoOwogICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHsKICAgICAgICBpZiAobWF0Y2ggPSBuYW1lLm1hdGNoKHJlKSkgewogICAgICAgICAgdmFyIGwgPSB0aGlzW25hbWVdOwogICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG1hdGNoWzFdLCBsLCBsLiQpOwogICAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gaSA/IGxpc3RlbmVyID8gb25BZGQgOiBvblJlbW92ZSA6IGxpc3RlbmVyID8gZDNfbm9vcCA6IHJlbW92ZUFsbDsKICB9CiAgdmFyIGQzX3NlbGVjdGlvbl9vbkZpbHRlcnMgPSBkMy5tYXAoewogICAgbW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCiAgICBtb3VzZWxlYXZlOiAibW91c2VvdXQiCiAgfSk7CiAgZDNfc2VsZWN0aW9uX29uRmlsdGVycy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKICAgIGlmICgib24iICsgayBpbiBkM19kb2N1bWVudCkgZDNfc2VsZWN0aW9uX29uRmlsdGVycy5yZW1vdmUoayk7CiAgfSk7CiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX29uTGlzdGVuZXIobGlzdGVuZXIsIGFyZ3VtZW50eikgewogICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIG8gPSBkMy5ldmVudDsKICAgICAgZDMuZXZlbnQgPSBlOwogICAgICBhcmd1bWVudHpbMF0gPSB0aGlzLl9fZGF0YV9fOwogICAgICB0cnkgewogICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50eik7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZDMuZXZlbnQgPSBvOwogICAgICB9CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fb25GaWx0ZXIobGlzdGVuZXIsIGFyZ3VtZW50eikgewogICAgdmFyIGwgPSBkM19zZWxlY3Rpb25fb25MaXN0ZW5lcihsaXN0ZW5lciwgYXJndW1lbnR6KTsKICAgIHJldHVybiBmdW5jdGlvbihlKSB7CiAgICAgIHZhciB0YXJnZXQgPSB0aGlzLCByZWxhdGVkID0gZS5yZWxhdGVkVGFyZ2V0OwogICAgICBpZiAoIXJlbGF0ZWQgfHwgcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0YXJnZXQpICYgOCkpIHsKICAgICAgICBsLmNhbGwodGFyZ2V0LCBlKTsKICAgICAgfQogICAgfTsKICB9CiAgdmFyIGQzX2V2ZW50X2RyYWdTZWxlY3QgPSAib25zZWxlY3RzdGFydCIgaW4gZDNfZG9jdW1lbnQgPyBudWxsIDogZDNfdmVuZG9yU3ltYm9sKGQzX2RvY3VtZW50RWxlbWVudC5zdHlsZSwgInVzZXJTZWxlY3QiKSwgZDNfZXZlbnRfZHJhZ0lkID0gMDsKICBmdW5jdGlvbiBkM19ldmVudF9kcmFnU3VwcHJlc3MoKSB7CiAgICB2YXIgbmFtZSA9ICIuZHJhZ3N1cHByZXNzLSIgKyArK2QzX2V2ZW50X2RyYWdJZCwgY2xpY2sgPSAiY2xpY2siICsgbmFtZSwgdyA9IGQzLnNlbGVjdChkM193aW5kb3cpLm9uKCJ0b3VjaG1vdmUiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCkub24oImRyYWdzdGFydCIgKyBuYW1lLCBkM19ldmVudFByZXZlbnREZWZhdWx0KS5vbigic2VsZWN0c3RhcnQiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCk7CiAgICBpZiAoZDNfZXZlbnRfZHJhZ1NlbGVjdCkgewogICAgICB2YXIgc3R5bGUgPSBkM19kb2N1bWVudEVsZW1lbnQuc3R5bGUsIHNlbGVjdCA9IHN0eWxlW2QzX2V2ZW50X2RyYWdTZWxlY3RdOwogICAgICBzdHlsZVtkM19ldmVudF9kcmFnU2VsZWN0XSA9ICJub25lIjsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbihzdXBwcmVzc0NsaWNrKSB7CiAgICAgIHcub24obmFtZSwgbnVsbCk7CiAgICAgIGlmIChkM19ldmVudF9kcmFnU2VsZWN0KSBzdHlsZVtkM19ldmVudF9kcmFnU2VsZWN0XSA9IHNlbGVjdDsKICAgICAgaWYgKHN1cHByZXNzQ2xpY2spIHsKICAgICAgICBmdW5jdGlvbiBvZmYoKSB7CiAgICAgICAgICB3Lm9uKGNsaWNrLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgdy5vbihjbGljaywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBvZmYoKTsKICAgICAgICB9LCB0cnVlKTsKICAgICAgICBzZXRUaW1lb3V0KG9mZiwgMCk7CiAgICAgIH0KICAgIH07CiAgfQogIGQzLm1vdXNlID0gZnVuY3Rpb24oY29udGFpbmVyKSB7CiAgICByZXR1cm4gZDNfbW91c2VQb2ludChjb250YWluZXIsIGQzX2V2ZW50U291cmNlKCkpOwogIH07CiAgdmFyIGQzX21vdXNlX2J1ZzQ0MDgzID0gL1dlYktpdC8udGVzdChkM193aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgPyAtMSA6IDA7CiAgZnVuY3Rpb24gZDNfbW91c2VQb2ludChjb250YWluZXIsIGUpIHsKICAgIGlmIChlLmNoYW5nZWRUb3VjaGVzKSBlID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgIHZhciBzdmcgPSBjb250YWluZXIub3duZXJTVkdFbGVtZW50IHx8IGNvbnRhaW5lcjsKICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHsKICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7CiAgICAgIGlmIChkM19tb3VzZV9idWc0NDA4MyA8IDAgJiYgKGQzX3dpbmRvdy5zY3JvbGxYIHx8IGQzX3dpbmRvdy5zY3JvbGxZKSkgewogICAgICAgIHN2ZyA9IGQzLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgic3ZnIikuc3R5bGUoewogICAgICAgICAgcG9zaXRpb246ICJhYnNvbHV0ZSIsCiAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICBsZWZ0OiAwLAogICAgICAgICAgbWFyZ2luOiAwLAogICAgICAgICAgcGFkZGluZzogMCwKICAgICAgICAgIGJvcmRlcjogIm5vbmUiCiAgICAgICAgfSwgImltcG9ydGFudCIpOwogICAgICAgIHZhciBjdG0gPSBzdmdbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7CiAgICAgICAgZDNfbW91c2VfYnVnNDQwODMgPSAhKGN0bS5mIHx8IGN0bS5lKTsKICAgICAgICBzdmcucmVtb3ZlKCk7CiAgICAgIH0KICAgICAgaWYgKGQzX21vdXNlX2J1ZzQ0MDgzKSBwb2ludC54ID0gZS5wYWdlWCwgcG9pbnQueSA9IGUucGFnZVk7IGVsc2UgcG9pbnQueCA9IGUuY2xpZW50WCwgCiAgICAgIHBvaW50LnkgPSBlLmNsaWVudFk7CiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKGNvbnRhaW5lci5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpOwogICAgICByZXR1cm4gWyBwb2ludC54LCBwb2ludC55IF07CiAgICB9CiAgICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHJldHVybiBbIGUuY2xpZW50WCAtIHJlY3QubGVmdCAtIGNvbnRhaW5lci5jbGllbnRMZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCAtIGNvbnRhaW5lci5jbGllbnRUb3AgXTsKICB9CiAgZDMudG91Y2ggPSBmdW5jdGlvbihjb250YWluZXIsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgaWRlbnRpZmllciA9IHRvdWNoZXMsIHRvdWNoZXMgPSBkM19ldmVudFNvdXJjZSgpLmNoYW5nZWRUb3VjaGVzOwogICAgaWYgKHRvdWNoZXMpIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcy5sZW5ndGgsIHRvdWNoOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7CiAgICAgICAgcmV0dXJuIGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCB0b3VjaCk7CiAgICAgIH0KICAgIH0KICB9OwogIGQzLmJlaGF2aW9yLmRyYWcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goZHJhZywgImRyYWciLCAiZHJhZ3N0YXJ0IiwgImRyYWdlbmQiKSwgb3JpZ2luID0gbnVsbCwgbW91c2Vkb3duID0gZHJhZ3N0YXJ0KGQzX25vb3AsIGQzLm1vdXNlLCBkM19iZWhhdmlvcl9kcmFnTW91c2VTdWJqZWN0LCAibW91c2Vtb3ZlIiwgIm1vdXNldXAiKSwgdG91Y2hzdGFydCA9IGRyYWdzdGFydChkM19iZWhhdmlvcl9kcmFnVG91Y2hJZCwgZDMudG91Y2gsIGQzX2JlaGF2aW9yX2RyYWdUb3VjaFN1YmplY3QsICJ0b3VjaG1vdmUiLCAidG91Y2hlbmQiKTsKICAgIGZ1bmN0aW9uIGRyYWcoKSB7CiAgICAgIHRoaXMub24oIm1vdXNlZG93bi5kcmFnIiwgbW91c2Vkb3duKS5vbigidG91Y2hzdGFydC5kcmFnIiwgdG91Y2hzdGFydCk7CiAgICB9CiAgICBmdW5jdGlvbiBkcmFnc3RhcnQoaWQsIHBvc2l0aW9uLCBzdWJqZWN0LCBtb3ZlLCBlbmQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB0aGF0ID0gdGhpcywgdGFyZ2V0ID0gZDMuZXZlbnQudGFyZ2V0LCBwYXJlbnQgPSB0aGF0LnBhcmVudE5vZGUsIGRpc3BhdGNoID0gZXZlbnQub2YodGhhdCwgYXJndW1lbnRzKSwgZHJhZ2dlZCA9IDAsIGRyYWdJZCA9IGlkKCksIGRyYWdOYW1lID0gIi5kcmFnIiArIChkcmFnSWQgPT0gbnVsbCA/ICIiIDogIi0iICsgZHJhZ0lkKSwgZHJhZ09mZnNldCwgZHJhZ1N1YmplY3QgPSBkMy5zZWxlY3Qoc3ViamVjdCgpKS5vbihtb3ZlICsgZHJhZ05hbWUsIG1vdmVkKS5vbihlbmQgKyBkcmFnTmFtZSwgZW5kZWQpLCBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcygpLCBwb3NpdGlvbjAgPSBwb3NpdGlvbihwYXJlbnQsIGRyYWdJZCk7CiAgICAgICAgaWYgKG9yaWdpbikgewogICAgICAgICAgZHJhZ09mZnNldCA9IG9yaWdpbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgZHJhZ09mZnNldCA9IFsgZHJhZ09mZnNldC54IC0gcG9zaXRpb24wWzBdLCBkcmFnT2Zmc2V0LnkgLSBwb3NpdGlvbjBbMV0gXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZHJhZ09mZnNldCA9IFsgMCwgMCBdOwogICAgICAgIH0KICAgICAgICBkaXNwYXRjaCh7CiAgICAgICAgICB0eXBlOiAiZHJhZ3N0YXJ0IgogICAgICAgIH0pOwogICAgICAgIGZ1bmN0aW9uIG1vdmVkKCkgewogICAgICAgICAgdmFyIHBvc2l0aW9uMSA9IHBvc2l0aW9uKHBhcmVudCwgZHJhZ0lkKSwgZHgsIGR5OwogICAgICAgICAgaWYgKCFwb3NpdGlvbjEpIHJldHVybjsKICAgICAgICAgIGR4ID0gcG9zaXRpb24xWzBdIC0gcG9zaXRpb24wWzBdOwogICAgICAgICAgZHkgPSBwb3NpdGlvbjFbMV0gLSBwb3NpdGlvbjBbMV07CiAgICAgICAgICBkcmFnZ2VkIHw9IGR4IHwgZHk7CiAgICAgICAgICBwb3NpdGlvbjAgPSBwb3NpdGlvbjE7CiAgICAgICAgICBkaXNwYXRjaCh7CiAgICAgICAgICAgIHR5cGU6ICJkcmFnIiwKICAgICAgICAgICAgeDogcG9zaXRpb24xWzBdICsgZHJhZ09mZnNldFswXSwKICAgICAgICAgICAgeTogcG9zaXRpb24xWzFdICsgZHJhZ09mZnNldFsxXSwKICAgICAgICAgICAgZHg6IGR4LAogICAgICAgICAgICBkeTogZHkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBlbmRlZCgpIHsKICAgICAgICAgIGlmICghcG9zaXRpb24ocGFyZW50LCBkcmFnSWQpKSByZXR1cm47CiAgICAgICAgICBkcmFnU3ViamVjdC5vbihtb3ZlICsgZHJhZ05hbWUsIG51bGwpLm9uKGVuZCArIGRyYWdOYW1lLCBudWxsKTsKICAgICAgICAgIGRyYWdSZXN0b3JlKGRyYWdnZWQgJiYgZDMuZXZlbnQudGFyZ2V0ID09PSB0YXJnZXQpOwogICAgICAgICAgZGlzcGF0Y2goewogICAgICAgICAgICB0eXBlOiAiZHJhZ2VuZCIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGRyYWcub3JpZ2luID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmlnaW47CiAgICAgIG9yaWdpbiA9IHg7CiAgICAgIHJldHVybiBkcmFnOwogICAgfTsKICAgIHJldHVybiBkMy5yZWJpbmQoZHJhZywgZXZlbnQsICJvbiIpOwogIH07CiAgZnVuY3Rpb24gZDNfYmVoYXZpb3JfZHJhZ1RvdWNoSWQoKSB7CiAgICByZXR1cm4gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcjsKICB9CiAgZnVuY3Rpb24gZDNfYmVoYXZpb3JfZHJhZ1RvdWNoU3ViamVjdCgpIHsKICAgIHJldHVybiBkMy5ldmVudC50YXJnZXQ7CiAgfQogIGZ1bmN0aW9uIGQzX2JlaGF2aW9yX2RyYWdNb3VzZVN1YmplY3QoKSB7CiAgICByZXR1cm4gZDNfd2luZG93OwogIH0KICBkMy50b3VjaGVzID0gZnVuY3Rpb24oY29udGFpbmVyLCB0b3VjaGVzKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHRvdWNoZXMgPSBkM19ldmVudFNvdXJjZSgpLnRvdWNoZXM7CiAgICByZXR1cm4gdG91Y2hlcyA/IGQzX2FycmF5KHRvdWNoZXMpLm1hcChmdW5jdGlvbih0b3VjaCkgewogICAgICB2YXIgcG9pbnQgPSBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgdG91Y2gpOwogICAgICBwb2ludC5pZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjsKICAgICAgcmV0dXJuIHBvaW50OwogICAgfSkgOiBbXTsKICB9OwogIHZhciDPgCA9IE1hdGguUEksIM+EID0gMiAqIM+ALCBoYWxmz4AgPSDPgCAvIDIsIM61ID0gMWUtNiwgzrUyID0gzrUgKiDOtSwgZDNfcmFkaWFucyA9IM+AIC8gMTgwLCBkM19kZWdyZWVzID0gMTgwIC8gz4A7CiAgZnVuY3Rpb24gZDNfc2duKHgpIHsKICAgIHJldHVybiB4ID4gMCA/IDEgOiB4IDwgMCA/IC0xIDogMDsKICB9CiAgZnVuY3Rpb24gZDNfY3Jvc3MyZChhLCBiLCBjKSB7CiAgICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChjWzFdIC0gYVsxXSkgLSAoYlsxXSAtIGFbMV0pICogKGNbMF0gLSBhWzBdKTsKICB9CiAgZnVuY3Rpb24gZDNfYWNvcyh4KSB7CiAgICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gz4AgOiBNYXRoLmFjb3MoeCk7CiAgfQogIGZ1bmN0aW9uIGQzX2FzaW4oeCkgewogICAgcmV0dXJuIHggPiAxID8gaGFsZs+AIDogeCA8IC0xID8gLWhhbGbPgCA6IE1hdGguYXNpbih4KTsKICB9CiAgZnVuY3Rpb24gZDNfc2luaCh4KSB7CiAgICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjsKICB9CiAgZnVuY3Rpb24gZDNfY29zaCh4KSB7CiAgICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsKICB9CiAgZnVuY3Rpb24gZDNfdGFuaCh4KSB7CiAgICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTsKICB9CiAgZnVuY3Rpb24gZDNfaGF2ZXJzaW4oeCkgewogICAgcmV0dXJuICh4ID0gTWF0aC5zaW4oeCAvIDIpKSAqIHg7CiAgfQogIHZhciDPgSA9IE1hdGguU1FSVDIsIM+BMiA9IDIsIM+BNCA9IDQ7CiAgZDMuaW50ZXJwb2xhdGVab29tID0gZnVuY3Rpb24ocDAsIHAxKSB7CiAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLCB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl07CiAgICB2YXIgZHggPSB1eDEgLSB1eDAsIGR5ID0gdXkxIC0gdXkwLCBkMiA9IGR4ICogZHggKyBkeSAqIGR5LCBkMSA9IE1hdGguc3FydChkMiksIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgz4E0ICogZDIpIC8gKDIgKiB3MCAqIM+BMiAqIGQxKSwgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSDPgTQgKiBkMikgLyAoMiAqIHcxICogz4EyICogZDEpLCByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKSwgZHIgPSByMSAtIHIwLCBTID0gKGRyIHx8IE1hdGgubG9nKHcxIC8gdzApKSAvIM+BOwogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGUodCkgewogICAgICB2YXIgcyA9IHQgKiBTOwogICAgICBpZiAoZHIpIHsKICAgICAgICB2YXIgY29zaHIwID0gZDNfY29zaChyMCksIHUgPSB3MCAvICjPgTIgKiBkMSkgKiAoY29zaHIwICogZDNfdGFuaCjPgSAqIHMgKyByMCkgLSBkM19zaW5oKHIwKSk7CiAgICAgICAgcmV0dXJuIFsgdXgwICsgdSAqIGR4LCB1eTAgKyB1ICogZHksIHcwICogY29zaHIwIC8gZDNfY29zaCjPgSAqIHMgKyByMCkgXTsKICAgICAgfQogICAgICByZXR1cm4gWyB1eDAgKyB0ICogZHgsIHV5MCArIHQgKiBkeSwgdzAgKiBNYXRoLmV4cCjPgSAqIHMpIF07CiAgICB9CiAgICBpbnRlcnBvbGF0ZS5kdXJhdGlvbiA9IFMgKiAxZTM7CiAgICByZXR1cm4gaW50ZXJwb2xhdGU7CiAgfTsKICBkMy5iZWhhdmlvci56b29tID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdmlldyA9IHsKICAgICAgeDogMCwKICAgICAgeTogMCwKICAgICAgazogMQogICAgfSwgdHJhbnNsYXRlMCwgY2VudGVyMCwgY2VudGVyLCBzaXplID0gWyA5NjAsIDUwMCBdLCBzY2FsZUV4dGVudCA9IGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSwgbW91c2Vkb3duID0gIm1vdXNlZG93bi56b29tIiwgbW91c2Vtb3ZlID0gIm1vdXNlbW92ZS56b29tIiwgbW91c2V1cCA9ICJtb3VzZXVwLnpvb20iLCBtb3VzZXdoZWVsVGltZXIsIHRvdWNoc3RhcnQgPSAidG91Y2hzdGFydC56b29tIiwgdG91Y2h0aW1lLCBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goem9vbSwgInpvb21zdGFydCIsICJ6b29tIiwgInpvb21lbmQiKSwgeDAsIHgxLCB5MCwgeTE7CiAgICBmdW5jdGlvbiB6b29tKGcpIHsKICAgICAgZy5vbihtb3VzZWRvd24sIG1vdXNlZG93bmVkKS5vbihkM19iZWhhdmlvcl96b29tV2hlZWwgKyAiLnpvb20iLCBtb3VzZXdoZWVsZWQpLm9uKCJkYmxjbGljay56b29tIiwgZGJsY2xpY2tlZCkub24odG91Y2hzdGFydCwgdG91Y2hzdGFydGVkKTsKICAgIH0KICAgIHpvb20uZXZlbnQgPSBmdW5jdGlvbihnKSB7CiAgICAgIGcuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZGlzcGF0Y2ggPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpLCB2aWV3MSA9IHZpZXc7CiAgICAgICAgaWYgKGQzX3RyYW5zaXRpb25Jbmhlcml0SWQpIHsKICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuem9vbSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2aWV3ID0gdGhpcy5fX2NoYXJ0X18gfHwgewogICAgICAgICAgICAgIHg6IDAsCiAgICAgICAgICAgICAgeTogMCwKICAgICAgICAgICAgICBrOiAxCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTsKICAgICAgICAgIH0pLnR3ZWVuKCJ6b29tOnpvb20iLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGR4ID0gc2l6ZVswXSwgZHkgPSBzaXplWzFdLCBjeCA9IGR4IC8gMiwgY3kgPSBkeSAvIDIsIGkgPSBkMy5pbnRlcnBvbGF0ZVpvb20oWyAoY3ggLSB2aWV3LngpIC8gdmlldy5rLCAoY3kgLSB2aWV3LnkpIC8gdmlldy5rLCBkeCAvIHZpZXcuayBdLCBbIChjeCAtIHZpZXcxLngpIC8gdmlldzEuaywgKGN5IC0gdmlldzEueSkgLyB2aWV3MS5rLCBkeCAvIHZpZXcxLmsgXSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgdmFyIGwgPSBpKHQpLCBrID0gZHggLyBsWzJdOwogICAgICAgICAgICAgIHRoaXMuX19jaGFydF9fID0gdmlldyA9IHsKICAgICAgICAgICAgICAgIHg6IGN4IC0gbFswXSAqIGssCiAgICAgICAgICAgICAgICB5OiBjeSAtIGxbMV0gKiBrLAogICAgICAgICAgICAgICAgazogawogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgem9vbWVkKGRpc3BhdGNoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pLmVhY2goImVuZC56b29tIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fX2NoYXJ0X18gPSB2aWV3OwogICAgICAgICAgem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpOwogICAgICAgICAgem9vbWVkKGRpc3BhdGNoKTsKICAgICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICB6b29tLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyB2aWV3LngsIHZpZXcueSBdOwogICAgICB2aWV3ID0gewogICAgICAgIHg6ICtfWzBdLAogICAgICAgIHk6ICtfWzFdLAogICAgICAgIGs6IHZpZXcuawogICAgICB9OwogICAgICByZXNjYWxlKCk7CiAgICAgIHJldHVybiB6b29tOwogICAgfTsKICAgIHpvb20uc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZpZXcuazsKICAgICAgdmlldyA9IHsKICAgICAgICB4OiB2aWV3LngsCiAgICAgICAgeTogdmlldy55LAogICAgICAgIGs6ICtfCiAgICAgIH07CiAgICAgIHJlc2NhbGUoKTsKICAgICAgcmV0dXJuIHpvb207CiAgICB9OwogICAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2NhbGVFeHRlbnQ7CiAgICAgIHNjYWxlRXh0ZW50ID0gXyA9PSBudWxsID8gZDNfYmVoYXZpb3Jfem9vbUluZmluaXR5IDogWyArX1swXSwgK19bMV0gXTsKICAgICAgcmV0dXJuIHpvb207CiAgICB9OwogICAgem9vbS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNlbnRlcjsKICAgICAgY2VudGVyID0gXyAmJiBbICtfWzBdLCArX1sxXSBdOwogICAgICByZXR1cm4gem9vbTsKICAgIH07CiAgICB6b29tLnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICAgIHNpemUgPSBfICYmIFsgK19bMF0sICtfWzFdIF07CiAgICAgIHJldHVybiB6b29tOwogICAgfTsKICAgIHpvb20ueCA9IGZ1bmN0aW9uKHopIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7CiAgICAgIHgxID0gejsKICAgICAgeDAgPSB6LmNvcHkoKTsKICAgICAgdmlldyA9IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgazogMQogICAgICB9OwogICAgICByZXR1cm4gem9vbTsKICAgIH07CiAgICB6b29tLnkgPSBmdW5jdGlvbih6KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxOwogICAgICB5MSA9IHo7CiAgICAgIHkwID0gei5jb3B5KCk7CiAgICAgIHZpZXcgPSB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIGs6IDEKICAgICAgfTsKICAgICAgcmV0dXJuIHpvb207CiAgICB9OwogICAgZnVuY3Rpb24gbG9jYXRpb24ocCkgewogICAgICByZXR1cm4gWyAocFswXSAtIHZpZXcueCkgLyB2aWV3LmssIChwWzFdIC0gdmlldy55KSAvIHZpZXcuayBdOwogICAgfQogICAgZnVuY3Rpb24gcG9pbnQobCkgewogICAgICByZXR1cm4gWyBsWzBdICogdmlldy5rICsgdmlldy54LCBsWzFdICogdmlldy5rICsgdmlldy55IF07CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZVRvKHMpIHsKICAgICAgdmlldy5rID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBzKSk7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2xhdGVUbyhwLCBsKSB7CiAgICAgIGwgPSBwb2ludChsKTsKICAgICAgdmlldy54ICs9IHBbMF0gLSBsWzBdOwogICAgICB2aWV3LnkgKz0gcFsxXSAtIGxbMV07CiAgICB9CiAgICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgICBpZiAoeDEpIHgxLmRvbWFpbih4MC5yYW5nZSgpLm1hcChmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuICh4IC0gdmlldy54KSAvIHZpZXcuazsKICAgICAgfSkubWFwKHgwLmludmVydCkpOwogICAgICBpZiAoeTEpIHkxLmRvbWFpbih5MC5yYW5nZSgpLm1hcChmdW5jdGlvbih5KSB7CiAgICAgICAgcmV0dXJuICh5IC0gdmlldy55KSAvIHZpZXcuazsKICAgICAgfSkubWFwKHkwLmludmVydCkpOwogICAgfQogICAgZnVuY3Rpb24gem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpIHsKICAgICAgZGlzcGF0Y2goewogICAgICAgIHR5cGU6ICJ6b29tc3RhcnQiCiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gem9vbWVkKGRpc3BhdGNoKSB7CiAgICAgIHJlc2NhbGUoKTsKICAgICAgZGlzcGF0Y2goewogICAgICAgIHR5cGU6ICJ6b29tIiwKICAgICAgICBzY2FsZTogdmlldy5rLAogICAgICAgIHRyYW5zbGF0ZTogWyB2aWV3LngsIHZpZXcueSBdCiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gem9vbWVuZGVkKGRpc3BhdGNoKSB7CiAgICAgIGRpc3BhdGNoKHsKICAgICAgICB0eXBlOiAiem9vbWVuZCIKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHsKICAgICAgdmFyIHRoYXQgPSB0aGlzLCB0YXJnZXQgPSBkMy5ldmVudC50YXJnZXQsIGRpc3BhdGNoID0gZXZlbnQub2YodGhhdCwgYXJndW1lbnRzKSwgZHJhZ2dlZCA9IDAsIHN1YmplY3QgPSBkMy5zZWxlY3QoZDNfd2luZG93KS5vbihtb3VzZW1vdmUsIG1vdmVkKS5vbihtb3VzZXVwLCBlbmRlZCksIGxvY2F0aW9uMCA9IGxvY2F0aW9uKGQzLm1vdXNlKHRoYXQpKSwgZHJhZ1Jlc3RvcmUgPSBkM19ldmVudF9kcmFnU3VwcHJlc3MoKTsKICAgICAgZDNfc2VsZWN0aW9uX2ludGVycnVwdC5jYWxsKHRoYXQpOwogICAgICB6b29tc3RhcnRlZChkaXNwYXRjaCk7CiAgICAgIGZ1bmN0aW9uIG1vdmVkKCkgewogICAgICAgIGRyYWdnZWQgPSAxOwogICAgICAgIHRyYW5zbGF0ZVRvKGQzLm1vdXNlKHRoYXQpLCBsb2NhdGlvbjApOwogICAgICAgIHpvb21lZChkaXNwYXRjaCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZW5kZWQoKSB7CiAgICAgICAgc3ViamVjdC5vbihtb3VzZW1vdmUsIG51bGwpLm9uKG1vdXNldXAsIG51bGwpOwogICAgICAgIGRyYWdSZXN0b3JlKGRyYWdnZWQgJiYgZDMuZXZlbnQudGFyZ2V0ID09PSB0YXJnZXQpOwogICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZCgpIHsKICAgICAgdmFyIHRoYXQgPSB0aGlzLCBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoYXQsIGFyZ3VtZW50cyksIGxvY2F0aW9uczAgPSB7fSwgZGlzdGFuY2UwID0gMCwgc2NhbGUwLCB6b29tTmFtZSA9ICIuem9vbS0iICsgZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllciwgdG91Y2htb3ZlID0gInRvdWNobW92ZSIgKyB6b29tTmFtZSwgdG91Y2hlbmQgPSAidG91Y2hlbmQiICsgem9vbU5hbWUsIHRhcmdldHMgPSBbXSwgc3ViamVjdCA9IGQzLnNlbGVjdCh0aGF0KSwgZHJhZ1Jlc3RvcmUgPSBkM19ldmVudF9kcmFnU3VwcHJlc3MoKTsKICAgICAgZDNfc2VsZWN0aW9uX2ludGVycnVwdC5jYWxsKHRoYXQpOwogICAgICBzdGFydGVkKCk7CiAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTsKICAgICAgc3ViamVjdC5vbihtb3VzZWRvd24sIG51bGwpLm9uKHRvdWNoc3RhcnQsIHN0YXJ0ZWQpOwogICAgICBmdW5jdGlvbiByZWxvY2F0ZSgpIHsKICAgICAgICB2YXIgdG91Y2hlcyA9IGQzLnRvdWNoZXModGhhdCk7CiAgICAgICAgc2NhbGUwID0gdmlldy5rOwogICAgICAgIHRvdWNoZXMuZm9yRWFjaChmdW5jdGlvbih0KSB7CiAgICAgICAgICBpZiAodC5pZGVudGlmaWVyIGluIGxvY2F0aW9uczApIGxvY2F0aW9uczBbdC5pZGVudGlmaWVyXSA9IGxvY2F0aW9uKHQpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0b3VjaGVzOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHN0YXJ0ZWQoKSB7CiAgICAgICAgdmFyIHRhcmdldCA9IGQzLmV2ZW50LnRhcmdldDsKICAgICAgICBkMy5zZWxlY3QodGFyZ2V0KS5vbih0b3VjaG1vdmUsIG1vdmVkKS5vbih0b3VjaGVuZCwgZW5kZWQpOwogICAgICAgIHRhcmdldHMucHVzaCh0YXJnZXQpOwogICAgICAgIHZhciBjaGFuZ2VkID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBjaGFuZ2VkLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgbG9jYXRpb25zMFtjaGFuZ2VkW2ldLmlkZW50aWZpZXJdID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIHRvdWNoZXMgPSByZWxvY2F0ZSgpLCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGlmICh0b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgaWYgKG5vdyAtIHRvdWNodGltZSA8IDUwMCkgewogICAgICAgICAgICB2YXIgcCA9IHRvdWNoZXNbMF0sIGwgPSBsb2NhdGlvbnMwW3AuaWRlbnRpZmllcl07CiAgICAgICAgICAgIHNjYWxlVG8odmlldy5rICogMik7CiAgICAgICAgICAgIHRyYW5zbGF0ZVRvKHAsIGwpOwogICAgICAgICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHpvb21lZChkaXNwYXRjaCk7CiAgICAgICAgICB9CiAgICAgICAgICB0b3VjaHRpbWUgPSBub3c7CiAgICAgICAgfSBlbHNlIGlmICh0b3VjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIHZhciBwID0gdG91Y2hlc1swXSwgcSA9IHRvdWNoZXNbMV0sIGR4ID0gcFswXSAtIHFbMF0sIGR5ID0gcFsxXSAtIHFbMV07CiAgICAgICAgICBkaXN0YW5jZTAgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbW92ZWQoKSB7CiAgICAgICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoYXQpLCBwMCwgbDAsIHAxLCBsMTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMubGVuZ3RoOyBpIDwgbjsgKytpLCBsMSA9IG51bGwpIHsKICAgICAgICAgIHAxID0gdG91Y2hlc1tpXTsKICAgICAgICAgIGlmIChsMSA9IGxvY2F0aW9uczBbcDEuaWRlbnRpZmllcl0pIHsKICAgICAgICAgICAgaWYgKGwwKSBicmVhazsKICAgICAgICAgICAgcDAgPSBwMSwgbDAgPSBsMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGwxKSB7CiAgICAgICAgICB2YXIgZGlzdGFuY2UxID0gKGRpc3RhbmNlMSA9IHAxWzBdIC0gcDBbMF0pICogZGlzdGFuY2UxICsgKGRpc3RhbmNlMSA9IHAxWzFdIC0gcDBbMV0pICogZGlzdGFuY2UxLCBzY2FsZTEgPSBkaXN0YW5jZTAgJiYgTWF0aC5zcXJ0KGRpc3RhbmNlMSAvIGRpc3RhbmNlMCk7CiAgICAgICAgICBwMCA9IFsgKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMiBdOwogICAgICAgICAgbDAgPSBbIChsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDIgXTsKICAgICAgICAgIHNjYWxlVG8oc2NhbGUxICogc2NhbGUwKTsKICAgICAgICB9CiAgICAgICAgdG91Y2h0aW1lID0gbnVsbDsKICAgICAgICB0cmFuc2xhdGVUbyhwMCwgbDApOwogICAgICAgIHpvb21lZChkaXNwYXRjaCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZW5kZWQoKSB7CiAgICAgICAgaWYgKGQzLmV2ZW50LnRvdWNoZXMubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgY2hhbmdlZCA9IGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzOwogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBjaGFuZ2VkLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBkZWxldGUgbG9jYXRpb25zMFtjaGFuZ2VkW2ldLmlkZW50aWZpZXJdOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh2YXIgaWRlbnRpZmllciBpbiBsb2NhdGlvbnMwKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIHJlbG9jYXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGQzLnNlbGVjdEFsbCh0YXJnZXRzKS5vbih6b29tTmFtZSwgbnVsbCk7CiAgICAgICAgc3ViamVjdC5vbihtb3VzZWRvd24sIG1vdXNlZG93bmVkKS5vbih0b3VjaHN0YXJ0LCB0b3VjaHN0YXJ0ZWQpOwogICAgICAgIGRyYWdSZXN0b3JlKCk7CiAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbW91c2V3aGVlbGVkKCkgewogICAgICB2YXIgZGlzcGF0Y2ggPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAobW91c2V3aGVlbFRpbWVyKSBjbGVhclRpbWVvdXQobW91c2V3aGVlbFRpbWVyKTsgZWxzZSB0cmFuc2xhdGUwID0gbG9jYXRpb24oY2VudGVyMCA9IGNlbnRlciB8fCBkMy5tb3VzZSh0aGlzKSksIAogICAgICBkM19zZWxlY3Rpb25faW50ZXJydXB0LmNhbGwodGhpcyksIHpvb21zdGFydGVkKGRpc3BhdGNoKTsKICAgICAgbW91c2V3aGVlbFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBtb3VzZXdoZWVsVGltZXIgPSBudWxsOwogICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7CiAgICAgIH0sIDUwKTsKICAgICAgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCgpOwogICAgICBzY2FsZVRvKE1hdGgucG93KDIsIGQzX2JlaGF2aW9yX3pvb21EZWx0YSgpICogLjAwMikgKiB2aWV3LmspOwogICAgICB0cmFuc2xhdGVUbyhjZW50ZXIwLCB0cmFuc2xhdGUwKTsKICAgICAgem9vbWVkKGRpc3BhdGNoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRibGNsaWNrZWQoKSB7CiAgICAgIHZhciBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cyksIHAgPSBkMy5tb3VzZSh0aGlzKSwgbCA9IGxvY2F0aW9uKHApLCBrID0gTWF0aC5sb2codmlldy5rKSAvIE1hdGguTE4yOwogICAgICB6b29tc3RhcnRlZChkaXNwYXRjaCk7CiAgICAgIHNjYWxlVG8oTWF0aC5wb3coMiwgZDMuZXZlbnQuc2hpZnRLZXkgPyBNYXRoLmNlaWwoaykgLSAxIDogTWF0aC5mbG9vcihrKSArIDEpKTsKICAgICAgdHJhbnNsYXRlVG8ocCwgbCk7CiAgICAgIHpvb21lZChkaXNwYXRjaCk7CiAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7CiAgICB9CiAgICByZXR1cm4gZDMucmViaW5kKHpvb20sIGV2ZW50LCAib24iKTsKICB9OwogIHZhciBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgPSBbIDAsIEluZmluaXR5IF07CiAgdmFyIGQzX2JlaGF2aW9yX3pvb21EZWx0YSwgZDNfYmVoYXZpb3Jfem9vbVdoZWVsID0gIm9ud2hlZWwiIGluIGQzX2RvY3VtZW50ID8gKGQzX2JlaGF2aW9yX3pvb21EZWx0YSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIC1kMy5ldmVudC5kZWx0YVkgKiAoZDMuZXZlbnQuZGVsdGFNb2RlID8gMTIwIDogMSk7CiAgfSwgIndoZWVsIikgOiAib25tb3VzZXdoZWVsIiBpbiBkM19kb2N1bWVudCA/IChkM19iZWhhdmlvcl96b29tRGVsdGEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkMy5ldmVudC53aGVlbERlbHRhOwogIH0sICJtb3VzZXdoZWVsIikgOiAoZDNfYmVoYXZpb3Jfem9vbURlbHRhID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gLWQzLmV2ZW50LmRldGFpbDsKICB9LCAiTW96TW91c2VQaXhlbFNjcm9sbCIpOwogIGQzLmNvbG9yID0gZDNfY29sb3I7CiAgZnVuY3Rpb24gZDNfY29sb3IoKSB7fQogIGQzX2NvbG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmdiKCkgKyAiIjsKICB9OwogIGQzLmhzbCA9IGQzX2hzbDsKICBmdW5jdGlvbiBkM19oc2woaCwgcywgbCkgewogICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkM19oc2wgPyB2b2lkICh0aGlzLmggPSAraCwgdGhpcy5zID0gK3MsIHRoaXMubCA9ICtsKSA6IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gaCBpbnN0YW5jZW9mIGQzX2hzbCA/IG5ldyBkM19oc2woaC5oLCBoLnMsIGgubCkgOiBkM19yZ2JfcGFyc2UoIiIgKyBoLCBkM19yZ2JfaHNsLCBkM19oc2wpIDogbmV3IGQzX2hzbChoLCBzLCBsKTsKICB9CiAgdmFyIGQzX2hzbFByb3RvdHlwZSA9IGQzX2hzbC5wcm90b3R5cGUgPSBuZXcgZDNfY29sb3IoKTsKICBkM19oc2xQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7CiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7CiAgICByZXR1cm4gbmV3IGQzX2hzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sIC8gayk7CiAgfTsKICBkM19oc2xQcm90b3R5cGUuZGFya2VyID0gZnVuY3Rpb24oaykgewogICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpOwogICAgcmV0dXJuIG5ldyBkM19oc2wodGhpcy5oLCB0aGlzLnMsIGsgKiB0aGlzLmwpOwogIH07CiAgZDNfaHNsUHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2hzbF9yZ2IodGhpcy5oLCB0aGlzLnMsIHRoaXMubCk7CiAgfTsKICBmdW5jdGlvbiBkM19oc2xfcmdiKGgsIHMsIGwpIHsKICAgIHZhciBtMSwgbTI7CiAgICBoID0gaXNOYU4oaCkgPyAwIDogKGggJT0gMzYwKSA8IDAgPyBoICsgMzYwIDogaDsKICAgIHMgPSBpc05hTihzKSA/IDAgOiBzIDwgMCA/IDAgOiBzID4gMSA/IDEgOiBzOwogICAgbCA9IGwgPCAwID8gMCA6IGwgPiAxID8gMSA6IGw7CiAgICBtMiA9IGwgPD0gLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7CiAgICBtMSA9IDIgKiBsIC0gbTI7CiAgICBmdW5jdGlvbiB2KGgpIHsKICAgICAgaWYgKGggPiAzNjApIGggLT0gMzYwOyBlbHNlIGlmIChoIDwgMCkgaCArPSAzNjA7CiAgICAgIGlmIChoIDwgNjApIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggLyA2MDsKICAgICAgaWYgKGggPCAxODApIHJldHVybiBtMjsKICAgICAgaWYgKGggPCAyNDApIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwOwogICAgICByZXR1cm4gbTE7CiAgICB9CiAgICBmdW5jdGlvbiB2dihoKSB7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHYoaCkgKiAyNTUpOwogICAgfQogICAgcmV0dXJuIG5ldyBkM19yZ2IodnYoaCArIDEyMCksIHZ2KGgpLCB2dihoIC0gMTIwKSk7CiAgfQogIGQzLmhjbCA9IGQzX2hjbDsKICBmdW5jdGlvbiBkM19oY2woaCwgYywgbCkgewogICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkM19oY2wgPyB2b2lkICh0aGlzLmggPSAraCwgdGhpcy5jID0gK2MsIHRoaXMubCA9ICtsKSA6IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gaCBpbnN0YW5jZW9mIGQzX2hjbCA/IG5ldyBkM19oY2woaC5oLCBoLmMsIGgubCkgOiBoIGluc3RhbmNlb2YgZDNfbGFiID8gZDNfbGFiX2hjbChoLmwsIGguYSwgaC5iKSA6IGQzX2xhYl9oY2woKGggPSBkM19yZ2JfbGFiKChoID0gZDMucmdiKGgpKS5yLCBoLmcsIGguYikpLmwsIGguYSwgaC5iKSA6IG5ldyBkM19oY2woaCwgYywgbCk7CiAgfQogIHZhciBkM19oY2xQcm90b3R5cGUgPSBkM19oY2wucHJvdG90eXBlID0gbmV3IGQzX2NvbG9yKCk7CiAgZDNfaGNsUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykgewogICAgcmV0dXJuIG5ldyBkM19oY2wodGhpcy5oLCB0aGlzLmMsIE1hdGgubWluKDEwMCwgdGhpcy5sICsgZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSkpOwogIH07CiAgZDNfaGNsUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgZDNfaGNsKHRoaXMuaCwgdGhpcy5jLCBNYXRoLm1heCgwLCB0aGlzLmwgLSBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSk7CiAgfTsKICBkM19oY2xQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfaGNsX2xhYih0aGlzLmgsIHRoaXMuYywgdGhpcy5sKS5yZ2IoKTsKICB9OwogIGZ1bmN0aW9uIGQzX2hjbF9sYWIoaCwgYywgbCkgewogICAgaWYgKGlzTmFOKGgpKSBoID0gMDsKICAgIGlmIChpc05hTihjKSkgYyA9IDA7CiAgICByZXR1cm4gbmV3IGQzX2xhYihsLCBNYXRoLmNvcyhoICo9IGQzX3JhZGlhbnMpICogYywgTWF0aC5zaW4oaCkgKiBjKTsKICB9CiAgZDMubGFiID0gZDNfbGFiOwogIGZ1bmN0aW9uIGQzX2xhYihsLCBhLCBiKSB7CiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGQzX2xhYiA/IHZvaWQgKHRoaXMubCA9ICtsLCB0aGlzLmEgPSArYSwgdGhpcy5iID0gK2IpIDogYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBsIGluc3RhbmNlb2YgZDNfbGFiID8gbmV3IGQzX2xhYihsLmwsIGwuYSwgbC5iKSA6IGwgaW5zdGFuY2VvZiBkM19oY2wgPyBkM19oY2xfbGFiKGwubCwgbC5jLCBsLmgpIDogZDNfcmdiX2xhYigobCA9IGSM3O9WC4MBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LdtAAEAGfQLAqAc2wKgHYJUnH/Xbkng3OVF/KoAQBDob0gAAAQEICgCjXr4ATaW5jNzvVt2DAQBcKwAAXCsAAGj3KB/SxQgAJ60eEwgARQArTjbZQABABkjqwKgHYMCoBzYf9ZUnOVF/KtuSeDeAGADtuycAAAEBCAoATaW5AKNevTNfcmdiKGwpKS5yLCBsLmcsIGwuYikgOiBuZXcgZDNfbGFiKGwsIGEsIGIpOwogIH0KICB2YXIgZDNfbGFiX0sgPSAxODsKICB2YXIgZDNfbGFiX1ggPSAuOTUwNDcsIGQzX2xhYl9ZID0gMSwgZDNfbGFiX1ogPSAxLjA4ODgzOwogIHZhciBkM19sYWJQcm90b3R5cGUgPSBkM19sYWIucHJvdG90eXBlID0gbmV3IGQzX2NvbG9yKCk7CiAgZDNfbGFiUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykgewogICAgcmV0dXJuIG5ldyBkM19sYWIoTWF0aC5taW4oMTAwLCB0aGlzLmwgKyBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSwgdGhpcy5hLCB0aGlzLmIpOwogIH07CiAgZDNfbGFiUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgZDNfbGFiKE1hdGgubWF4KDAsIHRoaXMubCAtIGQzX2xhYl9LICogKGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSkpLCB0aGlzLmEsIHRoaXMuYik7CiAgfTsKICBkM19sYWJQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfbGFiX3JnYih0aGlzLmwsIHRoaXMuYSwgdGhpcy5iKTsKICB9OwogIGZ1bmN0aW9uIGQzX2xhYl9yZ2IobCwgYSwgYikgewogICAgdmFyIHkgPSAobCArIDE2KSAvIDExNiwgeCA9IHkgKyBhIC8gNTAwLCB6ID0geSAtIGIgLyAyMDA7CiAgICB4ID0gZDNfbGFiX3h5eih4KSAqIGQzX2xhYl9YOwogICAgeSA9IGQzX2xhYl94eXooeSkgKiBkM19sYWJfWTsKICAgIHogPSBkM19sYWJfeHl6KHopICogZDNfbGFiX1o7CiAgICByZXR1cm4gbmV3IGQzX3JnYihkM194eXpfcmdiKDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gLjQ5ODUzMTQgKiB6KSwgZDNfeHl6X3JnYigtLjk2OTI2NiAqIHggKyAxLjg3NjAxMDggKiB5ICsgLjA0MTU1NiAqIHopLCBkM194eXpfcmdiKC4wNTU2NDM0ICogeCAtIC4yMDQwMjU5ICogeSArIDEuMDU3MjI1MiAqIHopKTsKICB9CiAgZnVuY3Rpb24gZDNfbGFiX2hjbChsLCBhLCBiKSB7CiAgICByZXR1cm4gbCA+IDAgPyBuZXcgZDNfaGNsKE1hdGguYXRhbjIoYiwgYSkgKiBkM19kZWdyZWVzLCBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksIGwpIDogbmV3IGQzX2hjbChOYU4sIE5hTiwgbCk7CiAgfQogIGZ1bmN0aW9uIGQzX2xhYl94eXooeCkgewogICAgcmV0dXJuIHggPiAuMjA2ODkzMDM0ID8geCAqIHggKiB4IDogKHggLSA0IC8gMjkpIC8gNy43ODcwMzc7CiAgfQogIGZ1bmN0aW9uIGQzX3h5el9sYWIoeCkgewogICAgcmV0dXJuIHggPiAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogNy43ODcwMzcgKiB4ICsgNCAvIDI5OwogIH0KICBmdW5jdGlvbiBkM194eXpfcmdiKHIpIHsKICAgIHJldHVybiBNYXRoLnJvdW5kKDI1NSAqIChyIDw9IC4wMDMwNCA/IDEyLjkyICogciA6IDEuMDU1ICogTWF0aC5wb3cociwgMSAvIDIuNCkgLSAuMDU1KSk7CiAgfQogIGQzLnJnYiA9IGQzX3JnYjsKICBmdW5jdGlvbiBkM19yZ2IociwgZywgYikgewogICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkM19yZ2IgPyB2b2lkICh0aGlzLnIgPSB+fnIsIHRoaXMuZyA9IH5+ZywgdGhpcy5iID0gfn5iKSA6IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gciBpbnN0YW5jZW9mIGQzX3JnYiA/IG5ldyBkM19yZ2Ioci5yLCByLmcsIHIuYikgOiBkM19yZ2JfcGFyc2UoIiIgKyByLCBkM19yZ2IsIGQzX2hzbF9yZ2IpIDogbmV3IGQzX3JnYihyLCBnLCBiKTsKICB9CiAgZnVuY3Rpb24gZDNfcmdiTnVtYmVyKHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IGQzX3JnYih2YWx1ZSA+PiAxNiwgdmFsdWUgPj4gOCAmIDI1NSwgdmFsdWUgJiAyNTUpOwogIH0KICBmdW5jdGlvbiBkM19yZ2JTdHJpbmcodmFsdWUpIHsKICAgIHJldHVybiBkM19yZ2JOdW1iZXIodmFsdWUpICsgIiI7CiAgfQogIHZhciBkM19yZ2JQcm90b3R5cGUgPSBkM19yZ2IucHJvdG90eXBlID0gbmV3IGQzX2NvbG9yKCk7CiAgZDNfcmdiUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykgewogICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpOwogICAgdmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmIsIGkgPSAzMDsKICAgIGlmICghciAmJiAhZyAmJiAhYikgcmV0dXJuIG5ldyBkM19yZ2IoaSwgaSwgaSk7CiAgICBpZiAociAmJiByIDwgaSkgciA9IGk7CiAgICBpZiAoZyAmJiBnIDwgaSkgZyA9IGk7CiAgICBpZiAoYiAmJiBiIDwgaSkgYiA9IGk7CiAgICByZXR1cm4gbmV3IGQzX3JnYihNYXRoLm1pbigyNTUsIHIgLyBrKSwgTWF0aC5taW4oMjU1LCBnIC8gayksIE1hdGgubWluKDI1NSwgYiAvIGspKTsKICB9OwogIGQzX3JnYlByb3RvdHlwZS5kYXJrZXIgPSBmdW5jdGlvbihrKSB7CiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7CiAgICByZXR1cm4gbmV3IGQzX3JnYihrICogdGhpcy5yLCBrICogdGhpcy5nLCBrICogdGhpcy5iKTsKICB9OwogIGQzX3JnYlByb3RvdHlwZS5oc2wgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19yZ2JfaHNsKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpOwogIH07CiAgZDNfcmdiUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gIiMiICsgZDNfcmdiX2hleCh0aGlzLnIpICsgZDNfcmdiX2hleCh0aGlzLmcpICsgZDNfcmdiX2hleCh0aGlzLmIpOwogIH07CiAgZnVuY3Rpb24gZDNfcmdiX2hleCh2KSB7CiAgICByZXR1cm4gdiA8IDE2ID8gIjAiICsgTWF0aC5tYXgoMCwgdikudG9TdHJpbmcoMTYpIDogTWF0aC5taW4oMjU1LCB2KS50b1N0cmluZygxNik7CiAgfQogIGZ1bmN0aW9uIGQzX3JnYl9wYXJzZShmb3JtYXQsIHJnYiwgaHNsKSB7CiAgICB2YXIgciA9IDAsIGcgPSAwLCBiID0gMCwgbTEsIG0yLCBjb2xvcjsKICAgIG0xID0gLyhbYS16XSspXCgoLiopXCkvaS5leGVjKGZvcm1hdCk7CiAgICBpZiAobTEpIHsKICAgICAgbTIgPSBtMVsyXS5zcGxpdCgiLCIpOwogICAgICBzd2l0Y2ggKG0xWzFdKSB7CiAgICAgICBjYXNlICJoc2wiOgogICAgICAgIHsKICAgICAgICAgIHJldHVybiBoc2wocGFyc2VGbG9hdChtMlswXSksIHBhcnNlRmxvYXQobTJbMV0pIC8gMTAwLCBwYXJzZUZsb2F0KG0yWzJdKSAvIDEwMCk7CiAgICAgICAgfQoKICAgICAgIGNhc2UgInJnYiI6CiAgICAgICAgewogICAgICAgICAgcmV0dXJuIHJnYihkM19yZ2JfcGFyc2VOdW1iZXIobTJbMF0pLCBkM19yZ2JfcGFyc2VOdW1iZXIobTJbMV0pLCBkM19yZ2JfcGFyc2VOdW1iZXIobTJbMl0pKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChjb2xvciA9IGQzX3JnYl9uYW1lcy5nZXQoZm9ybWF0KSkgcmV0dXJuIHJnYihjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTsKICAgIGlmIChmb3JtYXQgIT0gbnVsbCAmJiBmb3JtYXQuY2hhckF0KDApID09PSAiIyIgJiYgIWlzTmFOKGNvbG9yID0gcGFyc2VJbnQoZm9ybWF0LnNsaWNlKDEpLCAxNikpKSB7CiAgICAgIGlmIChmb3JtYXQubGVuZ3RoID09PSA0KSB7CiAgICAgICAgciA9IChjb2xvciAmIDM4NDApID4+IDQ7CiAgICAgICAgciA9IHIgPj4gNCB8IHI7CiAgICAgICAgZyA9IGNvbG9yICYgMjQwOwogICAgICAgIGcgPSBnID4+IDQgfCBnOwogICAgICAgIGIgPSBjb2xvciAmIDE1OwogICAgICAgIGIgPSBiIDw8IDQgfCBiOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdC5sZW5ndGggPT09IDcpIHsKICAgICAgICByID0gKGNvbG9yICYgMTY3MTE2ODApID4+IDE2OwogICAgICAgIGcgPSAoY29sb3IgJiA2NTI4MCkgPj4gODsKICAgICAgICBiID0gY29sb3IgJiAyNTU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZ2IociwgZywgYik7CiAgfQogIGZ1bmN0aW9uIGQzX3JnYl9oc2wociwgZywgYikgewogICAgdmFyIG1pbiA9IE1hdGgubWluKHIgLz0gMjU1LCBnIC89IDI1NSwgYiAvPSAyNTUpLCBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwgZCA9IG1heCAtIG1pbiwgaCwgcywgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgIGlmIChkKSB7CiAgICAgIHMgPSBsIDwgLjUgPyBkIC8gKG1heCArIG1pbikgOiBkIC8gKDIgLSBtYXggLSBtaW4pOwogICAgICBpZiAociA9PSBtYXgpIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgZWxzZSBpZiAoZyA9PSBtYXgpIGggPSAoYiAtIHIpIC8gZCArIDI7IGVsc2UgaCA9IChyIC0gZykgLyBkICsgNDsKICAgICAgaCAqPSA2MDsKICAgIH0gZWxzZSB7CiAgICAgIGggPSBOYU47CiAgICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoOwogICAgfQogICAgcmV0dXJuIG5ldyBkM19oc2woaCwgcywgbCk7CiAgfQogIGZ1bmN0aW9uIGQzX3JnYl9sYWIociwgZywgYikgewogICAgciA9IGQzX3JnYl94eXoocik7CiAgICBnID0gZDNfcmdiX3h5eihnKTsKICAgIGIgPSBkM19yZ2JfeHl6KGIpOwogICAgdmFyIHggPSBkM194eXpfbGFiKCguNDEyNDU2NCAqIHIgKyAuMzU3NTc2MSAqIGcgKyAuMTgwNDM3NSAqIGIpIC8gZDNfbGFiX1gpLCB5ID0gZDNfeHl6X2xhYigoLjIxMjY3MjkgKiByICsgLjcxNTE1MjIgKiBnICsgLjA3MjE3NSAqIGIpIC8gZDNfbGFiX1kpLCB6ID0gZDNfeHl6X2xhYigoLjAxOTMzMzkgKiByICsgLjExOTE5MiAqIGcgKyAuOTUwMzA0MSAqIGIpIC8gZDNfbGFiX1opOwogICAgcmV0dXJuIGQzX2xhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geikpOwogIH0KICBmdW5jdGlvbiBkM19yZ2JfeHl6KHIpIHsKICAgIHJldHVybiAociAvPSAyNTUpIDw9IC4wNDA0NSA/IHIgLyAxMi45MiA6IE1hdGgucG93KChyICsgLjA1NSkgLyAxLjA1NSwgMi40KTsKICB9CiAgZnVuY3Rpb24gZDNfcmdiX3BhcnNlTnVtYmVyKGMpIHsKICAgIHZhciBmID0gcGFyc2VGbG9hdChjKTsKICAgIHJldHVybiBjLmNoYXJBdChjLmxlbmd0aCAtIDEpID09PSAiJSIgPyBNYXRoLnJvdW5kKGYgKiAyLjU1KSA6IGY7CiAgfQogIHZhciBkM19yZ2JfbmFtZXMgPSBkMy5tYXAoewogICAgYWxpY2VibHVlOiAxNTc5MjM4MywKICAgIGFudGlxdWV3aGl0ZTogMTY0NDQzNzUsCiAgICBhcXVhOiA2NTUzNSwKICAgIGFxdWFtYXJpbmU6IDgzODg1NjQsCiAgICBhenVyZTogMTU3OTQxNzUsCiAgICBiZWlnZTogMTYxMTkyNjAsCiAgICBiaXNxdWU6IDE2NzcwMjQ0LAogICAgYmxhY2s6IDAsCiAgICBibGFuY2hlZGFsbW9uZDogMTY3NzIwNDUsCiAgICBibHVlOiAyNTUsCiAgICBibHVldmlvbGV0OiA5MDU1MjAyLAogICAgYnJvd246IDEwODI0MjM0LAogICAgYnVybHl3b29kOiAxNDU5NjIzMSwKICAgIGNhZGV0Ymx1ZTogNjI2NjUyOCwKICAgIGNoYXJ0cmV1c2U6IDgzODgzNTIsCiAgICBjaG9jb2xhdGU6IDEzNzg5NDcwLAogICAgY29yYWw6IDE2NzQ0MjcyLAogICAgY29ybmZsb3dlcmJsdWU6IDY1OTE5ODEsCiAgICBjb3Juc2lsazogMTY3NzUzODgsCiAgICBjcmltc29uOiAxNDQyMzEwMCwKICAgIGN5YW46IDY1NTM1LAogICAgZGFya2JsdWU6IDEzOSwKICAgIGRhcmtjeWFuOiAzNTcyMywKICAgIGRhcmtnb2xkZW5yb2Q6IDEyMDkyOTM5LAogICAgZGFya2dyYXk6IDExMTE5MDE3LAogICAgZGFya2dyZWVuOiAyNTYwMCwKICAgIGRhcmtncmV5OiAxMTExOTAxNywKICAgIGRhcmtraGFraTogMTI0MzMyNTksCiAgICBkYXJrbWFnZW50YTogOTEwOTY0MywKICAgIGRhcmtvbGl2ZWdyZWVuOiA1NTk3OTk5LAogICAgZGFya29yYW5nZTogMTY3NDc1MjAsCiAgICBkYXJrb3JjaGlkOiAxMDA0MDAxMiwKICAgIGRhcmtyZWQ6IDkxMDk1MDQsCiAgICBkYXJrc2FsbW9uOiAxNTMwODQxMCwKICAgIGRhcmtzZWFncmVlbjogOTQxOTkxOSwKICAgIGRhcmtzbGF0ZWJsdWU6IDQ3MzQzNDcsCiAgICBkYXJrc2xhdGVncmF5OiAzMTAwNDk1LAogICAgZGFya3NsYXRlZ3JleTogMzEwMDQ5NSwKICAgIGRhcmt0dXJxdW9pc2U6IDUyOTQ1LAogICAgZGFya3Zpb2xldDogOTY5OTUzOSwKICAgIGRlZXBwaW5rOiAxNjcxNjk0NywKICAgIGRlZXBza3libHVlOiA0OTE1MSwKICAgIGRpbWdyYXk6IDY5MDgyNjUsCiAgICBkaW1ncmV5OiA2OTA4MjY1LAogICAgZG9kZ2VyYmx1ZTogMjAwMzE5OSwKICAgIGZpcmVicmljazogMTE2NzQxNDYsCiAgICBmbG9yYWx3aGl0ZTogMTY3NzU5MjAsCiAgICBmb3Jlc3RncmVlbjogMjI2Mzg0MiwKICAgIGZ1Y2hzaWE6IDE2NzExOTM1LAogICAgZ2FpbnNib3JvOiAxNDQ3NDQ2MCwKICAgIGdob3N0d2hpdGU6IDE2MzE2NjcxLAogICAgZ29sZDogMTY3NjY3MjAsCiAgICBnb2xkZW5yb2Q6IDE0MzI5MTIwLAogICAgZ3JheTogODQyMTUwNCwKICAgIGdyZWVuOiAzMjc2OCwKICAgIGdyZWVueWVsbG93OiAxMTQwMzA1NSwKICAgIGdyZXk6IDg0MjE1MDQsCiAgICBob25leWRldzogMTU3OTQxNjAsCiAgICBob3RwaW5rOiAxNjczODc0MCwKICAgIGluZGlhbnJlZDogMTM0NTg1MjQsCiAgICBpbmRpZ286IDQ5MTUzMzAsCiAgICBpdm9yeTogMTY3NzcyMDAsCiAgICBraGFraTogMTU3ODc2NjAsCiAgICBsYXZlbmRlcjogMTUxMzI0MTAsCiAgICBsYXZlbmRlcmJsdXNoOiAxNjc3MzM2NSwKICAgIGxhd25ncmVlbjogODE5MDk3NiwKICAgIGxlbW9uY2hpZmZvbjogMTY3NzU4ODUsCiAgICBsaWdodGJsdWU6IDExMzkzMjU0LAogICAgbGlnaHRjb3JhbDogMTU3NjE1MzYsCiAgICBsaWdodGN5YW46IDE0NzQ1NTk5LAogICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDE2NDQ4MjEwLAogICAgbGlnaHRncmF5OiAxMzg4MjMyMywKICAgIGxpZ2h0Z3JlZW46IDk0OTgyNTYsCiAgICBsaWdodGdyZXk6IDEzODgyMzIzLAogICAgbGlnaHRwaW5rOiAxNjc1ODQ2NSwKICAgIGxpZ2h0c2FsbW9uOiAxNjc1Mjc2MiwKICAgIGxpZ2h0c2VhZ3JlZW46IDIxNDI4OTAsCiAgICBsaWdodHNreWJsdWU6IDg5MDAzNDYsCiAgICBsaWdodHNsYXRlZ3JheTogNzgzMzc1MywKICAgIGxpZ2h0c2xhdGVncmV5OiA3ODMzNzUzLAogICAgbGlnaHRzdGVlbGJsdWU6IDExNTg0NzM0LAogICAgbGlnaHR5ZWxsb3c6IDE2Nzc3MTg0LAogICAgbGltZTogNjUyODAsCiAgICBsaW1lZ3JlZW46IDMzMjkzMzAsCiAgICBsaW5lbjogMTY0NDU2NzAsCiAgICBtYWdlbnRhOiAxNjcxMTkzNSwKICAgIG1hcm9vbjogODM4ODYwOCwKICAgIG1lZGl1bWFxdWFtYXJpbmU6IDY3MzczMjIsCiAgICBtZWRpdW1ibHVlOiAyMDUsCiAgICBtZWRpdW1vcmNoaWQ6IDEyMjExNjY3LAogICAgbWVkaXVtcHVycGxlOiA5NjYyNjgzLAogICAgbWVkaXVtc2VhZ3JlZW46IDM5NzgwOTcsCiAgICBtZWRpdW1zbGF0ZWJsdWU6IDgwODc3OTAsCiAgICBtZWRpdW1zcHJpbmdncmVlbjogNjQxNTQsCiAgICBtZWRpdW10dXJxdW9pc2U6IDQ3NzIzMDAsCiAgICBtZWRpdW12aW9sZXRyZWQ6IDEzMDQ3MTczLAogICAgbWlkbmlnaHRibHVlOiAxNjQ0OTEyLAogICAgbWludGNyZWFtOiAxNjEyMTg1MCwKICAgIG1pc3R5cm9zZTogMTY3NzAyNzMsCiAgICBtb2NjYXNpbjogMTY3NzAyMjksCiAgICBuYXZham93aGl0ZTogMTY3Njg2ODUsCiAgICBuYXZ5OiAxMjgsCiAgICBvbGRsYWNlOiAxNjY0MzU1OCwKICAgIG9saXZlOiA4NDIxMzc2LAogICAgb2xpdmVkcmFiOiA3MDQ4NzM5LAogICAgb3JhbmdlOiAxNjc1MzkyMCwKICAgIG9yYW5nZXJlZDogMTY3MjkzNDQsCiAgICBvcmNoaWQ6IDE0MzE1NzM0LAogICAgcGFsZWdvbGRlbnJvZDogMTU2NTcxMzAsCiAgICBwYWxlZ3JlZW46IDEwMDI1ODgwLAogICAgcGFsZXR1cnF1b2lzZTogMTE1Mjk5NjYsCiAgICBwYWxldmlvbGV0cmVkOiAxNDM4MTIwMywKICAgIHBhcGF5YXdoaXA6IDE2NzczMDc3LAogICAgcGVhY2hwdWZmOiAxNjc2NzY3MywKICAgIHBlcnU6IDEzNDY4OTkxLAogICAgcGluazogMTY3NjEwMzUsCiAgICBwbHVtOiAxNDUyNDYzNywKICAgIHBvd2RlcmJsdWU6IDExNTkxOTEwLAogICAgcHVycGxlOiA4Mzg4NzM2LAogICAgcmVkOiAxNjcxMTY4MCwKICAgIHJvc3licm93bjogMTIzNTc1MTksCiAgICByb3lhbGJsdWU6IDQyODY5NDUsCiAgICBzYWRkbGVicm93bjogOTEyNzE4NywKICAgIHNhbG1vbjogMTY0MTY4ODIsCiAgICBzYW5keWJyb3duOiAxNjAzMjg2NCwKICAgIHNlYWdyZWVuOiAzMDUwMzI3LAogICAgc2Vhc2hlbGw6IDE2Nzc0NjM4LAogICAgc2llbm5hOiAxMDUwNjc5NywKICAgIHNpbHZlcjogMTI2MzIyNTYsCiAgICBza3libHVlOiA4OTAwMzMxLAogICAgc2xhdGVibHVlOiA2OTcwMDYxLAogICAgc2xhdGVncmF5OiA3MzcyOTQ0LAogICAgc2xhdGVncmV5OiA3MzcyOTQ0LAogICAgc25vdzogMTY3NzU5MzAsCiAgICBzcHJpbmdncmVlbjogNjU0MDcsCiAgICBzdGVlbGJsdWU6IDQ2MjA5ODAsCiAgICB0YW46IDEzODA4NzgwLAogICAgdGVhbDogMzI4OTYsCiAgICB0aGlzdGxlOiAxNDIwNDg4OCwKICAgIHRvbWF0bzogMTY3MzcwOTUsCiAgICB0dXJxdW9pc2U6IDQyNTE4NTYsCiAgICB2aW9sZXQ6IDE1NjMxMDg2LAogICAgd2hlYXQ6IDE2MTEzMzMxLAogICAgd2hpdGU6IDE2Nzc3MjE1LAogICAgd2hpdGVzbW9rZTogMTYxMTkyODUsCiAgICB5ZWxsb3c6IDE2Nzc2OTYwLAogICAgeWVsbG93Z3JlZW46IDEwMTQ1MDc0CiAgfSk7CiAgZDNfcmdiX25hbWVzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgZDNfcmdiX25hbWVzLnNldChrZXksIGQzX3JnYk51bWJlcih2YWx1ZSkpOwogIH0pOwogIGZ1bmN0aW9uIGQzX2Z1bmN0b3IodikgewogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAiZnVuY3Rpb24iID8gdiA6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdjsKICAgIH07CiAgfQogIGQzLmZ1bmN0b3IgPSBkM19mdW5jdG9yOwogIGZ1bmN0aW9uIGQzX2lkZW50aXR5KGQpIHsKICAgIHJldHVybiBkOwogIH0KICBkMy54aHIgPSBkM194aHJUeXBlKGQzX2lkZW50aXR5KTsKICBmdW5jdGlvbiBkM194aHJUeXBlKHJlc3BvbnNlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odXJsLCBtaW1lVHlwZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIG1pbWVUeXBlID09PSAiZnVuY3Rpb24iKSBjYWxsYmFjayA9IG1pbWVUeXBlLCAKICAgICAgbWltZVR5cGUgPSBudWxsOwogICAgICByZXR1cm4gZDNfeGhyKHVybCwgbWltZVR5cGUsIHJlc3BvbnNlLCBjYWxsYmFjayk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM194aHIodXJsLCBtaW1lVHlwZSwgcmVzcG9uc2UsIGNhbGxiYWNrKSB7CiAgICB2YXIgeGhyID0ge30sIGRpc3BhdGNoID0gZDMuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCAicHJvZ3Jlc3MiLCAibG9hZCIsICJlcnJvciIpLCBoZWFkZXJzID0ge30sIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKSwgcmVzcG9uc2VUeXBlID0gbnVsbDsKICAgIGlmIChkM193aW5kb3cuWERvbWFpblJlcXVlc3QgJiYgISgid2l0aENyZWRlbnRpYWxzIiBpbiByZXF1ZXN0KSAmJiAvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodXJsKSkgcmVxdWVzdCA9IG5ldyBYRG9tYWluUmVxdWVzdCgpOwogICAgIm9ubG9hZCIgaW4gcmVxdWVzdCA/IHJlcXVlc3Qub25sb2FkID0gcmVxdWVzdC5vbmVycm9yID0gcmVzcG9uZCA6IHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlcXVlc3QucmVhZHlTdGF0ZSA+IDMgJiYgcmVzcG9uZCgpOwogICAgfTsKICAgIGZ1bmN0aW9uIHJlc3BvbmQoKSB7CiAgICAgIHZhciBzdGF0dXMgPSByZXF1ZXN0LnN0YXR1cywgcmVzdWx0OwogICAgICBpZiAoIXN0YXR1cyAmJiBkM194aHJIYXNSZXNwb25zZShyZXF1ZXN0KSB8fCBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQgPSByZXNwb25zZS5jYWxsKHhociwgcmVxdWVzdCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgZGlzcGF0Y2guZXJyb3IuY2FsbCh4aHIsIGUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBkaXNwYXRjaC5sb2FkLmNhbGwoeGhyLCByZXN1bHQpOwogICAgICB9IGVsc2UgewogICAgICAgIGRpc3BhdGNoLmVycm9yLmNhbGwoeGhyLCByZXF1ZXN0KTsKICAgICAgfQogICAgfQogICAgcmVxdWVzdC5vbnByb2dyZXNzID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIG8gPSBkMy5ldmVudDsKICAgICAgZDMuZXZlbnQgPSBldmVudDsKICAgICAgdHJ5IHsKICAgICAgICBkaXNwYXRjaC5wcm9ncmVzcy5jYWxsKHhociwgcmVxdWVzdCk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZDMuZXZlbnQgPSBvOwogICAgICB9CiAgICB9OwogICAgeGhyLmhlYWRlciA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICAgIG5hbWUgPSAobmFtZSArICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBoZWFkZXJzW25hbWVdOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgZGVsZXRlIGhlYWRlcnNbbmFtZV07IGVsc2UgaGVhZGVyc1tuYW1lXSA9IHZhbHVlICsgIiI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9OwogICAgeGhyLm1pbWVUeXBlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbWltZVR5cGU7CiAgICAgIG1pbWVUeXBlID0gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiB2YWx1ZSArICIiOwogICAgICByZXR1cm4geGhyOwogICAgfTsKICAgIHhoci5yZXNwb25zZVR5cGUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByZXNwb25zZVR5cGU7CiAgICAgIHJlc3BvbnNlVHlwZSA9IHZhbHVlOwogICAgICByZXR1cm4geGhyOwogICAgfTsKICAgIHhoci5yZXNwb25zZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJlc3BvbnNlID0gdmFsdWU7CiAgICAgIHJldHVybiB4aHI7CiAgICB9OwogICAgWyAiZ2V0IiwgInBvc3QiIF0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHsKICAgICAgeGhyW21ldGhvZF0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geGhyLnNlbmQuYXBwbHkoeGhyLCBbIG1ldGhvZCBdLmNvbmNhdChkM18NCozc71YZhAEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt3EAAQAZ9AcCoBzbAqAdglScf9duSeDc5UapEgBAESfCoAAABAQgKAKNevgBNpbmM3O9WJIUBABpVAAAaVQAAaPcoH9LFCAAnrR4TCABFAFUMNuFAAEAGHyTAqAdgwKgHNh/1lSc5UapE25J4N4AQAO3k5QAAAQEICgBNpbkAo16+N0ZFOA0KYXJyYXkoYXJndW1lbnRzKSkpOwogICAgICB9OwogICAgfSk7CiAgICB4aHIuc2VuZCA9IGZ1bmN0aW9uKG1ldGhvZCwgZGF0YSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGRhdGEgPT09ICJmdW5jdGlvbiIpIGNhbGxiYWNrID0gZGF0YSwgZGF0YSA9IG51bGw7CiAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7CiAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmICEoImFjY2VwdCIgaW4gaGVhZGVycykpIGhlYWRlcnNbImFjY2VwdCJdID0gbWltZVR5cGUgKyAiLCovKiI7CiAgICAgIGlmIChyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIpIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pOwogICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUpIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZShtaW1lVHlwZSk7CiAgICAgIGlmIChyZXNwb25zZVR5cGUgIT0gbnVsbCkgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7CiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB4aHIub24oImVycm9yIiwgY2FsbGJhY2spLm9uKCJsb2FkIiwgZnVuY3Rpb24ocmVxdWVzdCkgewogICAgICAgIGNhbGxiYWNrKG51bGwsIHJlcXVlc3QpOwogICAgICB9KTsKICAgICAgZGlzcGF0Y2guYmVmb3Jlc2VuZC5jYWxsKHhociwgcmVxdWVzdCk7CiAgICAgIHJlcXVlc3Quc2VuZChkYXRhID09IG51bGwgPyBudWxsIDogZGF0YSk7CiAgICAgIHJldHVybiB4aHI7CiAgICB9OwogICAgeGhyLmFib3J0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlcXVlc3QuYWJvcnQoKTsKICAgICAgcmV0dXJuIHhocjsKICAgIH07CiAgICBkMy5yZWJpbmQoeGhyLCBkaXNwYXRjaCwgIm9uIik7CiAgICByZXR1cm4gY2FsbGJhY2sgPT0gbnVsbCA/IHhociA6IHhoci5nZXQoZDNfeGhyX2ZpeENhbGxiYWNrKGNhbGxiYWNrKSk7CiAgfQogIGZ1bmN0aW9uIGQzX3hocl9maXhDYWxsYmFjayhjYWxsYmFjaykgewogICAgcmV0dXJuIGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IGZ1bmN0aW9uKGVycm9yLCByZXF1ZXN0KSB7CiAgICAgIGNhbGxiYWNrKGVycm9yID09IG51bGwgPyByZXF1ZXN0IDogbnVsbCk7CiAgICB9IDogY2FsbGJhY2s7CiAgfQogIGZ1bmN0aW9uIGQzX3hockhhc1Jlc3BvbnNlKHJlcXVlc3QpIHsKICAgIHZhciB0eXBlID0gcmVxdWVzdC5yZXNwb25zZVR5cGU7CiAgICByZXR1cm4gdHlwZSAmJiB0eXBlICE9PSAidGV4dCIgPyByZXF1ZXN0LnJlc3BvbnNlIDogcmVxdWVzdC5yZXNwb25zZVRleHQ7CiAgfQogIGQzLmRzdiA9IGZ1bmN0aW9uKGRlbGltaXRlciwgbWltZVR5cGUpIHsKICAgIHZhciByZUZvcm1hdCA9IG5ldyBSZWdFeHAoJ1siJyArIGRlbGltaXRlciArICJcbl0iKSwgZGVsaW1pdGVyQ29kZSA9IGRlbGltaXRlci5jaGFyQ29kZUF0KDApOwogICAgZnVuY3Rpb24gZHN2KHVybCwgcm93LCBjYWxsYmFjaykgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGNhbGxiYWNrID0gcm93LCByb3cgPSBudWxsOwogICAgICB2YXIgeGhyID0gZDNfeGhyKHVybCwgbWltZVR5cGUsIHJvdyA9PSBudWxsID8gcmVzcG9uc2UgOiB0eXBlZFJlc3BvbnNlKHJvdyksIGNhbGxiYWNrKTsKICAgICAgeGhyLnJvdyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHhoci5yZXNwb25zZSgocm93ID0gXykgPT0gbnVsbCA/IHJlc3BvbnNlIDogdHlwZWRSZXNwb25zZShfKSkgOiByb3c7CiAgICAgIH07CiAgICAgIHJldHVybiB4aHI7CiAgICB9CiAgICBmdW5jdGlvbiByZXNwb25zZShyZXF1ZXN0KSB7CiAgICAgIHJldHVybiBkc3YucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpOwogICAgfQogICAgZnVuY3Rpb24gdHlwZWRSZXNwb25zZShmKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihyZXF1ZXN0KSB7CiAgICAgICAgcmV0dXJuIGRzdi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCwgZik7CiAgICAgIH07CiAgICB9CiAgICBkc3YucGFyc2UgPSBmdW5jdGlvbih0ZXh0LCBmKSB7CiAgICAgIHZhciBvOwogICAgICByZXR1cm4gZHN2LnBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHsKICAgICAgICBpZiAobykgcmV0dXJuIG8ocm93LCBpIC0gMSk7CiAgICAgICAgdmFyIGEgPSBuZXcgRnVuY3Rpb24oImQiLCAicmV0dXJuIHsiICsgcm93Lm1hcChmdW5jdGlvbihuYW1lLCBpKSB7CiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobmFtZSkgKyAiOiBkWyIgKyBpICsgIl0iOwogICAgICAgIH0pLmpvaW4oIiwiKSArICJ9Iik7CiAgICAgICAgbyA9IGYgPyBmdW5jdGlvbihyb3csIGkpIHsKICAgICAgICAgIHJldHVybiBmKGEocm93KSwgaSk7CiAgICAgICAgfSA6IGE7CiAgICAgIH0pOwogICAgfTsKICAgIGRzdi5wYXJzZVJvd3MgPSBmdW5jdGlvbih0ZXh0LCBmKSB7CiAgICAgIHZhciBFT0wgPSB7fSwgRU9GID0ge30sIHJvd3MgPSBbXSwgTiA9IHRleHQubGVuZ3RoLCBJID0gMCwgbiA9IDAsIHQsIGVvbDsKICAgICAgZnVuY3Rpb24gdG9rZW4oKSB7CiAgICAgICAgaWYgKEkgPj0gTikgcmV0dXJuIEVPRjsKICAgICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDsKICAgICAgICB2YXIgaiA9IEk7CiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gMzQpIHsKICAgICAgICAgIHZhciBpID0gajsKICAgICAgICAgIHdoaWxlIChpKysgPCBOKSB7CiAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDM0KSB7CiAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpICsgMSkgIT09IDM0KSBicmVhazsKICAgICAgICAgICAgICArK2k7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIEkgPSBpICsgMjsKICAgICAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KGkgKyAxKTsKICAgICAgICAgIGlmIChjID09PSAxMykgewogICAgICAgICAgICBlb2wgPSB0cnVlOwogICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAyKSA9PT0gMTApICsrSTsKICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gMTApIHsKICAgICAgICAgICAgZW9sID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGogKyAxLCBpKS5yZXBsYWNlKC8iIi9nLCAnIicpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoSSA8IE4pIHsKICAgICAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KEkrKyksIGsgPSAxOwogICAgICAgICAgaWYgKGMgPT09IDEwKSBlb2wgPSB0cnVlOyBlbHNlIGlmIChjID09PSAxMykgewogICAgICAgICAgICBlb2wgPSB0cnVlOwogICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSAxMCkgKytJLCArK2s7CiAgICAgICAgICB9IGVsc2UgaWYgKGMgIT09IGRlbGltaXRlckNvZGUpIGNvbnRpbnVlOwogICAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiwgSSAtIGspOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqKTsKICAgICAgfQogICAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7CiAgICAgICAgdmFyIGEgPSBbXTsKICAgICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikgewogICAgICAgICAgYS5wdXNoKHQpOwogICAgICAgICAgdCA9IHRva2VuKCk7CiAgICAgICAgfQogICAgICAgIGlmIChmICYmICEoYSA9IGYoYSwgbisrKSkpIGNvbnRpbnVlOwogICAgICAgIHJvd3MucHVzaChhKTsKICAgICAgfQogICAgICByZXR1cm4gcm93czsKICAgIH07CiAgICBkc3YuZm9ybWF0ID0gZnVuY3Rpb24ocm93cykgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dzWzBdKSkgcmV0dXJuIGRzdi5mb3JtYXRSb3dzKHJvd3MpOwogICAgICB2YXIgZmllbGRTZXQgPSBuZXcgZDNfU2V0KCksIGZpZWxkcyA9IFtdOwogICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7CiAgICAgICAgZm9yICh2YXIgZmllbGQgaW4gcm93KSB7CiAgICAgICAgICBpZiAoIWZpZWxkU2V0LmhhcyhmaWVsZCkpIHsKICAgICAgICAgICAgZmllbGRzLnB1c2goZmllbGRTZXQuYWRkKGZpZWxkKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIFsgZmllbGRzLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpIF0uY29uY2F0KHJvd3MubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgIHJldHVybiBmaWVsZHMubWFwKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWUocm93W2ZpZWxkXSk7CiAgICAgICAgfSkuam9pbihkZWxpbWl0ZXIpOwogICAgICB9KSkuam9pbigiXG4iKTsKICAgIH07CiAgICBkc3YuZm9ybWF0Um93cyA9IGZ1bmN0aW9uKHJvd3MpIHsKICAgICAgcmV0dXJuIHJvd3MubWFwKGZvcm1hdFJvdykuam9pbigiXG4iKTsKICAgIH07CiAgICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7CiAgICAgIHJldHVybiByb3cubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcik7CiAgICB9CiAgICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh0ZXh0KSB7CiAgICAgIHJldHVybiByZUZvcm1hdC50ZXN0KHRleHQpID8gJyInICsgdGV4dC5yZXBsYWNlKC9cIi9nLCAnIiInKSArICciJyA6IHRleHQ7CiAgICB9CiAgICByZXR1cm4gZHN2OwogIH07CiAgZDMuY3N2ID0gZDMuZHN2KCIsIiwgInRleHQvY3N2Iik7CiAgZDMudHN2ID0gZDMuZHN2KCIJIiwgInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiKTsKICB2YXIgZDNfdGltZXJfcXVldWVIZWFkLCBkM190aW1lcl9xdWV1ZVRhaWwsIGQzX3RpbWVyX2ludGVydmFsLCBkM190aW1lcl90aW1lb3V0LCBkM190aW1lcl9hY3RpdmUsIGQzX3RpbWVyX2ZyYW1lID0gZDNfd2luZG93W2QzX3ZlbmRvclN5bWJvbChkM193aW5kb3csICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV0gfHwgZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDE3KTsKICB9OwogIGQzLnRpbWVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aGVuKSB7CiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICBpZiAobiA8IDIpIGRlbGF5ID0gMDsKICAgIGlmIChuIDwgMykgdGhlbiA9IERhdGUubm93KCk7CiAgICB2YXIgdGltZSA9IHRoZW4gKyBkZWxheSwgdGltZXIgPSB7CiAgICAgIGM6IGNhbGxiYWNrLAogICAgICB0OiB0aW1lLAogICAgICBmOiBmYWxzZSwKICAgICAgbjogbnVsbAogICAgfTsKICAgIGlmIChkM190aW1lcl9xdWV1ZVRhaWwpIGQzX3RpbWVyX3F1ZXVlVGFpbC5uID0gdGltZXI7IGVsc2UgZDNfdGltZXJfcXVldWVIZWFkID0gdGltZXI7CiAgICBkM190aW1lcl9xdWV1ZVRhaWwgPSB0aW1lcjsKICAgIGlmICghZDNfdGltZXJfaW50ZXJ2YWwpIHsKICAgICAgZDNfdGltZXJfdGltZW91dCA9IGNsZWFyVGltZW91dChkM190aW1lcl90aW1lb3V0KTsKICAgICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAxOwogICAgICBkM190aW1lcl9mcmFtZShkM190aW1lcl9zdGVwKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX3RpbWVyX3N0ZXAoKSB7CiAgICB2YXIgbm93ID0gZDNfdGltZXJfbWFyaygpLCBkZWxheSA9IGQzX3RpbWVyX3N3ZWVwKCkgLSBub3c7CiAgICBpZiAoZGVsYXkgPiAyNCkgewogICAgICBpZiAoaXNGaW5pdGUoZGVsYXkpKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOwogICAgICAgIGQzX3RpbWVyX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGQzX3RpbWVyX3N0ZXAsIGRlbGF5KTsKICAgICAgfQogICAgICBkM190aW1lcl9pbnRlcnZhbCA9IDA7CiAgICB9IGVsc2UgewogICAgICBkM190aW1lcl9pbnRlcnZhbCA9IDE7CiAgICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApOwogICAgfQogIH0KICBkMy50aW1lci5mbHVzaCA9IGZ1bmN0aW9uKCkgewogICAgZDNfdGltZXJfbWFyaygpOwogICAgZDNfdGltZXJfc3dlZXAoKTsKICB9OwogIGZ1bmN0aW9uIGQzX3RpbWVyX21hcmsoKSB7CiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTsKICAgIGQzX3RpbWVyX2FjdGl2ZSA9IGQzX3RpbWVyX3F1ZXVlSGVhZDsKICAgIHdoaWxlIChkM190aW1lcl9hY3RpdmUpIHsKICAgICAgaWYgKG5vdyA+PSBkM190aW1lcl9hY3RpdmUudCkgZDNfdGltZXJfYWN0aXZlLmYgPSBkM190aW1lcl9hY3RpdmUuYyhub3cgLSBkM190aW1lcl9hY3RpdmUudCk7CiAgICAgIGQzX3RpbWVyX2FjdGl2ZSA9IGQzX3RpbWVyX2FjdGl2ZS5uOwogICAgfQogICAgcmV0dXJuIG5vdzsKICB9CiAgZnVuY3Rpb24gZDNfdGltZXJfc3dlZXAoKSB7CiAgICB2YXIgdDAsIHQxID0gZDNfdGltZXJfcXVldWVIZWFkLCB0aW1lID0gSW5maW5pdHk7CiAgICB3aGlsZSAodDEpIHsKICAgICAgaWYgKHQxLmYpIHsKICAgICAgICB0MSA9IHQwID8gdDAubiA9IHQxLm4gOiBkM190aW1lcl9xdWV1ZUhlYWQgPSB0MS5uOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0MS50IDwgdGltZSkgdGltZSA9IHQxLnQ7CiAgICAgICAgdDEgPSAodDAgPSB0MSkubjsKICAgICAgfQogICAgfQogICAgZDNfdGltZXJfcXVldWVUYWlsID0gdDA7CiAgICByZXR1cm4gdGltZTsKICB9CiAgZnVuY3Rpb24gZDNfZm9ybWF0X3ByZWNpc2lvbih4LCBwKSB7CiAgICByZXR1cm4gcCAtICh4ID8gTWF0aC5jZWlsKE1hdGgubG9nKHgpIC8gTWF0aC5MTjEwKSA6IDEpOwogIH0KICBkMy5yb3VuZCA9IGZ1bmN0aW9uKHgsIG4pIHsKICAgIHJldHVybiBuID8gTWF0aC5yb3VuZCh4ICogKG4gPSBNYXRoLnBvdygxMCwgbikpKSAvIG4gOiBNYXRoLnJvdW5kKHgpOwogIH07CiAgdmFyIGQzX2Zvcm1hdFByZWZpeGVzID0gWyAieSIsICJ6IiwgImEiLCAiZiIsICJwIiwgIm4iLCAiwrUiLCAibSIsICIiLCAiayIsICJNIiwgIkciLCAiVCIsICJQIiwgIkUiLCAiWiIsICJZIiBdLm1hcChkM19mb3JtYXRQcmVmaXgpOwogIGQzLmZvcm1hdFByZWZpeCA9IGZ1bmN0aW9uKHZhbHVlLCBwcmVjaXNpb24pIHsKICAgIHZhciBpID0gMDsKICAgIGlmICh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSAqPSAtMTsKICAgICAgaWYgKHByZWNpc2lvbikgdmFsdWUgPSBkMy5yb3VuZCh2YWx1ZSwgZDNfZm9ybWF0X3ByZWNpc2lvbih2YWx1ZSwgcHJlY2lzaW9uKSk7CiAgICAgIGkgPSAxICsgTWF0aC5mbG9vcigxZS0xMiArIE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4xMCk7CiAgICAgIGkgPSBNYXRoLm1heCgtMjQsIE1hdGgubWluKDI0LCBNYXRoLmZsb29yKChpIC0gMSkgLyAzKSAqIDMpKTsKICAgIH0KICAgIHJldHVybiBkM19mb3JtYXRQcmVmaXhlc1s4ICsgaSAvIDNdOwogIH07CiAgZnVuY3Rpb24gZDNfZm9ybWF0UHJlZml4KGQsIGkpIHsKICAgIHZhciBrID0gTWF0aC5wb3coMTAsIGFicyg4IC0gaSkgKiAzKTsKICAgIHJldHVybiB7CiAgICAgIHNjYWxlOiBpID4gOCA/IGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gZCAvIGs7CiAgICAgIH0gOiBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuIGQgKiBrOwogICAgICB9LAogICAgICBzeW1ib2w6IGQKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2xvY2FsZV9udW1iZXJGb3JtYXQobG9jYWxlKSB7CiAgICB2YXIgbG9jYWxlX2RlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCwgbG9jYWxlX3Rob3VzYW5kcyA9IGxvY2FsZS50aG91c2FuZHMsIGxvY2FsZV9ncm91cGluZyA9IGxvY2FsZS5ncm91cGluZywgbG9jYWxlX2N1cnJlbmN5ID0gbG9jYWxlLmN1cnJlbmN5LCBmb3JtYXRHcm91cCA9IGxvY2FsZV9ncm91cGluZyA/IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLCB0ID0gW10sIGogPSAwLCBnID0gbG9jYWxlX2dyb3VwaW5nWzBdOwogICAgICB3aGlsZSAoZyA+IDAgJiYgaSA+IDApIHsKICAgICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTsKICAgICAgICBnID0gbG9jYWxlX2dyb3VwaW5nW2ogPSAoaiArIDEpICUgbG9jYWxlX2dyb3VwaW5nLmxlbmd0aF07CiAgICAgIH0KICAgICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4obG9jYWxlX3Rob3VzYW5kcyk7CiAgICB9IDogZDNfaWRlbnRpdHk7CiAgICByZXR1cm4gZnVuY3Rpb24oc3BlY2lmaWVyKSB7CiAgICAgIHZhciBtYXRjaCA9IGQzX2Zvcm1hdF9yZS5leGVjKHNwZWNpZmllciksIGZpbGwgPSBtYXRjaFsxXSB8fCAiICIsIGFsaWduID0gbWF0Y2hbMl0gfHwgIj4iLCBzaWduID0gbWF0Y2hbM10gfHwgIiIsIHN5bWJvbCA9IG1hdGNoWzRdIHx8ICIiLCB6ZmlsbCA9IG1hdGNoWzVdLCB3aWR0aCA9ICttYXRjaFs2XSwgY29tbWEgPSBtYXRjaFs3XSwgcHJlY2lzaW9uID0gbWF0Y2hbOF0sIHR5cGUgPSBtYXRjaFs5XSwgc2NhbGUgPSAxLCBwcmVmaXggPSAiIiwgc3VmZml4ID0gIiIsIGludGVnZXIgPSBmYWxzZTsKICAgICAgaWYgKHByZWNpc2lvbikgcHJlY2lzaW9uID0gK3ByZWNpc2lvbi5zdWJzdHJpbmcoMSk7CiAgICAgIGlmICh6ZmlsbCB8fCBmaWxsID09PSAiMCIgJiYgYWxpZ24gPT09ICI9IikgewogICAgICAgIHpmaWxsID0gZmlsbCA9ICIwIjsKICAgICAgICBhbGlnbiA9ICI9IjsKICAgICAgICBpZiAoY29tbWEpIHdpZHRoIC09IE1hdGguZmxvb3IoKHdpZHRoIC0gMSkgLyA0KTsKICAgICAgfQogICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgIGNhc2UgIm4iOgogICAgICAgIGNvbW1hID0gdHJ1ZTsKICAgICAgICB0eXBlID0gImciOwogICAgICAgIGJyZWFrOwoKICAgICAgIGNhc2UgIiUiOgogICAgICAgIHNjYWxlID0gMTAwOwogICAgICAgIHN1ZmZpeCA9ICIlIjsKICAgICAgICB0eXBlID0gImYiOwogICAgICAgIGJyZWFrOwoKICAgICAgIGNhc2UgInAiOgogICAgICAgIHNjYWxlID0gMTAwOwogICAgICAgIHN1ZmZpeCA9ICIlIjsKICAgICAgICB0eXBlID0gInIiOwogICAgICAgIGJyZWFrOwoKICAgICAgIGNhc2UgImIiOgogICAgICAgY2FzZSAibyI6CiAgICAgICBjYXNlICJ4IjoKICAgICAgIGNhc2UgIlgiOgogICAgICAgIGlmIChzeW1ib2wgPT09ICIjIikgcHJlZml4ID0gIjAiICsgdHlwZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgIGNhc2UgImMiOgogICAgICAgY2FzZSAiZCI6CiAgICAgICAgaW50ZWdlciA9IHRydWU7CiAgICAgICAgcHJlY2lzaW9uID0gMDsKICAgICAgICBicmVhazsKCiAgICAgICBjYXNlICJzIjoKICAgICAgICBzY2FsZSA9IC0xOwogICAgICAgIHR5cGUgPSAiciI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHN5bWJvbCA9PT0gIiQiKSBwcmVmaXggPSBsb2NhbGVfY3VycmVuY3lbMF0sIHN1ZmZpeCA9IGxvY2FsZV9jdXJyZW5jeVsxXTsKICAgICAgaWYgKHR5cGUgPT0gInIiICYmICFwcmVjaXNpb24pIHR5cGUgPSAiZyI7CiAgICAgIGlmIChwcmVjaXNpb24gIT0gbnVsbCkgewogICAgICAgIGlmICh0eXBlID09ICJnIikgcHJlY2lzaW9uID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpOyBlbHNlIGlmICh0eXBlID09ICJlIiB8fCB0eXBlID09ICJmIikgcHJlY2lzaW9uID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpOwogICAgICB9CiAgICAgIHR5cGUgPSBkM19mb3JtYXRfdHlwZXMuZ2V0KHR5cGUpIHx8IGQzX2Zvcm1hdF90eXBlRGVmYXVsdDsKICAgICAgdmFyIHpjb21tYSA9IHpmaWxsICYmIGNvbW1hOwogICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB2YXIgZnVsbFN1ZmZpeCA9IHN1ZmZpeDsKICAgICAgICBpZiAoaW50ZWdlciAmJiB2YWx1ZSAlIDEpIHJldHVybiAiIjsKICAgICAgICB2YXIgbmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/ICh2YWx1ZSA9IC12YWx1ZSwgIi0iKSA6IHNpZ247CiAgICAgICAgaWYgKHNjYWxlIDwgMCkgewogICAgICAgICAgdmFyIHVuaXQgPSBkMy5mb3JtYXRQcmVmaXgodmFsdWUsIHByZWNpc2lvbik7CiAgICAgICAgICB2YWx1ZSA9IHVuaXQuc2NhbGUodmFsdWUpOwogICAgICAgICAgZnVsbFN1ZmZpeCA9IHVuaXQuc3ltYm9sICsgc3VmZml4OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YWx1ZSAqPSBzY2FsZTsKICAgICAgICB9CiAgICAgICAgdmFsdWUgPSB0eXBlKHZhbHVlLCBwcmVjaXNpb24pOwogICAgICAgIHZhciBpID0gdmFsdWUubGFzdEluZGV4T2YoIi4iKSwgYmVmb3JlID0gaSA8IDAgPyB2YWx1ZSA6IHZhbHVlLnN1YnN0cmluZygwLCBpKSwgYWZ0ZXIgPSBpIDwgMCA/ICIiIDogbG9jYWxlX2RlY2ltYWwgKyB2YWx1ZS5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgIGlmICghemZpbGwgJiYgY29tbWEpIGJlZm9yZSA9IGZvcm1hdEdyb3VwKGJlZm9yZSk7CiAgICAgICAgdmFyIGxlbmd0aCA9IHByZWZpeC5sZW5ndGggKyBiZWZvcmUubGVuZ3RoICsgYWZ0ZXIubGVuZ3RoICsgKHpjb21tYSA/IDAgOiBuZWdhdGl2ZS5sZW5ndGgpLCBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkobGVuZ3RoID0gd2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogIiI7CiAgICAgICAgaWYgKHpjb21tYSkgYmVmb3JlID0gZm9ybWF0R3JvdXAocGFkZGluZyArIGJlZm9yZSk7CiAgICAgICAgbmVnYXRpdmUgKz0gcHJlZml4OwogICAgICAgIHZhbHVlID0gYmVmb3JlICsgYWZ0ZXI7CiAgICAgICAgcmV0dXJuIChhbGlnbiA9PT0gIjwiID8gbmVnYXRpdmUgKyB2YWx1ZSArIHBhZGRpbmcgOiBhbGlnbiA9PT0gIj4iID8gcGFkZGluZyArIG5lZ2F0aXZlICsgdmFsdWUgOiBhbGlnbiA9PT0gIl4iID8gcGFkZGluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoID4+PSAxKSArIG5lZ2F0aXZlICsgdmFsdWUgKyBwYWRkaW5nLnN1YnN0cmluZyhsZW5ndGgpIDogbmVnYXRpdmUgKyAoemNvbW1hID8gdmFsdWUgOiBwYWRkaW5nICsgdmFsdWUpKSArIGZ1bGxTdWZmaXg7CiAgICAgIH07CiAgICB9OwogIH0KICB2YXIgZDNfZm9ybWF0X3JlID0gLyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pOwogIHZhciBkM19mb3JtYXRfdHlwZXMgPSBkMy5tYXAoewogICAgYjogZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geC50b1N0cmluZygyKTsKICAgIH0sCiAgICBjOiBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpOwogICAgfSwKICAgIG86IGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIHgudG9TdHJpbmcoOCk7CiAgICB9LAogICAgeDogZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geC50b1N0cmluZygxNik7CiAgICB9LAogICAgWDogZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgIH0sCiAgICBnOiBmdW5jdGlvbih4LCBwKSB7CiAgICAgIHJldHVybiB4LnRvUHJlY2lzaW9uKHApOwogICAgfSwKICAgIGU6IGZ1bmN0aW9uKHgsIHApIHsKICAgICAgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTsKICAgIH0sCiAgICBmOiBmdW5jdGlvbih4LCBwKSB7CiAgICAgIHJldHVybiB4LnRvRml4ZWQocCk7CiAgICB9LAogICAgcjogZnVuY3Rpb24oeCwgcCkgewogICAgICByZXR1cm4gKHggPSBkMy5yb3VuZCh4LCBkM19mb3JtYXRfcHJlY2lzaW9uKHgsIHApKSkudG9GaXhlZChNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgZDNfZm9ybWF0X3ByZWNpc2lvbih4ICogKDEgKyAxZS0xNSksIHApKSkpOwogICAgfQogIH0pOwogIGZ1bmN0aW9uIGQzX2Zvcm1hdF90eXBlRGVmYXVsdCh4KSB7CiAgICByZXR1cm4geCArICIiOwogIH0KICB2YXIgZDNfdGltZSA9IGQzLnRpbWUgPSB7fSwgZDNfZGF0ZSA9IERhdGU7CiAgZnVuY3Rpb24gZDNfZGF0ZV91dGMoKSB7CiAgICB0aGlzLl8gPSBuZXcgRGF0ZShhcmd1bWVudHMubGVuZ3RoID4gMSA/IERhdGUuVVRDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBhcmd1bWVudHNbMF0pOwogIH0KICBkM19kYXRlX3V0Yy5wcm90b3R5cGUgPSB7CiAgICBnZXREYXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCk7CiAgICB9LAogICAgZ2V0RGF5OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKTsKICAgIH0sCiAgICBnZXRGdWxsWWVhcjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDRnVsbFllYXIoKTsKICAgIH0sCiAgICBnZXRIb3VyczogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKTsKICAgIH0sCiAgICBnZXRNaWxsaXNlY29uZHM6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpOwogICAgfSwKICAgIGdldE1pbnV0ZXM6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ01pbnV0ZXMoKTsKICAgIH0sCiAgICBnZXRNb250aDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKTsKICAgIH0sCiAgICBnZXRTZWNvbmRzOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCk7CiAgICB9LAogICAgZ2V0VGltZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VGltZSgpOwogICAgfSwKICAgIGdldFRpbWV6b25lT2Zmc2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgdmFsdWVPZjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl8udmFsdWVPZigpOwogICAgfSwKICAgIHNldERhdGU6IGZ1bmN0aW9uKCkgewogICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENEYXRlLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgIH0sCiAgICBzZXREYXk6IGZ1bmN0aW9uKCkgewogICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENEYXkuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogICAgfSwKICAgIHNldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHsKICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRnVsbFllYXIuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogICAgfSwKICAgIHNldEhvdXJzOiBmdW5jdGlvbigpIHsKICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDSG91cnMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogICAgfSwKICAgIHNldE1pbGxpc2Vjb25kczogZnVuY3Rpb24oKSB7CiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01pbGxpc2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7CiAgICB9LAogICAgc2V0TWludXRlczogZnVuY3Rpb24oKSB7CiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01pbnV0ZXMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogICAgfSwKICAgIHNldE1vbnRoOiBmdW5jdGlvbigpIHsKICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDTW9udGguYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogICAgfSwKICAgIHNldFNlY29uZHM6IGZ1bmN0aW9uKCkgewogICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENTZWNvbmRzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgIH0sCiAgICBzZXRUaW1lOiBmdW5jdGlvbigpIHsKICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VGltZS5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKICB2YXIgZDNfdGltZV9wcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsKICBmdW5jdGlvbiBkM190aW1lX2ludGVydmFsKGxvY2FsLCBzdGVwLCBudW1iZXIpIHsKICAgIGZ1bmN0aW9uIHJvdW5kKGRhdGUpIHsKICAgICAgdmFyIGQwID0gbG9jYWwoZGF0ZSksIGQxID0gb2Zmc2V0KGQwLCAxKTsKICAgICAgcmV0dXJuIGRhdGUgLSBkMCA8IGQxIC0gZGF0ZSA/IGQwIDogZDE7CiAgICB9CiAgICBmdW5jdGlvbiBjZWlsKGRhdGUpIHsKICAgICAgc3RlcChkYXRlID0gbG9jYWwobmV3IGQzX2RhdGUoZGF0ZSAtIDEpKSwgMSk7CiAgICAgIHJldHVybiBkYXRlOwogICAgfQogICAgZnVuY3Rpb24gb2Zmc2V0KGRhdGUsIGspIHsKICAgICAgc3RlcChkYXRlID0gbmV3IGQzX2RhdGUoK2RhdGUpLCBrKTsKICAgICAgcmV0dXJuIGRhdGU7CiAgICB9CiAgICBmdW5jdGlvbiByYW5nZSh0MCwgdDEsIGR0KSB7CiAgICAgIHZhciB0aW1lID0gY2VpbCh0MCksIHRpbWVzID0gW107CiAgICAgIGlmIChkdCA+IDEpIHsKICAgICAgICB3aGlsZSAodGltZSA8IHQxKSB7CiAgICAgICAgICBpZiAoIShudW1iZXIodGltZSkgJSBkdCkpIHRpbWVzLnB1c2gobmV3IERhdGUoK3RpbWUpKTsKICAgICAgICAgIHN0ZXAodGltZSwgMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdoaWxlICh0aW1lIDwgdDEpIHRpbWVzLnB1c2gobmV3IERhdGUoK3RpbWUpKSwgc3RlcCh0aW1lLCAxKTsKICAgICAgfQogICAgICByZXR1cm4gdGltZXM7CiAgICB9CiAgICBmdW5jdGlvbiByYW5nZV91dGModDAsIHQxLCBkdCkgewogICAgICB0cnkgewogICAgICAgIGQzX2RhdGUgPSBkM19kYXRlX3V0YzsKICAgICAgICB2YXIgdXRjID0gbmV3IGQzX2RhdGVfdXRjKCk7CiAgICAgICAgdXRjLl8gPSB0MDsKICAgICAgICByZXR1cm4gcmFuZ2UodXRjLCB0MSwgZHQpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGQzX2RhdGUgPSBEYXRlOwogICAgICB9CiAgICB9CiAgICBsb2NhbC5mbG9vciA9IGxvY2FsOwogICAgbG9jYWwucm91bmQgPSByb3VuZDsKICAgIGxvY2FsLmNlaWwgPSBjZWlsOwogICAgbG9jYWwub2Zmc2V0ID0gb2Zmc2V0OwogICAgbG9jYWwucmFuZ2UgPSByYW5nZTsKICAgIHZhciB1dGMgPSBsb2NhbC51dGMgPSBkM190aW1lX2ludGVydmFsX3V0Yyhsb2NhbCk7CiAgICB1dGMuZmxvb3IgPSB1dGM7CiAgICB1dGMucm91bmQgPSBkM190aW1lX2ludGVydmFsX3V0Yyhyb3VuZCk7CiAgICB1dGMuY2VpbCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKGNlaWwpOwogICAgdXRjLm9mZnNldCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG9mZnNldCk7CiAgICB1dGMucmFuZ2UgPSByYW5nZV91dGM7CiAgICByZXR1cm4gbG9jYWw7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG1ldGhvZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUsIGspIHsKICAgICAgdHJ5IHsKICAgICAgICBkM19kYXRlID0gZDNfZGF0ZV91dGM7CiAgICAgICAgdmFyIHV0YyA9IG5ldyBkM19kYXRlX3V0YygpOwogICAgICAgIHV0Yy5fID0gZGF0ZTsKICAgICAgICByZXR1cm4gbWV0aG9kKHV0YywgaykuXzsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBkM19kYXRlID0gRGF0ZTsKICAgICAgfQogICAgfTsKICB9CiAgZDNfdGltZS55ZWFyID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlID0gZDNfdGltZS5kYXkoZGF0ZSk7CiAgICBkYXRlLnNldE1vbnRoKDAsIDEpOwogICAgcmV0dXJuIGRhdGU7CiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIG9mZnNldCk7CiAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsKICB9KTsKICBkM190aW1lLnllYXJzID0gZDNfdGltZS55ZWFyLnJhbmdlOwogIGQzX3RpbWUueWVhcnMudXRjID0gZDNfdGltZS55ZWFyLnV0Yy5yYW5nZTsKICBkM190aW1lLmRheSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIGRheSA9IG5ldyBkM19kYXRlKDJlMywgMCk7CiAgICBkYXkuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTsKICAgIHJldHVybiBkYXk7CiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBvZmZzZXQpOwogIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgIHJldHVybiBkYXRlLmdldERhdGUoKSAtIDE7CiAgfSk7CiAgZDNfdGltZS5kYXlzID0gZDNfdGltZS5kYXkucmFuZ2U7CiAgZDNfdGltZS5kYXlzLnV0YyA9IGQzX3RpbWUuZGF5LnV0Yy5yYW5nZTsKICBkM190aW1lLmRheU9mWWVhciA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciB5ZWFyID0gZDNfdGltZS55ZWFyKGRhdGUpOwogICAgcmV0dXJuIE1hdGguZmxvb3IoKGRhdGUgLSB5ZWFyIC0gKGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHllYXIuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiA2ZTQpIC8gODY0ZTUpOwogIH07CiAgWyAic3VuZGF5IiwgIm1vbmRheSIsICJ0dWVzZGF5IiwgIndlZG5lc2RheSIsICJ0aHVyc2RheSIsICJmcmlkYXkiLCAic2F0dXJkYXkiIF0uZm9yRWFjaChmdW5jdGlvbihkYXksIGkpIHsKICAgIGkgPSA3IC0gaTsKICAgIHZhciBpbnRlcnZhbCA9IGQzX3RpbWVbZGF5XSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgICAoZGF0ZSA9IGQzX3RpbWUuZGF5KGRhdGUpKS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyBpKSAlIDcpOwogICAgICByZXR1cm4gZGF0ZTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiA3KTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgdmFyIGRheSA9IGQzX3RpbWUueWVhcihkYXRlKS5nZXREYXkoKTsKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGQzX3RpbWUuZGF5T2ZZZWFyKGRhdGUpICsgKGRheSArIGkpICUgNykgLyA3KSAtIChkYXkgIT09IGkpOwogICAgfSk7CiAgICBkM190aW1lW2RheSArICJzIl0gPSBpbnRlcnZhbC5yYW5nZTsKICAgIGQzX3RpbWVbZGF5ICsgInMiXS51dGMgPSBpbnRlcnZhbC51dGMucmFuZ2U7CiAgICBkM190aW1lW2RheSArICJPZlllYXIiXSA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgdmFyIGRheSA9IGQzX3RpbWUueWVhcihkYXRlKS5nZXREYXkoKTsKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGQzX3RpbWUuZGF5T2ZZZWFyKGRhdGUpICsgKGRheSArIGkpICUgNykgLyA3KTsKICAgIH07CiAgfSk7CiAgZDNfdGltZS53ZWVrID0gZDNfdGltZS5zdW5kYXk7CiAgZDNfdGltZS53ZWVrcyA9IGQzX3RpbWUuc3VuZGF5LnJhbmdlOwogIGQzX3RpbWUud2Vla3MudXRjID0gZDNfdGltZS5zdW5kYXkudXRjLnJhbmdlOwogIGQzX3RpbWUud2Vla09mWWVhciA9IGQzX3RpbWUuc3VuZGF5T2ZZZWFyOwogIGZ1bmN0aW9uIGQzX2xvY2FsZV90aW1lRm9ybWF0KGxvY2FsZSkgewogICAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwgbG9jYWxlX2RhdGUgPSBsb2NhbGUuZGF0ZSwgbG9jYWxlX3RpbWUgPSBsb2NhbGUudGltZSwgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcywgbG9jYWxlX2RheXMgPSBsb2NhbGUuZGF5cywgbG9jYWxlX3Nob3J0RGF5cyA9IGxvY2FsZS5zaG9ydERheXMsIGxvY2FsZV9tb250aHMgPSBsb2NhbGUubW9udGhzLCBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7CiAgICBmdW5jdGlvbiBkM190aW1lX2Zvcm1hdCh0ZW1wbGF0ZSkgewogICAgICB2YXIgbiA9IHRlbXBsYXRlLmxlbmd0aDsKICAgICAgZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHsKICAgICAgICB2YXIgc3RyaW5nID0gW10sIGkgPSAtMSwgaiA9IDAsIGMsIHAsIGY7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICh0ZW1wbGF0ZS5jaGFyQ29kZUF0KGkpID09PSAzNykgewogICAgICAgICAgICBzdHJpbmcucHVzaCh0ZW1wbGF0ZS5zbGljZShqLCBpKSk7CiAgICAgICAgICAgIGlmICgocCA9IGQzX3RpbWVfZm9ybWF0UGFkc1tjID0gdGVtcGxhdGUuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gdGVtcGxhdGUuY2hhckF0KCsraSk7CiAgICAgICAgICAgIGlmIChmID0gZDNfdGltZV9mb3JtYXRzW2NdKSBjID0gZihkYXRlLCBwID09IG51bGwgPyBjID09PSAiZSIgPyAiICIgOiAiMCIgOiBwKTsKICAgICAgICAgICAgc3RyaW5nLnB1c2goYyk7CiAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RyaW5nLnB1c2godGVtcGxhdGUuc2xpY2UoaiwgaSkpOwogICAgICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7CiAgICAgIH0KICAgICAgZm9ybWF0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgICAgdmFyIGQgPSB7CiAgICAgICAgICB5OiAxOTAwLAogICAgICAgICAgbTogMCwKICAgICAgICAgIGQ6IDEsCiAgICAgICAgICBIOiAwLAogICAgICAgICAgTTogMCwKICAgICAgICAgIFM6IDAsCiAgICAgICAgICBMOiAwLAogICAgICAgICAgWjogbnVsbAogICAgICAgIH0sIGkgPSBkM190aW1lX3BhcnNlKGQsIHRlbXBsYXRlLCBzdHJpbmcsIDApOwogICAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgICAgIGlmICgicCIgaW4gZCkgZC5IID0gZC5IICUgMTIgKyBkLnAgKiAxMjsKICAgICAgICB2YXIgbG9jYWxaID0gZC5aICE9IG51bGwgJiYgZDNfZGF0ZSAhPT0gZDNfZGF0ZV91dGMsIGRhdGUgPSBuZXcgKGxvY2FsWiA/IGQzX2RhdGVfdXRjIDogZDNfZGF0ZSkoKTsKICAgICAgICBpZiAoImoiIGluIGQpIGRhdGUuc2V0RnVsbFllYXIoZC55LCAwLCBkLmopOyBlbHNlIGlmICgidyIgaW4gZCAmJiAoIlciIGluIGQgfHwgIlUiIGluIGQpKSB7CiAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKGQueSwgMCwgMSk7CiAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKGQueSwgMCwgIlciIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXRlLmdldERheSgpICsgNSkgJSA3IDogZC53ICsgZC5VICogNyAtIChkYXRlLmdldERheSgpICsgNikgJSA3KTsKICAgICAgICB9IGVsc2UgZGF0ZS5zZXRGdWxsWWVhcihkLnksIGQubSwgZC5kKTsKICAgICAgICBkYXRlLnNldEhvdXJzKGQuSCArIChkLlogLyAxMDAgfCAwKSwgZC5NICsgZC5aICUgMTAwLCBkLlMsIGQuTCk7CiAgICAgICAgcmV0dXJuIGxvY2FsWiA/IGRhdGUuXyA6IGRhdGU7CiAgICAgIH07CiAgICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZvcm1hdDsKICAgIH0KICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2UoZGF0ZSwgdGVtcGxhdGUsIHN0cmluZywgaikgewogICAgICB2YXIgYywgcCwgdCwgaSA9IDAsIG4gPSB0ZW1wbGF0ZS5sZW5ndGgsIG0gPSBzdHJpbmcubGVuZ3RoOwogICAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7CiAgICAgICAgYyA9IHRlbXBsYXRlLmNoYXJDb2RlQXQoaSsrKTsKICAgICAgICBpZiAoYyA9PT0gMzcpIHsKICAgICAgICAgIHQgPSB0ZW1wbGF0ZS5jaGFyQXQoaSsrKTsKICAgICAgICAgIHAgPSBkM190aW1lX3BhcnNlcnNbdCBpbiBkM190aW1lX2Zvcm1hdFBhZHMgPyB0ZW1wbGF0ZS5jaGFyQXQoaSsrKSA6IHRdOwogICAgICAgICAgaWYgKCFwIHx8IChqID0gcChkYXRlLCBzdHJpbmcsIGopKSA8IDApIHJldHVybiAtMTsKICAgICAgICB9IGVsc2UgaWYgKGMgIT0gc3RyaW5nLmNoYXJDb2RlQXQoaisrKSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gajsKICAgIH0KICAgIGQzX3RpbWVfZm9ybWF0LnV0YyA9IGZ1bmN0aW9uKHRlbXBsYXRlKSB7CiAgICAgIHZhciBsb2NhbCA9IGQzX3RpbWVfZm9ybWF0KHRlbXBsYXRlKTsKICAgICAgZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgZDNfZGF0ZSA9IGQzX2RhdGVfdXRjOwogICAgICAgICAgdmFyIHV0YyA9IG5ldyBkM19kYXRlKCk7CiAgICAgICAgICB1dGMuXyA9IGRhdGU7CiAgICAgICAgICByZXR1cm4gbG9jYWwodXRjKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgZDNfZGF0ZSA9IERhdGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgICAgIHRyeSB7CiAgICAgICAgICBkM19kYXRlID0gZDNfZGF0ZV91dGM7CiAgICAgICAgICB2YXIgZGF0ZSA9IGxvY2FsLnBhcnNlKHN0cmluZyk7CiAgICAgICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlLl87CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGQzX2RhdGUgPSBEYXRlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZm9ybWF0LnRvU3RyaW5nID0gbG9jYWwudG9TdHJpbmc7CiAgICAgIHJldHVybiBmb3JtYXQ7CiAgICB9OwogICAgZDNfdGltZV9mb3JtYXQubXVsdGkgPSBkM190aW1lX2Zvcm1hdC51dGMubXVsdGkgPSBkM190aW1lX2Zvcm1hdE11bHRpOwogICAgdmFyIGQzX3RpbWVfcGVyaW9kTG9va3VwID0gZDMubWFwKCksIGQzX3RpbWVfZGF5UmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9kYXlzKSwgZDNfdGltZV9kYXlMb29rdXAgPSBkM190aW1lX2Zvcm1hdExvb2t1cChsb2NhbGVfZGF5cyksIGQzX3RpbWVfZGF5QWJicmV2UmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9zaG9ydERheXMpLCBkM190aW1lX2RheUFiYnJldkxvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydERheXMpLCBkM190aW1lX21vbnRoUmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9tb250aHMpLCBkM190aW1lX21vbnRoTG9va3VwID0gZDNfdGltZV9mb3JtYXRMb29rdXAobG9jYWxlX21vbnRocyksIGQzX3RpbWVfbW9udGhBYmJyZXZSZSA9IGQzX3RpbWVfZm9ybWF0UmUobG9jYWxlX3Nob3J0TW9udGhzKSwgZDNfdGltZV9tb250aEFiYnJldkxvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7CiAgICBsb2NhbGVfcGVyaW9kcy5mb3JFYWNoKGZ1bmN0aW9uKHAsIGkpIHsKICAgICAgZDNfdGltZV9wZXJpb2RMb29rdXAuc2V0KHAudG9Mb3dlckNhc2UoKSwgaSk7CiAgICB9KTsKICAgIHZhciBkM190aW1lX2Zvcm1hdHMgPSB7CiAgICAgIGE6IGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0RGF5c1tkLmdldERheSgpXTsKICAgICAgfSwKICAgICAgQTogZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfZGF5c1tkLmdldERheSgpXTsKICAgICAgfSwKICAgICAgYjogZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRNb250aCgpXTsKICAgICAgfSwKICAgICAgQjogZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07CiAgICAgIH0sCiAgICAgIGM6IGQzX3RpbWVfZm9ybWF0KGxvY2FsZV9kYXRlVGltZSksCiAgICAgIGQ6IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXREYXRlKCksIHAsIDIpOwogICAgICB9LAogICAgICBlOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0RGF0ZSgpLCBwLCAyKTsKICAgICAgfSwKICAgICAgSDogZnVuY3Rpb24oZCwgcCkgewogICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldEhvdXJzKCksIHAsIDIpOwogICAgICB9LAogICAgICBJOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKjNzvVlOFAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3dQABABn0AwKgHNsCoB2CVJx/125J4NzlR/xyAEARsm60AAAEBCAoAo16+AE2luYzc71ZThQEAWisAAForAABo9ygf0sUIACetHhMIAEUAK0w28EAAQAZI1cCoB2DAqAc2H/WVJzlR/xzbkng3gBgA7bslAAABAQgKAE2luQCjXr4gICAgICB9LAogICAgICBqOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKDEgKyBkM190aW1lLmRheU9mWWVhcihkKSwgcCwgMyk7CiAgICAgIH0sCiAgICAgIEw6IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRNaWxsaXNlY29uZHMoKSwgcCwgMyk7CiAgICAgIH0sCiAgICAgIG06IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRNb250aCgpICsgMSwgcCwgMik7CiAgICAgIH0sCiAgICAgIE06IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRNaW51dGVzKCksIHAsIDIpOwogICAgICB9LAogICAgICBwOiBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRIb3VycygpID49IDEyKV07CiAgICAgIH0sCiAgICAgIFM6IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRTZWNvbmRzKCksIHAsIDIpOwogICAgICB9LAogICAgICBVOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQzX3RpbWUuc3VuZGF5T2ZZZWFyKGQpLCBwLCAyKTsKICAgICAgfSwKICAgICAgdzogZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiBkLmdldERheSgpOwogICAgICB9LAogICAgICBXOiBmdW5jdGlvbihkLCBwKSB7CiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQzX3RpbWUubW9uZGF5T2ZZZWFyKGQpLCBwLCAyKTsKICAgICAgfSwKICAgICAgeDogZDNfdGltZV9mb3JtYXQobG9jYWxlX2RhdGUpLAogICAgICBYOiBkM190aW1lX2Zvcm1hdChsb2NhbGVfdGltZSksCiAgICAgIHk6IGZ1bmN0aW9uKGQsIHApIHsKICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTsKICAgICAgfSwKICAgICAgWTogZnVuY3Rpb24oZCwgcCkgewogICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldEZ1bGxZZWFyKCkgJSAxZTQsIHAsIDQpOwogICAgICB9LAogICAgICBaOiBkM190aW1lX3pvbmUsCiAgICAgICIlIjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICIlIjsKICAgICAgfQogICAgfTsKICAgIHZhciBkM190aW1lX3BhcnNlcnMgPSB7CiAgICAgIGE6IGQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2LAogICAgICBBOiBkM190aW1lX3BhcnNlV2Vla2RheSwKICAgICAgYjogZDNfdGltZV9wYXJzZU1vbnRoQWJicmV2LAogICAgICBCOiBkM190aW1lX3BhcnNlTW9udGgsCiAgICAgIGM6IGQzX3RpbWVfcGFyc2VMb2NhbGVGdWxsLAogICAgICBkOiBkM190aW1lX3BhcnNlRGF5LAogICAgICBlOiBkM190aW1lX3BhcnNlRGF5LAogICAgICBIOiBkM190aW1lX3BhcnNlSG91cjI0LAogICAgICBJOiBkM190aW1lX3BhcnNlSG91cjI0LAogICAgICBqOiBkM190aW1lX3BhcnNlRGF5T2ZZZWFyLAogICAgICBMOiBkM190aW1lX3BhcnNlTWlsbGlzZWNvbmRzLAogICAgICBtOiBkM190aW1lX3BhcnNlTW9udGhOdW1iZXIsCiAgICAgIE06IGQzX3RpbWVfcGFyc2VNaW51dGVzLAogICAgICBwOiBkM190aW1lX3BhcnNlQW1QbSwKICAgICAgUzogZDNfdGltZV9wYXJzZVNlY29uZHMsCiAgICAgIFU6IGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyU3VuZGF5LAogICAgICB3OiBkM190aW1lX3BhcnNlV2Vla2RheU51bWJlciwKICAgICAgVzogZDNfdGltZV9wYXJzZVdlZWtOdW1iZXJNb25kYXksCiAgICAgIHg6IGQzX3RpbWVfcGFyc2VMb2NhbGVEYXRlLAogICAgICBYOiBkM190aW1lX3BhcnNlTG9jYWxlVGltZSwKICAgICAgeTogZDNfdGltZV9wYXJzZVllYXIsCiAgICAgIFk6IGQzX3RpbWVfcGFyc2VGdWxsWWVhciwKICAgICAgWjogZDNfdGltZV9wYXJzZVpvbmUsCiAgICAgICIlIjogZDNfdGltZV9wYXJzZUxpdGVyYWxQZXJjZW50CiAgICB9OwogICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICAgIGQzX3RpbWVfZGF5QWJicmV2UmUubGFzdEluZGV4ID0gMDsKICAgICAgdmFyIG4gPSBkM190aW1lX2RheUFiYnJldlJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgcmV0dXJuIG4gPyAoZGF0ZS53ID0gZDNfdGltZV9kYXlBYmJyZXZMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5KGRhdGUsIHN0cmluZywgaSkgewogICAgICBkM190aW1lX2RheVJlLmxhc3RJbmRleCA9IDA7CiAgICAgIHZhciBuID0gZDNfdGltZV9kYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgIHJldHVybiBuID8gKGRhdGUudyA9IGQzX3RpbWVfZGF5TG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICAgIGQzX3RpbWVfbW9udGhBYmJyZXZSZS5sYXN0SW5kZXggPSAwOwogICAgICB2YXIgbiA9IGQzX3RpbWVfbW9udGhBYmJyZXZSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgIHJldHVybiBuID8gKGRhdGUubSA9IGQzX3RpbWVfbW9udGhBYmJyZXZMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aChkYXRlLCBzdHJpbmcsIGkpIHsKICAgICAgZDNfdGltZV9tb250aFJlLmxhc3RJbmRleCA9IDA7CiAgICAgIHZhciBuID0gZDNfdGltZV9tb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgcmV0dXJuIG4gPyAoZGF0ZS5tID0gZDNfdGltZV9tb250aExvb2t1cC5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQogICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICAgIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy5jLnRvU3RyaW5nKCksIHN0cmluZywgaSk7CiAgICB9CiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZShkYXRlLCBzdHJpbmcsIGkpIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLngudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lKGRhdGUsIHN0cmluZywgaSkgewogICAgICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMuWC50b1N0cmluZygpLCBzdHJpbmcsIGkpOwogICAgfQogICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUFtUG0oZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gZDNfdGltZV9wZXJpb2RMb29rdXAuZ2V0KHN0cmluZy5zbGljZShpLCBpICs9IDIpLnRvTG93ZXJDYXNlKCkpOwogICAgICByZXR1cm4gbiA9PSBudWxsID8gLTEgOiAoZGF0ZS5wID0gbiwgaSk7CiAgICB9CiAgICByZXR1cm4gZDNfdGltZV9mb3JtYXQ7CiAgfQogIHZhciBkM190aW1lX2Zvcm1hdFBhZHMgPSB7CiAgICAiLSI6ICIiLAogICAgXzogIiAiLAogICAgIjAiOiAiMCIKICB9LCBkM190aW1lX251bWJlclJlID0gL15ccypcZCsvLCBkM190aW1lX3BlcmNlbnRSZSA9IC9eJS87CiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRQYWQodmFsdWUsIGZpbGwsIHdpZHRoKSB7CiAgICB2YXIgc2lnbiA9IHZhbHVlIDwgMCA/ICItIiA6ICIiLCBzdHJpbmcgPSAoc2lnbiA/IC12YWx1ZSA6IHZhbHVlKSArICIiLCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoOwogICAgcmV0dXJuIHNpZ24gKyAobGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpICsgc3RyaW5nIDogc3RyaW5nKTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRSZShuYW1lcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKGQzLnJlcXVvdGUpLmpvaW4oInwiKSArICIpIiwgImkiKTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRMb29rdXAobmFtZXMpIHsKICAgIHZhciBtYXAgPSBuZXcgZDNfTWFwKCksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KG5hbWVzW2ldLnRvTG93ZXJDYXNlKCksIGkpOwogICAgcmV0dXJuIG1hcDsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVdlZWtkYXlOdW1iZXIoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsKICAgIHJldHVybiBuID8gKGRhdGUudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyU3VuZGF5KGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgIHJldHVybiBuID8gKGRhdGUuVSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyTW9uZGF5KGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgIHJldHVybiBuID8gKGRhdGUuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VGdWxsWWVhcihkYXRlLCBzdHJpbmcsIGkpIHsKICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgNCkpOwogICAgcmV0dXJuIG4gPyAoZGF0ZS55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgIHJldHVybiBuID8gKGRhdGUueSA9IGQzX3RpbWVfZXhwYW5kWWVhcigrblswXSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVpvbmUoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gL15bKy1dXGR7NH0kLy50ZXN0KHN0cmluZyA9IHN0cmluZy5zbGljZShpLCBpICsgNSkpID8gKGRhdGUuWiA9IC1zdHJpbmcsIAogICAgaSArIDUpIDogLTE7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfZXhwYW5kWWVhcihkKSB7CiAgICByZXR1cm4gZCArIChkID4gNjggPyAxOTAwIDogMmUzKTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1vbnRoTnVtYmVyKGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5KGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5T2ZZZWFyKGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLmogPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlSG91cjI0KGRhdGUsIHN0cmluZywgaSkgewogICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICByZXR1cm4gbiA/IChkYXRlLkggPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTWludXRlcyhkYXRlLCBzdHJpbmcsIGkpIHsKICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgcmV0dXJuIG4gPyAoZGF0ZS5NID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgIHJldHVybiBuID8gKGRhdGUuUyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICAgIHJldHVybiBuID8gKGRhdGUuTCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQogIGZ1bmN0aW9uIGQzX3RpbWVfem9uZShkKSB7CiAgICB2YXIgeiA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSwgenMgPSB6ID4gMCA/ICItIiA6ICIrIiwgemggPSBhYnMoeikgLyA2MCB8IDAsIHptID0gYWJzKHopICUgNjA7CiAgICByZXR1cm4genMgKyBkM190aW1lX2Zvcm1hdFBhZCh6aCwgIjAiLCAyKSArIGQzX3RpbWVfZm9ybWF0UGFkKHptLCAiMCIsIDIpOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTGl0ZXJhbFBlcmNlbnQoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgICBkM190aW1lX3BlcmNlbnRSZS5sYXN0SW5kZXggPSAwOwogICAgdmFyIG4gPSBkM190aW1lX3BlcmNlbnRSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogICAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTsKICB9CiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRNdWx0aShmb3JtYXRzKSB7CiAgICB2YXIgbiA9IGZvcm1hdHMubGVuZ3RoLCBpID0gLTE7CiAgICB3aGlsZSAoKytpIDwgbikgZm9ybWF0c1tpXVswXSA9IHRoaXMoZm9ybWF0c1tpXVswXSk7CiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgewogICAgICB2YXIgaSA9IDAsIGYgPSBmb3JtYXRzW2ldOwogICAgICB3aGlsZSAoIWZbMV0oZGF0ZSkpIGYgPSBmb3JtYXRzWysraV07CiAgICAgIHJldHVybiBmWzBdKGRhdGUpOwogICAgfTsKICB9CiAgZDMubG9jYWxlID0gZnVuY3Rpb24obG9jYWxlKSB7CiAgICByZXR1cm4gewogICAgICBudW1iZXJGb3JtYXQ6IGQzX2xvY2FsZV9udW1iZXJGb3JtYXQobG9jYWxlKSwKICAgICAgdGltZUZvcm1hdDogZDNfbG9jYWxlX3RpbWVGb3JtYXQobG9jYWxlKQogICAgfTsKICB9OwogIHZhciBkM19sb2NhbGVfZW5VUyA9IGQzLmxvY2FsZSh7CiAgICBkZWNpbWFsOiAiLiIsCiAgICB0aG91c2FuZHM6ICIsIiwKICAgIGdyb3VwaW5nOiBbIDMgXSwKICAgIGN1cnJlbmN5OiBbICIkIiwgIiIgXSwKICAgIGRhdGVUaW1lOiAiJWEgJWIgJWUgJVggJVkiLAogICAgZGF0ZTogIiVtLyVkLyVZIiwKICAgIHRpbWU6ICIlSDolTTolUyIsCiAgICBwZXJpb2RzOiBbICJBTSIsICJQTSIgXSwKICAgIGRheXM6IFsgIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5IiBdLAogICAgc2hvcnREYXlzOiBbICJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiIF0sCiAgICBtb250aHM6IFsgIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiIF0sCiAgICBzaG9ydE1vbnRoczogWyAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiIF0KICB9KTsKICBkMy5mb3JtYXQgPSBkM19sb2NhbGVfZW5VUy5udW1iZXJGb3JtYXQ7CiAgZDMuZ2VvID0ge307CiAgZnVuY3Rpb24gZDNfYWRkZXIoKSB7fQogIGQzX2FkZGVyLnByb3RvdHlwZSA9IHsKICAgIHM6IDAsCiAgICB0OiAwLAogICAgYWRkOiBmdW5jdGlvbih5KSB7CiAgICAgIGQzX2FkZGVyU3VtKHksIHRoaXMudCwgZDNfYWRkZXJUZW1wKTsKICAgICAgZDNfYWRkZXJTdW0oZDNfYWRkZXJUZW1wLnMsIHRoaXMucywgdGhpcyk7CiAgICAgIGlmICh0aGlzLnMpIHRoaXMudCArPSBkM19hZGRlclRlbXAudDsgZWxzZSB0aGlzLnMgPSBkM19hZGRlclRlbXAudDsKICAgIH0sCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucyA9IHRoaXMudCA9IDA7CiAgICB9LAogICAgdmFsdWVPZjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLnM7CiAgICB9CiAgfTsKICB2YXIgZDNfYWRkZXJUZW1wID0gbmV3IGQzX2FkZGVyKCk7CiAgZnVuY3Rpb24gZDNfYWRkZXJTdW0oYSwgYiwgbykgewogICAgdmFyIHggPSBvLnMgPSBhICsgYiwgYnYgPSB4IC0gYSwgYXYgPSB4IC0gYnY7CiAgICBvLnQgPSBhIC0gYXYgKyAoYiAtIGJ2KTsKICB9CiAgZDMuZ2VvLnN0cmVhbSA9IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgIGlmIChvYmplY3QgJiYgZDNfZ2VvX3N0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7CiAgICAgIGQzX2dlb19zdHJlYW1PYmplY3RUeXBlW29iamVjdC50eXBlXShvYmplY3QsIGxpc3RlbmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGQzX2dlb19zdHJlYW1HZW9tZXRyeShvYmplY3QsIGxpc3RlbmVyKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX2dlb19zdHJlYW1HZW9tZXRyeShnZW9tZXRyeSwgbGlzdGVuZXIpIHsKICAgIGlmIChnZW9tZXRyeSAmJiBkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpKSB7CiAgICAgIGQzX2dlb19zdHJlYW1HZW9tZXRyeVR5cGVbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIGxpc3RlbmVyKTsKICAgIH0KICB9CiAgdmFyIGQzX2dlb19zdHJlYW1PYmplY3RUeXBlID0gewogICAgRmVhdHVyZTogZnVuY3Rpb24oZmVhdHVyZSwgbGlzdGVuZXIpIHsKICAgICAgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGxpc3RlbmVyKTsKICAgIH0sCiAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikgewogICAgICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1HZW9tZXRyeShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgbGlzdGVuZXIpOwogICAgfQogIH07CiAgdmFyIGQzX2dlb19zdHJlYW1HZW9tZXRyeVR5cGUgPSB7CiAgICBTcGhlcmU6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgbGlzdGVuZXIuc3BoZXJlKCk7CiAgICB9LAogICAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgb2JqZWN0ID0gb2JqZWN0LmNvb3JkaW5hdGVzOwogICAgICBsaXN0ZW5lci5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTsKICAgIH0sCiAgICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0gY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLnBvaW50KG9iamVjdFswXSwgb2JqZWN0WzFdLCBvYmplY3RbMl0pOwogICAgfSwKICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgZDNfZ2VvX3N0cmVhbUxpbmUob2JqZWN0LmNvb3JkaW5hdGVzLCBsaXN0ZW5lciwgMCk7CiAgICB9LAogICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLCAwKTsKICAgIH0sCiAgICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7CiAgICAgIGQzX2dlb19zdHJlYW1Qb2x5Z29uKG9iamVjdC5jb29yZGluYXRlcywgbGlzdGVuZXIpOwogICAgfSwKICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikgewogICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lcik7CiAgICB9LAogICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdA0KjNzvVlOFAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3eQABABnz/wKgHNsCoB2CVJx/125J4NzlSKjSAEAVub5MAAAEBCAoAo16+AE2luYzc71bWigEAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzTKkAAQAZ3isCoB2DAqAc2H/WVIkG2FZBYenzTgBABU/A1AAABAQgKAE2luQCjXr03RkU4DQogdGhlcmUgZm9yIHVzZSBpbiB0aGUgbGluayBmbgogICAgICAgICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSA9ICRpbnRlcnBvbGF0ZShhdHRyc1thdHRyTmFtZV0pKHNjb3BlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlICc9JzoKICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbCAmJiAhYXR0cnNbYXR0ck5hbWVdKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcmVudEdldCA9ICRwYXJzZShhdHRyc1thdHRyTmFtZV0pOwogICAgICAgICAgICAgICAgaWYgKHBhcmVudEdldC5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICAgIGNvbXBhcmUgPSBlcXVhbHM7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBjb21wYXJlID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKTsgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcmVudFNldCA9IHBhcmVudEdldC5hc3NpZ24gfHwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBjaGFuZ2UsIG9yIHdlIHdpbGwgdGhyb3cgdGhpcyBleGNlcHRpb24gb24gZXZlcnkgJGRpZ2VzdAogICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSA9IHBhcmVudEdldChzY29wZSk7CiAgICAgICAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdub25hc3NpZ24nLAogICAgICAgICAgICAgICAgICAgICAgIkV4cHJlc3Npb24gJ3swfScgdXNlZCB3aXRoIGRpcmVjdGl2ZSAnezF9JyBpcyBub24tYXNzaWduYWJsZSEiLAogICAgICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0ck5hbWVdLCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUubmFtZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgbGFzdFZhbHVlID0gaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBwYXJlbnRHZXQoc2NvcGUpOwogICAgICAgICAgICAgICAgdmFyIHBhcmVudFZhbHVlV2F0Y2ggPSBmdW5jdGlvbiBwYXJlbnRWYWx1ZVdhdGNoKHBhcmVudFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgIGlmICghY29tcGFyZShwYXJlbnRWYWx1ZSwgaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIG91dCBvZiBzeW5jIGFuZCBuZWVkIHRvIGNvcHkKICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmUocGFyZW50VmFsdWUsIGxhc3RWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmVudCBjaGFuZ2VkIGFuZCBpdCBoYXMgcHJlY2VkZW5jZQogICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBwYXJlbnRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBjYW4gYmUgYXNzaWduZWQgdGhlbiBkbyBzbwogICAgICAgICAgICAgICAgICAgICAgcGFyZW50U2V0KHNjb3BlLCBwYXJlbnRWYWx1ZSA9IGlzb2xhdGVCaW5kaW5nQ29udGV4dFtzY29wZU5hbWVdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RWYWx1ZSA9IHBhcmVudFZhbHVlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHBhcmVudFZhbHVlV2F0Y2guJHN0YXRlZnVsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHZhciB1bndhdGNoOwogICAgICAgICAgICAgICAgaWYgKGRlZmluaXRpb24uY29sbGVjdGlvbikgewogICAgICAgICAgICAgICAgICB1bndhdGNoID0gc2NvcGUuJHdhdGNoQ29sbGVjdGlvbihhdHRyc1thdHRyTmFtZV0sIHBhcmVudFZhbHVlV2F0Y2gpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdW53YXRjaCA9IHNjb3BlLiR3YXRjaCgkcGFyc2UoYXR0cnNbYXR0ck5hbWVdLCBwYXJlbnRWYWx1ZVdhdGNoKSwgbnVsbCwgcGFyZW50R2V0LmxpdGVyYWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaXNvbGF0ZVNjb3BlLiRvbignJGRlc3Ryb3knLCB1bndhdGNoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlICcmJzoKICAgICAgICAgICAgICAgIHBhcmVudEdldCA9ICRwYXJzZShhdHRyc1thdHRyTmFtZV0pOwogICAgICAgICAgICAgICAgaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBmdW5jdGlvbihsb2NhbHMpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEdldChzY29wZSwgbG9jYWxzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmIChjb250cm9sbGVycykgewogICAgICAgICAgZm9yRWFjaChjb250cm9sbGVycywgZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgICAgICAgICBjb250cm9sbGVyKCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGNvbnRyb2xsZXJzID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIFBSRUxJTktJTkcKICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHByZUxpbmtGbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgbGlua0ZuID0gcHJlTGlua0Zuc1tpXTsKICAgICAgICAgIGludm9rZUxpbmtGbihsaW5rRm4sCiAgICAgICAgICAgICAgbGlua0ZuLmlzb2xhdGVTY29wZSA/IGlzb2xhdGVTY29wZSA6IHNjb3BlLAogICAgICAgICAgICAgICRlbGVtZW50LAogICAgICAgICAgICAgIGF0dHJzLAogICAgICAgICAgICAgIGxpbmtGbi5yZXF1aXJlICYmIGdldENvbnRyb2xsZXJzKGxpbmtGbi5kaXJlY3RpdmVOYW1lLCBsaW5rRm4ucmVxdWlyZSwgJGVsZW1lbnQsIGVsZW1lbnRDb250cm9sbGVycyksCiAgICAgICAgICAgICAgdHJhbnNjbHVkZUZuCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gUkVDVVJTSU9OCiAgICAgICAgLy8gV2Ugb25seSBwYXNzIHRoZSBpc29sYXRlIHNjb3BlLCBpZiB0aGUgaXNvbGF0ZSBkaXJlY3RpdmUgaGFzIGEgdGVtcGxhdGUsCiAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBjaGlsZCBlbGVtZW50cyBkbyBub3QgYmVsb25nIHRvIHRoZSBpc29sYXRlIGRpcmVjdGl2ZS4KICAgICAgICB2YXIgc2NvcGVUb0NoaWxkID0gc2NvcGU7CiAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSAmJiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLnRlbXBsYXRlIHx8IG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZS50ZW1wbGF0ZVVybCA9PT0gbnVsbCkpIHsKICAgICAgICAgIHNjb3BlVG9DaGlsZCA9IGlzb2xhdGVTY29wZTsKICAgICAgICB9CiAgICAgICAgY2hpbGRMaW5rRm4gJiYgY2hpbGRMaW5rRm4oc2NvcGVUb0NoaWxkLCBsaW5rTm9kZS5jaGlsZE5vZGVzLCB1bmRlZmluZWQsIGJvdW5kVHJhbnNjbHVkZUZuKTsKCiAgICAgICAgLy8gUE9TVExJTktJTkcKICAgICAgICBmb3IgKGkgPSBwb3N0TGlua0Zucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgbGlua0ZuID0gcG9zdExpbmtGbnNbaV07CiAgICAgICAgICBpbnZva2VMaW5rRm4obGlua0ZuLAogICAgICAgICAgICAgIGxpbmtGbi5pc29sYXRlU2NvcGUgPyBpc29sYXRlU2NvcGUgOiBzY29wZSwKICAgICAgICAgICAgICAkZWxlbWVudCwKICAgICAgICAgICAgICBhdHRycywKICAgICAgICAgICAgICBsaW5rRm4ucmVxdWlyZSAmJiBnZXRDb250cm9sbGVycyhsaW5rRm4uZGlyZWN0aXZlTmFtZSwgbGlua0ZuLnJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpLAogICAgICAgICAgICAgIHRyYW5zY2x1ZGVGbgogICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8vIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgaW5qZWN0ZWQgYXMgYCR0cmFuc2NsdWRlYC4KICAgICAgICAvLyBOb3RlOiBhbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbCEKICAgICAgICBmdW5jdGlvbiBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZShzY29wZSwgY2xvbmVBdHRhY2hGbiwgZnV0dXJlUGFyZW50RWxlbWVudCkgewogICAgICAgICAgdmFyIHRyYW5zY2x1ZGVDb250cm9sbGVyczsKCiAgICAgICAgICAvLyBObyBzY29wZSBwYXNzZWQgaW46CiAgICAgICAgICBpZiAoIWlzU2NvcGUoc2NvcGUpKSB7CiAgICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQgPSBjbG9uZUF0dGFjaEZuOwogICAgICAgICAgICBjbG9uZUF0dGFjaEZuID0gc2NvcGU7CiAgICAgICAgICAgIHNjb3BlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSkgewogICAgICAgICAgICB0cmFuc2NsdWRlQ29udHJvbGxlcnMgPSBlbGVtZW50Q29udHJvbGxlcnM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWZ1dHVyZVBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgZnV0dXJlUGFyZW50RWxlbWVudCA9IGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID8gJGVsZW1lbnQucGFyZW50KCkgOiAkZWxlbWVudDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBib3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgY2xvbmVBdHRhY2hGbiwgdHJhbnNjbHVkZUNvbnRyb2xsZXJzLCBmdXR1cmVQYXJlbnRFbGVtZW50LCBzY29wZVRvQ2hpbGQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG1hcmtEaXJlY3RpdmVzQXNJc29sYXRlKGRpcmVjdGl2ZXMpIHsKICAgICAgLy8gbWFyayBhbGwgZGlyZWN0aXZlcyBhcyBuZWVkaW5nIGlzb2xhdGUgc2NvcGUuCiAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIGRpcmVjdGl2ZXNbal0gPSBpbmhlcml0KGRpcmVjdGl2ZXNbal0sIHskJGlzb2xhdGVTY29wZTogdHJ1ZX0pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBsb29rcyB1cCB0aGUgZGlyZWN0aXZlIGFuZCBkZWNvcmF0ZXMgaXQgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcgYW5kIHByb3BlciBwYXJhbWV0ZXJzLiBXZQogICAgICogY2FsbCB0aGlzIHRoZSBib3VuZERpcmVjdGl2ZS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUgdG8gbG9vayB1cC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBUaGUgZGlyZWN0aXZlIG11c3QgYmUgZm91bmQgaW4gc3BlY2lmaWMgZm9ybWF0LgogICAgICogICBTdHJpbmcgY29udGFpbmluZyBhbnkgb2YgdGhlc2VzIGNoYXJhY3RlcnM6CiAgICAgKgogICAgICogICAqIGBFYDogZWxlbWVudCBuYW1lCiAgICAgKiAgICogYEEnOiBhdHRyaWJ1dGUKICAgICAqICAgKiBgQ2A6IGNsYXNzCiAgICAgKiAgICogYE1gOiBjb21tZW50CiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBkaXJlY3RpdmUgd2FzIGFkZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBhZGREaXJlY3RpdmUodERpcmVjdGl2ZXMsIG5hbWUsIGxvY2F0aW9uLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBzdGFydEF0dHJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEF0dHJOYW1lKSB7CiAgICAgIGlmIChuYW1lID09PSBpZ25vcmVEaXJlY3RpdmUpIHJldHVybiBudWxsOwogICAgICB2YXIgbWF0Y2ggPSBudWxsOwogICAgICBpZiAoaGFzRGlyZWN0aXZlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgIGZvciAodmFyIGRpcmVjdGl2ZSwgZGlyZWN0aXZlcyA9ICRpbmplY3Rvci5nZXQobmFtZSArIFN1ZmZpeCksCiAgICAgICAgICAgIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZGlyZWN0aXZlID0gZGlyZWN0aXZlc1tpXTsKICAgICAgICAgICAgaWYgKChtYXhQcmlvcml0eSA9PT0gdW5kZWZpbmVkIHx8IG1heFByaW9yaXR5ID4gZGlyZWN0aXZlLnByaW9yaXR5KSAmJgogICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5yZXN0cmljdC5pbmRleE9mKGxvY2F0aW9uKSAhPSAtMSkgewogICAgICAgICAgICAgIGlmIChzdGFydEF0dHJOYW1lKSB7CiAgICAgICAgICAgICAgICBkaXJlY3RpdmUgPSBpbmhlcml0KGRpcmVjdGl2ZSwgeyQkc3RhcnQ6IHN0YXJ0QXR0ck5hbWUsICQkZW5kOiBlbmRBdHRyTmFtZX0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0RGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZSk7CiAgICAgICAgICAgICAgbWF0Y2ggPSBkaXJlY3RpdmU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7IH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1hdGNoOwogICAgfQoKCiAgICAvKioKICAgICAqIGxvb2tzIHVwIHRoZSBkaXJlY3RpdmUgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIG11bHRpLWVsZW1lbnQgZGlyZWN0aXZlLAogICAgICogYW5kIHRoZXJlZm9yZSByZXF1aXJlcyBET00gbm9kZXMgYmV0d2VlbiAtc3RhcnQgYW5kIC1lbmQgbWFya2VycyB0byBiZSBncm91cGVkCiAgICAgKiB0b2dldGhlci4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUgdG8gbG9vayB1cC4KICAgICAqIEByZXR1cm5zIHRydWUgaWYgZGlyZWN0aXZlIHdhcyByZWdpc3RlcmVkIGFzIG11bHRpLWVsZW1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpcmVjdGl2ZUlzTXVsdGlFbGVtZW50KG5hbWUpIHsKICAgICAgaWYgKGhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICBmb3IgKHZhciBkaXJlY3RpdmUsIGRpcmVjdGl2ZXMgPSAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBTdWZmaXgpLAogICAgICAgICAgICBpID0gMCwgaWkgPSBkaXJlY3RpdmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbaV07CiAgICAgICAgICBpZiAoZGlyZWN0aXZlLm11bHRpRWxlbWVudCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogV2hlbiB0aGUgZWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIEhUTUwgdGVtcGxhdGUgdGhlbiB0aGUgbmV3IGF0dHJpYnV0ZXMKICAgICAqIG9uIHRoZSB0ZW1wbGF0ZSBuZWVkIHRvIGJlIG1lcmdlZCB3aXRoIHRoZSBleGlzdGluZyBhdHRyaWJ1dGVzIGluIHRoZSBET00uCiAgICAgKiBUaGUgZGVzaXJlZCBlZmZlY3QgaXMgdG8gaGF2ZSBib3RoIG9mIHRoZSBhdHRyaWJ1dGVzIHByZXNlbnQuCiAgICAgKgogICAgICogQHBhcmFtIHtvYmplY3R9IGRzdCBkZXN0aW5hdGlvbiBhdHRyaWJ1dGVzIChvcmlnaW5hbCBET00pCiAgICAgKiBAcGFyYW0ge29iamVjdH0gc3JjIHNvdXJjZSBhdHRyaWJ1dGVzIChmcm9tIHRoZSBkaXJlY3RpdmUgdGVtcGxhdGUpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1lcmdlVGVtcGxhdGVBdHRyaWJ1dGVzKGRzdCwgc3JjKSB7CiAgICAgIHZhciBzcmNBdHRyID0gc3JjLiRhdHRyLAogICAgICAgICAgZHN0QXR0ciA9IGRzdC4kYXR0ciwKICAgICAgICAgICRlbGVtZW50ID0gZHN0LiQkZWxlbWVudDsKCiAgICAgIC8vIHJlYXBwbHkgdGhlIG9sZCBhdHRyaWJ1dGVzIHRvIHRoZSBuZXcgZWxlbWVudAogICAgICBmb3JFYWNoKGRzdCwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgIGlmIChrZXkuY2hhckF0KDApICE9ICckJykgewogICAgICAgICAgaWYgKHNyY1trZXldICYmIHNyY1trZXldICE9PSB2YWx1ZSkgewogICAgICAgICAgICB2YWx1ZSArPSAoa2V5ID09PSAnc3R5bGUnID8gJzsnIDogJyAnKSArIHNyY1trZXldOwogICAgICAgICAgfQogICAgICAgICAgZHN0LiRzZXQoa2V5LCB2YWx1ZSwgdHJ1ZSwgc3JjQXR0cltrZXldKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgLy8gY29weSB0aGUgbmV3IGF0dHJpYnV0ZXMgb24gdGhlIG9sZCBhdHRycyBvYmplY3QKICAgICAgZm9yRWFjaChzcmMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICBpZiAoa2V5ID09ICdjbGFzcycpIHsKICAgICAgICAgIHNhZmVBZGRDbGFzcygkZWxlbWVudCwgdmFsdWUpOwogICAgICAgICAgZHN0WydjbGFzcyddID0gKGRzdFsnY2xhc3MnXSA/IGRzdFsnY2xhc3MnXSArICcgJyA6ICcnKSArIHZhbHVlOwogICAgICAgIH0gZWxzZSBpZiAoa2V5ID09ICdzdHlsZScpIHsKICAgICAgICAgICRlbGVtZW50LmF0dHIoJ3N0eWxlJywgJGVsZW1lbnQuYXR0cignc3R5bGUnKSArICc7JyArIHZhbHVlKTsKICAgICAgICAgIGRzdFsnc3R5bGUnXSA9IChkc3RbJ3N0eWxlJ10gPyBkc3RbJ3N0eWxlJ10gKyAnOycgOiAnJykgKyB2YWx1ZTsKICAgICAgICAgIC8vIGBkc3RgIHdpbGwgbmV2ZXIgY29udGFpbiBoYXNPd25Qcm9wZXJ0eSBhcyBET00gcGFyc2VyIHdvbid0IGxldCBpdC4KICAgICAgICAgIC8vIFlvdSB3aWxsIGdldCBhbiAiSW52YWxpZENoYXJhY3RlckVycm9yOiBET00gRXhjZXB0aW9uIDUiIGVycm9yIGlmIHlvdQogICAgICAgICAgLy8gaGF2ZSBhbiBhdHRyaWJ1dGUgbGlrZSAiaGFzLW93bi1wcm9wZXJ0eSIgb3IgImRhdGEtaGFzLW93bi1wcm9wZXJ0eSIsIGV0Yy4KICAgICAgICB9IGVsc2UgaWYgKGtleS5jaGFyQXQoMCkgIT0gJyQnICYmICFkc3QuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgZHN0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIGRzdEF0dHJba2V5XSA9IHNyY0F0dHJba2V5XTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKCiAgICBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGVVcmwoZGlyZWN0aXZlcywgJGNvbXBpbGVOb2RlLCB0QXR0cnMsCiAgICAgICAgJHJvb3RFbGVtZW50LCBjaGlsZFRyYW5zY2x1ZGVGbiwgcHJlTGlua0ZucywgcG9zdExpbmtGbnMsIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpIHsKICAgICAgdmFyIGxpbmtRdWV1ZSA9IFtdLAogICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4sCiAgICAgICAgICBhZnRlclRlbXBsYXRlQ2hpbGRMaW5rRm4sCiAgICAgICAgICBiZWZvcmVUZW1wbGF0ZUNvbXBpbGVOb2RlID0gJGNvbXBpbGVOb2RlWzBdLAogICAgICAgICAgb3JpZ0FzeW5jRGlyZWN0aXZlID0gZGlyZWN0aXZlcy5zaGlmdCgpLAogICAgICAgICAgLy8gVGhlIGZhY3QgdGhhdCB3ZSBoYXZlIHRvIGNvcHkgYW5kIHBhdGNoIHRoZSBkaXJlY3RpdmUgc2VlbXMgd3JvbmchCiAgICAgICAgICBkZXJpdmVkU3luY0RpcmVjdGl2ZSA9IGV4dGVuZCh7fSwgb3JpZ0FzeW5jRGlyZWN0aXZlLCB7CiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiBudWxsLCB0cmFuc2NsdWRlOiBudWxsLCByZXBsYWNlOiBudWxsLCAkJG9yaWdpbmFsRGlyZWN0aXZlOiBvcmlnQXN5bmNEaXJlY3RpdmUKICAgICAgICAgIH0pLAogICAgICAgICAgdGVtcGxhdGVVcmwgPSAoaXNGdW5jdGlvbihvcmlnQXN5bmNEaXJlY3RpdmUudGVtcGxhdGVVcmwpKQogICAgICAgICAgICAgID8gb3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlVXJsKCRjb21waWxlTm9kZSwgdEF0dHJzKQogICAgICAgICAgICAgIDogb3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlVXJsLAogICAgICAgICAgdGVtcGxhdGVOYW1lc3BhY2UgPSBvcmlnQXN5bmNEaXJlY3RpdmUudGVtcGxhdGVOYW1lc3BhY2U7CgogICAgICAkY29tcGlsZU5vZGUuZW1wdHkoKTsKCiAgICAgICR0ZW1wbGF0ZVJlcXVlc3QoJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodGVtcGxhdGVVcmwpKQogICAgICAgIC50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHsKICAgICAgICAgIHZhciBjb21waWxlTm9kZSwgdGVtcFRlbXBsYXRlQXR0cnMsICR0ZW1wbGF0ZSwgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbjsKCiAgICAgICAgICBjb250ZW50ID0gZGVub3JtYWxpemVUZW1wbGF0ZShjb250ZW50KTsKCiAgICAgICAgICBpZiAob3JpZ0FzeW5jRGlyZWN0aXZlLnJlcGxhY2UpIHsKICAgICAgICAgICAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoY29udGVudCkpIHsKICAgICAgICAgICAgICAkdGVtcGxhdGUgPSBbXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAkdGVtcGxhdGUgPSByZW1vdmVDb21tZW50cyh3cmFwVGVtcGxhdGUodGVtcGxhdGVOYW1lc3BhY2UsIHRyaW0oY29udGVudCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb21waWxlTm9kZSA9ICR0ZW1wbGF0ZVswXTsKCiAgICAgICAgICAgIGlmICgkdGVtcGxhdGUubGVuZ3RoICE9IDEgfHwgY29tcGlsZU5vZGUubm9kZVR5cGUgIT09IE5PREVfVFlQRV9FTEVNRU5UKSB7CiAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3RwbHJ0JywKICAgICAgICAgICAgICAgICAgIlRlbXBsYXRlIGZvciBkaXJlY3RpdmUgJ3swfScgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gezF9IiwKICAgICAgICAgICAgICAgICAgb3JpZ0FzeW5jRGlyZWN0aXZlLm5hbWUsIHRlbXBsYXRlVXJsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGVtcFRlbXBsYXRlQXR0cnMgPSB7JGF0dHI6IHt9fTsKICAgICAgICAgICAgcmVwbGFjZVdpdGgoJHJvb3RFbGVtZW50LCAkY29tcGlsZU5vZGUsIGNvbXBpbGVOb2RlKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGlyZWN0aXZlcyA9IGNvbGxlY3REaXJlY3RpdmVzKGNvbXBpbGVOb2RlLCBbXSwgdGVtcFRlbXBsYXRlQXR0cnMpOwoKICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9yaWdBc3luY0RpcmVjdGl2ZS5zY29wZSkpIHsKICAgICAgICAgICAgICBtYXJrRGlyZWN0aXZlc0FzSXNvbGF0ZSh0ZW1wbGF0ZURpcmVjdGl2ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpcmVjdGl2ZXMgPSB0ZW1wbGF0ZURpcmVjdGl2ZXMuY29uY2F0KGRpcmVjdGl2ZXMpOwogICAgICAgICAgICBtZXJnZVRlbXBsYXRlQXR0cmlidXRlcyh0QXR0cnMsIHRlbXBUZW1wbGF0ZUF0dHJzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZTsKICAgICAgICAgICAgJGNvbXBpbGVOb2RlLmh0bWwoY29udGVudCk7CiAgICAgICAgICB9CgogICAgICAgICAgZGlyZWN0aXZlcy51bnNoaWZ0KGRlcml2ZWRTeW5jRGlyZWN0aXZlKTsKCiAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbiA9IGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBjb21waWxlTm9kZSwgdEF0dHJzLAogICAgICAgICAgICAgIGNoaWxkVHJhbnNjbHVkZUZuLCAkY29tcGlsZU5vZGUsIG9yaWdBc3luY0RpcmVjdGl2ZSwgcHJlTGlua0ZucywgcG9zdExpbmtGbnMsCiAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCk7CiAgICAgICAgICBmb3JFYWNoKCRyb290RWxlbWVudCwgZnVuY3Rpb24obm9kZSwgaSkgewogICAgICAgICAgICBpZiAobm9kZSA9PSBjb21waWxlTm9kZSkgewogICAgICAgICAgICAgICRyb290RWxlbWVudFtpXSA9ICRjb21waWxlTm9kZVswXTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBhZnRlclRlbXBsYXRlQ2hpbGRMaW5rRm4gPSBjb21waWxlTm9kZXMoJGNvbXBpbGVOb2RlWzBdLmNoaWxkTm9kZXMsIGNoaWxkVHJhbnNjbHVkZUZuKTsKCiAgICAgICAgICB3aGlsZSAobGlua1F1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICB2YXIgc2NvcGUgPSBsaW5rUXVldWUuc2hpZnQoKSwKICAgICAgICAgICAgICAgIGJlZm9yZVRlbXBsYXRlTGlua05vZGUgPSBsaW5rUXVldWUuc2hpZnQoKSwKICAgICAgICAgICAgICAgIGxpbmtSb290RWxlbWVudCA9IGxpbmtRdWV1ZS5zaGlmdCgpLAogICAgICAgICAgICAgICAgYm91bmRUcmFuc2NsdWRlRm4gPSBsaW5rUXVldWUuc2hpZnQoKSwKICAgICAgICAgICAgICAgIGxpbmtOb2RlID0gJGNvbXBpbGVOb2RlWzBdOwoKICAgICAgICAgICAgaWYgKHNjb3BlLiQkZGVzdHJveWVkKSBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlICE9PSBiZWZvcmVUZW1wbGF0ZUNvbXBpbGVOb2RlKSB7CiAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSBiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlLmNsYXNzTmFtZTsKCiAgICAgICAgICAgICAgaWYgKCEocHJldmlvdXNDb21waWxlQ29udGV4dC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSAmJgogICAgICAgICAgICAgICAgICBvcmlnQXN5bmNEaXJlY3RpdmUucmVwbGFjZSkpIHsKICAgICAgICAgICAgICAgIC8vIGl0IHdhcyBjbG9uZWQgdGhlcmVmb3JlIHdlIGhhdmUgdG8gY2xvbmUgYXMgd2VsbC4KICAgICAgICAgICAgICAgIGxpbmtOb2RlID0ganFMaXRlQ2xvbmUoY29tcGlsZU5vZGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXBsYWNlV2l0aChsaW5rUm9vdEVsZW1lbnQsIGpxTGl0ZShiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlKSwgbGlua05vZGUpOwoKICAgICAgICAgICAgICAvLyBDb3B5IGluIENTUyBjbGFzc2VzIGZyb20gb3JpZ2luYWwgbm9kZQogICAgICAgICAgICAgIHNhZmVBZGRDbGFzcyhqcUxpdGUobGlua05vZGUpLCBvbGRDbGFzc2VzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4udHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQpIHsKICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gY3JlYXRlQm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGUsIGJvdW5kVHJhbnNjbHVkZUZuKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gYm91bmRUcmFuc2NsdWRlRm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4oYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuLCBzY29wZSwgbGlua05vZGUsICRyb290RWxlbWVudCwKICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTsKICAgICAgICAgIH0KICAgICAgICAgIGxpbmtRdWV1ZSA9IG51bGw7CiAgICAgICAgfSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXllZE5vZGVMaW5rRm4oaWdub3JlQ2hpbGRMaW5rRm4sIHNjb3BlLCBub2RlLCByb290RWxlbWVudCwgYm91bmRUcmFuc2NsdWRlRm4pIHsKICAgICAgICB2YXIgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGJvdW5kVHJhbnNjbHVkZUZuOwogICAgICAgIGlmIChzY29wZS4kJGRlc3Ryb3llZCkgcmV0dXJuOwogICAgICAgIGlmIChsaW5rUXVldWUpIHsKICAgICAgICAgIGxpbmtRdWV1ZS5wdXNoKHNjb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChhZnRlclRlbXBsYXRlTm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCkgewogICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gY3JlYXRlQm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGUsIGJvdW5kVHJhbnNjbHVkZUZuKTsKICAgICAgICAgIH0KICAgICAgICAgIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuKGFmdGVyVGVtcGxhdGVDaGlsZExpbmtGbiwgc2NvcGUsIG5vZGUsIHJvb3RFbGVtZW50LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgoKICAgIC8qKgogICAgICogU29ydGluZyBmdW5jdGlvbiBmb3IgYm91bmQgZGlyZWN0aXZlcy4KICAgICAqLwogICAgZnVuY3Rpb24gYnlQcmlvcml0eShhLCBiKSB7CiAgICAgIHZhciBkaWZmID0gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7CiAgICAgIGlmIChkaWZmICE9PSAwKSByZXR1cm4gZGlmZjsKICAgICAgaWYgKGEubmFtZSAhPT0gYi5uYW1lKSByZXR1cm4gKGEubmFtZSA8IGIubmFtZSkgPyAtMSA6IDE7CiAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgIH0KCgogICAgZnVuY3Rpb24gYXNzZXJ0Tm9EdXBsaWNhdGUod2hhdCwgcHJldmlvdXNEaXJlY3RpdmUsIGRpcmVjdGl2ZSwgZWxlbWVudCkgewogICAgICBpZiAocHJldmlvdXNEaXJlY3RpdmUpIHsKICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignbXVsdGlkaXInLCAnTXVsdGlwbGUgZGlyZWN0aXZlcyBbezB9LCB7MX1dIGFza2luZyBmb3IgezJ9IG9uOiB7M30nLAogICAgICAgICAgICBwcmV2aW91c0RpcmVjdGl2ZS5uYW1lLCBkaXJlY3RpdmUubmFtZSwgd2hhdCwgc3RhcnRpbmdUYWcoZWxlbWVudCkpOwogICAgICB9CiAgICB9CgoKICAgIGZ1bmN0aW9uIGFkZFRleHRJbnRlcnBvbGF0ZURpcmVjdGl2ZShkaXJlY3RpdmVzLCB0ZXh0KSB7CiAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKHRleHQsIHRydWUpOwogICAgICBpZiAoaW50ZXJwb2xhdGVGbikgewogICAgICAgIGRpcmVjdGl2ZXMucHVzaCh7CiAgICAgICAgICBwcmlvcml0eTogMCwKICAgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZUNvbXBpbGVGbih0ZW1wbGF0ZU5vZGUpIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlTm9kZVBhcmVudCA9IHRlbXBsYXRlTm9kZS5wYXJlbnQoKSwKICAgICAgICAgICAgICAgIGhhc0NvbXBpbGVQYXJlbnQgPSAhIXRlbXBsYXRlTm9kZVBhcmVudC5sZW5ndGg7CgogICAgICAgICAgICAvLyBXaGVuIHRyYW5zY2x1ZGluZyBhIHRlbXBsYXRlIHRoYXQgaGFzIGJpbmRpbmdzIGluIHRoZSByb290CiAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgYW5kIHRodXMgbmVlZCB0byBhZGQgdGhlIGNsYXNzIGR1cmluZyBsaW5raW5nIGZuLgogICAgICAgICAgICBpZiAoaGFzQ29tcGlsZVBhcmVudCkgY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyh0ZW1wbGF0ZU5vZGVQYXJlbnQpOwoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZUxpbmtGbihzY29wZSwgbm9kZSkgewogICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwogICAgICAgICAgICAgIGlmICghaGFzQ29tcGlsZVBhcmVudCkgY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyhwYXJlbnQpOwogICAgICAgICAgICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhwYXJlbnQsIGludGVycG9sYXRlRm4uZXhwcmVzc2lvbnMpOwogICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChpbnRlcnBvbGF0ZUZuLCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUZuV2F0Y2hBY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIG5vZGVbMF0ubm9kZVZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCgogICAgZnVuY3Rpb24gd3JhcFRlbXBsYXRlKHR5cGUsIHRlbXBsYXRlKSB7CiAgICAgIHR5cGUgPSBsb3dlcmNhc2UodHlwZSB8fCAnaHRtbCcpOwogICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSAnc3ZnJzoKICAgICAgY2FzZSAnbWF0aCc6CiAgICAgICAgdmFyIHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICB3cmFwcGVyLmlubmVySFRNTCA9ICc8JyArIHR5cGUgKyAnPicgKyB0ZW1wbGF0ZSArICc8LycgKyB0eXBlICsgJz4nOwogICAgICAgIHJldHVybiB3cmFwcGVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2RlczsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICAgIH0KICAgIH0KCgogICAgZnVuY3Rpb24gZ2V0VHJ1c3RlZENvbnRleHQobm9kZSwgYXR0ck5vcm1hbGl6ZWROYW1lKSB7CiAgICAgIGlmIChhdHRyTm9ybWFsaXplZE5hbWUgPT0gInNyY2RvYyIpIHsKICAgICAgICByZXR1cm4gJHNjZS5IVE1MOwogICAgICB9CiAgICAgIHZhciB0YWcgPSBub2RlTmFtZV8obm9kZSk7CiAgICAgIC8vIG1hY3Rpb25beGxpbms6aHJlZl0gY2FuIHNvdXJjZSBTVkcuICBJdCdzIG5vdCBsaW1pdGVkIHRvIDxtYWN0aW9uPi4KICAgICAgaWYgKGF0dHJOb3JtYWxpemVkTmFtZSA9PSAieGxpbmtIcmVmIiB8fAogICAgICAgICAgKHRhZyA9PSAiZm9ybSIgJiYgYXR0ck5vcm1hbGl6ZWROYW1lID09ICJhY3Rpb24iKSB8fAogICAgICAgICAgKHRhZyAhPSAiaW1nIiAmJiAoYXR0ck5vcm1hbGl6ZWROYW1lID09ICJzcmMiIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTm9ybWFsaXplZE5hbWUgPT0gIm5nU3JjIikpKSB7CiAgICAgICAgcmV0dXJuICRzY2UuUkVTT1VSQ0VfVVJMOwogICAgICB9CiAgICB9CgoKICAgIGZ1bmN0aW9uIGFkZEF0dHJJbnRlcnBvbGF0ZURpcmVjdGl2ZShub2RlLCBkaXJlY3RpdmVzLCB2YWx1ZSwgbmFtZSwgYWxsT3JOb3RoaW5nKSB7CiAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKHZhbHVlLCB0cnVlKTsKCiAgICAgIC8vIG5vIGludGVycG9sYXRpb24gZm91bmQgLT4gaWdub3JlCiAgICAgIGlmICghaW50ZXJwb2xhdGVGbikgcmV0dXJuOwoKCiAgICAgIGlmIChuYW1lID09PSAibXVsdGlwbGUiICYmIG5vZGVOYW1lXyhub2RlKSA9PT0gInNlbGVjdCIpIHsKICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigic2VsbXVsdGkiLAogICAgICAgICAgICAiQmluZGluZyB0byB0aGUgJ211bHRpcGxlJyBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZC4gRWxlbWVudDogezB9IiwKICAgICAgICAgICAgc3RhcnRpbmdUYWcobm9kZSkpOwogICAgICB9CgogICAgICBkaXJlY3RpdmVzLnB1c2goewogICAgICAgIHByaW9yaXR5OiAxMDAsCiAgICAgICAgY29tcGlsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcHJlOiBmdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVQcmVMaW5rRm4oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKICAgICAgICAgICAgICAgIHZhciAkJG9ic2VydmVycyA9IChhdHRyLiQkb2JzZXJ2ZXJzIHx8IChhdHRyLiQkb2JzZXJ2ZXJzID0ge30pKTsKCiAgICAgICAgICAgICAgICBpZiAoRVZFTlRfSEFORExFUl9BVFRSX1JFR0VYUC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdub2RvbWV2ZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJwb2xhdGlvbnMgZm9yIEhUTUwgRE9NIGV2ZW50IGF0dHJpYnV0ZXMgYXJlIGRpc2FsbG93ZWQuICBQbGVhc2UgdXNlIHRoZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAibmctIHZlcnNpb25zIChzdWNoIGFzIG5nLWNsaWNrIGluc3RlYWQgb2Ygb25jbGljaykgaW5zdGVhZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIHdhcyByZW1vdmVkLCB0aGVuIHdlIGFyZSBkb25lCiAgICAgICAgICAgICAgICBpZiAoIWF0dHJbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUgYWdhaW4sIGluIGNhc2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYmVlbiB1cGRhdGVkCiAgICAgICAgICAgICAgICAvLyAoZS5nLiBieSBhbm90aGVyIGRpcmVjdGl2ZSdzIGNvbXBpbGUgZnVuY3Rpb24pCiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKGF0dHJbbmFtZV0sIHRydWUsIGdldFRydXN0ZWRDb250ZXh0KG5vZGUsIG5hbWUpLAogICAgICAgICAgICAgICAgICAgIEFMTF9PUl9OT1RISU5HX0FUVFJTW25hbWVdIHx8IGFsbE9yTm90aGluZyk7CgogICAgICAgICAgICAgICAgLy8gaWYgYXR0cmlidXRlIHdhcyB1cGRhdGVkIHNvIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiBnb2luZyBvbiB3ZSBkb24ndCB3YW50IHRvCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBhbnkgb2JzZXJ2ZXJzCiAgICAgICAgICAgICAgICBpZiAoIWludGVycG9sYXRlRm4pIHJldHVybjsKCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGF0dHIgb2JqZWN0IHNvIHRoYXQgaXQncyByZWFkeSBpbiBjYXNlIHdlIG5lZWQgdGhlIHZhbHVlIGZvciBpc29sYXRlCiAgICAgICAgICAgICAgICAvLyBzY29wZSBpbml0aWFsaXphdGlvbiwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSB3b3VsZCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXNvbGF0ZQogICAgICAgICAgICAgICAgLy8gZGlyZWN0aXZlJ3MgbGlua2luZyBmbiBkdXJpbmcgbGlua2luZyBwaGFzZQogICAgICAgICAgICAgICAgYXR0cltuYW1lXSA9IGludGVycG9sYXRlRm4oc2NvcGUpOwoKICAgICAgICAgICAgICAgICgkJG9ic2VydmVyc1tuYW1lXSB8fCAoJCRvYnNlcnZlcnNbbmFtZV0gPSBbXSkpLiQkaW50ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgKGF0dHIuJCRvYnNlcnZlcnMgJiYgYXR0ci4kJG9ic2VydmVyc1tuYW1lXS4kJHNjb3BlIHx8IHNjb3BlKS4KICAgICAgICAgICAgICAgICAgJHdhdGNoKGludGVycG9sYXRlRm4sIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaEFjdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgY2xhc3MgYXR0cmlidXRlIGFkZGl0aW9uICsgcmVtb3ZhbAogICAgICAgICAgICAgICAgICAgIC8vc28gdGhhdCBjbGFzcyBjaGFuZ2VzIGNhbiB0YXAgaW50byB0aGUgYW5pbWF0aW9uCiAgICAgICAgICAgICAgICAgICAgLy9ob29rcyBwcm92aWRlZCBieSB0aGUgJGFuaW1hdGUgc2VydmljZS4gQmUgc3VyZSB0bwogICAgICAgICAgICAgICAgICAgIC8vc2tpcCBhbmltYXRpb25zIHdoZW4gdGhlIGZpcnN0IGRpZ2VzdCBvY2N1cnMgKHdoZW4KICAgICAgICAgICAgICAgICAgICAvL2JvdGggdGhlIG5ldyBhbmQgdGhlIG9sZCB2YWx1ZXMgYXJlIHRoZSBzYW1lKSBzaW5jZQogICAgICAgICAgICAgICAgICAgIC8vdGhlIENTUyBjbGFzc2VzIGFyZSB0aGUgbm9uLWludGVycG9sYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJyAmJiBuZXdWYWx1ZSAhPSBvbGRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgYXR0ci4kdXBkYXRlQ2xhc3MobmV3VmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgYXR0ci4kc2V0KG5hbWUsIG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgfSk7CiAgICB9CgoKICAgIC8qKgogICAgICogVGhpcyBpcyBhIHNwZWNpYWwganFMaXRlLnJlcGxhY2VXaXRoLCB3aGljaCBjYW4gcmVwbGFjZSBpdGVtcyB3aGljaAogICAgICogaGF2ZSBubyBwYXJlbnRzLCBwcm92aWRlZCB0aGF0IHRoZSBjb250YWluaW5nIGpxTGl0ZSBjb2xsZWN0aW9uIGlzIHByb3ZpZGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7SnFMaXRlPX0gJHJvb3RFbGVtZW50IFRoZSByb290IG9mIHRoZSBjb21waWxlIHRyZWUuIFVzZWQgc28gdGhhdCB3ZSBjYW4gcmVwbGFjZSBub2RlcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJvb3Qgb2YgdGhlIHRyZWUuCiAgICAgKiBAcGFyYW0ge0pxTGl0ZX0gZWxlbWVudHNUb1JlbW92ZSBUaGUganFMaXRlIGVsZW1lbnQgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHJlcGxhY2UuIFdlIGtlZXAKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaGVsbCwgYnV0IHJlcGxhY2UgaXRzIERPTSBub2RlIHJlZmVyZW5jZS4KICAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSBUaGUgbmV3IERPTSBub2RlLgogICAgICovCiAgICBmdW5jdGlvbiByZXBsYWNlV2l0aCgkcm9vdEVsZW1lbnQsIGVsZW1lbnRzVG9SZW1vdmUsIG5ld05vZGUpIHsKICAgICAgdmFyIGZpcnN0RWxlbWVudFRvUmVtb3ZlID0gZWxlbWVudHNUb1JlbW92ZVswXSwKICAgICAgICAgIHJlbW92ZUNvdW50ID0gZWxlbWVudHNUb1JlbW92ZS5sZW5ndGgsCiAgICAgICAgICBwYXJlbnQgPSBmaXJzdEVsZW1lbnRUb1JlbW92ZS5wYXJlbnROb2RlLAogICAgICAgICAgaSwgaWk7CgogICAgICBpZiAoJHJvb3RFbGVtZW50KSB7CiAgICAgICAgZm9yIChpID0gMCwgaWkgPSAkcm9vdEVsZW1lbnQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgaWYgKCRyb290RWxlbWVudFtpXSA9PSBmaXJzdEVsZW1lbnRUb1JlbW92ZSkgewogICAgICAgICAgICAkcm9vdEVsZW1lbnRbaSsrXSA9IG5ld05vZGU7CiAgICAgICAgICAgIGZvciAodmFyIGogPSBpLCBqMiA9IGogKyByZW1vdmVDb3VudCAtIDEsCiAgICAgICAgICAgICAgICAgICAgIGpqID0gJHJvb3RFbGVtZW50Lmxlbmd0aDsKICAgICAgICAgICAgICAgICBqIDwgamo7IGorKywgajIrKykgewogICAgICAgICAgICAgIGlmIChqMiA8IGpqKSB7CiAgICAgICAgICAgICAgICAkcm9vdEVsZW1lbnRbal0gPSAkcm9vdEVsZW1lbnRbajJdOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJHJvb3RFbGVtZW50W2pdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkcm9vdEVsZW1lbnQubGVuZ3RoIC09IHJlbW92ZUNvdW50IC0gMTsKCiAgICAgICAgICAgIC8vIElmIHRoZSByZXBsYWNlZCBlbGVtZW50IGlzIGFsc28gdGhlIGpRdWVyeSAuY29udGV4dCB0aGVuIHJlcGxhY2UgaXQKICAgICAgICAgICAgLy8gLmNvbnRleHQgaXMgYSBkZXByZWNhdGVkIGpRdWVyeSBhcGksIHNvIHdlIHNob3VsZCBzZXQgaXQgb25seSB3aGVuIGpRdWVyeSBzZXQgaXQKICAgICAgICAgICAgLy8gaHR0cDovL2FwaS5qcXVlcnkuY29tL2NvbnRleHQvCiAgICAgICAgICAgIGlmICgkcm9vdEVsZW1lbnQuY29udGV4dCA9PT0gZmlyc3RFbGVtZW50VG9SZW1vdmUpIHsKICAgICAgICAgICAgICAkcm9vdEVsZW1lbnQuY29udGV4dCA9IG5ld05vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBmaXJzdEVsZW1lbnRUb1JlbW92ZSk7CiAgICAgIH0KCiAgICAgIC8vIFRPRE8ocGVyZik6IHdoYXQncyB0aGlzIGRvY3VtZW50IGZyYWdtZW50IGZvcj8gaXMgaXQgbmVlZGVkPyBjYW4gd2UgYXQgbGVhc3QgcmV1c2UgaXQ/CiAgICAgIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZmlyc3RFbGVtZW50VG9SZW1vdmUpOwoKICAgICAgLy8gQ29weSBvdmVyIHVzZXIgZGF0YSAodGhhdCBpbmNsdWRlcyBBbmd1bGFyJ3MgJHNjb3BlIGV0Yy4pLiBEb24ndCBjb3B5IHByaXZhdGUKICAgICAgLy8gZGF0YSBoZXJlIGJlY2F1c2UgdGhlcmUncyBubyBwdWJsaWMgaW50ZXJmYWNlIGluIGpRdWVyeSB0byBkbyB0aGF0IGFuZCBjb3B5aW5nIG92ZXIKICAgICAgLy8gZXZlbnQgbGlzdGVuZXJzICh3aGljaCBpcyB0aGUgbWFpbiB1c2Ugb2YgcHJpdmF0ZSBkYXRhKSB3b3VsZG4ndCB3b3JrIGFueXdheS4KICAgICAganFMaXRlKG5ld05vZGUpLmRhdGEoanFMaXRlKGZpcnN0RWxlbWVudFRvUmVtb3ZlKS5kYXRhKCkpOwoKICAgICAgLy8gUmVtb3ZlIGRhdGEgb2YgdGhlIHJlcGxhY2VkIGVsZW1lbnQuIFdlIGNhbm5vdCBqdXN0IGNhbGwgLnJlbW92ZSgpCiAgICAgIC8vIG9uIHRoZSBlbGVtZW50IGl0IHNpbmNlIHRoYXQgd291bGQgZGVhbGxvY2F0ZSBzY29wZSB0aGF0IGlzIG5lZWRlZAogICAgICAvLyBmb3IgdGhlIG5ldyBub2RlLiBJbnN0ZWFkLCByZW1vdmUgdGhlIGRhdGEgIm1hbnVhbGx5Ii4KICAgICAgaWYgKCFqUXVlcnkpIHsKICAgICAgICBkZWxldGUganFMaXRlLmNhY2hlW2ZpcnN0RWxlbWVudFRvUmVtb3ZlW2pxTGl0ZS5leHBhbmRvXV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8galF1ZXJ5IDIueCBkb2Vzbid0IGV4cG9zZSB0aGUgZGF0YSBzdG9yYWdlLiBVc2UgalF1ZXJ5LmNsZWFuRGF0YSB0byBjbGVhbiB1cCBhZnRlcgogICAgICAgIC8vIHRoZSByZXBsYWNlZCBlbGVtZW50LiBUaGUgY2xlYW5EYXRhIHZlcnNpb24gbW9ua2V5LXBhdGNoZWQgYnkgQW5ndWxhciB3b3VsZCBjYXVzZQogICAgICAgIC8vIHRoZSBzY29wZSB0byBiZSB0cmFzaGVkIGFuZCB3ZSBkbyBuZWVkIHRoZSB2ZXJ5IHNhbWUgc2NvcGUgdG8gd29yayB3aXRoIHRoZSBuZXcKICAgICAgICAvLyBlbGVtZW50LiBIb3dldmVyLCB3ZSBjYW5ub3QganVzdCBjYWNoZSB0aGUgbm9uLXBhdGNoZWQgdmVyc2lvbiBhbmQgdXNlIGl0IGhlcmUgYXMKICAgICAgICAvLyB0aGF0IHdvdWxkIGJyZWFrIGlmIGFub3RoZXIgbGlicmFyeSBwYXRjaGVzIHRoZSBtZXRob2QgYWZ0ZXIgQW5ndWxhciBkb2VzIChvbmUKICAgICAgICAvLyBleGFtcGxlIGlzIGpRdWVyeSBVSSkuIEluc3RlYWQsIHNldCBhIGZsYWcgaW5kaWNhdGluZyBzY29wZSBkZXN0cm95aW5nIHNob3VsZCBiZQogICAgICAgIC8vIHNraXBwZWQgdGhpcyBvbmUgdGltZS4KICAgICAgICBza2lwRGVzdHJveU9uTmV4dEpRdWVyeUNsZWFuRGF0YSA9IHRydWU7CiAgICAgICAgalF1ZXJ5LmNsZWFuRGF0YShbZmlyc3RFbGVtZW50VG9SZW1vdmVdKTsKICAgICAgfQoKICAgICAgZm9yICh2YXIgayA9IDEsIGtrID0gZWxlbWVudHNUb1JlbW92ZS5sZW5ndGg7IGsgPCBrazsgaysrKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1RvUmVtb3ZlW2tdOwogICAgICAgIGpxTGl0ZShlbGVtZW50KS5yZW1vdmUoKTsgLy8gbXVzdCBkbyB0aGlzIHdheSB0byBjbGVhbiB1cCBleHBhbmRvCiAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CiAgICAgICAgZGVsZXRlIGVsZW1lbnRzVG9SZW1vdmVba107CiAgICAgIH0KCiAgICAgIGVsZW1lbnRzVG9SZW1vdmVbMF0gPSBuZXdOb2RlOwogICAgICBlbGVtZW50c1RvUmVtb3ZlLmxlbmd0aCA9IDE7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGNsb25lQW5kQW5ub3RhdGVGbihmbiwgYW5ub3RhdGlvbikgewogICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uKCkgeyByZXR1cm4gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfSwgZm4sIGFubm90YXRpb24pOwogICAgfQoKCiAgICBmdW5jdGlvbiBpbnZva2VMaW5rRm4obGlua0ZuLCBzY29wZSwgJGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycywgdHJhbnNjbHVkZUZuKSB7CiAgICAgIHRyeSB7CiAgICAgICAgbGlua0ZuKHNjb3BlLCAkZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSwgc3RhcnRpbmdUYWcoJGVsZW1lbnQpKTsKICAgICAgfQogICAgfQogIH1dOwp9Cgp2YXIgUFJFRklYX1JFR0VYUCA9IC9eKCg/Onh8ZGF0YSlbXDpcLV9dKS9pOwovKioKICogQ29udmVydHMgYWxsIGFjY2VwdGVkIGRpcmVjdGl2ZXMgZm9ybWF0IGludG8gcHJvcGVyIGRpcmVjdGl2ZSBuYW1lLgogKiBBbGwgb2YgdGhlc2Ugd2lsbCBiZWNvbWUgJ215RGlyZWN0aXZlJzoKICogICBteTpEaXJlY3RpdmUKICogICBteS1kaXJlY3RpdmUKICogICB4LW15LWRpcmVjdGl2ZQogKiAgIGRhdGEtbXk6ZGlyZWN0aXZlCiAqCiAqIEFsc28gdGhlcmUgaXMgc3BlY2lhbCBjYXNlIGZvciBNb3ogcHJlZml4IHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZSBsZXR0ZXIuCiAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gbm9ybWFsaXplCiAqLwpmdW5jdGlvbiBkaXJlY3RpdmVOb3JtYWxpemUobmFtZSkgewogIHJldHVybiBjYW1lbENhc2UobmFtZS5yZXBsYWNlKFBSRUZJWF9SRUdFWFAsICcnKSk7Cn0KCi8qKgogKiBAbmdkb2MgdHlwZQogKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcwogKgogKiBAZGVzY3JpcHRpb24KICogQSBzaGFyZWQgb2JqZWN0IGJldHdlZW4gZGlyZWN0aXZlIGNvbXBpbGUgLyBsaW5raW5nIGZ1bmN0aW9ucyB3aGljaCBjb250YWlucyBub3JtYWxpemVkIERPTQogKiBlbGVtZW50IGF0dHJpYnV0ZXMuIFRoZSB2YWx1ZXMgcmVmbGVjdCBjdXJyZW50IGJpbmRpbmcgc3RhdGUgYHt7IH19YC4gVGhlIG5vcm1hbGl6YXRpb24gaXMKICogbmVlZGVkIHNpbmNlIGFsbCBvZiB0aGVzZSBhcmUgdHJlYXRlZCBhcyBlcXVpdmFsZW50IGluIEFuZ3VsYXI6CiAqCiAqIGBgYAogKiAgICA8c3BhbiBuZzpiaW5kPSJhIiBuZy1iaW5kPSJhIiBkYXRhLW5nLWJpbmQ9ImEiIHgtbmctYmluZD0iYSI+CiAqIGBgYAogKi8KCi8qKgogKiBAbmdkb2MgcHJvcGVydHkKICogQG5hbWUgjNzvViGLAQAKIAAACiAAAGj3KB/SxQgAJ60eEwgARQAf/NM7QABABrfZwKgHYMCoBzYf9ZUiQbZ1uFh6fNOAGAFTr9UAAAEBCAoATaW6AKNevSRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBBIG1hcCBvZiBET00gZWxlbWVudCBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlIG5vcm1hbGl6ZWQgbmFtZS4gVGhpcyBpcwogKiBuZWVkZWQgdG8gZG8gcmV2ZXJzZSBsb29rdXAgZnJvbSBub3JtYWxpemVkIG5hbWUgYmFjayB0byBhY3R1YWwgbmFtZS4KICovCgoKLyoqCiAqIEBuZ2RvYyBtZXRob2QKICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMjJHNldAogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogU2V0IERPTSBlbGVtZW50IGF0dHJpYnV0ZSB2YWx1ZS4KICoKICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9ybWFsaXplZCBlbGVtZW50IGF0dHJpYnV0ZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBtb2RpZnkuIFRoZSBuYW1lIGlzCiAqICAgICAgICAgIHJldmVyc2UtdHJhbnNsYXRlZCB1c2luZyB0aGUge0BsaW5rIG5nLiRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyICRhdHRyfQogKiAgICAgICAgICBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgbmFtZS4KICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFZhbHVlIHRvIHNldCB0aGUgYXR0cmlidXRlIHRvLiBUaGUgdmFsdWUgY2FuIGJlIGFuIGludGVycG9sYXRlZCBzdHJpbmcuCiAqLwoKCgovKioKICogQ2xvc3VyZSBjb21waWxlciB0eXBlIGluZm9ybWF0aW9uCiAqLwoKZnVuY3Rpb24gbm9kZXNldExpbmtpbmdGbigKICAvKiBhbmd1bGFyLlNjb3BlICovIHNjb3BlLAogIC8qIE5vZGVMaXN0ICovIG5vZGVMaXN0LAogIC8qIEVsZW1lbnQgKi8gcm9vdEVsZW1lbnQsCiAgLyogZnVuY3Rpb24oRnVuY3Rpb24pICovIGJvdW5kVHJhbnNjbHVkZUZuCikge30KCmZ1bmN0aW9uIGRpcmVjdGl2ZUxpbmtpbmdGbigKICAvKiBub2Rlc2V0TGlua2luZ0ZuICovIG5vZGVzZXRMaW5raW5nRm4sCiAgLyogYW5ndWxhci5TY29wZSAqLyBzY29wZSwKICAvKiBOb2RlICovIG5vZGUsCiAgLyogRWxlbWVudCAqLyByb290RWxlbWVudCwKICAvKiBmdW5jdGlvbihGdW5jdGlvbikgKi8gYm91bmRUcmFuc2NsdWRlRm4KKSB7fQoKZnVuY3Rpb24gdG9rZW5EaWZmZXJlbmNlKHN0cjEsIHN0cjIpIHsKICB2YXIgdmFsdWVzID0gJycsCiAgICAgIHRva2VuczEgPSBzdHIxLnNwbGl0KC9ccysvKSwKICAgICAgdG9rZW5zMiA9IHN0cjIuc3BsaXQoL1xzKy8pOwoKICBvdXRlcjoKICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2VuczEubGVuZ3RoOyBpKyspIHsKICAgIHZhciB0b2tlbiA9IHRva2VuczFbaV07CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRva2VuczIubGVuZ3RoOyBqKyspIHsKICAgICAgaWYgKHRva2VuID09IHRva2VuczJbal0pIGNvbnRpbnVlIG91dGVyOwogICAgfQogICAgdmFsdWVzICs9ICh2YWx1ZXMubGVuZ3RoID4gMCA/ICcgJyA6ICcnKSArIHRva2VuOwogIH0KICByZXR1cm4gdmFsdWVzOwp9CgpmdW5jdGlvbiByZW1vdmVDb21tZW50cyhqcU5vZGVzKSB7CiAganFOb2RlcyA9IGpxTGl0ZShqcU5vZGVzKTsKICB2YXIgaSA9IGpxTm9kZXMubGVuZ3RoOwoKICBpZiAoaSA8PSAxKSB7CiAgICByZXR1cm4ganFOb2RlczsKICB9CgogIHdoaWxlIChpLS0pIHsKICAgIHZhciBub2RlID0ganFOb2Rlc1tpXTsKICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOT0RFX1RZUEVfQ09NTUVOVCkgewogICAgICBzcGxpY2UuY2FsbChqcU5vZGVzLCBpLCAxKTsKICAgIH0KICB9CiAgcmV0dXJuIGpxTm9kZXM7Cn0KCi8qKgogKiBAbmdkb2MgcHJvdmlkZXIKICogQG5hbWUgJGNvbnRyb2xsZXJQcm92aWRlcgogKiBAZGVzY3JpcHRpb24KICogVGhlIHtAbGluayBuZy4kY29udHJvbGxlciAkY29udHJvbGxlciBzZXJ2aWNlfSBpcyB1c2VkIGJ5IEFuZ3VsYXIgdG8gY3JlYXRlIG5ldwogKiBjb250cm9sbGVycy4KICoKICogVGhpcyBwcm92aWRlciBhbGxvd3MgY29udHJvbGxlciByZWdpc3RyYXRpb24gdmlhIHRoZQogKiB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciNyZWdpc3RlciByZWdpc3Rlcn0gbWV0aG9kLgogKi8KZnVuY3Rpb24gJENvbnRyb2xsZXJQcm92aWRlcigpIHsKICB2YXIgY29udHJvbGxlcnMgPSB7fSwKICAgICAgZ2xvYmFscyA9IGZhbHNlLAogICAgICBDTlRSTF9SRUcgPSAvXihcUyspKFxzK2FzXHMrKFx3KykpPyQvOwoKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRjb250cm9sbGVyUHJvdmlkZXIjcmVnaXN0ZXIKICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgQ29udHJvbGxlciBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGNvbnRyb2xsZXJzIHdoZXJlIHRoZSBrZXlzIGFyZQogICAqICAgIHRoZSBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGNvbnN0cnVjdG9ycy4KICAgKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBjb25zdHJ1Y3RvciBDb250cm9sbGVyIGNvbnN0cnVjdG9yIGZuIChvcHRpb25hbGx5IGRlY29yYXRlZCB3aXRoIERJCiAgICogICAgYW5ub3RhdGlvbnMgaW4gdGhlIGFycmF5IG5vdGF0aW9uKS4KICAgKi8KICB0aGlzLnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgY29uc3RydWN0b3IpIHsKICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdjb250cm9sbGVyJyk7CiAgICBpZiAoaXNPYmplY3QobmFtZSkpIHsKICAgICAgZXh0ZW5kKGNvbnRyb2xsZXJzLCBuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRyb2xsZXJzW25hbWVdID0gY29uc3RydWN0b3I7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRjb250cm9sbGVyUHJvdmlkZXIjYWxsb3dHbG9iYWxzCiAgICogQGRlc2NyaXB0aW9uIElmIGNhbGxlZCwgYWxsb3dzIGAkY29udHJvbGxlcmAgdG8gZmluZCBjb250cm9sbGVyIGNvbnN0cnVjdG9ycyBvbiBgd2luZG93YAogICAqLwogIHRoaXMuYWxsb3dHbG9iYWxzID0gZnVuY3Rpb24oKSB7CiAgICBnbG9iYWxzID0gdHJ1ZTsKICB9OwoKCiAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCAnJHdpbmRvdycsIGZ1bmN0aW9uKCRpbmplY3RvciwgJHdpbmRvdykgewoKICAgIC8qKgogICAgICogQG5nZG9jIHNlcnZpY2UKICAgICAqIEBuYW1lICRjb250cm9sbGVyCiAgICAgKiBAcmVxdWlyZXMgJGluamVjdG9yCiAgICAgKgogICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGNvbnN0cnVjdG9yIElmIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb24gdGhlbiBpdCdzIGNvbnNpZGVyZWQgdG8gYmUgdGhlCiAgICAgKiAgICBjb250cm9sbGVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLiBPdGhlcndpc2UgaXQncyBjb25zaWRlcmVkIHRvIGJlIGEgc3RyaW5nIHdoaWNoIGlzIHVzZWQKICAgICAqICAgIHRvIHJldHJpZXZlIHRoZSBjb250cm9sbGVyIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAgICAgKgogICAgICogICAgKiBjaGVjayBpZiBhIGNvbnRyb2xsZXIgd2l0aCBnaXZlbiBuYW1lIGlzIHJlZ2lzdGVyZWQgdmlhIGAkY29udHJvbGxlclByb3ZpZGVyYAogICAgICogICAgKiBjaGVjayBpZiBldmFsdWF0aW5nIHRoZSBzdHJpbmcgb24gdGhlIGN1cnJlbnQgc2NvcGUgcmV0dXJucyBhIGNvbnN0cnVjdG9yCiAgICAgKiAgICAqIGlmICRjb250cm9sbGVyUHJvdmlkZXIjYWxsb3dHbG9iYWxzLCBjaGVjayBgd2luZG93W2NvbnN0cnVjdG9yXWAgb24gdGhlIGdsb2JhbAogICAgICogICAgICBgd2luZG93YCBvYmplY3QgKG5vdCByZWNvbW1lbmRlZCkKICAgICAqCiAgICAgKiAgICBUaGUgc3RyaW5nIGNhbiB1c2UgdGhlIGBjb250cm9sbGVyIGFzIHByb3BlcnR5YCBzeW50YXgsIHdoZXJlIHRoZSBjb250cm9sbGVyIGluc3RhbmNlIGlzIHB1Ymxpc2hlZAogICAgICogICAgYXMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBvbiB0aGUgYHNjb3BlYDsgdGhlIGBzY29wZWAgbXVzdCBiZSBpbmplY3RlZCBpbnRvIGBsb2NhbHNgIHBhcmFtIGZvciB0aGlzCiAgICAgKiAgICB0byB3b3JrIGNvcnJlY3RseS4KICAgICAqCiAgICAgKiBAcGFyYW0ge09iamVjdH0gbG9jYWxzIEluamVjdGlvbiBsb2NhbHMgZm9yIENvbnRyb2xsZXIuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEluc3RhbmNlIG9mIGdpdmVuIGNvbnRyb2xsZXIuCiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBgJGNvbnRyb2xsZXJgIHNlcnZpY2UgaXMgcmVzcG9uc2libGUgZm9yIGluc3RhbnRpYXRpbmcgY29udHJvbGxlcnMuCiAgICAgKgogICAgICogSXQncyBqdXN0IGEgc2ltcGxlIGNhbGwgdG8ge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0sIGJ1dCBleHRyYWN0ZWQgaW50bwogICAgICogYSBzZXJ2aWNlLCBzbyB0aGF0IG9uZSBjYW4gb3ZlcnJpZGUgdGhpcyBzZXJ2aWNlIHdpdGggW0JDIHZlcnNpb25dKGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzE2NDk3ODgpLgogICAgICovCiAgICByZXR1cm4gZnVuY3Rpb24oZXhwcmVzc2lvbiwgbG9jYWxzLCBsYXRlciwgaWRlbnQpIHsKICAgICAgLy8gUFJJVkFURSBBUEk6CiAgICAgIC8vICAgcGFyYW0gYGxhdGVyYCAtLS0gaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIncyBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIGF0IGEgbGF0ZXIgdGltZS4KICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBJZiB0cnVlLCAkY29udHJvbGxlciB3aWxsIGFsbG9jYXRlIHRoZSBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdAogICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZSBjaGFpbiwgYnV0IHdpbGwgbm90IGludm9rZSB0aGUgY29udHJvbGxlciB1bnRpbCBhIHJldHVybmVkCiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgaXMgaW52b2tlZC4KICAgICAgLy8gICBwYXJhbSBgaWRlbnRgIC0tLSBBbiBvcHRpb25hbCBsYWJlbCB3aGljaCBvdmVycmlkZXMgdGhlIGxhYmVsIHBhcnNlZCBmcm9tIHRoZSBjb250cm9sbGVyCiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgaWYgYW55LgogICAgICB2YXIgaW5zdGFuY2UsIG1hdGNoLCBjb25zdHJ1Y3RvciwgaWRlbnRpZmllcjsKICAgICAgbGF0ZXIgPSBsYXRlciA9PT0gdHJ1ZTsKICAgICAgaWYgKGlkZW50ICYmIGlzU3RyaW5nKGlkZW50KSkgewogICAgICAgIGlkZW50aWZpZXIgPSBpZGVudDsKICAgICAgfQoKICAgICAgaWYgKGlzU3RyaW5nKGV4cHJlc3Npb24pKSB7CiAgICAgICAgbWF0Y2ggPSBleHByZXNzaW9uLm1hdGNoKENOVFJMX1JFRyksCiAgICAgICAgY29uc3RydWN0b3IgPSBtYXRjaFsxXSwKICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllciB8fCBtYXRjaFszXTsKICAgICAgICBleHByZXNzaW9uID0gY29udHJvbGxlcnMuaGFzT3duUHJvcGVydHkoY29uc3RydWN0b3IpCiAgICAgICAgICAgID8gY29udHJvbGxlcnNbY29uc3RydWN0b3JdCiAgICAgICAgICAgIDogZ2V0dGVyKGxvY2Fscy4kc2NvcGUsIGNvbnN0cnVjdG9yLCB0cnVlKSB8fAogICAgICAgICAgICAgICAgKGdsb2JhbHMgPyBnZXR0ZXIoJHdpbmRvdywgY29uc3RydWN0b3IsIHRydWUpIDogdW5kZWZpbmVkKTsKCiAgICAgICAgYXNzZXJ0QXJnRm4oZXhwcmVzc2lvbiwgY29uc3RydWN0b3IsIHRydWUpOwogICAgICB9CgogICAgICBpZiAobGF0ZXIpIHsKICAgICAgICAvLyBJbnN0YW50aWF0ZSBjb250cm9sbGVyIGxhdGVyOgogICAgICAgIC8vIFRoaXMgbWFjaGluZXJ5IGlzIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAgLy8gY29udHJvbGxlcidzIGNvbnN0cnVjdG9yIGl0c2VsZi4KICAgICAgICAvLwogICAgICAgIC8vIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXIgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcwogICAgICAgIC8vIGludm9rZWQuIFByaW1hcmlseSwgdGhpcyBpcyB1c2VkIGZvciBpc29sYXRlIHNjb3BlIGJpbmRpbmdzIGluICRjb21waWxlLgogICAgICAgIC8vCiAgICAgICAgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucywgYW5kIGlzIHRodXMgbm90IGRvY3VtZW50ZWQKICAgICAgICAvLyBwdWJsaWNseS4KICAgICAgICAvLyBPYmplY3QgY3JlYXRpb246IGh0dHA6Ly9qc3BlcmYuY29tL2NyZWF0ZS1jb25zdHJ1Y3Rvci8yCiAgICAgICAgdmFyIGNvbnRyb2xsZXJQcm90b3R5cGUgPSAoaXNBcnJheShleHByZXNzaW9uKSA/CiAgICAgICAgICBleHByZXNzaW9uW2V4cHJlc3Npb24ubGVuZ3RoIC0gMV0gOiBleHByZXNzaW9uKS5wcm90b3R5cGU7CiAgICAgICAgaW5zdGFuY2UgPSBPYmplY3QuY3JlYXRlKGNvbnRyb2xsZXJQcm90b3R5cGUpOwoKICAgICAgICBpZiAoaWRlbnRpZmllcikgewogICAgICAgICAgYWRkSWRlbnRpZmllcihsb2NhbHMsIGlkZW50aWZpZXIsIGluc3RhbmNlLCBjb25zdHJ1Y3RvciB8fCBleHByZXNzaW9uLm5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbigpIHsKICAgICAgICAgICRpbmplY3Rvci5pbnZva2UoZXhwcmVzc2lvbiwgaW5zdGFuY2UsIGxvY2FscywgY29uc3RydWN0b3IpOwogICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgICAgIH0sIHsKICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSwKICAgICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgaW5zdGFuY2UgPSAkaW5qZWN0b3IuaW5zdGFudGlhdGUoZXhwcmVzc2lvbiwgbG9jYWxzLCBjb25zdHJ1Y3Rvcik7CgogICAgICBpZiAoaWRlbnRpZmllcikgewogICAgICAgIGFkZElkZW50aWZpZXIobG9jYWxzLCBpZGVudGlmaWVyLCBpbnN0YW5jZSwgY29uc3RydWN0b3IgfHwgZXhwcmVzc2lvbi5uYW1lKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfTsKCiAgICBmdW5jdGlvbiBhZGRJZGVudGlmaWVyKGxvY2FscywgaWRlbnRpZmllciwgaW5zdGFuY2UsIG5hbWUpIHsKICAgICAgaWYgKCEobG9jYWxzICYmIGlzT2JqZWN0KGxvY2Fscy4kc2NvcGUpKSkgewogICAgICAgIHRocm93IG1pbkVycignJGNvbnRyb2xsZXInKSgnbm9zY3AnLAogICAgICAgICAgIkNhbm5vdCBleHBvcnQgY29udHJvbGxlciAnezB9JyBhcyAnezF9JyEgTm8gJHNjb3BlIG9iamVjdCBwcm92aWRlZCB2aWEgYGxvY2Fsc2AuIiwKICAgICAgICAgIG5hbWUsIGlkZW50aWZpZXIpOwogICAgICB9CgogICAgICBsb2NhbHMuJHNjb3BlW2lkZW50aWZpZXJdID0gaW5zdGFuY2U7CiAgICB9CiAgfV07Cn0KCi8qKgogKiBAbmdkb2Mgc2VydmljZQogKiBAbmFtZSAkZG9jdW1lbnQKICogQHJlcXVpcmVzICR3aW5kb3cKICoKICogQGRlc2NyaXB0aW9uCiAqIEEge0BsaW5rIGFuZ3VsYXIuZWxlbWVudCBqUXVlcnkgb3IganFMaXRlfSB3cmFwcGVyIGZvciB0aGUgYnJvd3NlcidzIGB3aW5kb3cuZG9jdW1lbnRgIG9iamVjdC4KICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGUgbW9kdWxlPSJkb2N1bWVudEV4YW1wbGUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgIDxwPiRkb2N1bWVudCB0aXRsZTogPGIgbmctYmluZD0idGl0bGUiPjwvYj48L3A+CiAgICAgICAgIDxwPndpbmRvdy5kb2N1bWVudCB0aXRsZTogPGIgbmctYmluZD0id2luZG93VGl0bGUiPjwvYj48L3A+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KICAgICAgIGFuZ3VsYXIubW9kdWxlKCdkb2N1bWVudEV4YW1wbGUnLCBbXSkKICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGRvY3VtZW50JywgZnVuY3Rpb24oJHNjb3BlLCAkZG9jdW1lbnQpIHsKICAgICAgICAgICAkc2NvcGUudGl0bGUgPSAkZG9jdW1lbnRbMF0udGl0bGU7CiAgICAgICAgICAgJHNjb3BlLndpbmRvd1RpdGxlID0gYW5ndWxhci5lbGVtZW50KHdpbmRvdy5kb2N1bWVudClbMF0udGl0bGU7CiAgICAgICAgIH1dKTsKICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCmZ1bmN0aW9uICREb2N1bWVudFByb3ZpZGUNCozc71YhiwEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8MkAAQAZuq8CoBzbAqAdglSIf9Vh6fNNBtnW4gBAL8JOqAAABAQgKAKNevgBNpbmM3O9WIYsBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PDNAAEAGbqrAqAc2wKgHYJUiH/VYenzTQbaVgIAQC/Bz4QAAAQEICgCjXr4ATaW6jNzvVtmPAQBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNNBQABABndzwKgHYMCoBzYf9ZUiQbaVgFh6fNOAEAFT8DUAAAEBCAoATaW6AKNevjdGRTgNCnIoKSB7CiAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgZnVuY3Rpb24od2luZG93KSB7CiAgICByZXR1cm4ganFMaXRlKHdpbmRvdy5kb2N1bWVudCk7CiAgfV07Cn0KCi8qKgogKiBAbmdkb2Mgc2VydmljZQogKiBAbmFtZSAkZXhjZXB0aW9uSGFuZGxlcgogKiBAcmVxdWlyZXMgbmcuJGxvZwogKgogKiBAZGVzY3JpcHRpb24KICogQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBhbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRlbGVnYXRlZCB0byB0aGlzIHNlcnZpY2UuCiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBkZWxlZ2F0ZXMgdG8gYCRsb2cuZXJyb3JgIHdoaWNoIGxvZ3MgaXQgaW50bwogKiB0aGUgYnJvd3NlciBjb25zb2xlLgogKgogKiBJbiB1bml0IHRlc3RzLCBpZiBgYW5ndWxhci1tb2Nrcy5qc2AgaXMgbG9hZGVkLCB0aGlzIHNlcnZpY2UgaXMgb3ZlcnJpZGRlbiBieQogKiB7QGxpbmsgbmdNb2NrLiRleGNlcHRpb25IYW5kbGVyIG1vY2sgJGV4Y2VwdGlvbkhhbmRsZXJ9IHdoaWNoIGFpZHMgaW4gdGVzdGluZy4KICoKICogIyMgRXhhbXBsZToKICoKICogYGBganMKICogICBhbmd1bGFyLm1vZHVsZSgnZXhjZXB0aW9uT3ZlcnJpZGUnLCBbXSkuZmFjdG9yeSgnJGV4Y2VwdGlvbkhhbmRsZXInLCBmdW5jdGlvbigpIHsKICogICAgIHJldHVybiBmdW5jdGlvbihleGNlcHRpb24sIGNhdXNlKSB7CiAqICAgICAgIGV4Y2VwdGlvbi5tZXNzYWdlICs9ICcgKGNhdXNlZCBieSAiJyArIGNhdXNlICsgJyIpJzsKICogICAgICAgdGhyb3cgZXhjZXB0aW9uOwogKiAgICAgfTsKICogICB9KTsKICogYGBgCiAqCiAqIFRoaXMgZXhhbXBsZSB3aWxsIG92ZXJyaWRlIHRoZSBub3JtYWwgYWN0aW9uIG9mIGAkZXhjZXB0aW9uSGFuZGxlcmAsIHRvIG1ha2UgYW5ndWxhcgogKiBleGNlcHRpb25zIGZhaWwgaGFyZCB3aGVuIHRoZXkgaGFwcGVuLCBpbnN0ZWFkIG9mIGp1c3QgbG9nZ2luZyB0byB0aGUgY29uc29sZS4KICoKICogPGhyIC8+CiAqIE5vdGUsIHRoYXQgY29kZSBleGVjdXRlZCBpbiBldmVudC1saXN0ZW5lcnMgKGV2ZW4gdGhvc2UgcmVnaXN0ZXJlZCB1c2luZyBqcUxpdGUncyBgb25gL2BiaW5kYAogKiBtZXRob2RzKSBkb2VzIG5vdCBkZWxlZ2F0ZSBleGNlcHRpb25zIHRvIHRoZSB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9CiAqICh1bmxlc3MgZXhlY3V0ZWQgZHVyaW5nIGEgZGlnZXN0KS4KICoKICogSWYgeW91IHdpc2gsIHlvdSBjYW4gbWFudWFsbHkgZGVsZWdhdGUgZXhjZXB0aW9ucywgZS5nLgogKiBgdHJ5IHsgLi4uIH0gY2F0Y2goZSkgeyAkZXhjZXB0aW9uSGFuZGxlcihlKTsgfWAKICoKICogQHBhcmFtIHtFcnJvcn0gZXhjZXB0aW9uIEV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgogKiBAcGFyYW0ge3N0cmluZz19IGNhdXNlIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZXh0IGluIHdoaWNoCiAqICAgICAgIHRoZSBlcnJvciB3YXMgdGhyb3duLgogKgogKi8KZnVuY3Rpb24gJEV4Y2VwdGlvbkhhbmRsZXJQcm92aWRlcigpIHsKICB0aGlzLiRnZXQgPSBbJyRsb2cnLCBmdW5jdGlvbigkbG9nKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZXhjZXB0aW9uLCBjYXVzZSkgewogICAgICAkbG9nLmVycm9yLmFwcGx5KCRsb2csIGFyZ3VtZW50cyk7CiAgICB9OwogIH1dOwp9Cgp2YXIgQVBQTElDQVRJT05fSlNPTiA9ICdhcHBsaWNhdGlvbi9qc29uJzsKdmFyIENPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OID0geydDb250ZW50LVR5cGUnOiBBUFBMSUNBVElPTl9KU09OICsgJztjaGFyc2V0PXV0Zi04J307CnZhciBKU09OX1NUQVJUID0gL15ccyooXFt8XHtbXlx7XSkvOwp2YXIgSlNPTl9FTkQgPSAvW1x9XF1dXHMqJC87CnZhciBKU09OX1BST1RFQ1RJT05fUFJFRklYID0gL15cKVxdXH0nLD9cbi87CgpmdW5jdGlvbiBkZWZhdWx0SHR0cFJlc3BvbnNlVHJhbnNmb3JtKGRhdGEsIGhlYWRlcnMpIHsKICBpZiAoaXNTdHJpbmcoZGF0YSkpIHsKICAgIC8vIHN0cmlwIGpzb24gdnVsbmVyYWJpbGl0eSBwcm90ZWN0aW9uIHByZWZpeAogICAgZGF0YSA9IGRhdGEucmVwbGFjZShKU09OX1BST1RFQ1RJT05fUFJFRklYLCAnJyk7CiAgICB2YXIgY29udGVudFR5cGUgPSBoZWFkZXJzKCdDb250ZW50LVR5cGUnKTsKICAgIGlmICgoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5kZXhPZihBUFBMSUNBVElPTl9KU09OKSA9PT0gMCAmJiBkYXRhLnRyaW0oKSkgfHwKICAgICAgICAoSlNPTl9TVEFSVC50ZXN0KGRhdGEpICYmIEpTT05fRU5ELnRlc3QoZGF0YSkpKSB7CiAgICAgIGRhdGEgPSBmcm9tSnNvbihkYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGE7Cn0KCi8qKgogKiBQYXJzZSBoZWFkZXJzIGludG8ga2V5IHZhbHVlIG9iamVjdAogKgogKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVycyBSYXcgaGVhZGVycyBhcyBhIHN0cmluZwogKiBAcmV0dXJucyB7T2JqZWN0fSBQYXJzZWQgaGVhZGVycyBhcyBrZXkgdmFsdWUgb2JqZWN0CiAqLwpmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykgewogIHZhciBwYXJzZWQgPSBjcmVhdGVNYXAoKSwga2V5LCB2YWwsIGk7CgogIGlmICghaGVhZGVycykgcmV0dXJuIHBhcnNlZDsKCiAgZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcbicpLCBmdW5jdGlvbihsaW5lKSB7CiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7CiAgICBrZXkgPSBsb3dlcmNhc2UodHJpbShsaW5lLnN1YnN0cigwLCBpKSkpOwogICAgdmFsID0gdHJpbShsaW5lLnN1YnN0cihpICsgMSkpOwoKICAgIGlmIChrZXkpIHsKICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDsKICAgIH0KICB9KTsKCiAgcmV0dXJuIHBhcnNlZDsKfQoKCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFyc2VkIGhlYWRlcnMuCiAqCiAqIEhlYWRlcnMgYXJlIGxhenkgcGFyc2VkIHdoZW4gZmlyc3QgcmVxdWVzdGVkLgogKiBAc2VlIHBhcnNlSGVhZGVycwogKgogKiBAcGFyYW0geyhzdHJpbmd8T2JqZWN0KX0gaGVhZGVycyBIZWFkZXJzIHRvIHByb3ZpZGUgYWNjZXNzIHRvLgogKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nPSl9IFJldHVybnMgYSBnZXR0ZXIgZnVuY3Rpb24gd2hpY2ggaWYgY2FsbGVkIHdpdGg6CiAqCiAqICAgLSBpZiBjYWxsZWQgd2l0aCBzaW5nbGUgYW4gYXJndW1lbnQgcmV0dXJucyBhIHNpbmdsZSBoZWFkZXIgdmFsdWUgb3IgbnVsbAogKiAgIC0gaWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGhlYWRlcnMuCiAqLwpmdW5jdGlvbiBoZWFkZXJzR2V0dGVyKGhlYWRlcnMpIHsKICB2YXIgaGVhZGVyc09iaiA9IGlzT2JqZWN0KGhlYWRlcnMpID8gaGVhZGVycyA6IHVuZGVmaW5lZDsKCiAgcmV0dXJuIGZ1bmN0aW9uKG5hbWUpIHsKICAgIGlmICghaGVhZGVyc09iaikgaGVhZGVyc09iaiA9ICBwYXJzZUhlYWRlcnMoaGVhZGVycyk7CgogICAgaWYgKG5hbWUpIHsKICAgICAgdmFyIHZhbHVlID0gaGVhZGVyc09ialtsb3dlcmNhc2UobmFtZSldOwogICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgewogICAgICAgIHZhbHVlID0gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CgogICAgcmV0dXJuIGhlYWRlcnNPYmo7CiAgfTsKfQoKCi8qKgogKiBDaGFpbiBhbGwgZ2l2ZW4gZnVuY3Rpb25zCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgYm90aCByZXF1ZXN0IGFuZCByZXNwb25zZSB0cmFuc2Zvcm1pbmcKICoKICogQHBhcmFtIHsqfSBkYXRhIERhdGEgdG8gdHJhbnNmb3JtLgogKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZz0pfSBoZWFkZXJzIEh0dHAgaGVhZGVycyBnZXR0ZXIgZm4uCiAqIEBwYXJhbSB7KEZ1bmN0aW9ufEFycmF5LjxGdW5jdGlvbj4pfSBmbnMgRnVuY3Rpb24gb3IgYW4gYXJyYXkgb2YgZnVuY3Rpb25zLgogKiBAcmV0dXJucyB7Kn0gVHJhbnNmb3JtZWQgZGF0YS4KICovCmZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7CiAgaWYgKGlzRnVuY3Rpb24oZm5zKSkKICAgIHJldHVybiBmbnMoZGF0YSwgaGVhZGVycyk7CgogIGZvckVhY2goZm5zLCBmdW5jdGlvbihmbikgewogICAgZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpOwogIH0pOwoKICByZXR1cm4gZGF0YTsKfQoKCmZ1bmN0aW9uIGlzU3VjY2VzcyhzdGF0dXMpIHsKICByZXR1cm4gMjAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPCAzMDA7Cn0KCgovKioKICogQG5nZG9jIHByb3ZpZGVyCiAqIEBuYW1lICRodHRwUHJvdmlkZXIKICogQGRlc2NyaXB0aW9uCiAqIFVzZSBgJGh0dHBQcm92aWRlcmAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IHNlcnZpY2UuCiAqICovCmZ1bmN0aW9uICRIdHRwUHJvdmlkZXIoKSB7CiAgLyoqCiAgICogQG5nZG9jIHByb3BlcnR5CiAgICogQG5hbWUgJGh0dHBQcm92aWRlciNkZWZhdWx0cwogICAqIEBkZXNjcmlwdGlvbgogICAqCiAgICogT2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IHJlcXVlc3RzLgogICAqCiAgICogLSAqKmBkZWZhdWx0cy5jYWNoZWAqKiAtIHtPYmplY3R9IC0gYW4gb2JqZWN0IGJ1aWx0IHdpdGgge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgYCRjYWNoZUZhY3RvcnlgfQogICAqIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBjYWNoZSBmb3IgYWxsIHJlcXVlc3RzIHdobyBzZXQgdGhlaXIgYGNhY2hlYCBwcm9wZXJ0eSB0byBgdHJ1ZWAuCiAgICogSWYgeW91IHNldCB0aGUgYGRlZmF1bHQuY2FjaGUgPSBmYWxzZWAgdGhlbiBvbmx5IHJlcXVlc3RzIHRoYXQgc3BlY2lmeSB0aGVpciBvd24gY3VzdG9tCiAgICogY2FjaGUgb2JqZWN0IHdpbGwgYmUgY2FjaGVkLiBTZWUge0BsaW5rICRodHRwI2NhY2hpbmcgJGh0dHAgQ2FjaGluZ30gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICoKICAgKiAtICoqYGRlZmF1bHRzLnhzcmZDb29raWVOYW1lYCoqIC0ge3N0cmluZ30gLSBOYW1lIG9mIGNvb2tpZSBjb250YWluaW5nIHRoZSBYU1JGIHRva2VuLgogICAqIERlZmF1bHRzIHZhbHVlIGlzIGAnWFNSRi1UT0tFTidgLgogICAqCiAgICogLSAqKmBkZWZhdWx0cy54c3JmSGVhZGVyTmFtZWAqKiAtIHtzdHJpbmd9IC0gTmFtZSBvZiBIVFRQIGhlYWRlciB0byBwb3B1bGF0ZSB3aXRoIHRoZQogICAqIFhTUkYgdG9rZW4uIERlZmF1bHRzIHZhbHVlIGlzIGAnWC1YU1JGLVRPS0VOJ2AuCiAgICoKICAgKiAtICoqYGRlZmF1bHRzLmhlYWRlcnNgKiogLSB7T2JqZWN0fSAtIERlZmF1bHQgaGVhZGVycyBmb3IgYWxsICRodHRwIHJlcXVlc3RzLgogICAqIFJlZmVyIHRvIHtAbGluayBuZy4kaHR0cCNzZXR0aW5nLWh0dHAtaGVhZGVycyAkaHR0cH0gZm9yIGRvY3VtZW50YXRpb24gb24KICAgKiBzZXR0aW5nIGRlZmF1bHQgaGVhZGVycy4KICAgKiAgICAgLSAqKmBkZWZhdWx0cy5oZWFkZXJzLmNvbW1vbmAqKgogICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMucG9zdGAqKgogICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMucHV0YCoqCiAgICogICAgIC0gKipgZGVmYXVsdHMuaGVhZGVycy5wYXRjaGAqKgogICAqCiAgICoqLwogIHZhciBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdHMgPSB7CiAgICAvLyB0cmFuc2Zvcm0gaW5jb21pbmcgcmVzcG9uc2UgZGF0YQogICAgdHJhbnNmb3JtUmVzcG9uc2U6IFtkZWZhdWx0SHR0cFJlc3BvbnNlVHJhbnNmb3JtXSwKCiAgICAvLyB0cmFuc2Zvcm0gb3V0Z29pbmcgcmVxdWVzdCBkYXRhCiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gaXNPYmplY3QoZCkgJiYgIWlzRmlsZShkKSAmJiAhaXNCbG9iKGQpID8gdG9Kc29uKGQpIDogZDsKICAgIH1dLAoKICAgIC8vIGRlZmF1bHQgaGVhZGVycwogICAgaGVhZGVyczogewogICAgICBjb21tb246IHsKICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicKICAgICAgfSwKICAgICAgcG9zdDogICBzaGFsbG93Q29weShDT05URU5UX1RZUEVfQVBQTElDQVRJT05fSlNPTiksCiAgICAgIHB1dDogICAgc2hhbGxvd0NvcHkoQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04pLAogICAgICBwYXRjaDogIHNoYWxsb3dDb3B5KENPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OKQogICAgfSwKCiAgICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLAogICAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nCiAgfTsKCiAgdmFyIHVzZUFwcGx5QXN5bmMgPSBmYWxzZTsKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGh0dHBQcm92aWRlciN1c2VBcHBseUFzeW5jCiAgICogQGRlc2NyaXB0aW9uCiAgICoKICAgKiBDb25maWd1cmUgJGh0dHAgc2VydmljZSB0byBjb21iaW5lIHByb2Nlc3Npbmcgb2YgbXVsdGlwbGUgaHR0cCByZXNwb25zZXMgcmVjZWl2ZWQgYXQgYXJvdW5kCiAgICogdGhlIHNhbWUgdGltZSB2aWEge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5QXN5bmMgJHJvb3RTY29wZS4kYXBwbHlBc3luY30uIFRoaXMgY2FuIHJlc3VsdCBpbgogICAqIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciBiaWdnZXIgYXBwbGljYXRpb25zIHRoYXQgbWFrZSBtYW55IEhUVFAgcmVxdWVzdHMKICAgKiBjb25jdXJyZW50bHkgKGNvbW1vbiBkdXJpbmcgYXBwbGljYXRpb24gYm9vdHN0cmFwKS4KICAgKgogICAqIERlZmF1bHRzIHRvIGZhbHNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZlZCwgcmV0dXJucyB0aGUgY3VycmVudCBjb25maWd1cmVkIHZhbHVlLgogICAqCiAgICogQHBhcmFtIHtib29sZWFuPX0gdmFsdWUgSWYgdHJ1ZSwgd2hlbiByZXF1ZXN0cyBhcmUgbG9hZGVkLCB0aGV5IHdpbGwgc2NoZWR1bGUgYSBkZWZlcnJlZAogICAqICAgICJhcHBseSIgb24gdGhlIG5leHQgdGljaywgZ2l2aW5nIHRpbWUgZm9yIHN1YnNlcXVlbnQgcmVxdWVzdHMgaW4gYSByb3VnaGx5IH4xMG1zIHdpbmRvdwogICAqICAgIHRvIGxvYWQgYW5kIHNoYXJlIHRoZSBzYW1lIGRpZ2VzdCBjeWNsZS4KICAgKgogICAqIEByZXR1cm5zIHtib29sZWFufE9iamVjdH0gSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlICRodHRwUHJvdmlkZXIgZm9yIGNoYWluaW5nLgogICAqICAgIG90aGVyd2lzZSwgcmV0dXJucyB0aGUgY3VycmVudCBjb25maWd1cmVkIHZhbHVlLgogICAqKi8KICB0aGlzLnVzZUFwcGx5QXN5bmMgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgdXNlQXBwbHlBc3luYyA9ICEhdmFsdWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIHVzZUFwcGx5QXN5bmM7CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIHByb3BlcnR5CiAgICogQG5hbWUgJGh0dHBQcm92aWRlciNpbnRlcmNlcHRvcnMKICAgKiBAZGVzY3JpcHRpb24KICAgKgogICAqIEFycmF5IGNvbnRhaW5pbmcgc2VydmljZSBmYWN0b3JpZXMgZm9yIGFsbCBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMge0BsaW5rIG5nLiRodHRwICRodHRwfQogICAqIHByZS1wcm9jZXNzaW5nIG9mIHJlcXVlc3Qgb3IgcG9zdHByb2Nlc3Npbmcgb2YgcmVzcG9uc2VzLgogICAqCiAgICogVGhlc2Ugc2VydmljZSBmYWN0b3JpZXMgYXJlIG9yZGVyZWQgYnkgcmVxdWVzdCwgaS5lLiB0aGV5IGFyZSBhcHBsaWVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZQogICAqIGFycmF5LCBvbiByZXF1ZXN0LCBidXQgcmV2ZXJzZSBvcmRlciwgb24gcmVzcG9uc2UuCiAgICoKICAgKiB7QGxpbmsgbmcuJGh0dHAjaW50ZXJjZXB0b3JzIEludGVyY2VwdG9ycyBkZXRhaWxlZCBpbmZvfQogICAqKi8KICB2YXIgaW50ZXJjZXB0b3JGYWN0b3JpZXMgPSB0aGlzLmludGVyY2VwdG9ycyA9IFtdOwoKICB0aGlzLiRnZXQgPSBbJyRodHRwQmFja2VuZCcsICckYnJvd3NlcicsICckY2FjaGVGYWN0b3J5JywgJyRyb290U2NvcGUnLCAnJHEnLCAnJGluamVjdG9yJywKICAgICAgZnVuY3Rpb24oJGh0dHBCYWNrZW5kLCAkYnJvd3NlciwgJGNhY2hlRmFjdG9yeSwgJHJvb3RTY29wZSwgJHEsICRpbmplY3RvcikgewoKICAgIHZhciBkZWZhdWx0Q2FjaGUgPSAkY2FjaGVGYWN0b3J5KCckaHR0cCcpOwoKICAgIC8qKgogICAgICogSW50ZXJjZXB0b3JzIHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyLiBJbm5lciBpbnRlcmNlcHRvcnMgYmVmb3JlIG91dGVyIGludGVyY2VwdG9ycy4KICAgICAqIFRoZSByZXZlcnNhbCBpcyBuZWVkZWQgc28gdGhhdCB3ZSBjYW4gYnVpbGQgdXAgdGhlIGludGVyY2VwdGlvbiBjaGFpbiBhcm91bmQgdGhlCiAgICAgKiBzZXJ2ZXIgcmVxdWVzdC4KICAgICAqLwogICAgdmFyIHJldmVyc2VkSW50ZXJjZXB0b3JzID0gW107CgogICAgZm9yRWFjaChpbnRlcmNlcHRvckZhY3RvcmllcywgZnVuY3Rpb24oaW50ZXJjZXB0b3JGYWN0b3J5KSB7CiAgICAgIHJldmVyc2VkSW50ZXJjZXB0b3JzLnVuc2hpZnQoaXNTdHJpbmcoaW50ZXJjZXB0b3JGYWN0b3J5KQogICAgICAgICAgPyAkaW5qZWN0b3IuZ2V0KGludGVyY2VwdG9yRmFjdG9yeSkgOiAkaW5qZWN0b3IuaW52b2tlKGludGVyY2VwdG9yRmFjdG9yeSkpOwogICAgfSk7CgogICAgLyoqCiAgICAgKiBAbmdkb2Mgc2VydmljZQogICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAqIEBuYW1lICRodHRwCiAgICAgKiBAcmVxdWlyZXMgbmcuJGh0dHBCYWNrZW5kCiAgICAgKiBAcmVxdWlyZXMgJGNhY2hlRmFjdG9yeQogICAgICogQHJlcXVpcmVzICRyb290U2NvcGUKICAgICAqIEByZXF1aXJlcyAkcQogICAgICogQHJlcXVpcmVzICRpbmplY3RvcgogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogVGhlIGAkaHR0cGAgc2VydmljZSBpcyBhIGNvcmUgQW5ndWxhciBzZXJ2aWNlIHRoYXQgZmFjaWxpdGF0ZXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSByZW1vdGUKICAgICAqIEhUVFAgc2VydmVycyB2aWEgdGhlIGJyb3dzZXIncyBbWE1MSHR0cFJlcXVlc3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL3htbGh0dHByZXF1ZXN0KQogICAgICogb2JqZWN0IG9yIHZpYSBbSlNPTlBdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSlNPTlApLgogICAgICoKICAgICAqIEZvciB1bml0IHRlc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgdXNlIGAkaHR0cGAgc2VydmljZSwgc2VlCiAgICAgKiB7QGxpbmsgbmdNb2NrLiRodHRwQmFja2VuZCAkaHR0cEJhY2tlbmQgbW9ja30uCiAgICAgKgogICAgICogRm9yIGEgaGlnaGVyIGxldmVsIG9mIGFic3RyYWN0aW9uLCBwbGVhc2UgY2hlY2sgb3V0IHRoZSB7QGxpbmsgbmdSZXNvdXJjZS4kcmVzb3VyY2UKICAgICAqICRyZXNvdXJjZX0gc2VydmljZS4KICAgICAqCiAgICAgKiBUaGUgJGh0dHAgQVBJIGlzIGJhc2VkIG9uIHRoZSB7QGxpbmsgbmcuJHEgZGVmZXJyZWQvcHJvbWlzZSBBUElzfSBleHBvc2VkIGJ5CiAgICAgKiB0aGUgJHEgc2VydmljZS4gV2hpbGUgZm9yIHNpbXBsZSB1c2FnZSBwYXR0ZXJucyB0aGlzIGRvZXNuJ3QgbWF0dGVyIG11Y2gsIGZvciBhZHZhbmNlZCB1c2FnZQogICAgICogaXQgaXMgaW1wb3J0YW50IHRvIGZhbWlsaWFyaXplIHlvdXJzZWxmIHdpdGggdGhlc2UgQVBJcyBhbmQgdGhlIGd1YXJhbnRlZXMgdGhleSBwcm92aWRlLgogICAgICoKICAgICAqCiAgICAgKiAjIyBHZW5lcmFsIHVzYWdlCiAgICAgKiBUaGUgYCRodHRwYCBzZXJ2aWNlIGlzIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQg4oCUIGEgY29uZmlndXJhdGlvbiBvYmplY3Qg4oCUCiAgICAgKiB0aGF0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gSFRUUCByZXF1ZXN0IGFuZCByZXR1cm5zICBhIHtAbGluayBuZy4kcSBwcm9taXNlfQogICAgICogd2l0aCB0d28gJGh0dHAgc3BlY2lmaWMgbWV0aG9kczogYHN1Y2Nlc3NgIGFuZCBgZXJyb3JgLgogICAgICoKICAgICAqIGBgYGpzCiAgICAgKiAgIC8vIFNpbXBsZSBHRVQgcmVxdWVzdCBleGFtcGxlIDoKICAgICAqICAgJGh0dHAuZ2V0KCcvc29tZVVybCcpLgogICAgICogICAgIHN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHsKICAgICAqICAgICAgIC8vIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkKICAgICAqICAgICAgIC8vIHdoZW4gdGhlIHJlc3BvbnNlIGlzIGF2YWlsYWJsZQogICAgICogICAgIH0pLgogICAgICogICAgIGVycm9yKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7CiAgICAgKiAgICAgICAvLyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgKiAgICAgICAvLyBvciBzZXJ2ZXIgcmV0dXJucyByZXNwb25zZSB3aXRoIGFuIGVycm9yIHN0YXR1cy4KICAgICAqICAgICB9KTsKICAgICAqIGBgYAogICAgICoKICAgICAqIGBgYGpzCiAgICAgKiAgIC8vIFNpbXBsZSBQT1NUIHJlcXVlc3QgZXhhbXBsZSAocGFzc2luZyBkYXRhKSA6CiAgICAgKiAgICRodHRwLnBvc3QoJy9zb21lVXJsJywge21zZzonaGVsbG8gd29yZCEnfSkuCiAgICAgKiAgICAgc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykgewogICAgICogICAgICAgLy8gdGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseQogICAgICogICAgICAgLy8gd2hlbiB0aGUgcmVzcG9uc2UgaXMgYXZhaWxhYmxlCiAgICAgKiAgICAgfSkuCiAgICAgKiAgICAgZXJyb3IoZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHsKICAgICAqICAgICAgIC8vIGNhbGxlZCBhc3luY2hyb25vdXNseSBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAqICAgICAgIC8vIG9yIHNlcnZlciByZXR1cm5zIHJlc3BvbnNlIHdpdGggYW4gZXJyb3Igc3RhdHVzLgogICAgICogICAgIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICoKICAgICAqIFNpbmNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZiBjYWxsaW5nIHRoZSAkaHR0cCBmdW5jdGlvbiBpcyBhIGBwcm9taXNlYCwgeW91IGNhbiBhbHNvIHVzZQogICAgICogdGhlIGB0aGVuYCBtZXRob2QgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzLCBhbmQgdGhlc2UgY2FsbGJhY2tzIHdpbGwgcmVjZWl2ZSBhIHNpbmdsZSBhcmd1bWVudCDigJMKICAgICAqIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlLiBTZWUgdGhlIEFQSSBzaWduYXR1cmUgYW5kIHR5cGUgaW5mbyBiZWxvdyBmb3IgbW9yZQogICAgICogZGV0YWlscy4KICAgICAqCiAgICAgKiBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIGJldHdlZW4gMjAwIGFuZCAyOTkgaXMgY29uc2lkZXJlZCBhIHN1Y2Nlc3Mgc3RhdHVzIGFuZAogICAgICogd2lsbCByZXN1bHQgaW4gdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgYmVpbmcgY2FsbGVkLiBOb3RlIHRoYXQgaWYgdGhlIHJlc3BvbnNlIGlzIGEgcmVkaXJlY3QsCiAgICAgKiBYTUxIdHRwUmVxdWVzdCB3aWxsIHRyYW5zcGFyZW50bHkgZm9sbG93IGl0LCBtZWFuaW5nIHRoYXQgdGhlIGVycm9yIGNhbGxiYWNrIHdpbGwgbm90IGJlCiAgICAgKiBjYWxsZWQgZm9yIHN1Y2ggcmVzcG9uc2VzLgogICAgICoKICAgICAqICMjIFdyaXRpbmcgVW5pdCBUZXN0cyB0aGF0IHVzZSAkaHR0cAogICAgICogV2hlbiB1bml0IHRlc3RpbmcgKHVzaW5nIHtAbGluayBuZ01vY2sgbmdNb2NrfSksIGl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsCiAgICAgKiB7QGxpbmsgbmdNb2NrLiRodHRwQmFja2VuZCNmbHVzaCAkaHR0cEJhY2tlbmQuZmx1c2goKX0gdG8gZmx1c2ggZWFjaCBwZW5kaW5nCiAgICAgKiByZXF1ZXN0IHVzaW5nIHRyYWluZWQgcmVzcG9uc2VzLgogICAgICoKICAgICAqIGBgYAogICAgICogJGh0dHBCYWNrZW5kLmV4cGVjdEdFVCguLi4pOwogICAgICogJGh0dHAuZ2V0KC4uLik7CiAgICAgKiAkaHR0cEJhY2tlbmQuZmx1c2goKTsKICAgICAqIGBgYAogICAgICoKICAgICAqICMjIFNob3J0Y3V0IG1ldGhvZHMKICAgICAqCiAgICAgKiBTaG9ydGN1dCBtZXRob2RzIGFyZSBhbHNvIGF2YWlsYWJsZS4gQWxsIHNob3J0Y3V0IG1ldGhvZHMgcmVxdWlyZSBwYXNzaW5nIGluIHRoZSBVUkwsIGFuZAogICAgICogcmVxdWVzdCBkYXRhIG11c3QgYmUgcGFzc2VkIGluIGZvciBQT1NUL1BVVCByZXF1ZXN0cy4KICAgICAqCiAgICAgKiBgYGBqcwogICAgICogICAkaHR0cC5nZXQoJy9zb21lVXJsJykuc3VjY2VzcyhzdWNjZXNzQ2FsbGJhY2spOwogICAgICogICAkaHR0cC5wb3N0KCcvc29tZVVybCcsIGRhdGEpLnN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIENvbXBsZXRlIGxpc3Qgb2Ygc2hvcnRjdXQgbWV0aG9kczoKICAgICAqCiAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNnZXQgJGh0dHAuZ2V0fQogICAgICogLSB7QGxpbmsgbmcuJGh0dHAjaGVhZCAkaHR0cC5oZWFkfQogICAgICogLSB7QGxpbmsgbmcuJGh0dHAjcG9zdCAkaHR0cC5wb3N0fQogICAgICogLSB7QGxpbmsgbmcuJGh0dHAjcHV0ICRodHRwLnB1dH0KICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI2RlbGV0ZSAkaHR0cC5kZWxldGV9CiAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNqc29ucCAkaHR0cC5qc29ucH0KICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI3BhdGNoICRodHRwLnBhdGNofQogICAgICoKICAgICAqCiAgICAgKiAjIyBTZXR0aW5nIEhUVFAgSGVhZGVycwogICAgICoKICAgICAqIFRoZSAkaHR0cCBzZXJ2aWNlIHdpbGwgYXV0b21hdGljYWxseSBhZGQgY2VydGFpbiBIVFRQIGhlYWRlcnMgdG8gYWxsIHJlcXVlc3RzLiBUaGVzZSBkZWZhdWx0cwogICAgICogY2FuIGJlIGZ1bGx5IGNvbmZpZ3VyZWQgYnkgYWNjZXNzaW5nIHRoZSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzYCBjb25maWd1cmF0aW9uCiAgICAgKiBvYmplY3QsIHdoaWNoIGN1cnJlbnRseSBjb250YWlucyB0aGlzIGRlZmF1bHQgY29uZmlndXJhdGlvbjoKICAgICAqCiAgICAgKiAtIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uYCAoaGVhZGVycyB0aGF0IGFyZSBjb21tb24gZm9yIGFsbCByZXF1ZXN0cyk6CiAgICAgKiAgIC0gYEFjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKiAvICpgCiAgICAgKiAtIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMucG9zdGA6IChoZWFkZXIgZGVmYXVsdHMgZm9yIFBPU1QgcmVxdWVzdHMpCiAgICAgKiAgIC0gYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbmAKICAgICAqIC0gYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycy5wdXRgIChoZWFkZXIgZGVmYXVsdHMgZm9yIFBVVCByZXF1ZXN0cykKICAgICAqICAgLSBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uYAogICAgICoKICAgICAqIFRvIGFkZCBvciBvdmVyd3JpdGUgdGhlc2UgZGVmYXVsdHMsIHNpbXBseSBhZGQgb3IgcmVtb3ZlIGEgcHJvcGVydHkgZnJvbSB0aGVzZSBjb25maWd1cmF0aW9uCiAgICAgKiBvYmplY3RzLiBUbyBhZGQgaGVhZGVycyBmb3IgYW4gSFRUUCBtZXRob2Qgb3RoZXIgdGhhbiBQT1NUIG9yIFBVVCwgc2ltcGx5IGFkZCBhIG5ldyBvYmplY3QKICAgICAqIHdpdGggdGhlIGxvd2VyY2FzZWQgSFRUUCBtZXRob2QgbmFtZSBhcyB0aGUga2V5LCBlLmcuCiAgICAgKiBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLmdldCA9IHsgJ015LUhlYWRlcicgOiAndmFsdWUnIH0uCiAgICAgKgogICAgICogVGhlIGRlZmF1bHRzIGNhbiBhbHNvIGJlIHNldCBhdCBydW50aW1lIHZpYSB0aGUgYCRodHRwLmRlZmF1bHRzYCBvYmplY3QgaW4gdGhlIHNhbWUKICAgICAqIGZhc2hpb24uIEZvciBleGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogbW9kdWxlLnJ1bihmdW5jdGlvbigkaHR0cCkgewogICAgICogICAkaHR0cC5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vbi5BdXRob3JpemF0aW9uID0gJ0Jhc2ljIFltVmxjRHBpYjI5dycKICAgICAqIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHlvdSBjYW4gc3VwcGx5IGEgYGhlYWRlcnNgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0IHBhc3NlZCB3aGVuCiAgICAgKiBjYWxsaW5nIGAkaHR0cChjb25maWcpYCwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0cyB3aXRob3V0IGNoYW5naW5nIHRoZW0gZ2xvYmFsbHkuCiAgICAgKgogICAgICogVG8gZXhwbGljaXRseSByZW1vdmUgYSBoZWFkZXIgYXV0b21hdGljYWxseSBhZGRlZCB2aWEgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzIG9uIGEgcGVyIHJlcXVlc3QgYmFzaXMsCiAgICAgKiBVc2UgdGhlIGBoZWFkZXJzYCBwcm9wZXJ0eSwgc2V0dGluZyB0aGUgZGVzaXJlZCBoZWFkZXIgdG8gYHVuZGVmaW5lZGAuIEZvciBleGFtcGxlOgogICAgICoKICAgICAqIGBgYGpzCiAgICAgKiB2YXIgcmVxID0gewogICAgICogIG1ldGhvZDogJ1BPU1QnLAogICAgICogIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbScsCiAgICAgKiAgaGVhZGVyczogewogICAgICogICAgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZAogICAgICogIH0sCiAgICAgKiAgZGF0YTogeyB0ZXN0OiAndGVzdCcgfSwKICAgICAqIH0KICAgICAqCiAgICAgKiAkaHR0cChyZXEpLnN1Y2Nlc3MoZnVuY3Rpb24oKXsuLi59KS5lcnJvcihmdW5jdGlvbigpey4uLn0pOwogICAgICogYGBgCiAgICAgKgogICAgICogIyMgVHJhbnNmb3JtaW5nIFJlcXVlc3RzIGFuZCBSZXNwb25zZXMKICAgICAqCiAgICAgKiBCb3RoIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgY2FuIGJlIHRyYW5zZm9ybWVkIHVzaW5nIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uczogYHRyYW5zZm9ybVJlcXVlc3RgCiAgICAgKiBhbmQgYHRyYW5zZm9ybVJlc3BvbnNlYC4gVGhlc2UgcHJvcGVydGllcyBjYW4gYmUgYSBzaW5nbGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zCiAgICAgKiB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgKGB7ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcilgKSBvciBhbiBhcnJheSBvZiBzdWNoIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucywKICAgICAqIHdoaWNoIGFsbG93cyB5b3UgdG8gYHB1c2hgIG9yIGB1bnNoaWZ0YCBhIG5ldyB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpbnRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBjaGFpbi4KICAgICAqCiAgICAgKiAjIyMgRGVmYXVsdCBUcmFuc2Zvcm1hdGlvbnMKICAgICAqCiAgICAgKiBUaGUgYCRodHRwUHJvdmlkZXJgIHByb3ZpZGVyIGFuZCBgJGh0dHBgIHNlcnZpY2UgZXhwb3NlIGBkZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0YCBhbmQKICAgICAqIGBkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZWAgcHJvcGVydGllcy4gSWYgYSByZXF1ZXN0IGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biB0cmFuc2Zvcm1hdGlvbnMKICAgICAqIHRoZW4gdGhlc2Ugd2lsbCBiZSBhcHBsaWVkLgogICAgICoKICAgICAqIFlvdSBjYW4gYXVnbWVudCBvciByZXBsYWNlIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9ucyBieSBtb2RpZnlpbmcgdGhlc2UgcHJvcGVydGllcyBieSBhZGRpbmcgdG8gb3IKICAgICAqIHJlcGxhY2luZyB0aGUgYXJyYXkuCiAgICAgKgogICAgICogQW5ndWxhciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGRlZmF1bHQgdHJhbnNmb3JtYXRpb25zOgogICAgICoKICAgICAqIFJlcXVlc3QgdHJhbnNmb3JtYXRpb25zIChgJGh0dHBQcm92aWRlci5kZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0YCBhbmQgYCRodHRwLmRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3RgKToKICAgICAqCiAgICAgKiAtIElmIHRoZSBgZGF0YWAgcHJvcGVydHkgb2YgdGhlIHJlcXVlc3QgY29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbnMgYW4gb2JqZWN0LCBzZXJpYWxpemUgaXQKICAgICAqICAgaW50byBKU09OIGZvcm1hdC4KICAgICAqCiAgICAgKiBSZXNwb25zZSB0cmFuc2Zvcm1hdGlvbnMgKGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlYCBhbmQgYCRodHRwLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlYCk6CiAgICAgKgogICAgICogIC0gSWYgWFNSRiBwcmVmaXggaXMgZGV0ZWN0ZWQsIHN0cmlwIGl0IChzZWUgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgc2VjdGlvbiBiZWxvdykuCiAgICAgKiAgLSBJZiBKU09OIHJlc3BvbnNlIGlzIGRldGVjdGVkLCBkZXNlcmlhbGl6ZSBpdCB1c2luZyBhIEpTT04gcGFyc2VyLgogICAgICoKICAgICAqCiAgICAgKiAjIyMgT3ZlcnJpZGluZyB0aGUgRGVmYXVsdCBUcmFuc2Zvcm1hdGlvbnMgUGVyIFJlcXVlc3QKICAgICAqCiAgICAgKiBJZiB5b3Ugd2lzaCBvdmVycmlkZSB0aGUgcmVxdWVzdC9yZXNwb25zZSB0cmFuc2Zvcm1hdGlvbnMgb25seSBmb3IgYSBzaW5nbGUgcmVxdWVzdCB0aGVuIHByb3ZpZGUKICAgICAqIGB0cmFuc2Zvcm1SZXF1ZXN0YCBhbmQvb3IgYHRyYW5zZm9ybVJlc3BvbnNlYCBwcm9wZXJ0aWVzIG9uIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBwYXNzZWQKICAgICAqIGludG8gYCRodHRwYC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgaWYgeW91IHByb3ZpZGUgdGhlc2UgcHJvcGVydGllcyBvbiB0aGUgY29uZmlnIG9iamVjdCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbnMgd2lsbCBiZQogICAgICogb3ZlcndyaXR0ZW4uIElmIHlvdSB3aXNoIHRvIGF1Z21lbnQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb25zIHRoZW4geW91IG11c3QgaW5jbHVkZSB0aGVtIGluIHlvdXIKICAgICAqIGxvY2FsIHRyYW5zZm9ybWF0aW9uIGFycmF5LgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgY29kZSBkZW1vbnN0cmF0ZXMgYWRkaW5nIGEgbmV3IHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uIHRvIGJlIHJ1biBhZnRlciB0aGUgZGVmYXVsdCByZXNwb25zZQogICAgICogdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiBydW4uCiAgICAgKgogICAgICogYGBganMKICAgICAqIGZ1bmN0aW9uIGFwcGVuZFRyYW5zZm9ybShkZWZhdWx0cywgdHJhbnNmb3JtKSB7CiAgICAgKgogICAgICogICAvLyBXZSBjYW4ndCBndWFyYW50ZWUgdGhhdCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbiBpcyBhbiBhcnJheQogICAgICogICBkZWZhdWx0cyA9IGFuZ3VsYXIuaXNBcnJheShkZWZhdWx0cykgPyBkZWZhdWx0cyA6IFtkZWZhdWx0c107CiAgICAgKgogICAgICogICAvLyBBcHBlbmQgdGhlIG5ldyB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgZGVmYXVsdHMKICAgICAqICAgcmV0dXJuIGRlZmF1bHRzLmNvbmNhdCh0cmFuc2Zvcm0pOwogICAgICogfQogICAgICoKICAgICAqICRodHRwKHsKICAgICAqICAgdXJsOiAnLi4uJywKICAgICAqICAgbWV0aG9kOiAnR0VUJywKICAgICAqICAgdHJhbnNmb3JtUmVzcG9uc2U6IGFwcGVuZFRyYW5zZm9ybSgkaHR0cC5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZSwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAqICAgICByZXR1cm4gZG9UcmFuc2Zvcm0odmFsdWUpOwogICAgICogICB9KQogICAgICogfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKgogICAgICogIyMgQ2FjaGluZwogICAgICoKICAgICAqIFRvIGVuYWJsZSBjYWNoaW5nLCBzZXQgdGhlIHJlcXVlc3QgY29uZmlndXJhdGlvbiBgY2FjaGVgIHByb3BlcnR5IHRvIGB0cnVlYCAodG8gdXNlIGRlZmF1bHQKICAgICAqIGNhY2hlKSBvciB0byBhIGN1c3RvbSBjYWNoZSBvYmplY3QgKGJ1aWx0IHdpdGgge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgYCRjYWNoZUZhY3RvcnlgfSkuCiAgICAgKiBXaGVuIHRoZSBjYWNoZSBpcyBlbmFibGVkLCBgJGh0dHBgIHN0b3JlcyB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGluIHRoZSBzcGVjaWZpZWQKICAgICAqIGNhY2hlLiBUaGUgbmV4dCB0aW1lIHRoZSBzYW1lIHJlcXVlc3QgaXMgbWFkZSwgdGhlIHJlc3BvbnNlIGlzIHNlcnZlZCBmcm9tIHRoZSBjYWNoZSB3aXRob3V0CiAgICAgKiBzZW5kaW5nIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBldmVuIGlmIHRoZSByZXNwb25zZSBpcyBzZXJ2ZWQgZnJvbSBjYWNoZSwgZGVsaXZlcnkgb2YgdGhlIGRhdGEgaXMgYXN5bmNocm9ub3VzIGluCiAgICAgKiB0aGUgc2FtZSB3YXkgdGhhdCByZWFsIHJlcXVlc3RzIGFyZS4KICAgICAqCiAgICAgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgR0VUIHJlcXVlc3RzIGZvciB0aGUgc2FtZSBVUkwgdGhhdCBzaG91bGQgYmUgY2FjaGVkIHVzaW5nIHRoZSBzYW1lCiAgICAgKiBjYWNoZSwgYnV0IHRoZSBjYWNoZSBpcyBub3QgcG9wdWxhdGVkIHlldCwgb25seSBvbmUgcmVxdWVzdCB0byB0aGUgc2VydmVyIHdpbGwgYmUgbWFkZSBhbmQKICAgICAqIHRoZSByZW1haW5pbmcgcmVxdWVzdHMgd2lsbCBiZSBmdWxmaWxsZWQgdXNpbmcgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGZpcnN0IHJlcXVlc3QuCiAgICAgKgogICAgICogWW91IGNhbiBjaGFuZ2UgdGhlIGRlZmF1bHQgY2FjaGUgdG8gYSBuZXcgb2JqZWN0IChidWlsdCB3aXRoCiAgICAgKiB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSBgJGNhY2hlRmFjdG9yeWB9KSBieSB1cGRhdGluZyB0aGUKICAgICAqIHtAbGluayBuZy4kaHR0cCNkZWZhdWx0cyBgJGh0dHAuZGVmYXVsdHMuY2FjaGVgfSBwcm9wZXJ0eS4gQWxsIHJlcXVlc3RzIHdobyBzZXQKICAgICAqIHRoZWlyIGBjYWNoZWAgcHJvcGVydHkgdG8gYHRydWVgIHdpbGwgbm93IHVzZSB0aGlzIGNhY2hlIG9iamVjdC4KICAgICAqCiAgICAgKiBJZiB5b3Ugc2V0IHRoZSBkZWZhdWx0IGNhY2hlIHRvIGBmYWxzZWAgdGhlbiBvbmx5IHJlcXVlc3RzIHRoYXQgc3BlY2lmeSB0aGVpciBvd24gY3VzdG9tCiAgICAgKiBjYWNoZSBvYmplY3Qgd2lsbCBiZSBjYWNoZWQuCiAgICAgKgogICAgICogIyMgSW50ZXJjZXB0b3JzCiAgICAgKgogICAgICogQmVmb3JlIHlvdSBzdGFydCBjcmVhdGluZyBpbnRlcmNlcHRvcnMsIGJlIHN1cmUgdG8gdW5kZXJzdGFuZCB0aGUKICAgICAqIHtAbGluayBuZy4kcSAkcSBhbmQgZGVmZXJyZWQvcHJvbWlzZSBBUElzfS4KICAgICAqCiAgICAgKiBGb3IgcHVycG9zZXMgb2YgZ2xvYmFsIGVycm9yIGhhbmRsaW5nLCBhdXRoZW50aWNhdGlvbiwgb3IgYW55IGtpbmQgb2Ygc3luY2hyb25vdXMgb3IKICAgICAqIGFzeW5jaHJvbm91cyBwcmUtcHJvY2Vzc2luZyBvZiByZXF1ZXN0IG9yIHBvc3Rwcm9jZXNzaW5nIG9mIHJlc3BvbnNlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGJlCiAgICAgKiBhYmxlIHRvIGludGVyY2VwdCByZXF1ZXN0cyBiZWZvcmUgdGhleSBhcmUgaGFuZGVkIHRvIHRoZSBzZXJ2ZXIgYW5kCiAgICAgKiByZXNwb25zZXMgYmVmb3JlIHRoZXkgYXJlIGhhbmRlZCBvdmVyIHRvIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRoYXQKICAgICAqIGluaXRpYXRlZCB0aGVzZSByZXF1ZXN0cy4gVGhlIGludGVyY2VwdG9ycyBsZXZlcmFnZSB0aGUge0BsaW5rIG5nLiRxCiAgICAgKiBwcm9taXNlIEFQSXN9IHRvIGZ1bGZpbGwgdGhpcyBuZWVkIGZvciBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcHJlLXByb2Nlc3NpbmcuCiAgICAgKgogICAgICogVGhlIGludGVyY2VwdG9ycyBhcmUgc2VydmljZSBmYWN0b3JpZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgJGh0dHBQcm92aWRlcmAgYnkKICAgICAqIGFkZGluZyB0aGVtIHRvIHRoZSBgJGh0dHBQcm92aWRlci5pbnRlcmNlcHRvcnNgIGFycmF5LiBUaGUgZmFjdG9yeSBpcyBjYWxsZWQgYW5kCiAgICAgKiBpbmplY3RlZCB3aXRoIGRlcGVuZGVuY2llcyAoaWYgc3BlY2lmaWVkKSBhbmQgcmV0dXJucyB0aGUgaW50ZXJjZXB0b3IuCiAgICAgKgogICAgICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBpbnRlcmNlcHRvcnMgKGFuZCB0d28ga2luZHMgb2YgcmVqZWN0aW9uIGludGVyY2VwdG9ycyk6CiAgICAgKgogICAgICogICAqIGByZXF1ZXN0YDogaW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2l0aCBhIGh0dHAgYGNvbmZpZ2Agb2JqZWN0LiBUaGUgZnVuY3Rpb24gaXMgZnJlZSB0bwogICAgICogICAgIG1vZGlmeSB0aGUgYGNvbmZpZ2Agb2JqZWN0IG9yIGNyZWF0ZSBhIG5ldyBvbmUuIFRoZSBmdW5jdGlvbiBuZWVkcyB0byByZXR1cm4gdGhlIGBjb25maWdgCiAgICAgKiAgICAgb2JqZWN0IGRpcmVjdGx5LCBvciBhIHByb21pc2UgY29udGFpbmluZyB0aGUgYGNvbmZpZ2Agb3IgYSBuZXcgYGNvbmZpZ2Agb2JqZWN0LgogICAgICogICAqIGByZXF1ZXN0RXJyb3JgOiBpbnRlcmNlcHRvciBnZXRzIGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3IKICAgICAqICAgICByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLgogICAgICogICAqIGByZXNwb25zZWA6IGludGVyY2VwdG9ycyBnZXQgY2FsbGVkIHdpdGggaHR0cCBgcmVzcG9uc2VgIG9iamVjdC4gVGhlIGZ1bmN0aW9uIGlzIGZyZWUgdG8KICAgICAqICAgICBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0IG9yIGNyZWF0ZSBhIG5ldyBvbmUuIFRoZSBmdW5jdGlvbiBuZWVkcyB0byByZXR1cm4gdGhlIGByZXNwb25zZWAKICAgICAqICAgICBvYmplY3QgZGlyZWN0bHksIG9yIGFzIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBgcmVzcG9uc2VgIG9yIGEgbmV3IGByZXNwb25zZWAgb2JqZWN0LgogICAgICogICAqIGByZXNwb25zZUVycm9yYDogaW50ZXJjZXB0b3IgZ2V0cyBjYWxsZWQgd2hlbiBhIHByZXZpb3VzIGludGVyY2VwdG9yIHRocmV3IGFuIGVycm9yIG9yCiAgICAgKiAgICAgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi4KICAgICAqCiAgICAgKgogICAgICogYGBganMKICAgICAqICAgLy8gcmVnaXN0ZXIgdGhlIGludGVyY2VwdG9yIGFzIGEgc2VydmljZQogICAgICogICAkcHJvdmlkZS5mYWN0b3J5KCdteUh0dHBJbnRlcmNlcHRvcicsIGZ1bmN0aW9uKCRxLCBkZXBlbmRlbmN5MSwgZGVwZW5kZW5jeTIpIHsKICAgICAqICAgICByZXR1cm4gewogICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kCiAgICAgKiAgICAgICAncmVxdWVzdCc6IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gc3VjY2VzcwogICAgICogICAgICAgICByZXR1cm4gY29uZmlnOwogICAgICogICAgICAgfSwKICAgICAqCiAgICAgKiAgICAgICAvLyBvcHRpb25hbCBtZXRob2QKICAgICAqICAgICAgJ3JlcXVlc3RFcnJvcic6IGZ1bmN0aW9uKHJlamVjdGlvbikgewogICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gZXJyb3IKICAgICAqICAgICAgICAgaWYgKGNhblJlY292ZXIocmVqZWN0aW9uKSkgewogICAgICogICAgICAgICAgIHJldHVybiByZXNwb25zZU9yTmV3UHJvbWlzZQogICAgICogICAgICAgICB9CiAgICAgKiAgICAgICAgIHJldHVybiAkcS5yZWplY3QocmVqZWN0aW9uKTsKICAgICAqICAgICAgIH0sCiAgICAgKgogICAgICoKICAgICAqCiAgICAgKiAgICAgICAvLyBvcHRpb25hbCBtZXRob2QKICAgICAqICAgICAgICdyZXNwb25zZSc6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBvbiBzdWNjZXNzCiAgICAgKiAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAqICAgICAgIH0sCiAgICAgKgogICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kCiAgICAgKiAgICAgICdyZXNwb25zZUVycm9yJzogZnVuY3Rpb24ocmVqZWN0aW9uKSB7CiAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBvbiBlcnJvcgogICAgICogICAgICAgICBpZiAoY2FuUmVjb3ZlcihyZWplY3Rpb24pKSB7CiAgICAgKiAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT3JOZXdQcm9taXNlCiAgICAgKiAgICAgICAgIH0KICAgICAqICAgICAgICAgcmV0dXJuICRxLnJlamVjdChyZWplY3Rpb24pOwogICAgICogICAgICAgfQogICAgICogICAgIH07CiAgICAgKiAgIH0pOwogICAgICoKICAgICAqICAgJGh0dHBQcm92aWRlci5pbnRlcmNlcHRvcnMucHVzaCgnbXlIdHRwSW50ZXJjZXB0b3InKTsKICAgICAqCiAgICAgKgogICAgICogICAvLyBhbHRlcm5hdGl2ZWx5LCByZWdpc3RlciB0aGUgaW50ZXJjZXB0b3IgdmlhIGFuIGFub255bW91cyBmYWN0b3J5CiAgICAgKiAgICRodHRwUHJvdmlkZXIuaW50ZXJjZXB0b3JzLnB1c2goZnVuY3Rpb24oJHEsIGRlcGVuZGVuY3kxLCBkZXBlbmRlbmN5MikgewogICAgICogICAgIHJldHVybiB7CiAgICAgKiAgICAgICdyZXF1ZXN0JzogZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgKiAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlCiAgICAgKiAgICAgICB9LAogICAgICoKICAgICAqICAgICAgICdyZXNwb25zZSc6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgKiAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlCiAgICAgKiAgICAgICB9CiAgICAgKiAgICAgfTsKICAgICAqICAgfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyBTZWN1cml0eSBDb25zaWRlcmF0aW9ucwogICAgICoKICAgICAqIFdoZW4gZGVzaWduaW5nIHdlYiBhcHBsaWNhdGlvbnMsIGNvbnNpZGVyIHNlY3VyaXR5IHRocmVhdHMgZnJvbToKICAgICAqCiAgICAgKiAtIFtKU09OIHZ1bG5lcmFiaWxpdHldKGh0dHA6Ly9oYWFja2VkLmNvbS9hcmNoaXZlLzIwMDgvMTEvMjAvYW5hdG9teS1vZi1hLXN1YnRsZS1qc29uLXZ1bG5lcmFiaWxpdHkuYXNweCkKICAgICAqIC0gW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpCiAgICAgKgogICAgICogQm90aCBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgbXVzdCBjb29wZXJhdGUgaW4gb3JkZXIgdG8gZWxpbWluYXRlIHRoZXNlIHRocmVhdHMuIEFuZ3VsYXIgY29tZXMKICAgICAqIHByZS1jb25maWd1cmVkIHdpdGggc3RyYXRlZ2llcyB0aGF0IGFkZHJlc3MgdGhlc2UgaXNzdWVzLCBidXQgZm9yIHRoaXMgdG8gd29yayBiYWNrZW5kIHNlcnZlcgogICAgICogY29vcGVyYXRpb24gaXMgcmVxdWlyZWQuCiAgICAgKgogICAgICogIyMjIEpTT04gVnVsbmVyYWJpbGl0eSBQcm90ZWN0aW9uCiAgICAgKgogICAgICogQSBbSlNPTiB2dWxuZXJhYmlsaXR5XShodHRwOi8vaGFhY2tlZC5jb20vYXJjaGl2ZS8yMDA4LzExLzIwL2FuYXRvbXktb2YtYS1zdWJ0bGUtanNvbi12dWxuZXJhYmlsaXR5LmFzcHgpCiAgICAgKiBhbGxvd3MgdGhpcmQgcGFydHkgd2Vic2l0ZSB0byB0dXJuIHlvdXIgSlNPTiByZXNvdXJjZSBVUkwgaW50bwogICAgICogW0pTT05QXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pTT05QKSByZXF1ZXN0IHVuZGVyIHNvbWUgY29uZGl0aW9ucy4gVG8KICAgICAqIGNvdW50ZXIgdGhpcyB5b3VyIHNlcnZlciBjYW4gcHJlZml4IGFsbCBKU09OIHJlcXVlc3RzIHdpdGggZm9sbG93aW5nIHN0cmluZyBgIildfScsXG4iYC4KICAgICAqIEFuZ3VsYXIgd2lsbCBhdXRvbWF0aWNhbGx5IHN0cmlwIHRoZSBwcmVmaXggYmVmb3JlIHByb2Nlc3NpbmcgaXQgYXMgSlNPTi4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSBpZiB5b3VyIHNlcnZlciBuZWVkcyB0byByZXR1cm46CiAgICAgKiBgYGBqcwogICAgICogWydvbmUnLCd0d28nXQogICAgICogYGBgCiAgICAgKgogICAgICogd2hpY2ggaXMgdnVsbmVyYWJsZSB0byBhdHRhY2ssIHlvdXIgc2VydmVyIGNhbiByZXR1cm46CiAgICAgKiBgYGBqcwogICAgICogKV19JywKICAgICAqIFsnb25lJywndHdvJ10KICAgICAqIGBgYAogICAgICoKICAgICAqIEFuZ3VsYXIgd2lsbCBzdHJpcCB0aGUgcHJlZml4LCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgSlNPTi4KICAgICAqCiAgICAgKgogICAgICogIyMjIENyb3NzIFNpdGUgUmVxdWVzdCBGb3JnZXJ5IChYU1JGKSBQcm90ZWN0aW9uCiAgICAgKgogICAgICogW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpIGlzIGEgdGVjaG5pcXVlIGJ5IHdoaWNoCiAgICAgKiBhbiB1bmF1dGhvcml6ZWQgc2l0ZSBjYW4gZ2FpbiB5b3VyIHVzZXIncyBwcml2YXRlIGRhdGEuIEFuZ3VsYXIgcHJvdmlkZXMgYSBtZWNoYW5pc20KICAgICAqIHRvIGNvdW50ZXIgWFNSRi4gV2hlbiBwZXJmb3JtaW5nIFhIUiByZXF1ZXN0cywgdGhlICRodHRwIHNlcnZpY2UgcmVhZHMgYSB0b2tlbiBmcm9tIGEgY29va2llCiAgICAgKiAoYnkgZGVmYXVsdCwgYFhTUkYtVE9LRU5gKSBhbmQgc2V0cyBpdCBhcyBhbiBIVFRQIGhlYWRlciAoYFgtWFNSRi1UT0tFTmApLiBTaW5jZSBvbmx5CiAgICAgKiBKYXZhU2NyaXB0IHRoYXQgcnVucyBvbiB5b3VyIGRvbWFpbiBjb3VsZCByZWFkIHRoZSBjb29raWUsIHlvdXIgc2VydmVyIGNhbiBiZSBhc3N1cmVkIHRoYXQKICAgICAqIHRoZSBYSFIgY2FtZSBmcm9tIEphdmFTY3JpcHQgcnVubmluZyBvbiB5b3VyIGRvbWFpbi4gVGhlIGhlYWRlciB3aWxsIG5vdCBiZSBzZXQgZm9yCiAgICAgKiBjcm9zcy1kb21haW4gcmVxdWVzdHMuCiAgICAgKgogICAgICogVG8gdGFrZSBhZHaM3O9WYZABAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/801JAAEAGt8LAqAdgwKgHNh/1lSJBtvWoWHp804AYAVOv1QAAAQEICgBNpboAo16+YW50YWdlIG9mIHRoaXMsIHlvdXIgc2VydmVyIG5lZWRzIHRvIHNldCBhIHRva2VuIGluIGEgSmF2YVNjcmlwdCByZWFkYWJsZSBzZXNzaW9uCiAgICAgKiBjb29raWUgY2FsbGVkIGBYU1JGLVRPS0VOYCBvbiB0aGUgZmlyc3QgSFRUUCBHRVQgcmVxdWVzdC4gT24gc3Vic2VxdWVudCBYSFIgcmVxdWVzdHMgdGhlCiAgICAgKiBzZXJ2ZXIgY2FuIHZlcmlmeSB0aGF0IHRoZSBjb29raWUgbWF0Y2hlcyBgWC1YU1JGLVRPS0VOYCBIVFRQIGhlYWRlciwgYW5kIHRoZXJlZm9yZSBiZSBzdXJlCiAgICAgKiB0aGF0IG9ubHkgSmF2YVNjcmlwdCBydW5uaW5nIG9uIHlvdXIgZG9tYWluIGNvdWxkIGhhdmUgc2VudCB0aGUgcmVxdWVzdC4gVGhlIHRva2VuIG11c3QgYmUKICAgICAqIHVuaXF1ZSBmb3IgZWFjaCB1c2VyIGFuZCBtdXN0IGJlIHZlcmlmaWFibGUgYnkgdGhlIHNlcnZlciAodG8gcHJldmVudCB0aGUgSmF2YVNjcmlwdCBmcm9tCiAgICAgKiBtYWtpbmcgdXAgaXRzIG93biB0b2tlbnMpLiBXZSByZWNvbW1lbmQgdGhhdCB0aGUgdG9rZW4gaXMgYSBkaWdlc3Qgb2YgeW91ciBzaXRlJ3MKICAgICAqIGF1dGhlbnRpY2F0aW9uIGNvb2tpZSB3aXRoIGEgW3NhbHRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NhbHRfKGNyeXB0b2dyYXBoeSYjNDE7KQogICAgICogZm9yIGFkZGVkIHNlY3VyaXR5LgogICAgICoKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXJzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHhzcmZIZWFkZXJOYW1lIGFuZCB4c3JmQ29va2llTmFtZQogICAgICogcHJvcGVydGllcyBvZiBlaXRoZXIgJGh0dHBQcm92aWRlci5kZWZhdWx0cyBhdCBjb25maWctdGltZSwgJGh0dHAuZGVmYXVsdHMgYXQgcnVuLXRpbWUsCiAgICAgKiBvciB0aGUgcGVyLXJlcXVlc3QgY29uZmlnIG9iamVjdC4KICAgICAqCiAgICAgKgogICAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBPYmplY3QgZGVzY3JpYmluZyB0aGUgcmVxdWVzdCB0byBiZSBtYWRlIGFuZCBob3cgaXQgc2hvdWxkIGJlCiAgICAgKiAgICBwcm9jZXNzZWQuIFRoZSBvYmplY3QgaGFzIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICoKICAgICAqICAgIC0gKiptZXRob2QqKiDigJMgYHtzdHJpbmd9YCDigJMgSFRUUCBtZXRob2QgKGUuZy4gJ0dFVCcsICdQT1NUJywgZXRjKQogICAgICogICAgLSAqKnVybCoqIOKAkyBge3N0cmluZ31gIOKAkyBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLgogICAgICogICAgLSAqKnBhcmFtcyoqIOKAkyBge09iamVjdC48c3RyaW5nfE9iamVjdD59YCDigJMgTWFwIG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aGljaCB3aWxsIGJlIHR1cm5lZAogICAgICogICAgICB0byBgP2tleTE9dmFsdWUxJmtleTI9dmFsdWUyYCBhZnRlciB0aGUgdXJsLiBJZiB0aGUgdmFsdWUgaXMgbm90IGEgc3RyaW5nLCBpdCB3aWxsIGJlCiAgICAgKiAgICAgIEpTT05pZmllZC4KICAgICAqICAgIC0gKipkYXRhKiog4oCTIGB7c3RyaW5nfE9iamVjdH1gIOKAkyBEYXRhIHRvIGJlIHNlbnQgYXMgdGhlIHJlcXVlc3QgbWVzc2FnZSBkYXRhLgogICAgICogICAgLSAqKmhlYWRlcnMqKiDigJMgYHtPYmplY3R9YCDigJMgTWFwIG9mIHN0cmluZ3Mgb3IgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBzdHJpbmdzIHJlcHJlc2VudGluZwogICAgICogICAgICBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBJZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgbnVsbCwgdGhlCiAgICAgKiAgICAgIGhlYWRlciB3aWxsIG5vdCBiZSBzZW50LgogICAgICogICAgLSAqKnhzcmZIZWFkZXJOYW1lKiog4oCTIGB7c3RyaW5nfWAg4oCTIE5hbWUgb2YgSFRUUCBoZWFkZXIgdG8gcG9wdWxhdGUgd2l0aCB0aGUgWFNSRiB0b2tlbi4KICAgICAqICAgIC0gKip4c3JmQ29va2llTmFtZSoqIOKAkyBge3N0cmluZ31gIOKAkyBOYW1lIG9mIGNvb2tpZSBjb250YWluaW5nIHRoZSBYU1JGIHRva2VuLgogICAgICogICAgLSAqKnRyYW5zZm9ybVJlcXVlc3QqKiDigJMKICAgICAqICAgICAgYHtmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyKXxBcnJheS48ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcik+fWAg4oCTCiAgICAgKiAgICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cAogICAgICogICAgICByZXF1ZXN0IGJvZHkgYW5kIGhlYWRlcnMgYW5kIHJldHVybnMgaXRzIHRyYW5zZm9ybWVkICh0eXBpY2FsbHkgc2VyaWFsaXplZCkgdmVyc2lvbi4KICAgICAqICAgICAgU2VlIHtAbGluayBuZy4kaHR0cCNvdmVycmlkaW5nLXRoZS1kZWZhdWx0LXRyYW5zZm9ybWF0aW9ucy1wZXItcmVxdWVzdAogICAgICogICAgICBPdmVycmlkaW5nIHRoZSBEZWZhdWx0IFRyYW5zZm9ybWF0aW9uc30KICAgICAqICAgIC0gKip0cmFuc2Zvcm1SZXNwb25zZSoqIOKAkwogICAgICogICAgICBge2Z1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIpfEFycmF5LjxmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyKT59YCDigJMKICAgICAqICAgICAgdHJhbnNmb3JtIGZ1bmN0aW9uIG9yIGFuIGFycmF5IG9mIHN1Y2ggZnVuY3Rpb25zLiBUaGUgdHJhbnNmb3JtIGZ1bmN0aW9uIHRha2VzIHRoZSBodHRwCiAgICAgKiAgICAgIHJlc3BvbnNlIGJvZHkgYW5kIGhlYWRlcnMgYW5kIHJldHVybnMgaXRzIHRyYW5zZm9ybWVkICh0eXBpY2FsbHkgZGVzZXJpYWxpemVkKSB2ZXJzaW9uLgogICAgICogICAgICBTZWUge0BsaW5rIG5nLiRodHRwI292ZXJyaWRpbmctdGhlLWRlZmF1bHQtdHJhbnNmb3JtYXRpb25zLXBlci1yZXF1ZXN0CiAgICAgKiAgICAgIE92ZXJyaWRpbmcgdGhlIERlZmF1bHQgVHJhbnNmb3JtYXRpb25zfQogICAgICogICAgLSAqKmNhY2hlKiog4oCTIGB7Ym9vbGVhbnxDYWNoZX1gIOKAkyBJZiB0cnVlLCBhIGRlZmF1bHQgJGh0dHAgY2FjaGUgd2lsbCBiZSB1c2VkIHRvIGNhY2hlIHRoZQogICAgICogICAgICBHRVQgcmVxdWVzdCwgb3RoZXJ3aXNlIGlmIGEgY2FjaGUgaW5zdGFuY2UgYnVpbHQgd2l0aAogICAgICogICAgICB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSAkY2FjaGVGYWN0b3J5fSwgdGhpcyBjYWNoZSB3aWxsIGJlIHVzZWQgZm9yCiAgICAgKiAgICAgIGNhY2hpbmcuCiAgICAgKiAgICAtICoqdGltZW91dCoqIOKAkyBge251bWJlcnxQcm9taXNlfWAg4oCTIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciB7QGxpbmsgbmcuJHEgcHJvbWlzZX0KICAgICAqICAgICAgdGhhdCBzaG91bGQgYWJvcnQgdGhlIHJlcXVlc3Qgd2hlbiByZXNvbHZlZC4KICAgICAqICAgIC0gKip3aXRoQ3JlZGVudGlhbHMqKiAtIGB7Ym9vbGVhbn1gIC0gd2hldGhlciB0byBzZXQgdGhlIGB3aXRoQ3JlZGVudGlhbHNgIGZsYWcgb24gdGhlCiAgICAgKiAgICAgIFhIUiBvYmplY3QuIFNlZSBbcmVxdWVzdHMgd2l0aCBjcmVkZW50aWFsc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRUUC9BY2Nlc3NfY29udHJvbF9DT1JTI1JlcXVlc3RzX3dpdGhfY3JlZGVudGlhbHMpCiAgICAgKiAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICogICAgLSAqKnJlc3BvbnNlVHlwZSoqIC0gYHtzdHJpbmd9YCAtIHNlZQogICAgICogICAgICBbcmVxdWVzdFR5cGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRE9NL1hNTEh0dHBSZXF1ZXN0I3Jlc3BvbnNlVHlwZSkuCiAgICAgKgogICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBSZXR1cm5zIGEge0BsaW5rIG5nLiRxIHByb21pc2V9IG9iamVjdCB3aXRoIHRoZQogICAgICogICBzdGFuZGFyZCBgdGhlbmAgbWV0aG9kIGFuZCB0d28gaHR0cCBzcGVjaWZpYyBtZXRob2RzOiBgc3VjY2Vzc2AgYW5kIGBlcnJvcmAuIFRoZSBgdGhlbmAKICAgICAqICAgbWV0aG9kIHRha2VzIHR3byBhcmd1bWVudHMgYSBzdWNjZXNzIGFuZCBhbiBlcnJvciBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEKICAgICAqICAgcmVzcG9uc2Ugb2JqZWN0LiBUaGUgYHN1Y2Nlc3NgIGFuZCBgZXJyb3JgIG1ldGhvZHMgdGFrZSBhIHNpbmdsZSBhcmd1bWVudCAtIGEgZnVuY3Rpb24gdGhhdAogICAgICogICB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzIG9yIGZhaWxzIHJlc3BlY3RpdmVseS4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgaW50bwogICAgICogICB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlc3RydWN0dXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IHBhc3NlZCBpbnRvIHRoZQogICAgICogICBgdGhlbmAgbWV0aG9kLiBUaGUgcmVzcG9uc2Ugb2JqZWN0IGhhcyB0aGVzZSBwcm9wZXJ0aWVzOgogICAgICoKICAgICAqICAgLSAqKmRhdGEqKiDigJMgYHtzdHJpbmd8T2JqZWN0fWAg4oCTIFRoZSByZXNwb25zZSBib2R5IHRyYW5zZm9ybWVkIHdpdGggdGhlIHRyYW5zZm9ybQogICAgICogICAgIGZ1bmN0aW9ucy4KICAgICAqICAgLSAqKnN0YXR1cyoqIOKAkyBge251bWJlcn1gIOKAkyBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZS4KICAgICAqICAgLSAqKmhlYWRlcnMqKiDigJMgYHtmdW5jdGlvbihbaGVhZGVyTmFtZV0pfWAg4oCTIEhlYWRlciBnZXR0ZXIgZnVuY3Rpb24uCiAgICAgKiAgIC0gKipjb25maWcqKiDigJMgYHtPYmplY3R9YCDigJMgVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcXVlc3QuCiAgICAgKiAgIC0gKipzdGF0dXNUZXh0Kiog4oCTIGB7c3RyaW5nfWAg4oCTIEhUVFAgc3RhdHVzIHRleHQgb2YgdGhlIHJlc3BvbnNlLgogICAgICoKICAgICAqIEBwcm9wZXJ0eSB7QXJyYXkuPE9iamVjdD59IHBlbmRpbmdSZXF1ZXN0cyBBcnJheSBvZiBjb25maWcgb2JqZWN0cyBmb3IgY3VycmVudGx5IHBlbmRpbmcKICAgICAqICAgcmVxdWVzdHMuIFRoaXMgaXMgcHJpbWFyaWx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KICAgICAqCiAgICAgKgogICAgICogQGV4YW1wbGUKPGV4YW1wbGUgbW9kdWxlPSJodHRwRXhhbXBsZSI+CjxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogIDxkaXYgbmctY29udHJvbGxlcj0iRmV0Y2hDb250cm9sbGVyIj4KICAgIDxzZWxlY3QgbmctbW9kZWw9Im1ldGhvZCI+CiAgICAgIDxvcHRpb24+R0VUPC9vcHRpb24+CiAgICAgIDxvcHRpb24+SlNPTlA8L29wdGlvbj4KICAgIDwvc2VsZWN0PgogICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJ1cmwiIHNpemU9IjgwIi8+CiAgICA8YnV0dG9uIGlkPSJmZXRjaGJ0biIgbmctY2xpY2s9ImZldGNoKCkiPmZldGNoPC9idXR0b24+PGJyPgogICAgPGJ1dHRvbiBpZD0ic2FtcGxlZ2V0YnRuIiBuZy1jbGljaz0idXBkYXRlTW9kZWwoJ0dFVCcsICdodHRwLWhlbGxvLmh0bWwnKSI+U2FtcGxlIEdFVDwvYnV0dG9uPgogICAgPGJ1dHRvbiBpZD0ic2FtcGxlanNvbnBidG4iCiAgICAgIG5nLWNsaWNrPSJ1cGRhdGVNb2RlbCgnSlNPTlAnLAogICAgICAgICAgICAgICAgICAgICdodHRwczovL2FuZ3VsYXJqcy5vcmcvZ3JlZXQucGhwP2NhbGxiYWNrPUpTT05fQ0FMTEJBQ0smbmFtZT1TdXBlciUyMEhlcm8nKSI+CiAgICAgIFNhbXBsZSBKU09OUAogICAgPC9idXR0b24+CiAgICA8YnV0dG9uIGlkPSJpbnZhbGlkanNvbnBidG4iCiAgICAgIG5nLWNsaWNrPSJ1cGRhdGVNb2RlbCgnSlNPTlAnLCAnaHR0cHM6Ly9hbmd1bGFyanMub3JnL2RvZXNudGV4aXN0JmNhbGxiYWNrPUpTT05fQ0FMTEJBQ0snKSI+CiAgICAgICAgSW52YWxpZCBKU09OUAogICAgICA8L2J1dHRvbj4KICAgIDxwcmU+aHR0cCBzdGF0dXMgY29kZToge3tzdGF0dXN9fTwvcHJlPgogICAgPHByZT5odHRwIHJlc3BvbnNlIGRhdGE6IHt7ZGF0YX19PC9wcmU+CiAgPC9kaXY+CjwvZmlsZT4KPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KICBhbmd1bGFyLm1vZHVsZSgnaHR0cEV4YW1wbGUnLCBbXSkKICAgIC5jb250cm9sbGVyKCdGZXRjaENvbnRyb2xsZXInLCBbJyRzY29wZScsICckaHR0cCcsICckdGVtcGxhdGVDYWNoZScsCiAgICAgIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICR0ZW1wbGF0ZUNhY2hlKSB7CiAgICAgICAgJHNjb3BlLm1ldGhvZCA9ICdHRVQnOwogICAgICAgICRzY29wZS51cmwgPSAnaHR0cC1oZWxsby5odG1sJzsKCiAgICAgICAgJHNjb3BlLmZldGNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAkc2NvcGUuY29kZSA9IG51bGw7CiAgICAgICAgICAkc2NvcGUucmVzcG9uc2UgPSBudWxsOwoKICAgICAgICAgICRodHRwKHttZXRob2Q6ICRzY29wZS5tZXRob2QsIHVybDogJHNjb3BlLnVybCwgY2FjaGU6ICR0ZW1wbGF0ZUNhY2hlfSkuCiAgICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIH0pLgogICAgICAgICAgICBlcnJvcihmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IGRhdGEgfHwgIlJlcXVlc3QgZmFpbGVkIjsKICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzID0gc3RhdHVzOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnVwZGF0ZU1vZGVsID0gZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICAgICRzY29wZS5tZXRob2QgPSBtZXRob2Q7CiAgICAgICAgICAkc2NvcGUudXJsID0gdXJsOwogICAgICAgIH07CiAgICAgIH1dKTsKPC9maWxlPgo8ZmlsZSBuYW1lPSJodHRwLWhlbGxvLmh0bWwiPgogIEhlbGxvLCAkaHR0cCEKPC9maWxlPgo8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICB2YXIgc3RhdHVzID0gZWxlbWVudChieS5iaW5kaW5nKCdzdGF0dXMnKSk7CiAgdmFyIGRhdGEgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2RhdGEnKSk7CiAgdmFyIGZldGNoQnRuID0gZWxlbWVudChieS5pZCgnZmV0Y2hidG4nKSk7CiAgdmFyIHNhbXBsZUdldEJ0biA9IGVsZW1lbnQoYnkuaWQoJ3NhbXBsZWdldGJ0bicpKTsKICB2YXIgc2FtcGxlSnNvbnBCdG4gPSBlbGVtZW50KGJ5LmlkKCdzYW1wbGVqc29ucGJ0bicpKTsKICB2YXIgaW52YWxpZEpzb25wQnRuID0gZWxlbWVudChieS5pZCgnaW52YWxpZGpzb25wYnRuJykpOwoKICBpdCgnc2hvdWxkIG1ha2UgYW4geGhyIEdFVCByZXF1ZXN0JywgZnVuY3Rpb24oKSB7CiAgICBzYW1wbGVHZXRCdG4uY2xpY2soKTsKICAgIGZldGNoQnRuLmNsaWNrKCk7CiAgICBleHBlY3Qoc3RhdHVzLmdldFRleHQoKSkudG9NYXRjaCgnMjAwJyk7CiAgICBleHBlY3QoZGF0YS5nZXRUZXh0KCkpLnRvTWF0Y2goL0hlbGxvLCBcJGh0dHAhLyk7CiAgfSk7CgovLyBDb21tZW50ZWQgb3V0IGR1ZSB0byBmbGFrZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy85MTg1Ci8vIGl0KCdzaG91bGQgbWFrZSBhIEpTT05QIHJlcXVlc3QgdG8gYW5ndWxhcmpzLm9yZycsIGZ1bmN0aW9uKCkgewovLyAgIHNhbXBsZUpzb25wQnRuLmNsaWNrKCk7Ci8vICAgZmV0Y2hCdG4uY2xpY2soKTsKLy8gICBleHBlY3Qoc3RhdHVzLmdldFRleHQoKSkudG9NYXRjaCgnMjAwJyk7Ci8vICAgZXhwZWN0KGRhdGEuZ2V0VGV4dCgpKS50b01hdGNoKC9TdXBlciBIZXJvIS8pOwovLyB9KTsKCiAgaXQoJ3Nob3VsZCBtYWtlIEpTT05QIHJlcXVlc3QgdG8gaW52YWxpZCBVUkwgYW5kIGludm9rZSB0aGUgZXJyb3IgaGFuZGxlcicsCiAgICAgIGZ1bmN0aW9uKCkgewogICAgaW52YWxpZEpzb25wQnRuLmNsaWNrKCk7CiAgICBmZXRjaEJ0bi5jbGljaygpOwogICAgZXhwZWN0KHN0YXR1cy5nZXRUZXh0KCkpLnRvTWF0Y2goJzAnKTsKICAgIGV4cGVjdChkYXRhLmdldFRleHQoKSkudG9NYXRjaCgnUmVxdWVzdCBmYWlsZWQnKTsKICB9KTsKPC9maWxlPgo8L2V4YW1wbGU+CiAgICAgKi8KICAgIGZ1bmN0aW9uICRodHRwKHJlcXVlc3RDb25maWcpIHsKICAgICAgdmFyIGNvbmZpZyA9IHsKIA0KjNzvVq+QAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDw0QABABm6pwKgHNsCoB2CVIh/1WHp800G29aiAEAvwE7kAAAEBCAoAo16+AE2luozc71bAkAEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8NUAAQAZuqMCoBzbAqAdglSIf9Vh6fNNBtxVwgBAL8PPwAAABAQgKAKNevgBNpbqM3O9W2JMBABpVAAAaVQAAaPcoH9LFCAAnrR4TCABFAFUMNvhAAEAGHw3AqAdgwKgHNh/1lSc5Uio025J4N4AQAO3k5QAAAQEICgBNpboAo16+N0ZFOA0KaW9uKG9iamVjdCwgbGlzdGVuZXIpIHsKICAgICAgdmFyIGdlb21ldHJpZXMgPSBvYmplY3QuZ2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgbGlzdGVuZXIpOwogICAgfQogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX3N0cmVhbUxpbmUoY29vcmRpbmF0ZXMsIGxpc3RlbmVyLCBjbG9zZWQpIHsKICAgIHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGggLSBjbG9zZWQsIGNvb3JkaW5hdGU7CiAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgIHdoaWxlICgrK2kgPCBuKSBjb29yZGluYXRlID0gY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLnBvaW50KGNvb3JkaW5hdGVbMF0sIGNvb3JkaW5hdGVbMV0sIGNvb3JkaW5hdGVbMl0pOwogICAgbGlzdGVuZXIubGluZUVuZCgpOwogIH0KICBmdW5jdGlvbiBkM19nZW9fc3RyZWFtUG9seWdvbihjb29yZGluYXRlcywgbGlzdGVuZXIpIHsKICAgIHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKTsKICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtTGluZShjb29yZGluYXRlc1tpXSwgbGlzdGVuZXIsIDEpOwogICAgbGlzdGVuZXIucG9seWdvbkVuZCgpOwogIH0KICBkMy5nZW8uYXJlYSA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgZDNfZ2VvX2FyZWFTdW0gPSAwOwogICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGQzX2dlb19hcmVhKTsKICAgIHJldHVybiBkM19nZW9fYXJlYVN1bTsKICB9OwogIHZhciBkM19nZW9fYXJlYVN1bSwgZDNfZ2VvX2FyZWFSaW5nU3VtID0gbmV3IGQzX2FkZGVyKCk7CiAgdmFyIGQzX2dlb19hcmVhID0gewogICAgc3BoZXJlOiBmdW5jdGlvbigpIHsKICAgICAgZDNfZ2VvX2FyZWFTdW0gKz0gNCAqIM+AOwogICAgfSwKICAgIHBvaW50OiBkM19ub29wLAogICAgbGluZVN0YXJ0OiBkM19ub29wLAogICAgbGluZUVuZDogZDNfbm9vcCwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX2dlb19hcmVhUmluZ1N1bS5yZXNldCgpOwogICAgICBkM19nZW9fYXJlYS5saW5lU3RhcnQgPSBkM19nZW9fYXJlYVJpbmdTdGFydDsKICAgIH0sCiAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGFyZWEgPSAyICogZDNfZ2VvX2FyZWFSaW5nU3VtOwogICAgICBkM19nZW9fYXJlYVN1bSArPSBhcmVhIDwgMCA/IDQgKiDPgCArIGFyZWEgOiBhcmVhOwogICAgICBkM19nZW9fYXJlYS5saW5lU3RhcnQgPSBkM19nZW9fYXJlYS5saW5lRW5kID0gZDNfZ2VvX2FyZWEucG9pbnQgPSBkM19ub29wOwogICAgfQogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX2FyZWFSaW5nU3RhcnQoKSB7CiAgICB2YXIgzrswMCwgz4YwMCwgzrswLCBjb3PPhjAsIHNpbs+GMDsKICAgIGQzX2dlb19hcmVhLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7CiAgICAgIGQzX2dlb19hcmVhLnBvaW50ID0gbmV4dFBvaW50OwogICAgICDOuzAgPSAozrswMCA9IM67KSAqIGQzX3JhZGlhbnMsIGNvc8+GMCA9IE1hdGguY29zKM+GID0gKM+GMDAgPSDPhikgKiBkM19yYWRpYW5zIC8gMiArIM+AIC8gNCksIAogICAgICBzaW7PhjAgPSBNYXRoLnNpbijPhik7CiAgICB9OwogICAgZnVuY3Rpb24gbmV4dFBvaW50KM67LCDPhikgewogICAgICDOuyAqPSBkM19yYWRpYW5zOwogICAgICDPhiA9IM+GICogZDNfcmFkaWFucyAvIDIgKyDPgCAvIDQ7CiAgICAgIHZhciBkzrsgPSDOuyAtIM67MCwgc2TOuyA9IGTOuyA+PSAwID8gMSA6IC0xLCBhZM67ID0gc2TOuyAqIGTOuywgY29zz4YgPSBNYXRoLmNvcyjPhiksIHNpbs+GID0gTWF0aC5zaW4oz4YpLCBrID0gc2luz4YwICogc2luz4YsIHUgPSBjb3PPhjAgKiBjb3PPhiArIGsgKiBNYXRoLmNvcyhhZM67KSwgdiA9IGsgKiBzZM67ICogTWF0aC5zaW4oYWTOuyk7CiAgICAgIGQzX2dlb19hcmVhUmluZ1N1bS5hZGQoTWF0aC5hdGFuMih2LCB1KSk7CiAgICAgIM67MCA9IM67LCBjb3PPhjAgPSBjb3PPhiwgc2luz4YwID0gc2luz4Y7CiAgICB9CiAgICBkM19nZW9fYXJlYS5saW5lRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgIG5leHRQb2ludCjOuzAwLCDPhjAwKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW4oc3BoZXJpY2FsKSB7CiAgICB2YXIgzrsgPSBzcGhlcmljYWxbMF0sIM+GID0gc3BoZXJpY2FsWzFdLCBjb3PPhiA9IE1hdGguY29zKM+GKTsKICAgIHJldHVybiBbIGNvc8+GICogTWF0aC5jb3MozrspLCBjb3PPhiAqIE1hdGguc2luKM67KSwgTWF0aC5zaW4oz4YpIF07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW5Eb3QoYSwgYikgewogICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKGEsIGIpIHsKICAgIHJldHVybiBbIGFbMV0gKiBiWzJdIC0gYVsyXSAqIGJbMV0sIGFbMl0gKiBiWzBdIC0gYVswXSAqIGJbMl0sIGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF0gXTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbkFkZChhLCBiKSB7CiAgICBhWzBdICs9IGJbMF07CiAgICBhWzFdICs9IGJbMV07CiAgICBhWzJdICs9IGJbMl07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW5TY2FsZSh2ZWN0b3IsIGspIHsKICAgIHJldHVybiBbIHZlY3RvclswXSAqIGssIHZlY3RvclsxXSAqIGssIHZlY3RvclsyXSAqIGsgXTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbk5vcm1hbGl6ZShkKSB7CiAgICB2YXIgbCA9IE1hdGguc3FydChkWzBdICogZFswXSArIGRbMV0gKiBkWzFdICsgZFsyXSAqIGRbMl0pOwogICAgZFswXSAvPSBsOwogICAgZFsxXSAvPSBsOwogICAgZFsyXSAvPSBsOwogIH0KICBmdW5jdGlvbiBkM19nZW9fc3BoZXJpY2FsKGNhcnRlc2lhbikgewogICAgcmV0dXJuIFsgTWF0aC5hdGFuMihjYXJ0ZXNpYW5bMV0sIGNhcnRlc2lhblswXSksIGQzX2FzaW4oY2FydGVzaWFuWzJdKSBdOwogIH0KICBmdW5jdGlvbiBkM19nZW9fc3BoZXJpY2FsRXF1YWwoYSwgYikgewogICAgcmV0dXJuIGFicyhhWzBdIC0gYlswXSkgPCDOtSAmJiBhYnMoYVsxXSAtIGJbMV0pIDwgzrU7CiAgfQogIGQzLmdlby5ib3VuZHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciDOuzAsIM+GMCwgzrsxLCDPhjEsIM67XywgzrtfXywgz4ZfXywgcDAsIGTOu1N1bSwgcmFuZ2VzLCByYW5nZTsKICAgIHZhciBib3VuZCA9IHsKICAgICAgcG9pbnQ6IHBvaW50LAogICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAgICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBib3VuZC5wb2ludCA9IHJpbmdQb2ludDsKICAgICAgICBib3VuZC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7CiAgICAgICAgYm91bmQubGluZUVuZCA9IHJpbmdFbmQ7CiAgICAgICAgZM67U3VtID0gMDsKICAgICAgICBkM19nZW9fYXJlYS5wb2x5Z29uU3RhcnQoKTsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgZDNfZ2VvX2FyZWEucG9seWdvbkVuZCgpOwogICAgICAgIGJvdW5kLnBvaW50ID0gcG9pbnQ7CiAgICAgICAgYm91bmQubGluZVN0YXJ0ID0gbGluZVN0YXJ0OwogICAgICAgIGJvdW5kLmxpbmVFbmQgPSBsaW5lRW5kOwogICAgICAgIGlmIChkM19nZW9fYXJlYVJpbmdTdW0gPCAwKSDOuzAgPSAtKM67MSA9IDE4MCksIM+GMCA9IC0oz4YxID0gOTApOyBlbHNlIGlmIChkzrtTdW0gPiDOtSkgz4YxID0gOTA7IGVsc2UgaWYgKGTOu1N1bSA8IC3OtSkgz4YwID0gLTkwOwogICAgICAgIHJhbmdlWzBdID0gzrswLCByYW5nZVsxXSA9IM67MTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIHBvaW50KM67LCDPhikgewogICAgICByYW5nZXMucHVzaChyYW5nZSA9IFsgzrswID0gzrssIM67MSA9IM67IF0pOwogICAgICBpZiAoz4YgPCDPhjApIM+GMCA9IM+GOwogICAgICBpZiAoz4YgPiDPhjEpIM+GMSA9IM+GOwogICAgfQogICAgZnVuY3Rpb24gbGluZVBvaW50KM67LCDPhikgewogICAgICB2YXIgcCA9IGQzX2dlb19jYXJ0ZXNpYW4oWyDOuyAqIGQzX3JhZGlhbnMsIM+GICogZDNfcmFkaWFucyBdKTsKICAgICAgaWYgKHAwKSB7CiAgICAgICAgdmFyIG5vcm1hbCA9IGQzX2dlb19jYXJ0ZXNpYW5Dcm9zcyhwMCwgcCksIGVxdWF0b3JpYWwgPSBbIG5vcm1hbFsxXSwgLW5vcm1hbFswXSwgMCBdLCBpbmZsZWN0aW9uID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKGVxdWF0b3JpYWwsIG5vcm1hbCk7CiAgICAgICAgZDNfZ2VvX2NhcnRlc2lhbk5vcm1hbGl6ZShpbmZsZWN0aW9uKTsKICAgICAgICBpbmZsZWN0aW9uID0gZDNfZ2VvX3NwaGVyaWNhbChpbmZsZWN0aW9uKTsKICAgICAgICB2YXIgZM67ID0gzrsgLSDOu18sIHMgPSBkzrsgPiAwID8gMSA6IC0xLCDOu2kgPSBpbmZsZWN0aW9uWzBdICogZDNfZGVncmVlcyAqIHMsIGFudGltZXJpZGlhbiA9IGFicyhkzrspID4gMTgwOwogICAgICAgIGlmIChhbnRpbWVyaWRpYW4gXiAocyAqIM67XyA8IM67aSAmJiDOu2kgPCBzICogzrspKSB7CiAgICAgICAgICB2YXIgz4ZpID0gaW5mbGVjdGlvblsxXSAqIGQzX2RlZ3JlZXM7CiAgICAgICAgICBpZiAoz4ZpID4gz4YxKSDPhjEgPSDPhmk7CiAgICAgICAgfSBlbHNlIGlmICjOu2kgPSAozrtpICsgMzYwKSAlIDM2MCAtIDE4MCwgYW50aW1lcmlkaWFuIF4gKHMgKiDOu18gPCDOu2kgJiYgzrtpIDwgcyAqIM67KSkgewogICAgICAgICAgdmFyIM+GaSA9IC1pbmZsZWN0aW9uWzFdICogZDNfZGVncmVlczsKICAgICAgICAgIGlmICjPhmkgPCDPhjApIM+GMCA9IM+GaTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKM+GIDwgz4YwKSDPhjAgPSDPhjsKICAgICAgICAgIGlmICjPhiA+IM+GMSkgz4YxID0gz4Y7CiAgICAgICAgfQogICAgICAgIGlmIChhbnRpbWVyaWRpYW4pIHsKICAgICAgICAgIGlmICjOuyA8IM67XykgewogICAgICAgICAgICBpZiAoYW5nbGUozrswLCDOuykgPiBhbmdsZSjOuzAsIM67MSkpIM67MSA9IM67OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGFuZ2xlKM67LCDOuzEpID4gYW5nbGUozrswLCDOuzEpKSDOuzAgPSDOuzsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKM67MSA+PSDOuzApIHsKICAgICAgICAgICAgaWYgKM67IDwgzrswKSDOuzAgPSDOuzsKICAgICAgICAgICAgaWYgKM67ID4gzrsxKSDOuzEgPSDOuzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICjOuyA+IM67XykgewogICAgICAgICAgICAgIGlmIChhbmdsZSjOuzAsIM67KSA+IGFuZ2xlKM67MCwgzrsxKSkgzrsxID0gzrs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKGFuZ2xlKM67LCDOuzEpID4gYW5nbGUozrswLCDOuzEpKSDOuzAgPSDOuzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwb2ludCjOuywgz4YpOwogICAgICB9CiAgICAgIHAwID0gcCwgzrtfID0gzrs7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7CiAgICAgIGJvdW5kLnBvaW50ID0gbGluZVBvaW50OwogICAgfQogICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgcmFuZ2VbMF0gPSDOuzAsIHJhbmdlWzFdID0gzrsxOwogICAgICBib3VuZC5wb2ludCA9IHBvaW50OwogICAgICBwMCA9IG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiByaW5nUG9pbnQozrssIM+GKSB7CiAgICAgIGlmIChwMCkgewogICAgICAgIHZhciBkzrsgPSDOuyAtIM67XzsKICAgICAgICBkzrtTdW0gKz0gYWJzKGTOuykgPiAxODAgPyBkzrsgKyAoZM67ID4gMCA/IDM2MCA6IC0zNjApIDogZM67OwogICAgICB9IGVsc2UgzrtfXyA9IM67LCDPhl9fID0gz4Y7CiAgICAgIGQzX2dlb19hcmVhLnBvaW50KM67LCDPhik7CiAgICAgIGxpbmVQb2ludCjOuywgz4YpOwogICAgfQogICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkgewogICAgICBkM19nZW9fYXJlYS5saW5lU3RhcnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7CiAgICAgIHJpbmdQb2ludCjOu19fLCDPhl9fKTsKICAgICAgZDNfZ2VvX2FyZWEubGluZUVuZCgpOwogICAgICBpZiAoYWJzKGTOu1N1bSkgPiDOtSkgzrswID0gLSjOuzEgPSAxODApOwogICAgICByYW5nZVswXSA9IM67MCwgcmFuZ2VbMV0gPSDOuzE7CiAgICAgIHAwID0gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIGFuZ2xlKM67MCwgzrsxKSB7CiAgICAgIHJldHVybiAozrsxIC09IM67MCkgPCAwID8gzrsxICsgMzYwIDogzrsxOwogICAgfQogICAgZnVuY3Rpb24gY29tcGFyZVJhbmdlcyhhLCBiKSB7CiAgICAgIHJldHVybiBhWzBdIC0gYlswXTsKICAgIH0KICAgIGZ1bmN0aW9uIHdpdGhpblJhbmdlKHgsIHJhbmdlKSB7CiAgICAgIHJldHVybiByYW5nZVswXSA8PSByYW5nZVsxXSA/IHJhbmdlWzBdIDw9IHggJiYgeCA8PSByYW5nZVsxXSA6IHggPCByYW5nZVswXSB8fCByYW5nZVsxXSA8IHg7CiAgICB9CiAgICByZXR1cm4gZnVuY3Rpb24oZmVhdHVyZSkgewogICAgICDPhjEgPSDOuzEgPSAtKM67MCA9IM+GMCA9IEluZmluaXR5KTsKICAgICAgcmFuZ2VzID0gW107CiAgICAgIGQzLmdlby5zdHJlYW0oZmVhdHVyZSwgYm91bmQpOwogICAgICB2YXIgbiA9IHJhbmdlcy5sZW5ndGg7CiAgICAgIGlmIChuKSB7CiAgICAgICAgcmFuZ2VzLnNvcnQoY29tcGFyZVJhbmdlcyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDEsIGEgPSByYW5nZXNbMF0sIGIsIG1lcmdlZCA9IFsgYSBdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBiID0gcmFuZ2VzW2ldOwogICAgICAgICAgaWYgKHdpdGhpblJhbmdlKGJbMF0sIGEpIHx8IHdpdGhpblJhbmdlKGJbMV0sIGEpKSB7CiAgICAgICAgICAgIGlmIChhbmdsZShhWzBdLCBiWzFdKSA+IGFuZ2xlKGFbMF0sIGFbMV0pKSBhWzFdID0gYlsxXTsKICAgICAgICAgICAgaWYgKGFuZ2xlKGJbMF0sIGFbMV0pID4gYW5nbGUoYVswXSwgYVsxXSkpIGFbMF0gPSBiWzBdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVyZ2VkLnB1c2goYSA9IGIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgYmVzdCA9IC1JbmZpbml0eSwgZM67OwogICAgICAgIGZvciAodmFyIG4gPSBtZXJnZWQubGVuZ3RoIC0gMSwgaSA9IDAsIGEgPSBtZXJnZWRbbl0sIGI7IGkgPD0gbjsgYSA9IGIsICsraSkgewogICAgICAgICAgYiA9IG1lcmdlZFtpXTsKICAgICAgICAgIGlmICgoZM67ID0gYW5nbGUoYVsxXSwgYlswXSkpID4gYmVzdCkgYmVzdCA9IGTOuywgzrswID0gYlswXSwgzrsxID0gYVsxXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmFuZ2VzID0gcmFuZ2UgPSBudWxsOwogICAgICByZXR1cm4gzrswID09PSBJbmZpbml0eSB8fCDPhjAgPT09IEluZmluaXR5ID8gWyBbIE5hTiwgTmFOIF0sIFsgTmFOLCBOYU4gXSBdIDogWyBbIM67MCwgz4YwIF0sIFsgzrsxLCDPhjEgXSBdOwogICAgfTsKICB9KCk7CiAgZDMuZ2VvLmNlbnRyb2lkID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBkM19nZW9fY2VudHJvaWRXMCA9IGQzX2dlb19jZW50cm9pZFcxID0gZDNfZ2VvX2NlbnRyb2lkWDAgPSBkM19nZW9fY2VudHJvaWRZMCA9IGQzX2dlb19jZW50cm9pZFowID0gZDNfZ2VvX2NlbnRyb2lkWDEgPSBkM19nZW9fY2VudHJvaWRZMSA9IGQzX2dlb19jZW50cm9pZFoxID0gZDNfZ2VvX2NlbnRyb2lkWDIgPSBkM19nZW9fY2VudHJvaWRZMiA9IGQzX2dlb19jZW50cm9pZFoyID0gMDsKICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBkM19nZW9fY2VudHJvaWQpOwogICAgdmFyIHggPSBkM19nZW9fY2VudHJvaWRYMiwgeSA9IGQzX2dlb19jZW50cm9pZFkyLCB6ID0gZDNfZ2VvX2NlbnRyb2lkWjIsIG0gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7CiAgICBpZiAobSA8IM61MikgewogICAgICB4ID0gZDNfZ2VvX2NlbnRyb2lkWDEsIHkgPSBkM19nZW9fY2VudHJvaWRZMSwgeiA9IGQzX2dlb19jZW50cm9pZFoxOwogICAgICBpZiAoZDNfZ2VvX2NlbnRyb2lkVzEgPCDOtSkgeCA9IGQzX2dlb19jZW50cm9pZFgwLCB5ID0gZDNfZ2VvX2NlbnRyb2lkWTAsIHogPSBkM19nZW9fY2VudHJvaWRaMDsKICAgICAgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejsKICAgICAgaWYgKG0gPCDOtTIpIHJldHVybiBbIE5hTiwgTmFOIF07CiAgICB9CiAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHksIHgpICogZDNfZGVncmVlcywgZDNfYXNpbih6IC8gTWF0aC5zcXJ0KG0pKSAqIGQzX2RlZ3JlZXMgXTsKICB9OwogIHZhciBkM19nZW9fY2VudHJvaWRXMCwgZDNfZ2VvX2NlbnRyb2lkVzEsIGQzX2dlb19jZW50cm9pZFgwLCBkM19nZW9fY2VudHJvaWRZMCwgZDNfZ2VvX2NlbnRyb2lkWjAsIGQzX2dlb19jZW50cm9pZFgxLCBkM19nZW9fY2VudHJvaWRZMSwgZDNfZ2VvX2NlbnRyb2lkWjEsIGQzX2dlb19jZW50cm9pZFgyLCBkM19nZW9fY2VudHJvaWRZMiwgZDNfZ2VvX2NlbnRyb2lkWjI7CiAgdmFyIGQzX2dlb19jZW50cm9pZCA9IHsKICAgIHNwaGVyZTogZDNfbm9vcCwKICAgIHBvaW50OiBkM19nZW9fY2VudHJvaWRQb2ludCwKICAgIGxpbmVTdGFydDogZDNfZ2VvX2NlbnRyb2lkTGluZVN0YXJ0LAogICAgbGluZUVuZDogZDNfZ2VvX2NlbnRyb2lkTGluZUVuZCwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX2dlb19jZW50cm9pZC5saW5lU3RhcnQgPSBkM19nZW9fY2VudHJvaWRSaW5nU3RhcnQ7CiAgICB9LAogICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX2dlb19jZW50cm9pZC5saW5lU3RhcnQgPSBkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQ7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRQb2ludCjOuywgz4YpIHsKICAgIM67ICo9IGQzX3JhZGlhbnM7CiAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKTsKICAgIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKGNvc8+GICogTWF0aC5jb3MozrspLCBjb3PPhiAqIE1hdGguc2luKM67KSwgTWF0aC5zaW4oz4YpKTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NlbnRyb2lkUG9pbnRYWVooeCwgeSwgeikgewogICAgKytkM19nZW9fY2VudHJvaWRXMDsKICAgIGQzX2dlb19jZW50cm9pZFgwICs9ICh4IC0gZDNfZ2VvX2NlbnRyb2lkWDApIC8gZDNfZ2VvX2NlbnRyb2lkVzA7CiAgICBkM19nZW9fY2VudHJvaWRZMCArPSAoeSAtIGQzX2dlb19jZW50cm9pZFkwKSAvIGQzX2dlb19jZW50cm9pZFcwOwogICAgZDNfZ2VvX2NlbnRyb2lkWjAgKz0gKHogLSBkM19nZW9fY2VudHJvaWRaMCkgLyBkM19nZW9fY2VudHJvaWRXMDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NlbnRyb2lkTGluZVN0YXJ0KCkgewogICAgdmFyIHgwLCB5MCwgejA7CiAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHsKICAgICAgzrsgKj0gZDNfcmFkaWFuczsKICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyk7CiAgICAgIHgwID0gY29zz4YgKiBNYXRoLmNvcyjOuyk7CiAgICAgIHkwID0gY29zz4YgKiBNYXRoLnNpbijOuyk7CiAgICAgIHowID0gTWF0aC5zaW4oz4YpOwogICAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBuZXh0UG9pbnQ7CiAgICAgIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKHgwLCB5MCwgejApOwogICAgfTsKICAgIGZ1bmN0aW9uIG5leHRQb2ludCjOuywgz4YpIHsKICAgICAgzrsgKj0gZDNfcmFkaWFuczsKICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyksIHggPSBjb3PPhiAqIE1hdGguY29zKM67KSwgeSA9IGNvc8+GICogTWF0aC5zaW4ozrspLCB6ID0gTWF0aC5zaW4oz4YpLCB3ID0gTWF0aC5hdGFuMihNYXRoLnNxcnQoKHcgPSB5MCAqIHogLSB6MCAqIHkpICogdyArICh3ID0gejAgKiB4IC0geDAgKiB6KSAqIHcgKyAodyA9IHgwICogeSAtIHkwICogeCkgKiB3KSwgeDAgKiB4ICsgeTAgKiB5ICsgejAgKiB6KTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkVzEgKz0gdzsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWDEgKz0gdyAqICh4MCArICh4MCA9IHgpKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0gdyAqICh5MCArICh5MCA9IHkpKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWjEgKz0gdyAqICh6MCArICh6MCA9IHopKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkUG9pbnRYWVooeDAsIHkwLCB6MCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jZW50cm9pZExpbmVFbmQoKSB7CiAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBkM19nZW9fY2VudHJvaWRQb2ludDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NlbnRyb2lkUmluZ1N0YXJ0KCkgewogICAgdmFyIM67MDAsIM+GMDAsIHgwLCB5MCwgejA7CiAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHsKICAgICAgzrswMCA9IM67LCDPhjAwID0gz4Y7CiAgICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDsKICAgICAgzrsgKj0gZDNfcmFkaWFuczsKICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyk7CiAgICAgIHgwID0gY29zz4YgKiBNYXRoLmNvcyjOuyk7CiAgICAgIHkwID0gY29zz4YgKiBNYXRoLnNpbijOuyk7CiAgICAgIHowID0gTWF0aC5zaW4oz4YpOwogICAgICBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4MCwgeTAsIHowKTsKICAgIH07CiAgICBkM19nZW9fY2VudHJvaWQubGluZUVuZCA9IGZ1bmN0aW9uKCkgewogICAgICBuZXh0UG9pbnQozrswMCwgz4YwMCk7CiAgICAgIGQzX2dlb19jZW50cm9pZC5saW5lRW5kID0gZDNfZ2VvX2NlbnRyb2lkTGluZUVuZDsKICAgICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gZDNfZ2VvX2NlbnRyb2lkUG9pbnQ7CiAgICB9OwogICAgZnVuY3Rpb24gbmV4dFBvaW50KM67LCDPhikgewogICAgICDOuyAqPSBkM19yYWRpYW5zOwogICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKSwgeCA9IGNvc8+GICogTWF0aC5jb3MozrspLCB5ID0gY29zz4YgKiBNYXRoLnNpbijOuyksIHogPSBNYXRoLnNpbijPhiksIGN4ID0geTAgKiB6IC0gejAgKiB5LCBjeSA9IHowICogeCAtIHgwICogeiwgY3ogPSB4MCAqIHkgLSB5MCAqIHgsIG0gPSBNYXRoLnNxcnQoY3ggKiBjeCArIGN5ICogY3kgKyBjeiAqIGN6KSwgdSA9IHgwICogeCArIHkwICogeSArIHowICogeiwgdiA9IG0gJiYgLWQzX2Fjb3ModSkgLyBtLCB3ID0gTWF0aC5hdGFuMihtLCB1KTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWDIgKz0gdiAqIGN4OwogICAgICBkM19nZW9fY2VudHJvaWRZMiArPSB2ICogY3k7CiAgICAgIGQzX2dlb19jZW50cm9pZFoyICs9IHYgKiBjejsKICAgICAgZDNfZ2VvX2NlbnRyb2lkVzEgKz0gdzsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWDEgKz0gdyAqICh4MCArICh4MCA9IHgpKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0gdyAqICh5MCArICh5MCA9IHkpKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWjEgKz0gdyAqICh6MCArICh6MCA9IHopKTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkUG9pbnRYWVooeDAsIHkwLCB6MCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX3RydWUoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBQb2x5Z29uKHNlZ21lbnRzLCBjb21wYXJlLCBjbGlwU3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBsaXN0ZW5lcikgewogICAgdmFyIHN1YmplY3QgPSBbXSwgY2xpcCA9IFtdOwogICAgc2VnbWVudHMuZm9yRWFjaChmdW5jdGlvbihzZWdtZW50KSB7CiAgICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuOwogICAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl07CiAgICAgIGlmIChkM19nZW9fc3BoZXJpY2FsRXF1YWwocDAsIHAxKSkgewogICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBsaXN0ZW5lci5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pOwogICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGEgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAwLCBzZWdtZW50LCBudWxsLCB0cnVlKSwgYiA9IG5ldyBkM19nZW9fY2xpcFBvbHlnb25JbnRlcnNlY3Rpb24ocDAsIG51bGwsIGEsIGZhbHNlKTsKICAgICAgYS5vID0gYjsKICAgICAgc3ViamVjdC5wdXNoKGEpOwogICAgICBjbGlwLnB1c2goYik7CiAgICAgIGEgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAxLCBzZWdtZW50LCBudWxsLCBmYWxzZSk7CiAgICAgIGIgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAxLCBudWxsLCBhLCB0cnVlKTsKICAgICAgYS5vID0gYjsKICAgICAgc3ViamVjdC5wdXNoKGEpOwogICAgICBjbGlwLnB1c2goYik7CiAgICB9KTsKICAgIGNsaXAuc29ydChjb21wYXJlKTsKICAgIGQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhcihzdWJqZWN0KTsKICAgIGQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhcihjbGlwKTsKICAgIGlmICghc3ViamVjdC5sZW5ndGgpIHJldHVybjsKICAgIGZvciAodmFyIGkgPSAwLCBlbnRyeSA9IGNsaXBTdGFydEluc2lkZSwgbiA9IGNsaXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgIGNsaXBbaV0uZSA9IGVudHJ5ID0gIWVudHJ5OwogICAgfQogICAgdmFyIHN0YXJ0ID0gc3ViamVjdFswXSwgcG9pbnRzLCBwb2ludDsKICAgIHdoaWxlICgxKSB7CiAgICAgIHZhciBjdXJyZW50ID0gc3RhcnQsIGlzU3ViamVjdCA9IHRydWU7CiAgICAgIHdoaWxlIChjdXJyZW50LnYpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubikgPT09IHN0YXJ0KSByZXR1cm47CiAgICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgIGRvIHsKICAgICAgICBjdXJyZW50LnYgPSBjdXJyZW50Lm8udiA9IHRydWU7CiAgICAgICAgaWYgKGN1cnJlbnQuZSkgewogICAgICAgICAgaWYgKGlzU3ViamVjdCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBuOyArK2kpIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5uLngsIDEsIGxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChpc1N1YmplY3QpIHsKICAgICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBwb2ludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBsaXN0ZW5lcik7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wOwogICAgICAgIH0KICAgICAgICBjdXJyZW50ID0gY3VycmVudC5vOwogICAgICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgICAgICBpc1N1YmplY3QgPSAhaXNTdWJqZWN0OwogICAgICB9IHdoaWxlICghY3VycmVudC52KTsKICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgfQogIH0KICBmdW5jdGlvbiBkM19nZW9fY2xpcFBvbHlnb25MaW5rQ2lyY3VsYXIoYXJyYXkpIHsKICAgIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47CiAgICB2YXIgbiwgaSA9IDAsIGEgPSBhcnJheVswXSwgYjsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGEubiA9IGIgPSBhcnJheVtpXTsKICAgICAgYi5wID0gYTsKICAgICAgYSA9IGI7CiAgICB9CiAgICBhLm4gPSBiID0gYXJyYXlbMF07CiAgICBiLnAgPSBhOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2xpcFBvbHlnb25JbnRlcnNlY3Rpb24ocG9pbnQsIHBvaW50cywgb3RoZXIsIGVudHJ5KSB7CiAgICB0aGlzLnggPSBwb2ludDsKICAgIHRoaXMueiA9IHBvaW50czsKICAgIHRoaXMubyA9IG90aGVyOwogICAgdGhpcy5lID0gZW50cnk7CiAgICB0aGlzLnYgPSBmYWxzZTsKICAgIHRoaXMubiA9IHRoaXMucCA9IG51bGw7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwKHBvaW50VmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBjbGlwU3RhcnQpIHsKICAgIHJldHVybiBmdW5jdGlvbihyb3RhdGUsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBsaW5lID0gY2xpcExpbmUobGlzdGVuZXIpLCByb3RhdGVkQ2xpcFN0YXJ0ID0gcm90YXRlLmludmVydChjbGlwU3RhcnRbMF0sIGNsaXBTdGFydFsxXSk7CiAgICAgIHZhciBjbGlwID0gewogICAgICAgIHBvaW50OiBwb2ludCwKICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnRSaW5nOwogICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7CiAgICAgICAgICBjbGlwLmxpbmVFbmQgPSByaW5nRW5kOwogICAgICAgICAgc2VnbWVudHMgPSBbXTsKICAgICAgICAgIHBvbHlnb24gPSBbXTsKICAgICAgICB9LAogICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50OwogICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7CiAgICAgICAgICBjbGlwLmxpbmVFbmQgPSBsaW5lRW5kOwogICAgICAgICAgc2VnbWVudHMgPSBkMy5tZXJnZShzZWdtZW50cyk7CiAgICAgICAgICB2YXIgY2xpcFN0YXJ0SW5zaWRlID0gZDNfZ2VvX3BvaW50SW5Qb2x5Z29uKHJvdGF0ZWRDbGlwU3RhcnQsIHBvbHlnb24pOwogICAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICBkM19nZW9fY2xpcFBvbHlnb24oc2VnbWVudHMsIGQzX2dlb19jbGlwU29ydCwgY2xpcFN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgbGlzdGVuZXIpOwogICAgICAgICAgfSBlbHNlIGlmIChjbGlwU3RhcnRJbnNpZGUpIHsKICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgbGlzdGVuZXIucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIGxpc3RlbmVyKTsKICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBvbHlnb25TdGFydGVkKSBsaXN0ZW5lci5wb2x5Z29uRW5kKCksIHBvbHlnb25TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICBzZWdtZW50cyA9IHBvbHlnb24gPSBudWxsOwogICAgICAgIH0sCiAgICAgICAgc3BoZXJlOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpOwogICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBsaXN0ZW5lcik7CiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICBsaXN0ZW5lci5wb2x5Z29uRW5kKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBmdW5jdGlvbiBwb2ludCjOuywgz4YpIHsKICAgICAgICB2YXIgcG9pbnQgPSByb3RhdGUozrssIM+GKTsKICAgICAgICBpZiAocG9pbnRWaXNpYmxlKM67ID0gcG9pbnRbMF0sIM+GID0gcG9pbnRbMV0pKSBsaXN0ZW5lci5wb2ludCjOuywgz4YpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBvaW50TGluZSjOuywgz4YpIHsKICAgICAgICB2YXIgcG9pbnQgPSByb3RhdGUozrssIM+GKTsKICAgICAgICBsaW5lLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgIGNsaXAucG9pbnQgPSBwb2ludExpbmU7CiAgICAgICAgbGluZS5saW5lU3RhcnQoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBsaW5lRW5kKCkgewogICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDsKICAgICAgICBsaW5lLmxpbmVFbmQoKTsKICAgICAgfQogICAgICB2YXIgc2VnbWVudHM7CiAgICAgIHZhciBidWZmZXIgPSBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCksIHJpbmdMaXN0ZW5lciA9IGNsaXBMaW5lKGJ1ZmZlciksIHBvbHlnb25TdGFydGVkID0gZmFsc2UsIHBvbHlnb24sIHJpbmc7CiAgICAgIGZ1bmN0aW9uIHBvaW50UmluZyjOuywgz4YpIHsKICAgICAgICByaW5nLnB1c2goWyDOuywgz4YgXSk7CiAgICAgICAgdmFyIHBvaW50ID0gcm90YXRlKM67LCDPhik7CiAgICAgICAgcmluZ0xpc3RlbmVyLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkgewogICAgICAgIHJpbmdMaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICByaW5nID0gW107CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmluZ0VuZCgpIHsKICAgICAgICBwb2ludFJpbmcocmluZ1swXVswXSwgcmluZ1swXVsxXSk7CiAgICAgICAgcmluZ0xpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICB2YXIgY2xlYW4gPSByaW5nTGlzdGVuZXIuY2xlYW4oKSwgcmluZ1NlZ21lbnRzID0gYnVmZmVyLmJ1ZmZlcigpLCBzZWdtZW50LCBuID0gcmluZ1NlZ21lbnRzLmxlbmd0aDsKICAgICAgICByaW5nLnBvcCgpOwogICAgICAgIHBvbHlnb24ucHVzaChyaW5nKTsKICAgICAgICByaW5nID0gbnVsbDsKICAgICAgICBpZiAoIW4pIHJldHVybjsKICAgICAgICBpZiAoY2xlYW4gJiAxKSB7CiAgICAgICAgICBzZWdtZW50ID0gcmluZ1NlZ21lbnRzWzBdOwogICAgICAgICAgdmFyIG4gPSBzZWdtZW50Lmxlbmd0aCAtIDEsIGkgPSAtMSwgcG9pbnQ7CiAgICAgICAgICBpZiAobiA+IDApIHsKICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgbGlzdGVuZXIucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0ZW5lci5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pOwogICAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChuID4gMSAmJiBjbGVhbiAmIDIpIHJpbmdTZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5wb3AoKS5jb25jYXQocmluZ1NlZ21lbnRzLnNoaWZ0KCkpKTsKICAgICAgICBzZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5maWx0ZXIoZDNfZ2VvX2NsaXBTZWdtZW50TGVuZ3RoMSkpOwogICAgICB9CiAgICAgIHJldHVybiBjbGlwOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBTZWdtZW50TGVuZ3RoMShzZWdtZW50KSB7CiAgICByZXR1cm4gc2VnbWVudC5sZW5ndGggPiAxOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCkgewogICAgdmFyIGxpbmVzID0gW10sIGxpbmU7CiAgICByZXR1cm4gewogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGxpbmVzLnB1c2gobGluZSA9IFtdKTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKM67LCDPhikgewogICAgICAgIGxpbmUucHVzaChbIM67LCDPhiBdKTsKICAgICAgfSwKICAgICAgbGluZUVuZDogZDNfbm9vcCwKICAgICAgYnVmZmVyOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYnVmZmVyID0gbGluZXM7CiAgICAgICAgbGluZXMgPSBbXTsKICAgICAgICBsaW5lID0gbnVsbDsKICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgICB9LAogICAgICByZWpvaW46IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSBsaW5lcy5wdXNoKGxpbmVzLnBvcCgpLmNvbmNhdChsaW5lcy5zaGlmdCgpKSk7CiAgICAgIH0KICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwU29ydChhLCBiKSB7CiAgICByZXR1cm4gKChhID0gYS54KVswXSA8IDAgPyBhWzFdIC0gaGFsZs+AIC0gzrUgOiBoYWxmz4AgLSBhWzFdKSAtICgoYiA9IGIueClbMF0gPCAwID8gYlsxXSAtIGhhbGbPgCAtIM61IDogaGFsZs+AIC0gYlsxXSk7CiAgfQogIHZhciBkM19nZW9fY2xpcEFudGltZXJpZGlhbiA9IGQzX2dlb19jbGlwKGQzX3RydWUsIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuTGluZSwgZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnBvbGF0ZSwgWyAtz4AsIC3PgCAvIDIgXSk7CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5MaW5lKGxpc3RlbmVyKSB7CiAgICB2YXIgzrswID0gTmFOLCDPhjAgPSBOYU4sIHPOuzAgPSBOYU4sIGNsZWFuOwogICAgcmV0dXJuIHsKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICBjbGVhbiA9IDE7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbijOuzEsIM+GMSkgewogICAgICAgIHZhciBzzrsxID0gzrsxID4gMCA/IM+AIDogLc+ALCBkzrsgPSBhYnMozrsxIC0gzrswKTsKICAgICAgICBpZiAoYWJzKGTOuyAtIM+AKSA8IM61KSB7CiAgICAgICAgICBsaXN0ZW5lci5wb2ludCjOuzAsIM+GMCA9ICjPhjAgKyDPhjEpIC8gMiA+IDAgPyBoYWxmz4AgOiAtaGFsZs+AKTsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzAsIM+GMCk7CiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzEsIM+GMCk7CiAgICAgICAgICBsaXN0ZW5lci5wb2ludCjOuzEsIM+GMCk7CiAgICAgICAgICBjbGVhbiA9IDA7CiAgICAgICAgfSBlbHNlIGlmIChzzrswICE9PSBzzrsxICYmIGTOuyA+PSDPgCkgewogICAgICAgICAgaWYgKGFicyjOuzAgLSBzzrswKSA8IM61KSDOuzAgLT0gc867MCAqIM61OwogICAgICAgICAgaWYgKGFicyjOuzEgLSBzzrsxKSA8IM61KSDOuzEgLT0gc867MSAqIM61OwogICAgICAgICAgz4YwID0gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnNlY3QozrswLCDPhjAsIM67MSwgz4YxKTsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzAsIM+GMCk7CiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzEsIM+GMCk7CiAgICAgICAgICBjbGVhbiA9IDA7CiAgICAgICAgfQogICAgICAgIGxpc3RlbmVyLnBvaW50KM67MCA9IM67MSwgz4YwID0gz4YxKTsKICAgICAgICBzzrswID0gc867MTsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgICAgIM67MCA9IM+GMCA9IE5hTjsKICAgICAgfSwKICAgICAgY2xlYW46IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAyIC0gY2xlYW47CiAgICAgIH0KICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KM67MCwgz4YwLCDOuzEsIM+GMSkgewogICAgdmFyIGNvc8+GMCwgY29zz4YxLCBzaW7OuzBfzrsxID0gTWF0aC5zaW4ozrswIC0gzrsxKTsKICAgIHJldHVybiBhYnMoc2luzrswX867MSkgPiDOtSA/IE1hdGguYXRhbigoTWF0aC5zaW4oz4YwKSAqIChjb3PPhjEgPSBNYXRoLmNvcyjPhjEpKSAqIE1hdGguc2luKM67MSkgLSBNYXRoLnNpbijPhjEpICogKGNvc8+GMCA9IE1hdGguY29zKM+GMCkpICogTWF0aC5zaW4ozrswKSkgLyAoY29zz4YwICogY29zz4YxICogc2luzrswX867MSkpIDogKM+GMCArIM+GMSkgLyAyOwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIGxpc3RlbmVyKSB7CiAgICB2YXIgz4Y7CiAgICBpZiAoZnJvbSA9PSBudWxsKSB7CiAgICAgIM+GID0gZGlyZWN0aW9uICogaGFsZs+AOwogICAgICBsaXN0ZW5lci5wb2ludCgtz4AsIM+GKTsKICAgICAgbGlzdGVuZXIucG9pbnQoMCwgz4YpOwogICAgICBsaXN0ZW5lci5wb2ludCjPgCwgz4YpOwogICAgICBsaXN0ZW5lci5wb2ludCjPgCwgMCk7CiAgICAgIGxpc3RlbmVyLnBvaW50KM+ALCAtz4YpOwogICAgICBsaXN0ZW5lci5wb2ludCgwLCAtz4YpOwogICAgICBsaXN0ZW5lci5wb2ludCgtz4AsIC3Phik7CiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgMCk7CiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgz4YpOwogICAgfSBlbHNlIGlmIChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IM61KSB7CiAgICAgIHZhciBzID0gZnJvbVswXSA8IHRvWzBdID8gz4AgOiAtz4A7CiAgICAgIM+GID0gZGlyZWN0aW9uICogcyAvIDI7CiAgICAgIGxpc3RlbmVyLnBvaW50KC1zLCDPhik7CiAgICAgIGxpc3RlbmVyLnBvaW50KDAsIM+GKTsKICAgICAgbGlzdGVuZXIucG9pbnQocywgz4YpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIucG9pbnQodG9bMF0sIHRvWzFdKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3BvaW50SW5Qb2x5Z29uKHBvaW50LCBwb2x5Z29uKSB7CiAgICB2YXIgbWVyaWRpYW4gPSBwb2ludFswXSwgcGFyYWxsZWwgPSBwb2ludFsxXSwgbWVyaWRpYW5Ob3JtYWwgPSBbIE1hdGguc2luKG1lcmlkaWFuKSwgLU1hdGguY29zKG1lcmlkaWFuKSwgMCBdLCBwb2xhckFuZ2xlID0gMCwgd2luZGluZyA9IDA7CiAgICBkM19nZW9fYXJlYVJpbmdTdW0ucmVzZXQoKTsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW2ldLCBtID0gcmluZy5sZW5ndGg7CiAgICAgIGlmICghbSkgY29udGludWU7CiAgICAgIHZhciBwb2ludDAgPSByaW5nWzBdLCDOuzAgPSBwb2ludDBbMF0sIM+GMCA9IHBvaW50MFsxXSAvIDIgKyDPgCAvIDQsIHNpbs+GMCA9IE1hdGguc2luKM+GMCksIGNvc8+GMCA9IE1hdGguY29zKM+GMCksIGogPSAxOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChqID09PSBtKSBqID0gMDsKICAgICAgICBwb2ludCA9IHJpbmdbal07CiAgICAgICAgdmFyIM67ID0gcG9pbnRbMF0sIM+GID0gcG9pbnRbMV0gLyAyICsgz4AgLyA0LCBzaW7PhiA9IE1hdGguc2luKM+GKSwgY29zz4YgPSBNYXRoLmNvcyjPhiksIGTOuyA9IM67IC0gzrswLCBzZM67ID0gZM67ID49IDAgPyAxIDogLTEsIGFkzrsgPSBzZM67ICogZM67LCBhbnRpbWVyaWRpYW4gPSBhZM67ID4gz4AsIGsgPSBzaW7PhjAgKiBzaW7PhjsKICAgICAgICBkM19nZW9fYXJlYVJpbmdTdW0uYWRkKE1hdGguYXRhbjIoayAqIHNkzrsgKiBNYXRoLnNpbihhZM67KSwgY29zz4YwICogY29zz4YgKyBrICogTWF0aC5jb3MoYWTOuykpKTsKICAgICAgICBwb2xhckFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGTOuyArjNzvVmOUAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3fQABABnz+wKgHNsCoB2CVJx/125J4NzlSfwyAEAUuGvkAAAEBCAoAo16/AE2luozc71aBlAEAWisAAForAABo9ygf0sUIACetHhMIAEUAK0w3B0AAQAZIvsCoB2DAqAc2H/WVJzlSfwzbkng3gBgA7bslAAABAQgKAE2lugCjXr4gc2TOuyAqIM+EIDogZM67OwogICAgICAgIGlmIChhbnRpbWVyaWRpYW4gXiDOuzAgPj0gbWVyaWRpYW4gXiDOuyA+PSBtZXJpZGlhbikgewogICAgICAgICAgdmFyIGFyYyA9IGQzX2dlb19jYXJ0ZXNpYW5Dcm9zcyhkM19nZW9fY2FydGVzaWFuKHBvaW50MCksIGQzX2dlb19jYXJ0ZXNpYW4ocG9pbnQpKTsKICAgICAgICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoYXJjKTsKICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MobWVyaWRpYW5Ob3JtYWwsIGFyYyk7CiAgICAgICAgICBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGludGVyc2VjdGlvbik7CiAgICAgICAgICB2YXIgz4ZhcmMgPSAoYW50aW1lcmlkaWFuIF4gZM67ID49IDAgPyAtMSA6IDEpICogZDNfYXNpbihpbnRlcnNlY3Rpb25bMl0pOwogICAgICAgICAgaWYgKHBhcmFsbGVsID4gz4ZhcmMgfHwgcGFyYWxsZWwgPT09IM+GYXJjICYmIChhcmNbMF0gfHwgYXJjWzFdKSkgewogICAgICAgICAgICB3aW5kaW5nICs9IGFudGltZXJpZGlhbiBeIGTOuyA+PSAwID8gMSA6IC0xOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWorKykgYnJlYWs7CiAgICAgICAgzrswID0gzrssIHNpbs+GMCA9IHNpbs+GLCBjb3PPhjAgPSBjb3PPhiwgcG9pbnQwID0gcG9pbnQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAocG9sYXJBbmdsZSA8IC3OtSB8fCBwb2xhckFuZ2xlIDwgzrUgJiYgZDNfZ2VvX2FyZWFSaW5nU3VtIDwgMCkgXiB3aW5kaW5nICYgMTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBDaXJjbGUocmFkaXVzKSB7CiAgICB2YXIgY3IgPSBNYXRoLmNvcyhyYWRpdXMpLCBzbWFsbFJhZGl1cyA9IGNyID4gMCwgbm90SGVtaXNwaGVyZSA9IGFicyhjcikgPiDOtSwgaW50ZXJwb2xhdGUgPSBkM19nZW9fY2lyY2xlSW50ZXJwb2xhdGUocmFkaXVzLCA2ICogZDNfcmFkaWFucyk7CiAgICByZXR1cm4gZDNfZ2VvX2NsaXAodmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBzbWFsbFJhZGl1cyA/IFsgMCwgLXJhZGl1cyBdIDogWyAtz4AsIHJhZGl1cyAtIM+AIF0pOwogICAgZnVuY3Rpb24gdmlzaWJsZSjOuywgz4YpIHsKICAgICAgcmV0dXJuIE1hdGguY29zKM67KSAqIE1hdGguY29zKM+GKSA+IGNyOwogICAgfQogICAgZnVuY3Rpb24gY2xpcExpbmUobGlzdGVuZXIpIHsKICAgICAgdmFyIHBvaW50MCwgYzAsIHYwLCB2MDAsIGNsZWFuOwogICAgICByZXR1cm4gewogICAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB2MDAgPSB2MCA9IGZhbHNlOwogICAgICAgICAgY2xlYW4gPSAxOwogICAgICAgIH0sCiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKM67LCDPhikgewogICAgICAgICAgdmFyIHBvaW50MSA9IFsgzrssIM+GIF0sIHBvaW50MiwgdiA9IHZpc2libGUozrssIM+GKSwgYyA9IHNtYWxsUmFkaXVzID8gdiA/IDAgOiBjb2RlKM67LCDPhikgOiB2ID8gY29kZSjOuyArICjOuyA8IDAgPyDPgCA6IC3PgCksIM+GKSA6IDA7CiAgICAgICAgICBpZiAoIXBvaW50MCAmJiAodjAwID0gdjAgPSB2KSkgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICBpZiAodiAhPT0gdjApIHsKICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTsKICAgICAgICAgICAgaWYgKGQzX2dlb19zcGhlcmljYWxFcXVhbChwb2ludDAsIHBvaW50MikgfHwgZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MSwgcG9pbnQyKSkgewogICAgICAgICAgICAgIHBvaW50MVswXSArPSDOtTsKICAgICAgICAgICAgICBwb2ludDFbMV0gKz0gzrU7CiAgICAgICAgICAgICAgdiA9IHZpc2libGUocG9pbnQxWzBdLCBwb2ludDFbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodiAhPT0gdjApIHsKICAgICAgICAgICAgY2xlYW4gPSAwOwogICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCk7CiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7CiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pOwogICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb2ludDAgPSBwb2ludDI7CiAgICAgICAgICB9IGVsc2UgaWYgKG5vdEhlbWlzcGhlcmUgJiYgcG9pbnQwICYmIHNtYWxsUmFkaXVzIF4gdikgewogICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkpKSB7CiAgICAgICAgICAgICAgY2xlYW4gPSAwOwogICAgICAgICAgICAgIGlmIChzbWFsbFJhZGl1cykgewogICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzBdWzBdLCB0WzBdWzFdKTsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pOwogICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQodFswXVswXSwgdFswXVsxXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodiAmJiAoIXBvaW50MCB8fCAhZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHsKICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQxWzBdLCBwb2ludDFbMV0pOwogICAgICAgICAgfQogICAgICAgICAgcG9pbnQwID0gcG9pbnQxLCB2MCA9IHYsIGMwID0gYzsKICAgICAgICB9LAogICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKHYwKSBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgICAgICBwb2ludDAgPSBudWxsOwogICAgICAgIH0sCiAgICAgICAgY2xlYW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGNsZWFuIHwgKHYwMCAmJiB2MCkgPDwgMTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBpbnRlcnNlY3QoYSwgYiwgdHdvKSB7CiAgICAgIHZhciBwYSA9IGQzX2dlb19jYXJ0ZXNpYW4oYSksIHBiID0gZDNfZ2VvX2NhcnRlc2lhbihiKTsKICAgICAgdmFyIG4xID0gWyAxLCAwLCAwIF0sIG4yID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKHBhLCBwYiksIG4ybjIgPSBkM19nZW9fY2FydGVzaWFuRG90KG4yLCBuMiksIG4xbjIgPSBuMlswXSwgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7CiAgICAgIGlmICghZGV0ZXJtaW5hbnQpIHJldHVybiAhdHdvICYmIGE7CiAgICAgIHZhciBjMSA9IGNyICogbjJuMiAvIGRldGVybWluYW50LCBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwgbjF4bjIgPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MobjEsIG4yKSwgQSA9IGQzX2dlb19jYXJ0ZXNpYW5TY2FsZShuMSwgYzEpLCBCID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKG4yLCBjMik7CiAgICAgIGQzX2dlb19jYXJ0ZXNpYW5BZGQoQSwgQik7CiAgICAgIHZhciB1ID0gbjF4bjIsIHcgPSBkM19nZW9fY2FydGVzaWFuRG90KEEsIHUpLCB1dSA9IGQzX2dlb19jYXJ0ZXNpYW5Eb3QodSwgdSksIHQyID0gdyAqIHcgLSB1dSAqIChkM19nZW9fY2FydGVzaWFuRG90KEEsIEEpIC0gMSk7CiAgICAgIGlmICh0MiA8IDApIHJldHVybjsKICAgICAgdmFyIHQgPSBNYXRoLnNxcnQodDIpLCBxID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHUsICgtdyAtIHQpIC8gdXUpOwogICAgICBkM19nZW9fY2FydGVzaWFuQWRkKHEsIEEpOwogICAgICBxID0gZDNfZ2VvX3NwaGVyaWNhbChxKTsKICAgICAgaWYgKCF0d28pIHJldHVybiBxOwogICAgICB2YXIgzrswID0gYVswXSwgzrsxID0gYlswXSwgz4YwID0gYVsxXSwgz4YxID0gYlsxXSwgejsKICAgICAgaWYgKM67MSA8IM67MCkgeiA9IM67MCwgzrswID0gzrsxLCDOuzEgPSB6OwogICAgICB2YXIgzrTOuyA9IM67MSAtIM67MCwgcG9sYXIgPSBhYnMozrTOuyAtIM+AKSA8IM61LCBtZXJpZGlhbiA9IHBvbGFyIHx8IM60zrsgPCDOtTsKICAgICAgaWYgKCFwb2xhciAmJiDPhjEgPCDPhjApIHogPSDPhjAsIM+GMCA9IM+GMSwgz4YxID0gejsKICAgICAgaWYgKG1lcmlkaWFuID8gcG9sYXIgPyDPhjAgKyDPhjEgPiAwIF4gcVsxXSA8IChhYnMocVswXSAtIM67MCkgPCDOtSA/IM+GMCA6IM+GMSkgOiDPhjAgPD0gcVsxXSAmJiBxWzFdIDw9IM+GMSA6IM60zrsgPiDPgCBeICjOuzAgPD0gcVswXSAmJiBxWzBdIDw9IM67MSkpIHsKICAgICAgICB2YXIgcTEgPSBkM19nZW9fY2FydGVzaWFuU2NhbGUodSwgKC13ICsgdCkgLyB1dSk7CiAgICAgICAgZDNfZ2VvX2NhcnRlc2lhbkFkZChxMSwgQSk7CiAgICAgICAgcmV0dXJuIFsgcSwgZDNfZ2VvX3NwaGVyaWNhbChxMSkgXTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY29kZSjOuywgz4YpIHsKICAgICAgdmFyIHIgPSBzbWFsbFJhZGl1cyA/IHJhZGl1cyA6IM+AIC0gcmFkaXVzLCBjb2RlID0gMDsKICAgICAgaWYgKM67IDwgLXIpIGNvZGUgfD0gMTsgZWxzZSBpZiAozrsgPiByKSBjb2RlIHw9IDI7CiAgICAgIGlmICjPhiA8IC1yKSBjb2RlIHw9IDQ7IGVsc2UgaWYgKM+GID4gcikgY29kZSB8PSA4OwogICAgICByZXR1cm4gY29kZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV9jbGlwTGluZSh4MCwgeTAsIHgxLCB5MSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIGEgPSBsaW5lLmEsIGIgPSBsaW5lLmIsIGF4ID0gYS54LCBheSA9IGEueSwgYnggPSBiLngsIGJ5ID0gYi55LCB0MCA9IDAsIHQxID0gMSwgZHggPSBieCAtIGF4LCBkeSA9IGJ5IC0gYXksIHI7CiAgICAgIHIgPSB4MCAtIGF4OwogICAgICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47CiAgICAgIHIgLz0gZHg7CiAgICAgIGlmIChkeCA8IDApIHsKICAgICAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByOwogICAgICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0KICAgICAgciA9IHgxIC0gYXg7CiAgICAgIGlmICghZHggJiYgciA8IDApIHJldHVybjsKICAgICAgciAvPSBkeDsKICAgICAgaWYgKGR4IDwgMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0gZWxzZSBpZiAoZHggPiAwKSB7CiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICAgICAgfQogICAgICByID0geTAgLSBheTsKICAgICAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuOwogICAgICByIC89IGR5OwogICAgICBpZiAoZHkgPCAwKSB7CiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICAgICAgfSBlbHNlIGlmIChkeSA+IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9CiAgICAgIHIgPSB5MSAtIGF5OwogICAgICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47CiAgICAgIHIgLz0gZHk7CiAgICAgIGlmIChkeSA8IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgICAgIH0KICAgICAgaWYgKHQwID4gMCkgbGluZS5hID0gewogICAgICAgIHg6IGF4ICsgdDAgKiBkeCwKICAgICAgICB5OiBheSArIHQwICogZHkKICAgICAgfTsKICAgICAgaWYgKHQxIDwgMSkgbGluZS5iID0gewogICAgICAgIHg6IGF4ICsgdDEgKiBkeCwKICAgICAgICB5OiBheSArIHQxICogZHkKICAgICAgfTsKICAgICAgcmV0dXJuIGxpbmU7CiAgICB9OwogIH0KICB2YXIgZDNfZ2VvX2NsaXBFeHRlbnRNQVggPSAxZTk7CiAgZDMuZ2VvLmNsaXBFeHRlbnQgPSBmdW5jdGlvbigpIHsKICAgIHZhciB4MCwgeTAsIHgxLCB5MSwgc3RyZWFtLCBjbGlwLCBjbGlwRXh0ZW50ID0gewogICAgICBzdHJlYW06IGZ1bmN0aW9uKG91dHB1dCkgewogICAgICAgIGlmIChzdHJlYW0pIHN0cmVhbS52YWxpZCA9IGZhbHNlOwogICAgICAgIHN0cmVhbSA9IGNsaXAob3V0cHV0KTsKICAgICAgICBzdHJlYW0udmFsaWQgPSB0cnVlOwogICAgICAgIHJldHVybiBzdHJlYW07CiAgICAgIH0sCiAgICAgIGV4dGVudDogZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgWyB4MCwgeTAgXSwgWyB4MSwgeTEgXSBdOwogICAgICAgIGNsaXAgPSBkM19nZW9fY2xpcEV4dGVudCh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdKTsKICAgICAgICBpZiAoc3RyZWFtKSBzdHJlYW0udmFsaWQgPSBmYWxzZSwgc3RyZWFtID0gbnVsbDsKICAgICAgICByZXR1cm4gY2xpcEV4dGVudDsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBjbGlwRXh0ZW50LmV4dGVudChbIFsgMCwgMCBdLCBbIDk2MCwgNTAwIF0gXSk7CiAgfTsKICBmdW5jdGlvbiBkM19nZW9fY2xpcEV4dGVudCh4MCwgeTAsIHgxLCB5MSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGxpc3RlbmVyKSB7CiAgICAgIHZhciBsaXN0ZW5lcl8gPSBsaXN0ZW5lciwgYnVmZmVyTGlzdGVuZXIgPSBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCksIGNsaXBMaW5lID0gZDNfZ2VvbV9jbGlwTGluZSh4MCwgeTAsIHgxLCB5MSksIHNlZ21lbnRzLCBwb2x5Z29uLCByaW5nOwogICAgICB2YXIgY2xpcCA9IHsKICAgICAgICBwb2ludDogcG9pbnQsCiAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsCiAgICAgICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbGlzdGVuZXIgPSBidWZmZXJMaXN0ZW5lcjsKICAgICAgICAgIHNlZ21lbnRzID0gW107CiAgICAgICAgICBwb2x5Z29uID0gW107CiAgICAgICAgICBjbGVhbiA9IHRydWU7CiAgICAgICAgfSwKICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJfOwogICAgICAgICAgc2VnbWVudHMgPSBkMy5tZXJnZShzZWdtZW50cyk7CiAgICAgICAgICB2YXIgY2xpcFN0YXJ0SW5zaWRlID0gaW5zaWRlUG9seWdvbihbIHgwLCB5MSBdKSwgaW5zaWRlID0gY2xlYW4gJiYgY2xpcFN0YXJ0SW5zaWRlLCB2aXNpYmxlID0gc2VnbWVudHMubGVuZ3RoOwogICAgICAgICAgaWYgKGluc2lkZSB8fCB2aXNpYmxlKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpOwogICAgICAgICAgICBpZiAoaW5zaWRlKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgbGlzdGVuZXIpOwogICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgIGQzX2dlb19jbGlwUG9seWdvbihzZWdtZW50cywgY29tcGFyZSwgY2xpcFN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgbGlzdGVuZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25FbmQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlZ21lbnRzID0gcG9seWdvbiA9IHJpbmcgPSBudWxsOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZnVuY3Rpb24gaW5zaWRlUG9seWdvbihwKSB7CiAgICAgICAgdmFyIHduID0gMCwgbiA9IHBvbHlnb24ubGVuZ3RoLCB5ID0gcFsxXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgZm9yICh2YXIgaiA9IDEsIHYgPSBwb2x5Z29uW2ldLCBtID0gdi5sZW5ndGgsIGEgPSB2WzBdLCBiOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgIGIgPSB2W2pdOwogICAgICAgICAgICBpZiAoYVsxXSA8PSB5KSB7CiAgICAgICAgICAgICAgaWYgKGJbMV0gPiB5ICYmIGQzX2Nyb3NzMmQoYSwgYiwgcCkgPiAwKSArK3duOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChiWzFdIDw9IHkgJiYgZDNfY3Jvc3MyZChhLCBiLCBwKSA8IDApIC0td247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYSA9IGI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB3biAhPT0gMDsKICAgICAgfQogICAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBsaXN0ZW5lcikgewogICAgICAgIHZhciBhID0gMCwgYTEgPSAwOwogICAgICAgIGlmIChmcm9tID09IG51bGwgfHwgKGEgPSBjb3JuZXIoZnJvbSwgZGlyZWN0aW9uKSkgIT09IChhMSA9IGNvcm5lcih0bywgZGlyZWN0aW9uKSkgfHwgY29tcGFyZVBvaW50cyhmcm9tLCB0bykgPCAwIF4gZGlyZWN0aW9uID4gMCkgewogICAgICAgICAgZG8gewogICAgICAgICAgICBsaXN0ZW5lci5wb2ludChhID09PSAwIHx8IGEgPT09IDMgPyB4MCA6IHgxLCBhID4gMSA/IHkxIDogeTApOwogICAgICAgICAgfSB3aGlsZSAoKGEgPSAoYSArIGRpcmVjdGlvbiArIDQpICUgNCkgIT09IGExKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGlzdGVuZXIucG9pbnQodG9bMF0sIHRvWzFdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcG9pbnRWaXNpYmxlKHgsIHkpIHsKICAgICAgICByZXR1cm4geDAgPD0geCAmJiB4IDw9IHgxICYmIHkwIDw9IHkgJiYgeSA8PSB5MTsKICAgICAgfQogICAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgICAgaWYgKHBvaW50VmlzaWJsZSh4LCB5KSkgbGlzdGVuZXIucG9pbnQoeCwgeSk7CiAgICAgIH0KICAgICAgdmFyIHhfXywgeV9fLCB2X18sIHhfLCB5Xywgdl8sIGZpcnN0LCBjbGVhbjsKICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgIGNsaXAucG9pbnQgPSBsaW5lUG9pbnQ7CiAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb24ucHVzaChyaW5nID0gW10pOwogICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICB2XyA9IGZhbHNlOwogICAgICAgIHhfID0geV8gPSBOYU47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgICBpZiAoc2VnbWVudHMpIHsKICAgICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7CiAgICAgICAgICBpZiAodl9fICYmIHZfKSBidWZmZXJMaXN0ZW5lci5yZWpvaW4oKTsKICAgICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyTGlzdGVuZXIuYnVmZmVyKCkpOwogICAgICAgIH0KICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7CiAgICAgICAgaWYgKHZfKSBsaXN0ZW5lci5saW5lRW5kKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZVBvaW50KHgsIHkpIHsKICAgICAgICB4ID0gTWF0aC5tYXgoLWQzX2dlb19jbGlwRXh0ZW50TUFYLCBNYXRoLm1pbihkM19nZW9fY2xpcEV4dGVudE1BWCwgeCkpOwogICAgICAgIHkgPSBNYXRoLm1heCgtZDNfZ2VvX2NsaXBFeHRlbnRNQVgsIE1hdGgubWluKGQzX2dlb19jbGlwRXh0ZW50TUFYLCB5KSk7CiAgICAgICAgdmFyIHYgPSBwb2ludFZpc2libGUoeCwgeSk7CiAgICAgICAgaWYgKHBvbHlnb24pIHJpbmcucHVzaChbIHgsIHkgXSk7CiAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICB4X18gPSB4LCB5X18gPSB5LCB2X18gPSB2OwogICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHYgJiYgdl8pIGxpc3RlbmVyLnBvaW50KHgsIHkpOyBlbHNlIHsKICAgICAgICAgICAgdmFyIGwgPSB7CiAgICAgICAgICAgICAgYTogewogICAgICAgICAgICAgICAgeDogeF8sCiAgICAgICAgICAgICAgICB5OiB5XwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgYjogewogICAgICAgICAgICAgICAgeDogeCwKICAgICAgICAgICAgICAgIHk6IHkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChjbGlwTGluZShsKSkgewogICAgICAgICAgICAgIGlmICghdl8pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQobC5hLngsIGwuYS55KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQobC5iLngsIGwuYi55KTsKICAgICAgICAgICAgICBpZiAoIXYpIGxpc3RlbmVyLmxpbmVFbmQoKTsKICAgICAgICAgICAgICBjbGVhbiA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHYpIHsKICAgICAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh4LCB5KTsKICAgICAgICAgICAgICBjbGVhbiA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7CiAgICAgIH0KICAgICAgcmV0dXJuIGNsaXA7CiAgICB9OwogICAgZnVuY3Rpb24gY29ybmVyKHAsIGRpcmVjdGlvbikgewogICAgICByZXR1cm4gYWJzKHBbMF0gLSB4MCkgPCDOtSA/IGRpcmVjdA0KjNzvVsSUAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3gQABABnz9wKgHNsCoB2CVJx/125J4NzlSqiSAEAY/7s8AAAEBCAoAo16/AE2luozc71aDlgEAGlUAABpVAABo9ygf0sUIACetHhMIAEUAVQw3D0AAQAYe9sCoB2DAqAc2H/WVJzlSqiTbkng3gBAA7eTlAAABAQgKAE2lugCjXr83RkU4DQppb24gPiAwID8gMCA6IDMgOiBhYnMocFswXSAtIHgxKSA8IM61ID8gZGlyZWN0aW9uID4gMCA/IDIgOiAxIDogYWJzKHBbMV0gLSB5MCkgPCDOtSA/IGRpcmVjdGlvbiA+IDAgPyAxIDogMCA6IGRpcmVjdGlvbiA+IDAgPyAzIDogMjsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikgewogICAgICByZXR1cm4gY29tcGFyZVBvaW50cyhhLngsIGIueCk7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlUG9pbnRzKGEsIGIpIHsKICAgICAgdmFyIGNhID0gY29ybmVyKGEsIDEpLCBjYiA9IGNvcm5lcihiLCAxKTsKICAgICAgcmV0dXJuIGNhICE9PSBjYiA/IGNhIC0gY2IgOiBjYSA9PT0gMCA/IGJbMV0gLSBhWzFdIDogY2EgPT09IDEgPyBhWzBdIC0gYlswXSA6IGNhID09PSAyID8gYVsxXSAtIGJbMV0gOiBiWzBdIC0gYVswXTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NvbXBvc2UoYSwgYikgewogICAgZnVuY3Rpb24gY29tcG9zZSh4LCB5KSB7CiAgICAgIHJldHVybiB4ID0gYSh4LCB5KSwgYih4WzBdLCB4WzFdKTsKICAgIH0KICAgIGlmIChhLmludmVydCAmJiBiLmludmVydCkgY29tcG9zZS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIHJldHVybiB4ID0gYi5pbnZlcnQoeCwgeSksIHggJiYgYS5pbnZlcnQoeFswXSwgeFsxXSk7CiAgICB9OwogICAgcmV0dXJuIGNvbXBvc2U7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19jb25pYyhwcm9qZWN0QXQpIHsKICAgIHZhciDPhjAgPSAwLCDPhjEgPSDPgCAvIDMsIG0gPSBkM19nZW9fcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSwgcCA9IG0oz4YwLCDPhjEpOwogICAgcC5wYXJhbGxlbHMgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgz4YwIC8gz4AgKiAxODAsIM+GMSAvIM+AICogMTgwIF07CiAgICAgIHJldHVybiBtKM+GMCA9IF9bMF0gKiDPgCAvIDE4MCwgz4YxID0gX1sxXSAqIM+AIC8gMTgwKTsKICAgIH07CiAgICByZXR1cm4gcDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2NvbmljRXF1YWxBcmVhKM+GMCwgz4YxKSB7CiAgICB2YXIgc2luz4YwID0gTWF0aC5zaW4oz4YwKSwgbiA9IChzaW7PhjAgKyBNYXRoLnNpbijPhjEpKSAvIDIsIEMgPSAxICsgc2luz4YwICogKDIgKiBuIC0gc2luz4YwKSwgz4EwID0gTWF0aC5zcXJ0KEMpIC8gbjsKICAgIGZ1bmN0aW9uIGZvcndhcmQozrssIM+GKSB7CiAgICAgIHZhciDPgSA9IE1hdGguc3FydChDIC0gMiAqIG4gKiBNYXRoLnNpbijPhikpIC8gbjsKICAgICAgcmV0dXJuIFsgz4EgKiBNYXRoLnNpbijOuyAqPSBuKSwgz4EwIC0gz4EgKiBNYXRoLmNvcyjOuykgXTsKICAgIH0KICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICB2YXIgz4EwX3kgPSDPgTAgLSB5OwogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIGQzX2FzaW4oKEMgLSAoeCAqIHggKyDPgTBfeSAqIM+BMF95KSAqIG4gKiBuKSAvICgyICogbikpIF07CiAgICB9OwogICAgcmV0dXJuIGZvcndhcmQ7CiAgfQogIChkMy5nZW8uY29uaWNFcXVhbEFyZWEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fY29uaWMoZDNfZ2VvX2NvbmljRXF1YWxBcmVhKTsKICB9KS5yYXcgPSBkM19nZW9fY29uaWNFcXVhbEFyZWE7CiAgZDMuZ2VvLmFsYmVycyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbIDk2LCAwIF0pLmNlbnRlcihbIC0uNiwgMzguNyBdKS5wYXJhbGxlbHMoWyAyOS41LCA0NS41IF0pLnNjYWxlKDEwNzApOwogIH07CiAgZDMuZ2VvLmFsYmVyc1VzYSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvd2VyNDggPSBkMy5nZW8uYWxiZXJzKCk7CiAgICB2YXIgYWxhc2thID0gZDMuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsgMTU0LCAwIF0pLmNlbnRlcihbIC0yLCA1OC41IF0pLnBhcmFsbGVscyhbIDU1LCA2NSBdKTsKICAgIHZhciBoYXdhaWkgPSBkMy5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWyAxNTcsIDAgXSkuY2VudGVyKFsgLTMsIDE5LjkgXSkucGFyYWxsZWxzKFsgOCwgMTggXSk7CiAgICB2YXIgcG9pbnQsIHBvaW50U3RyZWFtID0gewogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHBvaW50ID0gWyB4LCB5IF07CiAgICAgIH0KICAgIH0sIGxvd2VyNDhQb2ludCwgYWxhc2thUG9pbnQsIGhhd2FpaVBvaW50OwogICAgZnVuY3Rpb24gYWxiZXJzVXNhKGNvb3JkaW5hdGVzKSB7CiAgICAgIHZhciB4ID0gY29vcmRpbmF0ZXNbMF0sIHkgPSBjb29yZGluYXRlc1sxXTsKICAgICAgcG9pbnQgPSBudWxsOwogICAgICAobG93ZXI0OFBvaW50KHgsIHkpLCBwb2ludCkgfHwgKGFsYXNrYVBvaW50KHgsIHkpLCBwb2ludCkgfHwgaGF3YWlpUG9pbnQoeCwgeSk7CiAgICAgIHJldHVybiBwb2ludDsKICAgIH0KICAgIGFsYmVyc1VzYS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUoKSwgdCA9IGxvd2VyNDgudHJhbnNsYXRlKCksIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0WzBdKSAvIGssIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0WzFdKSAvIGs7CiAgICAgIHJldHVybiAoeSA+PSAuMTIgJiYgeSA8IC4yMzQgJiYgeCA+PSAtLjQyNSAmJiB4IDwgLS4yMTQgPyBhbGFza2EgOiB5ID49IC4xNjYgJiYgeSA8IC4yMzQgJiYgeCA+PSAtLjIxNCAmJiB4IDwgLS4xMTUgPyBoYXdhaWkgOiBsb3dlcjQ4KS5pbnZlcnQoY29vcmRpbmF0ZXMpOwogICAgfTsKICAgIGFsYmVyc1VzYS5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgdmFyIGxvd2VyNDhTdHJlYW0gPSBsb3dlcjQ4LnN0cmVhbShzdHJlYW0pLCBhbGFza2FTdHJlYW0gPSBhbGFza2Euc3RyZWFtKHN0cmVhbSksIGhhd2FpaVN0cmVhbSA9IGhhd2FpaS5zdHJlYW0oc3RyZWFtKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICAgIGFsYXNrYVN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICAgIGhhd2FpaVN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICB9LAogICAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICBsb3dlcjQ4U3RyZWFtLnNwaGVyZSgpOwogICAgICAgICAgYWxhc2thU3RyZWFtLnNwaGVyZSgpOwogICAgICAgICAgaGF3YWlpU3RyZWFtLnNwaGVyZSgpOwogICAgICAgIH0sCiAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGxvd2VyNDhTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBhbGFza2FTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBoYXdhaWlTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgfSwKICAgICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGxvd2VyNDhTdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgYWxhc2thU3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgIGhhd2FpaVN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgfSwKICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgIGFsYXNrYVN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgIGhhd2FpaVN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICB9LAogICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICAgICAgICBhbGFza2FTdHJlYW0ucG9seWdvbkVuZCgpOwogICAgICAgICAgaGF3YWlpU3RyZWFtLnBvbHlnb25FbmQoKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogICAgYWxiZXJzVXNhLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC5wcmVjaXNpb24oKTsKICAgICAgbG93ZXI0OC5wcmVjaXNpb24oXyk7CiAgICAgIGFsYXNrYS5wcmVjaXNpb24oXyk7CiAgICAgIGhhd2FpaS5wcmVjaXNpb24oXyk7CiAgICAgIHJldHVybiBhbGJlcnNVc2E7CiAgICB9OwogICAgYWxiZXJzVXNhLnNjYWxlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnNjYWxlKCk7CiAgICAgIGxvd2VyNDguc2NhbGUoXyk7CiAgICAgIGFsYXNrYS5zY2FsZShfICogLjM1KTsKICAgICAgaGF3YWlpLnNjYWxlKF8pOwogICAgICByZXR1cm4gYWxiZXJzVXNhLnRyYW5zbGF0ZShsb3dlcjQ4LnRyYW5zbGF0ZSgpKTsKICAgIH07CiAgICBhbGJlcnNVc2EudHJhbnNsYXRlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnRyYW5zbGF0ZSgpOwogICAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUoKSwgeCA9ICtfWzBdLCB5ID0gK19bMV07CiAgICAgIGxvd2VyNDhQb2ludCA9IGxvd2VyNDgudHJhbnNsYXRlKF8pLmNsaXBFeHRlbnQoWyBbIHggLSAuNDU1ICogaywgeSAtIC4yMzggKiBrIF0sIFsgeCArIC40NTUgKiBrLCB5ICsgLjIzOCAqIGsgXSBdKS5zdHJlYW0ocG9pbnRTdHJlYW0pLnBvaW50OwogICAgICBhbGFza2FQb2ludCA9IGFsYXNrYS50cmFuc2xhdGUoWyB4IC0gLjMwNyAqIGssIHkgKyAuMjAxICogayBdKS5jbGlwRXh0ZW50KFsgWyB4IC0gLjQyNSAqIGsgKyDOtSwgeSArIC4xMiAqIGsgKyDOtSBdLCBbIHggLSAuMjE0ICogayAtIM61LCB5ICsgLjIzNCAqIGsgLSDOtSBdIF0pLnN0cmVhbShwb2ludFN0cmVhbSkucG9pbnQ7CiAgICAgIGhhd2FpaVBvaW50ID0gaGF3YWlpLnRyYW5zbGF0ZShbIHggLSAuMjA1ICogaywgeSArIC4yMTIgKiBrIF0pLmNsaXBFeHRlbnQoWyBbIHggLSAuMjE0ICogayArIM61LCB5ICsgLjE2NiAqIGsgKyDOtSBdLCBbIHggLSAuMTE1ICogayAtIM61LCB5ICsgLjIzNCAqIGsgLSDOtSBdIF0pLnN0cmVhbShwb2ludFN0cmVhbSkucG9pbnQ7CiAgICAgIHJldHVybiBhbGJlcnNVc2E7CiAgICB9OwogICAgcmV0dXJuIGFsYmVyc1VzYS5zY2FsZSgxMDcwKTsKICB9OwogIHZhciBkM19nZW9fcGF0aEFyZWFTdW0sIGQzX2dlb19wYXRoQXJlYVBvbHlnb24sIGQzX2dlb19wYXRoQXJlYSA9IHsKICAgIHBvaW50OiBkM19ub29wLAogICAgbGluZVN0YXJ0OiBkM19ub29wLAogICAgbGluZUVuZDogZDNfbm9vcCwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX2dlb19wYXRoQXJlYVBvbHlnb24gPSAwOwogICAgICBkM19nZW9fcGF0aEFyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhBcmVhUmluZ1N0YXJ0OwogICAgfSwKICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICBkM19nZW9fcGF0aEFyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhBcmVhLmxpbmVFbmQgPSBkM19nZW9fcGF0aEFyZWEucG9pbnQgPSBkM19ub29wOwogICAgICBkM19nZW9fcGF0aEFyZWFTdW0gKz0gYWJzKGQzX2dlb19wYXRoQXJlYVBvbHlnb24gLyAyKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQXJlYVJpbmdTdGFydCgpIHsKICAgIHZhciB4MDAsIHkwMCwgeDAsIHkwOwogICAgZDNfZ2VvX3BhdGhBcmVhLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICBkM19nZW9fcGF0aEFyZWEucG9pbnQgPSBuZXh0UG9pbnQ7CiAgICAgIHgwMCA9IHgwID0geCwgeTAwID0geTAgPSB5OwogICAgfTsKICAgIGZ1bmN0aW9uIG5leHRQb2ludCh4LCB5KSB7CiAgICAgIGQzX2dlb19wYXRoQXJlYVBvbHlnb24gKz0geTAgKiB4IC0geDAgKiB5OwogICAgICB4MCA9IHgsIHkwID0geTsKICAgIH0KICAgIGQzX2dlb19wYXRoQXJlYS5saW5lRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgIG5leHRQb2ludCh4MDAsIHkwMCk7CiAgICB9OwogIH0KICB2YXIgZDNfZ2VvX3BhdGhCb3VuZHNYMCwgZDNfZ2VvX3BhdGhCb3VuZHNZMCwgZDNfZ2VvX3BhdGhCb3VuZHNYMSwgZDNfZ2VvX3BhdGhCb3VuZHNZMTsKICB2YXIgZDNfZ2VvX3BhdGhCb3VuZHMgPSB7CiAgICBwb2ludDogZDNfZ2VvX3BhdGhCb3VuZHNQb2ludCwKICAgIGxpbmVTdGFydDogZDNfbm9vcCwKICAgIGxpbmVFbmQ6IGQzX25vb3AsCiAgICBwb2x5Z29uU3RhcnQ6IGQzX25vb3AsCiAgICBwb2x5Z29uRW5kOiBkM19ub29wCiAgfTsKICBmdW5jdGlvbiBkM19nZW9fcGF0aEJvdW5kc1BvaW50KHgsIHkpIHsKICAgIGlmICh4IDwgZDNfZ2VvX3BhdGhCb3VuZHNYMCkgZDNfZ2VvX3BhdGhCb3VuZHNYMCA9IHg7CiAgICBpZiAoeCA+IGQzX2dlb19wYXRoQm91bmRzWDEpIGQzX2dlb19wYXRoQm91bmRzWDEgPSB4OwogICAgaWYgKHkgPCBkM19nZW9fcGF0aEJvdW5kc1kwKSBkM19nZW9fcGF0aEJvdW5kc1kwID0geTsKICAgIGlmICh5ID4gZDNfZ2VvX3BhdGhCb3VuZHNZMSkgZDNfZ2VvX3BhdGhCb3VuZHNZMSA9IHk7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQnVmZmVyKCkgewogICAgdmFyIHBvaW50Q2lyY2xlID0gZDNfZ2VvX3BhdGhCdWZmZXJDaXJjbGUoNC41KSwgYnVmZmVyID0gW107CiAgICB2YXIgc3RyZWFtID0gewogICAgICBwb2ludDogcG9pbnQsCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnRMaW5lU3RhcnQ7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsCiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kUG9seWdvbjsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kOwogICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50OwogICAgICB9LAogICAgICBwb2ludFJhZGl1czogZnVuY3Rpb24oXykgewogICAgICAgIHBvaW50Q2lyY2xlID0gZDNfZ2VvX3BhdGhCdWZmZXJDaXJjbGUoXyk7CiAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgfSwKICAgICAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IGJ1ZmZlci5qb2luKCIiKTsKICAgICAgICAgIGJ1ZmZlciA9IFtdOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgIGJ1ZmZlci5wdXNoKCJNIiwgeCwgIiwiLCB5LCBwb2ludENpcmNsZSk7CiAgICB9CiAgICBmdW5jdGlvbiBwb2ludExpbmVTdGFydCh4LCB5KSB7CiAgICAgIGJ1ZmZlci5wdXNoKCJNIiwgeCwgIiwiLCB5KTsKICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnRMaW5lOwogICAgfQogICAgZnVuY3Rpb24gcG9pbnRMaW5lKHgsIHkpIHsKICAgICAgYnVmZmVyLnB1c2goIkwiLCB4LCAiLCIsIHkpOwogICAgfQogICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lRW5kUG9seWdvbigpIHsKICAgICAgYnVmZmVyLnB1c2goIloiKTsKICAgIH0KICAgIHJldHVybiBzdHJlYW07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQnVmZmVyQ2lyY2xlKHJhZGl1cykgewogICAgcmV0dXJuICJtMCwiICsgcmFkaXVzICsgImEiICsgcmFkaXVzICsgIiwiICsgcmFkaXVzICsgIiAwIDEsMSAwLCIgKyAtMiAqIHJhZGl1cyArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgMiAqIHJhZGl1cyArICJ6IjsKICB9CiAgdmFyIGQzX2dlb19wYXRoQ2VudHJvaWQgPSB7CiAgICBwb2ludDogZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50LAogICAgbGluZVN0YXJ0OiBkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0LAogICAgbGluZUVuZDogZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVFbmQsCiAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQ2VudHJvaWRSaW5nU3RhcnQ7CiAgICB9LAogICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQ7CiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVTdGFydDsKICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lRW5kID0gZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVFbmQ7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeCwgeSkgewogICAgZDNfZ2VvX2NlbnRyb2lkWDAgKz0geDsKICAgIGQzX2dlb19jZW50cm9pZFkwICs9IHk7CiAgICArK2QzX2dlb19jZW50cm9pZFowOwogIH0KICBmdW5jdGlvbiBkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0KCkgewogICAgdmFyIHgwLCB5MDsKICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBuZXh0UG9pbnQ7CiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4MCA9IHgsIHkwID0geSk7CiAgICB9OwogICAgZnVuY3Rpb24gbmV4dFBvaW50KHgsIHkpIHsKICAgICAgdmFyIGR4ID0geCAtIHgwLCBkeSA9IHkgLSB5MCwgeiA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7CiAgICAgIGQzX2dlb19jZW50cm9pZFgxICs9IHogKiAoeDAgKyB4KSAvIDI7CiAgICAgIGQzX2dlb19jZW50cm9pZFkxICs9IHogKiAoeTAgKyB5KSAvIDI7CiAgICAgIGQzX2dlb19jZW50cm9pZFoxICs9IHo7CiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4MCA9IHgsIHkwID0geSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lRW5kKCkgewogICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhDZW50cm9pZFJpbmdTdGFydCgpIHsKICAgIHZhciB4MDAsIHkwMCwgeDAsIHkwOwogICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDsKICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50KHgwMCA9IHgwID0geCwgeTAwID0geTAgPSB5KTsKICAgIH07CiAgICBmdW5jdGlvbiBuZXh0UG9pbnQoeCwgeSkgewogICAgICB2YXIgZHggPSB4IC0geDAsIGR5ID0geSAtIHkwLCB6ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWDEgKz0geiAqICh4MCArIHgpIC8gMjsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0geiAqICh5MCArIHkpIC8gMjsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWjEgKz0gejsKICAgICAgeiA9IHkwICogeCAtIHgwICogeTsKICAgICAgZDNfZ2VvX2NlbnRyb2lkWDIgKz0geiAqICh4MCArIHgpOwogICAgICBkM19nZW9fY2VudHJvaWRZMiArPSB6ICogKHkwICsgeSk7CiAgICAgIGQzX2dlb19jZW50cm9pZFoyICs9IHogKiAzOwogICAgICBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeDAgPSB4LCB5MCA9IHkpOwogICAgfQogICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgIG5leHRQb2ludCh4MDAsIHkwMCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19nZW9fcGF0aENvbnRleHQoY29udGV4dCkgewogICAgdmFyIHBvaW50UmFkaXVzID0gNC41OwogICAgdmFyIHN0cmVhbSA9IHsKICAgICAgcG9pbnQ6IHBvaW50LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZVN0YXJ0OwogICAgICB9LAogICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZFBvbHlnb247CiAgICAgIH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZDsKICAgICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludDsKICAgICAgfSwKICAgICAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHsKICAgICAgICBwb2ludFJhZGl1cyA9IF87CiAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgfSwKICAgICAgcmVzdWx0OiBkM19ub29wCiAgICB9OwogICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkgewogICAgICBjb250ZXh0Lm1vdmVUbyh4LCB5KTsKICAgICAgY29udGV4dC5hcmMoeCwgeSwgcG9pbnRSYWRpdXMsIDAsIM+EKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvaW50TGluZVN0YXJ0KHgsIHkpIHsKICAgICAgY29udGV4dC5tb3ZlVG8oeCwgeSk7CiAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvaW50TGluZSh4LCB5KSB7CiAgICAgIGNvbnRleHQubGluZVRvKHgsIHkpOwogICAgfQogICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lRW5kUG9seWdvbigpIHsKICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIH0KICAgIHJldHVybiBzdHJlYW07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19yZXNhbXBsZShwcm9qZWN0KSB7CiAgICB2YXIgzrQyID0gLjUsIGNvc01pbkRpc3RhbmNlID0gTWF0aC5jb3MoMzAgKiBkM19yYWRpYW5zKSwgbWF4RGVwdGggPSAxNjsKICAgIGZ1bmN0aW9uIHJlc2FtcGxlKHN0cmVhbSkgewogICAgICByZXR1cm4gKG1heERlcHRoID8gcmVzYW1wbGVSZWN1cnNpdmUgOiByZXNhbXBsZU5vbmUpKHN0cmVhbSk7CiAgICB9CiAgICBmdW5jdGlvbiByZXNhbXBsZU5vbmUoc3RyZWFtKSB7CiAgICAgIHJldHVybiBkM19nZW9fdHJhbnNmb3JtUG9pbnQoc3RyZWFtLCBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9IHByb2plY3QoeCwgeSk7CiAgICAgICAgc3RyZWFtLnBvaW50KHhbMF0sIHhbMV0pOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2FtcGxlUmVjdXJzaXZlKHN0cmVhbSkgewogICAgICB2YXIgzrswMCwgz4YwMCwgeDAwLCB5MDAsIGEwMCwgYjAwLCBjMDAsIM67MCwgeDAsIHkwLCBhMCwgYjAsIGMwOwogICAgICB2YXIgcmVzYW1wbGUgPSB7CiAgICAgICAgcG9pbnQ6IHBvaW50LAogICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LAogICAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsCiAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgIHJlc2FtcGxlLmxpbmVTdGFydCA9IHJpbmdTdGFydDsKICAgICAgICB9LAogICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgc3RyZWFtLnBvbHlnb25FbmQoKTsKICAgICAgICAgIHJlc2FtcGxlLmxpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHsKICAgICAgICB4ID0gcHJvamVjdCh4LCB5KTsKICAgICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgIHgwID0gTmFOOwogICAgICAgIHJlc2FtcGxlLnBvaW50ID0gbGluZVBvaW50OwogICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBsaW5lUG9pbnQozrssIM+GKSB7CiAgICAgICAgdmFyIGMgPSBkM19nZW9fY2FydGVzaWFuKFsgzrssIM+GIF0pLCBwID0gcHJvamVjdCjOuywgz4YpOwogICAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgzrswLCBhMCwgYjAsIGMwLCB4MCA9IHBbMF0sIHkwID0gcFsxXSwgzrswID0gzrssIGEwID0gY1swXSwgYjAgPSBjWzFdLCBjMCA9IGNbMl0sIG1heERlcHRoLCBzdHJlYW0pOwogICAgICAgIHN0cmVhbS5wb2ludCh4MCwgeTApOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgICAgcmVzYW1wbGUucG9pbnQgPSBwb2ludDsKICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHsKICAgICAgICBsaW5lU3RhcnQoKTsKICAgICAgICByZXNhbXBsZS5wb2ludCA9IHJpbmdQb2ludDsKICAgICAgICByZXNhbXBsZS5saW5lRW5kID0gcmluZ0VuZDsKICAgICAgfQogICAgICBmdW5jdGlvbiByaW5nUG9pbnQozrssIM+GKSB7CiAgICAgICAgbGluZVBvaW50KM67MDAgPSDOuywgz4YwMCA9IM+GKSwgeDAwID0geDAsIHkwMCA9IHkwLCBhMDAgPSBhMCwgYjAwID0gYjAsIGMwMCA9IGMwOwogICAgICAgIHJlc2FtcGxlLnBvaW50ID0gbGluZVBvaW50OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7CiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgwMCwgeTAwLCDOuzAwLCBhMDAsIGIwMCwgYzAwLCBtYXhEZXB0aCwgc3RyZWFtKTsKICAgICAgICByZXNhbXBsZS5saW5lRW5kID0gbGluZUVuZDsKICAgICAgICBsaW5lRW5kKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc2FtcGxlOwogICAgfQogICAgZnVuY3Rpb24gcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgxLCB5MSwgzrsxLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKSB7CiAgICAgIHZhciBkeCA9IHgxIC0geDAsIGR5ID0geTEgLSB5MCwgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgaWYgKGQyID4gNCAqIM60MiAmJiBkZXB0aC0tKSB7CiAgICAgICAgdmFyIGEgPSBhMCArIGExLCBiID0gYjAgKyBiMSwgYyA9IGMwICsgYzEsIG0gPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiArIGMgKiBjKSwgz4YyID0gTWF0aC5hc2luKGMgLz0gbSksIM67MiA9IGFicyhhYnMoYykgLSAxKSA8IM61IHx8IGFicyjOuzAgLSDOuzEpIDwgzrUgPyAozrswICsgzrsxKSAvIDIgOiBNYXRoLmF0YW4yKGIsIGEpLCBwID0gcHJvamVjdCjOuzIsIM+GMiksIHgyID0gcFswXSwgeTIgPSBwWzFdLCBkeDIgPSB4MiAtIHgwLCBkeTIgPSB5MiAtIHkwLCBkeiA9IGR5ICogZHgyIC0gZHggKiBkeTI7CiAgICAgICAgaWYgKGR6ICogZHogLyBkMiA+IM60MiB8fCBhYnMoKGR4ICogZHgyICsgZHkgKiBkeTIpIC8gZDIgLSAuNSkgPiAuMyB8fCBhMCAqIGExICsgYjAgKiBiMSArIGMwICogYzEgPCBjb3NNaW5EaXN0YW5jZSkgewogICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgyLCB5MiwgzrsyLCBhIC89IG0sIGIgLz0gbSwgYywgZGVwdGgsIHN0cmVhbSk7CiAgICAgICAgICBzdHJlYW0ucG9pbnQoeDIsIHkyKTsKICAgICAgICAgIHJlc2FtcGxlTGluZVRvKHgyLCB5MiwgzrsyLCBhLCBiLCBjLCB4MSwgeTEsIM67MSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXNhbXBsZS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIE1hdGguc3FydCjOtDIpOwogICAgICBtYXhEZXB0aCA9ICjOtDIgPSBfICogXykgPiAwICYmIDE2OwogICAgICByZXR1cm4gcmVzYW1wbGU7CiAgICB9OwogICAgcmV0dXJuIHJlc2FtcGxlOwogIH0KICBkMy5nZW8ucGF0aCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBvaW50UmFkaXVzID0gNC41LCBwcm9qZWN0aW9uLCBjb250ZXh0LCBwcm9qZWN0U3RyZWFtLCBjb250ZXh0U3RyZWFtLCBjYWNoZVN0cmVhbTsKICAgIGZ1bmN0aW9uIHBhdGgob2JqZWN0KSB7CiAgICAgIGlmIChvYmplY3QpIHsKICAgICAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzID09PSAiZnVuY3Rpb24iKSBjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgICBpZiAoIWNhY2hlU3RyZWFtIHx8ICFjYWNoZVN0cmVhbS52YWxpZCkgY2FjaGVTdHJlYW0gPSBwcm9qZWN0U3RyZWFtKGNvbnRleHRTdHJlYW0pOwogICAgICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBjYWNoZVN0cmVhbSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnRleHRTdHJlYW0ucmVzdWx0KCk7CiAgICB9CiAgICBwYXRoLmFyZWEgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgZDNfZ2VvX3BhdGhBcmVhU3VtID0gMDsKICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIHByb2plY3RTdHJlYW0oZDNfZ2VvX3BhdGhBcmVhKSk7CiAgICAgIHJldHVybiBkM19nZW9fcGF0aEFyZWFTdW07CiAgICB9OwogICAgcGF0aC5jZW50cm9pZCA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICBkM19nZW9fY2VudHJvaWRYMCA9IGQzX2dlb19jZW50cm9pZFkwID0gZDNfZ2VvX2NlbnRyb2lkWjAgPSBkM19nZW9fY2VudHJvaWRYMSA9IGQzX2dlb19jZW50cm9pZFkxID0gZDNfZ2VvX2NlbnRyb2lkWjEgPSBkM19nZW9fY2VudHJvaWRYMiA9IGQzX2dlb19jZW50cm9pZFkyID0gZDNfZ2VvX2NlbnRyb2lkWjIgPSAwOwogICAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgcHJvamVjdFN0cmVhbShkM19nZW9fcGF0aENlbnRyb2lkKSk7CiAgICAgIHJldHVybiBkM19nZW9fY2VudHJvaWRaMiA/IFsgZDNfZ2VvX2NlbnRyb2lkWDIgLyBkM19nZW9fY2VudHJvaWRaMiwgZDNfZ2VvX2NlbnRyb2lkWTIgLyBkM19nZW9fY2VudHJvaWRaMiBdIDogZDNfZ2VvX2NlbnRyb2lkWjEgPyBbIGQzX2dlb19jZW50cm9pZFgxIC8gZDNfZ2VvX2NlbnRyb2lkWjEsIGQzX2dlb19jZW50cm9pZFkxIC8gZDNfZ2VvX2NlbnRyb2lkWjEgXSA6IGQzX2dlb19jZW50cm9pZFowID8gWyBkM19nZW9fY2VudHJvaWRYMCAvIGQzX2dlb19jZW50cm9pZFowLCBkM19nZW9fY2VudHJvaWRZMCAvIGQzX2dlb19jZW50cm9pZFowIF0gOiBbIE5hTiwgTmFOIF07CiAgICB9OwogICAgcGF0aC5ib3VuZHMgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgZDNfZ2VvX3BhdGhCb3VuZHNYMSA9IGQzX2dlb19wYXRoQm91bmRzWTEgPSAtKGQzX2dlb19wYXRoQm91bmRzWDAgPSBkM19nZW9fcGF0aEJvdW5kc1kwID0gSW5maW5pdHkpOwogICAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgcHJvamVjdFN0cmVhbShkM19nZW9fcGF0aEJvdW5kcykpOwogICAgICByZXR1cm4gWyBbIGQzX2dlb19wYXRoQm91bmRzWDAsIGQzX2dlb19wYXRoQm91bmRzWTAgXSwgWyBkM19nZW9fcGF0aEJvdW5kc1gxLCBkM19nZW9fcGF0aEJvdW5kc1kxIF0gXTsKICAgIH07CiAgICBwYXRoLnByb2plY3Rpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByb2plY3Rpb247CiAgICAgIHByb2plY3RTdHJlYW0gPSAocHJvamVjdGlvbiA9IF8pID8gXy5zdHJlYW0gfHwgZDNfZ2VvX3BhdGhQcm9qZWN0U3RyZWFtKF8pIDogZDNfaWRlbnRpdHk7CiAgICAgIHJldHVybiByZXNldCgpOwogICAgfTsKICAgIHBhdGguY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY29udGV4dDsKICAgICAgY29udGV4dFN0cmVhbSA9IChjb250ZXh0ID0gXykgPT0gbnVsbCA/IG5ldyBkM19nZW9fcGF0aEJ1ZmZlcigpIDogbmV3IGQzX2dlb19wYXRoQ29udGV4dChfKTsKICAgICAgaWYgKHR5cGVvZiBwb2ludFJhZGl1cyAhPT0gImZ1bmN0aW9uIikgY29udGV4dFN0cmVhbS5wb2ludFJhZGl1cyhwb2ludFJhZGl1cyk7CiAgICAgIHJldHVybiByZXNldCgpOwogICAgfTsKICAgIHBhdGgucG9pbnRSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBvaW50UmFkaXVzOwogICAgICBwb2ludFJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IChjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtfKSwgK18pOwogICAgICByZXR1cm4gcGF0aDsKICAgIH07CiAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgY2FjaGVTdHJlYW0gPSBudWxsOwogICAgICByZXR1cm4gcGF0aDsKICAgIH0KICAgIHJldHVybiBwYXRoLnByb2plY3Rpb24oZDMuZ2VvLmFsYmVyc1VzYSgpKS5jb250ZXh0KG51bGwpOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhQcm9qZWN0U3RyZWFtKHByb2plY3QpIHsKICAgIHZhciByZXNhbXBsZSA9IGQzX2dlb19yZXNhbXBsZShmdW5jdGlvbih4LCB5KSB7CiAgICAgIHJldHVybiBwcm9qZWN0KFsgeCAqIGQzX2RlZ3JlZXMsIHkgKiBkM19kZWdyZWVzIF0pOwogICAgfSk7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvblJhZGlhbnMocmVzYW1wbGUoc3RyZWFtKSk7CiAgICB9OwogIH0KICBkMy5nZW8udHJhbnNmb3JtID0gZnVuY3Rpb24obWV0aG9kcykgewogICAgcmV0dXJuIHsKICAgICAgc3RyZWFtOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IGQzX2dlb190cmFuc2Zvcm0oc3RyZWFtKTsKICAgICAgICBmb3IgKHZhciBrIGluIG1ldGhvZHMpIHRyYW5zZm9ybVtrXSA9IG1ldGhvZHNba107CiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybTsKICAgICAgfQogICAgfTsKICB9OwogIGZ1bmN0aW9uIGQzX2dlb190cmFuc2Zvcm0oc3RyZWFtKSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICB9CiAgZDNfZ2VvX3RyYW5zZm9ybS5wcm90b3R5cGUgPSB7CiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICB0aGlzLnN0cmVhbS5wb2ludCh4LCB5KTsKICAgIH0sCiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnN0cmVhbS5zcGhlcmUoKTsKICAgIH0sCiAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnN0cmVhbS5saW5lU3RhcnQoKTsKICAgIH0sCiAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zdHJlYW0ubGluZUVuZCgpOwogICAgfSwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgfSwKICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBkM19nZW9fdHJhbnNmb3JtUG9pbnQoc3RyZWFtLCBwb2ludCkgewogICAgcmV0dXJuIHsKICAgICAgcG9pbnQ6IHBvaW50LAogICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgICAgIHN0cmVhbS5zcGhlcmUoKTsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgIH0sCiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzdHJlYW0ucG9seWdvbkVuZCgpOwogICAgICB9CiAgICB9OwogIH0KICBkMy5nZW8ucHJvamVjdGlvbiA9IGQzX2dlb19wcm9qZWN0aW9uOwogIGQzLmdlby5wcm9qZWN0aW9uTXV0YXRvciA9IGQzX2dlb19wcm9qZWN0aW9uTXV0YXRvcjsKICBmdW5jdGlvbiBkM19nZW9fcHJvamVjdGlvbihwcm9qZWN0KSB7CiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcHJvamVjdDsKICAgIH0pKCk7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19wcm9qZWN0aW9uTXV0YXRvcihwcm9qZWN0QXQpIHsKICAgIHZhciBwcm9qZWN0LCByb3RhdGUsIHByb2plY3RSb3RhdGUsIHByb2plY3RSZXNhbXBsZSA9IGQzX2dlb19yZXNhbXBsZShmdW5jdGlvbih4LCB5KSB7CiAgICAgIHggPSBwcm9qZWN0KHgsIHkpOwogICAgICByZXR1cm4gWyB4WzBdICogayArIM60eCwgzrR5IC0geFsxXSAqIGsgXTsKICAgIH0pLCBrID0gMTUwLCB4ID0gNDgwLCB5ID0gMjUwLCDOuyA9IDAsIM+GID0gMCwgzrTOuyA9IDAsIM60z4YgPSAwLCDOtM6zID0gMCwgzrR4LCDOtHksIHByZWNsaXAgPSBkM19nZW9fY2xpcEFudGltZXJpZGlhbiwgcG9zdGNsaXAgPSBkM19pZGVudGl0eSwgY2xpcEFuZ2xlID0gbnVsbCwgY2xpcEV4dGVudCA9IG51bGwsIHN0cmVhbTsKICAgIGZ1bmN0aW9uIHByb2plY3Rpb24ocG9pbnQpIHsKICAgICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlKHBvaW50WzBdICogZDNfcmFkaWFucywgcG9pbnRbMV0gKiBkM19yYWRpYW5zKTsKICAgICAgcmV0dXJuIFsgcG9pbnRbMF0gKiBrICsgzrR4LCDOtHkgLSBwb2ludFsxXSAqIGsgXTsKICAgIH0KICAgIGZ1bmN0aW9uIGludmVydChwb2ludCkgewogICAgICBwb2ludCA9IHByb2plY3RSb3RhdGUuaW52ZXJ0KChwb2ludFswXSAtIM60eCkgLyBrLCAozrR5IC0gcG9pbnRbMV0pIC8gayk7CiAgICAgIHJldHVybiBwb2ludCAmJiBbIHBvaW50WzBdICogZDNfZGVncmVlcywgcG9pbnRbMV0gKiBkM19kZWdyZWVzIF07CiAgICB9CiAgICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1bmN0aW9uKG91dHB1dCkgewogICAgICBpZiAoc3RyZWFtKSBzdHJlYW0udmFsaWQgPSBmYWxzZTsKICAgICAgc3RyZWFtID0gZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zKHByZWNsaXAocm90YXRlLCBwcm9qZWN0UmVzYW1wbGUocG9zdGNsaXAob3V0cHV0KSkpKTsKICAgICAgc3RyZWFtLnZhbGlkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHN0cmVhbTsKICAgIH07CiAgICBwcm9qZWN0aW9uLmNsaXBBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xpcEFuZ2xlOwogICAgICBwcmVjbGlwID0gXyA9PSBudWxsID8gKGNsaXBBbmdsZSA9IF8sIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuKSA6IGQzX2dlb19jbGlwQ2lyY2xlKChjbGlwQW5nbGUgPSArXykgKiBkM19yYWRpYW5zKTsKICAgICAgcmV0dXJuIGludmFsaWRhdGUoKTsKICAgIH07CiAgICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsaXBFeHRlbnQ7CiAgICAgIGNsaXBFeHRlbnQgPSBfOwogICAgICBwb3N0Y2xpcCA9IF8gPyBkM19nZW9fY2xpcEV4dGVudChfWzBdWzBdLCBfWzBdWzFdLCBfWzFdWzBdLCBfWzFdWzFdKSA6IGQzX2lkZW50aXR5OwogICAgICByZXR1cm4gaW52YWxpZGF0ZSgpOwogICAgfTsKICAgIHByb2plY3Rpb24uc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGs7CiAgICAgIGsgPSArXzsKICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICB9OwogICAgcHJvamVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgeCwgeSBdOwogICAgICB4ID0gK19bMF07CiAgICAgIHkgPSArX1sxXTsKICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICB9OwogICAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgzrsgKiBkM19kZWdyZWVzLCDPhiAqIGQzX2RlZ3JlZXMgXTsKICAgICAgzrsgPSBfWzBdICUgMzYwICogZDNfcmFkaWFuczsKICAgICAgz4YgPSBfWzFdICUgMzYwICogZDNfcmFkaWFuczsKICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICB9OwogICAgcHJvamVjdGlvbi5yb3RhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgzrTOuyAqIGQzX2RlZ3JlZXMsIM60z4YgKiBkM19kZWdyZWVzLCDOtM6zICogZDNfZGVncmVlcyBdOwogICAgICDOtM67ID0gX1swXSAlIDM2MCAqIGQzX3JhZGlhbnM7CiAgICAgIM60z4YgPSBfWzFdICUgMzYwICogZDNfcmFkaWFuczsKICAgICAgzrTOsyA9IF8ubGVuZ3RoID4gMiA/IF9bMl0gJSAzNjAgKiBkM19yYWRpYW5zIDogMDsKICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICB9OwogICAgZDMucmViaW5kKHByb2plY3Rpb24sIHByb2plY3RSZXNhbXBsZSwgInByZWNpc2lvbiIpOwogICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgIHByb2plY3RSb3RhdGUgPSBkM19nZW9fY29tcG9zZShyb3RhdGUgPSBkM19nZW9fcm90YXRpb24ozrTOuywgzrTPhiwgzrTOsyksIHByb2plY3QpOwogICAgICB2YXIgY2VudGVyID0gcHJvamVjdCjOuywgz4YpOwogICAgICDOtHggPSB4IC0gY2VudGVyWzBdICogazsKICAgICAgzrR5ID0geSArIGNlbnRlclsxXSAqIGs7CiAgICAgIHJldHVybiBpbnZhbGlkYXRlKCk7CiAgICB9CiAgICBmdW5jdGlvbiBpbnZhbGlkYXRlKCkgewogICAgICBpZiAoc3RyZWFtKSBzdHJlYW0udmFsaWQgPSBmYWxzZSwgc3RyZWFtID0gbnVsbDsKICAgICAgcmV0dXJuIHByb2plY3Rpb247CiAgICB9CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHByb2plY3QgPSBwcm9qZWN0QXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgcHJvamVjdGlvbi5pbnZlcnQgPSBwcm9qZWN0LmludmVydCAmJiBpbnZlcnQ7CiAgICAgIHJldHVybiByZXNldCgpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zKHN0cmVhbSkgewogICAgcmV0dXJuIGQzX2dlb190cmFuc2Zvcm1Qb2ludChzdHJlYW0sIGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgc3RyZWFtLnBvaW50KHggKiBkM19yYWRpYW5zLCB5ICogZDNfcmFkaWFucyk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2VxdWlyZWN0YW5ndWxhcijOuywgz4YpIHsKICAgIHJldHVybiBbIM67LCDPhiBdOwogIH0KICAoZDMuZ2VvLmVxdWlyZWN0YW5ndWxhciA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19lcXVpcmVjdGFuZ3VsYXIpOwogIH0pLnJhdyA9IGQzX2dlb19lcXVpcmVjdGFuZ3VsYXIuaW52ZXJ0ID0gZDNfZ2VvX2VxdWlyZWN0YW5ndWxhcjsKICBkMy5nZW8ucm90YXRpb24gPSBmdW5jdGlvbihyb3RhdGUpIHsKICAgIHJvdGF0ZSA9IGQzX2dlb19yb3RhdGlvbihyb3RhdGVbMF0gJSAzNjAgKiBkM19yYWRpYW5zLCByb3RhdGVbMV0gKiBkM19yYWRpYW5zLCByb3RhdGUubGVuZ3RoID4gMiA/IHJvdGF0ZVsyXSAqIGQzX3JhZGlhbnMgOiAwKTsKICAgIGZ1bmN0aW9uIGZvcndhcmQoY29vcmRpbmF0ZXMpIHsKICAgICAgY29vcmRpbmF0ZXMgPSByb3RhdGUoY29vcmRpbmF0ZXNbMF0gKiBkM19yYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIGQzX3JhZGlhbnMpOwogICAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXM7CiAgICB9CiAgICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CiAgICAgIGNvb3JkaW5hdGVzID0gcm90YXRlLmludmVydChjb29yZGluYXRlc1swXSAqIGQzX3JhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogZDNfcmFkaWFucyk7CiAgICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlczsKICAgIH07CiAgICByZXR1cm4gZm9yd2FyZDsKICB9OwogIGZ1bmN0aW9uIGQzX2dlb19pZGVudGl0eVJvdGF0aW9uKM67LCDPhikgewogICAgcmV0dXJuIFsgzrsgPiDPgCA/IM67IC0gz4QgOiDOuyA8IC3PgCA/IM67ICuM3O9WhpcBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LeFAAEAGfPzAqAc2wKgHYJUnH/Xbkng3OVL+/IAQB5OYowAAAQEICgCjXr8ATaW6jNzvVoaXAQBaKwAAWisAAGj3KB/SxQgAJ60eEwgARQArTDceQABABkinwKgHYMCoBzYf9ZUnOVL+/NuSeDeAGADtuyUAAAEBCAoATaW6AKNevyDPhCA6IM67LCDPhiBdOwogIH0KICBkM19nZW9faWRlbnRpdHlSb3RhdGlvbi5pbnZlcnQgPSBkM19nZW9fZXF1aXJlY3Rhbmd1bGFyOwogIGZ1bmN0aW9uIGQzX2dlb19yb3RhdGlvbijOtM67LCDOtM+GLCDOtM6zKSB7CiAgICByZXR1cm4gzrTOuyA/IM60z4YgfHwgzrTOsyA/IGQzX2dlb19jb21wb3NlKGQzX2dlb19yb3RhdGlvbs67KM60zrspLCBkM19nZW9fcm90YXRpb27Phs6zKM60z4YsIM60zrMpKSA6IGQzX2dlb19yb3RhdGlvbs67KM60zrspIDogzrTPhiB8fCDOtM6zID8gZDNfZ2VvX3JvdGF0aW9uz4bOsyjOtM+GLCDOtM6zKSA6IGQzX2dlb19pZGVudGl0eVJvdGF0aW9uOwogIH0KICBmdW5jdGlvbiBkM19nZW9fZm9yd2FyZFJvdGF0aW9uzrsozrTOuykgewogICAgcmV0dXJuIGZ1bmN0aW9uKM67LCDPhikgewogICAgICByZXR1cm4gzrsgKz0gzrTOuywgWyDOuyA+IM+AID8gzrsgLSDPhCA6IM67IDwgLc+AID8gzrsgKyDPhCA6IM67LCDPhiBdOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3JvdGF0aW9uzrsozrTOuykgewogICAgdmFyIHJvdGF0aW9uID0gZDNfZ2VvX2ZvcndhcmRSb3RhdGlvbs67KM60zrspOwogICAgcm90YXRpb24uaW52ZXJ0ID0gZDNfZ2VvX2ZvcndhcmRSb3RhdGlvbs67KC3OtM67KTsKICAgIHJldHVybiByb3RhdGlvbjsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX3JvdGF0aW9uz4bOsyjOtM+GLCDOtM6zKSB7CiAgICB2YXIgY29zzrTPhiA9IE1hdGguY29zKM60z4YpLCBzaW7OtM+GID0gTWF0aC5zaW4ozrTPhiksIGNvc860zrMgPSBNYXRoLmNvcyjOtM6zKSwgc2luzrTOsyA9IE1hdGguc2luKM60zrMpOwogICAgZnVuY3Rpb24gcm90YXRpb24ozrssIM+GKSB7CiAgICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GKSwgeCA9IE1hdGguY29zKM67KSAqIGNvc8+GLCB5ID0gTWF0aC5zaW4ozrspICogY29zz4YsIHogPSBNYXRoLnNpbijPhiksIGsgPSB6ICogY29zzrTPhiArIHggKiBzaW7OtM+GOwogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHkgKiBjb3POtM6zIC0gayAqIHNpbs60zrMsIHggKiBjb3POtM+GIC0geiAqIHNpbs60z4YpLCBkM19hc2luKGsgKiBjb3POtM6zICsgeSAqIHNpbs60zrMpIF07CiAgICB9CiAgICByb3RhdGlvbi5pbnZlcnQgPSBmdW5jdGlvbijOuywgz4YpIHsKICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YpLCB4ID0gTWF0aC5jb3MozrspICogY29zz4YsIHkgPSBNYXRoLnNpbijOuykgKiBjb3PPhiwgeiA9IE1hdGguc2luKM+GKSwgayA9IHogKiBjb3POtM6zIC0geSAqIHNpbs60zrM7CiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeSAqIGNvc860zrMgKyB6ICogc2luzrTOsywgeCAqIGNvc860z4YgKyBrICogc2luzrTPhiksIGQzX2FzaW4oayAqIGNvc860z4YgLSB4ICogc2luzrTPhikgXTsKICAgIH07CiAgICByZXR1cm4gcm90YXRpb247CiAgfQogIGQzLmdlby5jaXJjbGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBvcmlnaW4gPSBbIDAsIDAgXSwgYW5nbGUsIHByZWNpc2lvbiA9IDYsIGludGVycG9sYXRlOwogICAgZnVuY3Rpb24gY2lyY2xlKCkgewogICAgICB2YXIgY2VudGVyID0gdHlwZW9mIG9yaWdpbiA9PT0gImZ1bmN0aW9uIiA/IG9yaWdpbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogb3JpZ2luLCByb3RhdGUgPSBkM19nZW9fcm90YXRpb24oLWNlbnRlclswXSAqIGQzX3JhZGlhbnMsIC1jZW50ZXJbMV0gKiBkM19yYWRpYW5zLCAwKS5pbnZlcnQsIHJpbmcgPSBbXTsKICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgewogICAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgICByaW5nLnB1c2goeCA9IHJvdGF0ZSh4LCB5KSk7CiAgICAgICAgICB4WzBdICo9IGQzX2RlZ3JlZXMsIHhbMV0gKj0gZDNfZGVncmVlczsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6ICJQb2x5Z29uIiwKICAgICAgICBjb29yZGluYXRlczogWyByaW5nIF0KICAgICAgfTsKICAgIH0KICAgIGNpcmNsZS5vcmlnaW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjsKICAgICAgb3JpZ2luID0geDsKICAgICAgcmV0dXJuIGNpcmNsZTsKICAgIH07CiAgICBjaXJjbGUuYW5nbGUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFuZ2xlOwogICAgICBpbnRlcnBvbGF0ZSA9IGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZSgoYW5nbGUgPSAreCkgKiBkM19yYWRpYW5zLCBwcmVjaXNpb24gKiBkM19yYWRpYW5zKTsKICAgICAgcmV0dXJuIGNpcmNsZTsKICAgIH07CiAgICBjaXJjbGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcmVjaXNpb247CiAgICAgIGludGVycG9sYXRlID0gZDNfZ2VvX2NpcmNsZUludGVycG9sYXRlKGFuZ2xlICogZDNfcmFkaWFucywgKHByZWNpc2lvbiA9ICtfKSAqIGQzX3JhZGlhbnMpOwogICAgICByZXR1cm4gY2lyY2xlOwogICAgfTsKICAgIHJldHVybiBjaXJjbGUuYW5nbGUoOTApOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX2NpcmNsZUludGVycG9sYXRlKHJhZGl1cywgcHJlY2lzaW9uKSB7CiAgICB2YXIgY3IgPSBNYXRoLmNvcyhyYWRpdXMpLCBzciA9IE1hdGguc2luKHJhZGl1cyk7CiAgICByZXR1cm4gZnVuY3Rpb24oZnJvbSwgdG8sIGRpcmVjdGlvbiwgbGlzdGVuZXIpIHsKICAgICAgdmFyIHN0ZXAgPSBkaXJlY3Rpb24gKiBwcmVjaXNpb247CiAgICAgIGlmIChmcm9tICE9IG51bGwpIHsKICAgICAgICBmcm9tID0gZDNfZ2VvX2NpcmNsZUFuZ2xlKGNyLCBmcm9tKTsKICAgICAgICB0byA9IGQzX2dlb19jaXJjbGVBbmdsZShjciwgdG8pOwogICAgICAgIGlmIChkaXJlY3Rpb24gPiAwID8gZnJvbSA8IHRvIDogZnJvbSA+IHRvKSBmcm9tICs9IGRpcmVjdGlvbiAqIM+EOwogICAgICB9IGVsc2UgewogICAgICAgIGZyb20gPSByYWRpdXMgKyBkaXJlY3Rpb24gKiDPhDsKICAgICAgICB0byA9IHJhZGl1cyAtIC41ICogc3RlcDsKICAgICAgfQogICAgICBmb3IgKHZhciBwb2ludCwgdCA9IGZyb207IGRpcmVjdGlvbiA+IDAgPyB0ID4gdG8gOiB0IDwgdG87IHQgLT0gc3RlcCkgewogICAgICAgIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IGQzX2dlb19zcGhlcmljYWwoWyBjciwgLXNyICogTWF0aC5jb3ModCksIC1zciAqIE1hdGguc2luKHQpIF0pKVswXSwgcG9pbnRbMV0pOwogICAgICB9CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19nZW9fY2lyY2xlQW5nbGUoY3IsIHBvaW50KSB7CiAgICB2YXIgYSA9IGQzX2dlb19jYXJ0ZXNpYW4ocG9pbnQpOwogICAgYVswXSAtPSBjcjsKICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoYSk7CiAgICB2YXIgYW5nbGUgPSBkM19hY29zKC1hWzFdKTsKICAgIHJldHVybiAoKC1hWzJdIDwgMCA/IC1hbmdsZSA6IGFuZ2xlKSArIDIgKiBNYXRoLlBJIC0gzrUpICUgKDIgKiBNYXRoLlBJKTsKICB9CiAgZDMuZ2VvLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIM6UzrsgPSAoYlswXSAtIGFbMF0pICogZDNfcmFkaWFucywgz4YwID0gYVsxXSAqIGQzX3JhZGlhbnMsIM+GMSA9IGJbMV0gKiBkM19yYWRpYW5zLCBzaW7OlM67ID0gTWF0aC5zaW4ozpTOuyksIGNvc86UzrsgPSBNYXRoLmNvcyjOlM67KSwgc2luz4YwID0gTWF0aC5zaW4oz4YwKSwgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgc2luz4YxID0gTWF0aC5zaW4oz4YxKSwgY29zz4YxID0gTWF0aC5jb3Moz4YxKSwgdDsKICAgIHJldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgodCA9IGNvc8+GMSAqIHNpbs6UzrspICogdCArICh0ID0gY29zz4YwICogc2luz4YxIC0gc2luz4YwICogY29zz4YxICogY29zzpTOuykgKiB0KSwgc2luz4YwICogc2luz4YxICsgY29zz4YwICogY29zz4YxICogY29zzpTOuyk7CiAgfTsKICBkMy5nZW8uZ3JhdGljdWxlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgeDEsIHgwLCBYMSwgWDAsIHkxLCB5MCwgWTEsIFkwLCBkeCA9IDEwLCBkeSA9IGR4LCBEWCA9IDkwLCBEWSA9IDM2MCwgeCwgeSwgWCwgWSwgcHJlY2lzaW9uID0gMi41OwogICAgZnVuY3Rpb24gZ3JhdGljdWxlKCkgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6ICJNdWx0aUxpbmVTdHJpbmciLAogICAgICAgIGNvb3JkaW5hdGVzOiBsaW5lcygpCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lcygpIHsKICAgICAgcmV0dXJuIGQzLnJhbmdlKE1hdGguY2VpbChYMCAvIERYKSAqIERYLCBYMSwgRFgpLm1hcChYKS5jb25jYXQoZDMucmFuZ2UoTWF0aC5jZWlsKFkwIC8gRFkpICogRFksIFkxLCBEWSkubWFwKFkpKS5jb25jYXQoZDMucmFuZ2UoTWF0aC5jZWlsKHgwIC8gZHgpICogZHgsIHgxLCBkeCkuZmlsdGVyKGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYWJzKHggJSBEWCkgPiDOtTsKICAgICAgfSkubWFwKHgpKS5jb25jYXQoZDMucmFuZ2UoTWF0aC5jZWlsKHkwIC8gZHkpICogZHksIHkxLCBkeSkuZmlsdGVyKGZ1bmN0aW9uKHkpIHsKICAgICAgICByZXR1cm4gYWJzKHkgJSBEWSkgPiDOtTsKICAgICAgfSkubWFwKHkpKTsKICAgIH0KICAgIGdyYXRpY3VsZS5saW5lcyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbGluZXMoKS5tYXAoZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIkxpbmVTdHJpbmciLAogICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzCiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9OwogICAgZ3JhdGljdWxlLm91dGxpbmUgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiAiUG9seWdvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFsgWChYMCkuY29uY2F0KFkoWTEpLnNsaWNlKDEpLCBYKFgxKS5yZXZlcnNlKCkuc2xpY2UoMSksIFkoWTApLnJldmVyc2UoKS5zbGljZSgxKSkgXQogICAgICB9OwogICAgfTsKICAgIGdyYXRpY3VsZS5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5taW5vckV4dGVudCgpOwogICAgICByZXR1cm4gZ3JhdGljdWxlLm1ham9yRXh0ZW50KF8pLm1pbm9yRXh0ZW50KF8pOwogICAgfTsKICAgIGdyYXRpY3VsZS5tYWpvckV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBbIFgwLCBZMCBdLCBbIFgxLCBZMSBdIF07CiAgICAgIFgwID0gK19bMF1bMF0sIFgxID0gK19bMV1bMF07CiAgICAgIFkwID0gK19bMF1bMV0sIFkxID0gK19bMV1bMV07CiAgICAgIGlmIChYMCA+IFgxKSBfID0gWDAsIFgwID0gWDEsIFgxID0gXzsKICAgICAgaWYgKFkwID4gWTEpIF8gPSBZMCwgWTAgPSBZMSwgWTEgPSBfOwogICAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pOwogICAgfTsKICAgIGdyYXRpY3VsZS5taW5vckV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBbIHgwLCB5MCBdLCBbIHgxLCB5MSBdIF07CiAgICAgIHgwID0gK19bMF1bMF0sIHgxID0gK19bMV1bMF07CiAgICAgIHkwID0gK19bMF1bMV0sIHkxID0gK19bMV1bMV07CiAgICAgIGlmICh4MCA+IHgxKSBfID0geDAsIHgwID0geDEsIHgxID0gXzsKICAgICAgaWYgKHkwID4geTEpIF8gPSB5MCwgeTAgPSB5MSwgeTEgPSBfOwogICAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pOwogICAgfTsKICAgIGdyYXRpY3VsZS5zdGVwID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF0aWN1bGUubWlub3JTdGVwKCk7CiAgICAgIHJldHVybiBncmF0aWN1bGUubWFqb3JTdGVwKF8pLm1pbm9yU3RlcChfKTsKICAgIH07CiAgICBncmF0aWN1bGUubWFqb3JTdGVwID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIERYLCBEWSBdOwogICAgICBEWCA9ICtfWzBdLCBEWSA9ICtfWzFdOwogICAgICByZXR1cm4gZ3JhdGljdWxlOwogICAgfTsKICAgIGdyYXRpY3VsZS5taW5vclN0ZXAgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgZHgsIGR5IF07CiAgICAgIGR4ID0gK19bMF0sIGR5ID0gK19bMV07CiAgICAgIHJldHVybiBncmF0aWN1bGU7CiAgICB9OwogICAgZ3JhdGljdWxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJlY2lzaW9uOwogICAgICBwcmVjaXNpb24gPSArXzsKICAgICAgeCA9IGQzX2dlb19ncmF0aWN1bGVYKHkwLCB5MSwgOTApOwogICAgICB5ID0gZDNfZ2VvX2dyYXRpY3VsZVkoeDAsIHgxLCBwcmVjaXNpb24pOwogICAgICBYID0gZDNfZ2VvX2dyYXRpY3VsZVgoWTAsIFkxLCA5MCk7CiAgICAgIFkgPSBkM19nZW9fZ3JhdGljdWxlWShYMCwgWDEsIHByZWNpc2lvbik7CiAgICAgIHJldHVybiBncmF0aWN1bGU7CiAgICB9OwogICAgcmV0dXJuIGdyYXRpY3VsZS5tYWpvckV4dGVudChbIFsgLTE4MCwgLTkwICsgzrUgXSwgWyAxODAsIDkwIC0gzrUgXSBdKS5taW5vckV4dGVudChbIFsgLTE4MCwgLTgwIC0gzrUgXSwgWyAxODAsIDgwICsgzrUgXSBdKTsKICB9OwogIGZ1bmN0aW9uIGQzX2dlb19ncmF0aWN1bGVYKHkwLCB5MSwgZHkpIHsKICAgIHZhciB5ID0gZDMucmFuZ2UoeTAsIHkxIC0gzrUsIGR5KS5jb25jYXQoeTEpOwogICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIHkubWFwKGZ1bmN0aW9uKHkpIHsKICAgICAgICByZXR1cm4gWyB4LCB5IF07CiAgICAgIH0pOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvX2dyYXRpY3VsZVkoeDAsIHgxLCBkeCkgewogICAgdmFyIHggPSBkMy5yYW5nZSh4MCwgeDEgLSDOtSwgZHgpLmNvbmNhdCh4MSk7CiAgICByZXR1cm4gZnVuY3Rpb24oeSkgewogICAgICByZXR1cm4geC5tYXAoZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBbIHgsIHkgXTsKICAgICAgfSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19zb3VyY2UoZCkgewogICAgcmV0dXJuIGQuc291cmNlOwogIH0KICBmdW5jdGlvbiBkM190YXJnZXQoZCkgewogICAgcmV0dXJuIGQudGFyZ2V0OwogIH0KICBkMy5nZW8uZ3JlYXRBcmMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzb3VyY2UgPSBkM19zb3VyY2UsIHNvdXJjZV8sIHRhcmdldCA9IGQzX3RhcmdldCwgdGFyZ2V0XzsKICAgIGZ1bmN0aW9uIGdyZWF0QXJjKCkgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6ICJMaW5lU3RyaW5nIiwKICAgICAgICBjb29yZGluYXRlczogWyBzb3VyY2VfIHx8IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0YXJnZXRfIHx8IHRhcmdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIF0KICAgICAgfTsKICAgIH0KICAgIGdyZWF0QXJjLmRpc3RhbmNlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkMy5nZW8uZGlzdGFuY2Uoc291cmNlXyB8fCBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGFyZ2V0XyB8fCB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICB9OwogICAgZ3JlYXRBcmMuc291cmNlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7CiAgICAgIHNvdXJjZSA9IF8sIHNvdXJjZV8gPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IG51bGwgOiBfOwogICAgICByZXR1cm4gZ3JlYXRBcmM7CiAgICB9OwogICAgZ3JlYXRBcmMudGFyZ2V0ID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IF8sIHRhcmdldF8gPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IG51bGwgOiBfOwogICAgICByZXR1cm4gZ3JlYXRBcmM7CiAgICB9OwogICAgZ3JlYXRBcmMucHJlY2lzaW9uID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZ3JlYXRBcmMgOiAwOwogICAgfTsKICAgIHJldHVybiBncmVhdEFyYzsKICB9OwogIGQzLmdlby5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KSB7CiAgICByZXR1cm4gZDNfZ2VvX2ludGVycG9sYXRlKHNvdXJjZVswXSAqIGQzX3JhZGlhbnMsIHNvdXJjZVsxXSAqIGQzX3JhZGlhbnMsIHRhcmdldFswXSAqIGQzX3JhZGlhbnMsIHRhcmdldFsxXSAqIGQzX3JhZGlhbnMpOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvX2ludGVycG9sYXRlKHgwLCB5MCwgeDEsIHkxKSB7CiAgICB2YXIgY3kwID0gTWF0aC5jb3MoeTApLCBzeTAgPSBNYXRoLnNpbih5MCksIGN5MSA9IE1hdGguY29zKHkxKSwgc3kxID0gTWF0aC5zaW4oeTEpLCBreDAgPSBjeTAgKiBNYXRoLmNvcyh4MCksIGt5MCA9IGN5MCAqIE1hdGguc2luKHgwKSwga3gxID0gY3kxICogTWF0aC5jb3MoeDEpLCBreTEgPSBjeTEgKiBNYXRoLnNpbih4MSksIGQgPSAyICogTWF0aC5hc2luKE1hdGguc3FydChkM19oYXZlcnNpbih5MSAtIHkwKSArIGN5MCAqIGN5MSAqIGQzX2hhdmVyc2luKHgxIC0geDApKSksIGsgPSAxIC8gTWF0aC5zaW4oZCk7CiAgICB2YXIgaW50ZXJwb2xhdGUgPSBkID8gZnVuY3Rpb24odCkgewogICAgICB2YXIgQiA9IE1hdGguc2luKHQgKj0gZCkgKiBrLCBBID0gTWF0aC5zaW4oZCAtIHQpICogaywgeCA9IEEgKiBreDAgKyBCICoga3gxLCB5ID0gQSAqIGt5MCArIEIgKiBreTEsIHogPSBBICogc3kwICsgQiAqIHN5MTsKICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih5LCB4KSAqIGQzX2RlZ3JlZXMsIE1hdGguYXRhbjIoeiwgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpKSAqIGQzX2RlZ3JlZXMgXTsKICAgIH0gOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFsgeDAgKiBkM19kZWdyZWVzLCB5MCAqIGQzX2RlZ3JlZXMgXTsKICAgIH07CiAgICBpbnRlcnBvbGF0ZS5kaXN0YW5jZSA9IGQ7CiAgICByZXR1cm4gaW50ZXJwb2xhdGU7CiAgfQogIGQzLmdlby5sZW5ndGggPSBmdW5jdGlvbihvYmplY3QpIHsKICAgIGQzX2dlb19sZW5ndGhTdW0gPSAwOwogICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGQzX2dlb19sZW5ndGgpOwogICAgcmV0dXJuIGQzX2dlb19sZW5ndGhTdW07CiAgfTsKICB2YXIgZDNfZ2VvX2xlbmd0aFN1bTsKICB2YXIgZDNfZ2VvX2xlbmd0aCA9IHsKICAgIHNwaGVyZTogZDNfbm9vcCwKICAgIHBvaW50OiBkM19ub29wLAogICAgbGluZVN0YXJ0OiBkM19nZW9fbGVuZ3RoTGluZVN0YXJ0LAogICAgbGluZUVuZDogZDNfbm9vcCwKICAgIHBvbHlnb25TdGFydDogZDNfbm9vcCwKICAgIHBvbHlnb25FbmQ6IGQzX25vb3AKICB9OwogIGZ1bmN0aW9uIGQzX2dlb19sZW5ndGhMaW5lU3RhcnQoKSB7CiAgICB2YXIgzrswLCBzaW7PhjAsIGNvc8+GMDsKICAgIGQzX2dlb19sZW5ndGgucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHsKICAgICAgzrswID0gzrsgKiBkM19yYWRpYW5zLCBzaW7PhjAgPSBNYXRoLnNpbijPhiAqPSBkM19yYWRpYW5zKSwgY29zz4YwID0gTWF0aC5jb3Moz4YpOwogICAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gbmV4dFBvaW50OwogICAgfTsKICAgIGQzX2dlb19sZW5ndGgubGluZUVuZCA9IGZ1bmN0aW9uKCkgewogICAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gZDNfZ2VvX2xlbmd0aC5saW5lRW5kID0gZDNfbm9vcDsKICAgIH07CiAgICBmdW5jdGlvbiBuZXh0UG9pbnQozrssIM+GKSB7CiAgICAgIHZhciBzaW7PhiA9IE1hdGguc2luKM+GICo9IGQzX3JhZGlhbnMpLCBjb3PPhiA9IE1hdGguY29zKM+GKSwgdCA9IGFicygozrsgKj0gZDNfcmFkaWFucykgLSDOuzApLCBjb3POlM67ID0gTWF0aC5jb3ModCk7CiAgICAgIGQzX2dlb19sZW5ndGhTdW0gKz0gTWF0aC5hdGFuMihNYXRoLnNxcnQoKHQgPSBjb3PPhiAqIE1hdGguc2luKHQpKSAqIHQgKyAodCA9IGNvc8+GMCAqIHNpbs+GIC0gc2luz4YwICogY29zz4YgKiBjb3POlM67KSAqIHQpLCBzaW7PhjAgKiBzaW7PhiArIGNvc8+GMCAqIGNvc8+GICogY29zzpTOuyk7CiAgICAgIM67MCA9IM67LCBzaW7PhjAgPSBzaW7PhiwgY29zz4YwID0gY29zz4Y7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2dlb19hemltdXRoYWwoc2NhbGUsIGFuZ2xlKSB7CiAgICBmdW5jdGlvbiBhemltdXRoYWwozrssIM+GKSB7CiAgICAgIHZhciBjb3POuyA9IE1hdGguY29zKM67KSwgY29zz4YgPSBNYXRoLmNvcyjPhiksIGsgPSBzY2FsZShjb3POuyAqIGNvc8+GKTsKICAgICAgcmV0dXJuIFsgayAqIGNvc8+GICogTWF0aC5zaW4ozrspLCBrICogTWF0aC5zaW4oz4YpIF07CiAgICB9CiAgICBhemltdXRoYWwuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICB2YXIgz4EgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSksIGMgPSBhbmdsZSjPgSksIHNpbmMgPSBNYXRoLnNpbihjKSwgY29zYyA9IE1hdGguY29zKGMpOwogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHggKiBzaW5jLCDPgSAqIGNvc2MpLCBNYXRoLmFzaW4oz4EgJiYgeSAqIHNpbmMgLyDPgSkgXTsKICAgIH07CiAgICByZXR1cm4gYXppbXV0aGFsOwogIH0KICB2YXIgZDNfZ2VvX2F6aW11dGhhbEVxdWFsQXJlYSA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oY29zzrtjb3PPhikgewogICAgcmV0dXJuIE1hdGguc3FydCgyIC8gKDEgKyBjb3POu2Nvc8+GKSk7CiAgfSwgZnVuY3Rpb24oz4EpIHsKICAgIHJldHVybiAyICogTWF0aC5hc2luKM+BIC8gMik7CiAgfSk7CiAgKGQzLmdlby5hemltdXRoYWxFcXVhbEFyZWEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fYXppbXV0aGFsRXF1YWxBcmVhKTsKICB9KS5yYXcgPSBkM19nZW9fYXppbXV0aGFsRXF1YWxBcmVhOwogIHZhciBkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHsKICAgIHZhciBjID0gTWF0aC5hDQqM3O9WuZcBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LeJAAEAGfPvAqAc2wKgHYJUnH/Xbkng3OVMqFIAQCD9s3wAAAQEICgCjXr8ATaW6jNzvVjyeAQBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNNYQABABndcwKgHYMCoBzYf9ZUiQbcVcFh6fNOAEAFT8DUAAAEBCAoATaW7AKNevjdGRTgNCiAgICAgICBtZXRob2Q6ICdnZXQnLAogICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3QsCiAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlCiAgICAgIH07CiAgICAgIHZhciBoZWFkZXJzID0gbWVyZ2VIZWFkZXJzKHJlcXVlc3RDb25maWcpOwoKICAgICAgaWYgKCFhbmd1bGFyLmlzT2JqZWN0KHJlcXVlc3RDb25maWcpKSB7CiAgICAgICAgdGhyb3cgbWluRXJyKCckaHR0cCcpKCdiYWRyZXEnLCAnSHR0cCByZXF1ZXN0IGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhbiBvYmplY3QuICBSZWNlaXZlZDogezB9JywgcmVxdWVzdENvbmZpZyk7CiAgICAgIH0KCiAgICAgIGV4dGVuZChjb25maWcsIHJlcXVlc3RDb25maWcpOwogICAgICBjb25maWcuaGVhZGVycyA9IGhlYWRlcnM7CiAgICAgIGNvbmZpZy5tZXRob2QgPSB1cHBlcmNhc2UoY29uZmlnLm1ldGhvZCk7CgogICAgICB2YXIgc2VydmVyUmVxdWVzdCA9IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICAgIGhlYWRlcnMgPSBjb25maWcuaGVhZGVyczsKICAgICAgICB2YXIgcmVxRGF0YSA9IHRyYW5zZm9ybURhdGEoY29uZmlnLmRhdGEsIGhlYWRlcnNHZXR0ZXIoaGVhZGVycyksIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0KTsKCiAgICAgICAgLy8gc3RyaXAgY29udGVudC10eXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkCiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHJlcURhdGEpKSB7CiAgICAgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKHZhbHVlLCBoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKGxvd2VyY2FzZShoZWFkZXIpID09PSAnY29udGVudC10eXBlJykgewogICAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNVbmRlZmluZWQoY29uZmlnLndpdGhDcmVkZW50aWFscykgJiYgIWlzVW5kZWZpbmVkKGRlZmF1bHRzLndpdGhDcmVkZW50aWFscykpIHsKICAgICAgICAgIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgPSBkZWZhdWx0cy53aXRoQ3JlZGVudGlhbHM7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kIHJlcXVlc3QKICAgICAgICByZXR1cm4gc2VuZFJlcShjb25maWcsIHJlcURhdGEsIGhlYWRlcnMpLnRoZW4odHJhbnNmb3JtUmVzcG9uc2UsIHRyYW5zZm9ybVJlc3BvbnNlKTsKICAgICAgfTsKCiAgICAgIHZhciBjaGFpbiA9IFtzZXJ2ZXJSZXF1ZXN0LCB1bmRlZmluZWRdOwogICAgICB2YXIgcHJvbWlzZSA9ICRxLndoZW4oY29uZmlnKTsKCiAgICAgIC8vIGFwcGx5IGludGVyY2VwdG9ycwogICAgICBmb3JFYWNoKHJldmVyc2VkSW50ZXJjZXB0b3JzLCBmdW5jdGlvbihpbnRlcmNlcHRvcikgewogICAgICAgIGlmIChpbnRlcmNlcHRvci5yZXF1ZXN0IHx8IGludGVyY2VwdG9yLnJlcXVlc3RFcnJvcikgewogICAgICAgICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5yZXF1ZXN0LCBpbnRlcmNlcHRvci5yZXF1ZXN0RXJyb3IpOwogICAgICAgIH0KICAgICAgICBpZiAoaW50ZXJjZXB0b3IucmVzcG9uc2UgfHwgaW50ZXJjZXB0b3IucmVzcG9uc2VFcnJvcikgewogICAgICAgICAgY2hhaW4ucHVzaChpbnRlcmNlcHRvci5yZXNwb25zZSwgaW50ZXJjZXB0b3IucmVzcG9uc2VFcnJvcik7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHdoaWxlIChjaGFpbi5sZW5ndGgpIHsKICAgICAgICB2YXIgdGhlbkZuID0gY2hhaW4uc2hpZnQoKTsKICAgICAgICB2YXIgcmVqZWN0Rm4gPSBjaGFpbi5zaGlmdCgpOwoKICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHRoZW5GbiwgcmVqZWN0Rm4pOwogICAgICB9CgogICAgICBwcm9taXNlLnN1Y2Nlc3MgPSBmdW5jdGlvbihmbikgewogICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgZm4ocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLCBjb25maWcpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICB9OwoKICAgICAgcHJvbWlzZS5lcnJvciA9IGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgcHJvbWlzZS50aGVuKG51bGwsIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICBmbihyZXNwb25zZS5kYXRhLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIGNvbmZpZyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgIH07CgogICAgICByZXR1cm4gcHJvbWlzZTsKCiAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICAgICAgLy8gbWFrZSBhIGNvcHkgc2luY2UgdGhlIHJlc3BvbnNlIG11c3QgYmUgY2FjaGVhYmxlCiAgICAgICAgdmFyIHJlc3AgPSBleHRlbmQoe30sIHJlc3BvbnNlKTsKICAgICAgICBpZiAoIXJlc3BvbnNlLmRhdGEpIHsKICAgICAgICAgIHJlc3AuZGF0YSA9IHJlc3BvbnNlLmRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3AuZGF0YSA9IHRyYW5zZm9ybURhdGEocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UuaGVhZGVycywgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChpc1N1Y2Nlc3MocmVzcG9uc2Uuc3RhdHVzKSkKICAgICAgICAgID8gcmVzcAogICAgICAgICAgOiAkcS5yZWplY3QocmVzcCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lcmdlSGVhZGVycyhjb25maWcpIHsKICAgICAgICB2YXIgZGVmSGVhZGVycyA9IGRlZmF1bHRzLmhlYWRlcnMsCiAgICAgICAgICAgIHJlcUhlYWRlcnMgPSBleHRlbmQoe30sIGNvbmZpZy5oZWFkZXJzKSwKICAgICAgICAgICAgZGVmSGVhZGVyTmFtZSwgbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSwgcmVxSGVhZGVyTmFtZTsKCiAgICAgICAgZGVmSGVhZGVycyA9IGV4dGVuZCh7fSwgZGVmSGVhZGVycy5jb21tb24sIGRlZkhlYWRlcnNbbG93ZXJjYXNlKGNvbmZpZy5tZXRob2QpXSk7CgogICAgICAgIC8vIHVzaW5nIGZvci1pbiBpbnN0ZWFkIG9mIGZvckVhY2ggdG8gYXZvaWQgdW5lY2Vzc2FyeSBpdGVyYXRpb24gYWZ0ZXIgaGVhZGVyIGhhcyBiZWVuIGZvdW5kCiAgICAgICAgZGVmYXVsdEhlYWRlcnNJdGVyYXRpb246CiAgICAgICAgZm9yIChkZWZIZWFkZXJOYW1lIGluIGRlZkhlYWRlcnMpIHsKICAgICAgICAgIGxvd2VyY2FzZURlZkhlYWRlck5hbWUgPSBsb3dlcmNhc2UoZGVmSGVhZGVyTmFtZSk7CgogICAgICAgICAgZm9yIChyZXFIZWFkZXJOYW1lIGluIHJlcUhlYWRlcnMpIHsKICAgICAgICAgICAgaWYgKGxvd2VyY2FzZShyZXFIZWFkZXJOYW1lKSA9PT0gbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSkgewogICAgICAgICAgICAgIGNvbnRpbnVlIGRlZmF1bHRIZWFkZXJzSXRlcmF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmVxSGVhZGVyc1tkZWZIZWFkZXJOYW1lXSA9IGRlZkhlYWRlcnNbZGVmSGVhZGVyTmFtZV07CiAgICAgICAgfQoKICAgICAgICAvLyBleGVjdXRlIGlmIGhlYWRlciB2YWx1ZSBpcyBhIGZ1bmN0aW9uIGZvciBtZXJnZWQgaGVhZGVycwogICAgICAgIGV4ZWNIZWFkZXJzKHJlcUhlYWRlcnMpOwogICAgICAgIHJldHVybiByZXFIZWFkZXJzOwoKICAgICAgICBmdW5jdGlvbiBleGVjSGVhZGVycyhoZWFkZXJzKSB7CiAgICAgICAgICB2YXIgaGVhZGVyQ29udGVudDsKCiAgICAgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKGhlYWRlckZuLCBoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oaGVhZGVyRm4pKSB7CiAgICAgICAgICAgICAgaGVhZGVyQ29udGVudCA9IGhlYWRlckZuKCk7CiAgICAgICAgICAgICAgaWYgKGhlYWRlckNvbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaGVhZGVyc1toZWFkZXJdID0gaGVhZGVyQ29udGVudDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgICRodHRwLnBlbmRpbmdSZXF1ZXN0cyA9IFtdOwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJGh0dHAjZ2V0CiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgR0VUYCByZXF1ZXN0LgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0CiAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdAogICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0CiAgICAgKi8KCiAgICAvKioKICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAqIEBuYW1lICRodHRwI2RlbGV0ZQogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYERFTEVURWAgcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAogICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdAogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkaHR0cCNoZWFkCiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgSEVBRGAgcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAogICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdAogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkaHR0cCNqc29ucAogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYEpTT05QYCByZXF1ZXN0LgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0LgogICAgICogICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHRoZSBzdHJpbmcgYEpTT05fQ0FMTEJBQ0tgLgogICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdAogICAgICovCiAgICBjcmVhdGVTaG9ydE1ldGhvZHMoJ2dldCcsICdkZWxldGUnLCAnaGVhZCcsICdqc29ucCcpOwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJGh0dHAjcG9zdAogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYFBPU1RgIHJlcXVlc3QuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkwgc3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3QKICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBSZXF1ZXN0IGNvbnRlbnQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0CiAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3QKICAgICAqLwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJGh0dHAjcHV0CiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgUFVUYCByZXF1ZXN0LgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0CiAgICAgKiBAcGFyYW0geyp9IGRhdGEgUmVxdWVzdCBjb250ZW50CiAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdAogICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0CiAgICAgKi8KCiAgICAgLyoqCiAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAqIEBuYW1lICRodHRwI3BhdGNoCiAgICAgICoKICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgUEFUQ0hgIHJlcXVlc3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAogICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBSZXF1ZXN0IGNvbnRlbnQKICAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdAogICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdAogICAgICAqLwogICAgY3JlYXRlU2hvcnRNZXRob2RzV2l0aERhdGEoJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJyk7CgogICAgICAgIC8qKgogICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eQogICAgICAgICAqIEBuYW1lICRodHRwI2RlZmF1bHRzCiAgICAgICAgICoKICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgKiBSdW50aW1lIGVxdWl2YWxlbnQgb2YgdGhlIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzYCBwcm9wZXJ0eS4gQWxsb3dzIGNvbmZpZ3VyYXRpb24gb2YKICAgICAgICAgKiBkZWZhdWx0IGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscyBhcyB3ZWxsIGFzIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIFNlZSAiU2V0dGluZyBIVFRQIEhlYWRlcnMiIGFuZCAiVHJhbnNmb3JtaW5nIFJlcXVlc3RzIGFuZCBSZXNwb25zZXMiIHNlY3Rpb25zIGFib3ZlLgogICAgICAgICAqLwogICAgJGh0dHAuZGVmYXVsdHMgPSBkZWZhdWx0czsKCgogICAgcmV0dXJuICRodHRwOwoKCiAgICBmdW5jdGlvbiBjcmVhdGVTaG9ydE1ldGhvZHMobmFtZXMpIHsKICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAkaHR0cFtuYW1lXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7CiAgICAgICAgICByZXR1cm4gJGh0dHAoZXh0ZW5kKGNvbmZpZyB8fCB7fSwgewogICAgICAgICAgICBtZXRob2Q6IG5hbWUsCiAgICAgICAgICAgIHVybDogdXJsCiAgICAgICAgICB9KSk7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGNyZWF0ZVNob3J0TWV0aG9kc1dpdGhEYXRhKG5hbWUpIHsKICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAkaHR0cFtuYW1lXSA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgY29uZmlnKSB7CiAgICAgICAgICByZXR1cm4gJGh0dHAoZXh0ZW5kKGNvbmZpZyB8fCB7fSwgewogICAgICAgICAgICBtZXRob2Q6IG5hbWUsCiAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICBkYXRhOiBkYXRhCiAgICAgICAgICB9KSk7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CgoKICAgIC8qKgogICAgICogTWFrZXMgdGhlIHJlcXVlc3QuCiAgICAgKgogICAgICogISEhIEFDQ0VTU0VTIENMT1NVUkUgVkFSUzoKICAgICAqICRodHRwQmFja2VuZCwgZGVmYXVsdHMsICRsb2csICRyb290U2NvcGUsIGRlZmF1bHRDYWNoZSwgJGh0dHAucGVuZGluZ1JlcXVlc3RzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNlbmRSZXEoY29uZmlnLCByZXFEYXRhLCByZXFIZWFkZXJzKSB7CiAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCksCiAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSwKICAgICAgICAgIGNhY2hlLAogICAgICAgICAgY2FjaGVkUmVzcCwKICAgICAgICAgIHVybCA9IGJ1aWxkVXJsKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMpOwoKICAgICAgJGh0dHAucGVuZGluZ1JlcXVlc3RzLnB1c2goY29uZmlnKTsKICAgICAgcHJvbWlzZS50aGVuKHJlbW92ZVBlbmRpbmdSZXEsIHJlbW92ZVBlbmRpbmdSZXEpOwoKCiAgICAgIGlmICgoY29uZmlnLmNhY2hlIHx8IGRlZmF1bHRzLmNhY2hlKSAmJiBjb25maWcuY2FjaGUgIT09IGZhbHNlICYmCiAgICAgICAgICAoY29uZmlnLm1ldGhvZCA9PT0gJ0dFVCcgfHwgY29uZmlnLm1ldGhvZCA9PT0gJ0pTT05QJykpIHsKICAgICAgICBjYWNoZSA9IGlzT2JqZWN0KGNvbmZpZy5jYWNoZSkgPyBjb25maWcuY2FjaGUKICAgICAgICAgICAgICA6IGlzT2JqZWN0KGRlZmF1bHRzLmNhY2hlKSA/IGRlZmF1bHRzLmNhY2hlCiAgICAgICAgICAgICAgOiBkZWZhdWx0Q2FjaGU7CiAgICAgIH0KCiAgICAgIGlmIChjYWNoZSkgewogICAgICAgIGNhY2hlZFJlc3AgPSBjYWNoZS5nZXQodXJsKTsKICAgICAgICBpZiAoaXNEZWZpbmVkKGNhY2hlZFJlc3ApKSB7CiAgICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShjYWNoZWRSZXNwKSkgewogICAgICAgICAgICAvLyBjYWNoZWQgcmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQsIGJ1dCB0aGVyZSBpcyBubyByZXNwb25zZSB5ZXQKICAgICAgICAgICAgY2FjaGVkUmVzcC50aGVuKHJlbW92ZVBlbmRpbmdSZXEsIHJlbW92ZVBlbmRpbmdSZXEpOwogICAgICAgICAgICByZXR1cm4gY2FjaGVkUmVzcDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNlcnZpbmcgZnJvbSBjYWNoZQogICAgICAgICAgICBpZiAoaXNBcnJheShjYWNoZWRSZXNwKSkgewogICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGNhY2hlZFJlc3BbMV0sIGNhY2hlZFJlc3BbMF0sIHNoYWxsb3dDb3B5KGNhY2hlZFJlc3BbMl0pLCBjYWNoZWRSZXNwWzNdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjYWNoZWRSZXNwLCAyMDAsIHt9LCAnT0snKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBwdXQgdGhlIHByb21pc2UgZm9yIHRoZSBub24tdHJhbnNmb3JtZWQgcmVzcG9uc2UgaW50byBjYWNoZSBhcyBhIHBsYWNlaG9sZGVyCiAgICAgICAgICBjYWNoZS5wdXQodXJsLCBwcm9taXNlKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvLyBpZiB3ZSB3b24ndCBoYXZlIHRoZSByZXNwb25zZSBpbiBjYWNoZSwgc2V0IHRoZSB4c3JmIGhlYWRlcnMgYW5kCiAgICAgIC8vIHNlbmQgdGhlIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQKICAgICAgaWYgKGlzVW5kZWZpbmVkKGNhY2hlZFJlc3ApKSB7CiAgICAgICAgdmFyIHhzcmZWYWx1ZSA9IHVybElzU2FtZU9yaWdpbihjb25maWcudXJsKQogICAgICAgICAgICA/ICRicm93c2VyLmNvb2tpZXMoKVtjb25maWcueHNyZkNvb2tpZU5hbWUgfHwgZGVmYXVsdHMueHNyZkNvb2tpZU5hbWVdCiAgICAgICAgICAgIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh4c3JmVmFsdWUpIHsKICAgICAgICAgIHJlcUhlYWRlcnNbKGNvbmZpZy54c3JmSGVhZGVyTmFtZSB8fCBkZWZhdWx0cy54c3JmSGVhZGVyTmFtZSldID0geHNyZlZhbHVlOwogICAgICAgIH0KCiAgICAgICAgJGh0dHBCYWNrZW5kKGNvbmZpZy5tZXRob2QsIHVybCwgcmVxRGF0YSwgZG9uZSwgcmVxSGVhZGVycywgY29uZmlnLnRpbWVvdXQsCiAgICAgICAgICAgIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMsIGNvbmZpZy5yZXNwb25zZVR5cGUpOwogICAgICB9CgogICAgICByZXR1cm4gcHJvbWlzZTsKCgogICAgICAvKioKICAgICAgICogQ2FsbGJhY2sgcmVnaXN0ZXJlZCB0byAkaHR0cEJhY2tlbmQoKToKICAgICAgICogIC0gY2FjaGVzIHRoZSByZXNwb25zZSBpZiBkZXNpcmVkCiAgICAgICAqICAtIHJlc29sdmVzIHRoZSByYXcgJGh0dHAgcHJvbWlzZQogICAgICAgKiAgLSBjYWxscyAkYXBwbHkKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGRvbmUoc3RhdHVzLCByZXNwb25zZSwgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCkgewogICAgICAgIGlmIChjYWNoZSkgewogICAgICAgICAgaWYgKGlzU3VjY2VzcyhzdGF0dXMpKSB7CiAgICAgICAgICAgIGNhY2hlLnB1dCh1cmwsIFtzdGF0dXMsIHJlc3BvbnNlLCBwYXJzZUhlYWRlcnMoaGVhZGVyc1N0cmluZyksIHN0YXR1c1RleHRdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHJlbW92ZSBwcm9taXNlIGZyb20gdGhlIGNhY2hlCiAgICAgICAgICAgIGNhY2hlLnJlbW92ZSh1cmwpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUh0dHBQcm9taXNlKCkgewogICAgICAgICAgcmVzb2x2ZVByb21pc2UocmVzcG9uc2UsIHN0YXR1cywgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCk7CiAgICAgICAgfQoKICAgICAgICBpZiAodXNlQXBwbHlBc3luYykgewogICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHlBc3luYyhyZXNvbHZlSHR0cFByb21pc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXNvbHZlSHR0cFByb21pc2UoKTsKICAgICAgICAgIGlmICghJHJvb3RTY29wZS4kJHBoYXNlKSAkcm9vdFNjb3BlLiRhcHBseSgpOwogICAgICAgIH0KICAgICAgfQoKCiAgICAgIC8qKgogICAgICAgKiBSZXNvbHZlcyB0aGUgcmF3ICRodHRwIHByb21pc2UuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZShyZXNwb25zZSwgc3RhdHVzLCBoZWFkZXJzLCBzdGF0dXNUZXh0KSB7CiAgICAgICAgLy8gbm9ybWFsaXplIGludGVybmFsIHN0YXR1c2VzIHRvIDAKICAgICAgICBzdGF0dXMgPSBNYXRoLm1heChzdGF0dXMsIDApOwoKICAgICAgICAoaXNTdWNjZXNzKHN0YXR1cykgPyBkZWZlcnJlZC5yZXNvbHZlIDogZGVmZXJyZWQucmVqZWN0KSh7CiAgICAgICAgICBkYXRhOiByZXNwb25zZSwKICAgICAgICAgIHN0YXR1czogc3RhdHVzLAogICAgICAgICAgaGVhZGVyczogaGVhZGVyc0dldHRlcihoZWFkZXJzKSwKICAgICAgICAgIGNvbmZpZzogY29uZmlnLAogICAgICAgICAgc3RhdHVzVGV4dDogc3RhdHVzVGV4dAogICAgICAgIH0pOwogICAgICB9CgoKICAgICAgZnVuY3Rpb24gcmVtb3ZlUGVuZGluZ1JlcSgpIHsKICAgICAgICB2YXIgaWR4ID0gJGh0dHAucGVuZGluZ1JlcXVlc3RzLmluZGV4T2YoY29uZmlnKTsKICAgICAgICBpZiAoaWR4ICE9PSAtMSkgJGh0dHAucGVuZGluZ1JlcXVlc3RzLnNwbGljZShpZHgsIDEpOwogICAgICB9CiAgICB9CgoKICAgIGZ1bmN0aW9uIGJ1aWxkVXJsKHVybCwgcGFyYW1zKSB7CiAgICAgIGlmICghcGFyYW1zKSByZXR1cm4gdXJsOwogICAgICB2YXIgcGFydHMgPSBbXTsKICAgICAgZm9yRWFjaFNvcnRlZChwYXJhbXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47CiAgICAgICAgaWYgKCFpc0FycmF5KHZhbHVlKSkgdmFsdWUgPSBbdmFsdWVdOwoKICAgICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbih2KSB7CiAgICAgICAgICBpZiAoaXNPYmplY3QodikpIHsKICAgICAgICAgICAgaWYgKGlzRGF0ZSh2KSkgewogICAgICAgICAgICAgIHYgPSB2LnRvSVNPU3RyaW5nKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdiA9IHRvSnNvbih2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaChlbmNvZGVVcmlRdWVyeShrZXkpICsgJz0nICsKICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVXJpUXVlcnkodikpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDApIHsKICAgICAgICB1cmwgKz0gKCh1cmwuaW5kZXhPZignPycpID09IC0xKSA/ICc/JyA6ICcmJykgKyBwYXJ0cy5qb2luKCcmJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVybDsKICAgIH0KICB9XTsKfQoKZnVuY3Rpb24gY3JlYXRlWGhyKCkgewogICAgcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKfQoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRodHRwQmFja2VuZAogKiBAcmVxdWlyZXMgJHdpbmRvdwogKiBAcmVxdWlyZXMgJGRvY3VtZW50CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBIVFRQIGJhY2tlbmQgdXNlZCBieSB0aGUge0BsaW5rIG5nLiRodHRwIHNlcnZpY2V9IHRoYXQgZGVsZWdhdGVzIHRvCiAqIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCBvciBKU09OUCBhbmQgZGVhbHMgd2l0aCBicm93c2VyIGluY29tcGF0aWJpbGl0aWVzLgogKgogKiBZb3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gdXNlIHRoaXMgc2VydmljZSBkaXJlY3RseSwgaW5zdGVhZCB1c2UgdGhlIGhpZ2hlci1sZXZlbCBhYnN0cmFjdGlvbnM6CiAqIHtAbGluayBuZy4kaHR0cCAkaHR0cH0gb3Ige0BsaW5rIG5nUmVzb3VyY2UuJHJlc291cmNlICRyZXNvdXJjZX0uCiAqCiAqIER1cmluZyB0ZXN0aW5nIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3dhcHBlZCB3aXRoIHtAbGluayBuZ01vY2suJGh0dHBCYWNrZW5kIG1vY2sKICogJGh0dHBCYWNrZW5kfSB3aGljaCBjYW4gYmUgdHJhaW5lZCB3aXRoIHJlc3BvbnNlcy4KICovCmZ1bmN0aW9uICRIdHRwQmFja2VuZFByb3ZpZGVyKCkgewogIHRoaXMuJGdldCA9IFsnJGJyb3dzZXInLCAnJHdpbmRvdycsICckZG9jdW1lbnQnLCBmdW5jdGlvbigkYnJvd3NlciwgJHdpbmRvdywgJGRvY3VtZW50KSB7CiAgICByZXR1cm4gY3JlYXRlSHR0cEJhY2tlbmQoJGJyb3dzZXIsIGNyZWF0ZVhociwgJGJyb3dzZXIuZGVmZXIsICR3aW5kb3cuYW5ndWxhci5jYWxsYmFja3MsICRkb2N1bWVudFswXSk7CiAgfV07Cn0KCmZ1bmN0aW9uIGNyZWF0ZUh0dHBCYWNrZW5kKCRicm93c2VyLCBjcmVhdGVYaHIsICRicm93c2VyRGVmZXIsIGNhbGxiYWNrcywgcmF3RG9jdW1lbnQpIHsKICAvLyBUT0RPKHZvanRhKTogZml4IHRoZSBzaWduYXR1cmUKICByZXR1cm4gZnVuY3Rpb24obWV0aG9kLCB1cmwsIHBvc3QsIGNhbGxiYWNrLCBoZWFkZXJzLCB0aW1lb3V0LCB3aXRoQ3JlZGVudGlhbHMsIHJlc3BvbnNlVHlwZSkgewogICAgJGJyb3dzZXIuJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudCgpOwogICAgdXJsID0gdXJsIHx8ICRicm93c2VyLnVybCgpOwoKICAgIGlmIChsb3dlcmNhc2UobWV0aG9kKSA9PSAnanNvbnAnKSB7CiAgICAgIHZhciBjYWxsYmFja0lkID0gJ18nICsgKGNhbGxiYWNrcy5jb3VudGVyKyspLnRvU3RyaW5nKDM2KTsKICAgICAgY2FsbGJhY2tzW2NhbGxiYWNrSWRdID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgIGNhbGxiYWNrc1tjYWxsYmFja0lkXS5kYXRhID0gZGF0YTsKICAgICAgICBjYWxsYmFja3NbY2FsbGJhY2tJZF0uY2FsbGVkID0gdHJ1ZTsKICAgICAgfTsKCiAgICAgIHZhciBqc29ucERvbmUgPSBqc29ucFJlcSh1cmwucmVwbGFjZSgnSlNPTl9DQUxMQkFDSycsICdhbmd1bGFyLmNhbGxiYWNrcy4nICsgY2FsbGJhY2tJZCksCiAgICAgICAgICBjYWxsYmFja0lkLCBmdW5jdGlvbihzdGF0dXMsIHRleHQpIHsKICAgICAgICBjb21wbGV0ZVJlcXVlc3QoY2FsbGJhY2ssIHN0YXR1cywgY2FsbGJhY2tzW2NhbGxiYWNrSWRdLmRhdGEsICIiLCB0ZXh0KTsKICAgICAgICBjYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBub29wOwogICAgICB9KTsKICAgIH0gZWxzZSB7CgogICAgICB2YXIgeGhyID0gY3JlYXRlWGhyKCk7CgogICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7CiAgICAgIGZvckVhY2goaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gcmVxdWVzdExvYWRlZCgpIHsKICAgICAgICB2YXIgc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0IHx8ICcnOwoKICAgICAgICAvLyByZXNwb25zZVRleHQgaXMgdGhlIG9sZC1zY2hvb2wgd2F5IG9mIHJldHJpZXZpbmcgcmVzcG9uc2UgKHN1cHBvcnRlZCBieSBJRTggJiA5KQogICAgICAgIC8vIHJlc3BvbnNlL3Jlc3BvbnNlVHlwZSBwcm9wZXJ0aWVzIHdlcmUgaW50cm9kdWNlZCBpbiBYSFIgTGV2ZWwyIHNwZWMgKHN1cHBvcnRlZCBieSBJRTEwKQogICAgICAgIHZhciByZXNwb25zZSA9ICgncmVzcG9uc2UnIGluIHhocikgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0OwoKICAgICAgICAvLyBub3JtYWxpemUgSUU5IGJ1ZyAoaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTQ1MCkKICAgICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXM7CgogICAgICAgIC8vIGZpeCBzdGF0dXMgY29kZSB3aGVuIGl0IGlzIDAgKDAgc3RhdHVzIGlzIHVuZG9jdW1lbnRlZCkuCiAgICAgICAgLy8gT2NjdXJzIHdoZW4gYWNjZXNzaW5nIGZpbGUgcmVzb3VyY2VzIG9yIG9uIEFuZHJvaWQgNC4xIHN0b2NrIGJyb3dzZXIKICAgICAgICAvLyB3aGlsZSByZXRyaWV2aW5nIGZpbGVzIGZyb20gYXBwbGljYXRpb24gY2FjaGUuCiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCkgewogICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2UgPyAyMDAgOiB1cmxSZXNvbHZlKHVybCkucHJvdG9jb2wgPT0gJ2ZpbGUnID8gNDA0IDogMDsKICAgICAgICB9CgogICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywKICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICByZXNwb25zZSwKICAgICAgICAgICAgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLAogICAgICAgICAgICBzdGF0dXNUZXh0KTsKICAgICAgfTsKCiAgICAgIHZhciByZXF1ZXN0RXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICAvLyBUaGUgcmVzcG9uc2UgaXMgYWx3YXlzIGVtcHR5CiAgICAgICAgLy8gU2VlIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1lcnJvci1zdGVwcyBhbmQgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtbmV0d29yay1lcnJvcgogICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywgLTEsIG51bGwsIG51bGwsICcnKTsKICAgICAgfTsKCiAgICAgIHhoci5vbmVycm9yID0gcmVxdWVzdEVycm9yOwogICAgICB4aHIub25hYm9ydCA9IHJlcXVlc3RFcnJvcjsKCiAgICAgIGlmICh3aXRoQ3JlZGVudGlhbHMpIHsKICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKHJlc3BvbnNlVHlwZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIC8vIFdlYktpdCBhZGRlZCBzdXBwb3J0IGZvciB0aGUganNvbiByZXNwb25zZVR5cGUgdmFsdWUgb24gMDkvMDMvMjAxMwogICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjQ4LiBWZXJzaW9ucyBvZiBTYWZhcmkgcHJpb3IgdG8gNyBhcmUKICAgICAgICAgIC8vIGtub3duIHRvIHRocm93IHdoZW4gc2V0dGluZyB0aGUgdmFsdWUgImpzb24iIGFzIHRoZSByZXNwb25zZSB0eXBlLiBPdGhlciBvbGRlcgogICAgICAgICAgLy8gYnJvd3NlcnMgaW1wbGVtZW50aW5nIHRoZSByZXNwb25zZVR5cGUKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBUaGUganNvbiByZXNwb25zZSB0eXBlIGNhbiBiZSBpZ25vcmVkIGlmIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2UgSlNPTiBwYXlsb2FkcyBhcmUKICAgICAgICAgIC8vIHBhcnNlZCBvbiB0aGUgY2xpZW50LXNpZGUgcmVnYXJkbGVzcy4KICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgIT09ICdqc29uJykgewogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgeGhyLnNlbmQocG9zdCB8fCBudWxsKTsKICAgIH0KCiAgICBpZiAodGltZW91dCA+IDApIHsKICAgICAgdmFyIHRpbWVvdXRJZCA9ICRicm93c2VyRGVmZXIodGltZW91dFJlcXVlc3QsIHRpbWVvdXQpOwogICAgfSBlbHNlIGlmIChpc1Byb21pc2VMaWtlKHRpbWVvdXQpKSB7CiAgICAgIHRpbWVvdXQudGhlbih0aW1lb3V0UmVxdWVzdCk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHRpbWVvdXRSZXF1ZXN0KCkgewogICAgICBqc29ucERvbmUgJiYganNvbnBEb25lKCk7CiAgICAgIHhociAmJiB4aHIuYWJvcnQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoY2FsbGJhY2ssIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnNTdHJpbmcsIHN0YXR1c1RleHQpIHsKICAgICAgLy8gY2FuY2VsIHRpbWVvdXQgYW5kIHN1YnNlcXVlbnQgdGltZW91dCBwcm9taXNlIHJlc29sdXRpb24KICAgICAgaWYgKHRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgJGJyb3dzZXJEZWZlci5jYW5jZWwodGltZW91dElkKTsKICAgICAgfQogICAgICBqc29ucERvbmUgPSB4aHIgPSBudWxsOwoKICAgICAgY2FsbGJhY2soc3RhdHVzLCByZXNwb25zZSwgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCk7CiAgICAgICRicm93c2VyLiQkY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3Qobm9vcCk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24ganNvbnBSZXEodXJsLCBjYWxsYmFja0lkLCBkb25lKSB7CiAgICAvLyB3ZSBjYW4ndCB1c2UgalF1ZXJ5L2pxTGl0ZSBoZXJlIGJlY2F1c2UgalF1ZXJ5IGRvZXMgY3Jhenkgc2hpdCB3aXRoIHNjcmlwdCBlbGVtZW50cywgZS5nLjoKICAgIC8vIC0gZmV0Y2hlcyBsb2NhbCBzY3JpcHRzIHZpYSBYSFIgYW5kIGV2YWxzIHRoZW0KICAgIC8vIC0gYWRkcyBhbmQgaW1tZWRpYXRlbHkgcmVtb3ZlcyBzY3JpcHQgZWxlbWVudHMgZnJvbSB0aGUgZG9jdW1lbnQKICAgIHZhciBzY3JpcHQgPSByYXdEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSwgY2FsbGJhY2sgPSBudWxsOwogICAgc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKICAgIHNjcmlwdC5zcmMgPSB1cmw7CiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlOwoKICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuKHNjcmlwdCwgImxvYWQiLCBjYWxsYmFjayk7CiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGbihzY3JpcHQsICJlcnJvciIsIGNhbGxiYWNrKTsKICAgICAgcmF3RG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JpcHQpOwogICAgICBzY3JpcHQgPSBudWxsOwogICAgICB2YXIgc3RhdHVzID0gLTE7CiAgICAgIHZhciB0ZXh0ID0gInVua25vd24iOwoKICAgICAgaWYgKGV2ZW50KSB7CiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICJsb2FkIiAmJiAhY2FsbGJhY2tzW2NhbGxiYWNrSWRdLmNhbGxlZCkgewogICAgICAgICAgZXZlbnQgPSB7IHR5cGU6ICJlcnJvciIgfTsKICAgICAgICB9CiAgICAgICAgdGV4dCA9IGV2ZW50LnR5cGU7CiAgICAgICAgc3RhdHVzID0gZXZlbnQudHlwZSA9PT0gImVycm9yIiA/IDQwNCA6IDIwMDsKICAgICAgfQoKICAgICAgaWYgKGRvbmUpIHsKICAgICAgICBkb25lKHN0YXR1cywgdGV4dCk7CiAgICAgIH0KICAgIH07CgogICAgYWRkRXZlbnRMaXN0ZW5lckZuKHNjcmlwdCwgImxvYWQiLCBjYWxsYmFjayk7CiAgICBhZGRFdmVudExpc3RlbmVyRm4oc2NyaXB0LCAiZXJyb3IiLCBjYWxsYmFjayk7CiAgICByYXdEb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICByZXR1cm4gY2FsbGJhY2s7CiAgfQp9Cgp2YXIgJGludGVycG9sYXRlTWluRXJyID0gbWluRXJyKCckaW50ZXJwb2xhdGUnKTsKCi8qKgogKiBAbmdkb2MgcHJvdmlkZXIKICogQG5hbWUgJGludGVycG9sYXRlUHJvdmlkZXIKICoKICogQGRlc2NyaXB0aW9uCiAqCiAqIFVzZWQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBpbnRlcnBvbGF0aW9uIG1hcmt1cC4gRGVmYXVsdHMgdG8gYHt7YCBhbmQgYH19YC4KICoKICogQGV4YW1wbGUKPGV4YW1wbGUgbW9kdWxlPSJjdXN0b21JbnRlcnBvbGF0aW9uQXBwIj4KPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CjxzY3JpcHQ+CiAgdmFyIGN1c3RvbUludGVycG9sYXRpb25BcHAgPSBhbmd1bGFyLm1vZHVsZSgnY3VzdG9tSW50ZXJwb2xhdGlvbkFwcCcsIFtdKTsKCiAgY3VzdG9tSW50ZXJwb2xhdGlvbkFwcC5jb25maWcoZnVuY3Rpb24oJGludGVycG9sYXRlUHJvdmlkZXIpIHsKICAgICRpbnRlcnBvbGF0ZVByb3ZpZGVyLnN0YXJ0U3ltYm9sKCcvLycpOwogICAgJGludGVycG9sYXRlUHJvdmlkZXIuZW5kU3ltYm9sKCcvLycpOwogIH0pOwoKCiAgY3VzdG9tSW50ZXJwb2xhdGlvbkFwcC5jb250cm9sbGVyKCdEZW1vQ29udHJvbGxlcicsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmxhYmVsID0gIlRoaXMgYmluZGluZyBpcyBicm91Z2h0IHlvdSBieSAvLyBpbnRlcnBvbGF0aW9uIHN5bWJvbHMuIjsKICB9KTsKPC9zY3JpcHQ+CjxkaXYgbmctYXBwPSJBcHAiIG5nLWNvbnRyb2xsZXI9IkRlbW9Db250cm9sbGVyIGFzIGRlbW8iPgogICAgLy9kZW1vLmxhYmVsLy8KPC9kaXY+CjwvZmlsZT4KPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgaXQoJ3Nob3VsZCBpbnRlcnBvbGF0ZSBiaW5kaW5nIHdpdGggY3VzdG9tIHN5bWJvbHMnLCBmdW5jdGlvbigpIHsKICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2RlbW8ubGFiZWwnKSkuZ2V0VGV4dCgpKS50b0JlKCdUaGlzIGJpbmRpbmcgaXMgYnJvdWdodCB5b3UgYnkgLy8gaW50ZXJwb2xhdGlvbiBzeW1ib2xzLicpOwogIH0pOwo8L2ZpbGU+CjwvZXhhbXBsZT4KICovCmZ1bmN0aW9uICRJbnRlcnBvbGF0ZVByb3ZpZGVyKCkgewogIHZhciBzdGFydFN5bWJvbCA9ICd7eyc7CiAgdmFyIGVuZFN5bWJvbCA9ICd9fSc7CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkaW50ZXJwb2xhdGVQcm92aWRlciNzdGFydFN5bWJvbAogICAqIEBkZXNjcmlwdGlvbgogICAqIFN5bWJvbCB0byBkZW5vdGUgc3RhcnQgb2YgZXhwcmVzc2lvbiBpbiB0aGUgaW50ZXJwb2xhdGVkIHN0cmluZy4gRGVmYXVsdHMgdG8gYHt7YC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nPX0gdmFsdWUgbmV3IHZhbHVlIHRvIHNldCB0aGUgc3RhcnRpbmcgc3ltYm9sIHRvLgogICAqIEByZXR1cm5zIHtzdHJpbmd8c2VsZn0gUmV0dXJucyB0aGUgc3ltYm9sIHdoZW4gdXNlZCBhcyBnZXR0ZXIgYW5kIHNlbGYgaWYgdXNlZCBhcyBzZXR0ZXIuCiAgICovCiAgdGhpcy5zdGFydFN5bWJvbCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBpZiAodmFsdWUpIHsKICAgICAgc3RhcnRTeW1ib2wgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3RhcnRTeW1ib2w7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRpbnRlcnBvbGF0ZVByb3ZpZGVyI2VuZFN5bWJvbAogICAqIEBkZXNjcmlwdGlvbgogICAqIFN5bWJvbCB0byBkZW5vdGUgdGhlIGVuZCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBgfX1gLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmc9fSB2YWx1ZSBuZXcgdmFsdWUgdG8gc2V0IHRoZSBlbmRpbmcgc3ltYm9sIHRvLgogICAqIEByZXR1cm5zIHtzdHJpbmd8c2VsZn0gUmV0dXJucyB0aGUgc3ltYm9sIHdoZW4gdXNlZCBhcyBnZXR0ZXIgYW5kIHNlbGYgaWYgdXNlZCBhcyBzZXR0ZXIuCiAgICovCiAgdGhpcy5lbmRTeW1ib2wgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIGVuZFN5bWJvbCA9IHZhbHVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBlbmRTeW1ib2w7CiAgICB9CiAgfTsKCgogIHRoaXMuJGdldCA9IFsnJHBhcnNlJywgJyRleGNlcHRpb25IYW5kbGVyJywgJyRzY2UnLCBmdW5jdGlvbigkcGFyc2UsICRleGNlcHRpb25IYW5kbGVyLCAkc2NlKSB7CiAgICB2YXIgc3RhcnRTeW1ib2xMZW5ndGggPSBzdGFydFN5bWJvbC5sZW5ndGgsCiAgICAgICAgZW5kU3ltYm9sTGVuZ3RoID0gZW5kU3ltYm9sLmxlbmd0aCwKICAgICAgICBlc2NhcGVkU3RhcnRSZWdleHAgPSBuZXcgUmVnRXhwKHN0YXJ0U3ltYm9sLnJlcGxhY2UoLy4vZywgZXNjYXBlKSwgJ2cnKSwKICAgICAgICBlc2NhcGVkRW5kUmVnZXhwID0gbmV3IFJlZ0V4cChlbmRTeW1ib2wucmVwbGFjZSgvLi9nLCBlc2NhcGUpLCAnZycpOwoKICAgIGZ1bmN0aW9uIGVzY2FwZShjaCkgewogICAgICByZXR1cm4gJ1xcXFxcXCcgKyBjaDsKICAgIH0KCiAgICAvKioKICAgICAqIEBuZ2RvYyBzZXJ2aWNlCiAgICAgKiBAbmFtZSAkaW50ZXJwb2xhdGUKICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgKgogICAgICogQHJlcXVpcmVzICRwYXJzZQogICAgICogQHJlcXVpcmVzICRzY2UKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBDb21waWxlcyBhIHN0cmluZyB3aXRoIG1hcmt1cCBpbnRvIGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24uIFRoaXMgc2VydmljZSBpcyB1c2VkIGJ5IHRoZQogICAgICogSFRNTCB7QGxpbmsgbmcuJGNvbXBpbGUgJGNvbXBpbGV9IHNlcnZpY2UgZm9yIGRhdGEgYmluZGluZy4gU2VlCiAgICAgKiB7QGxpbmsgbmcuJGludGVycG9sYXRlUHJvdmlkZXIgJGludGVycG9sYXRlUHJvdmlkZXJ9IGZvciBjb25maWd1cmluZyB0aGUKICAgICAqIGludGVycG9sYXRpb24gbWFya3VwLgogICAgICoKICAgICAqCiAgICAgKiBgYGBqcwogICAgICogICB2YXIgJGludGVycG9sYXRlID0gLi4uOyAvLyBpbmplY3RlZAogICAgICogICB2YXIgZXhwID0gJGludGVycG9sYXRlKCdIZWxsbyB7e25hbWUgfCB1cHBlcmNhc2V9fSEnKTsKICAgICAqICAgZXhwZWN0KGV4cCh7bmFtZTonQW5ndWxhcid9KS50b0VxdWFsKCdIZWxsbyBBTkdVTEFSIScpOwogICAgICogYGBgCiAgICAgKgogICAgICogYCRpbnRlcnBvbGF0ZWAgdGFrZXMgYW4gb3B0aW9uYWwgZm91cnRoIGFyZ3VtZW50LCBgYWxsT3JOb3RoaW5nYC4gSWYgYGFsbE9yTm90aGluZ2AgaXMKICAgICAqIGB0cnVlYCwgdGhlIGludGVycG9sYXRpb24gZnVuY3Rpb24gd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgdW5sZXNzIGFsbCBlbWJlZGRlZCBleHByZXNzaW9ucwogICAgICogZXZhbHVhdGUgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLgogICAgICoKICAgICAqIGBgYGpzCiAgICAgKiAgIHZhciAkaW50ZXJwb2xhdGUgPSAuLi47IC8vIGluamVjdGVkCiAgICAgKiAgIHZhciBjb250ZXh0ID0ge2dyZWV0aW5nOiAnSGVsbG8nLCBuYW1lOiB1bmRlZmluZWQgfTsKICAgICAqCiAgICAgKiAgIC8vIGRlZmF1bHQgImZvcmdpdmluZyIgbW9kZQogICAgICogICB2YXIgZXhwID0gJGludGVycG9sYXRlKCd7e2dyZWV0aW5nfX0ge3tuYW1lfX0hJyk7CiAgICAgKiAgIGV4cGVjdChleHAoY29udGV4dCkpLnRvRXF1YWwoJ0hlbGxvICEnKTsKICAgICAqCiAgICAgKiAgIC8vICJhbGxPck5vdGhpbmciIG1vZGUKICAgICAqICAgZXhwID0gJGludGVycG9sYXRlKCd7e2dyZWV0aW5nfX0ge3tuYW1lfX0hJywgZmFsc2UsIG51bGwsIHRydWUpOwogICAgICogICBleHBlY3QoZXhwKGNvbnRleHQpKS50b0JlVW5kZWZpbmVkKCk7CiAgICAgKiAgIGNvbnRleHQubmFtZSA9ICdBbmd1bGFyJzsKICAgICAqICAgZXhwZWN0KGV4cChjb250ZXh0KSkudG9FcXVhbCgnSGVsbG8gQW5ndWxhciEnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIGBhbGxPck5vdGhpbmdgIGlzIHVzZWZ1bCBmb3IgaW50ZXJwb2xhdGluZyBVUkxzLiBgbmdTcmNgIGFuZCBgbmdTcmNzZXRgIHVzZSB0aGlzIGJlaGF2aW9yLgogICAgICoKICAgICAqICMjIyNFc2NhcGVkIEludGVycG9sYXRpb24KICAgICAqICRpbnRlcnBvbGF0ZSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZXNjYXBpbmcgaW50ZXJwb2xhdGlvbiBtYXJrZXJzLiBTdGFydCBhbmQgZW5kIG1hcmtlcnMKICAgICAqIGNhbiBiZSBlc2NhcGVkIGJ5IHByZWNlZGluZyBlYWNoIG9mIHRoZWlyIGNoYXJhY3RlcnMgd2l0aCBhIFJFVkVSU0UgU09MSURVUyBVKzAwNUMgKGJhY2tzbGFzaCkuCiAgICAgKiBJdCB3aWxsIGJlIHJlbmRlcmVkIGFzIGEgcmVndWxhciBzdGFydC9lbmQgbWFya2VyLCBhbmQgd2lsbCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gZXhwcmVzc2lvbgogICAgICogb3IgYmluZGluZy4KICAgICAqCiAgICAgKiBUaGlzIGVuYWJsZXMgd2ViLXNlcnZlcnMgdG8gcHJldmVudCBzY3JpcHQgaW5qZWN0aW9uIGF0dGFja3MgYW5kIGRlZmFjaW5nIGF0dGFja3MsIHRvIHNvbWUKICAgICAqIGRlZ3JlZSwgd2hpbGUgYWxzbyBlbmFibGluZyBjb2RlIGV4YW1wbGVzIHRvIHdvcmsgd2l0aG91dCByZWx5aW5nIG9uIHRoZQogICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ05vbkJpbmRhYmxlIG5nTm9uQmluZGFibGV9IGRpcmVjdGl2ZS4KICAgICAqCiAgICAgKiAqKkZvciBzZWN1cml0eSBwdXJwb3NlcywgaXQgaXMgc3Ryb25nbHkgZW5jb3VyYWdlZCB0aGF0IHdlYiBzZXJ2ZXJzIGVzY2FwZSB1c2VyLXN1cHBsaWVkIGRhdGEsCiAgICAgKiByZXBsYWNpbmcgYW5nbGUgYnJhY2tldHMgKCZsdDssICZndDspIHdpdGggJmFtcDtsdDsgYW5kICZhbXA7Z3Q7IHJlc3BlY3RpdmVseSwgYW5kIHJlcGxhY2luZyBhbGwKICAgICAqIGludGVycG9sYXRpb24gc3RhcnQvZW5kIG1hcmtlcnMgd2l0aCB0aGVpciBlc2NhcGVkIGNvdW50ZXJwYXJ0cy4qKgogICAgICoKICAgICAqIEVzY2FwZWQgaW50ZXJwb2xhdGlvbiBtYXJrZXJzIGFyZSBvbmx5IHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIG1hcmtlcnMgaW4gcmVuZGVyZWQKICAgICAqIG91dHB1dCB3aGVuIHRoZSAkaW50ZXJwb2xhdGUgc2VydmljZSBwcm9jZXNzZXMgdGhlIHRleHQuIFNvLCBmb3IgSFRNTCBlbGVtZW50cyBpbnRlcnBvbGF0ZWQKICAgICAqIGJ5IHtAbGluayBuZy4kY29tcGlsZSAkY29tcGlsZX0sIG9yIG90aGVyd2lzZSBpbnRlcnBvbGF0ZWQgd2l0aCB0aGUgYG11c3RIYXZlRXhwcmVzc2lvbmAgcGFyYW1ldGVyCiAgICAgKiBzZXQgdG8gYHRydWVgLCB0aGUgaW50ZXJwb2xhdGVkIHRleHQgbXVzdCBjb250YWluIGFuIHVuZXNjYXBlZCBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24uIEFzIHN1Y2gsCiAgICAgKiB0aGlzIGlzIHR5cGljYWxseSB1c2VmdWwgb25seSB3aGVuIHVzZXItZGF0YSBpcyB1c2VkIGluIHJlbmRlcmluZyBhIHRlbXBsYXRlIGZyb20gdGhlIHNlcnZlciwgb3IKICAgICAqIHdoZW4gb3RoZXJ3aXNlIHVudHJ1c3RlZCBkYXRhIGlzIHVzZWQgYnkgYSBkaXJlY3RpdmUuCiAgICAgKgogICAgICogPGV4YW1wbGU+CiAgICAgKiAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgKiAgICA8ZGl2IG5nLWluaXQ9InVzZXJuYW1lPSdBIHVzZXInIj4KICAgICAqICAgICAgPHAgbmctaW5pdD0iYXBwdGl0bGU9J0VzY2FwaW5nIGRlbW8nIj57e2FwcHRpdGxlfX06IFx7XHsgdXNlcm5hbWUgPSAiZGVmYWNlZCB2YWx1ZSI7IFx9XH0KICAgICAqICAgICAgICA8L3A+CiAgICAgKiAgICAgIDxwPjxzdHJvbmc+e3t1c2VybmFtZX19PC9zdHJvbmc+IGF0dGVtcHRzIHRvIGluamVjdCBjb2RlIHdoaWNoIHdpbGwgZGVmYWNlIHRoZQogICAgICogICAgICAgIGFwcGxpY2F0aW9uLCBidXQgZmFpbHMgdG8gYWNjb21wbGlzaCB0aGVpciB0YXNrLCBiZWNhdXNlIHRoZSBzZXJ2ZXIgaGFzIGNvcnJlY3RseQogICAgICogICAgICAgIGVzY2FwZWQgdGhlIGludGVycG9sYXRpb24gc3RhcnQvZW5kIG1hcmtlcnMgd2l0aCBSRVZFUlNFIFNPTElEVVMgVSswMDVDIChiYWNrc2xhc2gpCiAgICAgKiAgICAgICAgY2hhcmFjdGVycy48L3A+CiAgICAgKiAgICAgIDxwPkluc3RlYWQsIHRoZSByZXN1bHQgb2YgdGhlIGF0dGVtcHRlZCBzY3JpcHQgaW5qZWN0aW9uIGlzIHZpc2libGUsIGFuZCBjYW4gYmUgcmVtb3ZlZAogICAgICogICAgICAgIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGFuIGFkbWluaXN0cmF0b3IuPC9wPgogICAgICogICAgPC9kaXY+CiAgICAgKiAgPC9maWxlPgogICAgICogPC9leGFtcGxlPgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHdpdGggbWFya3VwIHRvIGludGVycG9sYXRlLgogICAgICogQHBhcmFtIHtib29sZWFuPX0gbXVzdEhhdmVFeHByZXNzaW9uIGlmIHNldCB0byB0cnVlIHRoZW4gdGhlIGludGVycG9sYXRpb24gc3RyaW5nIG11c3QgaGF2ZQogICAgICogICAgZW1iZWRkZWQgZXhwcmVzc2lvbiBpbiBvcmRlciB0byByZXSM3O9Wm54BAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/802lAAEAGt6vAqAdgwKgHNh/1lSJBt3WYWHp804AYAVOv1QAAAQEICgBNpbsAo16+dXJuIGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24uIFN0cmluZ3Mgd2l0aCBubwogICAgICogICAgZW1iZWRkZWQgZXhwcmVzc2lvbiB3aWxsIHJldHVybiBudWxsIGZvciB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gdHJ1c3RlZENvbnRleHQgd2hlbiBwcm92aWRlZCwgdGhlIHJldHVybmVkIGZ1bmN0aW9uIHBhc3NlcyB0aGUgaW50ZXJwb2xhdGVkCiAgICAgKiAgICByZXN1bHQgdGhyb3VnaCB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkICRzY2UuZ2V0VHJ1c3RlZChpbnRlcnBvbGF0ZWRSZXN1bHQsCiAgICAgKiAgICB0cnVzdGVkQ29udGV4dCl9IGJlZm9yZSByZXR1cm5pbmcgaXQuICBSZWZlciB0byB0aGUge0BsaW5rIG5nLiRzY2UgJHNjZX0gc2VydmljZSB0aGF0CiAgICAgKiAgICBwcm92aWRlcyBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyBmb3IgZGV0YWlscy4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGFsbE9yTm90aGluZyBpZiBgdHJ1ZWAsIHRoZW4gdGhlIHJldHVybmVkIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkCiAgICAgKiAgICB1bmxlc3MgYWxsIGVtYmVkZGVkIGV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBgdW5kZWZpbmVkYC4KICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0KX0gYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlCiAgICAgKiAgICBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBUaGUgZnVuY3Rpb24gaGFzIHRoZXNlIHBhcmFtZXRlcnM6CiAgICAgKgogICAgICogLSBgY29udGV4dGA6IGV2YWx1YXRpb24gY29udGV4dCBmb3IgYWxsIGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBpbnRlcnBvbGF0ZWQgdGV4dAogICAgICovCiAgICBmdW5jdGlvbiAkaW50ZXJwb2xhdGUodGV4dCwgbXVzdEhhdmVFeHByZXNzaW9uLCB0cnVzdGVkQ29udGV4dCwgYWxsT3JOb3RoaW5nKSB7CiAgICAgIGFsbE9yTm90aGluZyA9ICEhYWxsT3JOb3RoaW5nOwogICAgICB2YXIgc3RhcnRJbmRleCwKICAgICAgICAgIGVuZEluZGV4LAogICAgICAgICAgaW5kZXggPSAwLAogICAgICAgICAgZXhwcmVzc2lvbnMgPSBbXSwKICAgICAgICAgIHBhcnNlRm5zID0gW10sCiAgICAgICAgICB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGgsCiAgICAgICAgICBleHAsCiAgICAgICAgICBjb25jYXQgPSBbXSwKICAgICAgICAgIGV4cHJlc3Npb25Qb3NpdGlvbnMgPSBbXTsKCiAgICAgIHdoaWxlIChpbmRleCA8IHRleHRMZW5ndGgpIHsKICAgICAgICBpZiAoKChzdGFydEluZGV4ID0gdGV4dC5pbmRleE9mKHN0YXJ0U3ltYm9sLCBpbmRleCkpICE9IC0xKSAmJgogICAgICAgICAgICAgKChlbmRJbmRleCA9IHRleHQuaW5kZXhPZihlbmRTeW1ib2wsIHN0YXJ0SW5kZXggKyBzdGFydFN5bWJvbExlbmd0aCkpICE9IC0xKSkgewogICAgICAgICAgaWYgKGluZGV4ICE9PSBzdGFydEluZGV4KSB7CiAgICAgICAgICAgIGNvbmNhdC5wdXNoKHVuZXNjYXBlVGV4dCh0ZXh0LnN1YnN0cmluZyhpbmRleCwgc3RhcnRJbmRleCkpKTsKICAgICAgICAgIH0KICAgICAgICAgIGV4cCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0SW5kZXggKyBzdGFydFN5bWJvbExlbmd0aCwgZW5kSW5kZXgpOwogICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChleHApOwogICAgICAgICAgcGFyc2VGbnMucHVzaCgkcGFyc2UoZXhwLCBwYXJzZVN0cmluZ2lmeUludGVyY2VwdG9yKSk7CiAgICAgICAgICBpbmRleCA9IGVuZEluZGV4ICsgZW5kU3ltYm9sTGVuZ3RoOwogICAgICAgICAgZXhwcmVzc2lvblBvc2l0aW9ucy5wdXNoKGNvbmNhdC5sZW5ndGgpOwogICAgICAgICAgY29uY2F0LnB1c2goJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyB3ZSBkaWQgbm90IGZpbmQgYW4gaW50ZXJwb2xhdGlvbiwgc28gd2UgaGF2ZSB0byBhZGQgdGhlIHJlbWFpbmRlciB0byB0aGUgc2VwYXJhdG9ycyBhcnJheQogICAgICAgICAgaWYgKGluZGV4ICE9PSB0ZXh0TGVuZ3RoKSB7CiAgICAgICAgICAgIGNvbmNhdC5wdXNoKHVuZXNjYXBlVGV4dCh0ZXh0LnN1YnN0cmluZyhpbmRleCkpKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQ29uY2F0ZW5hdGluZyBleHByZXNzaW9ucyBtYWtlcyBpdCBoYXJkIHRvIHJlYXNvbiBhYm91dCB3aGV0aGVyIHNvbWUgY29tYmluYXRpb24gb2YKICAgICAgLy8gY29uY2F0ZW5hdGVkIHZhbHVlcyBhcmUgdW5zYWZlIHRvIHVzZSBhbmQgY291bGQgZWFzaWx5IGxlYWQgdG8gWFNTLiAgQnkgcmVxdWlyaW5nIHRoYXQgYQogICAgICAvLyBzaW5nbGUgZXhwcmVzc2lvbiBiZSB1c2VkIGZvciBpZnJhbWVbc3JjXSwgb2JqZWN0W3NyY10sIGV0Yy4sIHdlIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZQogICAgICAvLyB0aGF0J3MgdXNlZCBpcyBhc3NpZ25lZCBvciBjb25zdHJ1Y3RlZCBieSBzb21lIEpTIGNvZGUgc29tZXdoZXJlIHRoYXQgaXMgbW9yZSB0ZXN0YWJsZSBvcgogICAgICAvLyBtYWtlIGl0IG9idmlvdXMgdGhhdCB5b3UgYm91bmQgdGhlIHZhbHVlIHRvIHNvbWUgdXNlciBjb250cm9sbGVkIHZhbHVlLiAgVGhpcyBoZWxwcyByZWR1Y2UKICAgICAgLy8gdGhlIGxvYWQgd2hlbiBhdWRpdGluZyBmb3IgWFNTIGlzc3Vlcy4KICAgICAgaWYgKHRydXN0ZWRDb250ZXh0ICYmIGNvbmNhdC5sZW5ndGggPiAxKSB7CiAgICAgICAgICB0aHJvdyAkaW50ZXJwb2xhdGVNaW5FcnIoJ25vY29uY2F0JywKICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgaW50ZXJwb2xhdGluZzogezB9XG5TdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyBkaXNhbGxvd3MgIiArCiAgICAgICAgICAgICAgImludGVycG9sYXRpb25zIHRoYXQgY29uY2F0ZW5hdGUgbXVsdGlwbGUgZXhwcmVzc2lvbnMgd2hlbiBhIHRydXN0ZWQgdmFsdWUgaXMgIiArCiAgICAgICAgICAgICAgInJlcXVpcmVkLiAgU2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRzY2UiLCB0ZXh0KTsKICAgICAgfQoKICAgICAgaWYgKCFtdXN0SGF2ZUV4cHJlc3Npb24gfHwgZXhwcmVzc2lvbnMubGVuZ3RoKSB7CiAgICAgICAgdmFyIGNvbXB1dGUgPSBmdW5jdGlvbih2YWx1ZXMpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGV4cHJlc3Npb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFsbE9yTm90aGluZyAmJiBpc1VuZGVmaW5lZCh2YWx1ZXNbaV0pKSByZXR1cm47CiAgICAgICAgICAgIGNvbmNhdFtleHByZXNzaW9uUG9zaXRpb25zW2ldXSA9IHZhbHVlc1tpXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjb25jYXQuam9pbignJyk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIGdldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiB0cnVzdGVkQ29udGV4dCA/CiAgICAgICAgICAgICRzY2UuZ2V0VHJ1c3RlZCh0cnVzdGVkQ29udGV4dCwgdmFsdWUpIDoKICAgICAgICAgICAgJHNjZS52YWx1ZU9mKHZhbHVlKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgc3RyaW5naWZ5ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7IC8vIG51bGwgfHwgdW5kZWZpbmVkCiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6CiAgICAgICAgICAgICAgdmFsdWUgPSAnJyArIHZhbHVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHZhbHVlID0gdG9Kc29uKHZhbHVlKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiBpbnRlcnBvbGF0aW9uRm4oY29udGV4dCkgewogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIHZhciBpaSA9IGV4cHJlc3Npb25zLmxlbmd0aDsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShpaSk7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGZvciAoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gcGFyc2VGbnNbaV0oY29udGV4dCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZSh2YWx1ZXMpOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICB2YXIgbmV3RXJyID0gJGludGVycG9sYXRlTWluRXJyKCdpbnRlcnInLCAiQ2FuJ3QgaW50ZXJwb2xhdGU6IHswfVxuezF9IiwgdGV4dCwKICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKG5ld0Vycik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICB9LCB7CiAgICAgICAgICAvLyBhbGwgb2YgdGhlc2UgcHJvcGVydGllcyBhcmUgdW5kb2N1bWVudGVkIGZvciBub3cKICAgICAgICAgIGV4cDogdGV4dCwgLy9qdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggcmVndWxhciB3YXRjaGVycyBjcmVhdGVkIHZpYSAkd2F0Y2gKICAgICAgICAgIGV4cHJlc3Npb25zOiBleHByZXNzaW9ucywKICAgICAgICAgICQkd2F0Y2hEZWxlZ2F0ZTogZnVuY3Rpb24oc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSkgewogICAgICAgICAgICB2YXIgbGFzdFZhbHVlOwogICAgICAgICAgICByZXR1cm4gc2NvcGUuJHdhdGNoR3JvdXAocGFyc2VGbnMsIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaGVyKHZhbHVlcywgb2xkVmFsdWVzKSB7CiAgICAgICAgICAgICAgdmFyIGN1cnJWYWx1ZSA9IGNvbXB1dGUodmFsdWVzKTsKICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcikpIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgY3VyclZhbHVlLCB2YWx1ZXMgIT09IG9sZFZhbHVlcyA/IGxhc3RWYWx1ZSA6IGN1cnJWYWx1ZSwgc2NvcGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBjdXJyVmFsdWU7CiAgICAgICAgICAgIH0sIG9iamVjdEVxdWFsaXR5KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gdW5lc2NhcGVUZXh0KHRleHQpIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKGVzY2FwZWRTdGFydFJlZ2V4cCwgc3RhcnRTeW1ib2wpLgogICAgICAgICAgcmVwbGFjZShlc2NhcGVkRW5kUmVnZXhwLCBlbmRTeW1ib2wpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZVN0cmluZ2lmeUludGVyY2VwdG9yKHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhbHVlID0gZ2V0VmFsdWUodmFsdWUpOwogICAgICAgICAgcmV0dXJuIGFsbE9yTm90aGluZyAmJiAhaXNEZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogc3RyaW5naWZ5KHZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHZhciBuZXdFcnIgPSAkaW50ZXJwb2xhdGVNaW5FcnIoJ2ludGVycicsICJDYW4ndCBpbnRlcnBvbGF0ZTogezB9XG57MX0iLCB0ZXh0LAogICAgICAgICAgICBlcnIudG9TdHJpbmcoKSk7CiAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihuZXdFcnIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKCiAgICAvKioKICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZSNzdGFydFN5bWJvbAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBTeW1ib2wgdG8gZGVub3RlIHRoZSBzdGFydCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBge3tgLgogICAgICoKICAgICAqIFVzZSB7QGxpbmsgbmcuJGludGVycG9sYXRlUHJvdmlkZXIjc3RhcnRTeW1ib2wgYCRpbnRlcnBvbGF0ZVByb3ZpZGVyLnN0YXJ0U3ltYm9sYH0gdG8gY2hhbmdlCiAgICAgKiB0aGUgc3ltYm9sLgogICAgICoKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHN0YXJ0IHN5bWJvbC4KICAgICAqLwogICAgJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzdGFydFN5bWJvbDsKICAgIH07CgoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJGludGVycG9sYXRlI2VuZFN5bWJvbAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBTeW1ib2wgdG8gZGVub3RlIHRoZSBlbmQgb2YgZXhwcmVzc2lvbiBpbiB0aGUgaW50ZXJwb2xhdGVkIHN0cmluZy4gRGVmYXVsdHMgdG8gYH19YC4KICAgICAqCiAgICAgKiBVc2Uge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyI2VuZFN5bWJvbCBgJGludGVycG9sYXRlUHJvdmlkZXIuZW5kU3ltYm9sYH0gdG8gY2hhbmdlCiAgICAgKiB0aGUgc3ltYm9sLgogICAgICoKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGVuZCBzeW1ib2wuCiAgICAgKi8KICAgICRpbnRlcnBvbGF0ZS5lbmRTeW1ib2wgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGVuZFN5bWJvbDsKICAgIH07CgogICAgcmV0dXJuICRpbnRlcnBvbGF0ZTsKICB9XTsKfQoKZnVuY3Rpb24gJEludGVydmFsUHJvdmlkZXIoKSB7CiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyR3aW5kb3cnLCAnJHEnLCAnJCRxJywKICAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICAgJHdpbmRvdywgICAkcSwgICAkJHEpIHsKICAgIHZhciBpbnRlcnZhbHMgPSB7fTsKCgogICAgIC8qKgogICAgICAqIEBuZ2RvYyBzZXJ2aWNlCiAgICAgICogQG5hbWUgJGludGVydmFsCiAgICAgICoKICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgKiBBbmd1bGFyJ3Mgd3JhcHBlciBmb3IgYHdpbmRvdy5zZXRJbnRlcnZhbGAuIFRoZSBgZm5gIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV2ZXJ5IGBkZWxheWAKICAgICAgKiBtaWxsaXNlY29uZHMuCiAgICAgICoKICAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHJlZ2lzdGVyaW5nIGFuIGludGVydmFsIGZ1bmN0aW9uIGlzIGEgcHJvbWlzZS4gVGhpcyBwcm9taXNlIHdpbGwgYmUKICAgICAgKiBub3RpZmllZCB1cG9uIGVhY2ggdGljayBvZiB0aGUgaW50ZXJ2YWwsIGFuZCB3aWxsIGJlIHJlc29sdmVkIGFmdGVyIGBjb3VudGAgaXRlcmF0aW9ucywgb3IKICAgICAgKiBydW4gaW5kZWZpbml0ZWx5IGlmIGBjb3VudGAgaXMgbm90IGRlZmluZWQuIFRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpY2F0aW9uIHdpbGwgYmUgdGhlCiAgICAgICogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCBoYXZlIHJ1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JywgWyckc2NvcGUnLCAnJGludGVydmFsJywKICAgICAgKiAgICAgICAgIGZ1bmN0aW9uKCRzY29wZSwgJGludGVydmFsKSB7CiAgICAgICogICAgICAgICAgICRzY29wZS5mb3JtYXQgPSAnTS9kL3l5IGg6bW06c3MgYSc7CiAgICAgICogICAgICAgICAgICRzY29wZS5ibG9vZF8xID0gMTAwOwogICAgICAqICAgICAgICAgICAkc2NvcGUuYmxvb2RfMiA9IDEyMDsKICAgICAgKgogICAgICAqICAgICAgICAgICB2YXIgc3RvcDsKICAgICAgKiAgICAgICAgICAgJHNjb3BlLmZpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICAgICogICAgICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgYSBuZXcgZmlnaHQgaWYgd2UgYXJlIGFscmVhZHkgZmlnaHRpbmcKICAgICAgKiAgICAgICAgICAgICBpZiAoIGFuZ3VsYXIuaXNEZWZpbmVkKHN0b3ApICkgcmV0dXJuOwogICAgICAqCiAgICAgICogICAgICAgICAgIHN0b3AgPSAkaW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICogICAgICAgICAgICAgaWYgKCRzY29wZS5ibG9vZF8xID4gMCAmJiAkc2NvcGUuYmxvb2RfMiA+IDApIHsKICAgICAgKiAgICAgICAgICAgICAgICRzY29wZS5ibG9vZF8xID0gJHNjb3BlLmJsb29kXzEgLSAzOwogICAgICAqICAgICAgICAgICAgICAgJHNjb3BlLmJsb29kXzIgPSAkc2NvcGUuYmxvb2RfMiAtIDQ7CiAgICAgICogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgKiAgICAgICAgICAgICAgICRzY29wZS5zdG9wRmlnaHQoKTsKICAgICAgKiAgICAgICAgICAgICB9CiAgICAgICogICAgICAgICAgIH0sIDEwMCk7CiAgICAgICogICAgICAgICB9OwogICAgICAqCiAgICAgICogICAgICAgICAkc2NvcGUuc3RvcEZpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICAgICogICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSkgewogICAgICAqICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoc3RvcCk7CiAgICAgICogICAgICAgICAgICAgc3RvcCA9IHVuZGVmaW5lZDsKICAgICAgKiAgICAgICAgICAgfQogICAgICAqICAgICAgICAgfTsKICAgICAgKgogICAgICAqICAgICAgICAgJHNjb3BlLnJlc2V0RmlnaHQgPSBmdW5jdGlvbigpIHsKICAgICAgKiAgICAgICAgICAgJHNjb3BlLmJsb29kXzEgPSAxMDA7CiAgICAgICogICAgICAgICAgICRzY29wZS5ibG9vZF8yID0gMTIwOwogICAgICAqICAgICAgICAgfTsKICAgICAgKgogICAgICAqICAgICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKICAgICAgKiAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGludGVydmFsIGlzIGRlc3Ryb3llZCB0b28KICAgICAgKiAgICAgICAgICAgJHNjb3BlLnN0b3BGaWdodCgpOwogICAgICAqICAgICAgICAgfSk7CiAgICAgICogICAgICAgfV0pCiAgICAgICogICAgICAgLy8gUmVnaXN0ZXIgdGhlICdteUN1cnJlbnRUaW1lJyBkaXJlY3RpdmUgZmFjdG9yeSBtZXRob2QuCiAgICAgICogICAgICAgLy8gV2UgaW5qZWN0ICRpbnRlcnZhbCBhbmQgZGF0ZUZpbHRlciBzZXJ2aWNlIHNpbmNlIHRoZSBmYWN0b3J5IG1ldGhvZCBpcyBESS4KICAgICAgKiAgICAgICAuZGlyZWN0aXZlKCdteUN1cnJlbnRUaW1lJywgWyckaW50ZXJ2YWwnLCAnZGF0ZUZpbHRlcicsCiAgICAgICogICAgICAgICBmdW5jdGlvbigkaW50ZXJ2YWwsIGRhdGVGaWx0ZXIpIHsKICAgICAgKiAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBkaXJlY3RpdmUgbGluayBmdW5jdGlvbi4gKGNvbXBpbGUgZnVuY3Rpb24gbm90IG5lZWRlZCkKICAgICAgKiAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgewogICAgICAqICAgICAgICAgICAgIHZhciBmb3JtYXQsICAvLyBkYXRlIGZvcm1hdAogICAgICAqICAgICAgICAgICAgICAgICBzdG9wVGltZTsgLy8gc28gdGhhdCB3ZSBjYW4gY2FuY2VsIHRoZSB0aW1lIHVwZGF0ZXMKICAgICAgKgogICAgICAqICAgICAgICAgICAgIC8vIHVzZWQgdG8gdXBkYXRlIHRoZSBVSQogICAgICAqICAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVRpbWUoKSB7CiAgICAgICogICAgICAgICAgICAgICBlbGVtZW50LnRleHQoZGF0ZUZpbHRlcihuZXcgRGF0ZSgpLCBmb3JtYXQpKTsKICAgICAgKiAgICAgICAgICAgICB9CiAgICAgICoKICAgICAgKiAgICAgICAgICAgICAvLyB3YXRjaCB0aGUgZXhwcmVzc2lvbiwgYW5kIHVwZGF0ZSB0aGUgVUkgb24gY2hhbmdlLgogICAgICAqICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5teUN1cnJlbnRUaW1lLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAqICAgICAgICAgICAgICAgZm9ybWF0ID0gdmFsdWU7CiAgICAgICogICAgICAgICAgICAgICB1cGRhdGVUaW1lKCk7CiAgICAgICogICAgICAgICAgICAgfSk7CiAgICAgICoKICAgICAgKiAgICAgICAgICAgICBzdG9wVGltZSA9ICRpbnRlcnZhbCh1cGRhdGVUaW1lLCAxMDAwKTsKICAgICAgKgogICAgICAqICAgICAgICAgICAgIC8vIGxpc3RlbiBvbiBET00gZGVzdHJveSAocmVtb3ZhbCkgZXZlbnQsIGFuZCBjYW5jZWwgdGhlIG5leHQgVUkgdXBkYXRlCiAgICAgICogICAgICAgICAgICAgLy8gdG8gcHJldmVudCB1cGRhdGluZyB0aW1lIGFmdGVyIHRoZSBET00gZWxlbWVudCB3YXMgcmVtb3ZlZC4KICAgICAgKiAgICAgICAgICAgICBlbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkgewogICAgICAqICAgICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbChzdG9wVGltZSk7CiAgICAgICogICAgICAgICAgICAgfSk7CiAgICAgICogICAgICAgICAgIH0KICAgICAgKiAgICAgICAgIH1dKTsKICAgICAgKiAgIDwvc2NyaXB0PgogICAgICAqCiAgICAgICogICA8ZGl2PgogICAgICAqICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgKiAgICAgICBEYXRlIGZvcm1hdDogPGlucHV0IG5nLW1vZGVsPSJmb3JtYXQiPiA8aHIvPgogICAgICAqICAgICAgIEN1cnJlbnQgdGltZSBpczogPHNwYW4gbXktY3VycmVudC10aW1lPSJmb3JtYXQiPjwvc3Bhbj4KICAgICAgKiAgICAgICA8aHIvPgogICAgICAqICAgICAgIEJsb29kIDEgOiA8Zm9udCBjb2xvcj0ncmVkJz57e2Jsb29kXzF9fTwvZm9udD4KICAgICAgKiAgICAgICBCbG9vZCAyIDogPGZvbnQgY29sb3I9J3JlZCc+e3tibG9vZF8yfX08L2ZvbnQ+CiAgICAgICogICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbmctY2xpY2s9ImZpZ2h0KCkiPkZpZ2h0PC9idXR0b24+CiAgICAgICogICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbmctY2xpY2s9InN0b3BGaWdodCgpIj5TdG9wRmlnaHQ8L2J1dHRvbj4KICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uZy1jbGljaz0icmVzZXRGaWdodCgpIj5yZXNldEZpZ2h0PC9idXR0b24+CiAgICAgICogICAgIDwvZGl2PgogICAgICAqICAgPC9kaXY+CiAgICAgICoKICAgICAgKiA8L2ZpbGU+CiAgICAgICogPC9leGFtcGxlPgogICAgICAqLwogICAgZnVuY3Rpb24gaW50ZXJ2YWwoZm4sIGRlbGF5LCBjb3VudCwgaW52b2tlQXBwbHkpIHsKICAgICAgdmFyIHNldEludGVydmFsID0gJHdpbmRvdy5zZXRJbnRlcnZhbCwKICAgICAgICAgIGNsZWFySW50ZXJ2YWwgPSAkd2luZG93LmNsZWFySW50ZXJ2YWwsCiAgICAgICAgICBpdGVyYXRpb24gPSAwLAogICAgICAgICAgc2tpcEFwcGx5ID0gKGlzRGVmaW5lZChpbnZva2VBcHBseSkgJiYgIWludm9rZUFwcGx5KSwKICAgICAgICAgIGRlZmVycmVkID0gKHNraXBBcHBseSA/ICQkcSA6ICRxKS5kZWZlcigpLAogICAgICAgICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7CgogICAgICBjb3VudCA9IGlzRGVmaW5lZChjb3VudCkgPyBjb3VudCA6IDA7CgogICAgICBwcm9taXNlLnRoZW4obnVsbCwgbnVsbCwgZm4pOwoKICAgICAgcHJvbWlzZS4kJGludGVydmFsSWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiB0aWNrKCkgewogICAgICAgIGRlZmVycmVkLm5vdGlmeShpdGVyYXRpb24rKyk7CgogICAgICAgIGlmIChjb3VudCA+IDAgJiYgaXRlcmF0aW9uID49IGNvdW50KSB7CiAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGl0ZXJhdGlvbik7CiAgICAgICAgICBjbGVhckludGVydmFsKHByb21pc2UuJCRpbnRlcnZhbElkKTsKICAgICAgICAgIGRlbGV0ZSBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFza2lwQXBwbHkpICRyb290U2NvcGUuJGFwcGx5KCk7CgogICAgICB9LCBkZWxheSk7CgogICAgICBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdID0gZGVmZXJyZWQ7CgogICAgICByZXR1cm4gcHJvbWlzZTsKICAgIH0KCgogICAgIC8qKgogICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgKiBAbmFtZSAkaW50ZXJ2YWwjY2FuY2VsCiAgICAgICoKICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgKiBDYW5jZWxzIGEgdGFzayBhc3NvY2lhdGVkIHdpdGggdGhlIGBwcm9taXNlYC4KICAgICAgKgogICAgICAqIEBwYXJhbSB7cHJvbWlzZX0gcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgYCRpbnRlcnZhbGAgZnVuY3Rpb24uCiAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIHdhcyBzdWNjZXNzZnVsbHkgY2FuY2VsZWQuCiAgICAgICovCiAgICBpbnRlcnZhbC5jYW5jZWwgPSBmdW5jdGlvbihwcm9taXNlKSB7CiAgICAgIGlmIChwcm9taXNlICYmIHByb21pc2UuJCRpbnRlcnZhbElkIGluIGludGVydmFscykgewogICAgICAgIGludGVydmFsc1twcm9taXNlLiQkaW50ZXJ2YWxJZF0ucmVqZWN0KCdjYW5jZWxlZCcpOwogICAgICAgICR3aW5kb3cuY2xlYXJJbnRlcnZhbChwcm9taXNlLiQkaW50ZXJ2YWxJZCk7CiAgICAgICAgZGVsZXRlIGludGVydmFsc1twcm9taXNlLiQkaW50ZXJ2YWxJZF07CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICByZXR1cm4gaW50ZXJ2YWw7CiAgfV07Cn0KCi8qKgogKiBAbmdkb2Mgc2VydmljZQogKiBAbmFtZSAkbG9jYWxlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiAkbG9jYWxlIHNlcnZpY2UgcHJvdmlkZXMgbG9jYWxpemF0aW9uIHJ1bGVzIGZvciB2YXJpb3VzIEFuZ3VsYXIgY29tcG9uZW50cy4gQXMgb2YgcmlnaHQgbm93IHRoZQogKiBvbmx5IHB1YmxpYyBhcGkgaXM6CiAqCiAqICogYGlkYCDigJMgYHtzdHJpbmd9YCDigJMgbG9jYWxlIGlkIGZvcm1hdHRlZCBhcyBgbGFuZ3VhZ2VJZC1jb3VudHJ5SWRgIChlLmcuIGBlbi11c2ApCiAqLwpmdW5jdGlvbiAkTG9jYWxlUHJvdmlkZXIoKSB7CiAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gewogICAgICBpZDogJ2VuLXVzJywKCiAgICAgIE5VTUJFUl9GT1JNQVRTOiB7CiAgICAgICAgREVDSU1BTF9TRVA6ICcuJywKICAgICAgICBHUk9VUF9TRVA6ICcsJywKICAgICAgICBQQVRURVJOUzogWwogICAgICAgICAgeyAvLyBEZWNpbWFsIFBhdHRlcm4KICAgICAgICAgICAgbWluSW50OiAxLAogICAgICAgICAgICBtaW5GcmFjOiAwLAogICAgICAgICAgICBtYXhGcmFjOiAzLAogICAgICAgICAgICBwb3NQcmU6ICcnLAogICAgICAgICAgICBwb3NTdWY6ICcnLAogICAgICAgICAgICBuZWdQcmU6ICctJywKICAgICAgICAgICAgbmVnU3VmOiAnJywKICAgICAgICAgICAgZ1NpemU6IDMsCiAgICAgICAgICAgIGxnU2l6ZTogMwogICAgICAgICAgfSx7IC8vQ3VycmVuY3kgUGF0dGVybgogICAgICAgICAgICBtaW5JbnQ6IDEsCiAgICAgICAgICAgIG1pbkZyYWM6IDIsCiAgICAgICAgICAgIG1heEZyYWM6IDIsCiAgICAgICAgICAgIHBvc1ByZTogJ1x1MDBBNCcsCiAgICAgICAgICAgIHBvc1N1ZjogJycsCiAgICAgICAgICAgIG5lZ1ByZTogJyhcdTAwQTQnLAogICAgICAgICAgICBuZWdTdWY6ICcpJywKICAgICAgICAgICAgZ1NpemU6IDMsCiAgICAgICAgICAgIGxnU2l6ZTogMwogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgQ1VSUkVOQ1lfU1lNOiAnJCcKICAgICAgfSwKCiAgICAgIERBVEVUSU1FX0ZPUk1BVFM6IHsKICAgICAgICBNT05USDoKICAgICAgICAgICAgJ0phbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXInCiAgICAgICAgICAgIC5zcGxpdCgnLCcpLAogICAgICAgIFNIT1JUTU9OVEg6ICAnSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMnLnNwbGl0KCcsJyksCiAgICAgICAgREFZOiAnU3VuZGF5LE1vbmRheSxUdWVzZGF5LFdlZG5lc2RheSxUaHVyc2RheSxGcmlkYXksU2F0dXJkYXknLnNwbGl0KCcsJyksCiAgICAgICAgU0hPUlREQVk6ICdTdW4sTW9uLFR1ZSxXZWQsVGh1LEZyaSxTYXQnLnNwbGl0KCcsJyksCiAgICAgICAgQU1QTVM6IFsnQU0nLCdQTSddLAogICAgICAgIG1lZGl1bTogJ01NTSBkLCB5IGg6bW06c3MgYScsCiAgICAgICAgJ3Nob3J0JzogJ00vZC95eSBoOm1tIGEnLAogICAgICAgIGZ1bGxEYXRlOiAnRUVFRSwgTU1NTSBkLCB5JywKICAgICAgICBsb25nRGF0ZTogJ01NTU0gZCwgeScsCiAgICAgICAgbWVkaXVtRGF0ZTogJ01NTSBkLCB5JywKICAgICAgICBzaG9ydERhdGU6ICdNL2QveXknLAogICAgICAgIG1lZGl1bVRpbWU6ICdoOm1tOnNzIGEnLAogICAgICAgIHNob3J0VGltZTogJ2g6bW0gYScKICAgICAgfSwKCiAgICAgIHBsdXJhbENhdDogZnVuY3Rpb24obnVtKSB7CiAgICAgICAgaWYgKG51bSA9PT0gMSkgewogICAgICAgICAgcmV0dXJuICdvbmUnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJ290aGVyJzsKICAgICAgfQogICAgfTsKICB9Owp9Cgp2YXIgUEFUSF9NQVRDSCA9IC9eKFteXD8jXSopKFw/KFteI10qKSk/KCMoLiopKT8kLywKICAgIERFRkFVTFRfUE9SVFMgPSB7J2h0dHAnOiA4MCwgJ2h0dHBzJzogNDQzLCAnZnRwJzogMjF9Owp2YXIgJGxvY2F0aW9uTWluRXJyID0gbWluRXJyKCckbG9jYXRpb24nKTsKCgovKioKICogRW5jb2RlIHBhdGggdXNpbmcgZW5jb2RlVXJpU2VnbWVudCwgaWdub3JpbmcgZm9yd2FyZCBzbGFzaGVzCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gZW5jb2RlCiAqIEByZXR1cm5zIHtzdHJpbmd9CiAqLwpmdW5jdGlvbiBlbmNvZGVQYXRoKHBhdGgpIHsKICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJyksCiAgICAgIGkgPSBzZWdtZW50cy5sZW5ndGg7CgogIHdoaWxlIChpLS0pIHsKICAgIHNlZ21lbnRzW2ldID0gZW5jb2RlVXJpU2VnbWVudChzZWdtZW50c1tpXSk7CiAgfQoKICByZXR1cm4gc2VnbWVudHMuam9pbignLycpOwp9CgpmdW5jdGlvbiBwYXJzZUFic29sdXRlVXJsKGFic29sdXRlVXJsLCBsb2NhdGlvbk9iaikgewogIHZhciBwYXJzZWRVcmwgPSB1cmxSZXNvbHZlKGFic29sdXRlVXJsKTsKCiAgbG9jYXRpb25PYmouJCRwcm90b2NvbCA9IHBhcnNlZFVybC5wcm90b2NvbDsKICBsb2NhdGlvbk9iai4kJGhvc3QgPSBwYXJzZWRVcmwuaG9zdG5hbWU7CiAgbG9jYXRpb25PYmouJCRwb3J0ID0gaW50KHBhcnNlZFVybC5wb3J0KSB8fCBERUZBVUxUX1BPUlRTW3BhcnNlZFVybC5wcm90b2NvbF0gfHwgbnVsbDsKfQoKCmZ1bmN0aW9uIHBhcnNlQXBwVXJsKHJlbGF0aXZlVXJsLCBsb2NhdGlvbk9iaikgewogIHZhciBwcmVmaXhlZCA9IChyZWxhdGl2ZVVybC5jaGFyQXQoMCkgIT09ICcvJyk7CiAgaWYgKHByZWZpeGVkKSB7CiAgICByZWxhdGl2ZVVybCA9ICcvJyArIHJlbGF0aXZlVXJsOwogIH0KICB2YXIgbWF0Y2ggPSB1cmxSZXNvbHZlKHJlbGF0aXZlVXJsKTsKICBsb2NhdGlvbk9iai4kJHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQocHJlZml4ZWQgJiYgbWF0Y2gucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgPwogICAgICBtYXRjaC5wYXRobmFtZS5zdWJzdHJpbmcoMSkgOiBtYXRjaC5wYXRobmFtZSk7CiAgbG9jYXRpb25PYmouJCRzZWFyY2ggPSBwYXJzZUtleVZhbHVlKG1hdGNoLnNlYXJjaCk7CiAgbG9jYXRpb25PYmouJCRoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoLmhhc2gpOwoKICAvLyBtYWtlIHN1cmUgcGF0aCBzdGFydHMgd2l0aCAnLyc7CiAgaWYgKGxvY2F0aW9uT2JqLiQkcGF0aCAmJiBsb2NhdGlvbk9iai4kJHBhdGguY2hhckF0KDApICE9ICcvJykgewogICAgbG9jYXRpb25PYmouJCRwYXRoID0gJy8nICsgbG9jYXRpb25PYmouJCRwYXRoOwogIH0KfQoKCi8qKgogKgogKiBAcGFyYW0ge3N0cmluZ30gYmVnaW4KICogQHBhcmFtIHtzdHJpbmd9IHdob2xlCiAqIEByZXR1cm5zIHtzdHJpbmd9IHJldHVybnMgdGV4dCBmcm9tIHdob2xlIGFmdGVyIGJlZ2luIG9yIHVuZGVmaW5lZCBpZiBpdCBkb2VzIG5vdCBiZWdpbiB3aXRoCiAqICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIHN0cmluZy4KICovCmZ1bmN0aW9uIGJlZ2luc1dpdGgoYmVnaW4sIHdob2xlKSB7CiAgaWYgKHdob2xlLmluZGV4T2YoYmVnaW4pID09PSAwKSB7CiAgICByZXR1cm4gd2hvbGUuc3Vic3RyKGJlZ2luLmxlbmd0aCk7CiAgfQp9CgoKZnVuY3Rpb24gc3RyaXBIYXNoKHVybCkgewogIHZhciBpbmRleCA9IHVybC5pbmRleE9mKCcjJyk7CiAgcmV0dXJuIGluZGV4ID09IC0xID8gdXJsIDogdXJsLnN1YnN0cigwLCBpbmRleCk7Cn0KCgpmdW5jdGlvbiBzdHJpcEZpbGUodXJsKSB7CiAgcmV0dXJuIHVybC5zdWJzdHIoMCwgc3RyaXBIYXNoKHVybCkubGFzdEluZGV4T2YoJy8nKSArIDEpOwp9CgovKiByZXR1cm4gdGhlIHNlcnZlciBvbmx5IChzY2hlbWU6Ly9ob3N0OnBvcnQpICovCmZ1bmN0aW9uIHNlcnZlckJhc2UodXJsKSB7CiAgcmV0dXJuIHVybC5zdWJzdHJpbmcoMCwgdXJsLmluZGV4T2YoJy8nLCB1cmwuaW5kZXhPZignLy8nKSArIDIpKTsKfQoKCi8qKgogKiBMb2NhdGlvbkh0bWw1VXJsIHJlcHJlc2VudHMgYW4gdXJsCiAqIFRoaXMgb2JqZWN0IGlzIGV4cG9zZWQgYXMgJGxvY2F0aW9uIHNlcnZpY2Ugd2hlbiBIVE1MNSBtb2RlIGlzIGVuYWJsZWQgYW5kIHN1cHBvcnRlZAogKgogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2UgYXBwbGljYXRpb24gYmFzZSBVUkwKICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQcmVmaXggdXJsIHBhdGggcHJlZml4CiAqLwpmdW5jdGlvbiBMb2NhdGlvbkh0bWw1VXJsKGFwcEJhc2UsIGJhc2VQcmVmaXgpIHsKICB0aGlzLiQkaHRtbDUgPSB0cnVlOwogIGJhc2VQcmVmaXggPSBiYXNlUHJlZml4IHx8ICcnOwogIHZhciBhcHBCYXNlTm9GaWxlID0gc3RyaXBGaWxlKGFwcEJhc2UpOwogIHBhcnNlQWJzb2x1dGVVcmwoYXBwQmFzZSwgdGhpcyk7CgoKICAvKioKICAgKiBQYXJzZSBnaXZlbiBodG1sNSAocmVndWxhcikgdXJsIHN0cmluZyBpbnRvIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEhUTUw1IHVybAogICAqIEBwcml2YXRlCiAgICovCiAgdGhpcy4kJHBhcnNlID0gZnVuY3Rpb24odXJsKSB7CiAgICB2YXIgcGF0aFVybCA9IGJlZ2luc1dpdGgoYXBwQmFzZU5vRmlsZSwgdXJsKTsKICAgIGlmICghaXNTdHJpbmcocGF0aFVybCkpIHsKICAgICAgdGhyb3cgJGxvY2F0aW9uTWluRXJyKCdpcHRocHJmeCcsICdJbnZhbGlkIHVybCAiezB9IiwgbWlzc2luZyBwYXRoIHByZWZpeCAiezF9Ii4nLCB1cmwsCiAgICAgICAgICBhcHBCYXNlTm9GaWxlKTsKICAgIH0KCiAgICBwYXJzZUFwcFVybChwYXRoVXJsLCB0aGlzKTsKCiAgICBpZiAoIXRoaXMuJCRwYXRoKSB7CiAgICAgIHRoaXMuJCRwYXRoID0gJy8nOwogICAgfQoKICAgIHRoaXMuJCRjb21wb3NlKCk7CiAgfTsKCiAgLyoqCiAgICogQ29tcG9zZSB1cmwgYW5kIHVwZGF0ZSBgYWJzVXJsYCBwcm9wZXJ0eQogICAqIEBwcml2YXRlCiAgICovCiAgdGhpcy4kJGNvbXBvc2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLAogICAgICAgIGhhc2ggPSB0aGlzLiQkaGFzaCA/ICcjJyArIGVuY29kZVVyaVNlZ21lbnQodGhpcy4kJGhhc2gpIDogJyc7CgogICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7CiAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZU5vRmlsZSArIHRoaXMuJCR1cmwuc3Vic3RyKDEpOyAvLyBmaXJzdCBjaGFyIGlzIGFsd2F5cyAnLycKICB9OwoKICB0aGlzLiQkcGFyc2VMaW5rVXJsID0gZnVuY3Rpb24odXJsLCByZWxIcmVmKSB7CiAgICBpZiAocmVsSHJlZiAmJiByZWxIcmVmWzBdID09PSAnIycpIHsKICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBsaW5rcyB0byBoYXNoIGZyYWdtZW50czoKICAgICAgLy8ga2VlcCB0aGUgb2xkIHVybCBhbmQgb25seSByZXBsYWNlIHRoZSBoYXNoIGZyYWdtZW50CiAgICAgIHRoaXMuaGFzaChyZWxIcmVmLnNsaWNlKDEpKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIgYXBwVXJsLCBwcmV2QXBwVXJsOwogICAgdmFyIHJld3JpdHRlblVybDsKCiAgICBpZiAoKGFwcFVybCA9IGJlZ2luc1dpdGgoYXBwQmFzZSwgdXJsKSkgIT09IHVuZGVmaW5lZCkgewogICAgICBwcmV2QXBwVXJsID0gYXBwVXJsOwogICAgICBpZiAoKGFwcFVybCA9IGJlZ2luc1dpdGgoYmFzZVByZWZpeCwgYXBwVXJsKSkgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGUgKyAoYmVnaW5zV2l0aCgnLycsIGFwcFVybCkgfHwgYXBwVXJsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlICsgcHJldkFwcFVybDsKICAgICAgfQogICAgfSBlbHNlIGlmICgoYXBwVXJsID0gYmVnaW5zV2l0aChhcHBCYXNlTm9GaWxlLCB1cmwpKSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGUgKyBhcHBVcmw7CiAgICB9IGVsc2UgaWYgKGFwcEJhc2VOb0ZpbGUgPT0gdXJsICsgJy8nKSB7CiAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGU7CiAgICB9CiAgICBpZiAocmV3cml0dGVuVXJsKSB7CiAgICAgIHRoaXMuJCRwYXJzZShyZXdyaXR0ZW5VcmwpOwogICAgfQogICAgcmV0dXJuICEhcmV3cml0dGVuVXJsOwogIH07Cn0KCgovKioKICogTG9jYXRpb25IYXNoYmFuZ1VybCByZXByZXNlbnRzIHVybAogKiBUaGlzIG9iamVjdCBpcyBleHBvc2VkIGFzICRsb2NhdGlvbiBzZXJ2aWNlIHdoZW4gZGV2ZWxvcGVyIGRvZXNuJ3Qgb3B0IGludG8gaHRtbDUgbW9kZS4KICogSXQgYWxzbyBzZXJ2ZXMgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIGh0bWw1IG1vZGUgZmFsbGJhY2sgb24gbGVnYWN5IGJyb3dzZXJzLgogKgogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2UgYXBwbGljYXRpb24gYmFzZSBVUkwKICogQHBhcmFtIHtzdHJpbmd9IGhhc2hQcmVmaXggaGFzaGJhbmcgcHJlZml4CiAqLwpmdW5jdGlvbiBMb2NhdGlvbkhhc2hiYW5nVXJsKGFwcEJhc2UsIGhhc2hQcmVmaXgpIHsKICB2YXIgYXBwQmFzZU5vRmlsZSA9IHN0cmlwRmlsZShhcHBCYXNlKTsKCiAgcGFyc2VBYnNvbHV0ZVVybChhcHBCYXNlLCB0aGlzKTsKCgogIC8qKgogICAqIFBhcnNlIGdpdmVuIGhhc2hiYW5nIHVybCBpbnRvIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEhhc2hiYW5nIHVybAogICAqIEBwcml2YXRlCiAgICovCiAgdGhpcy4kJHBhcnNlID0gZnVuY3Rpb24odXJsKSB7CiAgICB2YXIgd2l0aG91dEJhc2VVcmwgPSBiZWdpbnNXaXRoKGFwcEJhc2UsIHVybCkgfHwgYmVnaW5zV2l0aChhcHBCYXNlTm9GaWxlLCB1cmwpOwogICAgdmFyIHdpdGhvdXRIYXNoVXJsID0gd2l0aG91dEJhc2VVcmwuY2hhckF0KDApID09ICcjJwogICAgICAgID8gYmVnaW5zV2l0aChoYXNoUHJlZml4LCB3aXRob3V0QmFzZVVybCkKICAgICAgICA6ICh0aGlzLiQkaHRtbDUpCiAgICAgICAgICA/IHdpdGhvdXRCYXNlVXJsCiAgICAgICAgICA6ICcnOwoKICAgIGlmICghaXNTdHJpbmcod2l0aG91dEhhc2hVcmwpKSB7CiAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignaWhzaHByZngnLCAnSW52YWxpZCB1cmwgInswfSIsIG1pc3NpbmcgaGFzaCBwcmVmaXggInsxfSIuJywgdXJsLAogICAgICAgICAgaGFzaFByZWZpeCk7CiAgICB9CiAgICBwYXJzZUFwcFVybCh3aXRob3V0SGFzaFVybCwgdGhpcyk7CgogICAgdGhpcy4kJHBhdGggPSByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHRoaXMuJCRwYXRoLCB3aXRob3V0SGFzaFVybCwgYXBwQmFzZSk7CgogICAgdGhpcy4kJGNvbXBvc2UoKTsKCiAgICAvKgogICAgICogSW4gV2luZG93cywgb24gYW4gYW5jaG9yIG5vZGUgb24gZG9jdW1lbnRzIGxvYWRlZCBmcm9tCiAgICAgKiB0aGUgZmlsZXN5c3RlbSwgdGhlIGJyb3dzZXIgd2lsbCByZXR1cm4gYSBwYXRobmFtZQogICAgICogcHJlZml4ZWQgd2l0aCB0aGUgZHJpdmUgbmFtZSAoJy9DOi9wYXRoJykgd2hlbiBhCiAgICAgKiBwYXRobmFtZSB3aXRob3V0IGEgZHJpdmUgaXMgc2V0OgogICAgICogICogYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL2ZvbycpCiAgICAgKiAgICogYS5wYXRobmFtZSA9PT0gJy9DOi9mb28nIC8vdHJ1ZQogICAgICoKICAgICAqIEluc2lkZSBvZiBBbmd1bGFyLCB3ZSdyZSBhbHdheXMgdXNpbmcgcGF0aG5hbWVzIHRoYXQKICAgICAqIGRvIG5vdCBpbmNsdWRlIGRyaXZlIG5hbWVzIGZvciByb3V0aW5nLgogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHBhdGgsIHVybCwgYmFzZSkgewogICAgICAvKgogICAgICBNYXRjaGVzIHBhdGhzIGZvciBmaWxlIHByb3RvY29sIG9uIHdpbmRvd3MsCiAgICAgIHN1Y2ggYXMgL0M6L2Zvby9iYXIsIGFuZCBjYXB0dXJlcyBvbmx5IC9mb28vYmFyLgogICAgICAqLwogICAgICB2YXIgd2luZG93c0ZpbGVQYXRoRXhwID0gL15cL1tBLVpdOihcLy4qKS87CgogICAgICB2YXIgZmlyc3RQYXRoU2VnbWVudE1hdGNoOwoKICAgICAgLy9HZXQgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgaW5wdXQgVVJMLgogICAgICBpZiAodXJsLmluZGV4T2YoYmFzZSkgPT09IDApIHsKICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShiYXNlLCAnJyk7CiAgICAgIH0KCiAgICAgIC8vIFRoZSBpbnB1dCBVUkwgaW50ZW50aW9uYWxseSBjb250YWlucyBhIGZpcnN0IHBhdGggc2VnbWVudCB0aGF0IGVuZHMgd2l0aCBhIGNvbG9uLgogICAgICBpZiAod2luZG93c0ZpbGVQYXRoRXhwLmV4ZWModXJsKSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CgogICAgICBmaXJzdFBhdGhTZWdtZW50TWF0Y2ggPSB3aW5kb3dzRmlsZVBhdGhFeHAuZXhlYyhwYXRoKTsKICAgICAgcmV0dXJuIGZpcnN0UGF0aFNlZ21lbnRNYXRjaCA/IGZpcnN0UGF0aFNlZ21lbnRNYXRjaFsxXSA6IHBhdGg7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQ29tcG9zZSBoYXNoYmFuZyB1cmwgYW5kIHVwZGF0ZSBgYWJzVXJsYCBwcm9wZXJ0eQogICAqIEBwcml2YXRlCiAgICovCiAgdGhpcy4kJGNvbXBvc2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLAogICAgICAgIGhhc2ggPSB0aGlzLiQkaGFzaCA/ICcjJyArIGVuY29kZVVyaVNlZ21lbnQodGhpcy4kJGhhc2gpIDogJyc7CgogICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7CiAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZSArICh0aGlzLiQkdXJsID8gaGFzaFByZWZpeCArIHRoaXMuJCR1cmwgOiAnJyk7CiAgfTsKCiAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikgewogICAgaWYgKHN0cmlwSGFzaChhcHBCYXNlKSA9PSBzdHJpcEhhc2godXJsKSkgewogICAgICB0aGlzLiQkcGFyc2UodXJsKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKfQoKCi8qKgogKiBMb2NhdGlvbkhhc2hiYW5nVXJsIHJlcHJlc2VudHMgdXJsCiAqIFRoaXMgb2JqZWN0IGlzIGV4cG9zZWQgYXMgJGxvY2F0aW9uIHNlcnZpY2Ugd2hlbiBodG1sNSBoaXN0b3J5IGFwaSBpcyBlbmFibGVkIGJ1dCB0aGUgYnJvd3NlcgogKiBkb2VzIG5vdCBzdXBwb3J0IGl0LgogKgogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2UgYXBwbGljYXRpb24gYmFzZSBVUkwKICogQHBhcmFtIHtzdHJpbmd9IGhhc2hQcmVmaXggaGFzaGJhbmcgcHJlZml4CiAqLwpmdW5jdGlvbiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybChhcHBCYXNlLCBoYXNoUHJlZml4KSB7CiAgdGhpcy4kJGh0bWw1ID0gdHJ1ZTsKICBMb2NhdGlvbkhhc2hiYW5nVXJsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogIHZhciBhcHBCYXNlTm9GaWxlID0gc3RyaXBGaWxlKGFwcEJhc2UpOwoKICB0aGlzLiQkcGFyc2VMaW5rVXJsID0gZnVuY3Rpb24odXJsLCByZWxIcmVmKSB7CiAgICBpZiAocmVsSHJlZiAmJiByZWxIcmVmWzBdID09PSAnIycpIHsKICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBsaW5rcyB0byBoYXNoIGZyYWdtZW50czoKICAgICAgLy8ga2VlcCB0aGUgb2xkIHVybCBhbmQgb25seSByZXBsYWNlIHRoZSBoYXNoIGZyYWdtZW50CiAgICAgIHRoaXMuaGFzaChyZWxIcmVmLnNsaWNlKDEpKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdmFyIHJld3JpdHRlblVybDsKICAgIHZhciBhcHBVcmw7CgogICAgaWYgKGFwcEJhc2UgPT0gc3RyaXBIYXNoKHVybCkpIHsKICAgICAgcmV3cml0dGVuVXJsID0gdXJsOwogICAgfSBlbHNlIGlmICgoYXBwVXJsID0gYmVnaW5zV2l0aChhcHBCYXNlTm9GaWxlLCB1cmwpKSkgewogICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlICsgaGFzaFByZWZpeCArIGFwcFVybDsKICAgIH0gZWxzZSBpZiAoYXBwQmFzZU5vRmlsZSA9PT0gdXJsICsgJy8nKSB7CiAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGU7CiAgICB9CiAgICBpZiAocmV3cml0dGVuVXJsKSB7CiAgICAgIHRoaXMuJCRwYXJzZShyZXdyaXR0ZW5VcmwpOwogICAgfQogICAgcmV0dXJuICEhcmV3cml0dGVuVXJsOwogIH07CgogIHRoaXMuJCRjb21wb3NlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VhcmNoID0gdG9LZXlWYWx1ZSh0aGlzLiQkc2VhcmNoKSwKICAgICAgICBoYXNoID0gdGhpcy4kJGhhc2ggPyAnIycgKyBlbmNvZGVVcmlTZWdtZW50KHRoaXMuJCRoYXNoKSA6ICcnOwoKICAgIHRoaXMuJCR1cmwgPSBlbmNvZGVQYXRoKHRoaXMuJCRwYXRoKSArIChzZWFyY2ggPyAnPycgKyBzZWFyY2ggOiAnJykgKyBoYXNoOwogICAgLy8gaW5jbHVkZSBoYXNoUHJlZml4IGluICQkYWJzVXJsIHdoZW4gJCR1cmwgaXMgZW1wdHkgc28gSUU4ICYgOSBkbyBub3QgcmVsb2FkIHBhZ2UgYmVjYXVzZSBvZiByZW1vdmFsIG9mICcjJwogICAgdGhpcy4kJGFic1VybCA9IGFwcEJhc2UgKyBoYXNoUHJlZml4ICsgdGhpcy4kJHVybDsKICB9OwoKfQoKCnZhciBsb2NhdGlvblByb3RvdHlwZSA9IHsKCiAgLyoqCiAgICogQXJlIHdlIGluIGh0bWw1IG1vZGU/CiAgICogQHByaXZhdGUKICAgKi8KICAkJGh0bWw1OiBmYWxzZSwKCiAgLyoqCiAgICogSGFzIGFueSBjaGFuZ2UgYmVlbiByZXBsYWNpbmc/CiAgICogQHByaXZhdGUKICAgKi8KICAkJHJlcGxhY2U6IGZhbHNlLAoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGxvY2F0aW9uI2Fic1VybAogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIG9ubHkuCiAgICoKICAgKiBSZXR1cm4gZnVsbCB1cmwgcmVwcmVzZW50YXRpb24gd2l0aCBhbGwgc2VnbWVudHMgZW5jb2RlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc3BlY2lmaWVkIGluCiAgICogW1JGQyAzOTg2XShodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTg2LnR4dCkuCiAgICoKICAgKgogICAqIGBgYGpzCiAgICogLy8gZ2l2ZW4gdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvCiAgICogdmFyIGFic1VybCA9ICRsb2NhdGlvbi5hYnNVcmwoKTsKICAgKiAvLyA9PiAiaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8iCiAgICogYGBgCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9IGZ1bGwgdXJsCiAgICovCiAgYWJzVXJsOiBsb2NhdGlvbkdldHRlcignJCRhYnNVcmwnKSwKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRsb2NhdGlvbiN1cmwKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci4KICAgKgogICAqIFJldHVybiB1cmwgKGUuZy4gYC9wYXRoP2E9YiNoYXNoYCkgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyLgogICAqCiAgICogQ2hhbmdlIHBhdGgsIHNlYXJjaCBhbmQgaGFzaCwgd2hlbiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgYW5kIHJldHVybiBgJGxvY2F0aW9uYC4KICAgKgogICAqCiAgICogYGBganMKICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8KICAgKiB2YXIgdXJsID0gJGxvY2F0aW9uLnVybCgpOwogICAqIC8vID0+ICIvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8iCiAgICogYGBgCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZz19IHVybCBOZXcgdXJsIHdpdGhvdXQgYmFzZSBwcmVmaXggKGUuZy4gYC9wYXRoP2E9YiNoYXNoYCkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IHVybAogICAqLwogIHVybDogZnVuY3Rpb24odXJsKSB7CiAgICBpZiAoaXNVbmRlZmluZWQodXJsKSkKICAgICAgcmV0dXJuIHRoaXMuJCR1cmw7CgogICAgdmFyIG1hdGNoID0gUEFUSF9NQVRDSC5leGVjKHVybCk7CiAgICBpZiAobWF0Y2hbMV0gfHwgdXJsID09PSAnJykgdGhpcy5wYXRoKGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFsxXSkpOwogICAgaWYgKG1hdGNoWzJdIHx8IG1hdGNoWzFdIHx8IHVybCA9PT0gJycpIHRoaXMuc2VhcmNoKG1hdGNoWzNdIHx8ICcnKTsKICAgIHRoaXMuaGFzaChtYXRjaFs1XSB8fCAnJyk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRsb2NhdGlvbiNwcm90b2NvbAogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIG9ubHkuCiAgICoKICAgKiBSZXR1cm4gcHJvdG9jb2wgb2YgY3VycmVudCB1cmwuCiAgICoKICAgKgogICAqIGBgYGpzCiAgICogLy8gZ2l2ZW4gdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvCiAgICogdmFyIHByb3RvY29sID0gJGxvY2F0aW9uLnByb3RvY29sKCk7CiAgICogLy8gPT4gImh0dHAiCiAgICogYGBgCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9IHByb3RvY29sIG9mIGN1cnJlbnQgdXJsCiAgICovCiAgcHJvdG9jb2w6IGxvY2F0aW9uR2V0dGVyKCckJHByb3RvY29sJyksCgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkbG9jYXRpb24jaG9zdAogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIG9ubHkuCiAgICoKICAgKiBSZXR1cm4gaG9zdCBvZiBjdXJyZW50IHVybC4KICAgKgogICAqCiAgICogYGBganMKICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8KICAgKiB2YXIgaG9zdCA9ICRsb2NhdGlvbi5ob3N0KCk7CiAgICogLy8gPT4gImV4YW1wbGUuY29tIgogICAqIGBgYAogICAqCiAgICogQHJldHVybiB7c3RyaW5nfSBob3N0IG9mIGN1cnJlbnQgdXJsLgogICAqLwogIGhvc3Q6IGxvY2F0aW9uR2V0dGVyKCckJGhvc3QnKSwKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRsb2NhdGlvbiNwb3J0CiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS4KICAgKgogICAqIFJldHVybiBwb3J0IG9mIGN1cnJlbnQgdXJsLgogICAqCiAgICoKICAgKiBgYGBqcwogICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94bwogICAqIHZhciBwb3J0ID0gJGxvY2F0aW9uLnBvcnQoKTsKICAgKiAvLyA9PiA4MAogICAqIGBgYAogICAqCiAgICogQHJldHVybiB7TnVtYmVyfSBwb3J0CiAgICovCiAgcG9ydDogbG9jYXRpb25HZXR0ZXIoJyQkcG9ydCcpLAoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGxvY2F0aW9uI3BhdGgKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci4KICAgKgogICAqIFJldHVybiBwYXRoIG9mIGN1cnJlbnQgdXJsIHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci4KICAgKgogICAqIENoYW5nZSBwYXRoIHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuCiAgICoKICAgKiBOb3RlOiBQYXRoIHNob3VsZCBhbHdheXMgYmVnaW4gd2l0aCBmb3J3YXJkIHNsYXNoICgvKSwgdGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIGZvcndhcmQgc2xhc2gKICAgKiBpZiBpdCBpcyBtaXNzaW5nLgogICAqCiAgICoKICAgKiBgYGBqcwogICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94bwogICAqIHZhciBwYXRoID0gJGxvY2F0aW9uLnBhdGgoKTsKICAgKiAvLyA9PiAiL3NvbWUvcGF0aCIKICAgKiBgYGAKICAgKgogICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gcGF0aCBOZXcgcGF0aAogICAqIEByZXR1cm4ge3N0cmluZ30gcGF0aAogICAqLwogIHBhdGg6IGxvY2F0aW9uR2V0dGVyU2V0dGVyKCckJHBhdGgnLCBmdW5jdGlvbihwYXRoKSB7CiAgICBwYXRoID0gcGF0aCAhPT0gbnVsbCA/IHBhdGgudG9TdHJpbmcoKSA6ICcnOwogICAgcmV0dXJuIHBhdGguY2hhckF0KDApID09ICcvJyA/IHBhdGggOiAnLycgKyBwYXRoOwogIH0pLAoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGxvY2F0aW9uI3NlYXJjaAogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLgogICAqCiAgICogUmV0dXJuIHNlYXJjaCBwYXJ0IChhcyBvYmplY3QpIG9mIGN1cnJlbnQgdXJsIHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci4KICAgKgogICAqIENoYW5nZSBzZWFyY2ggcGFydCB3aGVuIGNhbGxlZCB3aXRoIHBhcmFtZXRlciBhbmQgcmV0dXJuIGAkbG9jYXRpb25gLgogICAqCiAgICoKICAgKiBgYGBqcwogICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94bwogICAqIHZhciBzZWFyY2hPYmplY3QgPSAkbG9jYXRpb24uc2VhcmNoKCk7CiAgICogLy8gPT4ge2ZvbzogJ2JhcicsIGJhejogJ3hveG8nfQogICAqCiAgICogLy8gc2V0IGZvbyB0byAneWlwZWUnCiAgICogJGxvY2F0aW9uLnNlYXJjaCgnZm9vJywgJ3lpcGVlJyk7CiAgICogLy8gJGxvY2F0aW9uLnNlYXJjaCgpID0+IHtmb286ICd5aXBlZScsIGJhejogJ3hveG8nfQogICAqIGBgYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0LjxzdHJpbmc+fE9iamVjdC48QXJyYXkuPHN0cmluZz4+fSBzZWFyY2ggTmV3IHNlYXJjaCBwYXJhbXMgLSBzdHJpbmcgb3IKICAgKiBoYXNoIG9iamVjdC4KICAgKgogICAqIFdoZW4gY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgdGhlIG1ldGhvZCBhY3RzIGFzIGEgc2V0dGVyLCBzZXR0aW5nIHRoZSBgc2VhcmNoYCBjb21wb25lbnQKICAgKiBvZiBgJGxvY2F0aW9uYCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAqCiAgICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgaGFzaCBvYmplY3QgY29udGFpbmluZyBhbiBhcnJheSBvZiB2YWx1ZXMsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGVuY29kZWQKICAgKiBhcyBkdXBsaWNhdGUgc2VhcmNoIHBhcmFtZXRlcnMgaW4gdGhlIHVybC4KICAgKgogICAqIEBwYXJhbSB7KHN0cmluZ3xOdW1iZXJ8QXJyYXk8c3RyaW5nPnxib29sZWFuKT19IHBhcmFtVmFsdWUgSWYgYHNlYXJjaGAgaXMgYSBzdHJpbmcgb3IgbnVtYmVyLCB0aGVuIGBwYXJhbVZhbHVlYAogICAqIHdpbGwgb3ZlcnJpZGUgb25seSBhIHNpbmdsZSBzZWFyY2ggcHJvcGVydHkuCiAgICoKICAgKiBJZiBgcGFyYW1WYWx1ZWAgaXMgYW4gYXJyYXksIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHByb3BlcnR5IG9mIHRoZSBgc2VhcmNoYCBjb21wb25lbnQgb2YKICAgKiBgJGxvY2F0aW9uYCBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgKgogICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgbnVsbGAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGRlbGV0ZWQuCiAgICoKICAgKiBJZiBgcGFyYW1WYWx1ZWAgaXMgYHRydWVgLCB0aGUgcHJvcGVydHkgc3BlY2lmaWVkIHZpYSB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBhZGRlZCB3aXRoIG5vCiAgICogdmFsdWUgbm9yIHRyYWlsaW5nIGVxdWFsIHNpZ24uCiAgICoKICAgKiBAcmV0dXJuIHtPYmplY3R9IElmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyByZXR1cm5zIHRoZSBwYXJzZWQgYHNlYXJjaGAgb2JqZWN0LiBJZiBjYWxsZWQgd2l0aAogICAqIG9uZSBvciBtb3JlIGFyZ3VtZW50cyByZXR1cm5zIGAkbG9jYXRpb25gIG9iamVjdCBpdHNlbGYuCiAgICovCiAgc2VhcmNoOiBmdW5jdGlvbihzZWFyY2gsIHBhcmFtVmFsdWUpIHsKICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICBjYXNlIDA6CiAgICAgICAgcmV0dXJuIHRoaXMuJCRzZWFyY2g7CiAgICAgIGNhc2UgMToKICAgICAgICBpZiAoaXNTdHJpbmcoc2VhcmNoKSB8fCBpc051bWJlcihzZWFyY2gpKSB7CiAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gudG9TdHJpbmcoKTsKICAgICAgICAgIHRoaXMuJCRzZWFyY2ggPSBwYXJzZUtleVZhbHVlKHNlYXJjaCk7CiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChzZWFyY2gpKSB7CiAgICAgICAgICBzZWFyY2ggPSBjb3B5KHNlYXJjaCwge30pOwogICAgICAgICAgLy8gcmVtb3ZlIG9iamVjdCB1bmRlZmluZWQgb3IgbnVsbCBwcm9wZXJ0aWVzCiAgICAgICAgICBmb3JFYWNoKHNlYXJjaCwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgZGVsZXRlIHNlYXJjaFtrZXldOwogICAgICAgICAgfSk7CgogICAgICAgICAgdGhpcy4kJHNlYXJjaCA9IHNlYXJjaDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgJGxvY2F0aW9uTWluRXJyKCdpc3JjaGFyZycsCiAgICAgICAgICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYCRsb2NhdGlvbiNzZWFyY2goKWAgY2FsbCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdC4nKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHBhcmFtVmFsdWUpIHx8IHBhcmFtVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgIGRlbGV0ZSB0aGlzLiQkc2VhcmNoW3NlYXJjaF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuJCRzZWFyY2hbc2VhcmNoXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuJCRjb21wb3NlKCk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGxvY2F0aW9uI2hhc2gKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci4KICAgKgogICAqIFJldHVybiBoYXNoIGZyYWdtZW50IHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci4KICAgKgogICAqIENoYW5nZSBoYXNoIGZyYWdtZW50IHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuCiAgICoKICAgKgogICAqIGBgYGpzCiAgICogLy8gZ2l2ZW4gdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94byNoYXNoVmFsdWUKICAgKiB2YXIgaGFzaCA9ICRsb2NhdGlvbi5oYXNoKCk7CiAgICogLy8gPT4gImhhc2hWYWx1ZSIKICAgKiBgYGAKICAgKgogICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gaGFzaCBOZXcgaGFzaCBmcmFnbWVudAogICAqIEByZXR1cm4ge3N0cmluZ30gaGFzaAogICAqLwogIGhhc2g6IGxvY2F0aW9uR2V0dGVyU2V0dGVyKCckJGhhc2gnLCBmdW5jdGlvbihoYXNoKSB7CiAgICByZXR1cm4gaGFzaCAhPT0gbnVsbCA/IGhhc2gudG9TdHJpbmcoKSA6ICcnOwogIH0pLAoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgJGxvY2F0aW9uI3JlcGxhY2UKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIElmIGNhbGxlZCwgYWxsIGNoYW5nZXMgdG8gJGxvY2F0aW9uIGR1cmluZyBjdXJyZW50IGAkZGlnZXN0YCB3aWxsIGJlIHJlcGxhY2luZyBjdXJyZW50IGhpc3RvcnkKICAgKiByZWNvcmQsIGluc3RlYWQgb2YgYWRkaW5nIG5ldyBvbmUuCiAgICovCiAgcmVwbGFjZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLiQkcmVwbGFjZSA9IHRydWU7CiAgICByZXR1cm4gdGhpczsKICB9Cn07Cgpmb3JFYWNoKFtMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybCwgTG9jYXRpb25IYXNoYmFuZ1VybCwgTG9jYXRpb25IdG1sNVVybF0sIGZ1bmN0aW9uKExvY2F0aW9uKSB7CiAgTG9jYXRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShsb2NhdGlvblByb3RvdHlwZSk7CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkbG9jYXRpb24jc3RhdGUKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci4KICAgKgogICAqIFJldHVybiB0aGUgaGlzdG9yeSBzdGF0ZSBvYmplY3Qgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyLgogICAqCiAgICogQ2hhbmdlIHRoZSBoaXN0b3J5IHN0YXRlIG9iamVjdCB3aGVuIGNhbGxlZCB3aXRoIG9uZSBwYXJhbWV0ZXIgYW5kIHJldHVybiBgJGxvY2F0aW9uYC4KICAgKiBUaGUgc3RhdGUgb2JqZWN0IGlzIGxhdGVyIHBhc3NlZCB0byBgcHVzaFN0YXRlYCBvciBgcmVwbGFjZVN0YXRlYC4KICAgKgogICAqIE5PVEU6IFRoaXMgbWV0aG9kIGlzIHN1cHBvcnRlZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIG9ubHkgaW4gYnJvd3NlcnMgc3VwcG9ydGluZwogICAqIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSAoaS5lLiBtZXRob2RzIGBwdXNoU3RhdGVgIGFuZCBgcmVwbGFjZVN0YXRlYCkuIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQKICAgKiBvbGRlciBicm93c2VycyAobGlrZSBJRTkgb3IgQW5kcm9pZCA8IDQuMCksIGRvbid0IHVzZSB0aGlzIG1ldGhvZC4KICAgKgogICAqIEBwYXJhbSB7b2JqZWN0PX0gc3RhdGUgU3RhdGUgb2JqZWN0IGZvciBwdXNoU3RhdGUgb3IgcmVwbGFjZVN0YXRlCiAgICogQHJldHVybiB7b2JqZWN0fSBzdGF0ZQogICAqLwogIExvY2F0aW9uLnByb3RvdHlwZS5zdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpCiAgICAgIHJldHVybiB0aGlzLiQkc3RhdGU7CgogICAgaWYgKExvY2F0aW9uICE9PSBMb2NhdGlvbkh0bWw1VXJsIHx8ICF0aGlzLiQkaHRtbDUpIHsKICAgICAgdGhyb3cgJGxvY2F0aW9uTWluRXJyKCdub3N0YXRlJywgJ0hpc3RvcnkgQVBJIHN0YXRlIHN1cHBvcnQgaXMgYXZhaWxhYmxlIG9ubHkgJyArCiAgICAgICAgJ2luIEhUTUw1IIzc71aKoAEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8OEAAQAZupcCoBzbAqAdglSIf9Vh6fNNBt/WIgBAL8BPWAAABAQgKAKNevwBNpbuM3O9WrKABAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/804BAAEAGt5TAqAdgwKgHNh/1lSJBt/WIWHp804AYAVOv1QAAAQEICgBNpbsAo16/bW9kZSBhbmQgb25seSBpbiBicm93c2VycyBzdXBwb3J0aW5nIEhUTUw1IEhpc3RvcnkgQVBJJyk7CiAgICB9CiAgICAvLyBUaGUgdXNlciBtaWdodCBtb2RpZnkgYHN0YXRlT2JqZWN0YCBhZnRlciBpbnZva2luZyBgJGxvY2F0aW9uLnN0YXRlKHN0YXRlT2JqZWN0KWAKICAgIC8vIGJ1dCB3ZSdyZSBjaGFuZ2luZyB0aGUgJCRzdGF0ZSByZWZlcmVuY2UgdG8gJGJyb3dzZXIuc3RhdGUoKSBkdXJpbmcgdGhlICRkaWdlc3QKICAgIC8vIHNvIHRoZSBtb2RpZmljYXRpb24gd2luZG93IGlzIG5hcnJvdy4KICAgIHRoaXMuJCRzdGF0ZSA9IGlzVW5kZWZpbmVkKHN0YXRlKSA/IG51bGwgOiBzdGF0ZTsKCiAgICByZXR1cm4gdGhpczsKICB9Owp9KTsKCgpmdW5jdGlvbiBsb2NhdGlvbkdldHRlcihwcm9wZXJ0eSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzW3Byb3BlcnR5XTsKICB9Owp9CgoKZnVuY3Rpb24gbG9jYXRpb25HZXR0ZXJTZXR0ZXIocHJvcGVydHksIHByZXByb2Nlc3MpIHsKICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgIHJldHVybiB0aGlzW3Byb3BlcnR5XTsKCiAgICB0aGlzW3Byb3BlcnR5XSA9IHByZXByb2Nlc3ModmFsdWUpOwogICAgdGhpcy4kJGNvbXBvc2UoKTsKCiAgICByZXR1cm4gdGhpczsKICB9Owp9CgoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRsb2NhdGlvbgogKgogKiBAcmVxdWlyZXMgJHJvb3RFbGVtZW50CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgJGxvY2F0aW9uIHNlcnZpY2UgcGFyc2VzIHRoZSBVUkwgaW4gdGhlIGJyb3dzZXIgYWRkcmVzcyBiYXIgKGJhc2VkIG9uIHRoZQogKiBbd2luZG93LmxvY2F0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi93aW5kb3cubG9jYXRpb24pKSBhbmQgbWFrZXMgdGhlIFVSTAogKiBhdmFpbGFibGUgdG8geW91ciBhcHBsaWNhdGlvbi4gQ2hhbmdlcyB0byB0aGUgVVJMIGluIHRoZSBhZGRyZXNzIGJhciBhcmUgcmVmbGVjdGVkIGludG8KICogJGxvY2F0aW9uIHNlcnZpY2UgYW5kIGNoYW5nZXMgdG8gJGxvY2F0aW9uIGFyZSByZWZsZWN0ZWQgaW50byB0aGUgYnJvd3NlciBhZGRyZXNzIGJhci4KICoKICogKipUaGUgJGxvY2F0aW9uIHNlcnZpY2U6KioKICoKICogLSBFeHBvc2VzIHRoZSBjdXJyZW50IFVSTCBpbiB0aGUgYnJvd3NlciBhZGRyZXNzIGJhciwgc28geW91IGNhbgogKiAgIC0gV2F0Y2ggYW5kIG9ic2VydmUgdGhlIFVSTC4KICogICAtIENoYW5nZSB0aGUgVVJMLgogKiAtIFN5bmNocm9uaXplcyB0aGUgVVJMIHdpdGggdGhlIGJyb3dzZXIgd2hlbiB0aGUgdXNlcgogKiAgIC0gQ2hhbmdlcyB0aGUgYWRkcmVzcyBiYXIuCiAqICAgLSBDbGlja3MgdGhlIGJhY2sgb3IgZm9yd2FyZCBidXR0b24gKG9yIGNsaWNrcyBhIEhpc3RvcnkgbGluaykuCiAqICAgLSBDbGlja3Mgb24gYSBsaW5rLgogKiAtIFJlcHJlc2VudHMgdGhlIFVSTCBvYmplY3QgYXMgYSBzZXQgb2YgbWV0aG9kcyAocHJvdG9jb2wsIGhvc3QsIHBvcnQsIHBhdGgsIHNlYXJjaCwgaGFzaCkuCiAqCiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uIERldmVsb3BlciBHdWlkZTogVXNpbmcgJGxvY2F0aW9ufQogKi8KCi8qKgogKiBAbmdkb2MgcHJvdmlkZXIKICogQG5hbWUgJGxvY2F0aW9uUHJvdmlkZXIKICogQGRlc2NyaXB0aW9uCiAqIFVzZSB0aGUgYCRsb2NhdGlvblByb3ZpZGVyYCB0byBjb25maWd1cmUgaG93IHRoZSBhcHBsaWNhdGlvbiBkZWVwIGxpbmtpbmcgcGF0aHMgYXJlIHN0b3JlZC4KICovCmZ1bmN0aW9uICRMb2NhdGlvblByb3ZpZGVyKCkgewogIHZhciBoYXNoUHJlZml4ID0gJycsCiAgICAgIGh0bWw1TW9kZSA9IHsKICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICByZXF1aXJlQmFzZTogdHJ1ZSwKICAgICAgICByZXdyaXRlTGlua3M6IHRydWUKICAgICAgfTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRsb2NhdGlvblByb3ZpZGVyI2hhc2hQcmVmaXgKICAgKiBAZGVzY3JpcHRpb24KICAgKiBAcGFyYW0ge3N0cmluZz19IHByZWZpeCBQcmVmaXggZm9yIGhhc2ggcGFydCAoY29udGFpbmluZyBwYXRoIGFuZCBzZWFyY2gpCiAgICogQHJldHVybnMgeyp9IGN1cnJlbnQgdmFsdWUgaWYgdXNlZCBhcyBnZXR0ZXIgb3IgaXRzZWxmIChjaGFpbmluZykgaWYgdXNlZCBhcyBzZXR0ZXIKICAgKi8KICB0aGlzLmhhc2hQcmVmaXggPSBmdW5jdGlvbihwcmVmaXgpIHsKICAgIGlmIChpc0RlZmluZWQocHJlZml4KSkgewogICAgICBoYXNoUHJlZml4ID0gcHJlZml4OwogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoYXNoUHJlZml4OwogICAgfQogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlciNodG1sNU1vZGUKICAgKiBAZGVzY3JpcHRpb24KICAgKiBAcGFyYW0geyhib29sZWFufE9iamVjdCk9fSBtb2RlIElmIGJvb2xlYW4sIHNldHMgYGh0bWw1TW9kZS5lbmFibGVkYCB0byB2YWx1ZS4KICAgKiAgIElmIG9iamVjdCwgc2V0cyBgZW5hYmxlZGAsIGByZXF1aXJlQmFzZWAgYW5kIGByZXdyaXRlTGlua3NgIHRvIHJlc3BlY3RpdmUgdmFsdWVzLiBTdXBwb3J0ZWQKICAgKiAgIHByb3BlcnRpZXM6CiAgICogICAtICoqZW5hYmxlZCoqIOKAkyBge2Jvb2xlYW59YCDigJMgKGRlZmF1bHQ6IGZhbHNlKSBJZiB0cnVlLCB3aWxsIHJlbHkgb24gYGhpc3RvcnkucHVzaFN0YXRlYCB0bwogICAqICAgICBjaGFuZ2UgdXJscyB3aGVyZSBzdXBwb3J0ZWQuIFdpbGwgZmFsbCBiYWNrIHRvIGhhc2gtcHJlZml4ZWQgcGF0aHMgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3QKICAgKiAgICAgc3VwcG9ydCBgcHVzaFN0YXRlYC4KICAgKiAgIC0gKipyZXF1aXJlQmFzZSoqIC0gYHtib29sZWFufWAgLSAoZGVmYXVsdDogYHRydWVgKSBXaGVuIGh0bWw1TW9kZSBpcyBlbmFibGVkLCBzcGVjaWZpZXMKICAgKiAgICAgd2hldGhlciBvciBub3QgYSA8YmFzZT4gdGFnIGlzIHJlcXVpcmVkIHRvIGJlIHByZXNlbnQuIElmIGBlbmFibGVkYCBhbmQgYHJlcXVpcmVCYXNlYCBhcmUKICAgKiAgICAgdHJ1ZSwgYW5kIGEgYmFzZSB0YWcgaXMgbm90IHByZXNlbnQsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIHdoZW4gYCRsb2NhdGlvbmAgaXMgaW5qZWN0ZWQuCiAgICogICAgIFNlZSB0aGUge0BsaW5rIGd1aWRlLyRsb2NhdGlvbiAkbG9jYXRpb24gZ3VpZGUgZm9yIG1vcmUgaW5mb3JtYXRpb259CiAgICogICAtICoqcmV3cml0ZUxpbmtzKiogLSBge2Jvb2xlYW59YCAtIChkZWZhdWx0OiBgdHJ1ZWApIFdoZW4gaHRtbDVNb2RlIGlzIGVuYWJsZWQsCiAgICogICAgIGVuYWJsZXMvZGlzYWJsZXMgdXJsIHJld3JpdGluZyBmb3IgcmVsYXRpdmUgbGlua3MuCiAgICoKICAgKiBAcmV0dXJucyB7T2JqZWN0fSBodG1sNU1vZGUgb2JqZWN0IGlmIHVzZWQgYXMgZ2V0dGVyIG9yIGl0c2VsZiAoY2hhaW5pbmcpIGlmIHVzZWQgYXMgc2V0dGVyCiAgICovCiAgdGhpcy5odG1sNU1vZGUgPSBmdW5jdGlvbihtb2RlKSB7CiAgICBpZiAoaXNCb29sZWFuKG1vZGUpKSB7CiAgICAgIGh0bWw1TW9kZS5lbmFibGVkID0gbW9kZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG1vZGUpKSB7CgogICAgICBpZiAoaXNCb29sZWFuKG1vZGUuZW5hYmxlZCkpIHsKICAgICAgICBodG1sNU1vZGUuZW5hYmxlZCA9IG1vZGUuZW5hYmxlZDsKICAgICAgfQoKICAgICAgaWYgKGlzQm9vbGVhbihtb2RlLnJlcXVpcmVCYXNlKSkgewogICAgICAgIGh0bWw1TW9kZS5yZXF1aXJlQmFzZSA9IG1vZGUucmVxdWlyZUJhc2U7CiAgICAgIH0KCiAgICAgIGlmIChpc0Jvb2xlYW4obW9kZS5yZXdyaXRlTGlua3MpKSB7CiAgICAgICAgaHRtbDVNb2RlLnJld3JpdGVMaW5rcyA9IG1vZGUucmV3cml0ZUxpbmtzOwogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBodG1sNU1vZGU7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIGV2ZW50CiAgICogQG5hbWUgJGxvY2F0aW9uIyRsb2NhdGlvbkNoYW5nZVN0YXJ0CiAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZQogICAqIEBkZXNjcmlwdGlvbgogICAqIEJyb2FkY2FzdGVkIGJlZm9yZSBhIFVSTCB3aWxsIGNoYW5nZS4KICAgKgogICAqIFRoaXMgY2hhbmdlIGNhbiBiZSBwcmV2ZW50ZWQgYnkgY2FsbGluZwogICAqIGBwcmV2ZW50RGVmYXVsdGAgbWV0aG9kIG9mIHRoZSBldmVudC4gU2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0gZm9yIG1vcmUKICAgKiBkZXRhaWxzIGFib3V0IGV2ZW50IG9iamVjdC4gVXBvbiBzdWNjZXNzZnVsIGNoYW5nZQogICAqIHtAbGluayBuZy4kbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcyAkbG9jYXRpb25DaGFuZ2VTdWNjZXNzfSBpcyBmaXJlZC4KICAgKgogICAqIFRoZSBgbmV3U3RhdGVgIGFuZCBgb2xkU3RhdGVgIHBhcmFtZXRlcnMgbWF5IGJlIGRlZmluZWQgb25seSBpbiBIVE1MNSBtb2RlIGFuZCB3aGVuCiAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0LgogICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTAogICAqIEBwYXJhbSB7c3RyaW5nPX0gb2xkVXJsIFVSTCB0aGF0IHdhcyBiZWZvcmUgaXQgd2FzIGNoYW5nZWQuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZXdTdGF0ZSBOZXcgaGlzdG9yeSBzdGF0ZSBvYmplY3QKICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC4KICAgKi8KCiAgLyoqCiAgICogQG5nZG9jIGV2ZW50CiAgICogQG5hbWUgJGxvY2F0aW9uIyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MKICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCiAgICogQGRlc2NyaXB0aW9uCiAgICogQnJvYWRjYXN0ZWQgYWZ0ZXIgYSBVUkwgd2FzIGNoYW5nZWQuCiAgICoKICAgKiBUaGUgYG5ld1N0YXRlYCBhbmQgYG9sZFN0YXRlYCBwYXJhbWV0ZXJzIG1heSBiZSBkZWZpbmVkIG9ubHkgaW4gSFRNTDUgbW9kZSBhbmQgd2hlbgogICAqIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBIVE1MNSBIaXN0b3J5IEFQSS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VXJsIE5ldyBVUkwKICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFVybCBVUkwgdGhhdCB3YXMgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmV3U3RhdGUgTmV3IGhpc3Rvcnkgc3RhdGUgb2JqZWN0CiAgICogQHBhcmFtIHtzdHJpbmc9fSBvbGRTdGF0ZSBIaXN0b3J5IHN0YXRlIG9iamVjdCB0aGF0IHdhcyBiZWZvcmUgaXQgd2FzIGNoYW5nZWQuCiAgICovCgogIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckYnJvd3NlcicsICckc25pZmZlcicsICckcm9vdEVsZW1lbnQnLAogICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAkYnJvd3NlciwgJHNuaWZmZXIsICRyb290RWxlbWVudCkgewogICAgdmFyICRsb2NhdGlvbiwKICAgICAgICBMb2NhdGlvbk1vZGUsCiAgICAgICAgYmFzZUhyZWYgPSAkYnJvd3Nlci5iYXNlSHJlZigpLCAvLyBpZiBiYXNlW2hyZWZdIGlzIHVuZGVmaW5lZCwgaXQgZGVmYXVsdHMgdG8gJycKICAgICAgICBpbml0aWFsVXJsID0gJGJyb3dzZXIudXJsKCksCiAgICAgICAgYXBwQmFzZTsKCiAgICBpZiAoaHRtbDVNb2RlLmVuYWJsZWQpIHsKICAgICAgaWYgKCFiYXNlSHJlZiAmJiBodG1sNU1vZGUucmVxdWlyZUJhc2UpIHsKICAgICAgICB0aHJvdyAkbG9jYXRpb25NaW5FcnIoJ25vYmFzZScsCiAgICAgICAgICAiJGxvY2F0aW9uIGluIEhUTUw1IG1vZGUgcmVxdWlyZXMgYSA8YmFzZT4gdGFnIHRvIGJlIHByZXNlbnQhIik7CiAgICAgIH0KICAgICAgYXBwQmFzZSA9IHNlcnZlckJhc2UoaW5pdGlhbFVybCkgKyAoYmFzZUhyZWYgfHwgJy8nKTsKICAgICAgTG9jYXRpb25Nb2RlID0gJHNuaWZmZXIuaGlzdG9yeSA/IExvY2F0aW9uSHRtbDVVcmwgOiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybDsKICAgIH0gZWxzZSB7CiAgICAgIGFwcEJhc2UgPSBzdHJpcEhhc2goaW5pdGlhbFVybCk7CiAgICAgIExvY2F0aW9uTW9kZSA9IExvY2F0aW9uSGFzaGJhbmdVcmw7CiAgICB9CiAgICAkbG9jYXRpb24gPSBuZXcgTG9jYXRpb25Nb2RlKGFwcEJhc2UsICcjJyArIGhhc2hQcmVmaXgpOwogICAgJGxvY2F0aW9uLiQkcGFyc2VMaW5rVXJsKGluaXRpYWxVcmwsIGluaXRpYWxVcmwpOwoKICAgICRsb2NhdGlvbi4kJHN0YXRlID0gJGJyb3dzZXIuc3RhdGUoKTsKCiAgICB2YXIgSUdOT1JFX1VSSV9SRUdFWFAgPSAvXlxzKihqYXZhc2NyaXB0fG1haWx0byk6L2k7CgogICAgZnVuY3Rpb24gc2V0QnJvd3NlclVybFdpdGhGYWxsYmFjayh1cmwsIHJlcGxhY2UsIHN0YXRlKSB7CiAgICAgIHZhciBvbGRVcmwgPSAkbG9jYXRpb24udXJsKCk7CiAgICAgIHZhciBvbGRTdGF0ZSA9ICRsb2NhdGlvbi4kJHN0YXRlOwogICAgICB0cnkgewogICAgICAgICRicm93c2VyLnVybCh1cmwsIHJlcGxhY2UsIHN0YXRlKTsKCiAgICAgICAgLy8gTWFrZSBzdXJlICRsb2NhdGlvbi5zdGF0ZSgpIHJldHVybnMgcmVmZXJlbnRpYWxseSBpZGVudGljYWwgKG5vdCBqdXN0IGRlZXBseSBlcXVhbCkKICAgICAgICAvLyBzdGF0ZSBvYmplY3Q7IHRoaXMgbWFrZXMgcG9zc2libGUgcXVpY2sgY2hlY2tpbmcgaWYgdGhlIHN0YXRlIGNoYW5nZWQgaW4gdGhlIGRpZ2VzdAogICAgICAgIC8vIGxvb3AuIENoZWNraW5nIGRlZXAgZXF1YWxpdHkgd291bGQgYmUgdG9vIGV4cGVuc2l2ZS4KICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAvLyBSZXN0b3JlIG9sZCB2YWx1ZXMgaWYgcHVzaFN0YXRlIGZhaWxzCiAgICAgICAgJGxvY2F0aW9uLnVybChvbGRVcmwpOwogICAgICAgICRsb2NhdGlvbi4kJHN0YXRlID0gb2xkU3RhdGU7CgogICAgICAgIHRocm93IGU7CiAgICAgIH0KICAgIH0KCiAgICAkcm9vdEVsZW1lbnQub24oJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgLy8gVE9ETyh2b2p0YSk6IHJld3JpdGUgbGluayB3aGVuIG9wZW5pbmcgaW4gbmV3IHRhYi93aW5kb3cgKGluIGxlZ2FjeSBicm93c2VyKQogICAgICAvLyBjdXJyZW50bHkgd2Ugb3BlbiBuaWNlIHVybCBsaW5rIGFuZCByZWRpcmVjdCB0aGVuCgogICAgICBpZiAoIWh0bWw1TW9kZS5yZXdyaXRlTGlua3MgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LndoaWNoID09IDIpIHJldHVybjsKCiAgICAgIHZhciBlbG0gPSBqcUxpdGUoZXZlbnQudGFyZ2V0KTsKCiAgICAgIC8vIHRyYXZlcnNlIHRoZSBET00gdXAgdG8gZmluZCBmaXJzdCBBIHRhZwogICAgICB3aGlsZSAobm9kZU5hbWVfKGVsbVswXSkgIT09ICdhJykgewogICAgICAgIC8vIGlnbm9yZSByZXdyaXRpbmcgaWYgbm8gQSB0YWcgKHJlYWNoZWQgcm9vdCBlbGVtZW50LCBvciBubyBwYXJlbnQgLSByZW1vdmVkIGZyb20gZG9jdW1lbnQpCiAgICAgICAgaWYgKGVsbVswXSA9PT0gJHJvb3RFbGVtZW50WzBdIHx8ICEoZWxtID0gZWxtLnBhcmVudCgpKVswXSkgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgYWJzSHJlZiA9IGVsbS5wcm9wKCdocmVmJyk7CiAgICAgIC8vIGdldCB0aGUgYWN0dWFsIGhyZWYgYXR0cmlidXRlIC0gc2VlCiAgICAgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kZDM0NzE0OCh2PXZzLjg1KS5hc3B4CiAgICAgIHZhciByZWxIcmVmID0gZWxtLmF0dHIoJ2hyZWYnKSB8fCBlbG0uYXR0cigneGxpbms6aHJlZicpOwoKICAgICAgaWYgKGlzT2JqZWN0KGFic0hyZWYpICYmIGFic0hyZWYudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgU1ZHQW5pbWF0ZWRTdA0KjNzvVuagAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDw5QABABm6kwKgHNsCoB2CVIh/1WHp800G4FVCAEAvw9A0AAAEBCAoAo16/AE2lu4zc71ZSpQEAowYAAKMGAABo9ygf0sUIACetHhMIAEUABpXl/0AAQAa+fMCoB2DAqAc2H/WVKVH+V2/DTB4NgBgA95ZuAAABAQgKAE2luwCjXrtIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjVERA0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBjb3JlIC0tIENTUyBmaWxlCiAqLwoKaHRtbCB7CiAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICAgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsKICAgIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwp9CgovKgogICBvdmVyZmxvdyBoaWRkZW4gaXMgdG8gZW5zdXJlIHRoYXQgdGhlIGJvZHkgZG9lcyBub3QgZXhwYW5kIHRvIGFjY291bnQKICAgZm9yIGFueSBmbHlvdXQgcGFuZXMsIHRoYXQgYXJlIHBvc2l0aW9uZWQgIm9mZiBzY3JlZW4iLgogKi8KYm9keSB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXJnaW46IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9Cgpib2R5LmxpZ2h0IHsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwp9CmJvZHkuZGFyayB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmIyYjJiOwp9CgojdmlldyB7CiAgICBwYWRkaW5nOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKI3ZpZXcgaDIgewogICAgcGFkZGluZy1sZWZ0OiAxMnB4Owp9CgoubGlnaHQgI3ZpZXcgaDIgewogICAgY29sb3I6ICM4MDA7Cn0KLmRhcmsgI3ZpZXcgaDIgewogICAgY29sb3I6ICNDRTU2NTA7Cn0KCi5jZW50ZXJlZCB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJveC1zaGFkb3c6IDJweCAycHggMjRweCA1cHggIzg4ODsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAxMHB4Owp9Cg0KjNzvVr2lAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANEEnQABABmm2wKgHNsCoB2CVKR/1w0weDVH+XdCAEARwlrMAAAEBCAoAo17AAE2lu4zc71aaqQEAlxcAAJcXAABo9ygf0sUIACetHhMIAEUAF4mSHEAAQAYBbMCoB2DAqAc2H/WVJuMVDRYgD2a/gBgA7adiAAABAQgKAE2luwCjXrZIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxNkMwDQovKioKICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjMuNQogKiAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZwogKiBMaWNlbnNlOiBNSVQKICovCihmdW5jdGlvbih3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkgeyd1c2Ugc3RyaWN0JzsKCi8qKgogKiBAbmdkb2MgbW9kdWxlCiAqIEBuYW1lIG5nQ29va2llcwogKiBAZGVzY3JpcHRpb24KICoKICogIyBuZ0Nvb2tpZXMKICoKICogVGhlIGBuZ0Nvb2tpZXNgIG1vZHVsZSBwcm92aWRlcyBhIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBicm93c2VyIGNvb2tpZXMuCiAqCiAqCiAqIDxkaXYgZG9jLW1vZHVsZS1jb21wb25lbnRzPSJuZ0Nvb2tpZXMiPjwvZGl2PgogKgogKiBTZWUge0BsaW5rIG5nQ29va2llcy4kY29va2llcyBgJGNvb2tpZXNgfSBhbmQKICoge0BsaW5rIG5nQ29va2llcy4kY29va2llU3RvcmUgYCRjb29raWVTdG9yZWB9IGZvciB1c2FnZS4KICovCgoKYW5ndWxhci5tb2R1bGUoJ25nQ29va2llcycsIFsnbmcnXSkuCiAgLyoqCiAgICogQG5nZG9jIHNlcnZpY2UKICAgKiBAbmFtZSAkY29va2llcwogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogUHJvdmlkZXMgcmVhZC93cml0ZSBhY2Nlc3MgdG8gYnJvd3NlcidzIGNvb2tpZXMuCiAgICoKICAgKiBPbmx5IGEgc2ltcGxlIE9iamVjdCBpcyBleHBvc2VkIGFuZCBieSBhZGRpbmcgb3IgcmVtb3ZpbmcgcHJvcGVydGllcyB0by9mcm9tIHRoaXMgb2JqZWN0LCBuZXcKICAgKiBjb29raWVzIGFyZSBjcmVhdGVkL2RlbGV0ZWQgYXQgdGhlIGVuZCBvZiBjdXJyZW50ICRldmFsLgogICAqIFRoZSBvYmplY3QncyBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHN0cmluZ3MuCiAgICoKICAgKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nQ29va2llcyBgbmdDb29raWVzYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC4KICAgKgogICAqIEBleGFtcGxlCiAgICoKICAgKiBgYGBqcwogICAqIGFuZ3VsYXIubW9kdWxlKCdjb29raWVzRXhhbXBsZScsIFsnbmdDb29raWVzJ10pCiAgICogICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRjb29raWVzJywgZnVuY3Rpb24oJGNvb2tpZXMpIHsKICAgKiAgICAgLy8gUmV0cmlldmluZyBhIGNvb2tpZQogICAqICAgICB2YXIgZmF2b3JpdGVDb29raWUgPSAkY29va2llcy5teUZhdm9yaXRlOwogICAqICAgICAvLyBTZXR0aW5nIGEgY29va2llCiAgICogICAgICRjb29raWVzLm15RmF2b3JpdGUgPSAnb2F0bWVhbCc7CiAgICogICB9XSk7CiAgICogYGBgCiAgICovCiAgIGZhY3RvcnkoJyRjb29raWVzJywgWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgZnVuY3Rpb24oJHJvb3RTY29wZSwgJGJyb3dzZXIpIHsKICAgICAgdmFyIGNvb2tpZXMgPSB7fSwKICAgICAgICAgIGxhc3RDb29raWVzID0ge30sCiAgICAgICAgICBsYXN0QnJvd3NlckNvb2tpZXMsCiAgICAgICAgICBydW5FdmFsID0gZmFsc2UsCiAgICAgICAgICBjb3B5ID0gYW5ndWxhci5jb3B5LAogICAgICAgICAgaXNVbmRlZmluZWQgPSBhbmd1bGFyLmlzVW5kZWZpbmVkOwoKICAgICAgLy9jcmVhdGVzIGEgcG9sbGVyIGZuIHRoYXQgY29waWVzIGFsbCBjb29raWVzIGZyb20gdGhlICRicm93c2VyIHRvIHNlcnZpY2UgJiBpbml0cyB0aGUgc2VydmljZQogICAgICAkYnJvd3Nlci5hZGRQb2xsRm4oZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGN1cnJlbnRDb29raWVzID0gJGJyb3dzZXIuY29va2llcygpOwogICAgICAgIGlmIChsYXN0QnJvd3NlckNvb2tpZXMgIT0gY3VycmVudENvb2tpZXMpIHsgLy9yZWxpZXMgb24gYnJvd3Nlci5jb29raWVzKCkgaW1wbAogICAgICAgICAgbGFzdEJyb3dzZXJDb29raWVzID0gY3VycmVudENvb2tpZXM7CiAgICAgICAgICBjb3B5KGN1cnJlbnRDb29raWVzLCBsYXN0Q29va2llcyk7CiAgICAgICAgICBjb3B5KGN1cnJlbnRDb29raWVzLCBjb29raWVzKTsKICAgICAgICAgIGlmIChydW5FdmFsKSAkcm9vdFNjb3BlLiRhcHBseSgpOwogICAgICAgIH0KICAgICAgfSkoKTsKCiAgICAgIHJ1bkV2YWwgPSB0cnVlOwoKICAgICAgLy9hdCB0aGUgZW5kIG9mIGVhY2ggZXZhbCwgcHVzaCBjb29raWVzCiAgICAgIC8vVE9ETzogdGhpcyBzaG91bGQgaGFwcGVuIGJlZm9yZSB0aGUgImRlbGF5ZWQiIHdhdGNoZXMgZmlyZSwgYmVjYXVzZSBpZiBzb21lIGNvb2tpZXMgYXJlIG5vdAogICAgICAvLyAgICAgIHN0cmluZ3Mgb3IgYnJvd3NlciByZWZ1c2VzIHRvIHN0b3JlIHNvbWUgY29va2llcywgd2UgdXBkYXRlIHRoZSBtb2RlbCBpbiB0aGUgcHVzaCBmbi4KICAgICAgJHJvb3RTY29wZS4kd2F0Y2gocHVzaCk7CgogICAgICByZXR1cm4gY29va2llczsKCgogICAgICAvKioKICAgICAgICogUHVzaGVzIGFsbCB0aGUgY29va2llcyBmcm9tIHRoZSBzZXJ2aWNlIHRvIHRoZSBicm93c2VyIGFuZCB2ZXJpZmllcyBpZiBhbGwgY29va2llcyB3ZXJlCiAgICAgICAqIHN0b3JlZC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIHB1c2goKSB7CiAgICAgICAgdmFyIG5hbWUsCiAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICBicm93c2VyQ29va2llcywKICAgICAgICAgICAgdXBkYXRlZDsKCiAgICAgICAgLy9kZWxldGUgYW55IGNvb2tpZXMgZGVsZXRlZCBpbiAkY29va2llcwogICAgICAgIGZvciAobmFtZSBpbiBsYXN0Q29va2llcykgewogICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGNvb2tpZXNbbmFtZV0pKSB7CiAgICAgICAgICAgICRicm93c2VyLmNvb2tpZXMobmFtZSwgdW5kZWZpbmVkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vdXBkYXRlIGFsbCBjb29raWVzIHVwZGF0ZWQgaW4gJGNvb2tpZXMKICAgICAgICBmb3IgKG5hbWUgaW4gY29va2llcykgewogICAgICAgICAgdmFsdWUgPSBjb29raWVzW25hbWVdOwogICAgICAgICAgaWYgKCFhbmd1bGFyLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICB2YWx1ZSA9ICcnICsgdmFsdWU7CiAgICAgICAgICAgIGNvb2tpZXNbbmFtZV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbGFzdENvb2tpZXNbbmFtZV0pIHsKICAgICAgICAgICAgJGJyb3dzZXIuY29va2llcyhuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy92ZXJpZnkgd2hhdCB3YXMgYWN0dWFsbHkgc3RvcmVkCiAgICAgICAgaWYgKHVwZGF0ZWQpIHsKICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgIGJyb3dzZXJDb29raWVzID0gJGJyb3dzZXIuY29va2llcygpOwoKICAgICAgICAgIGZvciAobmFtZSBpbiBjb29raWVzKSB7CiAgICAgICAgICAgIGlmIChjb29raWVzW25hbWVdICE9PSBicm93c2VyQ29va2llc1tuYW1lXSkgewogICAgICAgICAgICAgIC8vZGVsZXRlIG9yIHJlc2V0IGFsbCBjb29raWVzIHRoYXQgdGhlIGJyb3dzZXIgZHJvcHBlZCBmcm9tICRjb29raWVzCiAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGJyb3dzZXJDb29raWVzW25hbWVdKSkgewogICAgICAgICAgICAgICAgZGVsZXRlIGNvb2tpZXNbbmFtZV07CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvb2tpZXNbbmFtZV0gPSBicm93c2VyQ29va2llc1tuYW1lXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH1dKS4KCgogIC8qKgogICAqIEBuZ2RvYyBzZXJ2aWNlCiAgICogQG5hbWUgJGNvb2tpZVN0b3JlCiAgICogQHJlcXVpcmVzICRjb29raWVzCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBQcm92aWRlcyBhIGtleS12YWx1ZSAoc3RyaW5nLW9iamVjdCkgc3RvcmFnZSwgdGhhdCBpcyBiYWNrZWQgYnkgc2Vzc2lvbiBjb29raWVzLgogICAqIE9iamVjdHMgcHV0IG9yIHJldHJpZXZlZCBmcm9tIHRoaXMgc3RvcmFnZSBhcmUgYXV0b21hdGljYWxseSBzZXJpYWxpemVkIG9yCiAgICogZGVzZXJpYWxpemVkIGJ5IGFuZ3VsYXIncyB0b0pzb24vZnJvbUpzb24uCiAgICoKICAgKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nQ29va2llcyBgbmdDb29raWVzYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC4KICAgKgogICAqIEBleGFtcGxlCiAgICoKICAgKiBgYGBqcwogICAqIGFuZ3VsYXIubW9kdWxlKCdjb29raWVTdG9yZUV4YW1wbGUnLCBbJ25nQ29va2llcyddKQogICAqICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckY29va2llU3RvcmUnLCBmdW5jdGlvbigkY29va2llU3RvcmUpIHsKICAgKiAgICAgLy8gUHV0IGNvb2tpZQogICAqICAgICAkY29va2llU3RvcmUucHV0KCdteUZhdm9yaXRlJywnb2F0bWVhbCcpOwogICAqICAgICAvLyBHZXQgY29va2llCiAgICogICAgIHZhciBmYXZvcml0ZUNvb2tpZSA9ICRjb29raWVTdG9yZS5nZXQoJ215RmF2b3JpdGUnKTsKICAgKiAgICAgLy8gUmVtb3ZpbmcgYSBjb29raWUKICAgKiAgICAgJGNvb2tpZVN0b3JlLnJlbW92ZSgnbXlGYXZvcml0ZScpOwogICAqICAgfV0pOwogICAqIGBgYAogICAqLwogICBmYWN0b3J5KCckY29va2llU3RvcmUnLCBbJyRjb29raWVzJywgZnVuY3Rpb24oJGNvb2tpZXMpIHsKCiAgICAgIHJldHVybiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAqIEBuYW1lICRjb29raWVTdG9yZSNnZXQKICAgICAgICAgKgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGdpdmVuIGNvb2tpZSBrZXkKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSWQgdG8gdXNlIGZvciBsb29rdXAuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRGVzZXJpYWxpemVkIGNvb2tpZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgdmFyIHZhbHVlID0gJGNvb2tpZXNba2V5XTsKICAgICAgICAgIHJldHVybiB2YWx1ZSA/IGFuZ3VsYXIuZnJvbUpzb24odmFsdWUpIDogdmFsdWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAqIEBuYW1lICRjb29raWVTdG9yZSNwdXQKICAgICAgICAgKgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqIFNldHMgYSB2YWx1ZSBmb3IgZ2l2ZW4gY29va2llIGtleQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBJZCBmb3IgdGhlIGB2YWx1ZWAuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIFZhbHVlIHRvIGJlIHN0b3JlZC4KICAgICAgICAgKi8KICAgICAgICBwdXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICRjb29raWVzW2tleV0gPSBhbmd1bGFyLnRvSnNvbih2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgICAqIEBuYW1lICRjb29raWVTdG9yZSNyZW1vdmUKICAgICAgICAgKgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlbW92ZSBnaXZlbiBjb29raWUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSWQgb2YgdGhlIGtleS12YWx1ZSBwYWlyIHRvIGRlbGV0ZS4KICAgICAgICAgKi8KICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgZGVsZXRlICRjb29raWVzW2tleV07CiAgICAgICAgfQogICAgICB9OwoKICAgIH1dKTsKCgp9KSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKTsKDQqM3O9W2KkBAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PC9AAEAGbq7AqAc2wKgHYJUmH/UgD2a/4xUka4AQAUKcvQAAAQEICgCjXsAATaW7jNzvVriqAQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOZIhQABABhi3wKgHYMCoBzYf9ZUm4xUkayAPZr+AGADtkBIAAAEBCAoATaW8AKNewDANCg0KjNzvVj6sAQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDwwQABABm6twKgHNsCoB2CVJh/1IA9mv+MVJHCAEAFCnLcAAAEBCAoAo17AAE2lvIzc71a4rgEA0QIAANECAAAIACetHhNo9ygf0sUIAEUAAsM8MUAAQAZsHcCoBzbAqAdglSYf9SAPZr/jFSRwgBgBQv5TAAABAQgKAKNewABNpbxHRVQgL29ub3MvdWkvYXBwL2Z3L21hc3QvbWFzdC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVnK0AQAIBAAACAQAAGj3KB/SxQgAJ60eEwgARQAD+o7mQABABhgxwKgHYMCoBzYf9ZUlxIye7RQJTp2AGAD3k9MAAAEBCAoATaW8AKNevUhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMzQyDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBjb21tb24gLS0gQ1NTIGZpbGUKICovCgojdmlldyBoMiB7CiAgICBtYXJnaW46IDA7CiAgICAvKiBzZXBhcmF0ZWQgb3V0IHNvIHRoYXQgb3RoZXIgcGFkZGluZyBkb2Vzbid0IGdldCBjbG9iYmVyZWQgKi8KICAgIHBhZGRpbmctdG9wOiAyMHB4OwogICAgcGFkZGluZy1ib3R0b206IDIwcHg7Cn0KCi5jbGlja2FibGUgewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoNCozc71ZeuAEARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADmO50AAQAYb8cCoB2DAqAc2H/WVJcSMorMUCU6dgBgA95ASAAABAQgKAE2lvACjXr0wDQoNCozc71aauAEAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQRkEAAQAaZTcCoBzbAqAdglSUf9RQJTp3EjKK4gBADMF8yAAABAQgKAKNewQBNpbyM3O9WQbkBANECAADRAgAACAAnrR4TaPcoH9LFCABFAALDEZFAAEAGlr3AqAc2wKgHYJUlH/UUCU6dxIyiuIAYAzCDAgAAAQEICgCjXsEATaW8R0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvZ2x5cGguY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZPvwEAGgQAABoEAABo9ygf0sUIACetHhMIAEUABAyO6EAAQAYYHcCoB2DAqAc2H/WVJcSMorgUCVEsgBgBAZPlAAABAQgKAE2lvQCjXsFIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjM1NA0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBHbHlwaCBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKc3ZnIC5nbHlwaCB7CiAgICBzdHJva2U6IG5vbmU7CiAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7Cn0KCi5saWdodCBzdmcgLmdseXBoLAouZGFyayBzdmcgLmdseXBoLm92ZXJsYXkgewogICAgZmlsbDogYmxhY2s7Cn0KCi5kYXJrIHN2ZyAuZ2x5cGgsCi5saWdodCBzdmcgLmdseXBoLm92ZXJsYXkgewogICAgZmlsbDogd2hpdGU7Cn0KDQqM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L3ZpZXcvdG9wby90b3BvLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVhbQAQBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANO3ZQABABr0DwKgHYMCoBzYf9ZUqk6ZIZMbo63KAEADskA0AAAEBCAoATaW+AKNewozc71Yv0AEAnwIAAJ8CAAAIACetHhNo9ygf0sUIAEUAApFwREAAQAY4PMCoBzbAqAdglSsf9fZqLoRnPL3sgBgA5VzMAAABAQgKAKNewgBNpb1HRVQgL29ub3MvdWkvYXBwL3ZpZXcvZGV2aWNlL2RldmljZS5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71Y10AEAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQYUUAAQAaSjMCoB2DAqAc2H/WVK2c8vez2ajDhgBAA7JANAAABAQgKAE2lvgCjXsKM3O9WRdABAJsCAACbAgAACAAnrR4TaPcoH9LFCABFAAKN5IlAAEAGw/rAqAc2wKgHYJUsH/UFCbpHcNfLeYAYAOVj/gAAAQEICgCjXsIATaW9R0VUIC9vbm9zL3VpL2FwcC92aWV3L2Zsb3cvZmxvdy5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZN0AEAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADRuxEAAQAY8GcCoB2DAqAc2H/WVLHDXy3kFCbyggBAA7JANAAABAQgKAE2lvgCjXsKM3O9WWdABAJsCAACbAgAACAAnrR4TaPcoH9LFCABFAAKNwa5AAEAG5tXAqAc2wKgHYJUtH/VP2Z9vppIo8IAYAOWTxgAAAQEICgCjXsIATaW9R0VUIC9vbm9zL3VpL2FwcC92aWV3L3BvcnQvcG9ydC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71Zc0AEAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADSNTUAAQAYdkMCoB2DAqAc2H/WVLaaSKPBP2aHIgBAA7JANAAABAQgKAE2lvgCjXsKM3O9W4Q0CANIDAADSAwAAaPcoH9LFCAAnrR4TCABFAAPEIqpAAEAGhKPAqAdgwKgHNh/1lSj0/daVGfqGy4AYAPeTnQAAAQEICgBNpcAAo164SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQozMEMNCi5jaGFydC1sZWdlbmQsLmJhci1sZWdlbmQsLmxpbmUtbGVnZW5kLC5waWUtbGVnZW5kLC5yYWRhci1sZWdlbmQsLnBvbGFyYXJlYS1sZWdlbmQsLmRvdWdobnV0LWxlZ2VuZHtsaXN0LXN0eWxlLXR5cGU6bm9uZTttYXJnaW4tdG9wOjVweDt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LXBhZGRpbmctc3RhcnQ6MDstbW96LXBhZGRpbmctc3RhcnQ6MDtwYWRkaW5nLWxlZnQ6MH0uY2hhcnQtbGVnZW5kIGxpLC5iYXItbGVnZW5kIGxpLC5saW5lLWxlZ2VuZCBsaSwucGllLWxlZ2VuZCBsaSwucmFkYXItbGVnZW5kIGxpLC5wb2xhcmFyZWEtbGVnZW5kIGxpLC5kb3VnaG51dC1sZWdlbmQgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1ib3R0b206NHB4O2JvcmRlci1yYWRpdXM6NXB4O3BhZGRpbmc6MnB4IDhweCAycHggMjhweDtmb250LXNpemU6c21hbGxlcjtjdXJzb3I6ZGVmYXVsdH0uY2hhcnQtbGVnZW5kIGxpIHNwYW4sLmJhci1sZWdlbmQgbGkgc3BhbiwubGluZS1sZWdlbmQgbGkgc3BhbiwucGllLWxlZ2VuZCBsaSBzcGFuLC5yYWRhci1sZWdlbmQgbGkgc3BhbiwucG9sYXJhcmVhLWxlZ2VuZCBsaSBzcGFuLC5kb3VnaG51dC1sZWdlbmQgbGkgc3BhbntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlci1yYWRpdXM6NXB4fQovKiMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLWNoYXJ0Lm1pbi5jc3MubWFwICovCg0KjNzvVicOAgA8AAAAPAAAAAgAJ60eE2j3KB/SxQgARQAAKM3eQABABt0KwKgHNsCoB2CVKB/1GfqGywAAAABQBAAAyhYAAAAAAAAAAIzc71Z+FAIAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzThkAAQAZ3LsCoB2DAqAc2H/WVIkG4FVBYenzTgBABU/A1AAABAQgKAE2lwgCjXr83RkU4DQpyaW5nXScpIHsKICAgICAgICAvLyBTVkdBbmltYXRlZFN0cmluZy5hbmltVmFsIHNob3VsZCBiZSBpZGVudGljYWwgdG8gU1ZHQW5pbWF0ZWRTdHJpbmcuYmFzZVZhbCwgdW5sZXNzIGR1cmluZwogICAgICAgIC8vIGFuIGFuaW1hdGlvbi4KICAgICAgICBhYnNIcmVmID0gdXJsUmVzb2x2ZShhYnNIcmVmLmFuaW1WYWwpLmhyZWY7CiAgICAgIH0KCiAgICAgIC8vIElnbm9yZSB3aGVuIHVybCBpcyBzdGFydGVkIHdpdGggamF2YXNjcmlwdDogb3IgbWFpbHRvOgogICAgICBpZiAoSUdOT1JFX1VSSV9SRUdFWFAudGVzdChhYnNIcmVmKSkgcmV0dXJuOwoKICAgICAgaWYgKGFic0hyZWYgJiYgIWVsbS5hdHRyKCd0YXJnZXQnKSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICBpZiAoJGxvY2F0aW9uLiQkcGFyc2VMaW5rVXJsKGFic0hyZWYsIHJlbEhyZWYpKSB7CiAgICAgICAgICAvLyBXZSBkbyBhIHByZXZlbnREZWZhdWx0IGZvciBhbGwgdXJscyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBhbmd1bGFyIGFwcGxpY2F0aW9uLAogICAgICAgICAgLy8gaW4gaHRtbDVtb2RlIGFuZCBhbHNvIHdpdGhvdXQsIHNvIHRoYXQgd2UgYXJlIGFibGUgdG8gYWJvcnQgbmF2aWdhdGlvbiB3aXRob3V0CiAgICAgICAgICAvLyBnZXR0aW5nIGRvdWJsZSBlbnRyaWVzIGluIHRoZSBsb2NhdGlvbiBoaXN0b3J5LgogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIC8vIHVwZGF0ZSBsb2NhdGlvbiBtYW51YWxseQogICAgICAgICAgaWYgKCRsb2NhdGlvbi5hYnNVcmwoKSAhPSAkYnJvd3Nlci51cmwoKSkgewogICAgICAgICAgICAkcm9vdFNjb3BlLiRhcHBseSgpOwogICAgICAgICAgICAvLyBoYWNrIHRvIHdvcmsgYXJvdW5kIEZGNiBidWcgNjg0MjA4IHdoZW4gc2NlbmFyaW8gcnVubmVyIGNsaWNrcyBvbiBsaW5rcwogICAgICAgICAgICB3aW5kb3cuYW5ndWxhclsnZmYtNjg0MjA4LXByZXZlbnREZWZhdWx0J10gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CgoKICAgIC8vIHJld3JpdGUgaGFzaGJhbmcgdXJsIDw+IGh0bWw1IHVybAogICAgaWYgKCRsb2NhdGlvbi5hYnNVcmwoKSAhPSBpbml0aWFsVXJsKSB7CiAgICAgICRicm93c2VyLnVybCgkbG9jYXRpb24uYWJzVXJsKCksIHRydWUpOwogICAgfQoKICAgIHZhciBpbml0aWFsaXppbmcgPSB0cnVlOwoKICAgIC8vIHVwZGF0ZSAkbG9jYXRpb24gd2hlbiAkYnJvd3NlciB1cmwgY2hhbmdlcwogICAgJGJyb3dzZXIub25VcmxDaGFuZ2UoZnVuY3Rpb24obmV3VXJsLCBuZXdTdGF0ZSkgewogICAgICAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG9sZFVybCA9ICRsb2NhdGlvbi5hYnNVcmwoKTsKICAgICAgICB2YXIgb2xkU3RhdGUgPSAkbG9jYXRpb24uJCRzdGF0ZTsKICAgICAgICB2YXIgZGVmYXVsdFByZXZlbnRlZDsKCiAgICAgICAgJGxvY2F0aW9uLiQkcGFyc2UobmV3VXJsKTsKICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG5ld1N0YXRlOwoKICAgICAgICBkZWZhdWx0UHJldmVudGVkID0gJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckbG9jYXRpb25DaGFuZ2VTdGFydCcsIG5ld1VybCwgb2xkVXJsLAogICAgICAgICAgICBuZXdTdGF0ZSwgb2xkU3RhdGUpLmRlZmF1bHRQcmV2ZW50ZWQ7CgogICAgICAgIC8vIGlmIHRoZSBsb2NhdGlvbiB3YXMgY2hhbmdlZCBieSBhIGAkbG9jYXRpb25DaGFuZ2VTdGFydGAgaGFuZGxlciB0aGVuIHN0b3AKICAgICAgICAvLyBwcm9jZXNzaW5nIHRoaXMgbG9jYXRpb24gY2hhbmdlCiAgICAgICAgaWYgKCRsb2NhdGlvbi5hYnNVcmwoKSAhPT0gbmV3VXJsKSByZXR1cm47CgogICAgICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICAkbG9jYXRpb24uJCRwYXJzZShvbGRVcmwpOwogICAgICAgICAgJGxvY2F0aW9uLiQkc3RhdGUgPSBvbGRTdGF0ZTsKICAgICAgICAgIHNldEJyb3dzZXJVcmxXaXRoRmFsbGJhY2sob2xkVXJsLCBmYWxzZSwgb2xkU3RhdGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbml0aWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKCEkcm9vdFNjb3BlLiQkcGhhc2UpICRyb290U2NvcGUuJGRpZ2VzdCgpOwogICAgfSk7CgogICAgLy8gdXBkYXRlIGJyb3dzZXIKICAgICRyb290U2NvcGUuJHdhdGNoKGZ1bmN0aW9uICRsb2NhdGlvbldhdGNoKCkgewogICAgICB2YXIgb2xkVXJsID0gJGJyb3dzZXIudXJsKCk7CiAgICAgIHZhciBvbGRTdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7CiAgICAgIHZhciBjdXJyZW50UmVwbGFjZSA9ICRsb2NhdGlvbi4kJHJlcGxhY2U7CiAgICAgIHZhciB1cmxPclN0YXRlQ2hhbmdlZCA9IG9sZFVybCAhPT0gJGxvY2F0aW9uLmFic1VybCgpIHx8CiAgICAgICAgKCRsb2NhdGlvbi4kJGh0bWw1ICYmICRzbmlmZmVyLmhpc3RvcnkgJiYgb2xkU3RhdGUgIT09ICRsb2NhdGlvbi4kJHN0YXRlKTsKCiAgICAgIGlmIChpbml0aWFsaXppbmcgfHwgdXJsT3JTdGF0ZUNoYW5nZWQpIHsKICAgICAgICBpbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIG5ld1VybCA9ICRsb2NhdGlvbi5hYnNVcmwoKTsKICAgICAgICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckbG9jYXRpb25DaGFuZ2VTdGFydCcsIG5ld1VybCwgb2xkVXJsLAogICAgICAgICAgICAgICRsb2NhdGlvbi4kJHN0YXRlLCBvbGRTdGF0ZSkuZGVmYXVsdFByZXZlbnRlZDsKCiAgICAgICAgICAvLyBpZiB0aGUgbG9jYXRpb24gd2FzIGNoYW5nZWQgYnkgYSBgJGxvY2F0aW9uQ2hhbmdlU3RhcnRgIGhhbmRsZXIgdGhlbiBzdG9wCiAgICAgICAgICAvLyBwcm9jZXNzaW5nIHRoaXMgbG9jYXRpb24gY2hhbmdlCiAgICAgICAgICBpZiAoJGxvY2F0aW9uLmFic1VybCgpICE9PSBuZXdVcmwpIHJldHVybjsKCiAgICAgICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkgewogICAgICAgICAgICAkbG9jYXRpb24uJCRwYXJzZShvbGRVcmwpOwogICAgICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHVybE9yU3RhdGVDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgc2V0QnJvd3NlclVybFdpdGhGYWxsYmFjayhuZXdVcmwsIGN1cnJlbnRSZXBsYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkU3RhdGUgPT09ICRsb2NhdGlvbi4kJHN0YXRlID8gbnVsbCA6ICRsb2NhdGlvbi4kJHN0YXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZnRlckxvY2F0aW9uQ2hhbmdlKG9sZFVybCwgb2xkU3RhdGUpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAkbG9jYXRpb24uJCRyZXBsYWNlID0gZmFsc2U7CgogICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHJldHVybiBhbnl0aGluZyBiZWNhdXNlICRldmFsQXN5bmMgd2lsbCBtYWtlIHRoZSBkaWdlc3QgbG9vcCBkaXJ0eSB3aGVuCiAgICAgIC8vIHRoZXJlIGlzIGEgY2hhbmdlCiAgICB9KTsKCiAgICByZXR1cm4gJGxvY2F0aW9uOwoKICAgIGZ1bmN0aW9uIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSkgewogICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MnLCAkbG9jYXRpb24uYWJzVXJsKCksIG9sZFVybCwKICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSwgb2xkU3RhdGUpOwogICAgfQp9XTsKfQoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRsb2cKICogQHJlcXVpcmVzICR3aW5kb3cKICoKICogQGRlc2NyaXB0aW9uCiAqIFNpbXBsZSBzZXJ2aWNlIGZvciBsb2dnaW5nLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHNhZmVseSB3cml0ZXMgdGhlIG1lc3NhZ2UKICogaW50byB0aGUgYnJvd3NlcidzIGNvbnNvbGUgKGlmIHByZXNlbnQpLgogKgogKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgc2VydmljZSBpcyB0byBzaW1wbGlmeSBkZWJ1Z2dpbmcgYW5kIHRyb3VibGVzaG9vdGluZy4KICoKICogVGhlIGRlZmF1bHQgaXMgdG8gbG9nIGBkZWJ1Z2AgbWVzc2FnZXMuIFlvdSBjYW4gdXNlCiAqIHtAbGluayBuZy4kbG9nUHJvdmlkZXIgbmcuJGxvZ1Byb3ZpZGVyI2RlYnVnRW5hYmxlZH0gdG8gY2hhbmdlIHRoaXMuCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlIG1vZHVsZT0ibG9nRXhhbXBsZSI+CiAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KICAgICAgIGFuZ3VsYXIubW9kdWxlKCdsb2dFeGFtcGxlJywgW10pCiAgICAgICAgIC5jb250cm9sbGVyKCdMb2dDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGxvZycsIGZ1bmN0aW9uKCRzY29wZSwgJGxvZykgewogICAgICAgICAgICRzY29wZS4kbG9nID0gJGxvZzsKICAgICAgICAgICAkc2NvcGUubWVzc2FnZSA9ICdIZWxsbyBXb3JsZCEnOwogICAgICAgICB9XSk7CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJMb2dDb250cm9sbGVyIj4KICAgICAgICAgPHA+UmVsb2FkIHRoaXMgcGFnZSB3aXRoIG9wZW4gY29uc29sZSwgZW50ZXIgdGV4dCBhbmQgaGl0IHRoZSBsb2cgYnV0dG9uLi4uPC9wPgogICAgICAgICBNZXNzYWdlOgogICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9Im1lc3NhZ2UiLz4KICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iJGxvZy5sb2cobWVzc2FnZSkiPmxvZzwvYnV0dG9uPgogICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSIkbG9nLndhcm4obWVzc2FnZSkiPndhcm48L2J1dHRvbj4KICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iJGxvZy5pbmZvKG1lc3NhZ2UpIj5pbmZvPC9idXR0b24+CiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9IiRsb2cuZXJyb3IobWVzc2FnZSkiPmVycm9yPC9idXR0b24+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCgovKioKICogQG5nZG9jIHByb3ZpZGVyCiAqIEBuYW1lICRsb2dQcm92aWRlcgogKiBAZGVzY3JpcHRpb24KICogVXNlIHRoZSBgJGxvZ1Byb3ZpZGVyYCB0byBjb25maWd1cmUgaG93IHRoZSBhcHBsaWNhdGlvbiBsb2dzIG1lc3NhZ2VzCiAqLwpmdW5jdGlvbiAkTG9nUHJvdmlkZXIoKSB7CiAgdmFyIGRlYnVnID0gdHJ1ZSwKICAgICAgc2VsZiA9IHRoaXM7CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkbG9nUHJvdmlkZXIjZGVidWdFbmFibGVkCiAgICogQGRlc2NyaXB0aW9uCiAgICogQHBhcmFtIHtib29sZWFuPX0gZmxhZyBlbmFibGUgb3IgZGlzYWJsZSBkZWJ1ZyBsZXZlbCBtZXNzYWdlcwogICAqIEByZXR1cm5zIHsqfSBjdXJyZW50IHZhbHVlIGlmIHVzZWQgYXMgZ2V0dGVyIG9yIGl0c2VsZiAoY2hhaW5pbmcpIGlmIHVzZWQgYXMgc2V0dGVyCiAgICovCiAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSBmdW5jdGlvbihmbGFnKSB7CiAgICBpZiAoaXNEZWZpbmVkKGZsYWcpKSB7CiAgICAgIGRlYnVnID0gZmxhZzsKICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGRlYnVnOwogICAgfQogIH07CgogIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsIGZ1bmN0aW9uKCR3aW5kb3cpIHsKICAgIHJldHVybiB7CiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRsb2cjbG9nCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBXcml0ZSBhIGxvZyBtZXNzYWdlCiAgICAgICAqLwogICAgICBsb2c6IGNvbnNvbGVMb2coJ2xvZycpLAoKICAgICAgLyoqCiAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICogQG5hbWUgJGxvZyNpbmZvCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBXcml0ZSBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlCiAgICAgICAqLwogICAgICBpbmZvOiBjb25zb2xlTG9nKCdpbmZvJyksCgogICAgICAvKioKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkbG9nI3dhcm4KICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIFdyaXRlIGEgd2FybmluZyBtZXNzYWdlCiAgICAgICAqLwogICAgICB3YXJuOiBjb25zb2xlTG9nKCd3YXJuJyksCgogICAgICAvKioKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkbG9nI2Vycm9yCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBXcml0ZSBhbiBlcnJvciBtZXNzYWdlCiAgICAgICAqLwogICAgICBlcnJvcjogY29uc29sZUxvZygnZXJyb3InKSwKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRsb2cjZGVidWcKICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZQogICAgICAgKi8KICAgICAgZGVidWc6IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZm4gPSBjb25zb2xlTG9nKCdkZWJ1ZycpOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoZGVidWcpIHsKICAgICAgICAgICAgZm4uYXBwbHkoc2VsZiwgYXJndW1lbnRzKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9KCkpCiAgICB9OwoKICAgIGZ1bmN0aW9uIGZvcm1hdEVycm9yKGFyZykgewogICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICBpZiAoYXJnLnN0YWNrKSB7CiAgICAgICAgICBhcmcgPSAoYXJnLm1lc3NhZ2UgJiYgYXJnLnN0YWNrLmluZGV4T2YoYXJnLm1lc3NhZ2UpID09PSAtMSkKICAgICAgICAgICAgICA/ICdFcnJvcjogJyArIGFyZy5tZXNzYWdlICsgJ1xuJyArIGFyZy5zdGFjawogICAgICAgICAgICAgIDogYXJnLnN0YWNrOwogICAgICAgIH0gZWxzZSBpZiAoYXJnLnNvdXJjZVVSTCkgewogICAgICAgICAgYXJnID0gYXJnLm1lc3NhZ2UgKyAnXG4nICsgYXJnLnNvdXJjZVVSTCArICc6JyArIGFyZy5saW5lOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXJnOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnNvbGVMb2codHlwZSkgewogICAgICB2YXIgY29uc29sZSA9ICR3aW5kb3cuY29uc29sZSB8fCB7fSwKICAgICAgICAgIGxvZ0ZuID0gY29uc29sZVt0eXBlXSB8fCBjb25zb2xlLmxvZyB8fCBub29wLAogICAgICAgICAgaGFzQXBwbHkgPSBmYWxzZTsKCiAgICAgIC8vIE5vdGU6IHJlYWRpbmcgbG9nRm4uYXBwbHkgdGhyb3dzIGFuIGVycm9yIGluIElFMTEgaW4gSUU4IGRvY3VtZW50IG1vZGUuCiAgICAgIC8vIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgaXMgdGhhdCBjb25zb2xlLmxvZyBoYXMgdHlwZSAib2JqZWN0IiBpbiBJRTguLi4KICAgICAgdHJ5IHsKICAgICAgICBoYXNBcHBseSA9ICEhbG9nRm4uYXBwbHk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgICBpZiAoaGFzQXBwbHkpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKGFyZykgewogICAgICAgICAgICBhcmdzLnB1c2goZm9ybWF0RXJyb3IoYXJnKSk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiBsb2dGbi5hcHBseShjb25zb2xlLCBhcmdzKTsKICAgICAgICB9OwogICAgICB9CgogICAgICAvLyB3ZSBhcmUgSUUgd2hpY2ggZWl0aGVyIGRvZXNuJ3QgaGF2ZSB3aW5kb3cuY29uc29sZSA9PiB0aGlzIGlzIG5vb3AgYW5kIHdlIGRvIG5vdGhpbmcsCiAgICAgIC8vIG9yIHdlIGFyZSBJRSB3aGVyZSBjb25zb2xlLmxvZyBkb2Vzbid0IGhhdmUgYXBwbHkgc28gd2UgbG9nIGF0IGxlYXN0IGZpcnN0IDIgYXJncwogICAgICByZXR1cm4gZnVuY3Rpb24oYXJnMSwgYXJnMikgewogICAgICAgIGxvZ0ZuKGFyZzEsIGFyZzIgPT0gbnVsbCA/ICcnIDogYXJnMik7CiAgICAgIH07CiAgICB9CiAgfV07Cn0KCnZhciAkcGFyc2VNaW5FcnIgPSBtaW5FcnIoJyRwYXJzZScpOwoKLy8gU2FuZGJveGluZyBBbmd1bGFyIEV4cHJlc3Npb25zCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBbmd1bGFyIGV4cHJlc3Npb25zIGFyZSBnZW5lcmFsbHkgY29uc2lkZXJlZCBzYWZlIGJlY2F1c2UgdGhlc2UgZXhwcmVzc2lvbnMgb25seSBoYXZlIGRpcmVjdAovLyBhY2Nlc3MgdG8gYCRzY29wZWAgYW5kIGxvY2Fscy4gSG93ZXZlciwgb25lIGNhbiBvYnRhaW4gdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgSlMgY29kZSBieQovLyBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gbmF0aXZlIEpTIGZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBGdW5jdGlvbiBjb25zdHJ1Y3Rvci4KLy8KLy8gQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBBbmd1bGFyIGV4cHJlc3Npb246Ci8vCi8vICAge30udG9TdHJpbmcuY29uc3RydWN0b3IoJ2FsZXJ0KCJldmlsIEpTIGNvZGUiKScpCi8vCi8vIFRoaXMgc2FuZGJveGluZyB0ZWNobmlxdWUgaXMgbm90IHBlcmZlY3QgYW5kIGRvZXNuJ3QgYWltIHRvIGJlLiBUaGUgZ29hbCBpcyB0byBwcmV2ZW50IGV4cGxvaXRzCi8vIGFnYWluc3QgdGhlIGV4cHJlc3Npb24gbGFuZ3VhZ2UsIGJ1dCBub3QgdG8gcHJldmVudCBleHBsb2l0cyB0aGF0IHdlcmUgZW5hYmxlZCBieSBleHBvc2luZwovLyBzZW5zaXRpdmUgSmF2YVNjcmlwdCBvciBicm93c2VyIEFQSXMgb24gU2NvcGUuIEV4cG9zaW5nIHN1Y2ggb2JqZWN0cyBvbiBhIFNjb3BlIGlzIG5ldmVyIGEgZ29vZAovLyBwcmFjdGljZSBhbmQgdGhlcmVmb3JlIHdlIGFyZSBub3QgZXZlbiB0cnlpbmcgdG8gcHJvdGVjdCBhZ2FpbnN0IGludGVyYWN0aW9uIHdpdGggYW4gb2JqZWN0Ci8vIGV4cGxpY2l0bHkgZXhwb3NlZCBpbiB0aGlzIHdheS4KLy8KLy8gSW4gZ2VuZXJhbCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFjY2VzcyBhIFdpbmRvdyBvYmplY3QgZnJvbSBhbiBhbmd1bGFyIGV4cHJlc3Npb24gdW5sZXNzIGEKLy8gd2luZG93IG9yIHNvbWUgRE9NIG9iamVjdCB0aGF0IGhhcyBhIHJlZmVyZW5jZSB0byB3aW5kb3cgaXMgcHVibGlzaGVkIG9udG8gYSBTY29wZS4KLy8gU2ltaWxhcmx5IHdlIHByZXZlbnQgaW52b2NhdGlvbnMgb2YgZnVuY3Rpb24ga25vd24gdG8gYmUgZGFuZ2Vyb3VzLCBhcyB3ZWxsIGFzIGFzc2lnbm1lbnRzIHRvCi8vIG5hdGl2ZSBvYmplY3RzLgovLwovLyBTZWUgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvZ3VpZGUvc2VjdXJpdHkKCgpmdW5jdGlvbiBlbnN1cmVTYWZlTWVtYmVyTmFtZShuYW1lLCBmdWxsRXhwcmVzc2lvbikgewogIGlmIChuYW1lID09PSAiX19kZWZpbmVHZXR0ZXJfXyIgfHwgbmFtZSA9PT0gIl9fZGVmaW5lU2V0dGVyX18iCiAgICAgIHx8IG5hbWUgPT09ICJfX2xvb2t1cEdldHRlcl9fIiB8fCBuYW1lID09PSAiX19sb29rdXBTZXR0ZXJfXyIKICAgICAgfHwgbmFtZSA9PT0gIl9fcHJvdG9fXyIpIHsKICAgIHRocm93ICRwYXJzZU1pbkVycignaXNlY2ZsZCcsCiAgICAgICAgJ0F0dGVtcHRpbmcgdG8gYWNjZXNzIGEgZGlzYWxsb3dlZCBmaWVsZCBpbiBBbmd1bGFyIGV4cHJlc3Npb25zISAnCiAgICAgICAgKyAnRXhwcmVzc2lvbjogezB9JywgZnVsbEV4cHJlc3Npb24pOwogIH0KICByZXR1cm4gbmFtZTsKfQoKZnVuY3Rpb24gZW5zdXJlU2FmZU9iamVjdChvYmosIGZ1bGxFeHByZXNzaW9uKSB7CiAgLy8gbmlmdHkgY2hlY2sgaWYgb2JqIGlzIEZ1bmN0aW9uIHRoYXQgaXMgZmFzdCBhbmQgd29ya3MgYWNyb3NzIGlmcmFtZXMgYW5kIG90aGVyIGNvbnRleHRzCiAgaWYgKG9iaikgewogICAgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gb2JqKSB7CiAgICAgIHRocm93ICRwYXJzZU1pbkVycignaXNlY2ZuJywKICAgICAgICAgICdSZWZlcmVuY2luZyBGdW5jdGlvbiBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsCiAgICAgICAgICBmdWxsRXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKC8vIGlzV2luZG93KG9iaikKICAgICAgICBvYmoud2luZG93ID09PSBvYmopIHsKICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCdpc2Vjd2luZG93JywKICAgICAgICAgICdSZWZlcmVuY2luZyB0aGUgV2luZG93IGluIEFuZ3VsYXIgZXhwcmVzc2lvbnMgaXMgZGlzYWxsb3dlZCEgRXhwcmVzc2lvbjogezB9JywKICAgICAgICAgIGZ1bGxFeHByZXNzaW9uKTsKICAgIH0gZWxzZSBpZiAoLy8gaXNFbGVtZW50KG9iaikKICAgICAgICBvYmouY2hpbGRyZW4gJiYgKG9iai5ub2RlTmFtZSB8fCAob2JqLnByb3AgJiYgb2JqLmF0dHIgJiYgb2JqLmZpbmQpKSkgewogICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWNkb20nLAogICAgICAgICAgJ1JlZmVyZW5jaW5nIERPTSBub2RlcyBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsCiAgICAgICAgICBmdWxsRXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKC8vIGJsb2NrIE9iamVjdCBzbyB0aGF0IHdlIGNhbid0IGdldCBob2xkIG9mIGRhbmdlcm91cyBPYmplY3QuKiBtZXRob2RzCiAgICAgICAgb2JqID09PSBPYmplY3QpIHsKICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCdpc2Vjb2JqJywKICAgICAgICAgICdSZWZlcmVuY2luZyBPYmplY3QgaW4gQW5ndWxhciBleHByZXNzaW9ucyBpcyBkaXNhbGxvd2VkISBFeHByZXNzaW9uOiB7MH0nLAogICAgICAgICAgZnVsbEV4cHJlc3Npb24pOwogICAgfQogIH0KICByZXR1cm4gb2JqOwp9Cgp2YXIgQ0FMTCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsOwp2YXIgQVBQTFkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7CnZhciBCSU5EID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7CgpmdW5jdGlvbiBlbnN1cmVTYWZlRnVuY3Rpb24ob2JqLCBmdWxsRXhwcmVzc2lvbikgewogIGlmIChvYmopIHsKICAgIGlmIChvYmouY29uc3RydWN0b3IgPT09IG9iaikgewogICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWNmbicsCiAgICAgICAgJ1JlZmVyZW5jaW5nIEZ1bmN0aW9uIGluIEFuZ3VsYXIgZXhwcmVzc2lvbnMgaXMgZGlzYWxsb3dlZCEgRXhwcmVzc2lvbjogezB9JywKICAgICAgICBmdWxsRXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gQ0FMTCB8fCBvYmogPT09IEFQUExZIHx8IG9iaiA9PT0gQklORCkgewogICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWNmZicsCiAgICAgICAgJ1JlZmVyZW5jaW5nIGNhbGwsIGFwcGx5IG9yIGJpbmQgaW4gQW5ndWxhciBleHByZXNzaW9ucyBpcyBkaXNhbGxvd2VkISBFeHByZXNzaW9uOiB7MH0nLAogICAgICAgIGZ1bGxFeHByZXNzaW9uKTsKICAgIH0KICB9Cn0KCi8vS2V5d29yZCBjb25zdGFudHMKdmFyIENPTlNUQU5UUyA9IGNyZWF0ZU1hcCgpOwpmb3JFYWNoKHsKICAnbnVsbCc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbDsgfSwKICAndHJ1ZSc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSwKICAnZmFsc2UnOiBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9LAogICd1bmRlZmluZWQnOiBmdW5jdGlvbigpIHt9Cn0sIGZ1bmN0aW9uKGNvbnN0YW50R2V0dGVyLCBuYW1lKSB7CiAgY29uc3RhbnRHZXR0ZXIuY29uc3RhbnQgPSBjb25zdGFudEdldHRlci5saXRlcmFsID0gY29uc3RhbnRHZXR0ZXIuc2hhcmVkR2V0dGVyID0gdHJ1ZTsKICBDT05TVEFOVFNbbmFtZV0gPSBjb25zdGFudEdldHRlcjsKfSk7CgovL05vdCBxdWl0ZSBhIGNvbnN0YW50LCBidXQgY2FuIGJlIGxleC9wYXJzZWQgdGhlIHNhbWUKQ09OU1RBTlRTWyd0aGlzJ10gPSBmdW5jdGlvbihzZWxmKSB7IHJldHVybiBzZWxmOyB9OwpDT05TVEFOVFNbJ3RoaXMnXS5zaGFyZWRHZXR0ZXIgPSB0cnVlOwoKCi8vT3BlcmF0b3JzIC0gd2lsbCBiZSB3cmFwcGVkIGJ5IGJpbmFyeUZuL3VuYXJ5Rm4vYXNzaWdubWVudC9maWx0ZXIKdmFyIE9QRVJBVE9SUyA9IGV4dGVuZChjcmVhdGVNYXAoKSwgewogICAgJysnOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikgewogICAgICBhPWEoc2VsZiwgbG9jYWxzKTsgYj1iKHNlbGYsIGxvY2Fscyk7CiAgICAgIGlmIChpc0RlZmluZWQoYSkpIHsKICAgICAgICBpZiAoaXNEZWZpbmVkKGIpKSB7CiAgICAgICAgICByZXR1cm4gYSArIGI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIHJldHVybiBpc0RlZmluZWQoYikgPyBiIDogdW5kZWZpbmVkO30sCiAgICAnLSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7CiAgICAgICAgICBhPWEoc2VsZiwgbG9jYWxzKTsgYj1iKHNlbGYsIGxvY2Fscyk7CiAgICAgICAgICByZXR1cm4gKGlzRGVmaW5lZChhKSA/IGEgOiAwKSAtIChpc0RlZmluZWQoYikgPyBiIDogMCk7CiAgICAgICAgfSwKICAgICcqJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpICogYihzZWxmLCBsb2NhbHMpO30sCiAgICAnLyc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSAvIGIoc2VsZiwgbG9jYWxzKTt9LAogICAgJyUnOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgJSBiKHNlbGYsIGxvY2Fscyk7fSwKICAgICc9PT0nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgPT09IGIoc2VsZiwgbG9jYWxzKTt9LAogICAgJyE9PSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSAhPT0gYihzZWxmLCBsb2NhbHMpO30sCiAgICAnPT0nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgPT0gYihzZWxmLCBsb2NhbHMpO30sCiAgICAnIT0nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgIT0gYihzZWxmLCBsb2NhbHMpO30sCiAgICAnPCc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSA8IGIoc2VsZiwgbG9jYWxzKTt9LAogICAgJz4nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgPiBiKHNlbGYsIGxvY2Fscyk7fSwKICAgICc8PSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSA8PSBiKHNlbGYsIGxvY2Fscyk7fSwKICAgICc+PSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSA+PSBiKHNlbGYsIGxvY2Fscyk7fSwKICAgICcmJic6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSAmJiBiKHNlbGYsIGxvY2Fscyk7fSwKICAgICd8fCc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSB8fCBiKHNlbGYsIGxvY2Fscyk7fSwKICAgICchJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEpIHtyZXR1cm4gIWEoc2VsZiwgbG9jYWxzKTt9LAoKICAgIC8vVG9rZW5pemVkIGFzIG9wZXJhdG9ycyBidXQgcGFyc2VkIGFzIGFzc2lnbm1lbnQvZmlsdGVycwogICAgJz0nOnRydWUsCiAgICAnfCc6dHJ1ZQp9KTsKdmFyIEVTQ0FQRSA9IHsibiI6IlxuIiwgImYiOiJcZiIsICJyIjoiXHIiLCAidCI6Ilx0IiwgInYiOiJcdiIsICInIjoiJyIsICciJzonIid9OwoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKLyoqCiAqIEBjb25zdHJ1Y3RvcgogKi8KdmFyIExleGVyID0gZnVuY3Rpb24ob3B0aW9ucykgewogIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Cn07CgpMZXhlci5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IExleGVyLAoKICBsZXg6IGZ1bmN0aW9uKHRleHQpIHsKICAgIHRoaXMudGV4dCA9IHRleHQ7CiAgICB0aGlzLmluZGV4ID0gMDsKICAgIHRoaXMudG9rZW5zID0gW107CgogICAgd2hpbGUgKHRoaXMuaW5kZXggPCB0aGlzLnRleHQubGVuZ3RoKSB7CiAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7CiAgICAgIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsKICAgICAgICB0aGlzLnJlYWRTdHJpbmcoY2gpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuaXNOdW1iZXIoY2gpIHx8IGNoID09PSAnLicgJiYgdGhpcy5pc051bWJlcih0aGlzLnBlZWsoKSkpIHsKICAgICAgICB0aGlzLnJlYWROdW1iZXIoKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSWRlbnQoY2gpKSB7CiAgICAgICAgdGhpcy5yZWFkSWRlbnQoKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmlzKGNoLCAnKCl7fVtdLiw7Oj8nKSkgewogICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiBjaH0pOwogICAgICAgIHRoaXMuaW5kZXgrKzsKICAgICAgfSBlbHNlIGlmICh0aGlzLmlzV2hpdGVzcGFjZShjaCkpIHsKICAgICAgICB0aGlzLmluZGV4Kys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGNoMiA9IGNoICsgdGhpcy5wZWVrKCk7CiAgICAgICAgdmFyIGNoMyA9IGNoMiArIHRoaXMucGVlaygyKTsKICAgICAgICB2YXIgb3AxID0gT1BFUkFUT1JTW2NoXTsKICAgICAgICB2YXIgb3AyID0gT1BFUkFUT1JTW2NoMl07CiAgICAgICAgdmFyIG9wMyA9IE9QRVJBVE9SU1tjaDNdOwogICAgICAgIGlmIChvcDEgfHwgb3AyIHx8IG9wMykgewogICAgICAgICAgdmFyIHRva2VuID0gb3AzID8gY2gzIDogKG9wMiA/IGNoMiA6IGNoKTsKICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiB0b2tlbiwgb3BlcmF0b3I6IHRydWV9KTsKICAgICAgICAgIHRoaXMuaW5kZXggKz0gdG9rZW4ubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgbmV4dCBjaGFyYWN0ZXIgJywgdGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMudG9rZW5zOwogIH0sCgogIGlzOiBmdW5jdGlvbihjaCwgY2hhcnMpIHsKICAgIHJldHVybiBjaGFycy5pbmRleE9mKGNoKSAhPT0gLTE7CiAgfSwKCiAgcGVlazogZnVuY3Rpb24oaSkgewogICAgdmFyIG51bSA9IGkgfHwgMTsKICAgIHJldHVybiAodGhpcy5pbmRleCArIG51bSA8IHRoaXMudGV4dC5sZW5ndGgpID8gdGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4ICsgbnVtKSA6IGZhbHNlOwogIH0sCgogIGlzTnVtYmVyOiBmdW5jdGlvbihjaCkgewogICAgcmV0dXJuICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSAmJiB0eXBlb2YgY2ggPT09ICJzdHJpbmciOwogIH0sCgogIGlzV2hpdGVzcGFjZTogZnVuY3Rpb24oY2gpIHsKICAgIC8vIElFIHRyZWF0cyBub24tYnJlYWtpbmcgc3BhY2UgYXMgXHUwMEEwCiAgICByZXR1cm4gKGNoID09PSAnICcgfHwgY2ggPT09ICdccicgfHwgY2ggPT09ICdcdCcgfHwKICAgICAgICAgICAgY2ggPT09ICdcbicgfHwgY2ggPT09ICdcdicgfHwgY2ggPT09ICdcdTAwQTAnKTsKICB9LAoKICBpc0lkZW50OiBmdW5jdGlvbihjaCkgewogICAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onIHx8CiAgICAgICAgICAgICdBJyA8PSBjaCAmJiBjaCA8PSAnWicgfHwKICAgICAgICAgICAgJ18nID09PSBjaCB8fCBjaCA9PT0gJyQnKTsKICB9LAoKICBpc0V4cE9wZXJhdG9yOiBmdW5jdGlvbihjaCkgewogICAgcmV0dXJuIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycgfHwgdGhpcy5pc051bWJlcihjaCkpOwogIH0sCgogIHRocm93RXJyb3I6IGZ1bmN0aW9uKGVycm9yLCBzdGFydCwgZW5kKSB7CiAgICBlbmQgPSBlbmQgfHwgdGhpcy5pbmRleDsKICAgIHZhciBjb2xTdHIgPSAoaXNEZWZpbmVkKHN0YXJ0KQogICAgICAgICAgICA/ICdzICcgKyBzdGFydCArICAnLScgKyB0aGlzLmluZGV4ICsgJyBbJyArIHRoaXMudGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkgKyAnXScKICAgICAgICAgICAgOiAnICcgKyBlbmQpOwogICAgdGhyb3cgJHBhcnNlTWluRXJyKCdsZXhlcnInLCAnTGV4ZXIgRXJyb3I6IHswfSBhdCBjb2x1bW57MX0gaW4gZXhwcmVzc2lvbiBbezJ9XS4nLAogICAgICAgIGVycm9yLCBjb2xTdHIsIHRoaXMudGV4dCk7CiAgfSwKCiAgcmVhZE51bWJlcjogZnVuY3Rpb24oKSB7CiAgICB2YXIgbnVtYmVyID0gJyc7CiAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4OwogICAgd2hpbGUgKHRoaXMuaW5kZXggPCB0aGlzLnRleHQubGVuZ3RoKSB7CiAgICAgIHZhciBjaCA9IGxvd2VyY2FzZSh0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpKTsKICAgICAgaWYgKGNoID09ICcuJyB8fCB0aGlzLmlzTnVtYmVyKGNoKSkgewogICAgICAgIG51bWJlciArPSBjaDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcGVla0NoID0gdGhpcy5wZWVrKCk7CiAgICAgICAgaWYgKGNoID09ICdlJyAmJiB0aGlzLmlzRXhwT3BlcmF0b3IocGVla0NoKSkgewogICAgICAgICAgbnVtYmVyICs9IGNoOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0V4cE9wZXJhdG9yKGNoKSAmJgogICAgICAgICAgICBwZWVrQ2ggJiYgdGhpcy5pc051bWJlcihwZWVrQ2gpICYmCiAgICAgICAgICAgIG51bWJlci5jaGFyQXQobnVtYmVyLmxlbmd0aCAtIDEpID09ICdlJykgewogICAgICAgICAgbnVtYmVyICs9IGNoOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0V4cE9wZXJhdG9yKGNoKSAmJgogICAgICAgICAgICAoIXBlZWtDaCB8fCAhdGhpcy5pc051bWJlcihwZWVrQ2gpKSAmJgogICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PSAnZScpIHsKICAgICAgICAgIHRoaXMudGhyb3dFcnJvcignSW52YWxpZCBleHBvbmVudCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5pbmRleCsrOwogICAgfQogICAgdGhpcy50b2tlbnMucHVzaCh7CiAgICAgIGluZGV4OiBzdGFydCwKICAgICAgdGV4dDogbnVtYmVyLAogICAgICBjb25zdGFudDogdHJ1ZSwKICAgICAgdmFsdWU6IE51bWJlcihudW1iZXIpCiAgICB9KTsKICB9LAoKICByZWFkSWRlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDsKICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50ZXh0Lmxlbmd0aCkgewogICAgICB2YXIgY2ggPSB0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpOwogICAgICBpZiAoISh0aGlzLmlzSWRlbnQoY2gpIHx8IHRoaXMuaXNOdW1iZXIoY2gpKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXMuaW5kZXgrKzsKICAgIH0KICAgIHRoaXMudG9rZW5zLnB1c2goewogICAgICBpbmRleDogc3RhcnQsCiAgICAgIHRleHQ6IHRoaXMudGV4dC5zbGljZShzdGFydCwgdGhpcy5pbmRleCksCiAgICAgIGlkZW50aWZpZXI6IHRydWUKICAgIH0pOwogIH0sCgogIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKHF1b3RlKSB7CiAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4OwogICAgdGhpcy5pbmRleCsrOwogICAgdmFyIHN0cmluZyA9ICcnOwogICAgdmFyIHJhd1N0cmluZyA9IHF1b3RlOwogICAgdmFyIGVzY2FwZSA9IGZhbHNlOwogICAgd2hpbGUgKHRoaXMuaW5kZXggPCB0aGlzLnRleHQubGVuZ3RoKSB7CiAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7CiAgICAgIHJhd1N0cmluZyArPSBjaDsKICAgICAgaWYgKGVzY2FwZSkgewogICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7CiAgICAgICAgICB2YXIgaGV4ID0gdGhpcy50ZXh0LnN1YnN0cmluZyh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDUpOwogICAgICAgICAgaWYgKCFoZXgubWF0Y2goL1tcZGEtZl17NH0vaSkpCiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcignSW52YWxpZCB1bmljb2RlIGVzY2FwZSBbXFx1JyArIGhleCArICddJyk7CiAgICAgICAgICB0aGlzLmluZGV4ICs9IDQ7CiAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciByZXAgPSBFU0NBUEVbY2hdOwogICAgICAgICAgc3RyaW5nID0gc3RyaW5nICsgKHJlcCB8fCBjaCk7CiAgICAgICAgfQogICAgICAgIGVzY2FwZSA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7CiAgICAgICAgZXNjYXBlID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gcXVvdGUpIHsKICAgICAgICB0aGlzLmluZGV4Kys7CiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh7CiAgICAgICAgICBpbmRleDogc3RhcnQsCiAgICAgICAgICB0ZXh0OiByYXdTdHJpbmcsCiAgICAgICAgICBjb25zdGFudDogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiBzdHJpbmcKICAgICAgICB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyaW5nICs9IGNoOwogICAgICB9CiAgICAgIHRoaXMuaW5kZXgrKzsKICAgIH0KICAgIHRoaXMudGhyb3dFcnJvcignVW50ZXJtaW5hdGVkIHF1b3RlJywgc3RhcnQpOwogIH0KfTsKCgpmdW5jdGlvbiBpc0NvbnN0YW50KGV4cCkgewogIHJldHVybiBleHAuY29uc3RhbnQ7Cn0KCi8qKgogKiBAY29uc3RydWN0b3IKICovCnZhciBQYXJzZXIgPSBmdW5jdGlvbihsZXhlciwgJGZpbHRlciwgb3B0aW9ucykgewogIHRoaXMubGV4ZXIgPSBsZXhlcjsKICB0aGlzLiRmaWx0ZXIgPSAkZmlsdGVyOwogIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Cn07CgpQYXJzZXIuWkVSTyA9IGV4dGVuZChmdW5jdGlvbigpIHsKICByZXR1cm4gMDsKfSwgewogIHNoYXJlZEdldHRlcjogdHJ1ZSwKICBjb25zdGFudDogdHJ1ZQp9KTsKClBhcnNlci5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFBhcnNlciwKCiAgcGFyc2U6IGZ1bmN0aW9uKHRleHQpIHsKICAgIHRoaXMudGV4dCA9IHRleHQ7CiAgICB0aGlzLnRva2VucyA9IHRoaXMubGV4ZXIubGV4KHRleHQpOwoKICAgIHZhciB2YWx1ZSA9IHRoaXMuc3RhdGVtZW50cygpOwoKICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggIT09IDApIHsKICAgICAgdGhpcy50aHJvd0Vycm9yKCdpcyBhbiB1bmV4cGVjdGVkIHRva2VuJywgdGhpcy50b2tlbnNbMF0pOwogICAgfQoKICAgIHZhbHVlLmxpdGVyYWwgPSAhIXZhbHVlLmxpdGVyYWw7CiAgICB2YWx1ZS5jb25zdGFudCA9ICEhdmFsdWUuY29uc3RhbnQ7CgogICAgcmV0dXJuIHZhbHVlOwogIH0sCgogIHByaW1hcnk6IGZ1bmN0aW9uKCkgewogICAgdmFyIHByaW1hcnk7CiAgICBpZiAodGhpcy5leHBlY3QoJygnKSkgewogICAgICBwcmltYXJ5ID0gdGhpcy5maWx0ZXJDaGFpbigpOwogICAgICB0aGlzLmNvbnN1bWUoJyknKTsKICAgIH0gZWxzZSBpZiAodGhpcy5leHBlY3QoJ1snKSkgewogICAgICBwcmltYXJ5ID0gdGhpcy5hcnJheURlY2xhcmF0aW9uKCk7CiAgICB9IGVsc2UgaWYgKHRoaXMuZXhwZWN0KCd7JykpIHsKICAgICAgcHJpbWFyeSA9IHRoaXMub2JqZWN0KCk7CiAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygpLmlkZW50aWZpZXIpIHsKICAgICAgcHJpbWFyeSA9IHRoaXMuaWRlbnRpZmllcigpOwogICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS5jb25zdGFudCkgewogICAgICBwcmltYXJ5ID0gdGhpcy5jb25zdGFudCgpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy50aHJvd0Vycm9yKCdub3QgYSBwcmltYXJ5IGV4cHJlc3Npb24nLCB0aGlzLnBlZWsoKSk7CiAgICB9CgogICAgdmFyIG5leHQsIGNvbnRleHQ7CiAgICB3aGlsZSAoKG5leHQgPSB0aGlzLmV4cGVjdCgnKCcsICdbJywgJy4nKSkpIHsKICAgICAgaWYgKG5leHQudGV4dCA9PT0gJygnKSB7CiAgICAgICAgcHJpbWFyeSA9IHRoaXMuZnVuY3Rpb25DYWxsKHByaW1hcnksIGNvbnRleHQpOwogICAgICAgIGNvbnRleHQgPSBudWxsOwogICAgICB9IGVsc2UgaWYgKG5leHQudGV4dCA9PT0gJ1snKSB7CiAgICAgICAgY29udGV4dCA9IHByaW1hcnk7CiAgICAgICAgcHJpbWFyeSA9IHRoaXMub2JqZWN0SW5kZXgocHJpbWFyeSk7CiAgICAgIH0gZWxzZSBpZiAobmV4dC50ZXh0ID09PSAnLicpIHsKICAgICAgICBjb250ZXh0ID0gcHJpbWFyeTsKICAgICAgICBwcmltYXJ5ID0gdGhpcy5maWVsZEFjY2VzcyhwcmltYXJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnRocm93RXJyb3IoJ0lNUE9TU0lCTEUnKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHByaW1hcnk7CiAgfSwKCiAgdGhyb3dFcnJvcjogZnVuY3Rpb24obXNnLCB0b2tlbikgewogICAgdGhyb3cgJHBhcnNlTWluRXJyKCdzeW50YXgnLAogICAgICAgICdTeW50YXggRXJyb3I6IFRva2VuIFwnezB9XCcgezF9IGF0IGNvbHVtbiB7Mn0gb2YgdGhlIGV4cHJlc3Npb24gW3szfV0gc3RhcnRpbmcgYXQgW3s0fV0uJywKICAgICAgICAgIHRva2VuLnRleHQsIG1zZywgKHRva2VuLmluZGV4ICsgMSksIHRoaXMudGV4dCwgdGhpcy50ZXh0LnN1YnN0cmluZyh0b2tlbi5pbmRleCkpOwogIH0sCgogIHBlZWtUb2tlbjogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKQogICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3Vlb2UnLCAnVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbjogezB9JywgdGhpcy50ZXh0KTsKICAgIHJldHVybiB0aGlzLnRva2Vuc1swXTsKICB9LAoKICBwZWVrOiBmdW5jdGlvbihlMSwgZTIsIGUzLCBlNCkgewogICAgcmV0dXJuIHRoaXMucGVla0FoZWFkKDAsIGUxLCBlMiwgZTMsIGU0KTsKICB9LAogIHBlZWtBaGVhZDogZnVuY3Rpb24oaSwgZTEsIGUyLCBlMywgZTQpIHsKICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPiBpKSB7CiAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW5zW2ldOwogICAgICB2YXIgdCA9IHRva2VuLnRleHQ7CiAgICAgIGlmICh0ID09PSBlMSB8fCB0ID09PSBlMiB8fCB0ID09PSBlMyB8fCB0ID09PSBlNCB8fAogICAgICAgICAgKCFlMSAmJiAhZTIgJiYgIWUzICYmICFlNCkpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9LAoKICBleHBlY3Q6IGZ1bmN0aW9uKGUxLCBlMiwgZTMsIGU0KSB7CiAgICB2YXIgdG9rZW4gPSB0aGlzLnBlZWsoZTEsIGUyLCBlMywgZTQpOwogICAgaWYgKHRva2VuKSB7CiAgICAgIHRoaXMudG9rZW5zLnNoaWZ0KCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9LAoKICBjb25zdW1lOiBmdW5jdGlvbihlMSkgewogICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMCkgewogICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3Vlb2UnLCAnVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbjogezB9JywgdGhpcy50ZXh0KTsKICAgIH0KCiAgICB2YXIgdG9rZW4gPSB0aGlzLmV4cGVjdChlMSk7CiAgICBpZiAoIXRva2VuKSB7CiAgICAgIHRoaXMudGhyb3dFcnJvcignaXMgdW5leHBlY3RlZCwgZXhwZWN0aW5nIFsnICsgZTEgKyAnXScsIHRoaXMucGVlaygpKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9LAoKICB1bmFyeUZuOiBmdW5jdGlvbihvcCwgcmlnaHQpIHsKICAgIHZhciBmbiA9IE9QRVJBVE9SU1tvcF07CiAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZVVuYXJ5Rm4oc2VsZiwgbG9jYWxzKSB7CiAgICAgIHJldHVybiBmbihzZWxmLCBsb2NhbHMsIHJpZ2h0KTsKICAgIH0sIHsKICAgICAgY29uc3RhbnQ6cmlnaHQuY29uc3RhbnQsCiAgICAgIGlucHV0czogW3JpZ2h0XQogICAgfSk7CiAgfSwKCiAgYmluYXJ5Rm46IGZ1bmN0aW9uKGxlZnQsIG9wLCByaWdodCwgaXNCcmFuY2hpbmcpIHsKICAgIHZhciBmbiA9IE9QRVJBVE9SU1tvcF07CiAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZUJpbmFyeUZuKHNlbGYsIGxvY2FscykgewogICAgICByZXR1cm4gZm4oc2VsZiwgbG9jYWxzLCBsZWZ0LCByaWdodCk7CiAgICB9LCB7CiAgICAgIGNvbnN0YW50OiBsZWZ0LmNvbnN0YW50ICYmIHJpZ2h0LmNvbnN0YW50LAogICAgICBpbnB1dHM6ICFpc0JyYW5jaGluZyAmJiBbbGVmdCwgcmlnaHRdCiAgICB9KTsKICB9LAoKICBpZGVudGlmaWVyOiBmdW5jdGlvbigpIHsKICAgIHZhciBpZCA9IHRoaXMuY29uc3VtZSgpLnRleHQ7CgogICAgLy9Db250aW51ZSByZWFkaW5nIGVhY2ggYC5pZGVudGlmaWVyYCB1bmxlc3MgaXQgaXMgYSBtZXRob2QgaW52b2NhdGlvbgogICAgd2hpbGUgKHRoaXMucGVlaygnLicpICYmIHRoaXMucGVla0FoZWFkKDEpLmlkZW50aWZpZXIgJiYgIXRoaXMucGVla0FoZWFkKDIsICcoJykpIHsKICAgICAgaWQgKz0gdGhpcy5jb25zdW1lKCkudGV4dCArIHRoaXMuY29uc3VtZSgpLnRleHQ7CiAgICB9CgogICAgcmV0dXJuIENPTlNUQU5UU1tpZF0gfHwgZ2V0dGVyRm4oaWQsIHRoaXMub3B0aW9ucywgdGhpcy50ZXh0KTsKICB9LAoKICBjb25zdGFudDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmNvbnN1bWUoKS52YWx1ZTsKCiAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZUNvbnN0YW50KCkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9LCB7CiAgICAgIGNvbnN0YW50OiB0cnVlLAogICAgICBsaXRlcmFsOiB0cnVlCiAgICB9KTsKICB9LAoKICBzdGF0ZW1lbnRzOiBmdW5jdGlvbigpIHsKICAgIHZhciBzdGF0ZW1lbnRzID0gW107CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID4gMCAmJiAhdGhpcy5wZWVrKCd9JywgJyknLCAnOycsICddJykpCiAgICAgICAgc3RhdGVtZW50cy5wdXNoKHRoaXMuZmlsdGVyQ2hhaW4oKSk7CiAgICAgIGlmICghdGhpcy5leHBlY3QoJzsnKSkgewogICAgICAgIC8vIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25seSBvbmUgc3RhdGVtZW50LgogICAgICAgIC8vIFRPRE8oc2l6ZSk6IG1heWJlIHdlIHNob3VsZCBub3Qgc3VwcG9ydCBtdWx0aXBsZSBzdGF0ZW1lbnRzPwogICAgICAgIHJldHVybiAoc3RhdGVtZW50cy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgID8gc3RhdGVtZW50c1swXQogICAgICAgICAgICA6IGZ1bmN0aW9uICRwYXJzZVN0YXRlbWVudHMoc2VsZiwgbG9jYWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdGF0ZW1lbnRzW2ldKHNlbGYsIGxvY2Fscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgICAgfTsKICAgICAgfQogICAgfQogIH0sCgogIGZpbHRlckNoYWluOiBmdW5jdGlvbigpIHsKICAgIHZhciBsZWZ0ID0gdGhpcy5leHByZXNzaW9uKCk7CiAgICB2YXIgdG9rZW47CiAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJ3wnKSkpIHsKICAgICAgbGVmdCA9IHRoaXMuZmlsdGVyKGxlZnQpOwogICAgfQogICAgcmV0dXJuIGxlZnQ7CiAgfSwKCiAgZmlsdGVyOiBmdW5jdGlvbihpbnB1dEZuKSB7CiAgICB2YXIgZm4gPSB0aGlzLiRmaWx0ZXIodGhpcy5jb25zdW1lKCkudGV4dCk7CiAgICB2YXIgYXJnc0ZuOwogICAgdmFyIGFyZ3M7CgogICAgaWYgKHRoaXMucGVlaygn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CiAgICAgICAgfSwgewogICAgICAgICAgY29uc3RhbnQ6IGxlZnQuY29uc3RhbnQgJiYgbWlkZGxlLmNvbnN0YW50ICYmIHJpZ2h0LmNvbnN0YW50CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbGVmdDsKICB9LAoKICBsb2dpY2FsT1I6IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQgPSB0aGlzLmxvZ2ljYWxBTkQoKTsKICAgIHZhciB0b2tlbjsKICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnfHwnKSkpIHsKICAgICAgbGVmdCA9IHRoaXMuYmluYXJ5Rm4obGVmdCwgdG9rZW4udGV4dCwgdGhpcy5sb2dpY2FsQU5EKCksIHRydWUpOwogICAgfQogICAgcmV0dXJuIGxlZnQ7CiAgfSwKCiAgbG9naWNhbEFORDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGVmdCA9IHRoaXMuZXF1YWxpdHkoKTsKICAgIHZhciB0b2tlbjsKICAgIGlmICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnJiYnKSkpIHsKICAgICAgbGVmdCA9IHRoaXMuYmluYXJ5Rm4obGVmdCwgdG9rZW4udGV4dCwgdGhpcy5sb2dpY2FsQU5EKCksIHRydWUpOwogICAgfQogICAgcmV0dXJuIGxlZnQ7CiAgfSwKCiAgZXF1YWxpdHk6IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQgPSB0aGlzLnJlbGF0aW9uYWwoKTsKICAgIHZhciB0b2tlbjsKICAgIGlmICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnPT0nLCchPScsJz09PScsJyE9PScpKSkgewogICAgICBsZWZ0ID0gdGhpcy5iaW5hcnlGbihsZWZ0LCB0b2tlbi50ZXh0LCB0aGlzLmVxdWFsaXR5KCkpOwogICAgfQogICAgcmV0dXJuIGxlZnQ7CiAgfSwKCiAgcmVsYXRpb25hbDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGVmdCA9IHRoaXMuYWRkaXRpdmUoKTsKICAgIHZhciB0b2tlbjsKICAgIGlmICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnPCcsICc+JywgJzw9JywgJz49JykpKSB7CiAgICAgIGxlZnQgPSB0aGlzLmJpbmFyeUZuKGxlZnQsIHRva2VuLnRleHQsIHRoaXMucmVsYXRpb25hbCgpKTsKICAgIH0KICAgIHJldHVybiBsZWZ0OwogIH0sCgogIGFkZGl0aXZlOiBmdW5jdGlvbigpIHsKICAgIHZhciBsZWZ0ID0gdGhpcy5tdWx0aXBsaWNhdGl2ZSgpOwogICAgdmFyIHRva2VuOwogICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCcrJywnLScpKSkgewogICAgICBsZWZ0ID0gdGhpcy5iaW5hcnlGbihsZWZ0LCB0b2tlbi50ZXh0LCB0aGlzLm11bHRpcGxpY2F0aXZlKCkpOwogICAgfQogICAgcmV0dXJuIGxlZnQ7CiAgfSwKCiAgbXVsdGlwbGljYXRpdmU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQgPSB0aGlzLnVuYXJ5KCk7CiAgICB2YXIgdG9rZW47CiAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJyonLCcvJywnJScpKSkgewogICAgICBsZWZ0ID0gdGhpcy5iaW5hcnlGbihsZWZ0LCB0b2tlbi50ZXh0LCB0aGlzLnVuYXJ5KCkpOwogICAgfQogICAgcmV0dXJuIGxlZnQ7CiAgfSwKCiAgdW5hcnk6IGZ1bmN0aW9uKCkgewogICAgdmFyIHRva2VuOwogICAgaWYgKHRoaXMuZXhwZWN0KCcrJykpIHsKICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeSgpOwogICAgfSBlbHNlIGlmICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnLScpKSkgewogICAgICByZXR1cm4gdGhpcy5iaW5hcnlGbihQYXJzZXIuWkVSTywgdG9rZW4udGV4dCwgdGhpcy51bmFyeSgpKTsKICAgIH0gZWxzZSBpZiAoKHRva2VuID0gdGhpcy5leHBlY3QoJyEnKSkpIHsKICAgICAgcmV0dXJuIHRoaXMudW5hcnlGbih0b2tlbi50ZXh0LCB0aGlzLnVuYXJ5KCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeSgpOwogICAgfQogIH0sCgogIGZpZWxkQWNjZXNzOiBmdW5jdGlvbihvYmplY3QpIHsKICAgIHZhciBleHByZXNzaW9uID0gdGhpcy50ZXh0OwogICAgdmFyIGZpZWxkID0gdGhpcy5jb25zdW1lKCkudGV4dDsKICAgIHZhciBnZXR0ZXIgPSBnZXR0ZXJGbihmaWVsZCwgdGhpcy5vcHRpb25zLCBleHByZXNzaW9uKTsKCiAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZUZpZWxkQWNjZXNzKHNjb3BlLCBsb2NhbHMsIHNlbGYpIHsKICAgICAgcmV0dXJuIGdldHRlcihzZWxmIHx8IG9iamVjdChzY29wZSwgbG9jYWxzKSk7CiAgICB9LCB7CiAgICAgIGFzc2lnbjogZnVuY3Rpb24oc2NvcGUsIHZhbHVlLCBsb2NhbHMpIHsKICAgICAgICB2YXIgbyA9IG9iamVjdChzY29wZSwgbG9jYWxzKTsKICAgICAgICBpZiAoIW8pIG9iamVjdC5hc3NpZ24oc2NvcGUsIG8gPSB7fSk7CiAgICAgICAgcmV0dXJuIHNldHRlcihvLCBmaWVsZCwgdmFsdWUsIGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9KTsKICB9LAoKICBvYmplY3RJbmRleDogZnVuY3Rpb24ob2JqKSB7CiAgICB2YXIgZXhwcmVzc2lvbiA9IHRoaXMudGV4dDsKCiAgICB2YXIgaW5kZXhGbiA9IHRoaXMuZXhwcmVzc2lvbigpOwogICAgdGhpcy5jb25zdW1lKCddJyk7CgogICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAkcGFyc2VPYmplY3RJbmRleChzZWxmLCBsb2NhbHMpIHsKICAgICAgdmFyIG8gPSBvYmooc2VsZiwgbG9jYWxzKSwKICAgICAgICAgIGkgPSBpbmRleEZuKHNlbGYsIGxvY2FscyksCiAgICAgICAgICB2OwoKICAgICAgZW5zdXJlU2FmZU1lbWJlck5hbWUoaSwgZXhwcmVzc2lvbik7CiAgICAgIGlmICghbykgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgdiA9IGVuc3VyZVNhZmVPYmplY3Qob1tpXSwgZXhwcmVzc2lvbik7CiAgICAgIHJldHVybiB2OwogICAgfSwgewogICAgICBhc3NpZ246IGZ1bmN0aW9uKHNlbGYsIHZhbHVlLCBsb2NhbHMpIHsKICAgICAgICB2YXIga2V5ID0gZW5zdXJlU2FmZU1lbWJlck5hbWUoaW5kZXhGbihzZWxmLCBsb2NhbHMpLCBleHByZXNzaW9uKTsKICAgICAgICAvLyBwcmV2ZW50IG92ZXJ3cml0aW5nIG9mIEZ1bmN0aW9uLmNvbnN0cnVjdG9yIHdoaWNoIHdvdWxkIGJyZWFrIGVuc3VyZVNhZmVPYmplY3QgY2hlY2sKICAgICAgICB2YXIgbyA9IGVuc3VyZVNhZmVPYmplY3Qob2JqKHNlbGYsIGxvY2FscyksIGV4cHJlc3Npb24pOwogICAgICAgIGlmICghbykgb2JqLmFzc2lnbihzZWxmLCBvID0ge30pOwogICAgICAgIHJldHVybiBvW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgfSk7CiAgfSwKCiAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbihmbkdldHRlciwgY29udGV4dEdldHRlcikgewogICAgdmFyIGFyZ3NGbiA9IFtdOwogICAgaWYgKHRoaXMucGVla1Rva2VuKCkudGV4dCAhPT0gJyknKSB7CiAgICAgIGRvIHsKICAgICAgICBhcmdzRm4ucHVzaCh0aGlzLmV4cHJlc3Npb24oKSk7CiAgICAgIH0gd2hpbGUgKHRoaXMuZXhwZWN0KCcsJykpOwogICAgfQogICAgdGhpcy5jb25zdW1lKCcpJyk7CgogICAgdmFyIGV4cHJlc3Npb25UZXh0ID0gdGhpcy50ZXh0OwogICAgLy8gd2UgY2FuIHNhZmVseSByZXVzZSB0aGUgYXJyYXkgYWNyb3NzIGludm9jYXRpb25zCiAgICB2YXIgYXJncyA9IGFyZ3NGbi5sZW5ndGggPyBbXSA6IG51bGw7CgogICAgcmV0dXJuIGZ1bmN0aW9uICRwYXJzZUZ1bmN0aW9uQ2FsbChzY29wZSwgbG9jYWxzKSB7CiAgICAgIHZhciBjb250ZXh0ID0gY29udGV4dEdldHRlciA/IGNvbnRleHRHZXR0ZXIoc2NvcGUsIGxvY2FscykgOiBzY29wZTsKICAgICAgdmFyIGZuID0gZm5HZXR0ZXIoc2NvcGUsIGxvY2FscywgY29udGV4dCkgfHwgbm9vcDsKCiAgICAgIGlmIChhcmdzKSB7CiAgICAgICAgdmFyIGkgPSBhcmdzRm4ubGVuZ3RoOwogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgIGFyZ3NbaV0gPSBlbnN1cmVTYWZlT2JqZWN0KGFyZ3NGbltpXShzY29wZSwgbG9jYWxzKSwgZXhwcmVzc2lvblRleHQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZW5zdXJlU2FmZU9iamVjdChjb250ZXh0LCBleHByZXNzaW9uVGV4dCk7CiAgICAgIGVuc3VyZVNhZmVGdW5jdGlvbihmbiwgZXhwcmVzc2lvblRleHQpOwoKICAgICAgLy8gSUUgZG9lc24ndCBoYXZlIGFwcGx5IGZvciBzb21lIG5hdGl2ZSBmdW5jdGlvbnMKICAgICAgdmFyIHYgPSBmbi5hcHBseQogICAgICAgICAgICA/IGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpCiAgICAgICAgICAgIDogZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7CgogICAgICByZXR1cm4gZW5zdXJlU2FmZU9iamVjdCh2LCBleHByZXNzaW9uVGV4dCk7CiAgICAgIH07CiAgfSwKCiAgLy8gVGhpcyBpcyB1c2VkIHdpdGgganNvbiBhcnJheSBkZWNsYXJhdGlvbgogIGFycmF5RGVjbGFyYXRpb246IGZ1bmN0aW9uKCkgewogICAgdmFyIGVsZW1lbnRGbnMgPSBbXTsKICAgIGlmICh0aGlzLnBlZWtUb2tlbigpLnRleHQgIT09ICddJykgewogICAgICBkbyB7CiAgICAgICAgaWYgKHRoaXMucGVlaygnXScpKSB7CiAgICAgICAgICAvLyBTdXBwb3J0IHRyYWlsaW5nIGNvbW1hcyBwZXIgRVM1LjEuCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxlbWVudEZucy5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTsKICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7CiAgICB9CiAgICB0aGlzLmNvbnN1bWUoJ10nKTsKCiAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZUFycmF5TGl0ZXJhbChzZWxmLCBsb2NhbHMpIHsKICAgICAgdmFyIGFycmF5ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGVsZW1lbnRGbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGFycmF5LnB1c2goZWxlbWVudEZuc1tpXShzZWxmLCBsb2NhbHMpKTsKICAgICAgfQogICAgICByZXR1cm4gYXJyYXk7CiAgICB9LCB7CiAgICAgIGxpdGVyYWw6IHRydWUsCiAgICAgIGNvbnN0YW50OiBlbGVtZW50Rm5zLmV2ZXJ5KGlzQ29uc3RhbnQpLAogICAgICBpbnB1dHM6IGVsZW1lbnRGbnMKICAgIH0pOwogIH0sCgogIG9iamVjdDogZnVuY3Rpb24oKSB7CiAgICB2YXIga2V5cyA9IFtdLCB2YWx1ZUZucyA9IFtdOwogICAgaWYgKHRoaXMucGVla1Rva2VuKCkudGV4dCAhPT0gJ30nKSB7CiAgICAgIGRvIHsKICAgICAgICBpZiAodGhpcy5wZWVrKCd9JykpIHsKICAgICAgICAgIC8vIFN1cHBvcnQgdHJhaWxpbmcgY29tbWFzIHBlciBFUzUuMS4KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmNvbnN1bWUoKTsKICAgICAgICBpZiAodG9rZW4uY29uc3RhbnQpIHsKICAgICAgICAgIGtleXMucHVzaCh0b2tlbi52YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5pZGVudGlmaWVyKSB7CiAgICAgICAgICBrZXlzLnB1c2godG9rZW4udGV4dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudGhyb3dFcnJvcigiaW52YWxpZCBrZXkiLCB0b2tlbik7CiAgICAgICAgfQogICAgICAgIHRoaXMuY29uc3VtZSgnOicpOwogICAgICAgIHZhbHVlRm5zLnB1c2godGhpcy5leHByZXNzaW9uKCkpOwogICAgICB9IHdoaWxlICh0aGlzLmV4cGVjdCgnLCcpKTsKICAgIH0KICAgIHRoaXMuY29uc3VtZSgnfScpOwoKICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlT2JqZWN0TGl0ZXJhbChzZWxmLCBsb2NhbHMpIHsKICAgICAgdmFyIG9iamVjdCA9IHt9OwogICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB2YWx1ZUZucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgb2JqZWN0W2tleXNbaV1dID0gdmFsdWVGbnNbaV0oc2VsZiwgbG9jYWxzKTsKICAgICAgfQogICAgICByZXR1cm4gb2JqZWN0OwogICAgfSwgewogICAgICBsaXRlcmFsOiB0cnVlLAogICAgICBjb25zdGFudDogdmFsdWVGbnMuZXZlcnkoaXNDb25zdGFudCksCiAgICAgIGlucHV0czogdmFsdWVGbnMKICAgIH0pOwogIH0KfTsKCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBQYXJzZXIgaGVscGVyIGZ1bmN0aW9ucwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gc2V0dGVyKG9iaiwgcGF0aCwgc2V0VmFsdWUsIGZ1bGxFeHApIHsKICBlbnN1cmVTYWZlT2JqZWN0KG9iaiwgZnVsbEV4cCk7CgogIHZhciBlbGVtZW50ID0gcGF0aC5zcGxpdCgnLicpLCBrZXk7CiAgZm9yICh2YXIgaSA9IDA7IGVsZW1lbnQubGVuZ3RoID4gMTsgaSsrKSB7CiAgICBrZXkgPSBlbnN1cmVTYWZlTWVtYmVyTmFtZShlbGVtZW50LnNoaWZ0KCksIGZ1bGxFeHApOwogICAgdmFyIHByb3BlcnR5T2JqID0gZW5zdXJlU2FmZU9iamVjdChvYmpba2V5XSwgZnVsbEV4cCk7CiAgICBpZiAoIXByb3BlcnR5T2JqKSB7CiAgICAgIHByb3BlcnR5T2JqID0ge307CiAgICAgIG9ialtrZXldID0gcHJvcGVydHlPYmo7CiAgICB9CiAgICBvYmogPSBwcm9wZXJ0eU9iajsKICB9CiAga2V5ID0gZW5zdXJlU2FmZU1lbWJlck5hbWUoZWxlbWVudC5zaGlmdCgpLCBmdWxsRXhwKTsKICBlbnN1cmVTYWZlT2JqZWN0KG9ialtrZXldLCBmdWxsRXhwKTsKICBvYmpba2V5XSA9IHNldFZhbHVlOwogIHJldHVybiBzZXRWYWx1ZTsKfQoKdmFyIGdldHRlckZuQ2FjaGVEZWZhdWx0ID0gY3JlYXRlTWFwKCk7CnZhciBnZXR0ZXJGbkNhY2hlRXhwZW5zaXZlID0gY3JlYXRlTWFwKCk7CgpmdW5jdGlvbiBpc1Bvc3NpYmx5RGFuZ2Vyb3VzTWVtYmVyTmFtZShuYW1lKSB7CiAgcmV0dXJuIG5hbWUgPT0gJ2NvbnN0cnVjdG9yJzsKfQoKLyoqCiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSAiQmxhY2sgSG9sZSIgdmFyaWFudCBmcm9tOgogKiAtIGh0dHA6Ly9qc3BlcmYuY29tL2FuZ3VsYXJqcy1wYXJzZS1nZXR0ZXIvNAogKiAtIGh0dHA6Ly9qc3BlcmYuY29tL3BhdGgtZXZhbHVhdGlvbi1zaW1wbGlmaWVkLzcKICovCmZ1bmN0aW9uIGNzcFNhZmVHZXR0ZXJGbihrZXkwLCBrZXkxLCBrZXkyLCBrZXkzLCBrZXk0LCBmdWxsRXhwLCBleHBlbnNpdmVDaGVja3MpIHsKICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXkwLCBmdWxsRXhwKTsKICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXkxLCBmdWxsRXhwKTsKICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXkyLCBmdWxsRXhwKTsKICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXkzLCBmdWxsRXhwKTsKICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXk0LCBmdWxsRXhwKTsKICB2YXIgZXNvID0gZnVuY3Rpb24obykgewogICAgcmV0dXJuIGVuc3VyZVNhZmVPYmplY3QobywgZnVsbEV4cCk7CiAgfTsKICB2YXIgZXNvMCA9IChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5MCkpID8gZXNvIDogaWRlbnRpdHk7CiAgdmFyIGVzbzEgPSAoZXhwZW5zaXZlQ2hlY2tzIHx8IGlzUG9zc2libHlEYW5nZXJvdXNNZW1iZXJOYW1lKGtleTEpKSA/IGVzbyA6IGlkZW50aXR5OwogIHZhciBlc28yID0gKGV4DQqM3O9WuxQCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PDtAAEAGbqLAqAc2wKgHYJUiH/VYenzTQbiVQIAQC/B0DgAAAQEICgCjXscATaXCjNzvVoEYAgBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNOdQABABncXwKgHYMCoBzYf9ZUiQbiVQFh6fNOAEAFT8DUAAAEBCAoATaXCAKNexzdGRTgNCnBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5MikpID8gZXNvIDogaWRlbnRpdHk7CiAgdmFyIGVzbzMgPSAoZXhwZW5zaXZlQ2hlY2tzIHx8IGlzUG9zc2libHlEYW5nZXJvdXNNZW1iZXJOYW1lKGtleTMpKSA/IGVzbyA6IGlkZW50aXR5OwogIHZhciBlc280ID0gKGV4cGVuc2l2ZUNoZWNrcyB8fCBpc1Bvc3NpYmx5RGFuZ2Vyb3VzTWVtYmVyTmFtZShrZXk0KSkgPyBlc28gOiBpZGVudGl0eTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNzcFNhZmVHZXR0ZXIoc2NvcGUsIGxvY2FscykgewogICAgdmFyIHBhdGhWYWwgPSAobG9jYWxzICYmIGxvY2Fscy5oYXNPd25Qcm9wZXJ0eShrZXkwKSkgPyBsb2NhbHMgOiBzY29wZTsKCiAgICBpZiAocGF0aFZhbCA9PSBudWxsKSByZXR1cm4gcGF0aFZhbDsKICAgIHBhdGhWYWwgPSBlc28wKHBhdGhWYWxba2V5MF0pOwoKICAgIGlmICgha2V5MSkgcmV0dXJuIHBhdGhWYWw7CiAgICBpZiAocGF0aFZhbCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkOwogICAgcGF0aFZhbCA9IGVzbzEocGF0aFZhbFtrZXkxXSk7CgogICAgaWYgKCFrZXkyKSByZXR1cm4gcGF0aFZhbDsKICAgIGlmIChwYXRoVmFsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7CiAgICBwYXRoVmFsID0gZXNvMihwYXRoVmFsW2tleTJdKTsKCiAgICBpZiAoIWtleTMpIHJldHVybiBwYXRoVmFsOwogICAgaWYgKHBhdGhWYWwgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDsKICAgIHBhdGhWYWwgPSBlc28zKHBhdGhWYWxba2V5M10pOwoKICAgIGlmICgha2V5NCkgcmV0dXJuIHBhdGhWYWw7CiAgICBpZiAocGF0aFZhbCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkOwogICAgcGF0aFZhbCA9IGVzbzQocGF0aFZhbFtrZXk0XSk7CgogICAgcmV0dXJuIHBhdGhWYWw7CiAgfTsKfQoKZnVuY3Rpb24gZ2V0dGVyRm5XaXRoRW5zdXJlU2FmZU9iamVjdChmbiwgZnVsbEV4cHJlc3Npb24pIHsKICByZXR1cm4gZnVuY3Rpb24ocywgbCkgewogICAgcmV0dXJuIGZuKHMsIGwsIGVuc3VyZVNhZmVPYmplY3QsIGZ1bGxFeHByZXNzaW9uKTsKICB9Owp9CgpmdW5jdGlvbiBnZXR0ZXJGbihwYXRoLCBvcHRpb25zLCBmdWxsRXhwKSB7CiAgdmFyIGV4cGVuc2l2ZUNoZWNrcyA9IG9wdGlvbnMuZXhwZW5zaXZlQ2hlY2tzOwogIHZhciBnZXR0ZXJGbkNhY2hlID0gKGV4cGVuc2l2ZUNoZWNrcyA/IGdldHRlckZuQ2FjaGVFeHBlbnNpdmUgOiBnZXR0ZXJGbkNhY2hlRGVmYXVsdCk7CiAgdmFyIGZuID0gZ2V0dGVyRm5DYWNoZVtwYXRoXTsKICBpZiAoZm4pIHJldHVybiBmbjsKCgogIHZhciBwYXRoS2V5cyA9IHBhdGguc3BsaXQoJy4nKSwKICAgICAgcGF0aEtleXNMZW5ndGggPSBwYXRoS2V5cy5sZW5ndGg7CgogIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2FuZ3VsYXJqcy1wYXJzZS1nZXR0ZXIvNgogIGlmIChvcHRpb25zLmNzcCkgewogICAgaWYgKHBhdGhLZXlzTGVuZ3RoIDwgNikgewogICAgICBmbiA9IGNzcFNhZmVHZXR0ZXJGbihwYXRoS2V5c1swXSwgcGF0aEtleXNbMV0sIHBhdGhLZXlzWzJdLCBwYXRoS2V5c1szXSwgcGF0aEtleXNbNF0sIGZ1bGxFeHAsIGV4cGVuc2l2ZUNoZWNrcyk7CiAgICB9IGVsc2UgewogICAgICBmbiA9IGZ1bmN0aW9uIGNzcFNhZmVHZXR0ZXIoc2NvcGUsIGxvY2FscykgewogICAgICAgIHZhciBpID0gMCwgdmFsOwogICAgICAgIGRvIHsKICAgICAgICAgIHZhbCA9IGNzcFNhZmVHZXR0ZXJGbihwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhLZXlzW2krK10sIGZ1bGxFeHAsIGV4cGVuc2l2ZUNoZWNrcykoc2NvcGUsIGxvY2Fscyk7CgogICAgICAgICAgbG9jYWxzID0gdW5kZWZpbmVkOyAvLyBjbGVhciBhZnRlciBmaXJzdCBpdGVyYXRpb24KICAgICAgICAgIHNjb3BlID0gdmFsOwogICAgICAgIH0gd2hpbGUgKGkgPCBwYXRoS2V5c0xlbmd0aCk7CiAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgfTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIGlmIChleHBlbnNpdmVDaGVja3MpIHsKICAgICAgY29kZSArPSAncyA9IGVzbyhzLCBmZSk7XG5sID0gZXNvKGwsIGZlKTtcbic7CiAgICB9CiAgICB2YXIgbmVlZHNFbnN1cmVTYWZlT2JqZWN0ID0gZXhwZW5zaXZlQ2hlY2tzOwogICAgZm9yRWFjaChwYXRoS2V5cywgZnVuY3Rpb24oa2V5LCBpbmRleCkgewogICAgICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXksIGZ1bGxFeHApOwogICAgICB2YXIgbG9va3VwSnMgPSAoaW5kZXgKICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSBkZXJlZmVyZW5jZSAncycgb24gYW55IC5kb3Qgbm90YXRpb24KICAgICAgICAgICAgICAgICAgICAgID8gJ3MnCiAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgaWYgd2UgYXJlIGZpcnN0IHRoZW4gd2UgY2hlY2sgbG9jYWxzIGZpcnN0LCBhbmQgaWYgc28gcmVhZCBpdCBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgOiAnKChsJiZsLmhhc093blByb3BlcnR5KCInICsga2V5ICsgJyIpKT9sOnMpJykgKyAnLicgKyBrZXk7CiAgICAgIGlmIChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5KSkgewogICAgICAgIGxvb2t1cEpzID0gJ2VzbygnICsgbG9va3VwSnMgKyAnLCBmZSknOwogICAgICAgIG5lZWRzRW5zdXJlU2FmZU9iamVjdCA9IHRydWU7CiAgICAgIH0KICAgICAgY29kZSArPSAnaWYocyA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuJyArCiAgICAgICAgICAgICAgJ3M9JyArIGxvb2t1cEpzICsgJztcbic7CiAgICB9KTsKICAgIGNvZGUgKz0gJ3JldHVybiBzOyc7CgogICAgLyoganNoaW50IC1XMDU0ICovCiAgICB2YXIgZXZhbGVkRm5HZXR0ZXIgPSBuZXcgRnVuY3Rpb24oJ3MnLCAnbCcsICdlc28nLCAnZmUnLCBjb2RlKTsgLy8gcz1zY29wZSwgbD1sb2NhbHMsIGVzbz1lbnN1cmVTYWZlT2JqZWN0CiAgICAvKiBqc2hpbnQgK1cwNTQgKi8KICAgIGV2YWxlZEZuR2V0dGVyLnRvU3RyaW5nID0gdmFsdWVGbihjb2RlKTsKICAgIGlmIChuZWVkc0Vuc3VyZVNhZmVPYmplY3QpIHsKICAgICAgZXZhbGVkRm5HZXR0ZXIgPSBnZXR0ZXJGbldpdGhFbnN1cmVTYWZlT2JqZWN0KGV2YWxlZEZuR2V0dGVyLCBmdWxsRXhwKTsKICAgIH0KICAgIGZuID0gZXZhbGVkRm5HZXR0ZXI7CiAgfQoKICBmbi5zaGFyZWRHZXR0ZXIgPSB0cnVlOwogIGZuLmFzc2lnbiA9IGZ1bmN0aW9uKHNlbGYsIHZhbHVlKSB7CiAgICByZXR1cm4gc2V0dGVyKHNlbGYsIHBhdGgsIHZhbHVlLCBwYXRoKTsKICB9OwogIGdldHRlckZuQ2FjaGVbcGF0aF0gPSBmbjsKICByZXR1cm4gZm47Cn0KCnZhciBvYmplY3RWYWx1ZU9mID0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mOwoKZnVuY3Rpb24gZ2V0VmFsdWVPZih2YWx1ZSkgewogIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlLnZhbHVlT2YpID8gdmFsdWUudmFsdWVPZigpIDogb2JqZWN0VmFsdWVPZi5jYWxsKHZhbHVlKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8qKgogKiBAbmdkb2Mgc2VydmljZQogKiBAbmFtZSAkcGFyc2UKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqCiAqIENvbnZlcnRzIEFuZ3VsYXIge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaW50byBhIGZ1bmN0aW9uLgogKgogKiBgYGBqcwogKiAgIHZhciBnZXR0ZXIgPSAkcGFyc2UoJ3VzZXIubmFtZScpOwogKiAgIHZhciBzZXR0ZXIgPSBnZXR0ZXIuYXNzaWduOwogKiAgIHZhciBjb250ZXh0ID0ge3VzZXI6e25hbWU6J2FuZ3VsYXInfX07CiAqICAgdmFyIGxvY2FscyA9IHt1c2VyOntuYW1lOidsb2NhbCd9fTsKICoKICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQpKS50b0VxdWFsKCdhbmd1bGFyJyk7CiAqICAgc2V0dGVyKGNvbnRleHQsICduZXdWYWx1ZScpOwogKiAgIGV4cGVjdChjb250ZXh0LnVzZXIubmFtZSkudG9FcXVhbCgnbmV3VmFsdWUnKTsKICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQsIGxvY2FscykpLnRvRXF1YWwoJ2xvY2FsJyk7CiAqIGBgYAogKgogKgogKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLgogKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOgogKgogKiAgICAqIGBjb250ZXh0YCDigJMgYHtvYmplY3R9YCDigJMgYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzCiAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLgogKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluCiAqICAgICAgYGNvbnRleHRgLgogKgogKiAgICBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gYWxzbyBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogKiAgICAgICogYGxpdGVyYWxgIOKAkyBge2Jvb2xlYW59YCDigJMgd2hldGhlciB0aGUgZXhwcmVzc2lvbidzIHRvcC1sZXZlbCBub2RlIGlzIGEgSmF2YVNjcmlwdAogKiAgICAgICAgbGl0ZXJhbC4KICogICAgICAqIGBjb25zdGFudGAg4oCTIGB7Ym9vbGVhbn1gIOKAkyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIG1hZGUgZW50aXJlbHkgb2YgSmF2YVNjcmlwdAogKiAgICAgICAgY29uc3RhbnQgbGl0ZXJhbHMuCiAqICAgICAgKiBgYXNzaWduYCDigJMgYHs/ZnVuY3Rpb24oY29udGV4dCwgdmFsdWUpfWAg4oCTIGlmIHRoZSBleHByZXNzaW9uIGlzIGFzc2lnbmFibGUsIHRoaXMgd2lsbCBiZQogKiAgICAgICAgc2V0IHRvIGEgZnVuY3Rpb24gdG8gY2hhbmdlIGl0cyB2YWx1ZSBvbiB0aGUgZ2l2ZW4gY29udGV4dC4KICoKICovCgoKLyoqCiAqIEBuZ2RvYyBwcm92aWRlcgogKiBAbmFtZSAkcGFyc2VQcm92aWRlcgogKgogKiBAZGVzY3JpcHRpb24KICogYCRwYXJzZVByb3ZpZGVyYCBjYW4gYmUgdXNlZCBmb3IgY29uZmlndXJpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIHtAbGluayBuZy4kcGFyc2UgJHBhcnNlfQogKiAgc2VydmljZS4KICovCmZ1bmN0aW9uICRQYXJzZVByb3ZpZGVyKCkgewogIHZhciBjYWNoZURlZmF1bHQgPSBjcmVhdGVNYXAoKTsKICB2YXIgY2FjaGVFeHBlbnNpdmUgPSBjcmVhdGVNYXAoKTsKCgoKICB0aGlzLiRnZXQgPSBbJyRmaWx0ZXInLCAnJHNuaWZmZXInLCBmdW5jdGlvbigkZmlsdGVyLCAkc25pZmZlcikgewogICAgdmFyICRwYXJzZU9wdGlvbnMgPSB7CiAgICAgICAgICBjc3A6ICRzbmlmZmVyLmNzcCwKICAgICAgICAgIGV4cGVuc2l2ZUNoZWNrczogZmFsc2UKICAgICAgICB9LAogICAgICAgICRwYXJzZU9wdGlvbnNFeHBlbnNpdmUgPSB7CiAgICAgICAgICBjc3A6ICRzbmlmZmVyLmNzcCwKICAgICAgICAgIGV4cGVuc2l2ZUNoZWNrczogdHJ1ZQogICAgICAgIH07CgogICAgZnVuY3Rpb24gd3JhcFNoYXJlZEV4cHJlc3Npb24oZXhwKSB7CiAgICAgIHZhciB3cmFwcGVkID0gZXhwOwoKICAgICAgaWYgKGV4cC5zaGFyZWRHZXR0ZXIpIHsKICAgICAgICB3cmFwcGVkID0gZnVuY3Rpb24gJHBhcnNlV3JhcHBlcihzZWxmLCBsb2NhbHMpIHsKICAgICAgICAgIHJldHVybiBleHAoc2VsZiwgbG9jYWxzKTsKICAgICAgICB9OwogICAgICAgIHdyYXBwZWQubGl0ZXJhbCA9IGV4cC5saXRlcmFsOwogICAgICAgIHdyYXBwZWQuY29uc3RhbnQgPSBleHAuY29uc3RhbnQ7CiAgICAgICAgd3JhcHBlZC5hc3NpZ24gPSBleHAuYXNzaWduOwogICAgICB9CgogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24gJHBhcnNlKGV4cCwgaW50ZXJjZXB0b3JGbiwgZXhwZW5zaXZlQ2hlY2tzKSB7CiAgICAgIHZhciBwYXJzZWRFeHByZXNzaW9uLCBvbmVUaW1lLCBjYWNoZUtleTsKCiAgICAgIHN3aXRjaCAodHlwZW9mIGV4cCkgewogICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICBjYWNoZUtleSA9IGV4cCA9IGV4cC50cmltKCk7CgogICAgICAgICAgdmFyIGNhY2hlID0gKGV4cGVuc2l2ZUNoZWNrcyA/IGNhY2hlRXhwZW5zaXZlIDogY2FjaGVEZWZhdWx0KTsKICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24gPSBjYWNoZVtjYWNoZUtleV07CgogICAgICAgICAgaWYgKCFwYXJzZWRFeHByZXNzaW9uKSB7CiAgICAgICAgICAgIGlmIChleHAuY2hhckF0KDApID09PSAnOicgJiYgZXhwLmNoYXJBdCgxKSA9PT0gJzonKSB7CiAgICAgICAgICAgICAgb25lVGltZSA9IHRydWU7CiAgICAgICAgICAgICAgZXhwID0gZXhwLnN1YnN0cmluZygyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHBhcnNlT3B0aW9ucyA9IGV4cGVuc2l2ZUNoZWNrcyA/ICRwYXJzZU9wdGlvbnNFeHBlbnNpdmUgOiAkcGFyc2VPcHRpb25zOwogICAgICAgICAgICB2YXIgbGV4ZXIgPSBuZXcgTGV4ZXIocGFyc2VPcHRpb25zKTsKICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBQYXJzZXIobGV4ZXIsICRmaWx0ZXIsIHBhcnNlT3B0aW9ucyk7CiAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2UoZXhwKTsKCiAgICAgICAgICAgIGlmIChwYXJzZWRFeHByZXNzaW9uLmNvbnN0YW50KSB7CiAgICAgICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgPSBjb25zdGFudFdhdGNoRGVsZWdhdGU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob25lVGltZSkgewogICAgICAgICAgICAgIC8vb25lVGltZSBpcyBub3QgcGFydCBvZiB0aGUgZXhwIHBhc3NlZCB0byB0aGUgUGFyc2VyIHNvIHdlIG1heSBoYXZlIHRvCiAgICAgICAgICAgICAgLy93cmFwIHRoZSBwYXJzZWRFeHByZXNzaW9uIGJlZm9yZSBhZGRpbmcgYSAkJHdhdGNoRGVsZWdhdGUKICAgICAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uID0gd3JhcFNoYXJlZEV4cHJlc3Npb24ocGFyc2VkRXhwcmVzc2lvbik7CiAgICAgICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgPSBwYXJzZWRFeHByZXNzaW9uLmxpdGVyYWwgPwogICAgICAgICAgICAgICAgb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlIDogb25lVGltZVdhdGNoRGVsZWdhdGU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VkRXhwcmVzc2lvbi5pbnB1dHMpIHsKICAgICAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZSA9IGlucHV0c1dhdGNoRGVsZWdhdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNhY2hlW2NhY2hlS2V5XSA9IHBhcnNlZEV4cHJlc3Npb247CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYWRkSW50ZXJjZXB0b3IocGFyc2VkRXhwcmVzc2lvbiwgaW50ZXJjZXB0b3JGbik7CgogICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoKICAgICAgICAgIHJldHVybiBhZGRJbnRlcmNlcHRvcihleHAsIGludGVyY2VwdG9yRm4pOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGFkZEludGVyY2VwdG9yKG5vb3AsIGludGVyY2VwdG9yRm4pOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNvbGxlY3RFeHByZXNzaW9uSW5wdXRzKGlucHV0cywgbGlzdCkgewogICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbnB1dHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIHZhciBpbnB1dCA9IGlucHV0c1tpXTsKICAgICAgICBpZiAoIWlucHV0LmNvbnN0YW50KSB7CiAgICAgICAgICBpZiAoaW5wdXQuaW5wdXRzKSB7CiAgICAgICAgICAgIGNvbGxlY3RFeHByZXNzaW9uSW5wdXRzKGlucHV0LmlucHV0cywgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgaWYgKGxpc3QuaW5kZXhPZihpbnB1dCkgPT09IC0xKSB7IC8vIFRPRE8ocGVyZikgY2FuIHdlIGRvIGJldHRlcj8KICAgICAgICAgICAgbGlzdC5wdXNoKGlucHV0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2sobmV3VmFsdWUsIG9sZFZhbHVlT2ZWYWx1ZSkgewoKICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwgfHwgb2xkVmFsdWVPZlZhbHVlID09IG51bGwpIHsgLy8gbnVsbC91bmRlZmluZWQKICAgICAgICByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlT2ZWYWx1ZTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcpIHsKCiAgICAgICAgLy8gYXR0ZW1wdCB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0byBhIHByaW1pdGl2ZSB0eXBlCiAgICAgICAgLy8gVE9ETyhkb2NzKTogYWRkIGEgbm90ZSB0byBkb2NzIHRoYXQgYnkgaW1wbGVtZW50aW5nIHZhbHVlT2YgZXZlbiBvYmplY3RzIGFuZCBhcnJheXMgY2FuCiAgICAgICAgLy8gICAgICAgICAgICAgYmUgY2hlYXBseSBkaXJ0eS1jaGVja2VkCiAgICAgICAgbmV3VmFsdWUgPSBnZXRWYWx1ZU9mKG5ld1ZhbHVlKTsKCiAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIC8vIG9iamVjdHMvYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIC0gZGVlcC13YXRjaGluZyB0aGVtIHdvdWxkIGJlIHRvbyBleHBlbnNpdmUKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIGZhbGwtdGhyb3VnaCB0byB0aGUgcHJpbWl0aXZlIGVxdWFsaXR5IGNoZWNrCiAgICAgIH0KCiAgICAgIC8vUHJpbWl0aXZlIG9yIE5hTgogICAgICByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlT2ZWYWx1ZSB8fCAobmV3VmFsdWUgIT09IG5ld1ZhbHVlICYmIG9sZFZhbHVlT2ZWYWx1ZSAhPT0gb2xkVmFsdWVPZlZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnB1dHNXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24pIHsKICAgICAgdmFyIGlucHV0RXhwcmVzc2lvbnMgPSBwYXJzZWRFeHByZXNzaW9uLiQkaW5wdXRzIHx8CiAgICAgICAgICAgICAgICAgICAgKHBhcnNlZEV4cHJlc3Npb24uJCRpbnB1dHMgPSBjb2xsZWN0RXhwcmVzc2lvbklucHV0cyhwYXJzZWRFeHByZXNzaW9uLmlucHV0cywgW10pKTsKCiAgICAgIHZhciBsYXN0UmVzdWx0OwoKICAgICAgaWYgKGlucHV0RXhwcmVzc2lvbnMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgdmFyIG9sZElucHV0VmFsdWUgPSBleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrOyAvLyBpbml0IHRvIHNvbWV0aGluZyB1bmlxdWUgc28gdGhhdCBlcXVhbHMgY2hlY2sgZmFpbHMKICAgICAgICBpbnB1dEV4cHJlc3Npb25zID0gaW5wdXRFeHByZXNzaW9uc1swXTsKICAgICAgICByZXR1cm4gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIGV4cHJlc3Npb25JbnB1dFdhdGNoKHNjb3BlKSB7CiAgICAgICAgICB2YXIgbmV3SW5wdXRWYWx1ZSA9IGlucHV0RXhwcmVzc2lvbnMoc2NvcGUpOwogICAgICAgICAgaWYgKCFleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrKG5ld0lucHV0VmFsdWUsIG9sZElucHV0VmFsdWUpKSB7CiAgICAgICAgICAgIGxhc3RSZXN1bHQgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTsKICAgICAgICAgICAgb2xkSW5wdXRWYWx1ZSA9IG5ld0lucHV0VmFsdWUgJiYgZ2V0VmFsdWVPZihuZXdJbnB1dFZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0OwogICAgICAgIH0sIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSk7CiAgICAgIH0KCiAgICAgIHZhciBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgb2xkSW5wdXRWYWx1ZU9mVmFsdWVzW2ldID0gZXhwcmVzc2lvbklucHV0RGlydHlDaGVjazsgLy8gaW5pdCB0byBzb21ldGhpbmcgdW5pcXVlIHNvIHRoYXQgZXF1YWxzIGNoZWNrIGZhaWxzCiAgICAgIH0KCiAgICAgIHJldHVybiBzY29wZS4kd2F0Y2goZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0c1dhdGNoKHNjb3BlKSB7CiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTsKCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICB2YXIgbmV3SW5wdXRWYWx1ZSA9IGlucHV0RXhwcmVzc2lvbnNbaV0oc2NvcGUpOwogICAgICAgICAgaWYgKGNoYW5nZWQgfHwgKGNoYW5nZWQgPSAhZXhwcmVzc2lvbklucHV0RGlydHlDaGVjayhuZXdJbnB1dFZhbHVlLCBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXNbaV0pKSkgewogICAgICAgICAgICBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXNbaV0gPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgICAgbGFzdFJlc3VsdCA9IHBhcnNlZEV4cHJlc3Npb24oc2NvcGUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7CiAgICAgIH0sIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25lVGltZVdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbikgewogICAgICB2YXIgdW53YXRjaCwgbGFzdFZhbHVlOwogICAgICByZXR1cm4gdW53YXRjaCA9IHNjb3BlLiR3YXRjaChmdW5jdGlvbiBvbmVUaW1lV2F0Y2goc2NvcGUpIHsKICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7CiAgICAgIH0sIGZ1bmN0aW9uIG9uZVRpbWVMaXN0ZW5lcih2YWx1ZSwgb2xkLCBzY29wZSkgewogICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlOwogICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgewogICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgIHNjb3BlLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChsYXN0VmFsdWUpKSB7CiAgICAgICAgICAgICAgdW53YXRjaCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sIG9iamVjdEVxdWFsaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbmVUaW1lTGl0ZXJhbFdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbikgewogICAgICB2YXIgdW53YXRjaCwgbGFzdFZhbHVlOwogICAgICByZXR1cm4gdW53YXRjaCA9IHNjb3BlLiR3YXRjaChmdW5jdGlvbiBvbmVUaW1lV2F0Y2goc2NvcGUpIHsKICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7CiAgICAgIH0sIGZ1bmN0aW9uIG9uZVRpbWVMaXN0ZW5lcih2YWx1ZSwgb2xkLCBzY29wZSkgewogICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlOwogICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgewogICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB2YWx1ZSwgb2xkLCBzY29wZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0FsbERlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICBzY29wZS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChpc0FsbERlZmluZWQobGFzdFZhbHVlKSkgdW53YXRjaCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LCBvYmplY3RFcXVhbGl0eSk7CgogICAgICBmdW5jdGlvbiBpc0FsbERlZmluZWQodmFsdWUpIHsKICAgICAgICB2YXIgYWxsRGVmaW5lZCA9IHRydWU7CiAgICAgICAgZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24odmFsKSB7CiAgICAgICAgICBpZiAoIWlzRGVmaW5lZCh2YWwpKSBhbGxEZWZpbmVkID0gZmFsc2U7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGFsbERlZmluZWQ7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudFdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbikgewogICAgICB2YXIgdW53YXRjaDsKICAgICAgcmV0dXJuIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2goZnVuY3Rpb24gY29uc3RhbnRXYXRjaChzY29wZSkgewogICAgICAgIHJldHVybiBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTsKICAgICAgfSwgZnVuY3Rpb24gY29uc3RhbnRMaXN0ZW5lcih2YWx1ZSwgb2xkLCBzY29wZSkgewogICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgewogICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgdW53YXRjaCgpOwogICAgICB9LCBvYmplY3RFcXVhbGl0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkSW50ZXJjZXB0b3IocGFyc2VkRXhwcmVzc2lvbiwgaW50ZXJjZXB0b3JGbikgewogICAgICBpZiAoIWludGVyY2VwdG9yRm4pIHJldHVybiBwYXJzZWRFeHByZXNzaW9uOwogICAgICB2YXIgd2F0Y2hEZWxlZ2F0ZSA9IHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlOwoKICAgICAgdmFyIHJlZ3VsYXJXYXRjaCA9CiAgICAgICAgICB3YXRjaERlbGVnYXRlICE9PSBvbmVUaW1lTGl0ZXJhbFdhdGNoRGVsZWdhdGUgJiYKICAgICAgICAgIHdhdGNoRGVsZWdhdGUgIT09IG9uZVRpbWVXYXRjaERlbGVnYXRlOwoKICAgICAgdmFyIGZuID0gcmVndWxhcldhdGNoID8gZnVuY3Rpb24gcmVndWxhckludGVyY2VwdGVkRXhwcmVzc2lvbihzY29wZSwgbG9jYWxzKSB7CiAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VkRXhwcmVzc2lvbihzY29wZSwgbG9jYWxzKTsKICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JGbih2YWx1ZSwgc2NvcGUsIGxvY2Fscyk7CiAgICAgIH0gOiBmdW5jdGlvbiBvbmVUaW1lSW50ZXJjZXB0ZWRFeHByZXNzaW9uKHNjb3BlLCBsb2NhbHMpIHsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlLCBsb2NhbHMpOwogICAgICAgIHZhciByZXN1bHQgPSBpbnRlcmNlcHRvckZuKHZhbHVlLCBzY29wZSwgbG9jYWxzKTsKICAgICAgICAvLyB3ZSBvbmx5IHJldHVybiB0aGUgaW50ZXJjZXB0b3IncyByZXN1bHQgaWYgdGhlCiAgICAgICAgLy8gaW5pdGlhbCB2YWx1ZSBpcyBkZWZpbmVkIChmb3IgYmluZC1vbmNlKQogICAgICAgIHJldHVybiBpc0RlZmluZWQodmFsdWUpID8gcmVzdWx0IDogdmFsdWU7CiAgICAgIH07CgogICAgICAvLyBQcm9wYWdhdGUgJCR3YXRjaERlbGVnYXRlcyBvdGhlciB0aGVuIGlucHV0c1dhdGNoRGVsZWdhdGUKICAgICAgaWYgKHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlICYmCiAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZSAhPT0gaW5wdXRzV2F0Y2hEZWxlZ2F0ZSkgewogICAgICAgIGZuLiQkd2F0Y2hEZWxlZ2F0ZSA9IHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlOwogICAgICB9IGVsc2UgaWYgKCFpbnRlcmNlcHRvckZuLiRzdGF0ZWZ1bCkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGludGVyY2VwdG9yLCBidXQgbm8gd2F0Y2hEZWxlZ2F0ZSB0aGVuIHRyZWF0IHRoZSBpbnRlcmNlcHRvciBsaWtlCiAgICAgICAgLy8gd2UgdHJlYXQgZmlsdGVycyAtIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBwdXJlIGZ1bmN0aW9uIHVubGVzcyBmbGFnZ2VkIHdpdGggJHN0YXRlZnVsCiAgICAgICAgZm4uJCR3YXRjaERlbGVnYXRlID0gaW5wdXRzV2F0Y2hEZWxlZ2F0ZTsKICAgICAgICBmbi5pbnB1dHMgPSBbcGFyc2VkRXhwcmVzc2lvbl07CiAgICAgIH0KCiAgICAgIHJldHVybiBmbjsKICAgIH0KICB9XTsKfQoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRxCiAqIEByZXF1aXJlcyAkcm9vdFNjb3BlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBBIHNlcnZpY2UgdGhhdCBoZWxwcyB5b3UgcnVuIGZ1bmN0aW9ucyBhc3luY2hyb25vdXNseSwgYW5kIHVzZSB0aGVpciByZXR1cm4gdmFsdWVzIChvciBleGNlcHRpb25zKQogKiB3aGVuIHRoZXkgYXJlIGRvbmUgcHJvY2Vzc2luZy4KICoKICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBwcm9taXNlcy9kZWZlcnJlZCBvYmplY3RzIGluc3BpcmVkIGJ5CiAqIFtLcmlzIEtvd2FsJ3MgUV0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKS4KICoKICogJHEgY2FuIGJlIHVzZWQgaW4gdHdvIGZhc2hpb25zIC0tLSBvbmUgd2hpY2ggaXMgbW9yZSBzaW1pbGFyIHRvIEtyaXMgS293YWwncyBRIG9yIGpRdWVyeSdzIERlZmVycmVkCiAqIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZSBvdGhlciB3aGljaCByZXNlbWJsZXMgRVM2IHByb21pc2VzIHRvIHNvbWUgZGVncmVlLgogKgogKiAjICRxIGNvbnN0cnVjdG9yCiAqCiAqIFRoZSBzdHJlYW1saW5lZCBFUzYgc3R5bGUgcHJvbWlzZSBpcyBlc3NlbnRpYWxseSBqdXN0IHVzaW5nICRxIGFzIGEgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYSBgcmVzb2x2ZXJgCiAqIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBuYXRpdmUgUHJvbWlzZSBpbXBsZW1lbnRhdGlvbiBmcm9tIEVTNiBIYXJtb255LAogKiBzZWUgW01ETl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZSkuCiAqCiAqIFdoaWxlIHRoZSBjb25zdHJ1Y3Rvci1zdHlsZSB1c2UgaXMgc3VwcG9ydGVkLCBub3QgYWxsIG9mIHRoZSBzdXBwb3J0aW5nIG1ldGhvZHMgZnJvbSBFUzYgSGFybW9ueSBwcm9taXNlcyBhcmUKICogYXZhaWxhYmxlIHlldC4KICoKICogSXQgY2FuIGJlIHVzZWQgbGlrZSBzbzoKICoKICogYGBganMKICogICAvLyBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBleGFtcGxlIGxldCdzIGFzc3VtZSB0aGF0IHZhcmlhYmxlcyBgJHFgIGFuZCBgb2tUb0dyZWV0YAogKiAgIC8vIGFyZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbCBzY29wZSAodGhleSBjb3VsZCBoYXZlIGJlZW4gaW5qZWN0ZWQgb3IgcGFzc2VkIGluKS4KICoKICogICBmdW5jdGlvbiBhc3luY0dyZWV0KG5hbWUpIHsKICogICAgIC8vIHBlcmZvcm0gc29tZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLCByZXNvbHZlIG9yIHJlamVjdCB0aGUgcHJvbWlzZSB3aGVuIGFwcHJvcHJpYXRlLgogKiAgICAgcmV0dXJuICRxKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogKiAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogKiAgICAgICAgIGlmIChva1RvR3JlZXQobmFtZSkpIHsKICogICAgICAgICAgIHJlc29sdmUoJ0hlbGxvLCAnICsgbmFtZSArICchJyk7CiAqICAgICAgICAgfSBlbHNlIHsKICogICAgICAgICAgIHJlamVjdCgnR3JlZXRpbmcgJyArIG5hbWUgKyAnIGlzIG5vdCBhbGxvd2VkLicpOwogKiAgICAgICAgIH0KICogICAgICAgfSwgMTAwMCk7CiAqICAgICB9KTsKICogICB9CiAqCiAqICAgdmFyIHByb21pc2UgPSBhc3luY0dyZWV0KCdSb2JpbiBIb29kJyk7CiAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7CiAqICAgICBhbGVydCgnU3VjY2VzczogJyArIGdyZWV0aW5nKTsKICogICB9LCBmdW5jdGlvbihyZWFzb24pIHsKICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pOwogKiAgIH0pOwogKiBgYGAKICoKICogTm90ZTogcHJvZ3Jlc3Mvbm90aWZ5IGNhbGxiYWNrcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgdmlhIHRoZSBFUzYtc3R5bGUgaW50ZXJmYWNlLgogKgogKiBIb3dldmVyLCB0aGUgbW9yZSB0cmFkaXRpb25hbCBDb21tb25KUy1zdHlsZSB1c2FnZSBpcyBzdGlsbCBhdmFpbGFibGUsIGFuZCBkb2N1bWVudGVkIGJlbG93LgogKgogKiBbVGhlIENvbW1vbkpTIFByb21pc2UgcHJvcG9zYWxdKGh0dHA6Ly93aWtpLmNvbW1vbmpzLm9yZy93aWtpL1Byb21pc2VzKSBkZXNjcmliZXMgYSBwcm9taXNlIGFzIGFuCiAqIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4gYWN0aW9uIHRoYXQgaXMKICogcGVyZm9ybWVkIGFzeW5jaHJvbm91c2x5LCBhbmQgbWF5IG9yIG1heSBub3QgYmUgZmluaXNoZWQgYXQgYW55IGdpdmVuIHBvaW50IGluIHRpbWUuCiAqCiAqIEZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGRlYWxpbmcgd2l0aCBlcnJvciBoYW5kbGluZywgZGVmZXJyZWQgYW5kIHByb21pc2UgQVBJcyBhcmUgdG8KICogYXN5bmNocm9ub3VzIHByb2dyYW1taW5nIHdoYXQgYHRyeWAsIGBjYXRjaGAgYW5kIGB0aHJvd2Aga2V5d29yZHMgYXJlIHRvIHN5bmNocm9ub3VzIHByb2dyYW1taW5nLgogKgogKiBgYGBqcwogKiAgIC8vIGZvciB0aGUgcHVycG9zZSBvZiB0aGlzIGV4YW1wbGUgbGV0J3MgYXNzdW1lIHRoYXQgdmFyaWFibGVzIGAkcWAgYW5kIGBva1RvR3JlZXRgCiAqICAgLy8gYXJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlICh0aGV5IGNvdWxkIGhhdmUgYmVlbiBpbmplY3RlZCBvciBwYXNzZWQgaW4pLgogKgogKiAgIGZ1bmN0aW9uIGFzeW5jR3JlZXQobmFtZSkgewogKiAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTsKICoKICogICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAqICAgICAgIGRlZmVycmVkLm5vdGlmeSgnQWJvdXQgdG8gZ3JlZXQgJyArIG5hbWUgKyAnLicpOwogKgogKiAgICAgICBpZiAob2tUb0dyZWV0KG5hbWUpKSB7CiAqICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgnSGVsbG8sICcgKyBuYW1lICsgJyEnKTsKICogICAgICAgfSBlbHNlIHsKICogICAgICAgICBkZWZlcnJlZC5yZWplY3QoJ0dyZWV0aW5nICcgKyBuYW1lICsgJyBpcyBub3QgYWxsb3dlZC4nKTsKICogICAgICAgfQogKiAgICAgfSwgMTAwMCk7CiAqCiAqICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKICogICB9CiAqCiAqICAgdmFyIHByb21pc2UgPSBhc3luY0dyZWV0KCdSb2JpbiBIb29kJyk7CiAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7CiAqICAgICBhbGVydCgnU3VjY2VzczogJyArIGdyZWV0aW5nKTsKICogICB9LCBmdW5jdGlvbihyZWFzb24pIHsKICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pOwogKiAgIH0sIGZ1bmN0aW9uKHVwZGF0ZSkgewogKiAgICAgYWxlcnQoJ0dvdCBub3RpZmljYXRpb246ICcgKyB1cGRhdGUpOwogKiAgIH0pOwogKiBgYGAKICoKICogQXQgZmlyc3QgaXQgbWlnaHQgbm90IGJlIG9idmlvdXMgd2h5IHRoaXMgZXh0cmEgY29tcGxleGl0eSBpcyB3b3J0aCB0aGUgdHJvdWJsZS4gVGhlIHBheW9mZgogKiBjb21lcyBpbiB0aGUgd2F5IG9mIGd1YXJhbnRlZXMgdGhhdCBwcm9taXNlIGFuZCBkZWZlcnJlZCBBUElzIG1ha2UsIHNlZQogKiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3VuY29tbW9uanMvYmxvYi9tYXN0ZXIvcHJvbWlzZXMvc3BlY2lmaWNhdGlvbi5tZC4KICoKICogQWRkaXRpb25hbGx5IHRoZSBwcm9taXNlIGFwaSBhbGxvd3MgZm9yIGNvbXBvc2l0aW9uIHRoYXQgaXMgdmVyeSBoYXJkIHRvIGRvIHdpdGggdGhlCiAqIHRyYWRpdGlvbmFsIGNhbGxiYWNrIChbQ1BTXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbnRpbnVhdGlvbi1wYXNzaW5nX3N0eWxlKSkgYXBwcm9hY2guCiAqIEZvciBtb3JlIG9uIHRoaXMgcGxlYXNlIHNlZSB0aGUgW1EgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKSBlc3BlY2lhbGx5IHRoZQogKiBzZWN0aW9uIG9uIHNlcmlhbCBvciBwYXJhbGxlbCBqb2luaW5nIG9mIHByb21pc2VzLgogKgogKiAjIFRoZSBEZWZlcnJlZCBBUEkKICoKICogQSBuZXcgaW5zdGFuY2Ugb2YgZGVmZXJyZWQgaXMgY29uc3RydWN0ZWQgYnkgY2FsbGluZyBgJHEuZGVmZXIoKWAuCiAqCiAqIFRoZSBwdXJwb3NlIG9mIHRoZSBkZWZlcnJlZCBvYmplY3QgaXMgdG8gZXhwb3NlIHRoZSBhc3NvY2lhdGVkIFByb21pc2UgaW5zdGFuY2UgYXMgd2VsbCBhcyBBUElzCiAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNpZ25hbGluZyB0aGUgc3VjY2Vzc2Z1bCBvciB1bnN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgYXMgd2VsbCBhcyB0aGUgc3RhdHVzCiAqIG9mIHRoZSB0YXNrLgogKgogKiAqKk1ldGhvZHMqKgogKgogKiAtIGByZXNvbHZlKHZhbHVlKWAg4oCTIHJlc29sdmVzIHRoZSBkZXJpdmVkIHByb21pc2Ugd2l0aCB0aGUgYHZhbHVlYC4gSWYgdGhlIHZhbHVlIGlzIGEgcmVqZWN0aW9uCiAqICAgY29uc3RydWN0ZWQgdmlhIGAkcS5yZWplY3RgLCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIGluc3RlYWQuCiAqIC0gYHJlamVjdChyZWFzb24pYCDigJMgcmVqZWN0cyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGByZWFzb25gLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KICogICByZXNvbHZpbmcgaXQgd2l0aCBhIHJlamVjdGlvbiBjb25zdHJ1Y3RlZCB2aWEgYCRxLnJlamVjdGAuCiAqIC0gYG5vdGlmeSh2YWx1ZSlgIC0gcHJvdmlkZXMgdXBkYXRlcyBvbiB0aGUgc3RhdHVzIG9mIHRoZSBwcm9taXNlJ3MgZXhlY3V0aW9uLiBUaGlzIG1heSBiZSBjYWxsZWQKICogICBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgdGhlIHByb21pc2UgaXMgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkLgogKgogKiAqKlByb3BlcnRpZXMqKgogKgogKiAtIHByb21pc2Ug4oCTIGB7UHJvbWlzZX1gIOKAkyBwcm9taXNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZWZlcnJlZC4KICoKICoKICogIyBUaGUgUHJvbWlzZSBBUEkKICoKICogQSBuZXcgcHJvbWlzZSBpbnN0YW5jZSBpcyBjcmVhdGVkIHdoZW4gYSBkZWZlcnJlZCBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5CiAqIGNhbGxpbmcgYGRlZmVycmVkLnByb21pc2VgLgogKgogKiBUaGUgcHVycG9zZSBvZiB0aGUgcHJvbWlzZSBvYmplY3QgaXMgdG8gYWxsb3cgZm9yIGludGVyZXN0ZWQgcGFydGllcyB0byBnZXQgYWNjZXNzIHRvIHRoZSByZXN1bHQKICogb2YgdGhlIGRlZmVycmVkIHRhc2sgd2hlbiBpdCBjb21wbGV0ZXMuCiAqCiAqICoqTWV0aG9kcyoqCiAqCiAqIC0gYHRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBub3RpZnlDYWxsYmFjaylgIOKAkyByZWdhcmRsZXNzIG9mIHdoZW4gdGhlIHByb21pc2Ugd2FzIG9yCiAqICAgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCwgYHRoZW5gIGNhbGxzIG9uZSBvZiB0aGUgc3VjY2VzcyBvciBlcnJvciBjYWxsYmFja3MgYXN5bmNocm9ub3VzbHkKICogICBhcyBzb29uIGFzIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlLiBUaGUgY2FsbGJhY2tzIGFyZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudDogdGhlIHJlc3VsdAogKiAgIG9yIHJlamVjdGlvbiByZWFzb24uIEFkZGl0aW9uYWxseSwgdGhlIG5vdGlmeSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIHplcm8gb3IgbW9yZSB0aW1lcyB0bwogKiAgIHByb3ZpZGUgYSBwcm9ncmVzcyBpbmRpY2F0aW9uLCBiZWZvcmUgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCiAqCiAqICAgVGhpcyBtZXRob2QgKnJldHVybnMgYSBuZXcgcHJvbWlzZSogd2hpY2ggaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCiAqICAgYHN1Y2Nlc3NDYWxsYmFja2AsIGBlcnJvckNhbGxiYWNrYC4gSXQgYWxzbyBub3RpZmllcyB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKICogICBgbm90aWZ5Q2FsbGJhY2tgIG1ldGhvZC4gVGhlIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIGZyb20gdGhlIG5vdGlmeUNhbGxiYWNrCiAqICAgbWV0aG9kLgogKgogKiAtIGBjYXRjaChlcnJvckNhbGxiYWNrKWAg4oCTIHNob3J0aGFuZCBmb3IgYHByb21pc2UudGhlbihudWxsLCBlcnJvckNhbGxiYWNrKWAKICoKICogLSBgZmluYWxseShjYWxsYmFjaywgbm90aWZ5Q2FsbGJhY2spYCDigJMgYWxsb3dzIHlvdSB0byBvYnNlcnZlIGVpdGhlciB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIGEgcHJvbWlzZSwKICogICBidXQgdG8gZG8gc28gd2l0aG91dCBtb2RpZnlpbmcgdGhlIGZpbmFsIHZhbHVlLiBUaGlzIGlzIHVzZWZ1bCB0byByZWxlYXNlIHJlc291cmNlcyBvciBkbyBzb21lCiAqICAgY2xlYW4tdXAgdGhhdCBuZWVkcyB0byBiZSBkb25lIHdoZXRoZXIgdGhlIHByb21pc2Ugd2FzIHJlamVjdGVkIG9yIHJlc29sdmVkLiBTZWUgdGhlIFtmdWxsCiAqICAgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL3dpa2kvQVBJLVJlZmVyZW5jZSNwcm9taXNlZmluYWxseWNhbGxiYWNrKSBmb3IKICogICBtb3JlIGluZm9ybWF0aW9uLgogKgogKiAjIENoYWluaW5nIHByb21pc2VzCiAqCiAqIEJlY2F1c2UgY2FsbGluZyB0aGUgYHRoZW5gIG1ldGhvZCBvZiBhIHByb21pc2UgcmV0dXJucyBhIG5ldyBkZXJpdmVkIHByb21pc2UsIGl0IGlzIGVhc2lseQogKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBjaGFpbiBvZiBwcm9taXNlczoKICoKICogYGBganMKICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CiAqICAgICByZXR1cm4gcmVzdWx0ICsgMTsKICogICB9KTsKICoKICogICAvLyBwcm9taXNlQiB3aWxsIGJlIHJlc29sdmVkIGltbWVkaWF0ZWx5IGFmdGVyIHByb21pc2VBIGlzIHJlc29sdmVkIGFuZCBpdHMgdmFsdWUKICogICAvLyB3aWxsIGJlIHRoZSByZXN1bHQgb2YgcHJvbWlzZUEgaW5jcmVtZW50ZWQgYnkgMQogKiBgYGAKICoKICogSXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGNoYWlucyBvZiBhbnkgbGVuZ3RoIGFuZCBzaW5jZSBhIHByb21pc2UgY2FuIGJlIHJlc29sdmVkIHdpdGggYW5vdGhlcgogKiBwcm9taXNlICh3aGljaCB3aWxsIGRlZmVyIGl0cyByZXNvbHV0aW9uIGZ1cnRoZXIpLCBpdCBpcyBwb3NzaWJsZSB0byBwYXVzZS9kZWZlciByZXNvbHV0aW9uIG9mCiAqIHRoZSBwcm9taXNlcyBhdCBhbnkgcG9pbnQgaW4gdGhlIGNoYWluLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGltcGxlbWVudCBwb3dlcmZ1bCBBUElzIGxpa2UKICogJGh0dHAncyByZXNwb25zZSBpbnRlcmNlcHRvcnMuCiAqCiAqCiAqICMgRGlmZmVyZW5jZXMgYmV0d2VlbiBLcmlzIEtvd2FsJ3MgUSBhbmQgJHEKICoKICogIFRoZXJlIGFyZSB0d28gbWFpbiBkaWZmZXJlbmNlczoKICoKICogLSAkcSBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlfSBTY29wZSBtb2RlbCBvYnNlcnZhdGlvbgogKiAgIG1lY2hhbmlzbSBpbiBhbmd1bGFyLCB3aGljaCBtZWFucyBmYXN0ZXIgcHJvcGFnYXRpb24gb2YgcmVzb2x1dGlvbiBvciByZWplY3Rpb24gaW50byB5b3VyCiAqICAgbW9kZWxzIGFuZCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBicm93c2VyIHJlcGFpbnRzLCB3aGljaCB3b3VsZCByZXN1bHQgaW4gZmxpY2tlcmluZyBVSS4KICogLSBRIGhhcyBtYW55IG1vcmUgZmVhdHVyZXMgdGhhbiAkcSwgYnV0IHRoYXQgY29tZXMgYXQgYSBjb3N0IG9mIGJ5dGVzLiAkcSBpcyB0aW55LCBidXQgY29udGFpbnMKICogICBhbGwgdGhlIGltcG9ydGFudCBmdW5jdGlvbmFsaXR5IG5lZWRlZCBmb3IgY29tbW9uIGFzeW5jIHRhc2tzLgogKgogKiAgIyBUZXN0aW5nCiAqCiAqICBgYGBqcwogKiAgICBpdCgnc2hvdWxkIHNpbXVsYXRlIHByb21pc2UnLCBpbmplY3QoZnVuY3Rpb24oJHEsICRyb290U2NvcGUpIHsKICogICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpOwogKiAgICAgIHZhciBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZTsKICogICAgICB2YXIgcmVzb2x2ZWRWYWx1ZTsKICoKICogICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHsgcmVzb2x2ZWRWYWx1ZSA9IHZhbHVlOyB9KTsKICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9CZVVuZGVmaW5lZCgpOwogKgogKiAgICAgIC8vIFNpbXVsYXRlIHJlc29sdmluZyBvZiBwcm9taXNlCiAqICAgICAgZGVmZXJyZWQucmVzb2x2ZSgxMjMpOwogKiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgJ3RoZW4nIGZ1bmN0aW9uIGRvZXMgbm90IGdldCBjYWxsZWQgc3luY2hyb25vdXNseS4KICogICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugd2FudCB0aGUgcHJvbWlzZSBBUEkgdG8gYWx3YXlzIGJlIGFzeW5jLCB3aGV0aGVyIG9yIG5vdAogKiAgICAgIC8vIGl0IGdvdCBjYWxsZWQgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseS4KICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9CZVVuZGVmaW5lZCgpOwogKgogKiAgICAgIC8vIFByb3BhZ2F0ZSBwcm9taXNlIHJlc29sdXRpb24gdG8gJ3RoZW4nIGZ1bmN0aW9ucyB1c2luZyAkYXBwbHkoKS4KICogICAgICAkcm9vdFNjb3BlLiRhcHBseSgpOwogKiAgICAgIGV4cGVjdChyZXNvbHZlZFZhbHVlKS50b0VxdWFsKDEyMyk7CiAqICAgIH0pKTsKICogIGBgYAogKgogKiBAcGFyYW0ge2Z1bmN0aW9uKGZ1bmN0aW9uLCBmdW5jdGlvbil9IHJlc29sdmVyIEZ1bmN0aW9uIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgb3IKICogICByZWplY3RpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgcHJvbWlzZS4gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJlc29sdmVzIHRoZQogKiAgIHByb21pc2UsIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgZnVuY3Rpb24gd2hpY2ggcmVqZWN0cyB0aGUgcHJvbWlzZS4KICoKICogQHJldHVybnMge1Byb21pc2V9IFRoZSBuZXdseSBjcmVhdGVkIHByb21pc2UuCiAqLwpmdW5jdGlvbiAkUVByb3ZpZGVyKCkgewoKICB0aGlzLiRnZXQgPSBbJyRyb290U2NvcGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCBmdW5jdGlvbigkcm9vdFNjb3BlLCAkZXhjZXB0aW9uSGFuZGxlcikgewogICAgcmV0dXJuIHFGYWN0b3J5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhjYWxsYmFjayk7CiAgICB9LCAkZXhjZXB0aW9uSGFuZGxlcik7CiAgfV07Cn0KCmZ1bmN0aW9uICQkUVByb3ZpZGVyKCkgewogIHRoaXMuJGdldCA9IFsnJGJyb3dzZXInLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCBmdW5jdGlvbigkYnJvd3NlciwgJGV4Y2VwdGlvbkhhbmRsZXIpIHsKICAgIHJldHVybiBxRmFjdG9yeShmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAkYnJvd3Nlci5kZWZlcihjYWxsYmFjayk7CiAgICB9LCAkZXhjZXB0aW9uSGFuZGxlcik7CiAgfV07Cn0KCi8qKgogKiBDb25zdHJ1Y3RzIGEgcHJvbWlzZSBtYW5hZ2VyLgogKgogKiBAcGFyYW0ge2Z1bmN0aW9uKGZ1bmN0aW9uKX0gbmV4dFRpY2sgRnVuY3Rpb24gZm9yIGV4ZWN1dGluZyBmdW5jdGlvbnMgaW4gdGhlIG5leHQgdHVybi4KICogQHBhcmFtIHtmdW5jdGlvbiguLi4qKX0gZXhjZXB0aW9uSGFuZGxlciBGdW5jdGlvbiBpbnRvIHdoaWNoIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBhcmUgcGFzc2VkIGZvcgogKiAgICAgZGVidWdnaW5nIHB1cnBvc2VzLgogKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIG1hbmFnZXIuCiAqLwpmdW5jdGlvbiBxRmFjdG9yeShuZXh0VGljaywgZXhjZXB0aW9uSGFuZGxlcikgewogIHZhciAkcU1pbkVyciA9IG1pbkVycignJHEnLCBUeXBlRXJyb3IpOwogIGZ1bmN0aW9uIGNhbGxPbmNlKHNlbGYsIHJlc29sdmVGbiwgcmVqZWN0Rm4pIHsKICAgIHZhciBjYWxsZWQgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIHdyYXAoZm4pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKGNhbGxlZCkgcmV0dXJuOwogICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgZm4uY2FsbChzZWxmLCB2YWx1ZSk7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFt3cmFwKHJlc29sdmVGbiksIHdyYXAocmVqZWN0Rm4pXTsKICB9CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBuZy4kcSNkZWZlcgogICAqIEBraW5kIGZ1bmN0aW9uCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBDcmVhdGVzIGEgYERlZmVycmVkYCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhIHRhc2sgd2hpY2ggd2lsbCBmaW5pc2ggaW4gdGhlIGZ1dHVyZS4KICAgKgogICAqIEByZXR1cm5zIHtEZWZlcnJlZH0gUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBkZWZlcnJlZC4KICAgKi8KICB2YXIgZGVmZXIgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgRGVmZXJyZWQoKTsKICB9OwoKICBmdW5jdGlvbiBQcm9taXNlKCkgewogICAgdGhpcy4kJHN0YXRlID0geyBzdGF0dXM6IDAgfTsKICB9CgogIFByb21pc2UucHJvdG90eXBlID0gewogICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb2dyZXNzQmFjaykgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IERlZmVycmVkKCk7CgogICAgICB0aGlzLiQkc3RhdGUucGVuZGluZyA9IHRoaXMuJCRzdGF0ZS5wZW6M3O9W0RkCAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/8065AAEAGt2bAqAdgwKgHNh/1lSJBuPVoWHp804AYAVOv1QAAAQEICgBNpcMAo17HZGluZyB8fCBbXTsKICAgICAgdGhpcy4kJHN0YXRlLnBlbmRpbmcucHVzaChbcmVzdWx0LCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcHJvZ3Jlc3NCYWNrXSk7CiAgICAgIGlmICh0aGlzLiQkc3RhdGUuc3RhdHVzID4gMCkgc2NoZWR1bGVQcm9jZXNzUXVldWUodGhpcy4kJHN0YXRlKTsKCiAgICAgIHJldHVybiByZXN1bHQucHJvbWlzZTsKICAgIH0sCgogICAgImNhdGNoIjogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBjYWxsYmFjayk7CiAgICB9LAoKICAgICJmaW5hbGx5IjogZnVuY3Rpb24oY2FsbGJhY2ssIHByb2dyZXNzQmFjaykgewogICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGhhbmRsZUNhbGxiYWNrKHZhbHVlLCB0cnVlLCBjYWxsYmFjayk7CiAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgICAgcmV0dXJuIGhhbmRsZUNhbGxiYWNrKGVycm9yLCBmYWxzZSwgY2FsbGJhY2spOwogICAgICB9LCBwcm9ncmVzc0JhY2spOwogICAgfQogIH07CgogIC8vRmFzdGVyLCBtb3JlIGJhc2ljIHRoYW4gYW5ndWxhci5iaW5kIGh0dHA6Ly9qc3BlcmYuY29tL2FuZ3VsYXItYmluZC12cy1jdXN0b20tdnMtbmF0aXZlCiAgZnVuY3Rpb24gc2ltcGxlQmluZChjb250ZXh0LCBmbikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGZuLmNhbGwoY29udGV4dCwgdmFsdWUpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHByb2Nlc3NRdWV1ZShzdGF0ZSkgewogICAgdmFyIGZuLCBwcm9taXNlLCBwZW5kaW5nOwoKICAgIHBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nOwogICAgc3RhdGUucHJvY2Vzc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgc3RhdGUucGVuZGluZyA9IHVuZGVmaW5lZDsKICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBlbmRpbmcubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBwcm9taXNlID0gcGVuZGluZ1tpXVswXTsKICAgICAgZm4gPSBwZW5kaW5nW2ldW3N0YXRlLnN0YXR1c107CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7CiAgICAgICAgICBwcm9taXNlLnJlc29sdmUoZm4oc3RhdGUudmFsdWUpKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXR1cyA9PT0gMSkgewogICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHN0YXRlLnZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJvbWlzZS5yZWplY3Qoc3RhdGUudmFsdWUpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHByb21pc2UucmVqZWN0KGUpOwogICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHNjaGVkdWxlUHJvY2Vzc1F1ZXVlKHN0YXRlKSB7CiAgICBpZiAoc3RhdGUucHJvY2Vzc1NjaGVkdWxlZCB8fCAhc3RhdGUucGVuZGluZykgcmV0dXJuOwogICAgc3RhdGUucHJvY2Vzc1NjaGVkdWxlZCA9IHRydWU7CiAgICBuZXh0VGljayhmdW5jdGlvbigpIHsgcHJvY2Vzc1F1ZXVlKHN0YXRlKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBEZWZlcnJlZCgpIHsKICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKCk7CiAgICAvL05lY2Vzc2FyeSB0byBzdXBwb3J0IHVuYm91bmQgZXhlY3V0aW9uIDovCiAgICB0aGlzLnJlc29sdmUgPSBzaW1wbGVCaW5kKHRoaXMsIHRoaXMucmVzb2x2ZSk7CiAgICB0aGlzLnJlamVjdCA9IHNpbXBsZUJpbmQodGhpcywgdGhpcy5yZWplY3QpOwogICAgdGhpcy5ub3RpZnkgPSBzaW1wbGVCaW5kKHRoaXMsIHRoaXMubm90aWZ5KTsKICB9CgogIERlZmVycmVkLnByb3RvdHlwZSA9IHsKICAgIHJlc29sdmU6IGZ1bmN0aW9uKHZhbCkgewogICAgICBpZiAodGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzKSByZXR1cm47CiAgICAgIGlmICh2YWwgPT09IHRoaXMucHJvbWlzZSkgewogICAgICAgIHRoaXMuJCRyZWplY3QoJHFNaW5FcnIoCiAgICAgICAgICAncWN5Y2xlJywKICAgICAgICAgICJFeHBlY3RlZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIHdpdGggdmFsdWUgb3RoZXIgdGhhbiBpdHNlbGYgJ3swfSciLAogICAgICAgICAgdmFsKSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgdGhpcy4kJHJlc29sdmUodmFsKTsKICAgICAgfQoKICAgIH0sCgogICAgJCRyZXNvbHZlOiBmdW5jdGlvbih2YWwpIHsKICAgICAgdmFyIHRoZW4sIGZuczsKCiAgICAgIGZucyA9IGNhbGxPbmNlKHRoaXMsIHRoaXMuJCRyZXNvbHZlLCB0aGlzLiQkcmVqZWN0KTsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoKGlzT2JqZWN0KHZhbCkgfHwgaXNGdW5jdGlvbih2YWwpKSkgdGhlbiA9IHZhbCAmJiB2YWwudGhlbjsKICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGVuKSkgewogICAgICAgICAgdGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzID0gLTE7CiAgICAgICAgICB0aGVuLmNhbGwodmFsLCBmbnNbMF0sIGZuc1sxXSwgdGhpcy5ub3RpZnkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnByb21pc2UuJCRzdGF0ZS52YWx1ZSA9IHZhbDsKICAgICAgICAgIHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA9IDE7CiAgICAgICAgICBzY2hlZHVsZVByb2Nlc3NRdWV1ZSh0aGlzLnByb21pc2UuJCRzdGF0ZSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgZm5zWzFdKGUpOwogICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgIH0KICAgIH0sCgogICAgcmVqZWN0OiBmdW5jdGlvbihyZWFzb24pIHsKICAgICAgaWYgKHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cykgcmV0dXJuOwogICAgICB0aGlzLiQkcmVqZWN0KHJlYXNvbik7CiAgICB9LAoKICAgICQkcmVqZWN0OiBmdW5jdGlvbihyZWFzb24pIHsKICAgICAgdGhpcy5wcm9taXNlLiQkc3RhdGUudmFsdWUgPSByZWFzb247CiAgICAgIHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA9IDI7CiAgICAgIHNjaGVkdWxlUHJvY2Vzc1F1ZXVlKHRoaXMucHJvbWlzZS4kJHN0YXRlKTsKICAgIH0sCgogICAgbm90aWZ5OiBmdW5jdGlvbihwcm9ncmVzcykgewogICAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5wcm9taXNlLiQkc3RhdGUucGVuZGluZzsKCiAgICAgIGlmICgodGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzIDw9IDApICYmIGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoKSB7CiAgICAgICAgbmV4dFRpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgY2FsbGJhY2ssIHJlc3VsdDsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrc1tpXVswXTsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja3NbaV1bM107CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgcmVzdWx0Lm5vdGlmeShpc0Z1bmN0aW9uKGNhbGxiYWNrKSA/IGNhbGxiYWNrKHByb2dyZXNzKSA6IHByb2dyZXNzKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkcSNyZWplY3QKICAgKiBAa2luZCBmdW5jdGlvbgogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogQ3JlYXRlcyBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBhcyByZWplY3RlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYHJlYXNvbmAuIFRoaXMgYXBpIHNob3VsZCBiZQogICAqIHVzZWQgdG8gZm9yd2FyZCByZWplY3Rpb24gaW4gYSBjaGFpbiBvZiBwcm9taXNlcy4gSWYgeW91IGFyZSBkZWFsaW5nIHdpdGggdGhlIGxhc3QgcHJvbWlzZSBpbgogICAqIGEgcHJvbWlzZSBjaGFpbiwgeW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaXQuCiAgICoKICAgKiBXaGVuIGNvbXBhcmluZyBkZWZlcnJlZHMvcHJvbWlzZXMgdG8gdGhlIGZhbWlsaWFyIGJlaGF2aW9yIG9mIHRyeS9jYXRjaC90aHJvdywgdGhpbmsgb2YKICAgKiBgcmVqZWN0YCBhcyB0aGUgYHRocm93YCBrZXl3b3JkIGluIEphdmFTY3JpcHQuIFRoaXMgYWxzbyBtZWFucyB0aGF0IGlmIHlvdSAiY2F0Y2giIGFuIGVycm9yIHZpYQogICAqIGEgcHJvbWlzZSBlcnJvciBjYWxsYmFjayBhbmQgeW91IHdhbnQgdG8gZm9yd2FyZCB0aGUgZXJyb3IgdG8gdGhlIHByb21pc2UgZGVyaXZlZCBmcm9tIHRoZQogICAqIGN1cnJlbnQgcHJvbWlzZSwgeW91IGhhdmUgdG8gInJldGhyb3ciIHRoZSBlcnJvciBieSByZXR1cm5pbmcgYSByZWplY3Rpb24gY29uc3RydWN0ZWQgdmlhCiAgICogYHJlamVjdGAuCiAgICoKICAgKiBgYGBqcwogICAqICAgcHJvbWlzZUIgPSBwcm9taXNlQS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgewogICAqICAgICAvLyBzdWNjZXNzOiBkbyBzb21ldGhpbmcgYW5kIHJlc29sdmUgcHJvbWlzZUIKICAgKiAgICAgLy8gICAgICAgICAgd2l0aCB0aGUgb2xkIG9yIGEgbmV3IHJlc3VsdAogICAqICAgICByZXR1cm4gcmVzdWx0OwogICAqICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CiAgICogICAgIC8vIGVycm9yOiBoYW5kbGUgdGhlIGVycm9yIGlmIHBvc3NpYmxlIGFuZAogICAqICAgICAvLyAgICAgICAgcmVzb2x2ZSBwcm9taXNlQiB3aXRoIG5ld1Byb21pc2VPclZhbHVlLAogICAqICAgICAvLyAgICAgICAgb3RoZXJ3aXNlIGZvcndhcmQgdGhlIHJlamVjdGlvbiB0byBwcm9taXNlQgogICAqICAgICBpZiAoY2FuSGFuZGxlKHJlYXNvbikpIHsKICAgKiAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IgYW5kIHJlY292ZXIKICAgKiAgICAgIHJldHVybiBuZXdQcm9taXNlT3JWYWx1ZTsKICAgKiAgICAgfQogICAqICAgICByZXR1cm4gJHEucmVqZWN0KHJlYXNvbik7CiAgICogICB9KTsKICAgKiBgYGAKICAgKgogICAqIEBwYXJhbSB7Kn0gcmVhc29uIENvbnN0YW50LCBtZXNzYWdlLCBleGNlcHRpb24gb3IgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVqZWN0aW9uIHJlYXNvbi4KICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHByb21pc2UgdGhhdCB3YXMgYWxyZWFkeSByZXNvbHZlZCBhcyByZWplY3RlZCB3aXRoIHRoZSBgcmVhc29uYC4KICAgKi8KICB2YXIgcmVqZWN0ID0gZnVuY3Rpb24ocmVhc29uKSB7CiAgICB2YXIgcmVzdWx0ID0gbmV3IERlZmVycmVkKCk7CiAgICByZXN1bHQucmVqZWN0KHJlYXNvbik7CiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7CiAgfTsKCiAgdmFyIG1ha2VQcm9taXNlID0gZnVuY3Rpb24gbWFrZVByb21pc2UodmFsdWUsIHJlc29sdmVkKSB7CiAgICB2YXIgcmVzdWx0ID0gbmV3IERlZmVycmVkKCk7CiAgICBpZiAocmVzb2x2ZWQpIHsKICAgICAgcmVzdWx0LnJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0LnJlamVjdCh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7CiAgfTsKCiAgdmFyIGhhbmRsZUNhbGxiYWNrID0gZnVuY3Rpb24gaGFuZGxlQ2FsbGJhY2sodmFsdWUsIGlzUmVzb2x2ZWQsIGNhbGxiYWNrKSB7CiAgICB2YXIgY2FsbGJhY2tPdXRwdXQgPSBudWxsOwogICAgdHJ5IHsKICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSBjYWxsYmFja091dHB1dCA9IGNhbGxiYWNrKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBtYWtlUHJvbWlzZShlLCBmYWxzZSk7CiAgICB9CiAgICBpZiAoaXNQcm9taXNlTGlrZShjYWxsYmFja091dHB1dCkpIHsKICAgICAgcmV0dXJuIGNhbGxiYWNrT3V0cHV0LnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG1ha2VQcm9taXNlKHZhbHVlLCBpc1Jlc29sdmVkKTsKICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICByZXR1cm4gbWFrZVByb21pc2UoZXJyb3IsIGZhbHNlKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbWFrZVByb21pc2UodmFsdWUsIGlzUmVzb2x2ZWQpOwogICAgfQogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkcSN3aGVuCiAgICogQGtpbmQgZnVuY3Rpb24KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFdyYXBzIGFuIG9iamVjdCB0aGF0IG1pZ2h0IGJlIGEgdmFsdWUgb3IgYSAoM3JkIHBhcnR5KSB0aGVuLWFibGUgcHJvbWlzZSBpbnRvIGEgJHEgcHJvbWlzZS4KICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBhcmUgZGVhbGluZyB3aXRoIGFuIG9iamVjdCB0aGF0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBhIHByb21pc2UsIG9yIGlmCiAgICogdGhlIHByb21pc2UgY29tZXMgZnJvbSBhIHNvdXJjZSB0aGF0IGNhbid0IGJlIHRydXN0ZWQuCiAgICoKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9yIGEgcHJvbWlzZQogICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIGEgcHJvbWlzZSBvZiB0aGUgcGFzc2VkIHZhbHVlIG9yIHByb21pc2UKICAgKi8KCgogIHZhciB3aGVuID0gZnVuY3Rpb24odmFsdWUsIGNhbGxiYWNrLCBlcnJiYWNrLCBwcm9ncmVzc0JhY2spIHsKICAgIHZhciByZXN1bHQgPSBuZXcgRGVmZXJyZWQoKTsKICAgIHJlc3VsdC5yZXNvbHZlKHZhbHVlKTsKICAgIHJldHVybiByZXN1bHQucHJvbWlzZS50aGVuKGNhbGxiYWNrLCBlcnJiYWNrLCBwcm9ncmVzc0JhY2spOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkcSNhbGwKICAgKiBAa2luZCBmdW5jdGlvbgogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogQ29tYmluZXMgbXVsdGlwbGUgcHJvbWlzZXMgaW50byBhIHNpbmdsZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBhbGwgb2YgdGhlIGlucHV0CiAgICogcHJvbWlzZXMgYXJlIHJlc29sdmVkLgogICAqCiAgICogQHBhcmFtIHtBcnJheS48UHJvbWlzZT58T2JqZWN0LjxQcm9taXNlPn0gcHJvbWlzZXMgQW4gYXJyYXkgb3IgaGFzaCBvZiBwcm9taXNlcy4KICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHNpbmdsZSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIGFuIGFycmF5L2hhc2ggb2YgdmFsdWVzLAogICAqICAgZWFjaCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9taXNlIGF0IHRoZSBzYW1lIGluZGV4L2tleSBpbiB0aGUgYHByb21pc2VzYCBhcnJheS9oYXNoLgogICAqICAgSWYgYW55IG9mIHRoZSBwcm9taXNlcyBpcyByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLCB0aGlzIHJlc3VsdGluZyBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQKICAgKiAgIHdpdGggdGhlIHNhbWUgcmVqZWN0aW9uIHZhbHVlLgogICAqLwoKICBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHsKICAgIHZhciBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpLAogICAgICAgIGNvdW50ZXIgPSAwLAogICAgICAgIHJlc3VsdHMgPSBpc0FycmF5KHByb21pc2VzKSA/IFtdIDoge307CgogICAgZm9yRWFjaChwcm9taXNlcywgZnVuY3Rpb24ocHJvbWlzZSwga2V5KSB7CiAgICAgIGNvdW50ZXIrKzsKICAgICAgd2hlbihwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKHJlc3VsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuOwogICAgICAgIHJlc3VsdHNba2V5XSA9IHZhbHVlOwogICAgICAgIGlmICghKC0tY291bnRlcikpIGRlZmVycmVkLnJlc29sdmUocmVzdWx0cyk7CiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgewogICAgICAgIGlmIChyZXN1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybjsKICAgICAgICBkZWZlcnJlZC5yZWplY3QocmVhc29uKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBpZiAoY291bnRlciA9PT0gMCkgewogICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdHMpOwogICAgfQoKICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOwogIH0KCiAgdmFyICRRID0gZnVuY3Rpb24gUShyZXNvbHZlcikgewogICAgaWYgKCFpc0Z1bmN0aW9uKHJlc29sdmVyKSkgewogICAgICB0aHJvdyAkcU1pbkVycignbm9yc2x2cicsICJFeHBlY3RlZCByZXNvbHZlckZuLCBnb3QgJ3swfSciLCByZXNvbHZlcik7CiAgICB9CgogICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFEpKSB7CiAgICAgIC8vIE1vcmUgdQ0KjNzvVjEbAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDw8QABABm6hwKgHNsCoB2CVIh/1WHp800G49WiAEAvwE+YAAAEBCAoAo17HAE2lwozc71ZMGwIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8PUAAQAZuoMCoBzbAqAdglSIf9Vh6fNNBuRUwgBAL8PQcAAABAQgKAKNexwBNpcOM3O9WKCsCABpVAAAaVQAAaPcoH9LFCAAnrR4TCABFAFUMNyZAAEAGHt/AqAdgwKgHNh/1lSc5UyoU25J4N4AQAO3k5QAAAQEICgBNpcMAo16/N0ZFOA0KY29zKGNvc867Y29zz4YpOwogICAgcmV0dXJuIGMgJiYgYyAvIE1hdGguc2luKGMpOwogIH0sIGQzX2lkZW50aXR5KTsKICAoZDMuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX2F6aW11dGhhbEVxdWlkaXN0YW50KTsKICB9KS5yYXcgPSBkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQ7CiAgZnVuY3Rpb24gZDNfZ2VvX2NvbmljQ29uZm9ybWFsKM+GMCwgz4YxKSB7CiAgICB2YXIgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgdCA9IGZ1bmN0aW9uKM+GKSB7CiAgICAgIHJldHVybiBNYXRoLnRhbijPgCAvIDQgKyDPhiAvIDIpOwogICAgfSwgbiA9IM+GMCA9PT0gz4YxID8gTWF0aC5zaW4oz4YwKSA6IE1hdGgubG9nKGNvc8+GMCAvIE1hdGguY29zKM+GMSkpIC8gTWF0aC5sb2codCjPhjEpIC8gdCjPhjApKSwgRiA9IGNvc8+GMCAqIE1hdGgucG93KHQoz4YwKSwgbikgLyBuOwogICAgaWYgKCFuKSByZXR1cm4gZDNfZ2VvX21lcmNhdG9yOwogICAgZnVuY3Rpb24gZm9yd2FyZCjOuywgz4YpIHsKICAgICAgaWYgKEYgPiAwKSB7CiAgICAgICAgaWYgKM+GIDwgLWhhbGbPgCArIM61KSDPhiA9IC1oYWxmz4AgKyDOtTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoz4YgPiBoYWxmz4AgLSDOtSkgz4YgPSBoYWxmz4AgLSDOtTsKICAgICAgfQogICAgICB2YXIgz4EgPSBGIC8gTWF0aC5wb3codCjPhiksIG4pOwogICAgICByZXR1cm4gWyDPgSAqIE1hdGguc2luKG4gKiDOuyksIEYgLSDPgSAqIE1hdGguY29zKG4gKiDOuykgXTsKICAgIH0KICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICB2YXIgz4EwX3kgPSBGIC0geSwgz4EgPSBkM19zZ24obikgKiBNYXRoLnNxcnQoeCAqIHggKyDPgTBfeSAqIM+BMF95KTsKICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih4LCDPgTBfeSkgLyBuLCAyICogTWF0aC5hdGFuKE1hdGgucG93KEYgLyDPgSwgMSAvIG4pKSAtIGhhbGbPgCBdOwogICAgfTsKICAgIHJldHVybiBmb3J3YXJkOwogIH0KICAoZDMuZ2VvLmNvbmljQ29uZm9ybWFsID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX2NvbmljKGQzX2dlb19jb25pY0NvbmZvcm1hbCk7CiAgfSkucmF3ID0gZDNfZ2VvX2NvbmljQ29uZm9ybWFsOwogIGZ1bmN0aW9uIGQzX2dlb19jb25pY0VxdWlkaXN0YW50KM+GMCwgz4YxKSB7CiAgICB2YXIgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgbiA9IM+GMCA9PT0gz4YxID8gTWF0aC5zaW4oz4YwKSA6IChjb3PPhjAgLSBNYXRoLmNvcyjPhjEpKSAvICjPhjEgLSDPhjApLCBHID0gY29zz4YwIC8gbiArIM+GMDsKICAgIGlmIChhYnMobikgPCDOtSkgcmV0dXJuIGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7CiAgICBmdW5jdGlvbiBmb3J3YXJkKM67LCDPhikgewogICAgICB2YXIgz4EgPSBHIC0gz4Y7CiAgICAgIHJldHVybiBbIM+BICogTWF0aC5zaW4obiAqIM67KSwgRyAtIM+BICogTWF0aC5jb3MobiAqIM67KSBdOwogICAgfQogICAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIHZhciDPgTBfeSA9IEcgLSB5OwogICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIEcgLSBkM19zZ24obikgKiBNYXRoLnNxcnQoeCAqIHggKyDPgTBfeSAqIM+BMF95KSBdOwogICAgfTsKICAgIHJldHVybiBmb3J3YXJkOwogIH0KICAoZDMuZ2VvLmNvbmljRXF1aWRpc3RhbnQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fY29uaWMoZDNfZ2VvX2NvbmljRXF1aWRpc3RhbnQpOwogIH0pLnJhdyA9IGQzX2dlb19jb25pY0VxdWlkaXN0YW50OwogIHZhciBkM19nZW9fZ25vbW9uaWMgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHsKICAgIHJldHVybiAxIC8gY29zzrtjb3PPhjsKICB9LCBNYXRoLmF0YW4pOwogIChkMy5nZW8uZ25vbW9uaWMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fZ25vbW9uaWMpOwogIH0pLnJhdyA9IGQzX2dlb19nbm9tb25pYzsKICBmdW5jdGlvbiBkM19nZW9fbWVyY2F0b3IozrssIM+GKSB7CiAgICByZXR1cm4gWyDOuywgTWF0aC5sb2coTWF0aC50YW4oz4AgLyA0ICsgz4YgLyAyKSkgXTsKICB9CiAgZDNfZ2VvX21lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiBbIHgsIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeSkpIC0gaGFsZs+AIF07CiAgfTsKICBmdW5jdGlvbiBkM19nZW9fbWVyY2F0b3JQcm9qZWN0aW9uKHByb2plY3QpIHsKICAgIHZhciBtID0gZDNfZ2VvX3Byb2plY3Rpb24ocHJvamVjdCksIHNjYWxlID0gbS5zY2FsZSwgdHJhbnNsYXRlID0gbS50cmFuc2xhdGUsIGNsaXBFeHRlbnQgPSBtLmNsaXBFeHRlbnQsIGNsaXBBdXRvOwogICAgbS5zY2FsZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdiA9IHNjYWxlLmFwcGx5KG0sIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB2ID09PSBtID8gY2xpcEF1dG8gPyBtLmNsaXBFeHRlbnQobnVsbCkgOiBtIDogdjsKICAgIH07CiAgICBtLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdiA9IHRyYW5zbGF0ZS5hcHBseShtLCBhcmd1bWVudHMpOwogICAgICByZXR1cm4gdiA9PT0gbSA/IGNsaXBBdXRvID8gbS5jbGlwRXh0ZW50KG51bGwpIDogbSA6IHY7CiAgICB9OwogICAgbS5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICB2YXIgdiA9IGNsaXBFeHRlbnQuYXBwbHkobSwgYXJndW1lbnRzKTsKICAgICAgaWYgKHYgPT09IG0pIHsKICAgICAgICBpZiAoY2xpcEF1dG8gPSBfID09IG51bGwpIHsKICAgICAgICAgIHZhciBrID0gz4AgKiBzY2FsZSgpLCB0ID0gdHJhbnNsYXRlKCk7CiAgICAgICAgICBjbGlwRXh0ZW50KFsgWyB0WzBdIC0gaywgdFsxXSAtIGsgXSwgWyB0WzBdICsgaywgdFsxXSArIGsgXSBdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2xpcEF1dG8pIHsKICAgICAgICB2ID0gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gdjsKICAgIH07CiAgICByZXR1cm4gbS5jbGlwRXh0ZW50KG51bGwpOwogIH0KICAoZDMuZ2VvLm1lcmNhdG9yID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihkM19nZW9fbWVyY2F0b3IpOwogIH0pLnJhdyA9IGQzX2dlb19tZXJjYXRvcjsKICB2YXIgZDNfZ2VvX29ydGhvZ3JhcGhpYyA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gMTsKICB9LCBNYXRoLmFzaW4pOwogIChkMy5nZW8ub3J0aG9ncmFwaGljID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX29ydGhvZ3JhcGhpYyk7CiAgfSkucmF3ID0gZDNfZ2VvX29ydGhvZ3JhcGhpYzsKICB2YXIgZDNfZ2VvX3N0ZXJlb2dyYXBoaWMgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHsKICAgIHJldHVybiAxIC8gKDEgKyBjb3POu2Nvc8+GKTsKICB9LCBmdW5jdGlvbijPgSkgewogICAgcmV0dXJuIDIgKiBNYXRoLmF0YW4oz4EpOwogIH0pOwogIChkMy5nZW8uc3RlcmVvZ3JhcGhpYyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19zdGVyZW9ncmFwaGljKTsKICB9KS5yYXcgPSBkM19nZW9fc3RlcmVvZ3JhcGhpYzsKICBmdW5jdGlvbiBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yKM67LCDPhikgewogICAgcmV0dXJuIFsgTWF0aC5sb2coTWF0aC50YW4oz4AgLyA0ICsgz4YgLyAyKSksIC3OuyBdOwogIH0KICBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiBbIC15LCAyICogTWF0aC5hdGFuKE1hdGguZXhwKHgpKSAtIGhhbGbPgCBdOwogIH07CiAgKGQzLmdlby50cmFuc3ZlcnNlTWVyY2F0b3IgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwcm9qZWN0aW9uID0gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yKSwgY2VudGVyID0gcHJvamVjdGlvbi5jZW50ZXIsIHJvdGF0ZSA9IHByb2plY3Rpb24ucm90YXRlOwogICAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBfID8gY2VudGVyKFsgLV9bMV0sIF9bMF0gXSkgOiAoXyA9IGNlbnRlcigpLCBbIF9bMV0sIC1fWzBdIF0pOwogICAgfTsKICAgIHByb2plY3Rpb24ucm90YXRlID0gZnVuY3Rpb24oXykgewogICAgICByZXR1cm4gXyA/IHJvdGF0ZShbIF9bMF0sIF9bMV0sIF8ubGVuZ3RoID4gMiA/IF9bMl0gKyA5MCA6IDkwIF0pIDogKF8gPSByb3RhdGUoKSwgCiAgICAgIFsgX1swXSwgX1sxXSwgX1syXSAtIDkwIF0pOwogICAgfTsKICAgIHJldHVybiByb3RhdGUoWyAwLCAwLCA5MCBdKTsKICB9KS5yYXcgPSBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yOwogIGQzLmdlb20gPSB7fTsKICBmdW5jdGlvbiBkM19nZW9tX3BvaW50WChkKSB7CiAgICByZXR1cm4gZFswXTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2ludFkoZCkgewogICAgcmV0dXJuIGRbMV07CiAgfQogIGQzLmdlb20uaHVsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7CiAgICB2YXIgeCA9IGQzX2dlb21fcG9pbnRYLCB5ID0gZDNfZ2VvbV9wb2ludFk7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGh1bGwodmVydGljZXMpOwogICAgZnVuY3Rpb24gaHVsbChkYXRhKSB7CiAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDMpIHJldHVybiBbXTsKICAgICAgdmFyIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCBpLCBuID0gZGF0YS5sZW5ndGgsIHBvaW50cyA9IFtdLCBmbGlwcGVkUG9pbnRzID0gW107CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBwb2ludHMucHVzaChbICtmeC5jYWxsKHRoaXMsIGRhdGFbaV0sIGkpLCArZnkuY2FsbCh0aGlzLCBkYXRhW2ldLCBpKSwgaSBdKTsKICAgICAgfQogICAgICBwb2ludHMuc29ydChkM19nZW9tX2h1bGxPcmRlcik7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGZsaXBwZWRQb2ludHMucHVzaChbIHBvaW50c1tpXVswXSwgLXBvaW50c1tpXVsxXSBdKTsKICAgICAgdmFyIHVwcGVyID0gZDNfZ2VvbV9odWxsVXBwZXIocG9pbnRzKSwgbG93ZXIgPSBkM19nZW9tX2h1bGxVcHBlcihmbGlwcGVkUG9pbnRzKTsKICAgICAgdmFyIHNraXBMZWZ0ID0gbG93ZXJbMF0gPT09IHVwcGVyWzBdLCBza2lwUmlnaHQgPSBsb3dlcltsb3dlci5sZW5ndGggLSAxXSA9PT0gdXBwZXJbdXBwZXIubGVuZ3RoIC0gMV0sIHBvbHlnb24gPSBbXTsKICAgICAgZm9yIChpID0gdXBwZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHBvbHlnb24ucHVzaChkYXRhW3BvaW50c1t1cHBlcltpXV1bMl1dKTsKICAgICAgZm9yIChpID0gK3NraXBMZWZ0OyBpIDwgbG93ZXIubGVuZ3RoIC0gc2tpcFJpZ2h0OyArK2kpIHBvbHlnb24ucHVzaChkYXRhW3BvaW50c1tsb3dlcltpXV1bMl1dKTsKICAgICAgcmV0dXJuIHBvbHlnb247CiAgICB9CiAgICBodWxsLnggPSBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSBfLCBodWxsKSA6IHg7CiAgICB9OwogICAgaHVsbC55ID0gZnVuY3Rpb24oXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gXywgaHVsbCkgOiB5OwogICAgfTsKICAgIHJldHVybiBodWxsOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvbV9odWxsVXBwZXIocG9pbnRzKSB7CiAgICB2YXIgbiA9IHBvaW50cy5sZW5ndGgsIGh1bGwgPSBbIDAsIDEgXSwgaHMgPSAyOwogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBuOyBpKyspIHsKICAgICAgd2hpbGUgKGhzID4gMSAmJiBkM19jcm9zczJkKHBvaW50c1todWxsW2hzIC0gMl1dLCBwb2ludHNbaHVsbFtocyAtIDFdXSwgcG9pbnRzW2ldKSA8PSAwKSAtLWhzOwogICAgICBodWxsW2hzKytdID0gaTsKICAgIH0KICAgIHJldHVybiBodWxsLnNsaWNlKDAsIGhzKTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV9odWxsT3JkZXIoYSwgYikgewogICAgcmV0dXJuIGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdOwogIH0KICBkMy5nZW9tLnBvbHlnb24gPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgZDNfc3ViY2xhc3MoY29vcmRpbmF0ZXMsIGQzX2dlb21fcG9seWdvblByb3RvdHlwZSk7CiAgICByZXR1cm4gY29vcmRpbmF0ZXM7CiAgfTsKICB2YXIgZDNfZ2VvbV9wb2x5Z29uUHJvdG90eXBlID0gZDMuZ2VvbS5wb2x5Z29uLnByb3RvdHlwZSA9IFtdOwogIGQzX2dlb21fcG9seWdvblByb3RvdHlwZS5hcmVhID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIGEsIGIgPSB0aGlzW24gLSAxXSwgYXJlYSA9IDA7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBhID0gYjsKICAgICAgYiA9IHRoaXNbaV07CiAgICAgIGFyZWEgKz0gYVsxXSAqIGJbMF0gLSBhWzBdICogYlsxXTsKICAgIH0KICAgIHJldHVybiBhcmVhICogLjU7CiAgfTsKICBkM19nZW9tX3BvbHlnb25Qcm90b3R5cGUuY2VudHJvaWQgPSBmdW5jdGlvbihrKSB7CiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIHggPSAwLCB5ID0gMCwgYSwgYiA9IHRoaXNbbiAtIDFdLCBjOwogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSBrID0gLTEgLyAoNiAqIHRoaXMuYXJlYSgpKTsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGEgPSBiOwogICAgICBiID0gdGhpc1tpXTsKICAgICAgYyA9IGFbMF0gKiBiWzFdIC0gYlswXSAqIGFbMV07CiAgICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7CiAgICAgIHkgKz0gKGFbMV0gKyBiWzFdKSAqIGM7CiAgICB9CiAgICByZXR1cm4gWyB4ICogaywgeSAqIGsgXTsKICB9OwogIGQzX2dlb21fcG9seWdvblByb3RvdHlwZS5jbGlwID0gZnVuY3Rpb24oc3ViamVjdCkgewogICAgdmFyIGlucHV0LCBjbG9zZWQgPSBkM19nZW9tX3BvbHlnb25DbG9zZWQoc3ViamVjdCksIGkgPSAtMSwgbiA9IHRoaXMubGVuZ3RoIC0gZDNfZ2VvbV9wb2x5Z29uQ2xvc2VkKHRoaXMpLCBqLCBtLCBhID0gdGhpc1tuIC0gMV0sIGIsIGMsIGQ7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpbnB1dCA9IHN1YmplY3Quc2xpY2UoKTsKICAgICAgc3ViamVjdC5sZW5ndGggPSAwOwogICAgICBiID0gdGhpc1tpXTsKICAgICAgYyA9IGlucHV0WyhtID0gaW5wdXQubGVuZ3RoIC0gY2xvc2VkKSAtIDFdOwogICAgICBqID0gLTE7CiAgICAgIHdoaWxlICgrK2ogPCBtKSB7CiAgICAgICAgZCA9IGlucHV0W2pdOwogICAgICAgIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoZCwgYSwgYikpIHsKICAgICAgICAgIGlmICghZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGMsIGEsIGIpKSB7CiAgICAgICAgICAgIHN1YmplY3QucHVzaChkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikpOwogICAgICAgICAgfQogICAgICAgICAgc3ViamVjdC5wdXNoKGQpOwogICAgICAgIH0gZWxzZSBpZiAoZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGMsIGEsIGIpKSB7CiAgICAgICAgICBzdWJqZWN0LnB1c2goZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0KGMsIGQsIGEsIGIpKTsKICAgICAgICB9CiAgICAgICAgYyA9IGQ7CiAgICAgIH0KICAgICAgaWYgKGNsb3NlZCkgc3ViamVjdC5wdXNoKHN1YmplY3RbMF0pOwogICAgICBhID0gYjsKICAgIH0KICAgIHJldHVybiBzdWJqZWN0OwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKHAsIGEsIGIpIHsKICAgIHJldHVybiAoYlswXSAtIGFbMF0pICogKHBbMV0gLSBhWzFdKSA8IChiWzFdIC0gYVsxXSkgKiAocFswXSAtIGFbMF0pOwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikgewogICAgdmFyIHgxID0gY1swXSwgeDMgPSBhWzBdLCB4MjEgPSBkWzBdIC0geDEsIHg0MyA9IGJbMF0gLSB4MywgeTEgPSBjWzFdLCB5MyA9IGFbMV0sIHkyMSA9IGRbMV0gLSB5MSwgeTQzID0gYlsxXSAtIHkzLCB1YSA9ICh4NDMgKiAoeTEgLSB5MykgLSB5NDMgKiAoeDEgLSB4MykpIC8gKHk0MyAqIHgyMSAtIHg0MyAqIHkyMSk7CiAgICByZXR1cm4gWyB4MSArIHVhICogeDIxLCB5MSArIHVhICogeTIxIF07CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fcG9seWdvbkNsb3NlZChjb29yZGluYXRlcykgewogICAgdmFyIGEgPSBjb29yZGluYXRlc1swXSwgYiA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdOwogICAgcmV0dXJuICEoYVswXSAtIGJbMF0gfHwgYVsxXSAtIGJbMV0pOwogIH0KICB2YXIgZDNfZ2VvbV92b3Jvbm9pRWRnZXMsIGQzX2dlb21fdm9yb25vaUNlbGxzLCBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLCBkM19nZW9tX3Zvcm9ub2lCZWFjaFBvb2wgPSBbXSwgZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGUsIGQzX2dlb21fdm9yb25vaUNpcmNsZXMsIGQzX2dlb21fdm9yb25vaUNpcmNsZVBvb2wgPSBbXTsKICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lCZWFjaCgpIHsKICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrTm9kZSh0aGlzKTsKICAgIHRoaXMuZWRnZSA9IHRoaXMuc2l0ZSA9IHRoaXMuY2lyY2xlID0gbnVsbDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQmVhY2goc2l0ZSkgewogICAgdmFyIGJlYWNoID0gZDNfZ2VvbV92b3Jvbm9pQmVhY2hQb29sLnBvcCgpIHx8IG5ldyBkM19nZW9tX3Zvcm9ub2lCZWFjaCgpOwogICAgYmVhY2guc2l0ZSA9IHNpdGU7CiAgICByZXR1cm4gYmVhY2g7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaURldGFjaEJlYWNoKGJlYWNoKSB7CiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUoYmVhY2gpOwogICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcy5yZW1vdmUoYmVhY2gpOwogICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hQb29sLnB1c2goYmVhY2gpOwogICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKGJlYWNoKTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVtb3ZlQmVhY2goYmVhY2gpIHsKICAgIHZhciBjaXJjbGUgPSBiZWFjaC5jaXJjbGUsIHggPSBjaXJjbGUueCwgeSA9IGNpcmNsZS5jeSwgdmVydGV4ID0gewogICAgICB4OiB4LAogICAgICB5OiB5CiAgICB9LCBwcmV2aW91cyA9IGJlYWNoLlAsIG5leHQgPSBiZWFjaC5OLCBkaXNhcHBlYXJpbmcgPSBbIGJlYWNoIF07CiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaChiZWFjaCk7CiAgICB2YXIgbEFyYyA9IHByZXZpb3VzOwogICAgd2hpbGUgKGxBcmMuY2lyY2xlICYmIGFicyh4IC0gbEFyYy5jaXJjbGUueCkgPCDOtSAmJiBhYnMoeSAtIGxBcmMuY2lyY2xlLmN5KSA8IM61KSB7CiAgICAgIHByZXZpb3VzID0gbEFyYy5QOwogICAgICBkaXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTsKICAgICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQmVhY2gobEFyYyk7CiAgICAgIGxBcmMgPSBwcmV2aW91czsKICAgIH0KICAgIGRpc2FwcGVhcmluZy51bnNoaWZ0KGxBcmMpOwogICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKGxBcmMpOwogICAgdmFyIHJBcmMgPSBuZXh0OwogICAgd2hpbGUgKHJBcmMuY2lyY2xlICYmIGFicyh4IC0gckFyYy5jaXJjbGUueCkgPCDOtSAmJiBhYnMoeSAtIHJBcmMuY2lyY2xlLmN5KSA8IM61KSB7CiAgICAgIG5leHQgPSByQXJjLk47CiAgICAgIGRpc2FwcGVhcmluZy5wdXNoKHJBcmMpOwogICAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaChyQXJjKTsKICAgICAgckFyYyA9IG5leHQ7CiAgICB9CiAgICBkaXNhcHBlYXJpbmcucHVzaChyQXJjKTsKICAgIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShyQXJjKTsKICAgIHZhciBuQXJjcyA9IGRpc2FwcGVhcmluZy5sZW5ndGgsIGlBcmM7CiAgICBmb3IgKGlBcmMgPSAxOyBpQXJjIDwgbkFyY3M7ICsraUFyYykgewogICAgICByQXJjID0gZGlzYXBwZWFyaW5nW2lBcmNdOwogICAgICBsQXJjID0gZGlzYXBwZWFyaW5nW2lBcmMgLSAxXTsKICAgICAgZDNfZ2VvbV92b3Jvbm9pU2V0RWRnZUVuZChyQXJjLmVkZ2UsIGxBcmMuc2l0ZSwgckFyYy5zaXRlLCB2ZXJ0ZXgpOwogICAgfQogICAgbEFyYyA9IGRpc2FwcGVhcmluZ1swXTsKICAgIHJBcmMgPSBkaXNhcHBlYXJpbmdbbkFyY3MgLSAxXTsKICAgIHJBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobEFyYy5zaXRlLCByQXJjLnNpdGUsIG51bGwsIHZlcnRleCk7CiAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUobEFyYyk7CiAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUockFyYyk7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUFkZEJlYWNoKHNpdGUpIHsKICAgIHZhciB4ID0gc2l0ZS54LCBkaXJlY3RyaXggPSBzaXRlLnksIGxBcmMsIHJBcmMsIGR4bCwgZHhyLCBub2RlID0gZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcy5fOwogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgZHhsID0gZDNfZ2VvbV92b3Jvbm9pTGVmdEJyZWFrUG9pbnQobm9kZSwgZGlyZWN0cml4KSAtIHg7CiAgICAgIGlmIChkeGwgPiDOtSkgbm9kZSA9IG5vZGUuTDsgZWxzZSB7CiAgICAgICAgZHhyID0geCAtIGQzX2dlb21fdm9yb25vaVJpZ2h0QnJlYWtQb2ludChub2RlLCBkaXJlY3RyaXgpOwogICAgICAgIGlmIChkeHIgPiDOtSkgewogICAgICAgICAgaWYgKCFub2RlLlIpIHsKICAgICAgICAgICAgbEFyYyA9IG5vZGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgbm9kZSA9IG5vZGUuUjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGR4bCA+IC3OtSkgewogICAgICAgICAgICBsQXJjID0gbm9kZS5QOwogICAgICAgICAgICByQXJjID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSBpZiAoZHhyID4gLc61KSB7CiAgICAgICAgICAgIGxBcmMgPSBub2RlOwogICAgICAgICAgICByQXJjID0gbm9kZS5OOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbEFyYyA9IHJBcmMgPSBub2RlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgbmV3QXJjID0gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQmVhY2goc2l0ZSk7CiAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLmluc2VydChsQXJjLCBuZXdBcmMpOwogICAgaWYgKCFsQXJjICYmICFyQXJjKSByZXR1cm47CiAgICBpZiAobEFyYyA9PT0gckFyYykgewogICAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUobEFyYyk7CiAgICAgIHJBcmMgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVCZWFjaChsQXJjLnNpdGUpOwogICAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLmluc2VydChuZXdBcmMsIHJBcmMpOwogICAgICBuZXdBcmMuZWRnZSA9IHJBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobEFyYy5zaXRlLCBuZXdBcmMuc2l0ZSk7CiAgICAgIGQzX2dlb21fdm9yb25vaUF0dGFjaENpcmNsZShsQXJjKTsKICAgICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKHJBcmMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIXJBcmMpIHsKICAgICAgbmV3QXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUobEFyYyk7CiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUockFyYyk7CiAgICB2YXIgbFNpdGUgPSBsQXJjLnNpdGUsIGF4ID0gbFNpdGUueCwgYXkgPSBsU2l0ZS55LCBieCA9IHNpdGUueCAtIGF4LCBieSA9IHNpdGUueSAtIGF5LCByU2l0ZSA9IHJBcmMuc2l0ZSwgY3ggPSByU2l0ZS54IC0gYXgsIGN5ID0gclNpdGUueSAtIGF5LCBkID0gMiAqIChieCAqIGN5IC0gYnkgKiBjeCksIGhiID0gYnggKiBieCArIGJ5ICogYnksIGhjID0gY3ggKiBjeCArIGN5ICogY3ksIHZlcnRleCA9IHsKICAgICAgeDogKGN5ICogaGIgLSBieSAqIGhjKSAvIGQgKyBheCwKICAgICAgeTogKGJ4ICogaGMgLSBjeCAqIGhiKSAvIGQgKyBheQogICAgfTsKICAgIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQockFyYy5lZGdlLCBsU2l0ZSwgclNpdGUsIHZlcnRleCk7CiAgICBuZXdBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobFNpdGUsIHNpdGUsIG51bGwsIHZlcnRleCk7CiAgICByQXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKHNpdGUsIHJTaXRlLCBudWxsLCB2ZXJ0ZXgpOwogICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKGxBcmMpOwogICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKHJBcmMpOwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lMZWZ0QnJlYWtQb2ludChhcmMsIGRpcmVjdHJpeCkgewogICAgdmFyIHNpdGUgPSBhcmMuc2l0ZSwgcmZvY3ggPSBzaXRlLngsIHJmb2N5ID0gc2l0ZS55LCBwYnkyID0gcmZvY3kgLSBkaXJlY3RyaXg7CiAgICBpZiAoIXBieTIpIHJldHVybiByZm9jeDsKICAgIHZhciBsQXJjID0gYXJjLlA7CiAgICBpZiAoIWxBcmMpIHJldHVybiAtSW5maW5pdHk7CiAgICBzaXRlID0gbEFyYy5zaXRlOwogICAgdmFyIGxmb2N4ID0gc2l0ZS54LCBsZm9jeSA9IHNpdGUueSwgcGxieTIgPSBsZm9jeSAtIGRpcmVjdHJpeDsKICAgIGlmICghcGxieTIpIHJldHVybiBsZm9jeDsKICAgIHZhciBobCA9IGxmb2N4IC0gcmZvY3gsIGFieTIgPSAxIC8gcGJ5MiAtIDEgLyBwbGJ5MiwgYiA9IGhsIC8gcGxieTI7CiAgICBpZiAoYWJ5MikgcmV0dXJuICgtYiArIE1hdGguc3FydChiICogYiAtIDIgKiBhYnkyICogKGhsICogaGwgLyAoLTIgKiBwbGJ5MikgLSBsZm9jeSArIHBsYnkyIC8gMiArIHJmb2N5IC0gcGJ5MiAvIDIpKSkgLyBhYnkyICsgcmZvY3g7CiAgICByZXR1cm4gKHJmb2N4ICsgbGZvY3gpIC8gMjsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmlnaHRCcmVha1BvaW50KGFyYywgZGlyZWN0cml4KSB7CiAgICB2YXIgckFyYyA9IGFyYy5OOwogICAgaWYgKHJBcmMpIHJldHVybiBkM19nZW9tX3Zvcm9ub2lMZWZ0QnJlYWtQb2ludChyQXJjLCBkaXJlY3RyaXgpOwogICAgdmFyIHNpdGUgPSBhcmMuc2l0ZTsKICAgIHJldHVybiBzaXRlLnkgPT09IGRpcmVjdHJpeCA/IHNpdGUueCA6IEluZmluaXR5OwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDZWxsKHNpdGUpIHsKICAgIHRoaXMuc2l0ZSA9IHNpdGU7CiAgICB0aGlzLmVkZ2VzID0gW107CiAgfQogIGQzX2dlb21fdm9yb25vaUNlbGwucHJvdG90eXBlLnByZXBhcmUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBoYWxmRWRnZXMgPSB0aGlzLmVkZ2VzLCBpSGFsZkVkZ2UgPSBoYWxmRWRnZXMubGVuZ3RoLCBlZGdlOwogICAgd2hpbGUgKGlIYWxmRWRnZS0tKSB7CiAgICAgIGVkZ2UgPSBoYWxmRWRnZXNbaUhhbGZFZGdlXS5lZGdlOwogICAgICBpZiAoIWVkZ2UuYiB8fCAhZWRnZS5hKSBoYWxmRWRnZXMuc3BsaWNlKGlIYWxmRWRnZSwgMSk7CiAgICB9CiAgICBoYWxmRWRnZXMuc29ydChkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZU9yZGVyKTsKICAgIHJldHVybiBoYWxmRWRnZXMubGVuZ3RoOwogIH07CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ2xvc2VDZWxscyhleHRlbnQpIHsKICAgIHZhciB4MCA9IGV4dGVudFswXVswXSwgeDEgPSBleHRlbnRbMV1bMF0sIHkwID0gZXh0ZW50WzBdWzFdLCB5MSA9IGV4dGVudFsxXVsxXSwgeDIsIHkyLCB4MywgeTMsIGNlbGxzID0gZDNfZ2VvbV92b3Jvbm9pQ2VsbHMsIGlDZWxsID0gY2VsbHMubGVuZ3RoLCBjZWxsLCBpSGFsZkVkZ2UsIGhhbGZFZGdlcywgbkhhbGZFZGdlcywgc3RhcnQsIGVuZDsKICAgIHdoaWxlIChpQ2VsbC0tKSB7CiAgICAgIGNlbGwgPSBjZWxsc1tpQ2VsbF07CiAgICAgIGlmICghY2VsbCB8fCAhY2VsbC5wcmVwYXJlKCkpIGNvbnRpbnVlOwogICAgICBoYWxmRWRnZXMgPSBjZWxsLmVkZ2VzOwogICAgICBuSGFsZkVkZ2VzID0gaGFsZkVkZ2VzLmxlbmd0aDsKICAgICAgaUhhbGZFZGdlID0gMDsKICAgICAgd2hpbGUgKGlIYWxmRWRnZSA8IG5IYWxmRWRnZXMpIHsKICAgICAgICBlbmQgPSBoYWxmRWRnZXNbaUhhbGZFZGdlXS5lbmQoKSwgeDMgPSBlbmQueCwgeTMgPSBlbmQueTsKICAgICAgICBzdGFydCA9IGhhbGZFZGdlc1srK2lIYWxmRWRnZSAlIG5IYWxmRWRnZXNdLnN0YXJ0KCksIHgyID0gc3RhcnQueCwgeTIgPSBzdGFydC55OwogICAgICAgIGlmIChhYnMoeDMgLSB4MikgPiDOtSB8fCBhYnMoeTMgLSB5MikgPiDOtSkgewogICAgICAgICAgaGFsZkVkZ2VzLnNwbGljZShpSGFsZkVkZ2UsIDAsIG5ldyBkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZShkM19nZW9tX3Zvcm9ub2lDcmVhdGVCb3JkZXJFZGdlKGNlbGwuc2l0ZSwgZW5kLCBhYnMoeDMgLSB4MCkgPCDOtSAmJiB5MSAtIHkzID4gzrUgPyB7CiAgICAgICAgICAgIHg6IHgwLAogICAgICAgICAgICB5OiBhYnMoeDIgLSB4MCkgPCDOtSA/IHkyIDogeTEKICAgICAgICAgIH0gOiBhYnMoeTMgLSB5MSkgPCDOtSAmJiB4MSAtIHgzID4gzrUgPyB7CiAgICAgICAgICAgIHg6IGFicyh5MiAtIHkxKSA8IM61ID8geDIgOiB4MSwKICAgICAgICAgICAgeTogeTEKICAgICAgICAgIH0gOiBhYnMoeDMgLSB4MSkgPCDOtSAmJiB5MyAtIHkwID4gzrUgPyB7CiAgICAgICAgICAgIHg6IHgxLAogICAgICAgICAgICB5OiBhYnMoeDIgLSB4MSkgPCDOtSA/IHkyIDogeTAKICAgICAgICAgIH0gOiBhYnMoeTMgLSB5MCkgPCDOtSAmJiB4MyAtIHgwID4gzrUgPyB7CiAgICAgICAgICAgIHg6IGFicyh5MiAtIHkwKSA8IM61ID8geDIgOiB4MCwKICAgICAgICAgICAgeTogeTAKICAgICAgICAgIH0gOiBudWxsKSwgY2VsbC5zaXRlLCBudWxsKSk7CiAgICAgICAgICArK25IYWxmRWRnZXM7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUhhbGZFZGdlT3JkZXIoYSwgYikgewogICAgcmV0dXJuIGIuYW5nbGUgLSBhLmFuZ2xlOwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDaXJjbGUoKSB7CiAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUodGhpcyk7CiAgICB0aGlzLnggPSB0aGlzLnkgPSB0aGlzLmFyYyA9IHRoaXMuc2l0ZSA9IHRoaXMuY3kgPSBudWxsOwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUoYXJjKSB7CiAgICB2YXIgbEFyYyA9IGFyYy5QLCByQXJjID0gYXJjLk47CiAgICBpZiAoIWxBcmMgfHwgIXJBcmMpIHJldHVybjsKICAgIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwgY1NpdGUgPSBhcmMuc2l0ZSwgclNpdGUgPSByQXJjLnNpdGU7CiAgICBpZiAobFNpdGUgPT09IHJTaXRlKSByZXR1cm47CiAgICB2YXIgYnggPSBjU2l0ZS54LCBieSA9IGNTaXRlLnksIGF4ID0gbFNpdGUueCAtIGJ4LCBheSA9IGxTaXRlLnkgLSBieSwgY3ggPSByU2l0ZS54IC0gYngsIGN5ID0gclNpdGUueSAtIGJ5OwogICAgdmFyIGQgPSAyICogKGF4ICogY3kgLSBheSAqIGN4KTsKICAgIGlmIChkID49IC3OtTIpIHJldHVybjsKICAgIHZhciBoYSA9IGF4ICogYXggKyBheSAqIGF5LCBoYyA9IGN4ICogY3ggKyBjeSAqIGN5LCB4ID0gKGN5ICogaGEgLSBheSAqIGhjKSAvIGQsIHkgPSAoYXggKiBoYyAtIGN4ICogaGEpIC8gZCwgY3kgPSB5ICsgYnk7CiAgICB2YXIgY2lyY2xlID0gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlUG9vbC5wb3AoKSB8fCBuZXcgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlKCk7CiAgICBjaXJjbGUuYXJjID0gYXJjOwogICAgY2lyY2xlLnNpdGUgPSBjU2l0ZTsKICAgIGNpcmNsZS54ID0geCArIGJ4OwogICAgY2lyY2xlLnkgPSBjeSArIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTsKICAgIGNpcmNsZS5jeSA9IGN5OwogICAgYXJjLmNpcmNsZSA9IGNpcmNsZTsKICAgIHZhciBiZWZvcmUgPSBudWxsLCBub2RlID0gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlcy5fOwogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgaWYgKGNpcmNsZS55IDwgbm9kZS55IHx8IGNpcmNsZS55ID09PSBub2RlLnkgJiYgY2lyY2xlLnggPD0gbm9kZS54KSB7CiAgICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDsgZWxzZSB7CiAgICAgICAgICBiZWZvcmUgPSBub2RlLlA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG5vZGUuUikgbm9kZSA9IG5vZGUuUjsgZWxzZSB7CiAgICAgICAgICBiZWZvcmUgPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzLmluc2VydChiZWZvcmUsIGNpcmNsZSk7CiAgICBpZiAoIWJlZm9yZSkgZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGUgPSBjaXJjbGU7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShhcmMpIHsKICAgIHZhciBjaXJjbGUgPSBhcmMuY2lyY2xlOwogICAgaWYgKGNpcmNsZSkgewogICAgICBpZiAoIWNpcmNsZS5QKSBkM19nZW9tX3Zvcm9ub2lGaXJzdENpcmNsZSA9IGNpcmNsZS5OOwogICAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzLnJlbW92ZShjaXJjbGUpOwogICAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVQb29sLnB1c2goY2lyY2xlKTsKICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKGNpcmNsZSk7CiAgICAgIGFyYy5jaXJjbGUgPSBudWxsOwogICAgfQogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDbGlwRWRnZXMoZXh0ZW50KSB7CiAgICB2YXIgZWRnZXMgPSBkM19nZW9tX3Zvcm9ub2lFZGdlcywgY2xpcCA9IGQzX2dlb21fY2xpcExpbmUoZXh0ZW50WzBdWzBdLCBleHRlbnRbMF1bMV0sIGV4dGVudFsxXVswXSwgZXh0ZW50WzFdWzFdKSwgaSA9IGVkZ2VzLmxlbmd0aCwgZTsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgZSA9IGVkZ2VzW2ldOwogICAgICBpZiAoIWQzX2dlb21fdm9yb25vaUNvbm5lY3RFZGdlKGUsIGV4dGVudCkgfHwgIWNsaXAoZSkgfHwgYWJzKGUuYS54IC0gZS5iLngpIDwgzrUgJiYgYWJzKGUuYS55IC0gZS5iLnkpIDwgzrUpIHsKICAgICAgICBlLmEgPSBlLmIgPSBudWxsOwogICAgICAgIGVkZ2VzLnNwbGljZShpLCAxKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDb25uZWN0RWRnZShlZGdlLCBleHRlbnQpIHsKICAgIHZhciB2YiA9IGVkZ2UuYjsKICAgIGlmICh2YikgcmV0dXJuIHRydWU7CiAgICB2YXIgdmEgPSBlZGdlLmEsIHgwID0gZXh0ZW50WzBdWzBdLCB4MSA9IGV4dGVudFsxXVswXSwgeTAgPSBleHRlbnRbMF1bMV0sIHkxID0gZXh0ZW50WzFdWzFdLCBsU2l0ZSA9IGVkZ2UubCwgclNpdGUgPSBlZGdlLnIsIGx4ID0gbFNpdGUueCwgbHkgPSBsU2l0ZS55LCByeCA9IHJTaXRlLngsIHJ5ID0gclNpdGUueSwgZnggPSAobHggKyByeCkgLyAyLCBmeSA9IChseSArIHJ5KSAvIDIsIGZtLCBmYjsKICAgIGlmIChyeSA9PT0gbHkpIHsKICAgICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjsKICAgICAgaWYgKGx4ID4gcngpIHsKICAgICAgICBpZiAoIXZhKSB2YSA9IHsKICAgICAgICAgIHg6IGZ4LAogICAgICAgICAgeTogeTAKICAgICAgICB9OyBlbHNlIGlmICh2YS55ID49IHkxKSByZXR1cm47CiAgICAgICAgdmIgPSB7CiAgICAgICAgICB4OiBmeCwKICAgICAgICAgIHk6IHkxCiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXZhKSB2YSA9IHsKICAgICAgICAgIHg6IGZ4LAogICAgICAgICAgeTogeTEKICAgICAgICB9OyBlbHNlIGlmICh2YS55IDwgeTApIHJldHVybjsKICAgICAgICB2YiA9IHsKICAgICAgICAgIHg6IGZ4LAogICAgICAgICAgeTogeTAKICAgICAgICB9OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmbSA9IChseCAtIHJ4KSAvIChyeSAtIGx5KTsKICAgICAgZmIgPSBmeSAtIGZtICogZng7CiAgICAgIGlmIChmbSA8IC0xIHx8IGZtID4gMSkgewogICAgICAgIGlmIChseCA+IHJ4KSB7CiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHsKICAgICAgICAgICAgeDogKHkwIC0gZmIpIC8gZm0sCiAgICAgICAgICAgIHk6IHkwCiAgICAgICAgICB9OyBlbHNlIGlmICh2YS55ID49IHkxKSByZXR1cm47CiAgICAgICAgICB2YiA9IHsKICAgICAgICAgICAgeDogKHkxIC0gZmIpIC8gZm0sCiAgICAgICAgICAgIHk6IHkxCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHsKICAgICAgICAgICAgeDogKHkxIC0gZmIpIC8gZm0sCiAgICAgICAgICAgIHk6IHkxCiAgICAgICAgICB9OyBlbHNlIGlmICh2YS55IDwgeTApIHJldHVybjsKICAgICAgICAgIHZiID0gewogICAgICAgICAgICB4OiAoeTAgLSBmYikgLyBmbSwKICAgICAgICAgICAgeTogeTAKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChseSA8IHJ5KSB7CiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHsKICAgICAgICAgICAgeDogeDAsCiAgICAgICAgICAgIHk6IGZtICogeDAgKyBmYgogICAgICAgICAgfTsgZWxzZSBpZiAodmEueCA+PSB4MSkgcmV0dXJuOwogICAgICAgICAgdmIgPSB7CiAgICAgICAgICAgIHg6IHgxLAogICAgICAgICAgICB5OiBmbSAqIHgxICsgZmIKICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdmEpIHZhID0gewogICAgICAgICAgICB4OiB4MSwKICAgICAgICAgICAgeTogZm0gKiB4MSArIGZiCiAgICAgICAgICB9OyBlbHNlIGlmICh2YS54IDwgeDApIHJldHVybjsKICAgICAgICAgIHZiID0gewogICAgICAgICAgICB4OiB4MCwKICAgICAgICAgICAgeTogZm0gKiB4MCArIGZiCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWRnZS5hID0gdmE7CiAgICBlZGdlLmIgPSB2YjsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lFZGdlKGxTaXRlLCByU2l0ZSkgewogICAgdGhpcy5sID0gbFNpdGU7CiAgICB0aGlzLnIgPSByU2l0ZTsKICAgIHRoaXMuYSA9IHRoaXMuYiA9IG51bGw7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobFNpdGUsIHJTaXRlLCB2YSwgdmIpIHsKICAgIHZhciBlZGdlID0gbmV3IGQzX2dlb21fdm9yb25vaUVkZ2UobFNpdGUsIHJTaXRlKTsKICAgIGQzX2dlb21fdm9yb25vaUVkZ2VzLnB1c2goZWRnZSk7CiAgICBpZiAodmEpIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQoZWRnZSwgbFNpdGUsIHJTaXRlLCB2YSk7CiAgICBpZiAodmIpIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQoZWRnZSwgclNpdGUsIGxTaXRlLCB2Yik7CiAgICBkM19nZW9tX3Zvcm9ub2lDZWxsc1tsU2l0ZS5pXS5lZGdlcy5wdXNoKG5ldyBkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZShlZGdlLCBsU2l0ZSwgclNpdGUpKTsKICAgIGQzX2dlb21fdm9yb25vaUNlbGxzW3JTaXRlLmldLmVkZ2VzLnB1c2gobmV3IGQzX2dlb21fdm9yb25vaUhhbGZFZGdlKGVkZ2UsIHJTaXRlLCBsU2l0ZSkpOwogICAgcmV0dXJuIGVkZ2U7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNyZWF0ZUJvcmRlckVkZ2UobFNpdGUsIHZhLCB2YikgewogICAgdmFyIGVkZ2UgPSBuZXcgZDNfZ2VvbV92b3Jvbm9pRWRnZShsU2l0ZSwgbnVsbCk7CiAgICBlZGdlLmEgPSB2YTsKICAgIGVkZ2UuYiA9IHZiOwogICAgZDNfZ2VvbV92b3Jvbm9pRWRnZXMucHVzaChlZGdlKTsKICAgIHJldHVybiBlZGdlOwogIH0KICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lTZXRFZGdlRW5kKGVkZ2UsIGxTaXRlLCByU2l0ZSwgdmVydGV4KSB7CiAgICBpZiAoIWVkZ2UuYSAmJiAhZWRnZS5iKSB7CiAgICAgIGVkZ2UuYSA9IHZlcnRleDsKICAgICAgZWRnZS5sID0gbFNpdGU7CiAgICAgIGVkZ2UuciA9IHJTaXRlOwogICAgfSBlbHNlIGlmIChlZGdlLmwgPT09IHJTaXRlKSB7CiAgICAgIGVkZ2UuYiA9IHZlcnRleDsKICAgIH0gZWxzZSB7CiAgICAgIGVkZ2UuYSA9IHZlcnRleDsKICAgIH0KICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UoZWRnZSwgbFNpdGUsIHJTaXRlKSB7CiAgICB2YXIgdmEgPSBlZGdlLmEsIHZiID0gZWRnZS5iOwogICAgdGhpcy5lZGdlID0gZWRnZTsKICAgIHRoaXMuc2l0ZSA9IGxTaXRlOwogICAgdGhpcy5hbmdsZSA9IHJTaXRlID8gTWF0aC5hdGFuMihyU2l0ZS55IC0gbFNpdGUueSwgclNpdGUueCAtIGxTaXRlLngpIDogZWRnZS5sID09PSBsU2l0ZSA/IE1hdGguYXRhbjIodmIueCAtIHZhLngsIHZhLnkgLSB2Yi55KSA6IE1hdGguYXRhbjIodmEueCAtIHZiLngsIHZiLnkgLSB2YS55KTsKICB9CiAgZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UucHJvdG90eXBlID0gewogICAgc3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5lZGdlLmwgPT09IHRoaXMuc2l0ZSA/IHRoaXMuZWRnZS5hIDogdGhpcy5lZGdlLmI7CiAgICB9LAogICAgZW5kOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuZWRnZS5sID09PSB0aGlzLnNpdGUgPyB0aGlzLmVkZ2UuYiA6IHRoaXMuZWRnZS5hOwogICAgfQogIH07CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tUcmVlKCkgewogICAgdGhpcy5fID0gbnVsbDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKG5vZGUpIHsKICAgIG5vZGUuVSA9IG5vZGUuQyA9IG5vZGUuTCA9IG5vZGUuUiA9IG5vZGUuUCA9IG5vZGUuTiA9IG51bGw7CiAgfQogIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZS5wcm90b3R5cGUgPSB7CiAgICBpbnNlcnQ6IGZ1bmN0aW9uKGFmdGVyLCBub2RlKSB7CiAgICAgIHZhciBwYXJlbnQsIGdyYW5kcGEsIHVuY2xlOwogICAgICBpZiAoYWZ0ZXIpIHsKICAgICAgICBub2RlLlAgPSBhZnRlcjsKICAgICAgICBub2RlLk4gPSBhZnRlci5OOwogICAgICAgIGlmIChhZnRlci5OKSBhZnRlci5OLlAgPSBub2RlOwogICAgICAgIGFmdGVyLk4gPSBub2RlOwogICAgICAgIGlmIChhZnRlci5SKSB7CiAgICAgICAgICBhZnRlciA9IGFmdGVyLlI7CiAgICAgICAgICB3aGlsZSAoYWZ0ZXIuTCkgYWZ0ZXIgPSBhZnRlci5MOwogICAgICAgICAgYWZ0ZXIuTCA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFmdGVyLlIgPSBub2RlOwogICAgICAgIH0KICAgICAgICBwYXJlbnQgPSBhZnRlcjsKICAgICAgfSBlbHNlIGlmICh0aGlzLl8pIHsKICAgICAgICBhZnRlciA9IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrRmlyc3QodGhpcy5fKTsKICAgICAgICBub2RlLlAgPSBudWxsOwogICAgICAgIG5vZGUuTiA9IGFmdGVyOwogICAgICAgIGFmdGVyLlAgPSBhZnRlci5MID0gbm9kZTsKICAgICAgICBwYXJlbnQgPSBhZnRlcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBub2RlLlAgPSBub2RlLk4gPSBudWxsOwogICAgICAgIHRoaXMuXyA9IG5vZGU7CiAgICAgICAgcGFyZW50ID0gbnVsbDsKICAgICAgfQogICAgICBub2RlLkwgPSBub2RlLlIgPSBudWxsOwogICAgICBub2RlLlUgPSBwYXJlbnQ7CiAgICAgIG5vZGUuQyA9IHRydWU7CiAgICAgIGFmdGVyID0gbm9kZTsKICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuQykgewogICAgICAgIGdyYW5kcGEgPSBwYXJlbnQuVTsKICAgICAgICBpZiAocGFyZW50ID09PSBncmFuZHBhLkwpIHsKICAgICAgICAgIHVuY2xlID0gZ3JhbmRwYS5SjNzvVvQrAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3jQABABnz6wKgHNsCoB2CVJx/125J4NzlTfuyAEAmTFqEAAAEBCAoAo17IAE2lw4zc71ZsLAIAWisAAForAABo9ygf0sUIACetHhMIAEUAK0w3NUAAQAZIkMCoB2DAqAc2H/WVJzlTfuzbkng3gBgA7bslAAABAQgKAE2lxACjXr87CiAgICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykgewogICAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTsKICAgICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGFmdGVyID09PSBwYXJlbnQuUikgewogICAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBwYXJlbnQpOwogICAgICAgICAgICAgIGFmdGVyID0gcGFyZW50OwogICAgICAgICAgICAgIHBhcmVudCA9IGFmdGVyLlU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTsKICAgICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTsKICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBncmFuZHBhKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdW5jbGUgPSBncmFuZHBhLkw7CiAgICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykgewogICAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTsKICAgICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGFmdGVyID09PSBwYXJlbnQuTCkgewogICAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICBhZnRlciA9IHBhcmVudDsKICAgICAgICAgICAgICBwYXJlbnQgPSBhZnRlci5VOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhcmVudC5DID0gZmFsc2U7CiAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7CiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBncmFuZHBhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTsKICAgICAgfQogICAgICB0aGlzLl8uQyA9IGZhbHNlOwogICAgfSwKICAgIHJlbW92ZTogZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZS5OKSBub2RlLk4uUCA9IG5vZGUuUDsKICAgICAgaWYgKG5vZGUuUCkgbm9kZS5QLk4gPSBub2RlLk47CiAgICAgIG5vZGUuTiA9IG5vZGUuUCA9IG51bGw7CiAgICAgIHZhciBwYXJlbnQgPSBub2RlLlUsIHNpYmxpbmcsIGxlZnQgPSBub2RlLkwsIHJpZ2h0ID0gbm9kZS5SLCBuZXh0LCByZWQ7CiAgICAgIGlmICghbGVmdCkgbmV4dCA9IHJpZ2h0OyBlbHNlIGlmICghcmlnaHQpIG5leHQgPSBsZWZ0OyBlbHNlIG5leHQgPSBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja0ZpcnN0KHJpZ2h0KTsKICAgICAgaWYgKHBhcmVudCkgewogICAgICAgIGlmIChwYXJlbnQuTCA9PT0gbm9kZSkgcGFyZW50LkwgPSBuZXh0OyBlbHNlIHBhcmVudC5SID0gbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl8gPSBuZXh0OwogICAgICB9CiAgICAgIGlmIChsZWZ0ICYmIHJpZ2h0KSB7CiAgICAgICAgcmVkID0gbmV4dC5DOwogICAgICAgIG5leHQuQyA9IG5vZGUuQzsKICAgICAgICBuZXh0LkwgPSBsZWZ0OwogICAgICAgIGxlZnQuVSA9IG5leHQ7CiAgICAgICAgaWYgKG5leHQgIT09IHJpZ2h0KSB7CiAgICAgICAgICBwYXJlbnQgPSBuZXh0LlU7CiAgICAgICAgICBuZXh0LlUgPSBub2RlLlU7CiAgICAgICAgICBub2RlID0gbmV4dC5SOwogICAgICAgICAgcGFyZW50LkwgPSBub2RlOwogICAgICAgICAgbmV4dC5SID0gcmlnaHQ7CiAgICAgICAgICByaWdodC5VID0gbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV4dC5VID0gcGFyZW50OwogICAgICAgICAgcGFyZW50ID0gbmV4dDsKICAgICAgICAgIG5vZGUgPSBuZXh0LlI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJlZCA9IG5vZGUuQzsKICAgICAgICBub2RlID0gbmV4dDsKICAgICAgfQogICAgICBpZiAobm9kZSkgbm9kZS5VID0gcGFyZW50OwogICAgICBpZiAocmVkKSByZXR1cm47CiAgICAgIGlmIChub2RlICYmIG5vZGUuQykgewogICAgICAgIG5vZGUuQyA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBkbyB7CiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuXykgYnJlYWs7CiAgICAgICAgaWYgKG5vZGUgPT09IHBhcmVudC5MKSB7CiAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgICBpZiAoc2libGluZy5DKSB7CiAgICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlOwogICAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7CiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBwYXJlbnQpOwogICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2libGluZy5MICYmIHNpYmxpbmcuTC5DIHx8IHNpYmxpbmcuUiAmJiBzaWJsaW5nLlIuQykgewogICAgICAgICAgICBpZiAoIXNpYmxpbmcuUiB8fCAhc2libGluZy5SLkMpIHsKICAgICAgICAgICAgICBzaWJsaW5nLkwuQyA9IGZhbHNlOwogICAgICAgICAgICAgIHNpYmxpbmcuQyA9IHRydWU7CiAgICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBzaWJsaW5nKTsKICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2libGluZy5DID0gcGFyZW50LkM7CiAgICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5SLkMgPSBmYWxzZTsKICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7CiAgICAgICAgICAgIG5vZGUgPSB0aGlzLl87CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICBpZiAoc2libGluZy5DKSB7CiAgICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlOwogICAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7CiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNpYmxpbmcuTCAmJiBzaWJsaW5nLkwuQyB8fCBzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpIHsKICAgICAgICAgICAgaWYgKCFzaWJsaW5nLkwgfHwgIXNpYmxpbmcuTC5DKSB7CiAgICAgICAgICAgICAgc2libGluZy5SLkMgPSBmYWxzZTsKICAgICAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlOwogICAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBzaWJsaW5nKTsKICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2libGluZy5DID0gcGFyZW50LkM7CiAgICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5MLkMgPSBmYWxzZTsKICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBwYXJlbnQpOwogICAgICAgICAgICBub2RlID0gdGhpcy5fOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2libGluZy5DID0gdHJ1ZTsKICAgICAgICBub2RlID0gcGFyZW50OwogICAgICAgIHBhcmVudCA9IHBhcmVudC5VOwogICAgICB9IHdoaWxlICghbm9kZS5DKTsKICAgICAgaWYgKG5vZGUpIG5vZGUuQyA9IGZhbHNlOwogICAgfQogIH07CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVMZWZ0KHRyZWUsIG5vZGUpIHsKICAgIHZhciBwID0gbm9kZSwgcSA9IG5vZGUuUiwgcGFyZW50ID0gcC5VOwogICAgaWYgKHBhcmVudCkgewogICAgICBpZiAocGFyZW50LkwgPT09IHApIHBhcmVudC5MID0gcTsgZWxzZSBwYXJlbnQuUiA9IHE7CiAgICB9IGVsc2UgewogICAgICB0cmVlLl8gPSBxOwogICAgfQogICAgcS5VID0gcGFyZW50OwogICAgcC5VID0gcTsKICAgIHAuUiA9IHEuTDsKICAgIGlmIChwLlIpIHAuUi5VID0gcDsKICAgIHEuTCA9IHA7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodHJlZSwgbm9kZSkgewogICAgdmFyIHAgPSBub2RlLCBxID0gbm9kZS5MLCBwYXJlbnQgPSBwLlU7CiAgICBpZiAocGFyZW50KSB7CiAgICAgIGlmIChwYXJlbnQuTCA9PT0gcCkgcGFyZW50LkwgPSBxOyBlbHNlIHBhcmVudC5SID0gcTsKICAgIH0gZWxzZSB7CiAgICAgIHRyZWUuXyA9IHE7CiAgICB9CiAgICBxLlUgPSBwYXJlbnQ7CiAgICBwLlUgPSBxOwogICAgcC5MID0gcS5SOwogICAgaWYgKHAuTCkgcC5MLlUgPSBwOwogICAgcS5SID0gcDsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tGaXJzdChub2RlKSB7CiAgICB3aGlsZSAobm9kZS5MKSBub2RlID0gbm9kZS5MOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaShzaXRlcywgYmJveCkgewogICAgdmFyIHNpdGUgPSBzaXRlcy5zb3J0KGQzX2dlb21fdm9yb25vaVZlcnRleE9yZGVyKS5wb3AoKSwgeDAsIHkwLCBjaXJjbGU7CiAgICBkM19nZW9tX3Zvcm9ub2lFZGdlcyA9IFtdOwogICAgZDNfZ2VvbV92b3Jvbm9pQ2VsbHMgPSBuZXcgQXJyYXkoc2l0ZXMubGVuZ3RoKTsKICAgIGQzX2dlb21fdm9yb25vaUJlYWNoZXMgPSBuZXcgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tUcmVlKCk7CiAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzID0gbmV3IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZSgpOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY2lyY2xlID0gZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGU7CiAgICAgIGlmIChzaXRlICYmICghY2lyY2xlIHx8IHNpdGUueSA8IGNpcmNsZS55IHx8IHNpdGUueSA9PT0gY2lyY2xlLnkgJiYgc2l0ZS54IDwgY2lyY2xlLngpKSB7CiAgICAgICAgaWYgKHNpdGUueCAhPT0geDAgfHwgc2l0ZS55ICE9PSB5MCkgewogICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pQ2VsbHNbc2l0ZS5pXSA9IG5ldyBkM19nZW9tX3Zvcm9ub2lDZWxsKHNpdGUpOwogICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pQWRkQmVhY2goc2l0ZSk7CiAgICAgICAgICB4MCA9IHNpdGUueCwgeTAgPSBzaXRlLnk7CiAgICAgICAgfQogICAgICAgIHNpdGUgPSBzaXRlcy5wb3AoKTsKICAgICAgfSBlbHNlIGlmIChjaXJjbGUpIHsKICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZW1vdmVCZWFjaChjaXJjbGUuYXJjKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGJib3gpIGQzX2dlb21fdm9yb25vaUNsaXBFZGdlcyhiYm94KSwgZDNfZ2VvbV92b3Jvbm9pQ2xvc2VDZWxscyhiYm94KTsKICAgIHZhciBkaWFncmFtID0gewogICAgICBjZWxsczogZDNfZ2VvbV92b3Jvbm9pQ2VsbHMsCiAgICAgIGVkZ2VzOiBkM19nZW9tX3Zvcm9ub2lFZGdlcwogICAgfTsKICAgIGQzX2dlb21fdm9yb25vaUJlYWNoZXMgPSBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzID0gZDNfZ2VvbV92b3Jvbm9pRWRnZXMgPSBkM19nZW9tX3Zvcm9ub2lDZWxscyA9IG51bGw7CiAgICByZXR1cm4gZGlhZ3JhbTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pVmVydGV4T3JkZXIoYSwgYikgewogICAgcmV0dXJuIGIueSAtIGEueSB8fCBiLnggLSBhLng7CiAgfQogIGQzLmdlb20udm9yb25vaSA9IGZ1bmN0aW9uKHBvaW50cykgewogICAgdmFyIHggPSBkM19nZW9tX3BvaW50WCwgeSA9IGQzX2dlb21fcG9pbnRZLCBmeCA9IHgsIGZ5ID0geSwgY2xpcEV4dGVudCA9IGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQ7CiAgICBpZiAocG9pbnRzKSByZXR1cm4gdm9yb25vaShwb2ludHMpOwogICAgZnVuY3Rpb24gdm9yb25vaShkYXRhKSB7CiAgICAgIHZhciBwb2x5Z29ucyA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCksIHgwID0gY2xpcEV4dGVudFswXVswXSwgeTAgPSBjbGlwRXh0ZW50WzBdWzFdLCB4MSA9IGNsaXBFeHRlbnRbMV1bMF0sIHkxID0gY2xpcEV4dGVudFsxXVsxXTsKICAgICAgZDNfZ2VvbV92b3Jvbm9pKHNpdGVzKGRhdGEpLCBjbGlwRXh0ZW50KS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIGkpIHsKICAgICAgICB2YXIgZWRnZXMgPSBjZWxsLmVkZ2VzLCBzaXRlID0gY2VsbC5zaXRlLCBwb2x5Z29uID0gcG9seWdvbnNbaV0gPSBlZGdlcy5sZW5ndGggPyBlZGdlcy5tYXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgdmFyIHMgPSBlLnN0YXJ0KCk7CiAgICAgICAgICByZXR1cm4gWyBzLngsIHMueSBdOwogICAgICAgIH0pIDogc2l0ZS54ID49IHgwICYmIHNpdGUueCA8PSB4MSAmJiBzaXRlLnkgPj0geTAgJiYgc2l0ZS55IDw9IHkxID8gWyBbIHgwLCB5MSBdLCBbIHgxLCB5MSBdLCBbIHgxLCB5MCBdLCBbIHgwLCB5MCBdIF0gOiBbXTsKICAgICAgICBwb2x5Z29uLnBvaW50ID0gZGF0YVtpXTsKICAgICAgfSk7CiAgICAgIHJldHVybiBwb2x5Z29uczsKICAgIH0KICAgIGZ1bmN0aW9uIHNpdGVzKGRhdGEpIHsKICAgICAgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgeDogTWF0aC5yb3VuZChmeChkLCBpKSAvIM61KSAqIM61LAogICAgICAgICAgeTogTWF0aC5yb3VuZChmeShkLCBpKSAvIM61KSAqIM61LAogICAgICAgICAgaTogaQogICAgICAgIH07CiAgICAgIH0pOwogICAgfQogICAgdm9yb25vaS5saW5rcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgcmV0dXJuIGQzX2dlb21fdm9yb25vaShzaXRlcyhkYXRhKSkuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKGVkZ2UpIHsKICAgICAgICByZXR1cm4gZWRnZS5sICYmIGVkZ2UucjsKICAgICAgfSkubWFwKGZ1bmN0aW9uKGVkZ2UpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgc291cmNlOiBkYXRhW2VkZ2UubC5pXSwKICAgICAgICAgIHRhcmdldDogZGF0YVtlZGdlLnIuaV0KICAgICAgICB9OwogICAgICB9KTsKICAgIH07CiAgICB2b3Jvbm9pLnRyaWFuZ2xlcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdmFyIHRyaWFuZ2xlcyA9IFtdOwogICAgICBkM19nZW9tX3Zvcm9ub2koc2l0ZXMoZGF0YSkpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oY2VsbCwgaSkgewogICAgICAgIHZhciBzaXRlID0gY2VsbC5zaXRlLCBlZGdlcyA9IGNlbGwuZWRnZXMuc29ydChkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZU9yZGVyKSwgaiA9IC0xLCBtID0gZWRnZXMubGVuZ3RoLCBlMCwgczAsIGUxID0gZWRnZXNbbSAtIDFdLmVkZ2UsIHMxID0gZTEubCA9PT0gc2l0ZSA/IGUxLnIgOiBlMS5sOwogICAgICAgIHdoaWxlICgrK2ogPCBtKSB7CiAgICAgICAgICBlMCA9IGUxOwogICAgICAgICAgczAgPSBzMTsKICAgICAgICAgIGUxID0gZWRnZXNbal0uZWRnZTsKICAgICAgICAgIHMxID0gZTEubCA9PT0gc2l0ZSA/IGUxLnIgOiBlMS5sOwogICAgICAgICAgaWYgKGkgPCBzMC5pICYmIGkgPCBzMS5pICYmIGQzX2dlb21fdm9yb25vaVRyaWFuZ2xlQXJlYShzaXRlLCBzMCwgczEpIDwgMCkgewogICAgICAgICAgICB0cmlhbmdsZXMucHVzaChbIGRhdGFbaV0sIGRhdGFbczAuaV0sIGRhdGFbczEuaV0gXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHRyaWFuZ2xlczsKICAgIH07CiAgICB2b3Jvbm9pLnggPSBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZ4ID0gZDNfZnVuY3Rvcih4ID0gXyksIHZvcm9ub2kpIDogeDsKICAgIH07CiAgICB2b3Jvbm9pLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZ5ID0gZDNfZnVuY3Rvcih5ID0gXyksIHZvcm9ub2kpIDogeTsKICAgIH07CiAgICB2b3Jvbm9pLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsaXBFeHRlbnQgPT09IGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQgPyBudWxsIDogY2xpcEV4dGVudDsKICAgICAgY2xpcEV4dGVudCA9IF8gPT0gbnVsbCA/IGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQgOiBfOwogICAgICByZXR1cm4gdm9yb25vaTsKICAgIH07CiAgICB2b3Jvbm9pLnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsaXBFeHRlbnQgPT09IGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQgPyBudWxsIDogY2xpcEV4dGVudCAmJiBjbGlwRXh0ZW50WzFdOwogICAgICByZXR1cm4gdm9yb25vaS5jbGlwRXh0ZW50KF8gJiYgWyBbIDAsIDAgXSwgXyBdKTsKICAgIH07CiAgICByZXR1cm4gdm9yb25vaTsKICB9OwogIHZhciBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50ID0gWyBbIC0xZTYsIC0xZTYgXSwgWyAxZTYsIDFlNiBdIF07CiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pVHJpYW5nbGVBcmVhKGEsIGIsIGMpIHsKICAgIHJldHVybiAoYS54IC0gYy54KSAqIChiLnkgLSBhLnkpIC0gKGEueCAtIGIueCkgKiAoYy55IC0gYS55KTsKICB9CiAgZDMuZ2VvbS5kZWxhdW5heSA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7CiAgICByZXR1cm4gZDMuZ2VvbS52b3Jvbm9pKCkudHJpYW5nbGVzKHZlcnRpY2VzKTsKICB9OwogIGQzLmdlb20ucXVhZHRyZWUgPSBmdW5jdGlvbihwb2ludHMsIHgxLCB5MSwgeDIsIHkyKSB7CiAgICB2YXIgeCA9IGQzX2dlb21fcG9pbnRYLCB5ID0gZDNfZ2VvbV9wb2ludFksIGNvbXBhdDsKICAgIGlmIChjb21wYXQgPSBhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHggPSBkM19nZW9tX3F1YWR0cmVlQ29tcGF0WDsKICAgICAgeSA9IGQzX2dlb21fcXVhZHRyZWVDb21wYXRZOwogICAgICBpZiAoY29tcGF0ID09PSAzKSB7CiAgICAgICAgeTIgPSB5MTsKICAgICAgICB4MiA9IHgxOwogICAgICAgIHkxID0geDEgPSAwOwogICAgICB9CiAgICAgIHJldHVybiBxdWFkdHJlZShwb2ludHMpOwogICAgfQogICAgZnVuY3Rpb24gcXVhZHRyZWUoZGF0YSkgewogICAgICB2YXIgZCwgZnggPSBkM19mdW5jdG9yKHgpLCBmeSA9IGQzX2Z1bmN0b3IoeSksIHhzLCB5cywgaSwgbiwgeDFfLCB5MV8sIHgyXywgeTJfOwogICAgICBpZiAoeDEgIT0gbnVsbCkgewogICAgICAgIHgxXyA9IHgxLCB5MV8gPSB5MSwgeDJfID0geDIsIHkyXyA9IHkyOwogICAgICB9IGVsc2UgewogICAgICAgIHgyXyA9IHkyXyA9IC0oeDFfID0geTFfID0gSW5maW5pdHkpOwogICAgICAgIHhzID0gW10sIHlzID0gW107CiAgICAgICAgbiA9IGRhdGEubGVuZ3RoOwogICAgICAgIGlmIChjb21wYXQpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGQgPSBkYXRhW2ldOwogICAgICAgICAgaWYgKGQueCA8IHgxXykgeDFfID0gZC54OwogICAgICAgICAgaWYgKGQueSA8IHkxXykgeTFfID0gZC55OwogICAgICAgICAgaWYgKGQueCA+IHgyXykgeDJfID0gZC54OwogICAgICAgICAgaWYgKGQueSA+IHkyXykgeTJfID0gZC55OwogICAgICAgICAgeHMucHVzaChkLngpOwogICAgICAgICAgeXMucHVzaChkLnkpOwogICAgICAgIH0gZWxzZSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB2YXIgeF8gPSArZngoZCA9IGRhdGFbaV0sIGkpLCB5XyA9ICtmeShkLCBpKTsKICAgICAgICAgIGlmICh4XyA8IHgxXykgeDFfID0geF87CiAgICAgICAgICBpZiAoeV8gPCB5MV8pIHkxXyA9IHlfOwogICAgICAgICAgaWYgKHhfID4geDJfKSB4Ml8gPSB4XzsKICAgICAgICAgIGlmICh5XyA+IHkyXykgeTJfID0geV87CiAgICAgICAgICB4cy5wdXNoKHhfKTsKICAgICAgICAgIHlzLnB1c2goeV8pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgZHggPSB4Ml8gLSB4MV8sIGR5ID0geTJfIC0geTFfOwogICAgICBpZiAoZHggPiBkeSkgeTJfID0geTFfICsgZHg7IGVsc2UgeDJfID0geDFfICsgZHk7CiAgICAgIGZ1bmN0aW9uIGluc2VydChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5MikgewogICAgICAgIGlmIChpc05hTih4KSB8fCBpc05hTih5KSkgcmV0dXJuOwogICAgICAgIGlmIChuLmxlYWYpIHsKICAgICAgICAgIHZhciBueCA9IG4ueCwgbnkgPSBuLnk7CiAgICAgICAgICBpZiAobnggIT0gbnVsbCkgewogICAgICAgICAgICBpZiAoYWJzKG54IC0geCkgKyBhYnMobnkgLSB5KSA8IC4wMSkgewogICAgICAgICAgICAgIGluc2VydENoaWxkKG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgblBvaW50ID0gbi5wb2ludDsKICAgICAgICAgICAgICBuLnggPSBuLnkgPSBuLnBvaW50ID0gbnVsbDsKICAgICAgICAgICAgICBpbnNlcnRDaGlsZChuLCBuUG9pbnQsIG54LCBueSwgeDEsIHkxLCB4MiwgeTIpOwogICAgICAgICAgICAgIGluc2VydENoaWxkKG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbi54ID0geCwgbi55ID0geSwgbi5wb2ludCA9IGQ7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluc2VydENoaWxkKG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaW5zZXJ0Q2hpbGQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHsKICAgICAgICB2YXIgc3ggPSAoeDEgKyB4MikgKiAuNSwgc3kgPSAoeTEgKyB5MikgKiAuNSwgcmlnaHQgPSB4ID49IHN4LCBib3R0b20gPSB5ID49IHN5LCBpID0gKGJvdHRvbSA8PCAxKSArIHJpZ2h0OwogICAgICAgIG4ubGVhZiA9IGZhbHNlOwogICAgICAgIG4gPSBuLm5vZGVzW2ldIHx8IChuLm5vZGVzW2ldID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSk7CiAgICAgICAgaWYgKHJpZ2h0KSB4MSA9IHN4OyBlbHNlIHgyID0gc3g7CiAgICAgICAgaWYgKGJvdHRvbSkgeTEgPSBzeTsgZWxzZSB5MiA9IHN5OwogICAgICAgIGluc2VydChuLCBkLCB4LCB5LCB4MQ0KjNzvVsssAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3kQABABnz5wKgHNsCoB2CVJx/125J4NzlTqgSAEAo/6tsAAAEBCAoAo17IAE2lxIzc71aiLwIAGlUAABpVAABo9ygf0sUIACetHhMIAEUAVQw3PUAAQAYeyMCoB2DAqAc2H/WVJzlTqgTbkng3gBAA7eTlAAABAQgKAE2lxACjXsg3RkU4DQosIHkxLCB4MiwgeTIpOwogICAgICB9CiAgICAgIHZhciByb290ID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKTsKICAgICAgcm9vdC5hZGQgPSBmdW5jdGlvbihkKSB7CiAgICAgICAgaW5zZXJ0KHJvb3QsIGQsICtmeChkLCArK2kpLCArZnkoZCwgaSksIHgxXywgeTFfLCB4Ml8sIHkyXyk7CiAgICAgIH07CiAgICAgIHJvb3QudmlzaXQgPSBmdW5jdGlvbihmKSB7CiAgICAgICAgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIHJvb3QsIHgxXywgeTFfLCB4Ml8sIHkyXyk7CiAgICAgIH07CiAgICAgIGkgPSAtMTsKICAgICAgaWYgKHgxID09IG51bGwpIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaW5zZXJ0KHJvb3QsIGRhdGFbaV0sIHhzW2ldLCB5c1tpXSwgeDFfLCB5MV8sIHgyXywgeTJfKTsKICAgICAgICB9CiAgICAgICAgLS1pOwogICAgICB9IGVsc2UgZGF0YS5mb3JFYWNoKHJvb3QuYWRkKTsKICAgICAgeHMgPSB5cyA9IGRhdGEgPSBkID0gbnVsbDsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBxdWFkdHJlZS54ID0gZnVuY3Rpb24oXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gXywgcXVhZHRyZWUpIDogeDsKICAgIH07CiAgICBxdWFkdHJlZS55ID0gZnVuY3Rpb24oXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gXywgcXVhZHRyZWUpIDogeTsKICAgIH07CiAgICBxdWFkdHJlZS5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxID09IG51bGwgPyBudWxsIDogWyBbIHgxLCB5MSBdLCBbIHgyLCB5MiBdIF07CiAgICAgIGlmIChfID09IG51bGwpIHgxID0geTEgPSB4MiA9IHkyID0gbnVsbDsgZWxzZSB4MSA9ICtfWzBdWzBdLCB5MSA9ICtfWzBdWzFdLCB4MiA9ICtfWzFdWzBdLCAKICAgICAgeTIgPSArX1sxXVsxXTsKICAgICAgcmV0dXJuIHF1YWR0cmVlOwogICAgfTsKICAgIHF1YWR0cmVlLnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxID09IG51bGwgPyBudWxsIDogWyB4MiAtIHgxLCB5MiAtIHkxIF07CiAgICAgIGlmIChfID09IG51bGwpIHgxID0geTEgPSB4MiA9IHkyID0gbnVsbDsgZWxzZSB4MSA9IHkxID0gMCwgeDIgPSArX1swXSwgeTIgPSArX1sxXTsKICAgICAgcmV0dXJuIHF1YWR0cmVlOwogICAgfTsKICAgIHJldHVybiBxdWFkdHJlZTsKICB9OwogIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVDb21wYXRYKGQpIHsKICAgIHJldHVybiBkLng7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVDb21wYXRZKGQpIHsKICAgIHJldHVybiBkLnk7CiAgfQogIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVOb2RlKCkgewogICAgcmV0dXJuIHsKICAgICAgbGVhZjogdHJ1ZSwKICAgICAgbm9kZXM6IFtdLAogICAgICBwb2ludDogbnVsbCwKICAgICAgeDogbnVsbCwKICAgICAgeTogbnVsbAogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIG5vZGUsIHgxLCB5MSwgeDIsIHkyKSB7CiAgICBpZiAoIWYobm9kZSwgeDEsIHkxLCB4MiwgeTIpKSB7CiAgICAgIHZhciBzeCA9ICh4MSArIHgyKSAqIC41LCBzeSA9ICh5MSArIHkyKSAqIC41LCBjaGlsZHJlbiA9IG5vZGUubm9kZXM7CiAgICAgIGlmIChjaGlsZHJlblswXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzBdLCB4MSwgeTEsIHN4LCBzeSk7CiAgICAgIGlmIChjaGlsZHJlblsxXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzFdLCBzeCwgeTEsIHgyLCBzeSk7CiAgICAgIGlmIChjaGlsZHJlblsyXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzJdLCB4MSwgc3ksIHN4LCB5Mik7CiAgICAgIGlmIChjaGlsZHJlblszXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzNdLCBzeCwgc3ksIHgyLCB5Mik7CiAgICB9CiAgfQogIGQzLmludGVycG9sYXRlUmdiID0gZDNfaW50ZXJwb2xhdGVSZ2I7CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSZ2IoYSwgYikgewogICAgYSA9IGQzLnJnYihhKTsKICAgIGIgPSBkMy5yZ2IoYik7CiAgICB2YXIgYXIgPSBhLnIsIGFnID0gYS5nLCBhYiA9IGEuYiwgYnIgPSBiLnIgLSBhciwgYmcgPSBiLmcgLSBhZywgYmIgPSBiLmIgLSBhYjsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiAiIyIgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYXIgKyBiciAqIHQpKSArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhZyArIGJnICogdCkpICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFiICsgYmIgKiB0KSk7CiAgICB9OwogIH0KICBkMy5pbnRlcnBvbGF0ZU9iamVjdCA9IGQzX2ludGVycG9sYXRlT2JqZWN0OwogIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlT2JqZWN0KGEsIGIpIHsKICAgIHZhciBpID0ge30sIGMgPSB7fSwgazsKICAgIGZvciAoayBpbiBhKSB7CiAgICAgIGlmIChrIGluIGIpIHsKICAgICAgICBpW2tdID0gZDNfaW50ZXJwb2xhdGUoYVtrXSwgYltrXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1trXSA9IGFba107CiAgICAgIH0KICAgIH0KICAgIGZvciAoayBpbiBiKSB7CiAgICAgIGlmICghKGsgaW4gYSkpIHsKICAgICAgICBjW2tdID0gYltrXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpOwogICAgICByZXR1cm4gYzsKICAgIH07CiAgfQogIGQzLmludGVycG9sYXRlTnVtYmVyID0gZDNfaW50ZXJwb2xhdGVOdW1iZXI7CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVOdW1iZXIoYSwgYikgewogICAgYiAtPSBhID0gK2E7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gYSArIGIgKiB0OwogICAgfTsKICB9CiAgZDMuaW50ZXJwb2xhdGVTdHJpbmcgPSBkM19pbnRlcnBvbGF0ZVN0cmluZzsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVN0cmluZyhhLCBiKSB7CiAgICB2YXIgYmkgPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJBLmxhc3RJbmRleCA9IGQzX2ludGVycG9sYXRlX251bWJlckIubGFzdEluZGV4ID0gMCwgYW0sIGJtLCBicywgaSA9IC0xLCBzID0gW10sIHEgPSBbXTsKICAgIGEgPSBhICsgIiIsIGIgPSBiICsgIiI7CiAgICB3aGlsZSAoKGFtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyQS5leGVjKGEpKSAmJiAoYm0gPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJCLmV4ZWMoYikpKSB7CiAgICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgewogICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyBlbHNlIHNbKytpXSA9IGJzOwogICAgICB9CiAgICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgewogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyBlbHNlIHNbKytpXSA9IGJtOwogICAgICB9IGVsc2UgewogICAgICAgIHNbKytpXSA9IG51bGw7CiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IGksCiAgICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihhbSwgYm0pCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgYmkgPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJCLmxhc3RJbmRleDsKICAgIH0KICAgIGlmIChiaSA8IGIubGVuZ3RoKSB7CiAgICAgIGJzID0gYi5zbGljZShiaSk7CiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyBlbHNlIHNbKytpXSA9IGJzOwogICAgfQogICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IHFbMF0gPyAoYiA9IHFbMF0ueCwgZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gYih0KSArICIiOwogICAgfSkgOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGI7CiAgICB9IDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgIH0pOwogIH0KICB2YXIgZDNfaW50ZXJwb2xhdGVfbnVtYmVyQSA9IC9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZywgZDNfaW50ZXJwb2xhdGVfbnVtYmVyQiA9IG5ldyBSZWdFeHAoZDNfaW50ZXJwb2xhdGVfbnVtYmVyQS5zb3VyY2UsICJnIik7CiAgZDMuaW50ZXJwb2xhdGUgPSBkM19pbnRlcnBvbGF0ZTsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZShhLCBiKSB7CiAgICB2YXIgaSA9IGQzLmludGVycG9sYXRvcnMubGVuZ3RoLCBmOwogICAgd2hpbGUgKC0taSA+PSAwICYmICEoZiA9IGQzLmludGVycG9sYXRvcnNbaV0oYSwgYikpKSA7CiAgICByZXR1cm4gZjsKICB9CiAgZDMuaW50ZXJwb2xhdG9ycyA9IFsgZnVuY3Rpb24oYSwgYikgewogICAgdmFyIHQgPSB0eXBlb2YgYjsKICAgIHJldHVybiAodCA9PT0gInN0cmluZyIgPyBkM19yZ2JfbmFtZXMuaGFzKGIpIHx8IC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KGIpID8gZDNfaW50ZXJwb2xhdGVSZ2IgOiBkM19pbnRlcnBvbGF0ZVN0cmluZyA6IGIgaW5zdGFuY2VvZiBkM19jb2xvciA/IGQzX2ludGVycG9sYXRlUmdiIDogQXJyYXkuaXNBcnJheShiKSA/IGQzX2ludGVycG9sYXRlQXJyYXkgOiB0ID09PSAib2JqZWN0IiAmJiBpc05hTihiKSA/IGQzX2ludGVycG9sYXRlT2JqZWN0IDogZDNfaW50ZXJwb2xhdGVOdW1iZXIpKGEsIGIpOwogIH0gXTsKICBkMy5pbnRlcnBvbGF0ZUFycmF5ID0gZDNfaW50ZXJwb2xhdGVBcnJheTsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUFycmF5KGEsIGIpIHsKICAgIHZhciB4ID0gW10sIGMgPSBbXSwgbmEgPSBhLmxlbmd0aCwgbmIgPSBiLmxlbmd0aCwgbjAgPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpLCBpOwogICAgZm9yIChpID0gMDsgaSA8IG4wOyArK2kpIHgucHVzaChkM19pbnRlcnBvbGF0ZShhW2ldLCBiW2ldKSk7CiAgICBmb3IgKDtpIDwgbmE7ICsraSkgY1tpXSA9IGFbaV07CiAgICBmb3IgKDtpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgY1tpXSA9IHhbaV0odCk7CiAgICAgIHJldHVybiBjOwogICAgfTsKICB9CiAgdmFyIGQzX2Vhc2VfZGVmYXVsdCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX2lkZW50aXR5OwogIH07CiAgdmFyIGQzX2Vhc2UgPSBkMy5tYXAoewogICAgbGluZWFyOiBkM19lYXNlX2RlZmF1bHQsCiAgICBwb2x5OiBkM19lYXNlX3BvbHksCiAgICBxdWFkOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX2Vhc2VfcXVhZDsKICAgIH0sCiAgICBjdWJpYzogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19lYXNlX2N1YmljOwogICAgfSwKICAgIHNpbjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19lYXNlX3NpbjsKICAgIH0sCiAgICBleHA6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfZWFzZV9leHA7CiAgICB9LAogICAgY2lyY2xlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX2Vhc2VfY2lyY2xlOwogICAgfSwKICAgIGVsYXN0aWM6IGQzX2Vhc2VfZWxhc3RpYywKICAgIGJhY2s6IGQzX2Vhc2VfYmFjaywKICAgIGJvdW5jZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19lYXNlX2JvdW5jZTsKICAgIH0KICB9KTsKICB2YXIgZDNfZWFzZV9tb2RlID0gZDMubWFwKHsKICAgICJpbiI6IGQzX2lkZW50aXR5LAogICAgb3V0OiBkM19lYXNlX3JldmVyc2UsCiAgICAiaW4tb3V0IjogZDNfZWFzZV9yZWZsZWN0LAogICAgIm91dC1pbiI6IGZ1bmN0aW9uKGYpIHsKICAgICAgcmV0dXJuIGQzX2Vhc2VfcmVmbGVjdChkM19lYXNlX3JldmVyc2UoZikpOwogICAgfQogIH0pOwogIGQzLmVhc2UgPSBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgaSA9IG5hbWUuaW5kZXhPZigiLSIpLCB0ID0gaSA+PSAwID8gbmFtZS5zbGljZSgwLCBpKSA6IG5hbWUsIG0gPSBpID49IDAgPyBuYW1lLnNsaWNlKGkgKyAxKSA6ICJpbiI7CiAgICB0ID0gZDNfZWFzZS5nZXQodCkgfHwgZDNfZWFzZV9kZWZhdWx0OwogICAgbSA9IGQzX2Vhc2VfbW9kZS5nZXQobSkgfHwgZDNfaWRlbnRpdHk7CiAgICByZXR1cm4gZDNfZWFzZV9jbGFtcChtKHQuYXBwbHkobnVsbCwgZDNfYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpKSk7CiAgfTsKICBmdW5jdGlvbiBkM19lYXNlX2NsYW1wKGYpIHsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiB0IDw9IDAgPyAwIDogdCA+PSAxID8gMSA6IGYodCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19lYXNlX3JldmVyc2UoZikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIDEgLSBmKDEgLSB0KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2VfcmVmbGVjdChmKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gLjUgKiAodCA8IC41ID8gZigyICogdCkgOiAyIC0gZigyIC0gMiAqIHQpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2VfcXVhZCh0KSB7CiAgICByZXR1cm4gdCAqIHQ7CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2VfY3ViaWModCkgewogICAgcmV0dXJuIHQgKiB0ICogdDsKICB9CiAgZnVuY3Rpb24gZDNfZWFzZV9jdWJpY0luT3V0KHQpIHsKICAgIGlmICh0IDw9IDApIHJldHVybiAwOwogICAgaWYgKHQgPj0gMSkgcmV0dXJuIDE7CiAgICB2YXIgdDIgPSB0ICogdCwgdDMgPSB0MiAqIHQ7CiAgICByZXR1cm4gNCAqICh0IDwgLjUgPyB0MyA6IDMgKiAodCAtIHQyKSArIHQzIC0gLjc1KTsKICB9CiAgZnVuY3Rpb24gZDNfZWFzZV9wb2x5KGUpIHsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBNYXRoLnBvdyh0LCBlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2Vfc2luKHQpIHsKICAgIHJldHVybiAxIC0gTWF0aC5jb3ModCAqIGhhbGbPgCk7CiAgfQogIGZ1bmN0aW9uIGQzX2Vhc2VfZXhwKHQpIHsKICAgIHJldHVybiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpOwogIH0KICBmdW5jdGlvbiBkM19lYXNlX2NpcmNsZSh0KSB7CiAgICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpOwogIH0KICBmdW5jdGlvbiBkM19lYXNlX2VsYXN0aWMoYSwgcCkgewogICAgdmFyIHM7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHAgPSAuNDU7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcyA9IHAgLyDPhCAqIE1hdGguYXNpbigxIC8gYSk7IGVsc2UgYSA9IDEsIHMgPSBwIC8gNDsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiAxICsgYSAqIE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHQgLSBzKSAqIM+EIC8gcCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM19lYXNlX2JhY2socykgewogICAgaWYgKCFzKSBzID0gMS43MDE1ODsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiB0ICogdCAqICgocyArIDEpICogdCAtIHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfZWFzZV9ib3VuY2UodCkgewogICAgcmV0dXJuIHQgPCAxIC8gMi43NSA/IDcuNTYyNSAqIHQgKiB0IDogdCA8IDIgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMS41IC8gMi43NSkgKiB0ICsgLjc1IDogdCA8IDIuNSAvIDIuNzUgPyA3LjU2MjUgKiAodCAtPSAyLjI1IC8gMi43NSkgKiB0ICsgLjkzNzUgOiA3LjU2MjUgKiAodCAtPSAyLjYyNSAvIDIuNzUpICogdCArIC45ODQzNzU7CiAgfQogIGQzLmludGVycG9sYXRlSGNsID0gZDNfaW50ZXJwb2xhdGVIY2w7CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVIY2woYSwgYikgewogICAgYSA9IGQzLmhjbChhKTsKICAgIGIgPSBkMy5oY2woYik7CiAgICB2YXIgYWggPSBhLmgsIGFjID0gYS5jLCBhbCA9IGEubCwgYmggPSBiLmggLSBhaCwgYmMgPSBiLmMgLSBhYywgYmwgPSBiLmwgLSBhbDsKICAgIGlmIChpc05hTihiYykpIGJjID0gMCwgYWMgPSBpc05hTihhYykgPyBiLmMgOiBhYzsKICAgIGlmIChpc05hTihiaCkpIGJoID0gMCwgYWggPSBpc05hTihhaCkgPyBiLmggOiBhaDsgZWxzZSBpZiAoYmggPiAxODApIGJoIC09IDM2MDsgZWxzZSBpZiAoYmggPCAtMTgwKSBiaCArPSAzNjA7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gZDNfaGNsX2xhYihhaCArIGJoICogdCwgYWMgKyBiYyAqIHQsIGFsICsgYmwgKiB0KSArICIiOwogICAgfTsKICB9CiAgZDMuaW50ZXJwb2xhdGVIc2wgPSBkM19pbnRlcnBvbGF0ZUhzbDsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUhzbChhLCBiKSB7CiAgICBhID0gZDMuaHNsKGEpOwogICAgYiA9IGQzLmhzbChiKTsKICAgIHZhciBhaCA9IGEuaCwgYXMgPSBhLnMsIGFsID0gYS5sLCBiaCA9IGIuaCAtIGFoLCBicyA9IGIucyAtIGFzLCBibCA9IGIubCAtIGFsOwogICAgaWYgKGlzTmFOKGJzKSkgYnMgPSAwLCBhcyA9IGlzTmFOKGFzKSA/IGIucyA6IGFzOwogICAgaWYgKGlzTmFOKGJoKSkgYmggPSAwLCBhaCA9IGlzTmFOKGFoKSA/IGIuaCA6IGFoOyBlbHNlIGlmIChiaCA+IDE4MCkgYmggLT0gMzYwOyBlbHNlIGlmIChiaCA8IC0xODApIGJoICs9IDM2MDsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBkM19oc2xfcmdiKGFoICsgYmggKiB0LCBhcyArIGJzICogdCwgYWwgKyBibCAqIHQpICsgIiI7CiAgICB9OwogIH0KICBkMy5pbnRlcnBvbGF0ZUxhYiA9IGQzX2ludGVycG9sYXRlTGFiOwogIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlTGFiKGEsIGIpIHsKICAgIGEgPSBkMy5sYWIoYSk7CiAgICBiID0gZDMubGFiKGIpOwogICAgdmFyIGFsID0gYS5sLCBhYSA9IGEuYSwgYWIgPSBhLmIsIGJsID0gYi5sIC0gYWwsIGJhID0gYi5hIC0gYWEsIGJiID0gYi5iIC0gYWI7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gZDNfbGFiX3JnYihhbCArIGJsICogdCwgYWEgKyBiYSAqIHQsIGFiICsgYmIgKiB0KSArICIiOwogICAgfTsKICB9CiAgZDMuaW50ZXJwb2xhdGVSb3VuZCA9IGQzX2ludGVycG9sYXRlUm91bmQ7CiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSb3VuZChhLCBiKSB7CiAgICBiIC09IGE7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gTWF0aC5yb3VuZChhICsgYiAqIHQpOwogICAgfTsKICB9CiAgZDMudHJhbnNmb3JtID0gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICB2YXIgZyA9IGQzX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkMy5ucy5wcmVmaXguc3ZnLCAiZyIpOwogICAgcmV0dXJuIChkMy50cmFuc2Zvcm0gPSBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgaWYgKHN0cmluZyAhPSBudWxsKSB7CiAgICAgICAgZy5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHN0cmluZyk7CiAgICAgICAgdmFyIHQgPSBnLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBkM190cmFuc2Zvcm0odCA/IHQubWF0cml4IDogZDNfdHJhbnNmb3JtSWRlbnRpdHkpOwogICAgfSkoc3RyaW5nKTsKICB9OwogIGZ1bmN0aW9uIGQzX3RyYW5zZm9ybShtKSB7CiAgICB2YXIgcjAgPSBbIG0uYSwgbS5iIF0sIHIxID0gWyBtLmMsIG0uZCBdLCBreCA9IGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShyMCksIGt6ID0gZDNfdHJhbnNmb3JtRG90KHIwLCByMSksIGt5ID0gZDNfdHJhbnNmb3JtTm9ybWFsaXplKGQzX3RyYW5zZm9ybUNvbWJpbmUocjEsIHIwLCAta3opKSB8fCAwOwogICAgaWYgKHIwWzBdICogcjFbMV0gPCByMVswXSAqIHIwWzFdKSB7CiAgICAgIHIwWzBdICo9IC0xOwogICAgICByMFsxXSAqPSAtMTsKICAgICAga3ggKj0gLTE7CiAgICAgIGt6ICo9IC0xOwogICAgfQogICAgdGhpcy5yb3RhdGUgPSAoa3ggPyBNYXRoLmF0YW4yKHIwWzFdLCByMFswXSkgOiBNYXRoLmF0YW4yKC1yMVswXSwgcjFbMV0pKSAqIGQzX2RlZ3JlZXM7CiAgICB0aGlzLnRyYW5zbGF0ZSA9IFsgbS5lLCBtLmYgXTsKICAgIHRoaXMuc2NhbGUgPSBbIGt4LCBreSBdOwogICAgdGhpcy5za2V3ID0ga3kgPyBNYXRoLmF0YW4yKGt6LCBreSkgKiBkM19kZWdyZWVzIDogMDsKICB9CiAgZDNfdHJhbnNmb3JtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHRoaXMudHJhbnNsYXRlICsgIilyb3RhdGUoIiArIHRoaXMucm90YXRlICsgIilza2V3WCgiICsgdGhpcy5za2V3ICsgIilzY2FsZSgiICsgdGhpcy5zY2FsZSArICIpIjsKICB9OwogIGZ1bmN0aW9uIGQzX3RyYW5zZm9ybURvdChhLCBiKSB7CiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXTsKICB9CiAgZnVuY3Rpb24gZDNfdHJhbnNmb3JtTm9ybWFsaXplKGEpIHsKICAgIHZhciBrID0gTWF0aC5zcXJ0KGQzX3RyYW5zZm9ybURvdChhLCBhKSk7CiAgICBpZiAoaykgewogICAgICBhWzBdIC89IGs7CiAgICAgIGFbMV0gLz0gazsKICAgIH0KICAgIHJldHVybiBrOwogIH0KICBmdW5jdGlvbiBkM190cmFuc2Zvcm1Db21iaW5lKGEsIGIsIGspIHsKICAgIGFbMF0gKz0gayAqIGJbMF07CiAgICBhWzFdICs9IGsgKiBiWzFdOwogICAgcmV0dXJuIGE7CiAgfQogIHZhciBkM190cmFuc2Zvcm1JZGVudGl0eSA9IHsKICAgIGE6IDEsCiAgICBiOiAwLAogICAgYzogMCwKICAgIGQ6IDEsCiAgICBlOiAwLAogICAgZjogMAogIH07CiAgZDMuaW50ZXJwb2xhdGVUcmFuc2Zvcm0gPSBkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybTsKICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybShhLCBiKSB7CiAgICB2YXIgcyA9IFtdLCBxID0gW10sIG4sIEEgPSBkMy50cmFuc2Zvcm0oYSksIEIgPSBkMy50cmFuc2Zvcm0oYiksIHRhID0gQS50cmFuc2xhdGUsIHRiID0gQi50cmFuc2xhdGUsIHJhID0gQS5yb3RhdGUsIHJiID0gQi5yb3RhdGUsIHdhID0gQS5za2V3LCB3YiA9IEIuc2tldywga2EgPSBBLnNjYWxlLCBrYiA9IEIuc2NhbGU7CiAgICBpZiAodGFbMF0gIT0gdGJbMF0gfHwgdGFbMV0gIT0gdGJbMV0pIHsKICAgICAgcy5wdXNoKCJ0cmFuc2xhdGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOwogICAgICBxLnB1c2goewogICAgICAgIGk6IDEsCiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIodGFbMF0sIHRiWzBdKQogICAgICB9LCB7CiAgICAgICAgaTogMywKICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcih0YVsxXSwgdGJbMV0pCiAgICAgIH0pOwogICAgfSBlbHNlIGlmICh0YlswXSB8fCB0YlsxXSkgewogICAgICBzLnB1c2goInRyYW5zbGF0ZSgiICsgdGIgKyAiKSIpOwogICAgfSBlbHNlIHsKICAgICAgcy5wdXNoKCIiKTsKICAgIH0KICAgIGlmIChyYSAhPSByYikgewogICAgICBpZiAocmEgLSByYiA+IDE4MCkgcmIgKz0gMzYwOyBlbHNlIGlmIChyYiAtIHJhID4gMTgwKSByYSArPSAzNjA7CiAgICAgIHEucHVzaCh7CiAgICAgICAgaTogcy5wdXNoKHMucG9wKCkgKyAicm90YXRlKCIsIG51bGwsICIpIikgLSAyLAogICAgICAgIHg6IGQzX2ludGVycG9sYXRlTnVtYmVyKHJhLCByYikKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKHJiKSB7CiAgICAgIHMucHVzaChzLnBvcCgpICsgInJvdGF0ZSgiICsgcmIgKyAiKSIpOwogICAgfQogICAgaWYgKHdhICE9IHdiKSB7CiAgICAgIHEucHVzaCh7CiAgICAgICAgaTogcy5wdXNoKHMucG9wKCkgKyAic2tld1goIiwgbnVsbCwgIikiKSAtIDIsCiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIod2EsIHdiKQogICAgICB9KTsKICAgIH0gZWxzZSBpZiAod2IpIHsKICAgICAgcy5wdXNoKHMucG9wKCkgKyAic2tld1goIiArIHdiICsgIikiKTsKICAgIH0KICAgIGlmIChrYVswXSAhPSBrYlswXSB8fCBrYVsxXSAhPSBrYlsxXSkgewogICAgICBuID0gcy5wdXNoKHMucG9wKCkgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOwogICAgICBxLnB1c2goewogICAgICAgIGk6IG4gLSA0LAogICAgICAgIHg6IGQzX2ludGVycG9sYXRlTnVtYmVyKGthWzBdLCBrYlswXSkKICAgICAgfSwgewogICAgICAgIGk6IG4gLSAyLAogICAgICAgIHg6IGQzX2ludGVycG9sYXRlTnVtYmVyKGthWzFdLCBrYlsxXSkKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKGtiWzBdICE9IDEgfHwga2JbMV0gIT0gMSkgewogICAgICBzLnB1c2gocy5wb3AoKSArICJzY2FsZSgiICsga2IgKyAiKSIpOwogICAgfQogICAgbiA9IHEubGVuZ3RoOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgdmFyIGkgPSAtMSwgbzsKICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM191bmludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsKICAgIGIgPSBiIC0gKGEgPSArYSkgPyAxIC8gKGIgLSBhKSA6IDA7CiAgICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4gKHggLSBhKSAqIGI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkM191bmludGVycG9sYXRlQ2xhbXAoYSwgYikgewogICAgYiA9IGIgLSAoYSA9ICthKSA/IDEgLyAoYiAtIGEpIDogMDsKICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoeCAtIGEpICogYikpOwogICAgfTsKICB9CiAgZDMubGF5b3V0ID0ge307CiAgZDMubGF5b3V0LmJ1bmRsZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGxpbmtzKSB7CiAgICAgIHZhciBwYXRocyA9IFtdLCBpID0gLTEsIG4gPSBsaW5rcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRocy5wdXNoKGQzX2xheW91dF9idW5kbGVQYXRoKGxpbmtzW2ldKSk7CiAgICAgIHJldHVybiBwYXRoczsKICAgIH07CiAgfTsKICBmdW5jdGlvbiBkM19sYXlvdXRfYnVuZGxlUGF0aChsaW5rKSB7CiAgICB2YXIgc3RhcnQgPSBsaW5rLnNvdXJjZSwgZW5kID0gbGluay50YXJnZXQsIGxjYSA9IGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKHN0YXJ0LCBlbmQpLCBwb2ludHMgPSBbIHN0YXJ0IF07CiAgICB3aGlsZSAoc3RhcnQgIT09IGxjYSkgewogICAgICBzdGFydCA9IHN0YXJ0LnBhcmVudDsKICAgICAgcG9pbnRzLnB1c2goc3RhcnQpOwogICAgfQogICAgdmFyIGsgPSBwb2ludHMubGVuZ3RoOwogICAgd2hpbGUgKGVuZCAhPT0gbGNhKSB7CiAgICAgIHBvaW50cy5zcGxpY2UoaywgMCwgZW5kKTsKICAgICAgZW5kID0gZW5kLnBhcmVudDsKICAgIH0KICAgIHJldHVybiBwb2ludHM7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMobm9kZSkgewogICAgdmFyIGFuY2VzdG9ycyA9IFtdLCBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewogICAgICBhbmNlc3RvcnMucHVzaChub2RlKTsKICAgICAgbm9kZSA9IHBhcmVudDsKICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGFuY2VzdG9ycy5wdXNoKG5vZGUpOwogICAgcmV0dXJuIGFuY2VzdG9yczsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikgewogICAgaWYgKGEgPT09IGIpIHJldHVybiBhOwogICAgdmFyIGFOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYSksIGJOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYiksIGFOb2RlID0gYU5vZGVzLnBvcCgpLCBiTm9kZSA9IGJOb2Rlcy5wb3AoKSwgc2hhcmVkTm9kZSA9IG51bGw7CiAgICB3aGlsZSAoYU5vZGUgPT09IGJOb2RlKSB7CiAgICAgIHNoYXJlZE5vZGUgPSBhTm9kZTsKICAgICAgYU5vZGUgPSBhTm9kZXMucG9wKCk7CiAgICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpOwogICAgfQogICAgcmV0dXJuIHNoYXJlZE5vZGU7CiAgfQogIGQzLmxheW91dC5jaG9yZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNob3JkID0ge30sIGNob3JkcywgZ3JvdXBzLCBtYXRyaXgsIG4sIHBhZGRpbmcgPSAwLCBzb3J0R3JvdXBzLCBzb3J0U3ViZ3JvdXBzLCBzb3J0Q2hvcmRzOwogICAgZnVuY3Rpb24gcmVsYXlvdXQoKSB7CiAgICAgIHZhciBzdWJncm91cHMgPSB7fSwgZ3JvdXBTdW1zID0gW10sIGdyb3VwSW5kZXggPSBkMy5yYW5nZShuKSwgc3ViZ3JvdXBJbmRleCA9IFtdLCBrLCB4LCB4MCwgaSwgajsKICAgICAgY2hvcmRzID0gW107CiAgICAgIGdyb3VwcyA9IFtdOwogICAgICBrID0gMCwgaSA9IC0xOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHggPSAwLCBqID0gLTE7CiAgICAgICAgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICAgIHggKz0gbWF0cml4W2ldW2pdOwogICAgICAgIH0KICAgICAgICBncm91cFN1bXMucHVzaCh4KTsKICAgICAgICBzdWJncm91cEluZGV4LnB1c2goZDMucmFuZ2UobikpOwogICAgICAgIGsgKz0geDsKICAgICAgfQogICAgICBpZiAoc29ydEdyb3VwcykgewogICAgICAgIGdyb3VwSW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICByZXR1cm4gc29ydEdyb3Vwcyhncm91cFN1bXNbYV0sIGdyb3VwU3Vtc1tiXSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHNvcnRTdWJncm91cHMpIHsKICAgICAgICBzdWJncm91cEluZGV4LmZvckVhY2goZnVuY3Rpb24oZCwgaSkgewogICAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIHNvcnRTdWJncm91cHMobWF0cml4W2ldW2FdLCBtYXRyaXhbaV1bYl0pOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgayA9ICjPhCAtIHBhZGRpbmcgKiBuKSAvIGs7CiAgICAgIHggPSAwLCBpID0gLTE7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgeDAgPSB4LCBqID0gLTE7CiAgICAgICAgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICAgIHZhciBkaSA9IGdyb3VwSW5kZXhbaV0sIGRqID0gc3ViZ3JvdXBJbmRleFtkaV1bal0sIHYgPSBtYXRyaXhbZGldW2RqXSwgYTAgPSB4LCBhMSA9IHggKz0gdiAqIGs7CiAgICAgICAgICBzdWJncm91cHNbZGkgKyAiLSIgKyBkal0gPSB7CiAgICAgICAgICAgIGluZGV4OiBkaSwKICAgICAgICAgICAgc3ViaW5kZXg6IGRqLAogICAgICAgICAgICBzdGFydEFuZ2xlOiBhMCwKICAgICAgICAgICAgZW5kQW5nbGU6IGExLAogICAgICAgICAgICB2YWx1ZTogdgogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZ3JvdXBzW2RpXSA9IHsKICAgICAgICAgIGluZGV4OiBkaSwKICAgICAgICAgIHN0YXJ0QW5nbGU6IHgwLAogICAgICAgICAgZW5kQW5nbGU6IHgsCiAgICAgICAgICB2YWx1ZTogKHggLSB4MCkgLyBrCiAgICAgICAgfTsKICAgICAgICB4ICs9IHBhZGRpbmc7CiAgICAgIH0KICAgICAgaSA9IC0xOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGogPSBpIC0gMTsKICAgICAgICB3aGlsZSAoKytqIDwgbikgewogICAgICAgICAgdmFyIHNvdXJjZSA9IHN1Ymdyb3Vwc1tpICsgIi0iICsgal0sIHRhcmdldCA9IHN1Ymdyb3Vwc1tqICsgIi0iICsgaV07CiAgICAgICAgICBpZiAoc291cmNlLnZhbHVlIHx8IHRhcmdldC52YWx1ZSkgewogICAgICAgICAgICBjaG9yZHMucHVzaChzb3VyY2UudmFsdWUgPCB0YXJnZXQudmFsdWUgPyB7CiAgICAgICAgICAgICAgc291cmNlOiB0YXJnZXQsCiAgICAgICAgICAgICAgdGFyZ2V0OiBzb3VyY2UKICAgICAgICAgICAgfSA6IHsKICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSwKICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNvcnRDaG9yZHMpIHJlc29ydCgpOwogICAgfQogICAgZnVuY3Rpb24gcmVzb3J0KCkgewogICAgICBjaG9yZHMuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIHNvcnRDaG9yZHMoKGEuc291cmNlLnZhbHVlICsgYS50YXJnZXQudmFsdWUpIC8gMiwgKGIuc291cmNlLnZhbHVlICsgYi50YXJnZXQudmFsdWUpIC8gMik7CiAgICAgIH0pOwogICAgfQogICAgY2hvcmQubWF0cml4ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBtYXRyaXg7CiAgICAgIG4gPSAobWF0cml4ID0geCkgJiYgbWF0cml4Lmxlbmd0aDsKICAgICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsKICAgICAgcmV0dXJuIGNob3JkOwogICAgfTsKICAgIGNob3JkLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhZGRpbmc7CiAgICAgIHBhZGRpbmcgPSB4OwogICAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsOwogICAgICByZXR1cm4gY2hvcmQ7CiAgICB9OwogICAgY2hvcmQuc29ydEdyb3VwcyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydEdyb3VwczsKICAgICAgc29ydEdyb3VwcyA9IHg7CiAgICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICBjaG9yZC5zb3J0U3ViZ3JvdXBzID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0U3ViZ3JvdXBzOwogICAgICBzb3J0U3ViZ3JvdXBzID0geDsKICAgICAgY2hvcmRzID0gbnVsbDsKICAgICAgcmV0dXJuIGNob3JkOwogICAgfTsKICAgIGNob3JkLnNvcnRDaG9yZHMgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRDaG9yZHM7CiAgICAgIHNvcnRDaG9yZHMgPSB4OwogICAgICBpZiAoY2hvcmRzKSByZXNvcnQoKTsKICAgICAgcmV0dXJuIGNob3JkOwogICAgfTsKICAgIGNob3JkLmNob3JkcyA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIWNob3JkcykgcmVsYXlvdXQoKTsKICAgICAgcmV0dXJuIGNob3JkczsKICAgIH07CiAgICBjaG9yZC5ncm91cHMgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFncm91cHMpIHJlbGF5b3V0KCk7CiAgICAgIHJldHVybiBncm91cHM7CiAgICB9OwogICAgcmV0dXJuIGNob3JkOwogIH07CiAgZDMubGF5b3V0LmZvcmNlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZm9yY2UgPSB7fSwgZXZlbnQgPSBkMy5kaXNwYXRjaCgic3RhcnQiLCAidGljayIsICJlbmQiKSwgc2l6ZSA9IFsgMSwgMSBdLCBkcmFnLCBhbHBoYSwgZnJpY3Rpb24gPSAuOSwgbGlua0Rpc3RhbmNlID0gZDNfbGF5b3V0X2ZvcmNlTGlua0Rpc3RhbmNlLCBsaW5rU3RyZW5ndGggPSBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgsIGNoYXJnZSA9IC0zMCwgY2hhcmdlRGlzdGFuY2UyID0gZDNfbGF5b3V0X2ZvcmNlQ2hhcmdlRGlzdGFuY2UyLCBncmF2aXR5ID0gLjEsIHRoZXRhMiA9IC42NCwgbm9kZXMgPSBbXSwgbGlua3MgPSBbXSwgZGlzdGFuY2VzLCBzdHJlbmd0aHMsIGNoYXJnZXM7CiAgICBmdW5jdGlvbiByZXB1bHNlKG5vZGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHF1YWQsIHgxLCBfLCB4MikgewogICAgICAgIGlmIChxdWFkLnBvaW50ICE9PSBub2RlKSB7CiAgICAgICAgICB2YXIgZHggPSBxdWFkLmN4IC0gbm9kZS54LCBkeSA9IHF1YWQuY3kgLSBub2RlLnksIGR3ID0geDIgLSB4MSwgZG4gPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICAgIGlmIChkdyAqIGR3IC8gdGhldGEyIDwgZG4pIHsKICAgICAgICAgICAgaWYgKGRuIDwgY2hhcmdlRGlzdGFuY2UyKSB7CiAgICAgICAgICAgICAgdmFyIGsgPSBxdWFkLmNoYXJnZSAvIGRuOwogICAgICAgICAgICAgIG5vZGUucHggLT0gZHggKiBrOwogICAgICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHF1YWQucG9pbnQgJiYgZG4gJiYgZG4gPCBjaGFyZ2VEaXN0YW5jZTIpIHsKICAgICAgICAgICAgdmFyIGsgPSBxdWFkLnBvaW50Q2hhcmdlIC8gZG47CiAgICAgICAgICAgIG5vZGUucHggLT0gZHggKiBrOwogICAgICAgICAgICBub2RlLnB5IC09IGR5ICogazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICFxdWFkLmNoYXJnZTsKICAgICAgfTsKICAgIH0KICAgIGZvcmNlLnRpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKChhbHBoYSAqPSAuOTkpIDwgLjAwNSkgewogICAgICAgIGV2ZW50LmVuZCh7CiAgICAgICAgICB0eXBlOiAiZW5kIiwKICAgICAgICAgIGFscGhhOiBhbHBoYSA9IDAKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICB2YXIgbiA9IG5vZGVzLmxlbmd0aCwgbSA9IGxpbmtzLmxlbmd0aCwgcSwgaSwgbywgcywgdCwgbCwgaywgeCwgeTsKICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICAgIG8gPSBsaW5rc1tpXTsKICAgICAgICBzID0gby5zb3VyY2U7CiAgICAgICAgdCA9IG8udGFyZ2V0OwogICAgICAgIHggPSB0LnggLSBzLng7CiAgICAgICAgeSA9IHQueSAtIHMueTsKICAgICAgICBpZiAobCA9IHggKiB4ICsgeSAqIHkpIHsKICAgICAgICAgIGwgPSBhbHBoYSAqIHN0cmVuZ3Roc1tpXSAqICgobCA9IE1hdGguc3FydChsKSkgLSBkaXN0YW5jZXNbaV0pIC8gbDsKICAgICAgICAgIHggKj0gbDsKICAgICAgICAgIHkgKj0gbDsKICAgICAgICAgIHQueCAtPSB4ICogKGsgPSBzLndlaWdodCAvICh0LndlaWdodCArIHMud2VpZ2h0KSk7CiAgICAgICAgICB0LnkgLT0geSAqIGs7CiAgICAgICAgICBzLnggKz0geCAqIChrID0gMSAtIGspOwogICAgICAgICAgcy55ICs9IHkgKiBrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoayA9IGFscGhhICogZ3Jhdml0eSkgewogICAgICAgIHggPSBzaXplWzBdIC8gMjsKICAgICAgICB5ID0gc2l6ZVsxXSAvIDI7CiAgICAgICAgaSA9IC0xOwogICAgICAgIGlmIChrKSB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgbyA9IG5vZGVzW2ldOwogICAgICAgICAgby54ICs9ICh4IC0gby54KSAqIGs7CiAgICAgICAgICBvLnkgKz0gKHkgLSBvLnkpICogazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoYXJnZSkgewogICAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUocSA9IGQzLmdlb20ucXVhZHRyZWUobm9kZXMpLCBhbHBoYSwgY2hhcmdlcyk7CiAgICAgICAgaSA9IC0xOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIShvID0gbm9kZXNbaV0pLmZpeGVkKSB7CiAgICAgICAgICAgIHEudmlzaXQocmVwdWxzZShvKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSAtMTsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBvID0gbm9kZXNbaV07CiAgICAgICAgaWYgKG8uZml4ZWQpIHsKICAgICAgICAgIG8ueCA9IG8ucHg7CiAgICAgICAgICBvLnkgPSBvLnB5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvLnggLT0gKG8ucHggLSAoby5weCA9IG8ueCkpICogZnJpY3Rpb247CiAgICAgICAgICBvLnkgLT0gKG8ucHkgLSAoby5weSA9IG8ueSkpICogZnJpY3Rpb247CiAgICAgICAgfQogICAgICB9CiAgICAgIGV2ZW50LnRpY2soewogICAgICAgIHR5cGU6ICJ0aWNrIiwKICAgICAgICBhbHBoYTogYWxwaGEKICAgICAgfSk7CiAgICB9OwogICAgZm9yY2Uubm9kZXMgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVzOwogICAgICBub2RlcyA9IHg7CiAgICAgIHJldHVybiBmb3JjZTsKICAgIH07CiAgICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua3M7CiAgICAgIGxpbmtzID0geDsKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfTsKICAgIGZvcmNlLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICAgIHNpemUgPSB4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UubGlua0Rpc3RhbmNlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rRGlzdGFuY2U7CiAgICAgIGxpbmtEaXN0YW5jZSA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6ICt4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UuZGlzdGFuY2UgPSBmb3JjZS5saW5rRGlzdGFuY2U7CiAgICBmb3JjZS5saW5rU3RyZW5ndGggPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtTdHJlbmd0aDsKICAgICAgbGlua1N0cmVuZ3RoID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogK3g7CiAgICAgIHJldHVybiBmb3JjZTsKICAgIH07CiAgICBmb3JjZS5mcmljdGlvbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZnJpY3Rpb247CiAgICAgIGZyaWN0aW9uID0gK3g7CiAgICAgIHJldHVybiBmb3JjZTsKICAgIH07CiAgICBmb3JjZS5jaGFyZ2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNoYXJnZTsKICAgICAgY2hhcmdlID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogK3g7CiAgICAgIHJldHVybiBmb3JjZTsKICAgIH07CiAgICBmb3JjZS5jaGFyZ2VEaXN0YW5jZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gTWF0aC5zcXJ0KGNoYXJnZURpc3RhbmNlMik7CiAgICAgIGNoYXJnZURpc3RhbmNlMiA9IHggKiB4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UuZ3Jhdml0eSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3Jhdml0eTsKICAgICAgZ3Jhdml0eSA9ICt4OwogICAgICByZXR1cm4gZm9yY2U7CiAgICB9OwogICAgZm9yY2UudGhldGEgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIE1hdGguc3FydCh0aGV0YTIpOwogICAgICB0aGV0YTIgPSB4ICogeDsKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfTsKICAgIGZvcmNlLmFscGhhID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhbHBoYTsKICAgICAgeCA9ICt4OwogICAgICBpZiAoYWxwaGEpIHsKICAgICAgICBpZiAoeCA+IDApIGFscGhhID0geDsgZWxzZSBhbHBoYSA9IDA7CiAgICAgIH0gZWxzZSBpZiAoeCA+IDApIHsKICAgICAgICBldmVudC5zdGFydCh7CiAgICAgICAgICB0eXBlOiAic3RhcnQiLAogICAgICAgICAgYWxwaGE6IGFscGhhID0geAogICAgICAgIH0pOwogICAgICAgIC8vZDMudGltZXIoZm9yY2UudGljayk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiB0aWNrKCl7CiAgICAgICAgICBmb3JjZS50aWNrKCk7CiAgICAgICAgICBpZihhbHBoYSA+PSAuMDA1KTsKICAgICAgICAgIHNldFRpbWVvdXQodGljaywgMCk7CiAgICAgICAgfSwgMCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZvcmNlOwogICAgfTsKICAgIGZvcmNlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBtID0gbGlua3MubGVuZ3RoLCB3ID0gc2l6ZVswXSwgaCA9IHNpemVbMV0sIG5laWdoYm9ycywgbzsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIChvID0gbm9kZXNbaV0pLmluZGV4ID0gaTsKICAgICAgICCM3O9WEDACAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LeVAAEAGfPjAqAc2wKgHYJUnH/Xbkng3OVP+3IAQC5KUsAAAAQEICgCjXsgATaXEjNzvViUwAgBaKwAAWisAAGj3KB/SxQgAJ60eEwgARQArTDdMQABABkh5wKgHYMCoBzYf9ZUnOVP+3NuSeDeAGADtuyUAAAEBCAoATaXEAKNeyG8ud2VpZ2h0ID0gMDsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgICAgbyA9IGxpbmtzW2ldOwogICAgICAgIGlmICh0eXBlb2Ygby5zb3VyY2UgPT0gIm51bWJlciIpIG8uc291cmNlID0gbm9kZXNbby5zb3VyY2VdOwogICAgICAgIGlmICh0eXBlb2Ygby50YXJnZXQgPT0gIm51bWJlciIpIG8udGFyZ2V0ID0gbm9kZXNbby50YXJnZXRdOwogICAgICAgICsrby5zb3VyY2Uud2VpZ2h0OwogICAgICAgICsrby50YXJnZXQud2VpZ2h0OwogICAgICB9CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBvID0gbm9kZXNbaV07CiAgICAgICAgaWYgKGlzTmFOKG8ueCkpIG8ueCA9IHBvc2l0aW9uKCJ4Iiwgdyk7CiAgICAgICAgaWYgKGlzTmFOKG8ueSkpIG8ueSA9IHBvc2l0aW9uKCJ5IiwgaCk7CiAgICAgICAgaWYgKGlzTmFOKG8ucHgpKSBvLnB4ID0gby54OwogICAgICAgIGlmIChpc05hTihvLnB5KSkgby5weSA9IG8ueTsKICAgICAgfQogICAgICBkaXN0YW5jZXMgPSBbXTsKICAgICAgaWYgKHR5cGVvZiBsaW5rRGlzdGFuY2UgPT09ICJmdW5jdGlvbiIpIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIGRpc3RhbmNlc1tpXSA9ICtsaW5rRGlzdGFuY2UuY2FsbCh0aGlzLCBsaW5rc1tpXSwgaSk7IGVsc2UgZm9yIChpID0gMDsgaSA8IG07ICsraSkgZGlzdGFuY2VzW2ldID0gbGlua0Rpc3RhbmNlOwogICAgICBzdHJlbmd0aHMgPSBbXTsKICAgICAgaWYgKHR5cGVvZiBsaW5rU3RyZW5ndGggPT09ICJmdW5jdGlvbiIpIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHN0cmVuZ3Roc1tpXSA9ICtsaW5rU3RyZW5ndGguY2FsbCh0aGlzLCBsaW5rc1tpXSwgaSk7IGVsc2UgZm9yIChpID0gMDsgaSA8IG07ICsraSkgc3RyZW5ndGhzW2ldID0gbGlua1N0cmVuZ3RoOwogICAgICBjaGFyZ2VzID0gW107CiAgICAgIGlmICh0eXBlb2YgY2hhcmdlID09PSAiZnVuY3Rpb24iKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGFyZ2VzW2ldID0gK2NoYXJnZS5jYWxsKHRoaXMsIG5vZGVzW2ldLCBpKTsgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGFyZ2VzW2ldID0gY2hhcmdlOwogICAgICBmdW5jdGlvbiBwb3NpdGlvbihkaW1lbnNpb24sIHNpemUpIHsKICAgICAgICBpZiAoIW5laWdoYm9ycykgewogICAgICAgICAgbmVpZ2hib3JzID0gbmV3IEFycmF5KG4pOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgewogICAgICAgICAgICBuZWlnaGJvcnNbal0gPSBbXTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICAgICAgdmFyIG8gPSBsaW5rc1tqXTsKICAgICAgICAgICAgbmVpZ2hib3JzW28uc291cmNlLmluZGV4XS5wdXNoKG8udGFyZ2V0KTsKICAgICAgICAgICAgbmVpZ2hib3JzW28udGFyZ2V0LmluZGV4XS5wdXNoKG8uc291cmNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIGNhbmRpZGF0ZXMgPSBuZWlnaGJvcnNbaV0sIGogPSAtMSwgbSA9IGNhbmRpZGF0ZXMubGVuZ3RoLCB4OwogICAgICAgIHdoaWxlICgrK2ogPCBtKSBpZiAoIWlzTmFOKHggPSBjYW5kaWRhdGVzW2pdW2RpbWVuc2lvbl0pKSByZXR1cm4geDsKICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIHNpemU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZvcmNlLnJlc3VtZSgpOwogICAgfTsKICAgIGZvcmNlLnJlc3VtZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZm9yY2UuYWxwaGEoLjEpOwogICAgfTsKICAgIGZvcmNlLnN0b3AgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZvcmNlLmFscGhhKDApOwogICAgfTsKICAgIGZvcmNlLmRyYWcgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFkcmFnKSBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpLm9yaWdpbihkM19pZGVudGl0eSkub24oImRyYWdzdGFydC5mb3JjZSIsIGQzX2xheW91dF9mb3JjZURyYWdzdGFydCkub24oImRyYWcuZm9yY2UiLCBkcmFnbW92ZSkub24oImRyYWdlbmQuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VEcmFnZW5kKTsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZHJhZzsKICAgICAgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIiwgZDNfbGF5b3V0X2ZvcmNlTW91c2VvdmVyKS5vbigibW91c2VvdXQuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VNb3VzZW91dCkuY2FsbChkcmFnKTsKICAgIH07CiAgICBmdW5jdGlvbiBkcmFnbW92ZShkKSB7CiAgICAgIGQucHggPSBkMy5ldmVudC54LCBkLnB5ID0gZDMuZXZlbnQueTsKICAgICAgZm9yY2UucmVzdW1lKCk7CiAgICB9CiAgICByZXR1cm4gZDMucmViaW5kKGZvcmNlLCBldmVudCwgIm9uIik7CiAgfTsKICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnc3RhcnQoZCkgewogICAgZC5maXhlZCB8PSAyOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnZW5kKGQpIHsKICAgIGQuZml4ZWQgJj0gfjY7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZU1vdXNlb3ZlcihkKSB7CiAgICBkLmZpeGVkIHw9IDQ7CiAgICBkLnB4ID0gZC54LCBkLnB5ID0gZC55OwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VNb3VzZW91dChkKSB7CiAgICBkLmZpeGVkICY9IH40OwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKHF1YWQsIGFscGhhLCBjaGFyZ2VzKSB7CiAgICB2YXIgY3ggPSAwLCBjeSA9IDA7CiAgICBxdWFkLmNoYXJnZSA9IDA7CiAgICBpZiAoIXF1YWQubGVhZikgewogICAgICB2YXIgbm9kZXMgPSBxdWFkLm5vZGVzLCBuID0gbm9kZXMubGVuZ3RoLCBpID0gLTEsIGM7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgYyA9IG5vZGVzW2ldOwogICAgICAgIGlmIChjID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUoYywgYWxwaGEsIGNoYXJnZXMpOwogICAgICAgIHF1YWQuY2hhcmdlICs9IGMuY2hhcmdlOwogICAgICAgIGN4ICs9IGMuY2hhcmdlICogYy5jeDsKICAgICAgICBjeSArPSBjLmNoYXJnZSAqIGMuY3k7CiAgICAgIH0KICAgIH0KICAgIGlmIChxdWFkLnBvaW50KSB7CiAgICAgIGlmICghcXVhZC5sZWFmKSB7CiAgICAgICAgcXVhZC5wb2ludC54ICs9IE1hdGgucmFuZG9tKCkgLSAuNTsKICAgICAgICBxdWFkLnBvaW50LnkgKz0gTWF0aC5yYW5kb20oKSAtIC41OwogICAgICB9CiAgICAgIHZhciBrID0gYWxwaGEgKiBjaGFyZ2VzW3F1YWQucG9pbnQuaW5kZXhdOwogICAgICBxdWFkLmNoYXJnZSArPSBxdWFkLnBvaW50Q2hhcmdlID0gazsKICAgICAgY3ggKz0gayAqIHF1YWQucG9pbnQueDsKICAgICAgY3kgKz0gayAqIHF1YWQucG9pbnQueTsKICAgIH0KICAgIHF1YWQuY3ggPSBjeCAvIHF1YWQuY2hhcmdlOwogICAgcXVhZC5jeSA9IGN5IC8gcXVhZC5jaGFyZ2U7CiAgfQogIHZhciBkM19sYXlvdXRfZm9yY2VMaW5rRGlzdGFuY2UgPSAyMCwgZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoID0gMSwgZDNfbGF5b3V0X2ZvcmNlQ2hhcmdlRGlzdGFuY2UyID0gSW5maW5pdHk7CiAgZDMubGF5b3V0LmhpZXJhcmNoeSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNvcnQgPSBkM19sYXlvdXRfaGllcmFyY2h5U29ydCwgY2hpbGRyZW4gPSBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4sIHZhbHVlID0gZDNfbGF5b3V0X2hpZXJhcmNoeVZhbHVlOwogICAgZnVuY3Rpb24gaGllcmFyY2h5KHJvb3QpIHsKICAgICAgdmFyIHN0YWNrID0gWyByb290IF0sIG5vZGVzID0gW10sIG5vZGU7CiAgICAgIHJvb3QuZGVwdGggPSAwOwogICAgICB3aGlsZSAoKG5vZGUgPSBzdGFjay5wb3AoKSkgIT0gbnVsbCkgewogICAgICAgIG5vZGVzLnB1c2gobm9kZSk7CiAgICAgICAgaWYgKChjaGlsZHMgPSBjaGlsZHJlbi5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkpICYmIChuID0gY2hpbGRzLmxlbmd0aCkpIHsKICAgICAgICAgIHZhciBuLCBjaGlsZHMsIGNoaWxkOwogICAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goY2hpbGQgPSBjaGlsZHNbbl0pOwogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlOwogICAgICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZhbHVlKSBub2RlLnZhbHVlID0gMDsKICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkgfHwgMDsKICAgICAgICAgIGRlbGV0ZSBub2RlLmNoaWxkcmVuOwogICAgICAgIH0KICAgICAgfQogICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgdmFyIGNoaWxkcywgcGFyZW50OwogICAgICAgIGlmIChzb3J0ICYmIChjaGlsZHMgPSBub2RlLmNoaWxkcmVuKSkgY2hpbGRzLnNvcnQoc29ydCk7CiAgICAgICAgaWYgKHZhbHVlICYmIChwYXJlbnQgPSBub2RlLnBhcmVudCkpIHBhcmVudC52YWx1ZSArPSBub2RlLnZhbHVlOwogICAgICB9KTsKICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQogICAgaGllcmFyY2h5LnNvcnQgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7CiAgICAgIHNvcnQgPSB4OwogICAgICByZXR1cm4gaGllcmFyY2h5OwogICAgfTsKICAgIGhpZXJhcmNoeS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hpbGRyZW47CiAgICAgIGNoaWxkcmVuID0geDsKICAgICAgcmV0dXJuIGhpZXJhcmNoeTsKICAgIH07CiAgICBoaWVyYXJjaHkudmFsdWUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlOwogICAgICB2YWx1ZSA9IHg7CiAgICAgIHJldHVybiBoaWVyYXJjaHk7CiAgICB9OwogICAgaGllcmFyY2h5LnJldmFsdWUgPSBmdW5jdGlvbihyb290KSB7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290LCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbikgbm9kZS52YWx1ZSA9IDA7CiAgICAgICAgfSk7CiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgdmFyIHBhcmVudDsKICAgICAgICAgIGlmICghbm9kZS5jaGlsZHJlbikgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkgfHwgMDsKICAgICAgICAgIGlmIChwYXJlbnQgPSBub2RlLnBhcmVudCkgcGFyZW50LnZhbHVlICs9IG5vZGUudmFsdWU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9OwogICAgcmV0dXJuIGhpZXJhcmNoeTsKICB9OwogIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQob2JqZWN0LCBoaWVyYXJjaHkpIHsKICAgIGQzLnJlYmluZChvYmplY3QsIGhpZXJhcmNoeSwgInNvcnQiLCAiY2hpbGRyZW4iLCAidmFsdWUiKTsKICAgIG9iamVjdC5ub2RlcyA9IG9iamVjdDsKICAgIG9iamVjdC5saW5rcyA9IGQzX2xheW91dF9oaWVyYXJjaHlMaW5rczsKICAgIHJldHVybiBvYmplY3Q7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShub2RlLCBjYWxsYmFjaykgewogICAgdmFyIG5vZGVzID0gWyBub2RlIF07CiAgICB3aGlsZSAoKG5vZGUgPSBub2Rlcy5wb3AoKSkgIT0gbnVsbCkgewogICAgICBjYWxsYmFjayhub2RlKTsKICAgICAgaWYgKChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgewogICAgICAgIHZhciBuLCBjaGlsZHJlbjsKICAgICAgICB3aGlsZSAoLS1uID49IDApIG5vZGVzLnB1c2goY2hpbGRyZW5bbl0pOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKG5vZGUsIGNhbGxiYWNrKSB7CiAgICB2YXIgbm9kZXMgPSBbIG5vZGUgXSwgbm9kZXMyID0gW107CiAgICB3aGlsZSAoKG5vZGUgPSBub2Rlcy5wb3AoKSkgIT0gbnVsbCkgewogICAgICBub2RlczIucHVzaChub2RlKTsKICAgICAgaWYgKChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgewogICAgICAgIHZhciBpID0gLTEsIG4sIGNoaWxkcmVuOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsKICAgICAgfQogICAgfQogICAgd2hpbGUgKChub2RlID0gbm9kZXMyLnBvcCgpKSAhPSBudWxsKSB7CiAgICAgIGNhbGxiYWNrKG5vZGUpOwogICAgfQogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4oZCkgewogICAgcmV0dXJuIGQuY2hpbGRyZW47CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWYWx1ZShkKSB7CiAgICByZXR1cm4gZC52YWx1ZTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQoYSwgYikgewogICAgcmV0dXJuIGIudmFsdWUgLSBhLnZhbHVlOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5TGlua3Mobm9kZXMpIHsKICAgIHJldHVybiBkMy5tZXJnZShub2Rlcy5tYXAoZnVuY3Rpb24ocGFyZW50KSB7CiAgICAgIHJldHVybiAocGFyZW50LmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgc291cmNlOiBwYXJlbnQsCiAgICAgICAgICB0YXJnZXQ6IGNoaWxkCiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9KSk7CiAgfQogIGQzLmxheW91dC5wYXJ0aXRpb24gPSBmdW5jdGlvbigpIHsKICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCksIHNpemUgPSBbIDEsIDEgXTsKICAgIGZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUsIHgsIGR4LCBkeSkgewogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICBub2RlLnggPSB4OwogICAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7CiAgICAgIG5vZGUuZHggPSBkeDsKICAgICAgbm9kZS5keSA9IGR5OwogICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7CiAgICAgICAgdmFyIGkgPSAtMSwgbiwgYywgZDsKICAgICAgICBkeCA9IG5vZGUudmFsdWUgPyBkeCAvIG5vZGUudmFsdWUgOiAwOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBwb3NpdGlvbihjID0gY2hpbGRyZW5baV0sIHgsIGQgPSBjLnZhbHVlICogZHgsIGR5KTsKICAgICAgICAgIHggKz0gZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGRlcHRoKG5vZGUpIHsKICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZCA9IDA7CiAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKICAgICAgICB2YXIgaSA9IC0xLCBuOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBkID0gTWF0aC5tYXgoZCwgZGVwdGgoY2hpbGRyZW5baV0pKTsKICAgICAgfQogICAgICByZXR1cm4gMSArIGQ7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJ0aXRpb24oZCwgaSkgewogICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKTsKICAgICAgcG9zaXRpb24obm9kZXNbMF0sIDAsIHNpemVbMF0sIHNpemVbMV0gLyBkZXB0aChub2Rlc1swXSkpOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CiAgICBwYXJ0aXRpb24uc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsKICAgICAgc2l6ZSA9IHg7CiAgICAgIHJldHVybiBwYXJ0aXRpb247CiAgICB9OwogICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFydGl0aW9uLCBoaWVyYXJjaHkpOwogIH07CiAgZDMubGF5b3V0LnBpZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gTnVtYmVyLCBzb3J0ID0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlLCBzdGFydEFuZ2xlID0gMCwgZW5kQW5nbGUgPSDPhDsKICAgIGZ1bmN0aW9uIHBpZShkYXRhKSB7CiAgICAgIHZhciB2YWx1ZXMgPSBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgcmV0dXJuICt2YWx1ZS5jYWxsKHBpZSwgZCwgaSk7CiAgICAgIH0pOwogICAgICB2YXIgYSA9ICsodHlwZW9mIHN0YXJ0QW5nbGUgPT09ICJmdW5jdGlvbiIgPyBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzdGFydEFuZ2xlKTsKICAgICAgdmFyIGsgPSAoKHR5cGVvZiBlbmRBbmdsZSA9PT0gImZ1bmN0aW9uIiA/IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBlbmRBbmdsZSkgLSBhKSAvIGQzLnN1bSh2YWx1ZXMpOwogICAgICB2YXIgaW5kZXggPSBkMy5yYW5nZShkYXRhLmxlbmd0aCk7CiAgICAgIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoc29ydCA9PT0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID8gZnVuY3Rpb24oaSwgaikgewogICAgICAgIHJldHVybiB2YWx1ZXNbal0gLSB2YWx1ZXNbaV07CiAgICAgIH0gOiBmdW5jdGlvbihpLCBqKSB7CiAgICAgICAgcmV0dXJuIHNvcnQoZGF0YVtpXSwgZGF0YVtqXSk7CiAgICAgIH0pOwogICAgICB2YXIgYXJjcyA9IFtdOwogICAgICBpbmRleC5mb3JFYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgZDsKICAgICAgICBhcmNzW2ldID0gewogICAgICAgICAgZGF0YTogZGF0YVtpXSwKICAgICAgICAgIHZhbHVlOiBkID0gdmFsdWVzW2ldLAogICAgICAgICAgc3RhcnRBbmdsZTogYSwKICAgICAgICAgIGVuZEFuZ2xlOiBhICs9IGQgKiBrCiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIHJldHVybiBhcmNzOwogICAgfQogICAgcGllLnZhbHVlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZTsKICAgICAgdmFsdWUgPSB4OwogICAgICByZXR1cm4gcGllOwogICAgfTsKICAgIHBpZS5zb3J0ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0OwogICAgICBzb3J0ID0geDsKICAgICAgcmV0dXJuIHBpZTsKICAgIH07CiAgICBwaWUuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsKICAgICAgc3RhcnRBbmdsZSA9IHg7CiAgICAgIHJldHVybiBwaWU7CiAgICB9OwogICAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlbmRBbmdsZTsKICAgICAgZW5kQW5nbGUgPSB4OwogICAgICByZXR1cm4gcGllOwogICAgfTsKICAgIHJldHVybiBwaWU7CiAgfTsKICB2YXIgZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID0ge307CiAgZDMubGF5b3V0LnN0YWNrID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWVzID0gZDNfaWRlbnRpdHksIG9yZGVyID0gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0LCBvZmZzZXQgPSBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvLCBvdXQgPSBkM19sYXlvdXRfc3RhY2tPdXQsIHggPSBkM19sYXlvdXRfc3RhY2tYLCB5ID0gZDNfbGF5b3V0X3N0YWNrWTsKICAgIGZ1bmN0aW9uIHN0YWNrKGRhdGEsIGluZGV4KSB7CiAgICAgIHZhciBzZXJpZXMgPSBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlcy5jYWxsKHN0YWNrLCBkLCBpKTsKICAgICAgfSk7CiAgICAgIHZhciBwb2ludHMgPSBzZXJpZXMubWFwKGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gZC5tYXAoZnVuY3Rpb24odiwgaSkgewogICAgICAgICAgcmV0dXJuIFsgeC5jYWxsKHN0YWNrLCB2LCBpKSwgeS5jYWxsKHN0YWNrLCB2LCBpKSBdOwogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgdmFyIG9yZGVycyA9IG9yZGVyLmNhbGwoc3RhY2ssIHBvaW50cywgaW5kZXgpOwogICAgICBzZXJpZXMgPSBkMy5wZXJtdXRlKHNlcmllcywgb3JkZXJzKTsKICAgICAgcG9pbnRzID0gZDMucGVybXV0ZShwb2ludHMsIG9yZGVycyk7CiAgICAgIHZhciBvZmZzZXRzID0gb2Zmc2V0LmNhbGwoc3RhY2ssIHBvaW50cywgaW5kZXgpOwogICAgICB2YXIgbiA9IHNlcmllcy5sZW5ndGgsIG0gPSBzZXJpZXNbMF0ubGVuZ3RoLCBpLCBqLCBvOwogICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgb3V0LmNhbGwoc3RhY2ssIHNlcmllc1swXVtqXSwgbyA9IG9mZnNldHNbal0sIHBvaW50c1swXVtqXVsxXSk7CiAgICAgICAgZm9yIChpID0gMTsgaSA8IG47ICsraSkgewogICAgICAgICAgb3V0LmNhbGwoc3RhY2ssIHNlcmllc1tpXVtqXSwgbyArPSBwb2ludHNbaSAtIDFdW2pdWzFdLCBwb2ludHNbaV1bal1bMV0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIHN0YWNrLnZhbHVlcyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVzOwogICAgICB2YWx1ZXMgPSB4OwogICAgICByZXR1cm4gc3RhY2s7CiAgICB9OwogICAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yZGVyOwogICAgICBvcmRlciA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGQzX2xheW91dF9zdGFja09yZGVycy5nZXQoeCkgfHwgZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0OwogICAgICByZXR1cm4gc3RhY2s7CiAgICB9OwogICAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvZmZzZXQ7CiAgICAgIG9mZnNldCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGQzX2xheW91dF9zdGFja09mZnNldHMuZ2V0KHgpIHx8IGQzX2xheW91dF9zdGFja09mDQqM3O9WgTACAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LeZAAEAGfPfAqAc2wKgHYJUnH/Xbkng3OVQp9IAQDD9o6gAAAQEICgCjXskATaXEjNzvVpUxAgAaVQAAGlUAAGj3KB/SxQgAJ60eEwgARQBVDDdUQABABh6xwKgHYMCoBzYf9ZUnOVQp9NuSeDeAEADt5OUAAAEBCAoATaXEAKNeyTdGRTgNCmZzZXRaZXJvOwogICAgICByZXR1cm4gc3RhY2s7CiAgICB9OwogICAgc3RhY2sueCA9IGZ1bmN0aW9uKHopIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDsKICAgICAgeCA9IHo7CiAgICAgIHJldHVybiBzdGFjazsKICAgIH07CiAgICBzdGFjay55ID0gZnVuY3Rpb24oeikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5OwogICAgICB5ID0gejsKICAgICAgcmV0dXJuIHN0YWNrOwogICAgfTsKICAgIHN0YWNrLm91dCA9IGZ1bmN0aW9uKHopIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0OwogICAgICBvdXQgPSB6OwogICAgICByZXR1cm4gc3RhY2s7CiAgICB9OwogICAgcmV0dXJuIHN0YWNrOwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWChkKSB7CiAgICByZXR1cm4gZC54OwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tZKGQpIHsKICAgIHJldHVybiBkLnk7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja091dChkLCB5MCwgeSkgewogICAgZC55MCA9IHkwOwogICAgZC55ID0geTsKICB9CiAgdmFyIGQzX2xheW91dF9zdGFja09yZGVycyA9IGQzLm1hcCh7CiAgICAiaW5zaWRlLW91dCI6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwgaSwgaiwgbWF4ID0gZGF0YS5tYXAoZDNfbGF5b3V0X3N0YWNrTWF4SW5kZXgpLCBzdW1zID0gZGF0YS5tYXAoZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKSwgaW5kZXggPSBkMy5yYW5nZShuKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gbWF4W2FdIC0gbWF4W2JdOwogICAgICB9KSwgdG9wID0gMCwgYm90dG9tID0gMCwgdG9wcyA9IFtdLCBib3R0b21zID0gW107CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBqID0gaW5kZXhbaV07CiAgICAgICAgaWYgKHRvcCA8IGJvdHRvbSkgewogICAgICAgICAgdG9wICs9IHN1bXNbal07CiAgICAgICAgICB0b3BzLnB1c2goaik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJvdHRvbSArPSBzdW1zW2pdOwogICAgICAgICAgYm90dG9tcy5wdXNoKGopOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYm90dG9tcy5yZXZlcnNlKCkuY29uY2F0KHRvcHMpOwogICAgfSwKICAgIHJldmVyc2U6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgcmV0dXJuIGQzLnJhbmdlKGRhdGEubGVuZ3RoKS5yZXZlcnNlKCk7CiAgICB9LAogICAgImRlZmF1bHQiOiBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQKICB9KTsKICB2YXIgZDNfbGF5b3V0X3N0YWNrT2Zmc2V0cyA9IGQzLm1hcCh7CiAgICBzaWxob3VldHRlOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgIHZhciBuID0gZGF0YS5sZW5ndGgsIG0gPSBkYXRhWzBdLmxlbmd0aCwgc3VtcyA9IFtdLCBtYXggPSAwLCBpLCBqLCBvLCB5MCA9IFtdOwogICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yIChpID0gMCwgbyA9IDA7IGkgPCBuOyBpKyspIG8gKz0gZGF0YVtpXVtqXVsxXTsKICAgICAgICBpZiAobyA+IG1heCkgbWF4ID0gbzsKICAgICAgICBzdW1zLnB1c2gobyk7CiAgICAgIH0KICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIHkwW2pdID0gKG1heCAtIHN1bXNbal0pIC8gMjsKICAgICAgfQogICAgICByZXR1cm4geTA7CiAgICB9LAogICAgd2lnZ2xlOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgIHZhciBuID0gZGF0YS5sZW5ndGgsIHggPSBkYXRhWzBdLCBtID0geC5sZW5ndGgsIGksIGosIGssIHMxLCBzMiwgczMsIGR4LCBvLCBvMCwgeTAgPSBbXTsKICAgICAgeTBbMF0gPSBvID0gbzAgPSAwOwogICAgICBmb3IgKGogPSAxOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yIChpID0gMCwgczEgPSAwOyBpIDwgbjsgKytpKSBzMSArPSBkYXRhW2ldW2pdWzFdOwogICAgICAgIGZvciAoaSA9IDAsIHMyID0gMCwgZHggPSB4W2pdWzBdIC0geFtqIC0gMV1bMF07IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGZvciAoayA9IDAsIHMzID0gKGRhdGFbaV1bal1bMV0gLSBkYXRhW2ldW2ogLSAxXVsxXSkgLyAoMiAqIGR4KTsgayA8IGk7ICsraykgewogICAgICAgICAgICBzMyArPSAoZGF0YVtrXVtqXVsxXSAtIGRhdGFba11baiAtIDFdWzFdKSAvIGR4OwogICAgICAgICAgfQogICAgICAgICAgczIgKz0gczMgKiBkYXRhW2ldW2pdWzFdOwogICAgICAgIH0KICAgICAgICB5MFtqXSA9IG8gLT0gczEgPyBzMiAvIHMxICogZHggOiAwOwogICAgICAgIGlmIChvIDwgbzApIG8wID0gbzsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB5MFtqXSAtPSBvMDsKICAgICAgcmV0dXJuIHkwOwogICAgfSwKICAgIGV4cGFuZDogZnVuY3Rpb24oZGF0YSkgewogICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCBtID0gZGF0YVswXS5sZW5ndGgsIGsgPSAxIC8gbiwgaSwgaiwgbywgeTAgPSBbXTsKICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbjsgaSsrKSBvICs9IGRhdGFbaV1bal1bMV07CiAgICAgICAgaWYgKG8pIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGRhdGFbaV1bal1bMV0gLz0gbzsgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkYXRhW2ldW2pdWzFdID0gazsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB5MFtqXSA9IDA7CiAgICAgIHJldHVybiB5MDsKICAgIH0sCiAgICB6ZXJvOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvCiAgfSk7CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0KGRhdGEpIHsKICAgIHJldHVybiBkMy5yYW5nZShkYXRhLmxlbmd0aCk7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja09mZnNldFplcm8oZGF0YSkgewogICAgdmFyIGogPSAtMSwgbSA9IGRhdGFbMF0ubGVuZ3RoLCB5MCA9IFtdOwogICAgd2hpbGUgKCsraiA8IG0pIHkwW2pdID0gMDsKICAgIHJldHVybiB5MDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrTWF4SW5kZXgoYXJyYXkpIHsKICAgIHZhciBpID0gMSwgaiA9IDAsIHYgPSBhcnJheVswXVsxXSwgaywgbiA9IGFycmF5Lmxlbmd0aDsKICAgIGZvciAoO2kgPCBuOyArK2kpIHsKICAgICAgaWYgKChrID0gYXJyYXlbaV1bMV0pID4gdikgewogICAgICAgIGogPSBpOwogICAgICAgIHYgPSBrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKGQpIHsKICAgIHJldHVybiBkLnJlZHVjZShkM19sYXlvdXRfc3RhY2tTdW0sIDApOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tTdW0ocCwgZCkgewogICAgcmV0dXJuIHAgKyBkWzFdOwogIH0KICBkMy5sYXlvdXQuaGlzdG9ncmFtID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZnJlcXVlbmN5ID0gdHJ1ZSwgdmFsdWVyID0gTnVtYmVyLCByYW5nZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtUmFuZ2UsIGJpbm5lciA9IGQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzOwogICAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEsIGkpIHsKICAgICAgdmFyIGJpbnMgPSBbXSwgdmFsdWVzID0gZGF0YS5tYXAodmFsdWVyLCB0aGlzKSwgcmFuZ2UgPSByYW5nZXIuY2FsbCh0aGlzLCB2YWx1ZXMsIGkpLCB0aHJlc2hvbGRzID0gYmlubmVyLmNhbGwodGhpcywgcmFuZ2UsIHZhbHVlcywgaSksIGJpbiwgaSA9IC0xLCBuID0gdmFsdWVzLmxlbmd0aCwgbSA9IHRocmVzaG9sZHMubGVuZ3RoIC0gMSwgayA9IGZyZXF1ZW5jeSA/IDEgOiAxIC8gbiwgeDsKICAgICAgd2hpbGUgKCsraSA8IG0pIHsKICAgICAgICBiaW4gPSBiaW5zW2ldID0gW107CiAgICAgICAgYmluLmR4ID0gdGhyZXNob2xkc1tpICsgMV0gLSAoYmluLnggPSB0aHJlc2hvbGRzW2ldKTsKICAgICAgICBiaW4ueSA9IDA7CiAgICAgIH0KICAgICAgaWYgKG0gPiAwKSB7CiAgICAgICAgaSA9IC0xOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICB4ID0gdmFsdWVzW2ldOwogICAgICAgICAgaWYgKHggPj0gcmFuZ2VbMF0gJiYgeCA8PSByYW5nZVsxXSkgewogICAgICAgICAgICBiaW4gPSBiaW5zW2QzLmJpc2VjdCh0aHJlc2hvbGRzLCB4LCAxLCBtKSAtIDFdOwogICAgICAgICAgICBiaW4ueSArPSBrOwogICAgICAgICAgICBiaW4ucHVzaChkYXRhW2ldKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJpbnM7CiAgICB9CiAgICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlcjsKICAgICAgdmFsdWVyID0geDsKICAgICAgcmV0dXJuIGhpc3RvZ3JhbTsKICAgIH07CiAgICBoaXN0b2dyYW0ucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlcjsKICAgICAgcmFuZ2VyID0gZDNfZnVuY3Rvcih4KTsKICAgICAgcmV0dXJuIGhpc3RvZ3JhbTsKICAgIH07CiAgICBoaXN0b2dyYW0uYmlucyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYmlubmVyOwogICAgICBiaW5uZXIgPSB0eXBlb2YgeCA9PT0gIm51bWJlciIgPyBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIHgpOwogICAgICB9IDogZDNfZnVuY3Rvcih4KTsKICAgICAgcmV0dXJuIGhpc3RvZ3JhbTsKICAgIH07CiAgICBoaXN0b2dyYW0uZnJlcXVlbmN5ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmVxdWVuY3k7CiAgICAgIGZyZXF1ZW5jeSA9ICEheDsKICAgICAgcmV0dXJuIGhpc3RvZ3JhbTsKICAgIH07CiAgICByZXR1cm4gaGlzdG9ncmFtOwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpblN0dXJnZXMocmFuZ2UsIHZhbHVlcykgewogICAgcmV0dXJuIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIgKyAxKSk7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgbikgewogICAgdmFyIHggPSAtMSwgYiA9ICtyYW5nZVswXSwgbSA9IChyYW5nZVsxXSAtIGIpIC8gbiwgZiA9IFtdOwogICAgd2hpbGUgKCsreCA8PSBuKSBmW3hdID0gbSAqIHggKyBiOwogICAgcmV0dXJuIGY7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1SYW5nZSh2YWx1ZXMpIHsKICAgIHJldHVybiBbIGQzLm1pbih2YWx1ZXMpLCBkMy5tYXgodmFsdWVzKSBdOwogIH0KICBkMy5sYXlvdXQucGFjayA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KGQzX2xheW91dF9wYWNrU29ydCksIHBhZGRpbmcgPSAwLCBzaXplID0gWyAxLCAxIF0sIHJhZGl1czsKICAgIGZ1bmN0aW9uIHBhY2soZCwgaSkgewogICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwgcm9vdCA9IG5vZGVzWzBdLCB3ID0gc2l6ZVswXSwgaCA9IHNpemVbMV0sIHIgPSByYWRpdXMgPT0gbnVsbCA/IE1hdGguc3FydCA6IHR5cGVvZiByYWRpdXMgPT09ICJmdW5jdGlvbiIgPyByYWRpdXMgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcmFkaXVzOwogICAgICB9OwogICAgICByb290LnggPSByb290LnkgPSAwOwogICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7CiAgICAgICAgZC5yID0gK3IoZC52YWx1ZSk7CiAgICAgIH0pOwogICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBkM19sYXlvdXRfcGFja1NpYmxpbmdzKTsKICAgICAgaWYgKHBhZGRpbmcpIHsKICAgICAgICB2YXIgZHIgPSBwYWRkaW5nICogKHJhZGl1cyA/IDEgOiBNYXRoLm1heCgyICogcm9vdC5yIC8gdywgMiAqIHJvb3QuciAvIGgpKSAvIDI7CiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24oZCkgewogICAgICAgICAgZC5yICs9IGRyOwogICAgICAgIH0pOwogICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGQzX2xheW91dF9wYWNrU2libGluZ3MpOwogICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgIGQuciAtPSBkcjsKICAgICAgICB9KTsKICAgICAgfQogICAgICBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShyb290LCB3IC8gMiwgaCAvIDIsIHJhZGl1cyA/IDEgOiAxIC8gTWF0aC5tYXgoMiAqIHJvb3QuciAvIHcsIDIgKiByb290LnIgLyBoKSk7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KICAgIHBhY2suc2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsKICAgICAgc2l6ZSA9IF87CiAgICAgIHJldHVybiBwYWNrOwogICAgfTsKICAgIHBhY2sucmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYWRpdXM7CiAgICAgIHJhZGl1cyA9IF8gPT0gbnVsbCB8fCB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiArXzsKICAgICAgcmV0dXJuIHBhY2s7CiAgICB9OwogICAgcGFjay5wYWRkaW5nID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nOwogICAgICBwYWRkaW5nID0gK187CiAgICAgIHJldHVybiBwYWNrOwogICAgfTsKICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHBhY2ssIGhpZXJhcmNoeSk7CiAgfTsKICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1NvcnQoYSwgYikgewogICAgcmV0dXJuIGEudmFsdWUgLSBiLnZhbHVlOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja0luc2VydChhLCBiKSB7CiAgICB2YXIgYyA9IGEuX3BhY2tfbmV4dDsKICAgIGEuX3BhY2tfbmV4dCA9IGI7CiAgICBiLl9wYWNrX3ByZXYgPSBhOwogICAgYi5fcGFja19uZXh0ID0gYzsKICAgIGMuX3BhY2tfcHJldiA9IGI7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrU3BsaWNlKGEsIGIpIHsKICAgIGEuX3BhY2tfbmV4dCA9IGI7CiAgICBiLl9wYWNrX3ByZXYgPSBhOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoYSwgYikgewogICAgdmFyIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueSwgZHIgPSBhLnIgKyBiLnI7CiAgICByZXR1cm4gLjk5OSAqIGRyICogZHIgPiBkeCAqIGR4ICsgZHkgKiBkeTsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTaWJsaW5ncyhub2RlKSB7CiAgICBpZiAoIShub2RlcyA9IG5vZGUuY2hpbGRyZW4pIHx8ICEobiA9IG5vZGVzLmxlbmd0aCkpIHJldHVybjsKICAgIHZhciBub2RlcywgeE1pbiA9IEluZmluaXR5LCB4TWF4ID0gLUluZmluaXR5LCB5TWluID0gSW5maW5pdHksIHlNYXggPSAtSW5maW5pdHksIGEsIGIsIGMsIGksIGosIGssIG47CiAgICBmdW5jdGlvbiBib3VuZChub2RlKSB7CiAgICAgIHhNaW4gPSBNYXRoLm1pbihub2RlLnggLSBub2RlLnIsIHhNaW4pOwogICAgICB4TWF4ID0gTWF0aC5tYXgobm9kZS54ICsgbm9kZS5yLCB4TWF4KTsKICAgICAgeU1pbiA9IE1hdGgubWluKG5vZGUueSAtIG5vZGUuciwgeU1pbik7CiAgICAgIHlNYXggPSBNYXRoLm1heChub2RlLnkgKyBub2RlLnIsIHlNYXgpOwogICAgfQogICAgbm9kZXMuZm9yRWFjaChkM19sYXlvdXRfcGFja0xpbmspOwogICAgYSA9IG5vZGVzWzBdOwogICAgYS54ID0gLWEucjsKICAgIGEueSA9IDA7CiAgICBib3VuZChhKTsKICAgIGlmIChuID4gMSkgewogICAgICBiID0gbm9kZXNbMV07CiAgICAgIGIueCA9IGIucjsKICAgICAgYi55ID0gMDsKICAgICAgYm91bmQoYik7CiAgICAgIGlmIChuID4gMikgewogICAgICAgIGMgPSBub2Rlc1syXTsKICAgICAgICBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMpOwogICAgICAgIGJvdW5kKGMpOwogICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpOwogICAgICAgIGEuX3BhY2tfcHJldiA9IGM7CiAgICAgICAgZDNfbGF5b3V0X3BhY2tJbnNlcnQoYywgYik7CiAgICAgICAgYiA9IGEuX3BhY2tfbmV4dDsKICAgICAgICBmb3IgKGkgPSAzOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMgPSBub2Rlc1tpXSk7CiAgICAgICAgICB2YXIgaXNlY3QgPSAwLCBzMSA9IDEsIHMyID0gMTsKICAgICAgICAgIGZvciAoaiA9IGIuX3BhY2tfbmV4dDsgaiAhPT0gYjsgaiA9IGouX3BhY2tfbmV4dCwgczErKykgewogICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGosIGMpKSB7CiAgICAgICAgICAgICAgaXNlY3QgPSAxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNlY3QgPT0gMSkgewogICAgICAgICAgICBmb3IgKGsgPSBhLl9wYWNrX3ByZXY7IGsgIT09IGouX3BhY2tfcHJldjsgayA9IGsuX3BhY2tfcHJldiwgczIrKykgewogICAgICAgICAgICAgIGlmIChkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoaywgYykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzZWN0KSB7CiAgICAgICAgICAgIGlmIChzMSA8IHMyIHx8IHMxID09IHMyICYmIGIuciA8IGEucikgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSwgYiA9IGopOyBlbHNlIGQzX2xheW91dF9wYWNrU3BsaWNlKGEgPSBrLCBiKTsKICAgICAgICAgICAgaS0tOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYyk7CiAgICAgICAgICAgIGIgPSBjOwogICAgICAgICAgICBib3VuZChjKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBjeCA9ICh4TWluICsgeE1heCkgLyAyLCBjeSA9ICh5TWluICsgeU1heCkgLyAyLCBjciA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGMgPSBub2Rlc1tpXTsKICAgICAgYy54IC09IGN4OwogICAgICBjLnkgLT0gY3k7CiAgICAgIGNyID0gTWF0aC5tYXgoY3IsIGMuciArIE1hdGguc3FydChjLnggKiBjLnggKyBjLnkgKiBjLnkpKTsKICAgIH0KICAgIG5vZGUuciA9IGNyOwogICAgbm9kZXMuZm9yRWFjaChkM19sYXlvdXRfcGFja1VubGluayk7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrTGluayhub2RlKSB7CiAgICBub2RlLl9wYWNrX25leHQgPSBub2RlLl9wYWNrX3ByZXYgPSBub2RlOwogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1VubGluayhub2RlKSB7CiAgICBkZWxldGUgbm9kZS5fcGFja19uZXh0OwogICAgZGVsZXRlIG5vZGUuX3BhY2tfcHJldjsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0obm9kZSwgeCwgeSwgaykgewogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgIG5vZGUueCA9IHggKz0gayAqIG5vZGUueDsKICAgIG5vZGUueSA9IHkgKz0gayAqIG5vZGUueTsKICAgIG5vZGUuciAqPSBrOwogICAgaWYgKGNoaWxkcmVuKSB7CiAgICAgIHZhciBpID0gLTEsIG4gPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShjaGlsZHJlbltpXSwgeCwgeSwgayk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYykgewogICAgdmFyIGRiID0gYS5yICsgYy5yLCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7CiAgICBpZiAoZGIgJiYgKGR4IHx8IGR5KSkgewogICAgICB2YXIgZGEgPSBiLnIgKyBjLnIsIGRjID0gZHggKiBkeCArIGR5ICogZHk7CiAgICAgIGRhICo9IGRhOwogICAgICBkYiAqPSBkYjsKICAgICAgdmFyIHggPSAuNSArIChkYiAtIGRhKSAvICgyICogZGMpLCB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIDIgKiBkYSAqIChkYiArIGRjKSAtIChkYiAtPSBkYykgKiBkYiAtIGRhICogZGEpKSAvICgyICogZGMpOwogICAgICBjLnggPSBhLnggKyB4ICogZHggKyB5ICogZHk7CiAgICAgIGMueSA9IGEueSArIHggKiBkeSAtIHkgKiBkeDsKICAgIH0gZWxzZSB7CiAgICAgIGMueCA9IGEueCArIGRiOwogICAgICBjLnkgPSBhLnk7CiAgICB9CiAgfQogIGQzLmxheW91dC50cmVlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksIHNlcGFyYXRpb24gPSBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb24sIHNpemUgPSBbIDEsIDEgXSwgbm9kZVNpemUgPSBudWxsOwogICAgZnVuY3Rpb24gdHJlZShkLCBpKSB7CiAgICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLCByb290MCA9IG5vZGVzWzBdLCByb290MSA9IHdyYXBUcmVlKHJvb3QwKTsKICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdDEsIGZpcnN0V2FsayksIHJvb3QxLnBhcmVudC5tID0gLXJvb3QxLno7CiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290MSwgc2Vjb25kV2Fsayk7CiAgICAgIGlmIChub2RlU2l6ZSkgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QmVmb3JlKHJvb3QwLCBzaXplTm9kZSk7IGVsc2UgewogICAgICAgIHZhciBsZWZ0ID0gcm9vdDAsIHJpZ2h0ID0gcm9vdDAsIGJvdHRvbSA9IHJvb3QwOwogICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290MCwgZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgaWYgKG5vZGUueCA8IGxlZnQueCkgbGVmdCA9IG5vZGU7CiAgICAgICAgICBpZiAobm9kZS54ID4gcmlnaHQueCkgcmlnaHQgPSBub2RlOwogICAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIHR4ID0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyIC0gbGVmdC54LCBreCA9IHNpemVbMF0gLyAocmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMiArIHR4KSwga3kgPSBzaXplWzFdIC8gKGJvdHRvbS5kZXB0aCB8fCAxKTsKICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdDAsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgIG5vZGUueCA9IChub2RlLnggKyB0eCkgKiBreDsKICAgICAgICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBreTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CiAgICBmdW5jdGlvbiB3cmFwVHJlZShyb290MCkgewogICAgICB2YXIgcm9vdDEgPSB7CiAgICAgICAgQTogbnVsbCwKICAgICAgICBjaGlsZHJlbjogWyByb290MCBdCiAgICAgIH0sIHF1ZXVlID0gWyByb290MSBdLCBub2RlMTsKICAgICAgd2hpbGUgKChub2RlMSA9IHF1ZXVlLnBvcCgpKSAhPSBudWxsKSB7CiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBub2RlMS5jaGlsZHJlbiwgY2hpbGQsIGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBxdWV1ZS5wdXNoKChjaGlsZHJlbltpXSA9IGNoaWxkID0gewogICAgICAgICAgICBfOiBjaGlsZHJlbltpXSwKICAgICAgICAgICAgcGFyZW50OiBub2RlMSwKICAgICAgICAgICAgY2hpbGRyZW46IChjaGlsZCA9IGNoaWxkcmVuW2ldLmNoaWxkcmVuKSAmJiBjaGlsZC5zbGljZSgpIHx8IFtdLAogICAgICAgICAgICBBOiBudWxsLAogICAgICAgICAgICBhOiBudWxsLAogICAgICAgICAgICB6OiAwLAogICAgICAgICAgICBtOiAwLAogICAgICAgICAgICBjOiAwLAogICAgICAgICAgICBzOiAwLAogICAgICAgICAgICB0OiBudWxsLAogICAgICAgICAgICBpOiBpCiAgICAgICAgICB9KS5hID0gY2hpbGQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcm9vdDEuY2hpbGRyZW5bMF07CiAgICB9CiAgICBmdW5jdGlvbiBmaXJzdFdhbGsodikgewogICAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLCBzaWJsaW5ncyA9IHYucGFyZW50LmNoaWxkcmVuLCB3ID0gdi5pID8gc2libGluZ3Nbdi5pIC0gMV0gOiBudWxsOwogICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgZDNfbGF5b3V0X3RyZWVTaGlmdCh2KTsKICAgICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjsKICAgICAgICBpZiAodykgewogICAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7CiAgICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdi56ID0gbWlkcG9pbnQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHcpIHsKICAgICAgICB2LnogPSB3LnogKyBzZXBhcmF0aW9uKHYuXywgdy5fKTsKICAgICAgfQogICAgICB2LnBhcmVudC5BID0gYXBwb3J0aW9uKHYsIHcsIHYucGFyZW50LkEgfHwgc2libGluZ3NbMF0pOwogICAgfQogICAgZnVuY3Rpb24gc2Vjb25kV2Fsayh2KSB7CiAgICAgIHYuXy54ID0gdi56ICsgdi5wYXJlbnQubTsKICAgICAgdi5tICs9IHYucGFyZW50Lm07CiAgICB9CiAgICBmdW5jdGlvbiBhcHBvcnRpb24odiwgdywgYW5jZXN0b3IpIHsKICAgICAgaWYgKHcpIHsKICAgICAgICB2YXIgdmlwID0gdiwgdm9wID0gdiwgdmltID0gdywgdm9tID0gdmlwLnBhcmVudC5jaGlsZHJlblswXSwgc2lwID0gdmlwLm0sIHNvcCA9IHZvcC5tLCBzaW0gPSB2aW0ubSwgc29tID0gdm9tLm0sIHNoaWZ0OwogICAgICAgIHdoaWxlICh2aW0gPSBkM19sYXlvdXRfdHJlZVJpZ2h0KHZpbSksIHZpcCA9IGQzX2xheW91dF90cmVlTGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7CiAgICAgICAgICB2b20gPSBkM19sYXlvdXRfdHJlZUxlZnQodm9tKTsKICAgICAgICAgIHZvcCA9IGQzX2xheW91dF90cmVlUmlnaHQodm9wKTsKICAgICAgICAgIHZvcC5hID0gdjsKICAgICAgICAgIHNoaWZ0ID0gdmltLnogKyBzaW0gLSB2aXAueiAtIHNpcCArIHNlcGFyYXRpb24odmltLl8sIHZpcC5fKTsKICAgICAgICAgIGlmIChzaGlmdCA+IDApIHsKICAgICAgICAgICAgZDNfbGF5b3V0X3RyZWVNb3ZlKGQzX2xheW91dF90cmVlQW5jZXN0b3IodmltLCB2LCBhbmNlc3RvciksIHYsIHNoaWZ0KTsKICAgICAgICAgICAgc2lwICs9IHNoaWZ0OwogICAgICAgICAgICBzb3AgKz0gc2hpZnQ7CiAgICAgICAgICB9CiAgICAgICAgICBzaW0gKz0gdmltLm07CiAgICAgICAgICBzaXAgKz0gdmlwLm07CiAgICAgICAgICBzb20gKz0gdm9tLm07CiAgICAgICAgICBzb3AgKz0gdm9wLm07CiAgICAgICAgfQogICAgICAgIGlmICh2aW0gJiYgIWQzX2xheW91dF90cmVlUmlnaHQodm9wKSkgewogICAgICAgICAgdm9wLnQgPSB2aW07CiAgICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7CiAgICAgICAgfQogICAgICAgIGlmICh2aXAgJiYgIWQzX2xheW91dF90cmVlTGVmdCh2b20pKSB7CiAgICAgICAgICB2b20udCA9IHZpcDsKICAgICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTsKICAgICAgICAgIGFuY2VzdG9yID0gdjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGFuY2VzdG9yOwogICAgfQogICAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkgewogICAgICBub2RlLnggKj0gc2l6ZVswXTsKICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIHNpemVbMV07CiAgICB9CiAgICB0cmVlLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247CiAgICAgIHNlcGFyYXRpb24gPSB4OwogICAgICByZXR1cm4gdHJlZTsKICAgIH07CiAgICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVTaXplID8gbnVsbCA6IHNpemU7CiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB4KSA9PSBudWxsID8gc2l6ZU5vZGUgOiBudWxsOwogICAgICByZXR1cm4gdHJlZTsKICAgIH07CiAgICB0cmVlLm5vZGVTaXplID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlU2l6ZSA/IHNpemUgOiBudWxsOwogICAgICBub2RlU2l6ZSA9IChzaXplID0geCkgPT0gbnVsbCA/IG51bGwgOiBzaXplTm9kZTsKICAgICAgcmV0dXJuIHRyZWU7CiAgICB9OwogICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZSwgaGllcmFyY2h5KTsKICB9OwogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2VwYXJhdGlvbihhLCBiKSB7CiAgICByZXR1cm4gYS5wYXJlbnQgPT0gYi5wYXJlbnQgPyAxIDogMjsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0KHYpIHsKICAgIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47CiAgICByZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5bMF0gOiB2LnQ7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlUmlnaHQodikgewogICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwgbjsKICAgIHJldHVybiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBjaGlsZHJlbltuIC0gMV0gOiB2LnQ7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlTW92ZSh3bSwgd3AsIHNoaWZ0KSB7CiAgICB2YXIgY2hhbmdlID0gc2hpZnQgLyAod3AuaSAtIHdtLmkpOwogICAgd3AuYyAtPSBjaGFuZ2U7CiAgICB3cC5zICs9IHNoaWZ0OwogICAgd20uYyArPSBjaGFuZ2U7CiAgICB3cC56ICs9IHNoaWZ0OwogICAgd3AubSArPSBzaGlmdDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVTaGlmdCh2KSB7CiAgICB2YXIgc2hpZnQgPSAwLCBjaGFuZ2UgPSAwLCBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sIGkgPSBjaGlsZHJlbi5sZW5ndGgsIHc7CiAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgdyA9IGNoaWxkcmVuW2ldOwogICAgICB3LnogKz0gc2hpZnQ7CiAgICAgIHcubSArPSBzaGlmdDsKICAgICAgc2hpZnQgKz0gdy5zICsgKGNoYW5nZSArPSB3LmMpOwogICAgfQogIH0KICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZUFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpIHsKICAgIHJldHVybiB2aW0uYS5wYXJlbnQgPT09IHYucGFyZW50ID8gdmltLmEgOiBhbmNlc3RvcjsKICB9CiAgZDMubGF5b3V0LmNsdXN0ZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSwgc2VwYXJhdGlvbiA9IGQzX2xheW91dF90cmVlU2VwYXJhdGlvbiwgc2l6ZSA9IFsgMSwgMSBdLCBub2RlU2l6ZSA9IGZhbHNlOwogICAgZnVuY3Rpb24gY2x1c3RlcihkLCBpKSB7CiAgICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLCByb290ID0gbm9kZXNbMF0sIHByZXZpb3VzTm9kZSwgeCA9IDA7CiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgIG5vZGUueCA9IGQzX2xheW91dF9jbHVzdGVyWChjaGlsZHJlbik7CiAgICAgICAgICBub2RlLnkgPSBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnggPSBwcmV2aW91c05vZGUgPyB4ICs9IHNlcGFyYXRpb24obm9kZSwgcHJldmlvdXNOb2RlKSA6IDA7CiAgICAgICAgICBub2RlLnkgPSAwOwogICAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB2YXIgbGVmdCA9IGQzX2xheW91dF9jbHVzdGVyTGVmdChyb290KSwgcmlnaHQgPSBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KHJvb3QpLCB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyOwogICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBub2RlU2l6ZSA/IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBub2RlLnggPSAobm9kZS54IC0gcm9vdC54KSAqIHNpemVbMF07CiAgICAgICAgbm9kZS55ID0gKHJvb3QueSAtIG5vZGUueSkgKiBzaXplWzFdOwogICAgICB9IDogZnVuY3Rpb24obm9kZSkgewogICAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBzaXplWzBdOwogICAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIHNpemVbMV07CiAgICAgIH0pOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CiAgICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247CiAgICAgIHNlcGFyYXRpb24gPSB4OwogICAgICByZXR1cm4gY2x1c3RlcjsKICAgIH07CiAgICBjbHVzdGVyLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVTaXplID8gbnVsbCA6IHNpemU7CiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB4KSA9PSBudWxsOwogICAgICByZXR1cm4gY2x1c3RlcjsKICAgIH07CiAgICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlU2l6ZSA/IHNpemUgOiBudWxsOwogICAgICBub2RlU2l6ZSA9IChzaXplID0geCkgIT0gbnVsbDsKICAgICAgcmV0dXJuIGNsdXN0ZXI7CiAgICB9OwogICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQoY2x1c3RlciwgaGllcmFyY2h5KTsKICB9OwogIGZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyWShjaGlsZHJlbikgewogICAgcmV0dXJuIDEgKyBkMy5tYXgoY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7CiAgICAgIHJldHVybiBjaGlsZC55OwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyWChjaGlsZHJlbikgewogICAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShmdW5jdGlvbih4LCBjaGlsZCkgewogICAgICByZXR1cm4geCArIGNoaWxkLng7CiAgICB9LCAwKSAvIGNoaWxkcmVuLmxlbmd0aDsKICB9CiAgZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KG5vZGUpIHsKICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID8gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KGNoaWxkcmVuWzBdKSA6IG5vZGU7CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyUmlnaHQobm9kZSkgewogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgbjsKICAgIHJldHVybiBjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KGNoaWxkcmVuW24gLSAxXSkgOiBub2RlOwogIH0KICBkMy5sYXlvdXQudHJlZW1hcCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKSwgcm91bmQgPSBNYXRoLnJvdW5kLCBzaXplID0gWyAxLCAxIF0sIHBhZGRpbmcgPSBudWxsLCBwYWQgPSBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwsIHN0aWNreSA9IGZhbHNlLCBzdGlja2llcywgbW9kZSA9ICJzcXVhcmlmeSIsIHJhdGlvID0gLjUgKiAoMSArIE1hdGguc3FydCg1KSk7CiAgICBmdW5jdGlvbiBzY2FsZShjaGlsZHJlbiwgaykgewogICAgICB2YXIgaSA9IC0xLCBuID0gY2hpbGRyZW4ubGVuZ3RoLCBjaGlsZCwgYXJlYTsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBhcmVhID0gKGNoaWxkID0gY2hpbGRyZW5baV0pLnZhbHVlICogKGsgPCAwID8gMCA6IGspOwogICAgICAgIGNoaWxkLmFyZWEgPSBpc05hTihhcmVhKSB8fCBhcmVhIDw9IDAgPyAwIDogYXJlYTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3F1YXJpZnkobm9kZSkgewogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksIHJvdyA9IFtdLCByZW1haW5pbmcgPSBjaGlsZHJlbi5zbGljZSgpLCBjaGlsZCwgYmVzdCA9IEluZmluaXR5LCBzY29yZSwgdSA9IG1vZGUgPT09ICJzbGljZSIgPyByZWN0LmR4IDogbW9kZSA9PT0gImRpY2UiID8gcmVjdC5keSA6IG1vZGUgPT09ICJzbGljZS1kaWNlIiA/IG5vZGUuZGVwdGggJiAxID8gcmVjdC5keSA6IHJlY3QuZHggOiBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KSwgbjsKICAgICAgICBzY2FsZShyZW1haW5pbmcsIHJlY3QuZHggKiByZWN0LmR5IC8gbm9kZS52YWx1ZSk7CiAgICAgICAgcm93LmFyZWEgPSAwOwogICAgICAgIHdoaWxlICgobiA9IHJlbWFpbmluZy5sZW5ndGgpID4gMCkgewogICAgICAgICAgcm93LnB1c2goY2hpbGQgPSByZW1haW5pbmdbbiAtIDFdKTsKICAgICAgICAgIHJvdy5hcmVhICs9IGNoaWxkLmFyZWE7CiAgICAgICAgICBpZiAobW9kZSAhPT0gInNxdWFyaWZ5IiB8fCAoc2NvcmUgPSB3b3JzdChyb3csIHUpKSA8PSBiZXN0KSB7CiAgICAgICAgICAgIHJlbWFpbmluZy5wb3AoKTsKICAgICAgICAgICAgYmVzdCA9IHNjb3JlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcm93LmFyZWEgLT0gcm93LnBvcCgpLmFyZWE7CiAgICAgICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmFsc2UpOwogICAgICAgICAgICB1ID0gTWF0aC5taW4ocmVjdC5keCwgcmVjdC5keSk7CiAgICAgICAgICAgIHJvdy5sZW5ndGggPSByb3cuYXJlYSA9IDA7CiAgICAgICAgICAgIGJlc3QgPSBJbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHJvdy5sZW5ndGgpIHsKICAgICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgdHJ1ZSk7CiAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwOwogICAgICAgIH0KICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKHNxdWFyaWZ5KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3RpY2tpZnkobm9kZSkgewogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksIHJlbWFpbmluZyA9IGNoaWxkcmVuLnNsaWNlKCksIGNoaWxkLCByb3cgPSBbXTsKICAgICAgICBzY2FsZShyZW1haW5pbmcsIHJlY3QuZHggKiByZWN0LmR5IC8gbm9kZS52YWx1ZSk7CiAgICAgICAgcm93LmFyZWEgPSAwOwogICAgICAgIHdoaWxlIChjaGlsZCA9IHJlbWFpbmluZy5wb3AoKSkgewogICAgICAgICAgcm93LnB1c2goY2hpbGQpOwogICAgICAgICAgcm93LmFyZWEgKz0gY2hpbGQuYXJlYTsKICAgICAgICAgIGlmIChjaGlsZC56ICE9IG51bGwpIHsKICAgICAgICAgICAgcG9zaXRpb24ocm93LCBjaGlsZC56ID8gcmVjdC5keCA6IHJlY3QuZHksIHJlY3QsICFyZW1haW5pbmcubGVuZ3RoKTsKICAgICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChzdGlja2lmeSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHdvcnN0KHJvdywgdSkgewogICAgICB2YXIgcyA9IHJvdy5hcmVhLCByLCBybWF4ID0gMCwgcm1pbiA9IEluZmluaXR5LCBpID0gLTEsIG4gPSByb3cubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmICghKHIgPSByb3dbaV0uYXJlYSkpIGNvbnRpbnVlOwogICAgICAgIGlmIChyIDwgcm1pbikgcm1pbiA9IHI7CiAgICAgICAgaWYgKHIgPiBybWF4KSBybWF4ID0gcjsKICAgICAgfQogICAgICBzICo9IHM7CiAgICAgIHUgKj0gdTsKICAgICAgcmV0dXJuIHMgPyBNYXRoLm1heCh1ICogcm1heCAqIHJhdGlvIC8gcywgcyAvICh1ICogcm1pbiAqIHJhdGlvKSkgOiBJbmZpbml0eTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmx1c2gpIHsKICAgICAgdmFyIGkgPSAtMSwgbiA9IHJvdy5sZW5ndGgsIHggPSByZWN0LngsIHkgPSByZWN0LnksIHYgPSB1ID8gcm91bmQocm93LmFyZWEgLyB1KSA6IDAsIG87CiAgICAgIGlmICh1ID09IHJlY3QuZHgpIHsKICAgICAgICBpZiAoZmx1c2ggfHwgdiA+IHJlY3QuZHkpIHYgPSByZWN0LmR5OwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBvID0gcm93W2ldOwogICAgICAgICAgby54ID0geDsKICAgICAgICAgIG8ueSA9IHk7CiAgICAgICAgICBvLmR5ID0gdjsKICAgICAgICAgIHggKz0gby5keCA9IE1hdGgubWluKHJlY3QueCArIHJlY3QuZHggLSB4LCB2ID8gcm91bmQoby5hcmVhIC8gdikgOiAwKTsKICAgICAgICB9CiAgICAgICAgby56ID0gdHJ1ZTsKICAgICAgICBvLmR4ICs9IHJlY3QueCArIHJlY3QuZHggLSB4OwogICAgICAgIHJlY3QueSArPSB2OwogICAgICAgIHJlY3QuZHkgLT0gdjsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoZmx1c2ggfHwgdiA+IHJlY3QuZHgpIHYgPSByZWN0LmR4OwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBvID0gcm93W2ldOwogICAgICAgICAgby54ID0geDsKICAgICAgICAgIG8ueSA9IHk7CiAgICAgICAgICBvLmR4ID0gdjsKICAgICAgICAgIHkgKz0gby5keSA9IE1hdGgubWluKHJlY3QueSArIHJlY3QuZHkgLSB5LCB2ID8gcm91bmQoby5hcmVhIC8gdikgOiAwKTsKICAgICAgICB9CiAgICAgICAgby56ID0gZmFsc2U7CiAgICAgICAgby5keSArPSByZWN0LnkgKyByZWN0LmR5IC0geTsKICAgICAgICByZWN0LnggKz0gdjsKICAgICAgICByZWN0LmR4IC09IHY7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHRyZWVtYXAoZCkgewogICAgICB2YXIgbm9kZXMgPSBzdGlja2llcyB8fCBoaWVyYXJjaHkoZCksIHJvb3QgPSBub2Rlc1swXTsKICAgICAgcm9vdC54ID0gMDsKICAgICAgcm9vdC55ID0gMDsKICAgICAgcm9vdC5keCA9IHNpemVbMF07CiAgICAgIHJvb3QuZHkgPSBzaXplWzFdOwogICAgICBpZiAoc3RpY2tpZXMpIGhpZXJhcmNoeS5yZXZhbHVlKHJvb3QpOwogICAgICBzY2FsZShbIHJvb3QgXSwgcm9vdC5keCAqIHJvb3QuZHkgLyByb290LnZhbHVlKTsKICAgICAgKHN0aWNraWVzID8gc3RpY2tpZnkgOiBzcXVhcmlmeSkocm9vdCk7CiAgICAgIGlmIChzdGlja3kpIHN0aWNraWVzID0gbm9kZXM7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KICAgIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsKICAgICAgc2l6ZSA9IHg7CiAgICAgIHJldHVybiB0cmVlbWFwOwogICAgfTsKICAgIHRyZWVtYXAucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZzsKICAgICAgZnVuY3Rpb24gcGFkRnVuY3Rpb24obm9kZSkgewogICAgICAgIHZhciBwID0geC5jYWxsKHRyZWVtYXAsIG5vZGUsIG5vZGUuZGVwdGgpOwogICAgICAgIHJldHVybiBwID09IG51bGwgPyBkM4zc71bNMQIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt50AAQAZ89sCoBzbAqAdglScf9duSeDc5VH7MgBANkhK/AAABAQgKAKNeyQBNpcSM3O9W5jECAForAABaKwAAaPcoH9LFCAAnrR4TCABFACtMN2NAAEAGSGLAqAdgwKgHNh/1lSc5VH7M25J4N4AYAO27JQAAAQEICgBNpcQAo17JX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKSA6IGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHR5cGVvZiBwID09PSAibnVtYmVyIiA/IFsgcCwgcCwgcCwgcCBdIDogcCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGFkQ29uc3RhbnQobm9kZSkgewogICAgICAgIHJldHVybiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB4KTsKICAgICAgfQogICAgICB2YXIgdHlwZTsKICAgICAgcGFkID0gKHBhZGRpbmcgPSB4KSA9PSBudWxsID8gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsIDogKHR5cGUgPSB0eXBlb2YgeCkgPT09ICJmdW5jdGlvbiIgPyBwYWRGdW5jdGlvbiA6IHR5cGUgPT09ICJudW1iZXIiID8gKHggPSBbIHgsIHgsIHgsIHggXSwgCiAgICAgIHBhZENvbnN0YW50KSA6IHBhZENvbnN0YW50OwogICAgICByZXR1cm4gdHJlZW1hcDsKICAgIH07CiAgICB0cmVlbWFwLnJvdW5kID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb3VuZCAhPSBOdW1iZXI7CiAgICAgIHJvdW5kID0geCA/IE1hdGgucm91bmQgOiBOdW1iZXI7CiAgICAgIHJldHVybiB0cmVlbWFwOwogICAgfTsKICAgIHRyZWVtYXAuc3RpY2t5ID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGlja3k7CiAgICAgIHN0aWNreSA9IHg7CiAgICAgIHN0aWNraWVzID0gbnVsbDsKICAgICAgcmV0dXJuIHRyZWVtYXA7CiAgICB9OwogICAgdHJlZW1hcC5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmF0aW87CiAgICAgIHJhdGlvID0geDsKICAgICAgcmV0dXJuIHRyZWVtYXA7CiAgICB9OwogICAgdHJlZW1hcC5tb2RlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBtb2RlOwogICAgICBtb2RlID0geCArICIiOwogICAgICByZXR1cm4gdHJlZW1hcDsKICAgIH07CiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZCh0cmVlbWFwLCBoaWVyYXJjaHkpOwogIH07CiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsKG5vZGUpIHsKICAgIHJldHVybiB7CiAgICAgIHg6IG5vZGUueCwKICAgICAgeTogbm9kZS55LAogICAgICBkeDogbm9kZS5keCwKICAgICAgZHk6IG5vZGUuZHkKICAgIH07CiAgfQogIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHBhZGRpbmcpIHsKICAgIHZhciB4ID0gbm9kZS54ICsgcGFkZGluZ1szXSwgeSA9IG5vZGUueSArIHBhZGRpbmdbMF0sIGR4ID0gbm9kZS5keCAtIHBhZGRpbmdbMV0gLSBwYWRkaW5nWzNdLCBkeSA9IG5vZGUuZHkgLSBwYWRkaW5nWzBdIC0gcGFkZGluZ1syXTsKICAgIGlmIChkeCA8IDApIHsKICAgICAgeCArPSBkeCAvIDI7CiAgICAgIGR4ID0gMDsKICAgIH0KICAgIGlmIChkeSA8IDApIHsKICAgICAgeSArPSBkeSAvIDI7CiAgICAgIGR5ID0gMDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHg6IHgsCiAgICAgIHk6IHksCiAgICAgIGR4OiBkeCwKICAgICAgZHk6IGR5CiAgICB9OwogIH0KICBkMy5yYW5kb20gPSB7CiAgICBub3JtYWw6IGZ1bmN0aW9uKMK1LCDPgykgewogICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICAgIGlmIChuIDwgMikgz4MgPSAxOwogICAgICBpZiAobiA8IDEpIMK1ID0gMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB4LCB5LCByOwogICAgICAgIGRvIHsKICAgICAgICAgIHggPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7CiAgICAgICAgICB5ID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxOwogICAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7CiAgICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpOwogICAgICAgIHJldHVybiDCtSArIM+DICogeCAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7CiAgICAgIH07CiAgICB9LAogICAgbG9nTm9ybWFsOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmRvbSA9IGQzLnJhbmRvbS5ub3JtYWwuYXBwbHkoZDMsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gTWF0aC5leHAocmFuZG9tKCkpOwogICAgICB9OwogICAgfSwKICAgIGJhdGVzOiBmdW5jdGlvbihtKSB7CiAgICAgIHZhciByYW5kb20gPSBkMy5yYW5kb20uaXJ3aW5IYWxsKG0pOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHJhbmRvbSgpIC8gbTsKICAgICAgfTsKICAgIH0sCiAgICBpcndpbkhhbGw6IGZ1bmN0aW9uKG0pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIHMgPSAwLCBqID0gMDsgaiA8IG07IGorKykgcyArPSBNYXRoLnJhbmRvbSgpOwogICAgICAgIHJldHVybiBzOwogICAgICB9OwogICAgfQogIH07CiAgZDMuc2NhbGUgPSB7fTsKICBmdW5jdGlvbiBkM19zY2FsZUV4dGVudChkb21haW4pIHsKICAgIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gc3RhcnQgPCBzdG9wID8gWyBzdGFydCwgc3RvcCBdIDogWyBzdG9wLCBzdGFydCBdOwogIH0KICBmdW5jdGlvbiBkM19zY2FsZVJhbmdlKHNjYWxlKSB7CiAgICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX2JpbGluZWFyKGRvbWFpbiwgcmFuZ2UsIHVuaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKSB7CiAgICB2YXIgdSA9IHVuaW50ZXJwb2xhdGUoZG9tYWluWzBdLCBkb21haW5bMV0pLCBpID0gaW50ZXJwb2xhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTsKICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBpKHUoeCkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbmljZShkb21haW4sIG5pY2UpIHsKICAgIHZhciBpMCA9IDAsIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsIHgwID0gZG9tYWluW2kwXSwgeDEgPSBkb21haW5baTFdLCBkeDsKICAgIGlmICh4MSA8IHgwKSB7CiAgICAgIGR4ID0gaTAsIGkwID0gaTEsIGkxID0gZHg7CiAgICAgIGR4ID0geDAsIHgwID0geDEsIHgxID0gZHg7CiAgICB9CiAgICBkb21haW5baTBdID0gbmljZS5mbG9vcih4MCk7CiAgICBkb21haW5baTFdID0gbmljZS5jZWlsKHgxKTsKICAgIHJldHVybiBkb21haW47CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX25pY2VTdGVwKHN0ZXApIHsKICAgIHJldHVybiBzdGVwID8gewogICAgICBmbG9vcjogZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBNYXRoLmZsb29yKHggLyBzdGVwKSAqIHN0ZXA7CiAgICAgIH0sCiAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHggLyBzdGVwKSAqIHN0ZXA7CiAgICAgIH0KICAgIH0gOiBkM19zY2FsZV9uaWNlSWRlbnRpdHk7CiAgfQogIHZhciBkM19zY2FsZV9uaWNlSWRlbnRpdHkgPSB7CiAgICBmbG9vcjogZDNfaWRlbnRpdHksCiAgICBjZWlsOiBkM19pZGVudGl0eQogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfcG9seWxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSkgewogICAgdmFyIHUgPSBbXSwgaSA9IFtdLCBqID0gMCwgayA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxOwogICAgaWYgKGRvbWFpbltrXSA8IGRvbWFpblswXSkgewogICAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7CiAgICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7CiAgICB9CiAgICB3aGlsZSAoKytqIDw9IGspIHsKICAgICAgdS5wdXNoKHVuaW50ZXJwb2xhdGUoZG9tYWluW2ogLSAxXSwgZG9tYWluW2pdKSk7CiAgICAgIGkucHVzaChpbnRlcnBvbGF0ZShyYW5nZVtqIC0gMV0sIHJhbmdlW2pdKSk7CiAgICB9CiAgICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgICB2YXIgaiA9IGQzLmJpc2VjdChkb21haW4sIHgsIDEsIGspIC0gMTsKICAgICAgcmV0dXJuIGlbal0odVtqXSh4KSk7CiAgICB9OwogIH0KICBkMy5zY2FsZS5saW5lYXIgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9saW5lYXIoWyAwLCAxIF0sIFsgMCwgMSBdLCBkM19pbnRlcnBvbGF0ZSwgZmFsc2UpOwogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlLCBjbGFtcCkgewogICAgdmFyIG91dHB1dCwgaW5wdXQ7CiAgICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgICB2YXIgbGluZWFyID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSA+IDIgPyBkM19zY2FsZV9wb2x5bGluZWFyIDogZDNfc2NhbGVfYmlsaW5lYXIsIHVuaW50ZXJwb2xhdGUgPSBjbGFtcCA/IGQzX3VuaW50ZXJwb2xhdGVDbGFtcCA6IGQzX3VuaW50ZXJwb2xhdGVOdW1iZXI7CiAgICAgIG91dHB1dCA9IGxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSk7CiAgICAgIGlucHV0ID0gbGluZWFyKHJhbmdlLCBkb21haW4sIHVuaW50ZXJwb2xhdGUsIGQzX2ludGVycG9sYXRlKTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQogICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICByZXR1cm4gb3V0cHV0KHgpOwogICAgfQogICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgewogICAgICByZXR1cm4gaW5wdXQoeSk7CiAgICB9OwogICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47CiAgICAgIGRvbWFpbiA9IHgubWFwKE51bWJlcik7CiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9OwogICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOwogICAgICByYW5nZSA9IHg7CiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9OwogICAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIHNjYWxlLnJhbmdlKHgpLmludGVycG9sYXRlKGQzX2ludGVycG9sYXRlUm91bmQpOwogICAgfTsKICAgIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGFtcDsKICAgICAgY2xhbXAgPSB4OwogICAgICByZXR1cm4gcmVzY2FsZSgpOwogICAgfTsKICAgIHNjYWxlLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZTsKICAgICAgaW50ZXJwb2xhdGUgPSB4OwogICAgICByZXR1cm4gcmVzY2FsZSgpOwogICAgfTsKICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24obSkgewogICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsKICAgIH07CiAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSwgZm9ybWF0KSB7CiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSwgZm9ybWF0KTsKICAgIH07CiAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24obSkgewogICAgICBkM19zY2FsZV9saW5lYXJOaWNlKGRvbWFpbiwgbSk7CiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9OwogICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlLCBjbGFtcCk7CiAgICB9OwogICAgcmV0dXJuIHJlc2NhbGUoKTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpIHsKICAgIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgInJhbmdlIiwgInJhbmdlUm91bmQiLCAiaW50ZXJwb2xhdGUiLCAiY2xhbXAiKTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyTmljZShkb21haW4sIG0pIHsKICAgIHJldHVybiBkM19zY2FsZV9uaWNlKGRvbWFpbiwgZDNfc2NhbGVfbmljZVN0ZXAoZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSlbMl0pKTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSkgewogICAgaWYgKG0gPT0gbnVsbCkgbSA9IDEwOwogICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGRvbWFpbiksIHNwYW4gPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sIHN0ZXAgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzcGFuIC8gbSkgLyBNYXRoLkxOMTApKSwgZXJyID0gbSAvIHNwYW4gKiBzdGVwOwogICAgaWYgKGVyciA8PSAuMTUpIHN0ZXAgKj0gMTA7IGVsc2UgaWYgKGVyciA8PSAuMzUpIHN0ZXAgKj0gNTsgZWxzZSBpZiAoZXJyIDw9IC43NSkgc3RlcCAqPSAyOwogICAgZXh0ZW50WzBdID0gTWF0aC5jZWlsKGV4dGVudFswXSAvIHN0ZXApICogc3RlcDsKICAgIGV4dGVudFsxXSA9IE1hdGguZmxvb3IoZXh0ZW50WzFdIC8gc3RlcCkgKiBzdGVwICsgc3RlcCAqIC41OwogICAgZXh0ZW50WzJdID0gc3RlcDsKICAgIHJldHVybiBleHRlbnQ7CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclRpY2tzKGRvbWFpbiwgbSkgewogICAgcmV0dXJuIGQzLnJhbmdlLmFwcGx5KGQzLCBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKSk7CiAgfQogIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpIHsKICAgIHZhciByYW5nZSA9IGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pOwogICAgaWYgKGZvcm1hdCkgewogICAgICB2YXIgbWF0Y2ggPSBkM19mb3JtYXRfcmUuZXhlYyhmb3JtYXQpOwogICAgICBtYXRjaC5zaGlmdCgpOwogICAgICBpZiAobWF0Y2hbOF0gPT09ICJzIikgewogICAgICAgIHZhciBwcmVmaXggPSBkMy5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoYWJzKHJhbmdlWzBdKSwgYWJzKHJhbmdlWzFdKSkpOwogICAgICAgIGlmICghbWF0Y2hbN10pIG1hdGNoWzddID0gIi4iICsgZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKHByZWZpeC5zY2FsZShyYW5nZVsyXSkpOwogICAgICAgIG1hdGNoWzhdID0gImYiOwogICAgICAgIGZvcm1hdCA9IGQzLmZvcm1hdChtYXRjaC5qb2luKCIiKSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgIHJldHVybiBmb3JtYXQocHJlZml4LnNjYWxlKGQpKSArIHByZWZpeC5zeW1ib2w7CiAgICAgICAgfTsKICAgICAgfQogICAgICBpZiAoIW1hdGNoWzddKSBtYXRjaFs3XSA9ICIuIiArIGQzX3NjYWxlX2xpbmVhckZvcm1hdFByZWNpc2lvbihtYXRjaFs4XSwgcmFuZ2UpOwogICAgICBmb3JtYXQgPSBtYXRjaC5qb2luKCIiKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvcm1hdCA9ICIsLiIgKyBkM19zY2FsZV9saW5lYXJQcmVjaXNpb24ocmFuZ2VbMl0pICsgImYiOwogICAgfQogICAgcmV0dXJuIGQzLmZvcm1hdChmb3JtYXQpOwogIH0KICB2YXIgZDNfc2NhbGVfbGluZWFyRm9ybWF0U2lnbmlmaWNhbnQgPSB7CiAgICBzOiAxLAogICAgZzogMSwKICAgIHA6IDEsCiAgICByOiAxLAogICAgZTogMQogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKHZhbHVlKSB7CiAgICByZXR1cm4gLU1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjEwICsgLjAxKTsKICB9CiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyRm9ybWF0UHJlY2lzaW9uKHR5cGUsIHJhbmdlKSB7CiAgICB2YXIgcCA9IGQzX3NjYWxlX2xpbmVhclByZWNpc2lvbihyYW5nZVsyXSk7CiAgICByZXR1cm4gdHlwZSBpbiBkM19zY2FsZV9saW5lYXJGb3JtYXRTaWduaWZpY2FudCA/IE1hdGguYWJzKHAgLSBkM19zY2FsZV9saW5lYXJQcmVjaXNpb24oTWF0aC5tYXgoYWJzKHJhbmdlWzBdKSwgYWJzKHJhbmdlWzFdKSkpKSArICsodHlwZSAhPT0gImUiKSA6IHAgLSAodHlwZSA9PT0gIiUiKSAqIDI7CiAgfQogIGQzLnNjYWxlLmxvZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NjYWxlX2xvZyhkMy5zY2FsZS5saW5lYXIoKS5kb21haW4oWyAwLCAxIF0pLCAxMCwgdHJ1ZSwgWyAxLCAxMCBdKTsKICB9OwogIGZ1bmN0aW9uIGQzX3NjYWxlX2xvZyhsaW5lYXIsIGJhc2UsIHBvc2l0aXZlLCBkb21haW4pIHsKICAgIGZ1bmN0aW9uIGxvZyh4KSB7CiAgICAgIHJldHVybiAocG9zaXRpdmUgPyBNYXRoLmxvZyh4IDwgMCA/IDAgOiB4KSA6IC1NYXRoLmxvZyh4ID4gMCA/IDAgOiAteCkpIC8gTWF0aC5sb2coYmFzZSk7CiAgICB9CiAgICBmdW5jdGlvbiBwb3coeCkgewogICAgICByZXR1cm4gcG9zaXRpdmUgPyBNYXRoLnBvdyhiYXNlLCB4KSA6IC1NYXRoLnBvdyhiYXNlLCAteCk7CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgIHJldHVybiBsaW5lYXIobG9nKHgpKTsKICAgIH0KICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIHBvdyhsaW5lYXIuaW52ZXJ0KHgpKTsKICAgIH07CiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgICAgcG9zaXRpdmUgPSB4WzBdID49IDA7CiAgICAgIGxpbmVhci5kb21haW4oKGRvbWFpbiA9IHgubWFwKE51bWJlcikpLm1hcChsb2cpKTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLmJhc2UgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGJhc2U7CiAgICAgIGJhc2UgPSArXzsKICAgICAgbGluZWFyLmRvbWFpbihkb21haW4ubWFwKGxvZykpOwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbmljZWQgPSBkM19zY2FsZV9uaWNlKGRvbWFpbi5tYXAobG9nKSwgcG9zaXRpdmUgPyBNYXRoIDogZDNfc2NhbGVfbG9nTmljZU5lZ2F0aXZlKTsKICAgICAgbGluZWFyLmRvbWFpbihuaWNlZCk7CiAgICAgIGRvbWFpbiA9IG5pY2VkLm1hcChwb3cpOwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGRvbWFpbiksIHRpY2tzID0gW10sIHUgPSBleHRlbnRbMF0sIHYgPSBleHRlbnRbMV0sIGkgPSBNYXRoLmZsb29yKGxvZyh1KSksIGogPSBNYXRoLmNlaWwobG9nKHYpKSwgbiA9IGJhc2UgJSAxID8gMiA6IGJhc2U7CiAgICAgIGlmIChpc0Zpbml0ZShqIC0gaSkpIHsKICAgICAgICBpZiAocG9zaXRpdmUpIHsKICAgICAgICAgIGZvciAoO2kgPCBqOyBpKyspIGZvciAodmFyIGsgPSAxOyBrIDwgbjsgaysrKSB0aWNrcy5wdXNoKHBvdyhpKSAqIGspOwogICAgICAgICAgdGlja3MucHVzaChwb3coaSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aWNrcy5wdXNoKHBvdyhpKSk7CiAgICAgICAgICBmb3IgKDtpKysgPCBqOyApIGZvciAodmFyIGsgPSBuIC0gMTsgayA+IDA7IGstLSkgdGlja3MucHVzaChwb3coaSkgKiBrKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgdGlja3NbaV0gPCB1OyBpKyspIHt9CiAgICAgICAgZm9yIChqID0gdGlja3MubGVuZ3RoOyB0aWNrc1tqIC0gMV0gPiB2OyBqLS0pIHt9CiAgICAgICAgdGlja3MgPSB0aWNrcy5zbGljZShpLCBqKTsKICAgICAgfQogICAgICByZXR1cm4gdGlja3M7CiAgICB9OwogICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKG4sIGZvcm1hdCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkM19zY2FsZV9sb2dGb3JtYXQ7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgZm9ybWF0ID0gZDNfc2NhbGVfbG9nRm9ybWF0OyBlbHNlIGlmICh0eXBlb2YgZm9ybWF0ICE9PSAiZnVuY3Rpb24iKSBmb3JtYXQgPSBkMy5mb3JtYXQoZm9ybWF0KTsKICAgICAgdmFyIGsgPSBNYXRoLm1heCguMSwgbiAvIHNjYWxlLnRpY2tzKCkubGVuZ3RoKSwgZiA9IHBvc2l0aXZlID8gKGUgPSAxZS0xMiwgTWF0aC5jZWlsKSA6IChlID0gLTFlLTEyLCAKICAgICAgTWF0aC5mbG9vciksIGU7CiAgICAgIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuIGQgLyBwb3coZihsb2coZCkgKyBlKSkgPD0gayA/IGZvcm1hdChkKSA6ICIiOwogICAgICB9OwogICAgfTsKICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX2xvZyhsaW5lYXIuY29weSgpLCBiYXNlLCBwb3NpdGl2ZSwgZG9tYWluKTsKICAgIH07CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpOwogIH0KICB2YXIgZDNfc2NhbGVfbG9nRm9ybWF0ID0gZDMuZm9ybWF0KCIuMGUiKSwgZDNfc2NhbGVfbG9nTmljZU5lZ2F0aXZlID0gewogICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIC1NYXRoLmNlaWwoLXgpOwogICAgfSwKICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIC1NYXRoLmZsb29yKC14KTsKICAgIH0KICB9OwogIGQzLnNjYWxlLnBvdyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NjYWxlX3BvdyhkMy5zY2FsZS5saW5lYXIoKSwgMSwgWyAwLCAxIF0pOwogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfcG93KGxpbmVhciwgZXhwb25lbnQsIGRvbWFpbikgewogICAgdmFyIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQpLCBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7CiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgIHJldHVybiBsaW5lYXIocG93cCh4KSk7CiAgICB9CiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBwb3diKGxpbmVhci5pbnZlcnQoeCkpOwogICAgfTsKICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOwogICAgICBsaW5lYXIuZG9tYWluKChkb21haW4gPSB4Lm0NCozc71YiMgIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt6EAAQAZ89cCoBzbAqAdglScf9duSeDc5VKnkgBAOPub6AAABAQgKAKNeyQBNpcSM3O9WlTMCABpVAAAaVQAAaPcoH9LFCAAnrR4TCABFAFUMN2tAAEAGHprAqAdgwKgHNh/1lSc5VKnk25J4N4AQAO3k5QAAAQEICgBNpcQAo17JN0ZFOA0KYXAoTnVtYmVyKSkubWFwKHBvd3ApKTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24obSkgewogICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsKICAgIH07CiAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSwgZm9ybWF0KSB7CiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSwgZm9ybWF0KTsKICAgIH07CiAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24obSkgewogICAgICByZXR1cm4gc2NhbGUuZG9tYWluKGQzX3NjYWxlX2xpbmVhck5pY2UoZG9tYWluLCBtKSk7CiAgICB9OwogICAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGV4cG9uZW50OwogICAgICBwb3dwID0gZDNfc2NhbGVfcG93UG93KGV4cG9uZW50ID0geCk7CiAgICAgIHBvd2IgPSBkM19zY2FsZV9wb3dQb3coMSAvIGV4cG9uZW50KTsKICAgICAgbGluZWFyLmRvbWFpbihkb21haW4ubWFwKHBvd3ApKTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX3BvdyhsaW5lYXIuY29weSgpLCBleHBvbmVudCwgZG9tYWluKTsKICAgIH07CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpOwogIH0KICBmdW5jdGlvbiBkM19zY2FsZV9wb3dQb3coZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIHggPCAwID8gLU1hdGgucG93KC14LCBlKSA6IE1hdGgucG93KHgsIGUpOwogICAgfTsKICB9CiAgZDMuc2NhbGUuc3FydCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KTsKICB9OwogIGQzLnNjYWxlLm9yZGluYWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKFtdLCB7CiAgICAgIHQ6ICJyYW5nZSIsCiAgICAgIGE6IFsgW10gXQogICAgfSk7CiAgfTsKICBmdW5jdGlvbiBkM19zY2FsZV9vcmRpbmFsKGRvbWFpbiwgcmFuZ2VyKSB7CiAgICB2YXIgaW5kZXgsIHJhbmdlLCByYW5nZUJhbmQ7CiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgIHJldHVybiByYW5nZVsoKGluZGV4LmdldCh4KSB8fCAocmFuZ2VyLnQgPT09ICJyYW5nZSIgPyBpbmRleC5zZXQoeCwgZG9tYWluLnB1c2goeCkpIDogTmFOKSkgLSAxKSAlIHJhbmdlLmxlbmd0aF07CiAgICB9CiAgICBmdW5jdGlvbiBzdGVwcyhzdGFydCwgc3RlcCkgewogICAgICByZXR1cm4gZDMucmFuZ2UoZG9tYWluLmxlbmd0aCkubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gc3RhcnQgKyBzdGVwICogaTsKICAgICAgfSk7CiAgICB9CiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgICAgZG9tYWluID0gW107CiAgICAgIGluZGV4ID0gbmV3IGQzX01hcCgpOwogICAgICB2YXIgaSA9IC0xLCBuID0geC5sZW5ndGgsIHhpOwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoeGkgPSB4W2ldKSkgaW5kZXguc2V0KHhpLCBkb21haW4ucHVzaCh4aSkpOwogICAgICByZXR1cm4gc2NhbGVbcmFuZ2VyLnRdLmFwcGx5KHNjYWxlLCByYW5nZXIuYSk7CiAgICB9OwogICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOwogICAgICByYW5nZSA9IHg7CiAgICAgIHJhbmdlQmFuZCA9IDA7CiAgICAgIHJhbmdlciA9IHsKICAgICAgICB0OiAicmFuZ2UiLAogICAgICAgIGE6IGFyZ3VtZW50cwogICAgICB9OwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUucmFuZ2VQb2ludHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7CiAgICAgIHZhciBzdGFydCA9IHhbMF0sIHN0b3AgPSB4WzFdLCBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoTWF0aC5tYXgoMSwgZG9tYWluLmxlbmd0aCAtIDEpICsgcGFkZGluZyk7CiAgICAgIHJhbmdlID0gc3RlcHMoZG9tYWluLmxlbmd0aCA8IDIgPyAoc3RhcnQgKyBzdG9wKSAvIDIgOiBzdGFydCArIHN0ZXAgKiBwYWRkaW5nIC8gMiwgc3RlcCk7CiAgICAgIHJhbmdlQmFuZCA9IDA7CiAgICAgIHJhbmdlciA9IHsKICAgICAgICB0OiAicmFuZ2VQb2ludHMiLAogICAgICAgIGE6IGFyZ3VtZW50cwogICAgICB9OwogICAgICByZXR1cm4gc2NhbGU7CiAgICB9OwogICAgc2NhbGUucmFuZ2VCYW5kcyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcsIG91dGVyUGFkZGluZykgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIG91dGVyUGFkZGluZyA9IHBhZGRpbmc7CiAgICAgIHZhciByZXZlcnNlID0geFsxXSA8IHhbMF0sIHN0YXJ0ID0geFtyZXZlcnNlIC0gMF0sIHN0b3AgPSB4WzEgLSByZXZlcnNlXSwgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gKGRvbWFpbi5sZW5ndGggLSBwYWRkaW5nICsgMiAqIG91dGVyUGFkZGluZyk7CiAgICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBzdGVwICogb3V0ZXJQYWRkaW5nLCBzdGVwKTsKICAgICAgaWYgKHJldmVyc2UpIHJhbmdlLnJldmVyc2UoKTsKICAgICAgcmFuZ2VCYW5kID0gc3RlcCAqICgxIC0gcGFkZGluZyk7CiAgICAgIHJhbmdlciA9IHsKICAgICAgICB0OiAicmFuZ2VCYW5kcyIsCiAgICAgICAgYTogYXJndW1lbnRzCiAgICAgIH07CiAgICAgIHJldHVybiBzY2FsZTsKICAgIH07CiAgICBzY2FsZS5yYW5nZVJvdW5kQmFuZHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nLCBvdXRlclBhZGRpbmcpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwYWRkaW5nID0gMDsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBvdXRlclBhZGRpbmcgPSBwYWRkaW5nOwogICAgICB2YXIgcmV2ZXJzZSA9IHhbMV0gPCB4WzBdLCBzdGFydCA9IHhbcmV2ZXJzZSAtIDBdLCBzdG9wID0geFsxIC0gcmV2ZXJzZV0sIHN0ZXAgPSBNYXRoLmZsb29yKChzdG9wIC0gc3RhcnQpIC8gKGRvbWFpbi5sZW5ndGggLSBwYWRkaW5nICsgMiAqIG91dGVyUGFkZGluZykpLCBlcnJvciA9IHN0b3AgLSBzdGFydCAtIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZykgKiBzdGVwOwogICAgICByYW5nZSA9IHN0ZXBzKHN0YXJ0ICsgTWF0aC5yb3VuZChlcnJvciAvIDIpLCBzdGVwKTsKICAgICAgaWYgKHJldmVyc2UpIHJhbmdlLnJldmVyc2UoKTsKICAgICAgcmFuZ2VCYW5kID0gTWF0aC5yb3VuZChzdGVwICogKDEgLSBwYWRkaW5nKSk7CiAgICAgIHJhbmdlciA9IHsKICAgICAgICB0OiAicmFuZ2VSb3VuZEJhbmRzIiwKICAgICAgICBhOiBhcmd1bWVudHMKICAgICAgfTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLnJhbmdlQmFuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmFuZ2VCYW5kOwogICAgfTsKICAgIHNjYWxlLnJhbmdlRXh0ZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19zY2FsZUV4dGVudChyYW5nZXIuYVswXSk7CiAgICB9OwogICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZDNfc2NhbGVfb3JkaW5hbChkb21haW4sIHJhbmdlcik7CiAgICB9OwogICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkb21haW4pOwogIH0KICBkMy5zY2FsZS5jYXRlZ29yeTEwID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MTApOwogIH07CiAgZDMuc2NhbGUuY2F0ZWdvcnkyMCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShkM19jYXRlZ29yeTIwKTsKICB9OwogIGQzLnNjYWxlLmNhdGVnb3J5MjBiID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjBiKTsKICB9OwogIGQzLnNjYWxlLmNhdGVnb3J5MjBjID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjBjKTsKICB9OwogIHZhciBkM19jYXRlZ29yeTEwID0gWyAyMDYyMjYwLCAxNjc0NDIwNiwgMjkyNDU4OCwgMTQwMzQ3MjgsIDk3MjU4ODUsIDkxOTcxMzEsIDE0OTA3MzMwLCA4MzU1NzExLCAxMjM2OTE4NiwgMTU1NjE3NSBdLm1hcChkM19yZ2JTdHJpbmcpOwogIHZhciBkM19jYXRlZ29yeTIwID0gWyAyMDYyMjYwLCAxMTQ1NDQ0MCwgMTY3NDQyMDYsIDE2NzU5NjcyLCAyOTI0NTg4LCAxMDAxODY5OCwgMTQwMzQ3MjgsIDE2NzUwNzQyLCA5NzI1ODg1LCAxMjk1NTg2MSwgOTE5NzEzMSwgMTI4ODUxNDAsIDE0OTA3MzMwLCAxNjIzNDE5NCwgODM1NTcxMSwgMTMwOTI4MDcsIDEyMzY5MTg2LCAxNDQwODU4OSwgMTU1NjE3NSwgMTA0MTA3MjUgXS5tYXAoZDNfcmdiU3RyaW5nKTsKICB2YXIgZDNfY2F0ZWdvcnkyMGIgPSBbIDM3NTA3NzcsIDUzOTU2MTksIDcwNDA3MTksIDEwMjY0Mjg2LCA2NTE5MDk3LCA5MjE2NTk0LCAxMTkxNTExNSwgMTM1NTY2MzYsIDkyMDI5OTMsIDEyNDI2ODA5LCAxNTE4NjUxNCwgMTUxOTA5MzIsIDg2NjYxNjksIDExMzU2NDkwLCAxNDA0OTY0MywgMTUxNzczNzIsIDgwNzc2ODMsIDEwODM0MzI0LCAxMzUyODUwOSwgMTQ1ODk2NTQgXS5tYXAoZDNfcmdiU3RyaW5nKTsKICB2YXIgZDNfY2F0ZWdvcnkyMGMgPSBbIDMyNDQ3MzMsIDcwNTcxMTAsIDEwNDA2NjI1LCAxMzAzMjQzMSwgMTUwOTUwNTMsIDE2NjE2NzY0LCAxNjYyNTI1OSwgMTY2MzQwMTgsIDMyNTMwNzYsIDc2NTI0NzAsIDEwNjA3MDAzLCAxMzEwMTUwNCwgNzY5NTI4MSwgMTAzOTQzMTIsIDEyMzY5MzcyLCAxNDM0Mjg5MSwgNjUxMzUwNywgOTg2ODk1MCwgMTI0MzQ4NzcsIDE0Mjc3MDgxIF0ubWFwKGQzX3JnYlN0cmluZyk7CiAgZDMuc2NhbGUucXVhbnRpbGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9xdWFudGlsZShbXSwgW10pOwogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSkgewogICAgdmFyIHRocmVzaG9sZHM7CiAgICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgICB2YXIgayA9IDAsIHEgPSByYW5nZS5sZW5ndGg7CiAgICAgIHRocmVzaG9sZHMgPSBbXTsKICAgICAgd2hpbGUgKCsrayA8IHEpIHRocmVzaG9sZHNbayAtIDFdID0gZDMucXVhbnRpbGUoZG9tYWluLCBrIC8gcSk7CiAgICAgIHJldHVybiBzY2FsZTsKICAgIH0KICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgICAgaWYgKCFpc05hTih4ID0gK3gpKSByZXR1cm4gcmFuZ2VbZDMuYmlzZWN0KHRocmVzaG9sZHMsIHgpXTsKICAgIH0KICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOwogICAgICBkb21haW4gPSB4LmZpbHRlcihkM19udW1iZXIpLnNvcnQoZDNfYXNjZW5kaW5nKTsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7CiAgICAgIHJhbmdlID0geDsKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH07CiAgICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRocmVzaG9sZHM7CiAgICB9OwogICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgICB5ID0gcmFuZ2UuaW5kZXhPZih5KTsKICAgICAgcmV0dXJuIHkgPCAwID8gWyBOYU4sIE5hTiBdIDogWyB5ID4gMCA/IHRocmVzaG9sZHNbeSAtIDFdIDogZG9tYWluWzBdLCB5IDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW3ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSBdOwogICAgfTsKICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aWxlKGRvbWFpbiwgcmFuZ2UpOwogICAgfTsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfQogIGQzLnNjYWxlLnF1YW50aXplID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpemUoMCwgMSwgWyAwLCAxIF0pOwogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSkgewogICAgdmFyIGt4LCBpOwogICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICByZXR1cm4gcmFuZ2VbTWF0aC5tYXgoMCwgTWF0aC5taW4oaSwgTWF0aC5mbG9vcihreCAqICh4IC0geDApKSkpXTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgIGt4ID0gcmFuZ2UubGVuZ3RoIC8gKHgxIC0geDApOwogICAgICBpID0gcmFuZ2UubGVuZ3RoIC0gMTsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQogICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIHgwLCB4MSBdOwogICAgICB4MCA9ICt4WzBdOwogICAgICB4MSA9ICt4W3gubGVuZ3RoIC0gMV07CiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9OwogICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOwogICAgICByYW5nZSA9IHg7CiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9OwogICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgICB5ID0gcmFuZ2UuaW5kZXhPZih5KTsKICAgICAgeSA9IHkgPCAwID8gTmFOIDogeSAvIGt4ICsgeDA7CiAgICAgIHJldHVybiBbIHksIHkgKyAxIC8ga3ggXTsKICAgIH07CiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSh4MCwgeDEsIHJhbmdlKTsKICAgIH07CiAgICByZXR1cm4gcmVzY2FsZSgpOwogIH0KICBkMy5zY2FsZS50aHJlc2hvbGQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV90aHJlc2hvbGQoWyAuNSBdLCBbIDAsIDEgXSk7CiAgfTsKICBmdW5jdGlvbiBkM19zY2FsZV90aHJlc2hvbGQoZG9tYWluLCByYW5nZSkgewogICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICBpZiAoeCA8PSB4KSByZXR1cm4gcmFuZ2VbZDMuYmlzZWN0KGRvbWFpbiwgeCldOwogICAgfQogICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47CiAgICAgIGRvbWFpbiA9IF87CiAgICAgIHJldHVybiBzY2FsZTsKICAgIH07CiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7CiAgICAgIHJhbmdlID0gXzsKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfTsKICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgICAgeSA9IHJhbmdlLmluZGV4T2YoeSk7CiAgICAgIHJldHVybiBbIGRvbWFpblt5IC0gMV0sIGRvbWFpblt5XSBdOwogICAgfTsKICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX3RocmVzaG9sZChkb21haW4sIHJhbmdlKTsKICAgIH07CiAgICByZXR1cm4gc2NhbGU7CiAgfQogIGQzLnNjYWxlLmlkZW50aXR5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfaWRlbnRpdHkoWyAwLCAxIF0pOwogIH07CiAgZnVuY3Rpb24gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKSB7CiAgICBmdW5jdGlvbiBpZGVudGl0eSh4KSB7CiAgICAgIHJldHVybiAreDsKICAgIH0KICAgIGlkZW50aXR5LmludmVydCA9IGlkZW50aXR5OwogICAgaWRlbnRpdHkuZG9tYWluID0gaWRlbnRpdHkucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgICAgZG9tYWluID0geC5tYXAoaWRlbnRpdHkpOwogICAgICByZXR1cm4gaWRlbnRpdHk7CiAgICB9OwogICAgaWRlbnRpdHkudGlja3MgPSBmdW5jdGlvbihtKSB7CiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pOwogICAgfTsKICAgIGlkZW50aXR5LnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtLCBmb3JtYXQpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpOwogICAgfTsKICAgIGlkZW50aXR5LmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3NjYWxlX2lkZW50aXR5KGRvbWFpbik7CiAgICB9OwogICAgcmV0dXJuIGlkZW50aXR5OwogIH0KICBkMy5zdmcgPSB7fTsKICBkMy5zdmcuYXJjID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaW5uZXJSYWRpdXMgPSBkM19zdmdfYXJjSW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzID0gZDNfc3ZnX2FyY091dGVyUmFkaXVzLCBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlOwogICAgZnVuY3Rpb24gYXJjKCkgewogICAgICB2YXIgcjAgPSBpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCByMSA9IG91dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwgZGEgPSAoYTEgPCBhMCAmJiAoZGEgPSBhMCwgCiAgICAgIGEwID0gYTEsIGExID0gZGEpLCBhMSAtIGEwKSwgZGYgPSBkYSA8IM+AID8gIjAiIDogIjEiLCBjMCA9IE1hdGguY29zKGEwKSwgczAgPSBNYXRoLnNpbihhMCksIGMxID0gTWF0aC5jb3MoYTEpLCBzMSA9IE1hdGguc2luKGExKTsKICAgICAgcmV0dXJuIGRhID49IGQzX3N2Z19hcmNNYXggPyByMCA/ICJNMCwiICsgcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyAtcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMSArICJNMCwiICsgcjAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyAtcjAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyByMCArICJaIiA6ICJNMCwiICsgcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyAtcjEgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMSArICJaIiA6IHIwID8gIk0iICsgcjEgKiBjMCArICIsIiArIHIxICogczAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwICIgKyBkZiArICIsMSAiICsgcjEgKiBjMSArICIsIiArIHIxICogczEgKyAiTCIgKyByMCAqIGMxICsgIiwiICsgcjAgKiBzMSArICJBIiArIHIwICsgIiwiICsgcjAgKyAiIDAgIiArIGRmICsgIiwwICIgKyByMCAqIGMwICsgIiwiICsgcjAgKiBzMCArICJaIiA6ICJNIiArIHIxICogYzAgKyAiLCIgKyByMSAqIHMwICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAiICsgZGYgKyAiLDEgIiArIHIxICogYzEgKyAiLCIgKyByMSAqIHMxICsgIkwwLDAiICsgIloiOwogICAgfQogICAgYXJjLmlubmVyUmFkaXVzID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbm5lclJhZGl1czsKICAgICAgaW5uZXJSYWRpdXMgPSBkM19mdW5jdG9yKHYpOwogICAgICByZXR1cm4gYXJjOwogICAgfTsKICAgIGFyYy5vdXRlclJhZGl1cyA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0ZXJSYWRpdXM7CiAgICAgIG91dGVyUmFkaXVzID0gZDNfZnVuY3Rvcih2KTsKICAgICAgcmV0dXJuIGFyYzsKICAgIH07CiAgICBhcmMuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsKICAgICAgc3RhcnRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7CiAgICAgIHJldHVybiBhcmM7CiAgICB9OwogICAgYXJjLmVuZEFuZ2xlID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlbmRBbmdsZTsKICAgICAgZW5kQW5nbGUgPSBkM19mdW5jdG9yKHYpOwogICAgICByZXR1cm4gYXJjOwogICAgfTsKICAgIGFyYy5jZW50cm9pZCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgciA9IChpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyLCBhID0gKHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArIGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiArIGQzX3N2Z19hcmNPZmZzZXQ7CiAgICAgIHJldHVybiBbIE1hdGguY29zKGEpICogciwgTWF0aC5zaW4oYSkgKiByIF07CiAgICB9OwogICAgcmV0dXJuIGFyYzsKICB9OwogIHZhciBkM19zdmdfYXJjT2Zmc2V0ID0gLWhhbGbPgCwgZDNfc3ZnX2FyY01heCA9IM+EIC0gzrU7CiAgZnVuY3Rpb24gZDNfc3ZnX2FyY0lubmVyUmFkaXVzKGQpIHsKICAgIHJldHVybiBkLmlubmVyUmFkaXVzOwogIH0KICBmdW5jdGlvbiBkM19zdmdfYXJjT3V0ZXJSYWRpdXMoZCkgewogICAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19hcmNTdGFydEFuZ2xlKGQpIHsKICAgIHJldHVybiBkLnN0YXJ0QW5nbGU7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19hcmNFbmRBbmdsZShkKSB7CiAgICByZXR1cm4gZC5lbmRBbmdsZTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmUocHJvamVjdGlvbikgewogICAgdmFyIHggPSBkM19nZW9tX3BvaW50WCwgeSA9IGQzX2dlb21fcG9pbnRZLCBkZWZpbmVkID0gZDNfdHJ1ZSwgaW50ZXJwb2xhdGUgPSBkM19zdmdfbGluZUxpbmVhciwgaW50ZXJwb2xhdGVLZXkgPSBpbnRlcnBvbGF0ZS5rZXksIHRlbnNpb24gPSAuNzsKICAgIGZ1bmN0aW9uIGxpbmUoZGF0YSkgewogICAgICB2YXIgc2VnbWVudHMgPSBbXSwgcG9pbnRzID0gW10sIGkgPSAtMSwgbiA9IGRhdGEubGVuZ3RoLCBkLCBmeCA9IGQzX2Z1bmN0b3IoeCksIGZ5ID0gZDNfZnVuY3Rvcih5KTsKICAgICAgZnVuY3Rpb24gc2VnbWVudCgpIHsKICAgICAgICBzZWdtZW50cy5wdXNoKCJNIiwgaW50ZXJwb2xhdGUocHJvamVjdGlvbihwb2ludHMpLCB0ZW5zaW9uKSk7CiAgICAgIH0KICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBpZiAoZGVmaW5lZC5jYWxsKHRoaXMsIGQgPSBkYXRhW2ldLCBpKSkgewogICAgICAgICAgcG9pbnRzLnB1c2goWyArZnguY2FsbCh0aGlzLCBkLCBpKSwgK2Z5LmNhbGwodGhpcywgZCwgaSkgXSk7CiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoKSB7CiAgICAgICAgICBzZWdtZW50KCk7CiAgICAgICAgICBwb2ludHMgPSBbXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBvaW50cy5sZW5ndGgpIHNlZ21lbnQoKTsKICAgICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA/IHNlZ21lbnRzLmpvaW4oIiIpIDogbnVsbDsKICAgIH0KICAgIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDsKICAgICAgeCA9IF87CiAgICAgIHJldHVybiBsaW5lOwogICAgfTsKICAgIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsKICAgICAgeSA9IF87CiAgICAgIHJldHVybiBsaW5lOwogICAgfTsKICAgIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZGVmaW5lZDsKICAgICAgZGVmaW5lZCA9IF87CiAgICAgIHJldHVybiBsaW5lOwogICAgfTsKICAgIGxpbmUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlS2V5OwogICAgICBpZiAodHlwZW9mIF8gPT09ICJmdW5jdGlvbiIpIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUgPSBfOyBlbHNlIGludGVycG9sYXRlS2V5ID0gKGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChfKSB8fCBkM19zdmdfbGluZUxpbmVhcikua2V5OwogICAgICByZXR1cm4gbGluZTsKICAgIH07CiAgICBsaW5lLnRlbnNpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRlbnNpb247CiAgICAgIHRlbnNpb24gPSBfOwogICAgICByZXR1cm4gbGluZTsKICAgIH07CiAgICByZXR1cm4gbGluZTsKICB9CiAgZDMuc3ZnLmxpbmUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zdmdfbGluZShkM19pZGVudGl0eSk7CiAgfTsKICB2YXIgZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzID0gZDMubWFwKHsKICAgIGxpbmVhcjogZDNfc3ZnX2xpbmVMaW5lYXIsCiAgICAibGluZWFyLWNsb3NlZCI6IGQzX3N2Z19saW5lTGluZWFyQ2xvc2VkLAogICAgc3RlcDogZDNfc3ZnX2xpbmVTdGVwLAogICAgInN0ZXAtYmVmb3JlIjogZDNfc3ZnX2xpbmVTdGVwQmVmb3JlLAogICAgInN0ZXAtYWZ0ZXIiOiBkM19zdmdfbGluZVN0ZXBBZnRlciwKICAgIGJhc2lzOiBkM19zdmdfbGluZUJhc2lzLAogICAgImJhc2lzLW9wZW4iOiBkM19zdmdfbGluZUJhc2lzT3BlbiwKICAgICJiYXNpcy1jbG9zZWQiOiBkM19zdmdfbGluZUJhc2lzQ2xvc2VkLAogICAgYnVuZGxlOiBkM19zdmdfbGluZUJ1bmRsZSwKICAgIGNhcmRpbmFsOiBkM19zdmdfbGluZUNhcmRpbmFsLAogICAgImNhcmRpbmFsLW9wZW4iOiBkM19zdmdfbGluZUNhcmRpbmFsT3BlbiwKICAgICJjYXJkaW5hbC1jbG9zZWQiOiBkM19zdmdfbGluZUNhcmRpbmFsQ2xvc2VkLAogICAgbW9ub3RvbmU6IGQzX3N2Z19saW5lTW9ub3RvbmUKICB9KTsKICBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICB2YWx1ZS5rZXkgPSBrZXk7CiAgICB2YWx1ZS5jbG9zZWQgPSAvLWNsb3NlZCQvLnRlc3Qoa2V5KTsKICB9KTsKICBmdW5jdGlvbiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIHsKICAgIHJldHVybiBwb2ludHMuam9pbigiTCIpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUxpbmVhckNsb3NlZChwb2ludHMpIHsKICAgIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpICsgIloiOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZVN0ZXAocG9pbnRzKSB7CiAgICB2YXIgaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoLCBwID0gcG9pbnRzWzBdLCBwYXRoID0gWyBwWzBdLCAiLCIsIHBbMV0gXTsKICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIkgiLCAocFswXSArIChwID0gcG9pbnRzW2ldKVswXSkgLyAyLCAiViIsIHBbMV0pOwogICAgaWYgKG4gPiAxKSBwYXRoLnB1c2goIkgiLCBwWzBdKTsKICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZVN0ZXBCZWZvcmUocG9pbnRzKSB7CiAgICB2YXIgaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoLCBwID0gcG9pbnRzWzBdLCBwYXRoID0gWyBwWzBdLCAiLCIsIHBbMV0gXTsKICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIlYiLCAocCA9IHBvaW50c1tpXSlbMV0sICJIIiwgcFswXSk7CiAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIocG9pbnRzKSB7CiAgICB2YXIgaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoLCBwID0gcG9pbnRzWzBdLCBwYXRoID0gWyBwWzBdLCAiLCIsIHBbMV0gXTsKICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIkgiLCAocCA9IHBvaW50c1tpXSlbMF0sICJWIiwgcFsxXSk7CiAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbE9wZW4ocG9pbnRzLCB0ZW5zaW9uKSB7CiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDQgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzFdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cy5zbGljZSgxLCBwb2ludHMubGVuZ3RoIC0gMSksIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbENsb3NlZChwb2ludHMsIHRlbnNpb24pIHsKICAgIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMyA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgOiBwb2ludHNbMF0gKyBkM19zdmdfbGluZUhlcm1pdGUoKHBvaW50cy5wdXNoKHBvaW50c1swXSksIAogICAgcG9pbnRzKSwgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKFsgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXSBdLmNvbmNhdChwb2ludHMsIFsgcG9pbnRzWzFdIF0pLCB0ZW5zaW9uKSk7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWwocG9pbnRzLCB0ZW5zaW9uKSB7CiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLCB0YW5nZW50cykgewogICAgaWYgKHRhbmdlbnRzLmxlbmd0aCA8IDEgfHwgcG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGggJiYgcG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGggKyAyKSB7CiAgICAgIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpOwogICAgfQogICAgdmFyIHF1YWQgPSBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCwgcGF0aCA9ICIiLCBwMCA9IHBvaW50c1swXSwgcCA9IHBvaW50c1sxXSwgdDAgPSB0YW5nZW50c1swXSwgdCA9IHQwLCBwaSA9IDE7CiAgICBpZiAocXVhZCkgewogICAgICBwYXRoICs9ICJRIiArIChwWzBdIC0gdDBbMF0gKiAyIC8gMykgKyAiLCIgKyAocFsxXSAtIHQwWzFdICogMiAvIDMpICsgIiwiICsgcFswXSArICIsIiArIHBbMV07CiAgICAgIHAwID0gcG9pbnRzWzFdOwogICAgICBwaSA9IDI7CiAgICB9CiAgICBpZiAodGFuZ2VudHMubGVuZ3RoID4gMSkgewogICAgICB0ID0gdGFuZ2VudHNbMV07CiAgICAgIHAgPSBwb2ludHNbcGldOwogICAgICBwaSsrOwogICAgICBwYXRoICs9ICJDIiArIChwMFswXSArIHQwWzBdKSArICIsIiArIChwMFsxXSArIHQwWzFdKSArICIsIiArIChwWzBdIC0gdFswXSkgKyAiLCIgKyAocFsxXSAtIHRbMV0pICsgIiwiICsgcFswXSArICIsIiArIHBbMV07CiAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgdGFuZ2VudHMubGVuZ3RoOyBpKyssIHBpKyspIHsKICAgICAgICBwID0gcG9pbnRzW3BpXTsKICAgICAgICB0ID0gdGFuZ2VudHNbaV07CiAgICAgICAgcGF0aCArPSAiUyIgKyAocFswXSAtIHRbMF0pICsgIiwiICsgKHBbMV0gLSB0WzFdKSArICIsIiArIHBbMF0gKyAiLCIgKyBwWzFdOwogICAgICB9CiAgICB9CiAgICBpZiAocXVhZCkgewogICAgICB2YXIgbHAgPSBwb2ludHNbcGldOwogICAgICBwYXRoICs9ICJRIiArIChwWzBdICsgdFswXSAqIDIgLyAzKSArICIsIiArIChwWzFdICsgdFsxXSAqIDIgLyAzKSArICIsIiArIGxwWzBdICsgIiwiICsgbHBbMV07CiAgICB9CiAgICByZXR1cm4gcGF0aDsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikgewogICAgdmFyIHRhbmdlbnRzID0gW10sIGEgPSAoMSAtIHRlbnNpb24pIC8gMiwgcDAsIHAxID0gcG9pbnRzWzBdLCBwMiA9IHBvaW50c1sxXSwgaSA9IDEsIG4gPSBwb2ludHMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgcDAgPSBwMTsKICAgICAgcDEgPSBwMjsKICAgICAgcDIgPSBwb2ludHNbaV07CiAgICAgIHRhbmdlbnRzLnB1c2goWyBhICogKHAyWzBdIC0gcDBbMF0pLCBhICogKHAyWzFdIC0gcDBbMV0pIF0pOwogICAgfQogICAgcmV0dXJuIHRhbmdlbnRzOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzKHBvaW50cykgewogICAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTsKICAgIHZhciBpID0gMSwgbiA9IHBvaW50cy5sZW5ndGgsIHBpID0gcG9pbnRzWzBdLCB4MCA9IHBpWzBdLCB5MCA9IHBpWzFdLCBweCA9IFsgeDAsIHgwLCB4MCwgKHBpID0gcG9pbnRzWzFdKVswXSBdLCBweSA9IFsgeTAsIHkwLCB5MCwgcGlbMV0gXSwgcGF0aCA9IFsgeDAsICIsIiwgeTAsICJMIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCksICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkgXTsKICAgIHBvaW50cy5wdXNoKHBvaW50c1tuIC0gMV0pOwogICAgd2hpbGUgKCsraSA8PSBuKSB7CiAgICAgIHBpID0gcG9pbnRzW2ldOwogICAgICBweC5zaGlmdCgpOwogICAgICBweC5wdXNoKHBpWzBdKTsKICAgICAgcHkuc2hpZnQoKTsKICAgICAgcHkucHVzaChwaVsxXSk7CiAgICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTsKICAgIH0KICAgIHBvaW50cy5wb3AoKTsKICAgIHBhdGgucHVzaCgiTCIsIHBpKTsKICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzT3Blbihwb2ludHMpIHsKICAgIGlmIChwb2ludHMubGVuZ3RoIDwgNCkgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7CiAgICB2YXIgcGF0aCA9IFtdLCBpID0gLTEsIG4gPSBwb2ludHMubGVuZ3RoLCBwaSwgcHggPSBbIDAgXSwgcHkgPSBbIDAgXTsKICAgIHdoaWxlICgrK2kgPCAzKSB7CiAgICAgIHBpID0gcG9pbnRzW2ldOwogICAgICBweC5wdXNoKHBpWzBdKTsKICAgICAgcHkucHVzaChwaVsxXSk7CiAgICB9CiAgICBwYXRoLnB1c2goZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCkgKyAiLCIgKyBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB5KSk7CiAgICAtLWk7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBwaSA9IHBvaW50c1tpXTsKICAgICAgcHguc2hpZnQoKTsKICAgICAgcHgucHVzaChwaVswXSk7CiAgICAgIHB5LnNoaWZ0KCk7CiAgICAgIHB5LnB1c2gocGlbMV0pOwogICAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7CiAgICB9CiAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc0Nsb3NlZChwb2ludHMpIHsKICAgIHZhciBwYXRoLCBpID0gLTEsIG4gPSBwb2ludHMubGVuZ3RoLCBtID0gbiArIDQsIHBpLCBweCA9IFtdLCBweSA9IFtdOwogICAgd2hpbGUgKCsraSA8IDQpIHsKICAgICAgcGkgPSBwb2ludHNbaSAlIG5dOwogICAgICBweC5wdXNoKHBpWzBdKTsKICAgICAgcHkucHVzaChwaVsxXSk7CiAgICB9CiAgICBwYXRoID0gWyBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB4KSwgIiwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB5KSBdOwogICAgLS1pOwogICAgd2hpbGUgKCsraSA8IG0pIHsKICAgICAgcGkgPSBwb2ludHNbaSAlIG5dOwogICAgICBweC5zaGlmdCgpOwogICAgICBweC5wdXNoKHBpWzBdKTsKICAgICAgcHkuc2hpZnQoKTsKICAgICAgcHkucHVzaChwaVsxXSk7CiAgICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTsKICAgIH0KICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUJ1bmRsZShwb2ludHMsIHRlbnNpb24pIHsKICAgIHZhciBuID0gcG9pbnRzLmxlbmd0aCAtIDE7CiAgICBpZiAobikgewogICAgICB2YXIgeDAgPSBwb2ludHNbMF1bMF0sIHkwID0gcG9pbnRzWzBdWzFdLCBkeCA9IHBvaW50c1tuXVswXSAtIHgwLCBkeSA9IHBvaW50c1tuXVsxXSAtIHkwLCBpID0gLTEsIHAsIHQ7CiAgICAgIHdoaWxlICgrK2kgPD0gbikgewogICAgICAgIHAgPSBwb2ludHNbaV07CiAgICAgICAgdCA9IGkgLyBuOwogICAgICAgIHBbMF0gPSB0ZW5zaW9uICogcFswXSArICgxIC0gdGVuc2lvbikgKiAoeDAgKyB0ICogZHgpOwogICAgICAgIHBbMV0gPSB0ZW5zaW9uICogcFsxXSArICgxIC0gdGVuc2lvbikgKiAoeTAgKyB0ICogZHkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZDNfc3ZnX2xpbmVCYXNpcyhwb2ludHMpOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZURvdDQoYSwgYikgewogICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXSArIGFbM10gKiBiWzNdOwogIH0KICB2YXIgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEgPSBbIDAsIDIgLyAzLCAxIC8gMywgMCBdLCBkM19zdmdfbGluZUJhc2lzQmV6aWVyMiA9IFsgMCwgMSAvIDMsIDIgLyAzLCAwIF0sIGQzX3N2Z19saW5lQmFzaXNCZXppZXIzID0gWyAwLCAxIC8gNiwgMiAvIDMsIDEgLyA2IF07CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCB4LCB5KSB7CiAgICBwYXRoLnB1c2goIkMiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEsIHgpLCAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMSwgeSksICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB4KSwgIiwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIsIHkpLCAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgeCksICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB5KSk7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKSB7CiAgICByZXR1cm4gKHAxWzFdIC0gcDBbMV0pIC8gKHAxWzBdIC0gcDBbMF0pOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzKHBvaW50cykgewogICAgdmFyIGkgPSAwLCBqID0gcG9pbnRzLmxlbmd0aCAtIDEsIG0gPSBbXSwgcDAgPSBwb2ludHNbMF0sIHAxID0gcG9pbnRzWzFdLCBkID0gbVswXSA9IGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKTsKICAgIHdoaWxlICgrK2kgPCBqKSB7CiAgICAgIG1baV0gPSAoZCArIChkID0gZDNfc3ZnX2xpbmVTbG9wZShwMCA9IHAxLCBwMSA9IHBvaW50c1tpICsgMV0pKSkgLyAyOwogICAgfQogICAgbVtpXSA9IGQ7CiAgICByZXR1cm4gbTsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzKHBvaW50cykgewogICAgdmFyIHRhbmdlbnRzID0gW10sIGQsIGEsIGIsIHMsIG0gPSBkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzKHBvaW50cyksIGkgPSAtMSwgaiA9IHBvaW50cy5sZW5ndGggLSAxOwogICAgd2hpbGUgKCsraSA8IGopIHsKICAgICAgZCA9IGQzX3N2Z19saW5lU2xvcGUocG9pbnRzW2ldLCBwb2ludHNbaSArIDFdKTsKICAgICAgaWYgKGFicyhkKSA8IM61KSB7CiAgICAgICAgbVtpXSA9IG1baSArIDFdID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhID0gbVtpXSAvIGQ7CiAgICAgICAgYiA9IG1baSArIDFdIC8gZDsKICAgICAgICBzID0gYSAqIGEgKyBiICogYjsKICAgICAgICBpZiAocyA+IDkpIHsKICAgICAgICAgIHMgPSBkICogMyAvIE1hdGguc3FydChzKTsKICAgICAgICAgIG1baV0gPSBzICogYTsKICAgICAgICAgIG1baSArIDFdID0gcyAqIGI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpID0gLTE7CiAgICB3aGlsZSAoKytpIDw9IGopIHsKICAgICAgcyA9IChwb2ludHNbTWF0aC5taW4oaiwgaSArIDEpXVswXSAtIHBvaW50c1tNYXRoLm1heCgwLCBpIC0gMSldWzBdKSAvICg2ICogKDEgKyBtW2ldICogbVtpXSkpOwogICAgICB0YW5nZW50cy5wdXNoKFsgcyB8fCAwLCBtW2ldICogcyB8fCAwIF0pOwogICAgfQogICAgcmV0dXJuIHRhbmdlbnRzOwogIH0KICBmdW5jdGlvbiBkM19zdmdfbGluZU1vbm90b25lKHBvaW50cykgewogICAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKSA6IHBvaW50c1swXSArIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpKTsKICB9CiAgZDMuc3ZnLmxpbmUucmFkaWFsID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgbGluZSA9IGQzX3N2Z19saW5lKGQzX3N2Z19saW5lUmFkaWFsKTsKICAgIGxpbmUucmFkaXVzID0gbGluZS54LCBkZWxldGUgbGluZS54OwogICAgbGluZS5hbmdsZSA9IGxpbmUueSwgZGVsZXRlIGxpbmUueTsKICAgIHJldHVybiBsaW5lOwogIH07CiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVSYWRpYWwocG9pbnRzKSB7CiAgICB2YXIgcG9pbnQsIGkgPSAtMSwgbiA9IHBvaW50cy5sZW5ndGgsIHIsIGE7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBwb2ludCA9IHBvaW50c1tpXTsKICAgICAgciA9IHBvaW50WzBdOwogICAgICBhID0gcG9pbnRbMV0gKyBkM19zdmdfYXJjT2Zmc2V0OwogICAgICBwb2ludFswXSA9IHIgKiBNYXRoLmNvcyhhKTsKICAgICAgcG9pbnRbMV0gPSByICogTWF0aC5zaW4oYSk7CiAgICB9CiAgICByZXR1cm4gcG9pbnRzOwogIH0KICBmdW5jdGlvbiBkM19zdmdfYXJlYShwcm9qZWN0aW9uKSB7CiAgICB2YXIgeDAgPSBkM19nZW9tX3BvaW50WCwgeDEgPSBkM19nZW9tX3BvaW50WCwgeTAgPSAwLCB5MSA9IGQzX2dlb21fcG9pbnRZLCBkZWZpbmVkID0gZDNfdHJ1ZSwgaW50ZXJwb2xhdGUgPSBkM19zdmdfbGluZUxpbmVhciwgaW50ZXJwb2xhdGVLZXkgPSBpbnRlcnBvbGF0ZS5rZXksIGludGVycG9sYXRlUmV2ZXJzZSA9IGludGVycG9sYXRlLCBMID0gIkwiLCB0ZW5zaW9uID0gLjc7CiAgICBmdW5jdGlvbiBhcmVhKGRhdGEpIHsKICAgICAgdmFyIHNlZ21lbnRzID0gW10sIHBvaW50czAgPSBbXSwgcG9pbnRzMSA9IFtdLCBpID0gLTEsIG4gPSBkYXRhLmxlbmd0aCwgZCwgZngwID0gZDNfZnVuY3Rvcih4MCksIGZ5MCA9IGQzX2Z1bmN0b3IoeTApLCBmeDEgPSB4MCA9PT0geDEgPyBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfSA6IGQzX2Z1bmN0b3IoeDEpLCBmeTEgPSB5MCA9PT0geTEgPyBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geTsKICAgICAgfSA6IGQzX2Z1bmN0b3IoeTEpLCB4LCB5OwogICAgICBmdW5jdGlvbiBzZWdtZW50KCkgewogICAgICAgIHNlZ21lbnRzLnB1c2goIk0iLCBpbnRlcnBvbGF0ZShwcm9qZWN0aW9uKHBvaW50czEpLCB0ZW5zaW9uKSwgTCwgaW50ZXJwb2xhdGVSZXZlcnNlKHByb2plY3Rpb24ocG9pbnRzMC5yZXZlcnNlKCkpLCB0ZW5zaW9uKSwgIloiKTsKICAgICAgfQogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmIChkZWZpbmVkLmNhbGwodGhpcywgZCA9IGRhdGFbaV0sIGkpKSB7CiAgICAgICAgICBwb2ludHMwLnB1c2goWyB4ID0gK2Z4MC5jYWxsKHRoaXMsIGQsIGkpLCB5ID0gK2Z5MC5jYWxsKHRoaXMsIGQsIGkpIF0pOwogICAgICAgICAgcG9pbnRzMS5wdXNoKFsgK2Z4MS5jYWxsKHRoaXMsIGQsIGkpLCArZnkxLmNhbGwodGhpcywgZCwgaSkgXSk7CiAgICAgICAgfSBlbHNlIGlmIChwjNzvVs8zAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3pQABABnz0wKgHNsCoB2CVJx/125J4NzlU/ryAEA8IkVgAAAEBCAoAo17JAE2lxIzc71bmMwIAWisAAForAABo9ygf0sUIACetHhMIAEUAK0w3ekAAQAZIS8CoB2DAqAc2H/WVJzlU/rzbkng3gBgA7bslAAABAQgKAE2lxACjXslvaW50czAubGVuZ3RoKSB7CiAgICAgICAgICBzZWdtZW50KCk7CiAgICAgICAgICBwb2ludHMwID0gW107CiAgICAgICAgICBwb2ludHMxID0gW107CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwb2ludHMwLmxlbmd0aCkgc2VnbWVudCgpOwogICAgICByZXR1cm4gc2VnbWVudHMubGVuZ3RoID8gc2VnbWVudHMuam9pbigiIikgOiBudWxsOwogICAgfQogICAgYXJlYS54ID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MTsKICAgICAgeDAgPSB4MSA9IF87CiAgICAgIHJldHVybiBhcmVhOwogICAgfTsKICAgIGFyZWEueDAgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgwOwogICAgICB4MCA9IF87CiAgICAgIHJldHVybiBhcmVhOwogICAgfTsKICAgIGFyZWEueDEgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOwogICAgICB4MSA9IF87CiAgICAgIHJldHVybiBhcmVhOwogICAgfTsKICAgIGFyZWEueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7CiAgICAgIHkwID0geTEgPSBfOwogICAgICByZXR1cm4gYXJlYTsKICAgIH07CiAgICBhcmVhLnkwID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MDsKICAgICAgeTAgPSBfOwogICAgICByZXR1cm4gYXJlYTsKICAgIH07CiAgICBhcmVhLnkxID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MTsKICAgICAgeTEgPSBfOwogICAgICByZXR1cm4gYXJlYTsKICAgIH07CiAgICBhcmVhLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRlZmluZWQ7CiAgICAgIGRlZmluZWQgPSBfOwogICAgICByZXR1cm4gYXJlYTsKICAgIH07CiAgICBhcmVhLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZUtleTsKICAgICAgaWYgKHR5cGVvZiBfID09PSAiZnVuY3Rpb24iKSBpbnRlcnBvbGF0ZUtleSA9IGludGVycG9sYXRlID0gXzsgZWxzZSBpbnRlcnBvbGF0ZUtleSA9IChpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5nZXQoXykgfHwgZDNfc3ZnX2xpbmVMaW5lYXIpLmtleTsKICAgICAgaW50ZXJwb2xhdGVSZXZlcnNlID0gaW50ZXJwb2xhdGUucmV2ZXJzZSB8fCBpbnRlcnBvbGF0ZTsKICAgICAgTCA9IGludGVycG9sYXRlLmNsb3NlZCA/ICJNIiA6ICJMIjsKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9OwogICAgYXJlYS50ZW5zaW9uID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uOwogICAgICB0ZW5zaW9uID0gXzsKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9OwogICAgcmV0dXJuIGFyZWE7CiAgfQogIGQzX3N2Z19saW5lU3RlcEJlZm9yZS5yZXZlcnNlID0gZDNfc3ZnX2xpbmVTdGVwQWZ0ZXI7CiAgZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEJlZm9yZTsKICBkMy5zdmcuYXJlYSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3N2Z19hcmVhKGQzX2lkZW50aXR5KTsKICB9OwogIGQzLnN2Zy5hcmVhLnJhZGlhbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGFyZWEgPSBkM19zdmdfYXJlYShkM19zdmdfbGluZVJhZGlhbCk7CiAgICBhcmVhLnJhZGl1cyA9IGFyZWEueCwgZGVsZXRlIGFyZWEueDsKICAgIGFyZWEuaW5uZXJSYWRpdXMgPSBhcmVhLngwLCBkZWxldGUgYXJlYS54MDsKICAgIGFyZWEub3V0ZXJSYWRpdXMgPSBhcmVhLngxLCBkZWxldGUgYXJlYS54MTsKICAgIGFyZWEuYW5nbGUgPSBhcmVhLnksIGRlbGV0ZSBhcmVhLnk7CiAgICBhcmVhLnN0YXJ0QW5nbGUgPSBhcmVhLnkwLCBkZWxldGUgYXJlYS55MDsKICAgIGFyZWEuZW5kQW5nbGUgPSBhcmVhLnkxLCBkZWxldGUgYXJlYS55MTsKICAgIHJldHVybiBhcmVhOwogIH07CiAgZDMuc3ZnLmNob3JkID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgc291cmNlID0gZDNfc291cmNlLCB0YXJnZXQgPSBkM190YXJnZXQsIHJhZGl1cyA9IGQzX3N2Z19jaG9yZFJhZGl1cywgc3RhcnRBbmdsZSA9IGQzX3N2Z19hcmNTdGFydEFuZ2xlLCBlbmRBbmdsZSA9IGQzX3N2Z19hcmNFbmRBbmdsZTsKICAgIGZ1bmN0aW9uIGNob3JkKGQsIGkpIHsKICAgICAgdmFyIHMgPSBzdWJncm91cCh0aGlzLCBzb3VyY2UsIGQsIGkpLCB0ID0gc3ViZ3JvdXAodGhpcywgdGFyZ2V0LCBkLCBpKTsKICAgICAgcmV0dXJuICJNIiArIHMucDAgKyBhcmMocy5yLCBzLnAxLCBzLmExIC0gcy5hMCkgKyAoZXF1YWxzKHMsIHQpID8gY3VydmUocy5yLCBzLnAxLCBzLnIsIHMucDApIDogY3VydmUocy5yLCBzLnAxLCB0LnIsIHQucDApICsgYXJjKHQuciwgdC5wMSwgdC5hMSAtIHQuYTApICsgY3VydmUodC5yLCB0LnAxLCBzLnIsIHMucDApKSArICJaIjsKICAgIH0KICAgIGZ1bmN0aW9uIHN1Ymdyb3VwKHNlbGYsIGYsIGQsIGkpIHsKICAgICAgdmFyIHN1Ymdyb3VwID0gZi5jYWxsKHNlbGYsIGQsIGkpLCByID0gcmFkaXVzLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpLCBhMCA9IHN0YXJ0QW5nbGUuY2FsbChzZWxmLCBzdWJncm91cCwgaSkgKyBkM19zdmdfYXJjT2Zmc2V0LCBhMSA9IGVuZEFuZ2xlLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpICsgZDNfc3ZnX2FyY09mZnNldDsKICAgICAgcmV0dXJuIHsKICAgICAgICByOiByLAogICAgICAgIGEwOiBhMCwKICAgICAgICBhMTogYTEsCiAgICAgICAgcDA6IFsgciAqIE1hdGguY29zKGEwKSwgciAqIE1hdGguc2luKGEwKSBdLAogICAgICAgIHAxOiBbIHIgKiBNYXRoLmNvcyhhMSksIHIgKiBNYXRoLnNpbihhMSkgXQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHsKICAgICAgcmV0dXJuIGEuYTAgPT0gYi5hMCAmJiBhLmExID09IGIuYTE7CiAgICB9CiAgICBmdW5jdGlvbiBhcmMociwgcCwgYSkgewogICAgICByZXR1cm4gIkEiICsgciArICIsIiArIHIgKyAiIDAgIiArICsoYSA+IM+AKSArICIsMSAiICsgcDsKICAgIH0KICAgIGZ1bmN0aW9uIGN1cnZlKHIwLCBwMCwgcjEsIHAxKSB7CiAgICAgIHJldHVybiAiUSAwLDAgIiArIHAxOwogICAgfQogICAgY2hvcmQucmFkaXVzID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYWRpdXM7CiAgICAgIHJhZGl1cyA9IGQzX2Z1bmN0b3Iodik7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICBjaG9yZC5zb3VyY2UgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsKICAgICAgc291cmNlID0gZDNfZnVuY3Rvcih2KTsKICAgICAgcmV0dXJuIGNob3JkOwogICAgfTsKICAgIGNob3JkLnRhcmdldCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0OwogICAgICB0YXJnZXQgPSBkM19mdW5jdG9yKHYpOwogICAgICByZXR1cm4gY2hvcmQ7CiAgICB9OwogICAgY2hvcmQuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsKICAgICAgc3RhcnRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7CiAgICAgIHJldHVybiBjaG9yZDsKICAgIH07CiAgICBjaG9yZC5lbmRBbmdsZSA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7CiAgICAgIGVuZEFuZ2xlID0gZDNfZnVuY3Rvcih2KTsKICAgICAgcmV0dXJuIGNob3JkOwogICAgfTsKICAgIHJldHVybiBjaG9yZDsKICB9OwogIGZ1bmN0aW9uIGQzX3N2Z19jaG9yZFJhZGl1cyhkKSB7CiAgICByZXR1cm4gZC5yYWRpdXM7CiAgfQogIGQzLnN2Zy5kaWFnb25hbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNvdXJjZSA9IGQzX3NvdXJjZSwgdGFyZ2V0ID0gZDNfdGFyZ2V0LCBwcm9qZWN0aW9uID0gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbjsKICAgIGZ1bmN0aW9uIGRpYWdvbmFsKGQsIGkpIHsKICAgICAgdmFyIHAwID0gc291cmNlLmNhbGwodGhpcywgZCwgaSksIHAzID0gdGFyZ2V0LmNhbGwodGhpcywgZCwgaSksIG0gPSAocDAueSArIHAzLnkpIC8gMiwgcCA9IFsgcDAsIHsKICAgICAgICB4OiBwMC54LAogICAgICAgIHk6IG0KICAgICAgfSwgewogICAgICAgIHg6IHAzLngsCiAgICAgICAgeTogbQogICAgICB9LCBwMyBdOwogICAgICBwID0gcC5tYXAocHJvamVjdGlvbik7CiAgICAgIHJldHVybiAiTSIgKyBwWzBdICsgIkMiICsgcFsxXSArICIgIiArIHBbMl0gKyAiICIgKyBwWzNdOwogICAgfQogICAgZGlhZ29uYWwuc291cmNlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7CiAgICAgIHNvdXJjZSA9IGQzX2Z1bmN0b3IoeCk7CiAgICAgIHJldHVybiBkaWFnb25hbDsKICAgIH07CiAgICBkaWFnb25hbC50YXJnZXQgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gZDNfZnVuY3Rvcih4KTsKICAgICAgcmV0dXJuIGRpYWdvbmFsOwogICAgfTsKICAgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByb2plY3Rpb247CiAgICAgIHByb2plY3Rpb24gPSB4OwogICAgICByZXR1cm4gZGlhZ29uYWw7CiAgICB9OwogICAgcmV0dXJuIGRpYWdvbmFsOwogIH07CiAgZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbihkKSB7CiAgICByZXR1cm4gWyBkLngsIGQueSBdOwogIH0KICBkMy5zdmcuZGlhZ29uYWwucmFkaWFsID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwoKSwgcHJvamVjdGlvbiA9IGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb24sIHByb2plY3Rpb25fID0gZGlhZ29uYWwucHJvamVjdGlvbjsKICAgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gcHJvamVjdGlvbl8oZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uID0geCkpIDogcHJvamVjdGlvbjsKICAgIH07CiAgICByZXR1cm4gZGlhZ29uYWw7CiAgfTsKICBmdW5jdGlvbiBkM19zdmdfZGlhZ29uYWxSYWRpYWxQcm9qZWN0aW9uKHByb2plY3Rpb24pIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGQgPSBwcm9qZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHIgPSBkWzBdLCBhID0gZFsxXSArIGQzX3N2Z19hcmNPZmZzZXQ7CiAgICAgIHJldHVybiBbIHIgKiBNYXRoLmNvcyhhKSwgciAqIE1hdGguc2luKGEpIF07CiAgICB9OwogIH0KICBkMy5zdmcuc3ltYm9sID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdHlwZSA9IGQzX3N2Z19zeW1ib2xUeXBlLCBzaXplID0gZDNfc3ZnX3N5bWJvbFNpemU7CiAgICBmdW5jdGlvbiBzeW1ib2woZCwgaSkgewogICAgICByZXR1cm4gKGQzX3N2Z19zeW1ib2xzLmdldCh0eXBlLmNhbGwodGhpcywgZCwgaSkpIHx8IGQzX3N2Z19zeW1ib2xDaXJjbGUpKHNpemUuY2FsbCh0aGlzLCBkLCBpKSk7CiAgICB9CiAgICBzeW1ib2wudHlwZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdHlwZTsKICAgICAgdHlwZSA9IGQzX2Z1bmN0b3IoeCk7CiAgICAgIHJldHVybiBzeW1ib2w7CiAgICB9OwogICAgc3ltYm9sLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICAgIHNpemUgPSBkM19mdW5jdG9yKHgpOwogICAgICByZXR1cm4gc3ltYm9sOwogICAgfTsKICAgIHJldHVybiBzeW1ib2w7CiAgfTsKICBmdW5jdGlvbiBkM19zdmdfc3ltYm9sU2l6ZSgpIHsKICAgIHJldHVybiA2NDsKICB9CiAgZnVuY3Rpb24gZDNfc3ZnX3N5bWJvbFR5cGUoKSB7CiAgICByZXR1cm4gImNpcmNsZSI7CiAgfQogIGZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xDaXJjbGUoc2l6ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIM+AKTsKICAgIHJldHVybiAiTTAsIiArIHIgKyAiQSIgKyByICsgIiwiICsgciArICIgMCAxLDEgMCwiICsgLXIgKyAiQSIgKyByICsgIiwiICsgciArICIgMCAxLDEgMCwiICsgciArICJaIjsKICB9CiAgdmFyIGQzX3N2Z19zeW1ib2xzID0gZDMubWFwKHsKICAgIGNpcmNsZTogZDNfc3ZnX3N5bWJvbENpcmNsZSwKICAgIGNyb3NzOiBmdW5jdGlvbihzaXplKSB7CiAgICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyA1KSAvIDI7CiAgICAgIHJldHVybiAiTSIgKyAtMyAqIHIgKyAiLCIgKyAtciArICJIIiArIC1yICsgIlYiICsgLTMgKiByICsgIkgiICsgciArICJWIiArIC1yICsgIkgiICsgMyAqIHIgKyAiViIgKyByICsgIkgiICsgciArICJWIiArIDMgKiByICsgIkgiICsgLXIgKyAiViIgKyByICsgIkgiICsgLTMgKiByICsgIloiOwogICAgfSwKICAgIGRpYW1vbmQ6IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgdmFyIHJ5ID0gTWF0aC5zcXJ0KHNpemUgLyAoMiAqIGQzX3N2Z19zeW1ib2xUYW4zMCkpLCByeCA9IHJ5ICogZDNfc3ZnX3N5bWJvbFRhbjMwOwogICAgICByZXR1cm4gIk0wLCIgKyAtcnkgKyAiTCIgKyByeCArICIsMCIgKyAiIDAsIiArIHJ5ICsgIiAiICsgLXJ4ICsgIiwwIiArICJaIjsKICAgIH0sCiAgICBzcXVhcmU6IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSkgLyAyOwogICAgICByZXR1cm4gIk0iICsgLXIgKyAiLCIgKyAtciArICJMIiArIHIgKyAiLCIgKyAtciArICIgIiArIHIgKyAiLCIgKyByICsgIiAiICsgLXIgKyAiLCIgKyByICsgIloiOwogICAgfSwKICAgICJ0cmlhbmdsZS1kb3duIjogZnVuY3Rpb24oc2l6ZSkgewogICAgICB2YXIgcnggPSBNYXRoLnNxcnQoc2l6ZSAvIGQzX3N2Z19zeW1ib2xTcXJ0MyksIHJ5ID0gcnggKiBkM19zdmdfc3ltYm9sU3FydDMgLyAyOwogICAgICByZXR1cm4gIk0wLCIgKyByeSArICJMIiArIHJ4ICsgIiwiICsgLXJ5ICsgIiAiICsgLXJ4ICsgIiwiICsgLXJ5ICsgIloiOwogICAgfSwKICAgICJ0cmlhbmdsZS11cCI6IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLCByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjsKICAgICAgcmV0dXJuICJNMCwiICsgLXJ5ICsgIkwiICsgcnggKyAiLCIgKyByeSArICIgIiArIC1yeCArICIsIiArIHJ5ICsgIloiOwogICAgfQogIH0pOwogIGQzLnN2Zy5zeW1ib2xUeXBlcyA9IGQzX3N2Z19zeW1ib2xzLmtleXMoKTsKICB2YXIgZDNfc3ZnX3N5bWJvbFNxcnQzID0gTWF0aC5zcXJ0KDMpLCBkM19zdmdfc3ltYm9sVGFuMzAgPSBNYXRoLnRhbigzMCAqIGQzX3JhZGlhbnMpOwogIGZ1bmN0aW9uIGQzX3RyYW5zaXRpb24oZ3JvdXBzLCBpZCkgewogICAgZDNfc3ViY2xhc3MoZ3JvdXBzLCBkM190cmFuc2l0aW9uUHJvdG90eXBlKTsKICAgIGdyb3Vwcy5pZCA9IGlkOwogICAgcmV0dXJuIGdyb3VwczsKICB9CiAgdmFyIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUgPSBbXSwgZDNfdHJhbnNpdGlvbklkID0gMCwgZDNfdHJhbnNpdGlvbkluaGVyaXRJZCwgZDNfdHJhbnNpdGlvbkluaGVyaXQ7CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5jYWxsID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNhbGw7CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5lbXB0eSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5lbXB0eTsKICBkM190cmFuc2l0aW9uUHJvdG90eXBlLm5vZGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZTsKICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnNpemUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2l6ZTsKICBkMy50cmFuc2l0aW9uID0gZnVuY3Rpb24oc2VsZWN0aW9uKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGQzX3RyYW5zaXRpb25Jbmhlcml0SWQgPyBzZWxlY3Rpb24udHJhbnNpdGlvbigpIDogc2VsZWN0aW9uIDogZDNfc2VsZWN0aW9uUm9vdC50cmFuc2l0aW9uKCk7CiAgfTsKICBkMy50cmFuc2l0aW9uLnByb3RvdHlwZSA9IGQzX3RyYW5zaXRpb25Qcm90b3R5cGU7CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgewogICAgdmFyIGlkID0gdGhpcy5pZCwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBzdWJub2RlLCBub2RlOwogICAgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkgewogICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47ICkgewogICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpKSB7CiAgICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICAgIGQzX3RyYW5zaXRpb25Ob2RlKHN1Ym5vZGUsIGksIGlkLCBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXSk7CiAgICAgICAgICBzdWJncm91cC5wdXNoKHN1Ym5vZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBpZCk7CiAgfTsKICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICB2YXIgaWQgPSB0aGlzLmlkLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIHN1Ym5vZGVzLCBub2RlLCBzdWJub2RlLCB0cmFuc2l0aW9uOwogICAgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkgewogICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgdHJhbnNpdGlvbiA9IG5vZGUuX190cmFuc2l0aW9uX19baWRdOwogICAgICAgICAgc3Vibm9kZXMgPSBzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopOwogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CiAgICAgICAgICBmb3IgKHZhciBrID0gLTEsIG8gPSBzdWJub2Rlcy5sZW5ndGg7ICsrayA8IG87ICkgewogICAgICAgICAgICBpZiAoc3Vibm9kZSA9IHN1Ym5vZGVzW2tdKSBkM190cmFuc2l0aW9uTm9kZShzdWJub2RlLCBrLCBpZCwgdHJhbnNpdGlvbik7CiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIGlkKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7CiAgICB2YXIgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBncm91cCwgbm9kZTsKICAgIGlmICh0eXBlb2YgZmlsdGVyICE9PSAiZnVuY3Rpb24iKSBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fZmlsdGVyKGZpbHRlcik7CiAgICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIGZpbHRlci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLmlkKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudHdlZW4gPSBmdW5jdGlvbihuYW1lLCB0d2VlbikgewogICAgdmFyIGlkID0gdGhpcy5pZDsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXMubm9kZSgpLl9fdHJhbnNpdGlvbl9fW2lkXS50d2Vlbi5nZXQobmFtZSk7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgdHdlZW4gPT0gbnVsbCA/IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZS5fX3RyYW5zaXRpb25fX1tpZF0udHdlZW4ucmVtb3ZlKG5hbWUpOwogICAgfSA6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZS5fX3RyYW5zaXRpb25fX1tpZF0udHdlZW4uc2V0KG5hbWUsIHR3ZWVuKTsKICAgIH0pOwogIH07CiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl90d2Vlbihncm91cHMsIG5hbWUsIHZhbHVlLCB0d2VlbikgewogICAgdmFyIGlkID0gZ3JvdXBzLmlkOwogICAgcmV0dXJuIGQzX3NlbGVjdGlvbl9lYWNoKGdyb3VwcywgdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZnVuY3Rpb24obm9kZSwgaSwgaikgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS50d2Vlbi5zZXQobmFtZSwgdHdlZW4odmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSkpOwogICAgfSA6ICh2YWx1ZSA9IHR3ZWVuKHZhbHVlKSwgZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS50d2Vlbi5zZXQobmFtZSwgdmFsdWUpOwogICAgfSkpOwogIH0KICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHIgPSBmdQ0KjNzvVhQ0AgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3qQABABnzzwKgHNsCoB2CVJx/125J4NzlVKdSAEA8zZhUAAAEBCAoAo17JAE2lxIzc71b0NAIAGlUAABpVAABo9ygf0sUIACetHhMIAEUAVQw3gkAAQAYeg8CoB2DAqAc2H/WVJzlVKdTbkng3gBAA7eTlAAABAQgKAE2lxACjXsk3Q0VCDQpuY3Rpb24obmFtZU5TLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgIGZvciAodmFsdWUgaW4gbmFtZU5TKSB0aGlzLmF0dHIodmFsdWUsIG5hbWVOU1t2YWx1ZV0pOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHZhciBpbnRlcnBvbGF0ZSA9IG5hbWVOUyA9PSAidHJhbnNmb3JtIiA/IGQzX2ludGVycG9sYXRlVHJhbnNmb3JtIDogZDNfaW50ZXJwb2xhdGUsIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7CiAgICBmdW5jdGlvbiBhdHRyTnVsbCgpIHsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyTnVsbE5TKCkgewogICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpOwogICAgfQogICAgZnVuY3Rpb24gYXR0clR3ZWVuKGIpIHsKICAgICAgcmV0dXJuIGIgPT0gbnVsbCA/IGF0dHJOdWxsIDogKGIgKz0gIiIsIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSksIGk7CiAgICAgICAgcmV0dXJuIGEgIT09IGIgJiYgKGkgPSBpbnRlcnBvbGF0ZShhLCBiKSwgZnVuY3Rpb24odCkgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaSh0KSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gYXR0clR3ZWVuTlMoYikgewogICAgICByZXR1cm4gYiA9PSBudWxsID8gYXR0ck51bGxOUyA6IChiICs9ICIiLCBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuZ2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCksIGk7CiAgICAgICAgcmV0dXJuIGEgIT09IGIgJiYgKGkgPSBpbnRlcnBvbGF0ZShhLCBiKSwgZnVuY3Rpb24odCkgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCBpKHQpKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbl90d2Vlbih0aGlzLCAiYXR0ci4iICsgbmFtZU5TLCB2YWx1ZSwgbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuYXR0clR3ZWVuID0gZnVuY3Rpb24obmFtZU5TLCB0d2VlbikgewogICAgdmFyIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7CiAgICBmdW5jdGlvbiBhdHRyVHdlZW4oZCwgaSkgewogICAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSkpOwogICAgICByZXR1cm4gZiAmJiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgZih0KSk7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyVHdlZW5OUyhkLCBpKSB7CiAgICAgIHZhciBmID0gdHdlZW4uY2FsbCh0aGlzLCBkLCBpLCB0aGlzLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpKTsKICAgICAgcmV0dXJuIGYgJiYgZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgZih0KSk7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iICsgbmFtZU5TLCBuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pOwogIH07CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgaWYgKG4gPCAzKSB7CiAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIpIHsKICAgICAgICBpZiAobiA8IDIpIHZhbHVlID0gIiI7CiAgICAgICAgZm9yIChwcmlvcml0eSBpbiBuYW1lKSB0aGlzLnN0eWxlKHByaW9yaXR5LCBuYW1lW3ByaW9yaXR5XSwgdmFsdWUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHByaW9yaXR5ID0gIiI7CiAgICB9CiAgICBmdW5jdGlvbiBzdHlsZU51bGwoKSB7CiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiBzdHlsZVN0cmluZyhiKSB7CiAgICAgIHJldHVybiBiID09IG51bGwgPyBzdHlsZU51bGwgOiAoYiArPSAiIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSBkM193aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpLCBpOwogICAgICAgIHJldHVybiBhICE9PSBiICYmIChpID0gZDNfaW50ZXJwb2xhdGUoYSwgYiksIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaSh0KSwgcHJpb3JpdHkpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBkM190cmFuc2l0aW9uX3R3ZWVuKHRoaXMsICJzdHlsZS4iICsgbmFtZSwgdmFsdWUsIHN0eWxlU3RyaW5nKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc3R5bGVUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHR3ZWVuLCBwcmlvcml0eSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBwcmlvcml0eSA9ICIiOwogICAgZnVuY3Rpb24gc3R5bGVUd2VlbihkLCBpKSB7CiAgICAgIHZhciBmID0gdHdlZW4uY2FsbCh0aGlzLCBkLCBpLCBkM193aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTsKICAgICAgcmV0dXJuIGYgJiYgZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgZih0KSwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIHRoaXMudHdlZW4oInN0eWxlLiIgKyBuYW1lLCBzdHlsZVR3ZWVuKTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbl90d2Vlbih0aGlzLCAidGV4dCIsIHZhbHVlLCBkM190cmFuc2l0aW9uX3RleHQpOwogIH07CiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl90ZXh0KGIpIHsKICAgIGlmIChiID09IG51bGwpIGIgPSAiIjsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IGI7CiAgICB9OwogIH0KICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIHA7CiAgICAgIGlmICh0aGlzLl9fdHJhbnNpdGlvbl9fLmNvdW50IDwgMiAmJiAocCA9IHRoaXMucGFyZW50Tm9kZSkpIHAucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9KTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZWFzZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0aGlzLmlkOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gdGhpcy5ub2RlKCkuX190cmFuc2l0aW9uX19baWRdLmVhc2U7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGQzLmVhc2UuYXBwbHkoZDMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS5lYXNlID0gdmFsdWU7CiAgICB9KTsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5pZDsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIHRoaXMubm9kZSgpLl9fdHJhbnNpdGlvbl9fW2lkXS5kZWxheTsKICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyBmdW5jdGlvbihub2RlLCBpLCBqKSB7CiAgICAgIG5vZGUuX190cmFuc2l0aW9uX19baWRdLmRlbGF5ID0gK3ZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7CiAgICB9IDogKHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbihub2RlKSB7CiAgICAgIG5vZGUuX190cmFuc2l0aW9uX19baWRdLmRlbGF5ID0gdmFsdWU7CiAgICB9KSk7CiAgfTsKICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHZhciBpZCA9IHRoaXMuaWQ7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiB0aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1tpZF0uZHVyYXRpb247CiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZnVuY3Rpb24obm9kZSwgaSwgaikgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS5kdXJhdGlvbiA9IE1hdGgubWF4KDEsIHZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpOwogICAgfSA6ICh2YWx1ZSA9IE1hdGgubWF4KDEsIHZhbHVlKSwgZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXS5kdXJhdGlvbiA9IHZhbHVlOwogICAgfSkpOwogIH07CiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHsKICAgIHZhciBpZCA9IHRoaXMuaWQ7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgdmFyIGluaGVyaXQgPSBkM190cmFuc2l0aW9uSW5oZXJpdCwgaW5oZXJpdElkID0gZDNfdHJhbnNpdGlvbkluaGVyaXRJZDsKICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXRJZCA9IGlkOwogICAgICBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbihub2RlLCBpLCBqKSB7CiAgICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXQgPSBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXTsKICAgICAgICB0eXBlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7CiAgICAgIH0pOwogICAgICBkM190cmFuc2l0aW9uSW5oZXJpdCA9IGluaGVyaXQ7CiAgICAgIGQzX3RyYW5zaXRpb25Jbmhlcml0SWQgPSBpbmhlcml0SWQ7CiAgICB9IGVsc2UgewogICAgICBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgdmFyIHRyYW5zaXRpb24gPSBub2RlLl9fdHJhbnNpdGlvbl9fW2lkXTsKICAgICAgICAodHJhbnNpdGlvbi5ldmVudCB8fCAodHJhbnNpdGlvbi5ldmVudCA9IGQzLmRpc3BhdGNoKCJzdGFydCIsICJlbmQiKSkpLm9uKHR5cGUsIGxpc3RlbmVyKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9OwogIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGlkMCA9IHRoaXMuaWQsIGlkMSA9ICsrZDNfdHJhbnNpdGlvbklkLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIGdyb3VwLCBub2RlLCB0cmFuc2l0aW9uOwogICAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgewogICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIHRyYW5zaXRpb24gPSBPYmplY3QuY3JlYXRlKG5vZGUuX190cmFuc2l0aW9uX19baWQwXSk7CiAgICAgICAgICB0cmFuc2l0aW9uLmRlbGF5ICs9IHRyYW5zaXRpb24uZHVyYXRpb247CiAgICAgICAgICBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBpZDEsIHRyYW5zaXRpb24pOwogICAgICAgIH0KICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIGlkMSk7CiAgfTsKICBmdW5jdGlvbiBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBpZCwgaW5oZXJpdCkgewogICAgdmFyIGxvY2sgPSBub2RlLl9fdHJhbnNpdGlvbl9fIHx8IChub2RlLl9fdHJhbnNpdGlvbl9fID0gewogICAgICBhY3RpdmU6IDAsCiAgICAgIGNvdW50OiAwCiAgICB9KSwgdHJhbnNpdGlvbiA9IGxvY2tbaWRdOwogICAgaWYgKCF0cmFuc2l0aW9uKSB7CiAgICAgIHZhciB0aW1lID0gaW5oZXJpdC50aW1lOwogICAgICB0cmFuc2l0aW9uID0gbG9ja1tpZF0gPSB7CiAgICAgICAgdHdlZW46IG5ldyBkM19NYXAoKSwKICAgICAgICB0aW1lOiB0aW1lLAogICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZSwKICAgICAgICBkZWxheTogaW5oZXJpdC5kZWxheSwKICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbgogICAgICB9OwogICAgICArK2xvY2suY291bnQ7CiAgICAgIGQzLnRpbWVyKGZ1bmN0aW9uKGVsYXBzZWQpIHsKICAgICAgICB2YXIgZCA9IG5vZGUuX19kYXRhX18sIGVhc2UgPSB0cmFuc2l0aW9uLmVhc2UsIGRlbGF5ID0gdHJhbnNpdGlvbi5kZWxheSwgZHVyYXRpb24gPSB0cmFuc2l0aW9uLmR1cmF0aW9uLCB0aW1lciA9IGQzX3RpbWVyX2FjdGl2ZSwgdHdlZW5lZCA9IFtdOwogICAgICAgIHRpbWVyLnQgPSBkZWxheSArIHRpbWU7CiAgICAgICAgaWYgKGRlbGF5IDw9IGVsYXBzZWQpIHJldHVybiBzdGFydChlbGFwc2VkIC0gZGVsYXkpOwogICAgICAgIHRpbWVyLmMgPSBzdGFydDsKICAgICAgICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7CiAgICAgICAgICBpZiAobG9jay5hY3RpdmUgPiBpZCkgcmV0dXJuIHN0b3AoKTsKICAgICAgICAgIGxvY2suYWN0aXZlID0gaWQ7CiAgICAgICAgICB0cmFuc2l0aW9uLmV2ZW50ICYmIHRyYW5zaXRpb24uZXZlbnQuc3RhcnQuY2FsbChub2RlLCBkLCBpKTsKICAgICAgICAgIHRyYW5zaXRpb24udHdlZW4uZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9IHZhbHVlLmNhbGwobm9kZSwgZCwgaSkpIHsKICAgICAgICAgICAgICB0d2VlbmVkLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGQzLnRpbWVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aW1lci5jID0gdGljayhlbGFwc2VkIHx8IDEpID8gZDNfdHJ1ZSA6IHRpY2s7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgfSwgMCwgdGltZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgICAgICAgaWYgKGxvY2suYWN0aXZlICE9PSBpZCkgcmV0dXJuIHN0b3AoKTsKICAgICAgICAgIHZhciB0ID0gZWxhcHNlZCAvIGR1cmF0aW9uLCBlID0gZWFzZSh0KSwgbiA9IHR3ZWVuZWQubGVuZ3RoOwogICAgICAgICAgd2hpbGUgKG4gPiAwKSB7CiAgICAgICAgICAgIHR3ZWVuZWRbLS1uXS5jYWxsKG5vZGUsIGUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHQgPj0gMSkgewogICAgICAgICAgICB0cmFuc2l0aW9uLmV2ZW50ICYmIHRyYW5zaXRpb24uZXZlbnQuZW5kLmNhbGwobm9kZSwgZCwgaSk7CiAgICAgICAgICAgIHJldHVybiBzdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgICAgICBpZiAoLS1sb2NrLmNvdW50KSBkZWxldGUgbG9ja1tpZF07IGVsc2UgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uX187CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgIH0sIDAsIHRpbWUpOwogICAgfQogIH0KICBkMy5zdmcuYXhpcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNjYWxlID0gZDMuc2NhbGUubGluZWFyKCksIG9yaWVudCA9IGQzX3N2Z19heGlzRGVmYXVsdE9yaWVudCwgaW5uZXJUaWNrU2l6ZSA9IDYsIG91dGVyVGlja1NpemUgPSA2LCB0aWNrUGFkZGluZyA9IDMsIHRpY2tBcmd1bWVudHNfID0gWyAxMCBdLCB0aWNrVmFsdWVzID0gbnVsbCwgdGlja0Zvcm1hdF87CiAgICBmdW5jdGlvbiBheGlzKGcpIHsKICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBnID0gZDMuc2VsZWN0KHRoaXMpOwogICAgICAgIHZhciBzY2FsZTAgPSB0aGlzLl9fY2hhcnRfXyB8fCBzY2FsZSwgc2NhbGUxID0gdGhpcy5fX2NoYXJ0X18gPSBzY2FsZS5jb3B5KCk7CiAgICAgICAgdmFyIHRpY2tzID0gdGlja1ZhbHVlcyA9PSBudWxsID8gc2NhbGUxLnRpY2tzID8gc2NhbGUxLnRpY2tzLmFwcGx5KHNjYWxlMSwgdGlja0FyZ3VtZW50c18pIDogc2NhbGUxLmRvbWFpbigpIDogdGlja1ZhbHVlcywgdGlja0Zvcm1hdCA9IHRpY2tGb3JtYXRfID09IG51bGwgPyBzY2FsZTEudGlja0Zvcm1hdCA/IHNjYWxlMS50aWNrRm9ybWF0LmFwcGx5KHNjYWxlMSwgdGlja0FyZ3VtZW50c18pIDogZDNfaWRlbnRpdHkgOiB0aWNrRm9ybWF0XywgdGljayA9IGcuc2VsZWN0QWxsKCIudGljayIpLmRhdGEodGlja3MsIHNjYWxlMSksIHRpY2tFbnRlciA9IHRpY2suZW50ZXIoKS5pbnNlcnQoImciLCAiLmRvbWFpbiIpLmF0dHIoImNsYXNzIiwgInRpY2siKS5zdHlsZSgib3BhY2l0eSIsIM61KSwgdGlja0V4aXQgPSBkMy50cmFuc2l0aW9uKHRpY2suZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsIM61KS5yZW1vdmUoKSwgdGlja1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24odGljay5vcmRlcigpKS5zdHlsZSgib3BhY2l0eSIsIDEpLCB0aWNrVHJhbnNmb3JtOwogICAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUxKSwgcGF0aCA9IGcuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbIDAgXSksIHBhdGhVcGRhdGUgPSAocGF0aC5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpLCAKICAgICAgICBkMy50cmFuc2l0aW9uKHBhdGgpKTsKICAgICAgICB0aWNrRW50ZXIuYXBwZW5kKCJsaW5lIik7CiAgICAgICAgdGlja0VudGVyLmFwcGVuZCgidGV4dCIpOwogICAgICAgIHZhciBsaW5lRW50ZXIgPSB0aWNrRW50ZXIuc2VsZWN0KCJsaW5lIiksIGxpbmVVcGRhdGUgPSB0aWNrVXBkYXRlLnNlbGVjdCgibGluZSIpLCB0ZXh0ID0gdGljay5zZWxlY3QoInRleHQiKS50ZXh0KHRpY2tGb3JtYXQpLCB0ZXh0RW50ZXIgPSB0aWNrRW50ZXIuc2VsZWN0KCJ0ZXh0IiksIHRleHRVcGRhdGUgPSB0aWNrVXBkYXRlLnNlbGVjdCgidGV4dCIpOwogICAgICAgIHN3aXRjaCAob3JpZW50KSB7CiAgICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICB7CiAgICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1g7CiAgICAgICAgICAgIGxpbmVFbnRlci5hdHRyKCJ5MiIsIGlubmVyVGlja1NpemUpOwogICAgICAgICAgICB0ZXh0RW50ZXIuYXR0cigieSIsIE1hdGgubWF4KGlubmVyVGlja1NpemUsIDApICsgdGlja1BhZGRpbmcpOwogICAgICAgICAgICBsaW5lVXBkYXRlLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCBpbm5lclRpY2tTaXplKTsKICAgICAgICAgICAgdGV4dFVwZGF0ZS5hdHRyKCJ4IiwgMCkuYXR0cigieSIsIE1hdGgubWF4KGlubmVyVGlja1NpemUsIDApICsgdGlja1BhZGRpbmcpOwogICAgICAgICAgICB0ZXh0LmF0dHIoImR5IiwgIi43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwgIm1pZGRsZSIpOwogICAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyByYW5nZVswXSArICIsIiArIG91dGVyVGlja1NpemUgKyAiVjBIIiArIHJhbmdlWzFdICsgIlYiICsgb3V0ZXJUaWNrU2l6ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgIHsKICAgICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWDsKICAgICAgICAgICAgbGluZUVudGVyLmF0dHIoInkyIiwgLWlubmVyVGlja1NpemUpOwogICAgICAgICAgICB0ZXh0RW50ZXIuYXR0cigieSIsIC0oTWF0aC5tYXgoaW5uZXJUaWNrU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykpOwogICAgICAgICAgICBsaW5lVXBkYXRlLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCAtaW5uZXJUaWNrU2l6ZSk7CiAgICAgICAgICAgIHRleHRVcGRhdGUuYXR0cigieCIsIDApLmF0dHIoInkiLCAtKE1hdGgubWF4KGlubmVyVGlja1NpemUsIDApICsgdGlja1BhZGRpbmcpKTsKICAgICAgICAgICAgdGV4dC5hdHRyKCJkeSIsICIwZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCAibWlkZGxlIik7CiAgICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cigiZCIsICJNIiArIHJhbmdlWzBdICsgIiwiICsgLW91dGVyVGlja1NpemUgKyAiVjBIIiArIHJhbmdlWzFdICsgIlYiICsgLW91dGVyVGlja1NpemUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgewogICAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNZOwogICAgICAgICAgICBsaW5lRW50ZXIuYXR0cigieDIiLCAtaW5uZXJUaWNrU2l6ZSk7CiAgICAgICAgICAgIHRleHRFbnRlci5hdHRyKCJ4IiwgLShNYXRoLm1heChpbm5lclRpY2tTaXplLCAwKSArIHRpY2tQYWRkaW5nKSk7CiAgICAgICAgICAgIGxpbmVVcGRhdGUuYXR0cigieDIiLCAtaW5uZXJUaWNrU2l6ZSkuYXR0cigieTIiLCAwKTsKICAgICAgICAgICAgdGV4dFVwZGF0ZS5hdHRyKCJ4IiwgLShNYXRoLm1heChpbm5lclRpY2tTaXplLCAwKSArIHRpY2tQYWRkaW5nKSkuYXR0cigieSIsIDApOwogICAgICAgICAgICB0ZXh0LmF0dHIoImR5IiwgIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwgImVuZCIpOwogICAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyAtb3V0ZXJUaWNrU2l6ZSArICIsIiArIHJhbmdlWzBdICsgIkgwViIgKyByYW5nZVsxXSArICJIIiArIC1vdXRlclRpY2tTaXplKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgICB7CiAgICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1k7CiAgICAgICAgICAgIGxpbmVFbnRlci5hdHRyKCJ4MiIsIGlubmVyVGlja1NpemUpOwogICAgICAgICAgICB0ZXh0RW50ZXIuYXR0cigieCIsIE1hdGgubWF4KGlubmVyVGlja1NpemUsIDApICsgdGlja1BhZGRpbmcpOwogICAgICAgICAgICBsaW5lVXBkYXRlLmF0dHIoIngyIiwgaW5uZXJUaWNrU2l6ZSkuYXR0cigieTIiLCAwKTsKICAgICAgICAgICAgdGV4dFVwZGF0ZS5hdHRyKCJ4IiwgTWF0aC5tYXgoaW5uZXJUaWNrU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykuYXR0cigieSIsIDApOwogICAgICAgICAgICB0ZXh0LmF0dHIoImR5IiwgIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwgInN0YXJ0Iik7CiAgICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cigiZCIsICJNIiArIG91dGVyVGlja1NpemUgKyAiLCIgKyByYW5nZVswXSArICJIMFYiICsgcmFuZ2VbMV0gKyAiSCIgKyBvdXRlclRpY2tTaXplKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzY2FsZTEucmFuZ2VCYW5kKSB7CiAgICAgICAgICB2YXIgeCA9IHNjYWxlMSwgZHggPSB4LnJhbmdlQmFuZCgpIC8gMjsKICAgICAgICAgIHNjYWxlMCA9IHNjYWxlMSA9IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgcmV0dXJuIHgoZCkgKyBkeDsKICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIGlmIChzY2FsZTAucmFuZ2VCYW5kKSB7CiAgICAgICAgICBzY2FsZTAgPSBzY2FsZTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgICB9CiAgICAgICAgdGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwKTsKICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgfSk7CiAgICB9CiAgICBheGlzLnNjYWxlID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKICAgICAgc2NhbGUgPSB4OwogICAgICByZXR1cm4gYXhpczsKICAgIH07CiAgICBheGlzLm9yaWVudCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZW50OwogICAgICBvcmllbnQgPSB4IGluIGQzX3N2Z19heGlzT3JpZW50cyA/IHggKyAiIiA6IGQzX3N2Z19heGlzRGVmYXVsdE9yaWVudDsKICAgICAgcmV0dXJuIGF4aXM7CiAgICB9OwogICAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrQXJndW1lbnRzXzsKICAgICAgdGlja0FyZ3VtZW50c18gPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiBheGlzOwogICAgfTsKICAgIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1ZhbHVlczsKICAgICAgdGlja1ZhbHVlcyA9IHg7CiAgICAgIHJldHVybiBheGlzOwogICAgfTsKICAgIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0Zvcm1hdF87CiAgICAgIHRpY2tGb3JtYXRfID0geDsKICAgICAgcmV0dXJuIGF4aXM7CiAgICB9OwogICAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICBpZiAoIW4pIHJldHVybiBpbm5lclRpY2tTaXplOwogICAgICBpbm5lclRpY2tTaXplID0gK3g7CiAgICAgIG91dGVyVGlja1NpemUgPSArYXJndW1lbnRzW24gLSAxXTsKICAgICAgcmV0dXJuIGF4aXM7CiAgICB9OwogICAgYXhpcy5pbm5lclRpY2tTaXplID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbm5lclRpY2tTaXplOwogICAgICBpbm5lclRpY2tTaXplID0gK3g7CiAgICAgIHJldHVybiBheGlzOwogICAgfTsKICAgIGF4aXMub3V0ZXJUaWNrU2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0ZXJUaWNrU2l6ZTsKICAgICAgb3V0ZXJUaWNrU2l6ZSA9ICt4OwogICAgICByZXR1cm4gYXhpczsKICAgIH07CiAgICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrUGFkZGluZzsKICAgICAgdGlja1BhZGRpbmcgPSAreDsKICAgICAgcmV0dXJuIGF4aXM7CiAgICB9OwogICAgYXhpcy50aWNrU3ViZGl2aWRlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoICYmIGF4aXM7CiAgICB9OwogICAgcmV0dXJuIGF4aXM7CiAgfTsKICB2YXIgZDNfc3ZnX2F4aXNEZWZhdWx0T3JpZW50ID0gImJvdHRvbSIsIGQzX3N2Z19heGlzT3JpZW50cyA9IHsKICAgIHRvcDogMSwKICAgIHJpZ2h0OiAxLAogICAgYm90dG9tOiAxLAogICAgbGVmdDogMQogIH07CiAgZnVuY3Rpb24gZDNfc3ZnX2F4aXNYKHNlbGVjdGlvbiwgeCkgewogICAgc2VsZWN0aW9uLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHgoZCkgKyAiLDApIjsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBkM19zdmdfYXhpc1koc2VsZWN0aW9uLCB5KSB7CiAgICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyB5KGQpICsgIikiOwogICAgfSk7CiAgfQogIGQzLnN2Zy5icnVzaCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaChicnVzaCwgImJydXNoc3RhcnQiLCAiYnJ1c2giLCAiYnJ1c2hlbmQiKSwgeCA9IG51bGwsIHkgPSBudWxsLCB4RXh0ZW50ID0gWyAwLCAwIF0sIHlFeHRlbnQgPSBbIDAsIDAgXSwgeEV4dGVudERvbWFpbiwgeUV4dGVudERvbWFpbiwgeENsYW1wID0gdHJ1ZSwgeUNsYW1wID0gdHJ1ZSwgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbMF07CiAgICBmdW5jdGlvbiBicnVzaChnKSB7CiAgICAgIGcuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCAiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsICJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCIsIGJydXNoc3RhcnQpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIiwgYnJ1c2hzdGFydCk7CiAgICAgICAgdmFyIGJhY2tncm91bmQgPSBnLnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFsgMCBdKTsKICAgICAgICBiYWNrZ3JvdW5kLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCAiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCAiY3Jvc3NoYWlyIik7CiAgICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFsgMCBdKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwgImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpOwogICAgICAgIHZhciByZXNpemUgPSBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEocmVzaXplcywgZDNfaWRlbnRpdHkpOwogICAgICAgIHJlc2l6ZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgcmVzaXplLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICByZXR1cm4gInJlc2l6ZSAiICsgZDsKICAgICAgICB9KS5zdHlsZSgiY3Vyc29yIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgcmV0dXJuIGQzX3N2Z19icnVzaEN1cnNvcltkXTsKICAgICAgICB9KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgcmV0dXJuIC9bZXddJC8udGVzdChkKSA/IC0zIDogbnVsbDsKICAgICAgICB9KS5hdHRyKCJ5IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgcmV0dXJuIC9eW25zXS8udGVzdChkKSA/IC0zIDogbnVsbDsKICAgICAgICB9KS5hdHRyKCJ3aWR0aCIsIDYpLmF0dHIoImhlaWdodCIsIDYpLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIHJlc2l6ZS5zdHlsZSgiZGlzcGxheSIsIGJydXNoLmVtcHR5KCkgPyAibm9uZSIgOiBudWxsKTsKICAgICAgICB2YXIgZ1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24oZyksIGJhY2tncm91bmRVcGRhdGUgPSBkMy50cmFuc2l0aW9uKGJhY2tncm91bmQpLCByYW5nZTsKICAgICAgICBpZiAoeCkgewogICAgICAgICAgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHgpOwogICAgICAgICAgYmFja2dyb3VuZFVwZGF0ZS5hdHRyKCJ4IiwgcmFuZ2VbMF0pLmF0dHIoIndpZHRoIiwgcmFuZ2VbMV0gLSByYW5nZVswXSk7CiAgICAgICAgICByZWRyYXdYKGdVcGRhdGUpOwogICAgICAgIH0KICAgICAgICBpZiAoeSkgewogICAgICAgICAgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHkpOwogICAgICAgICAgYmFja2dyb3VuZFVwZGF0ZS5hdHRyKCJ5IiwgcmFuZ2VbMF0pLmF0dHIoImhlaWdodCIsIHJhbmdlWzFdIC0gcmFuZ2VbMF0pOwogICAgICAgICAgcmVkcmF3WShnVXBkYXRlKTsKICAgICAgICB9CiAgICAgICAgcmVkcmF3KGdVcGRhdGUpOwogICAgICB9KTsKICAgIH0KICAgIGJydXNoLmV2ZW50ID0gZnVuY3Rpb24oZykgewogICAgICBnLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGV2ZW50XyA9IGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cyksIGV4dGVudDEgPSB7CiAgICAgICAgICB4OiB4RXh0ZW50LAogICAgICAgICAgeTogeUV4dGVudCwKICAgICAgICAgIGk6IHhFeHRlbnREb21haW4sCiAgICAgICAgICBqOiB5RXh0ZW50RG9tYWluCiAgICAgICAgfSwgZXh0ZW50MCA9IHRoaXMuX19jaGFydF9fIHx8IGV4dGVudDE7CiAgICAgICAgdGhpcy5fX2NoYXJ0X18gPSBleHRlbnQxOwogICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7CiAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0LmJydXNoIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSBleHRlbnQwLmk7CiAgICAgICAgICAgIHlFeHRlbnREb21haW4gPSBleHRlbnQwLmo7CiAgICAgICAgICAgIHhFeHRlbnQgPSBleHRlbnQwLng7CiAgICAgICAgICAgIHlFeHRlbnQgPSBleHRlbnQwLnk7CiAgICAgICAgICAgIGV2ZW50Xyh7CiAgICAgICAgICAgICAgdHlwZTogImJydXNoc3RhcnQiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkudHdlZW4oImJydXNoOmJydXNoIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB4aSA9IGQzX2ludGVycG9sYXRlQXJyYXkoeEV4dGVudCwgZXh0ZW50MS54KSwgeWkgPSBkM19pbnRlcnBvbGF0ZUFycmF5KHlFeHRlbnQsIGV4dGVudDEueSk7CiAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSB5RXh0ZW50RG9tYWluID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgICB4RXh0ZW50ID0gZXh0ZW50MS54ID0geGkodCk7CiAgICAgICAgICAgICAgeUV4dGVudCA9IGV4dGVudDEueSA9IHlpKHQpOwogICAgICAgICAgICAgIGV2ZW50Xyh7CiAgICAgICAgICAgICAgICB0eXBlOiAiYnJ1c2giLAogICAgICAgICAgICAgICAgbW9kZTogInJlc2l6ZSIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pLmVhY2goImVuZC5icnVzaCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB4RXh0ZW50RG9tYWluID0gZXh0ZW50MS5pOwogICAgICAgICAgICB5RXh0ZW50RG9tYWluID0gZXh0ZW50MS5qOwogICAgICAgICAgICBldmVudF8oewogICAgICAgICAgICAgIHR5cGU6ICJicnVzaCIsCiAgICAgICAgICAgICAgbW9kZTogInJlc2l6ZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGV2ZW50Xyh7CiAgICAgICAgICAgICAgdHlwZTogImJydXNoZW5kIgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBldmVudF8oewogICAgICAgICAgICB0eXBlOiAiYnJ1c2hzdGFydCIKICAgICAgICAgIH0pOwogICAgICAgICAgZXZlbnRfKHsKICAgICAgICAgICAgdHlwZTogImJydXNoIiwKICAgICAgICAgICAgbW9kZTogInJlc2l6ZSIKICAgICAgICAgIH0pOwogICAgICAgICAgZXZlbnRfKHsKICAgICAgICAgICAgdHlwZTogImJydXNoZW5kIgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBmdW5jdGlvbiByZWRyYXcoZykgewogICAgICBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgeEV4dGVudFsrL2UkLy50ZXN0KGQpXSArICIsIiArIHlFeHRlbnRbKy9ecy8udGVzdChkKV0gKyAiKSI7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gcmVkcmF3WChnKSB7CiAgICAgIGcuc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsIHhFeHRlbnRbMF0pOwogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCwubj5yZWN0LC5zPnJlY3QiKS5hdHRyKCJ3aWR0aCIsIHhFeHRlbnRbMV0gLSB4RXh0ZW50WzBdKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlZHJhd1koZykgewogICAgICBnLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoInkiLCB5RXh0ZW50WzBdKTsKICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0IikuYXR0cigiaGVpZ2h0IiwgeUV4dGVudFsxXSAtIHlFeHRlbnRbMF0pOwogICAgfQogICAgZnVuY3Rpb24gYnJ1c2hzdGFydCgpIHsKICAgICAgdmFyIHRhcmdldCA9IHRoaXMsIGV2ZW50VGFyZ2V0ID0gZDMuc2VsZWN0KGQzLmV2ZW50LnRhcmdldCksIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwgZyA9IGQzLnNlbGVjdCh0YXJnZXQpLCByZXNpemluZyA9IGV2ZW50VGFyZ2V0LmRhdHVtKCksIHJlc2l6aW5nWCA9ICEvXihufHMpJC8udGVzdChyZXNpemluZykgJiYgeCwgcmVzaXppbmdZID0gIS9eKGV8dykkLy50ZXN0KHJlc2l6aW5nKSAmJiB5LCBkcmFnZ2luZyA9IGV2ZW50VGFyZ2V0LmNsYXNzZWQoImV4dGVudCIpLCBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcygpLCBjZW50ZXIsIG9yaWdpbiA9IGQzLm1vdXNlKHRhcmdldCksIG9mZnNldDsKICAgICAgdmFyIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KS5vbigia2V5ZG93bi5icnVzaCIsIGtleWRvd24pLm9uKCJrZXl1cC5icnVzaCIsIGtleXVwKTsKICAgICAgaWYgKGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7CiAgICAgICAgdy5vbigidG91Y2htb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKS5vbigidG91Y2hlbmQuYnJ1c2giLCBicnVzaGVuZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdy5vbigibW91c2Vtb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKS5vbigibW91c2V1cC5icnVzaCIsIGJydXNoZW5kKTsKICAgICAgfQogICAgICBnLmludGVycnVwdCgpLnNlbGVjdEFsbCgiKiIpLmludGVycnVwdCgpOwogICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICBvcmlnaW5bMF0gPSB4RXh0ZW50WzBdIC0gb3JpZ2luWzBdOwogICAgICAgIG9yaWdpblsxXSA9IHlFeHRlbnRbMF0gLSBvcmlnaW5bMV07CiAgICAgIH0gZWxzZSBpZiAocmVzaXppbmcpIHsKICAgICAgICB2YXIgZXggPSArL3ckLy50ZXN0KHJlc2l6aW5nKSwgZXkgPSArL15uLy50ZXN0KHJlc2l6aW5nKTsKICAgICAgICBvZmZzZXQgPSBbIHhFeHRlbnRbMSAtIGV4XSAtIG9yaWdpblswXSwgeUV4dGVudFsxIC0gZXldIC0gb3JpZ2luWzFdIF07CiAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFtleF07CiAgICAgICAgb3JpZ2luWzFdID0geUV4dGVudFtleV07CiAgICAgIH0gZWxzZSBpZiAoZDMuZXZlbnQuYWx0S2V5KSBjZW50ZXIgPSBvcmlnaW4uc2xpY2UoKTsKICAgICAgZy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCAibm9uZSIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IiwgbnVsbCk7CiAgICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBldmVudFRhcmdldC5zdHlsZSgiY3Vyc29yIikpOwogICAgICBldmVudF8oewogICAgICAgIHR5cGU6ICJicnVzaHN0YXJ0IgogICAgICB9KTsKICAgICAgYnJ1c2htb3ZlKCk7CiAgICAgIGZ1bmN0aW9uIGtleWRvd24oKSB7CiAgICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIpIHsKICAgICAgICAgIGlmICghZHJhZ2dpbmcpIHsKICAgICAgICAgICAgY2VudGVyID0gbnVsbDsKICAgICAgICAgICAgb3JpZ2luWzBdIC09IHhFeHRlbnRbMV07CiAgICAgICAgICAgIG9yaWdpblsxXSAtPSB5RXh0ZW50WzFdOwogICAgICAgICAgICBkcmFnZ2luZyA9IDI7CiAgICAgICAgICB9CiAgICAgICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGtleXVwKCkgewogICAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyICYmIGRyYWdnaW5nID09IDIpIHsKICAgICAgICAgIG9yaWdpblswXSArPSB4RXh0ZW50WzFdOwogICAgICAgICAgb3JpZ2luWzFdICs9IHlFeHRlbnRbMV07CiAgICAgICAgICBkcmFnZ2luZyA9IDA7CiAgICAgICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGJydXNobW92ZSgpIHsKICAgICAgICB2YXIgcG9pbnQgPSBkMy5tb3VzZSh0YXJnZXQpLCBtb3ZlZCA9IGZhbHNlOwogICAgICAgIGlmIChvZmZzZXQpIHsKICAgICAgICAgIHBvaW50WzBdICs9IG9mZnNldFswXTsKICAgICAgICAgIHBvaW50WzFdICs9IG9mZnNldFsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkcmFnZ2luZykgewogICAgICAgICAgaWYgKGQzLmV2ZW50LmFsdEtleSkgewogICAgICAgICAgICBpZiAoIWNlbnRlcikgY2VudGVyID0gWyAoeEV4dGVudFswXSArIHhFeHRlbnRbMV0pIC8gMiwgKHlFeHRlbnRbMF0gKyB5RXh0ZW50WzFdKSAvIDIgXTsKICAgICAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV07CiAgICAgICAgICAgIG9yaWdpblsxXSA9IHlFeHRlbnRbKyhwb2ludFsxXSA8IGNlbnRlclsxXSldOwogICAgICAgICAgfSBlbHNlIGNlbnRlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChyZXNpemluZ1ggJiYgbW92ZTEocG9pbnQsIHgsIDApKSB7CiAgICAgICAgICByZWRyYXdYKGcpOwogICAgICAgICAgbW92ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAocmVzaXppbmdZICYmIG1vdmUxKHBvaW50LCB5LCAxKSkgewogICAgICAgICAgcmVkcmF3WShnKTsKICAgICAgICAgIG1vdmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG1vdmVkKSB7CiAgICAgICAgICByZWRyYXcoZyk7CiAgICAgICAgICBldmVudF8oewogICAgICAgICAgICB0eXBlOiAiYnJ1c2giLAogICAgICAgICAgICBtb2RlOiBkcmFnZ2luZyA/ICJtb3ZlIiA6ICJyZXNpemUiCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbW92ZTEocG9pbnQsIHNjYWxlLCBpKSB7CiAgICAgICAgdmFyIHJhbmdlID0gZDNfc2NhbGVSYW5nZShzY2FsZSksIHIwID0gcmFuZ2VbMF0sIHIxID0gcmFuZ2VbMV0sIHBvc2l0aW9uID0gb3JpZ2luW2ldLCBleHRlbnQgPSBpID8geUV4dGVudCA6IHhFeHRlbnQsIHNpemUgPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sIG1pbiwgbWF4OwogICAgICAgIGlmIChkcmFnZ2luZykgewogICAgICAgICAgcjAgLT0gcG9zaXRpb247CiAgICAgICAgICByMSAtPSBzaXplICsgcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIG1pbiA9IChpID8geUNsYW1wIDogeENsYW1wKSA/IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgcG9pbnRbaV0pKSA6IHBvaW50W2ldOwogICAgICAgIGlmIChkcmFnZ2luZykgewogICAgICAgICAgbWF4ID0gKG1pbiArPSBwb3NpdGlvbikgKyBzaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoY2VudGVyKSBwb3NpdGlvbiA9IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgMiAqIGNlbnRlcltpXSAtIG1pbikpOwogICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbWluKSB7CiAgICAgICAgICAgIG1heCA9IG1pbjsKICAgICAgICAgICAgbWluID0gcG9zaXRpb247CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYXggPSBwb3NpdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGV4dGVudFswXSAhPSBtaW4gfHwgZXh0ZW50WzFdICE9IG1heCkgewogICAgICAgICAgaWYgKGkpIHlFeHRlbnREb21haW4gPSBudWxsOyBlbHNlIHhFeHRlbnREb21haW4gPSBudWxsOwogICAgICAgICAgZXh0ZW50WzBdID0gbWluOwogICAgICAgICAgZXh0ZW50WzFdID0gbWF4OwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGJydXNoZW5kKCkgewogICAgICAgIGJydXNobW92ZSgpOwogICAgICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IiwgYnJ1c2guZW1wdHkoKSA/ICJub25lIiA6IG51bGwpOwogICAgICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBudWxsKTsKICAgICAgICB3Lm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBudWxsKS5vbigibW91c2V1cC5icnVzaCIsIG51bGwpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCBudWxsKS5vbigidG91Y2hlbmQuYnJ1c2giLCBudWxsKS5vbigia2V5ZG93bi5icnVzaCIsIG51bGwpLm9uKCJrZXl1cC5icnVzaCIsIG51bGwpOwogICAgICAgIGRyYWdSZXN0b3KM3O9WKzUCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LetAAEAGfPLAqAc2wKgHYJUnH/Xbkng3OVV+rIAQDwgRaAAAAQEICgCjXskATaXEjNzvVkA1AgBdKAAAXSgAAGj3KB/SxQgAJ60eEwgARQAoTzeRQABABksxwKgHYMCoBzYf9ZUnOVV+rNuSeDeAGADtuCgAAAEBCAoATaXEAKNeyWUoKTsKICAgICAgICBldmVudF8oewogICAgICAgICAgdHlwZTogImJydXNoZW5kIgogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBicnVzaC54ID0gZnVuY3Rpb24oeikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4OwogICAgICB4ID0gejsKICAgICAgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbIXggPDwgMSB8ICF5XTsKICAgICAgcmV0dXJuIGJydXNoOwogICAgfTsKICAgIGJydXNoLnkgPSBmdW5jdGlvbih6KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7CiAgICAgIHkgPSB6OwogICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOwogICAgICByZXR1cm4gYnJ1c2g7CiAgICB9OwogICAgYnJ1c2guY2xhbXAgPSBmdW5jdGlvbih6KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHggJiYgeSA/IFsgeENsYW1wLCB5Q2xhbXAgXSA6IHggPyB4Q2xhbXAgOiB5ID8geUNsYW1wIDogbnVsbDsKICAgICAgaWYgKHggJiYgeSkgeENsYW1wID0gISF6WzBdLCB5Q2xhbXAgPSAhIXpbMV07IGVsc2UgaWYgKHgpIHhDbGFtcCA9ICEhejsgZWxzZSBpZiAoeSkgeUNsYW1wID0gISF6OwogICAgICByZXR1cm4gYnJ1c2g7CiAgICB9OwogICAgYnJ1c2guZXh0ZW50ID0gZnVuY3Rpb24oeikgewogICAgICB2YXIgeDAsIHgxLCB5MCwgeTEsIHQ7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgIGlmICh4KSB7CiAgICAgICAgICBpZiAoeEV4dGVudERvbWFpbikgewogICAgICAgICAgICB4MCA9IHhFeHRlbnREb21haW5bMF0sIHgxID0geEV4dGVudERvbWFpblsxXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHgwID0geEV4dGVudFswXSwgeDEgPSB4RXh0ZW50WzFdOwogICAgICAgICAgICBpZiAoeC5pbnZlcnQpIHgwID0geC5pbnZlcnQoeDApLCB4MSA9IHguaW52ZXJ0KHgxKTsKICAgICAgICAgICAgaWYgKHgxIDwgeDApIHQgPSB4MCwgeDAgPSB4MSwgeDEgPSB0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoeSkgewogICAgICAgICAgaWYgKHlFeHRlbnREb21haW4pIHsKICAgICAgICAgICAgeTAgPSB5RXh0ZW50RG9tYWluWzBdLCB5MSA9IHlFeHRlbnREb21haW5bMV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB5MCA9IHlFeHRlbnRbMF0sIHkxID0geUV4dGVudFsxXTsKICAgICAgICAgICAgaWYgKHkuaW52ZXJ0KSB5MCA9IHkuaW52ZXJ0KHkwKSwgeTEgPSB5LmludmVydCh5MSk7CiAgICAgICAgICAgIGlmICh5MSA8IHkwKSB0ID0geTAsIHkwID0geTEsIHkxID0gdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHggJiYgeSA/IFsgWyB4MCwgeTAgXSwgWyB4MSwgeTEgXSBdIDogeCA/IFsgeDAsIHgxIF0gOiB5ICYmIFsgeTAsIHkxIF07CiAgICAgIH0KICAgICAgaWYgKHgpIHsKICAgICAgICB4MCA9IHpbMF0sIHgxID0gelsxXTsKICAgICAgICBpZiAoeSkgeDAgPSB4MFswXSwgeDEgPSB4MVswXTsKICAgICAgICB4RXh0ZW50RG9tYWluID0gWyB4MCwgeDEgXTsKICAgICAgICBpZiAoeC5pbnZlcnQpIHgwID0geCh4MCksIHgxID0geCh4MSk7CiAgICAgICAgaWYgKHgxIDwgeDApIHQgPSB4MCwgeDAgPSB4MSwgeDEgPSB0OwogICAgICAgIGlmICh4MCAhPSB4RXh0ZW50WzBdIHx8IHgxICE9IHhFeHRlbnRbMV0pIHhFeHRlbnQgPSBbIHgwLCB4MSBdOwogICAgICB9CiAgICAgIGlmICh5KSB7CiAgICAgICAgeTAgPSB6WzBdLCB5MSA9IHpbMV07CiAgICAgICAgaWYgKHgpIHkwID0geTBbMV0sIHkxID0geTFbMV07CiAgICAgICAgeUV4dGVudERvbWFpbiA9IFsgeTAsIHkxIF07CiAgICAgICAgaWYgKHkuaW52ZXJ0KSB5MCA9IHkoeTApLCB5MSA9IHkoeTEpOwogICAgICAgIGlmICh5MSA8IHkwKSB0ID0geTAsIHkwID0geTEsIHkxID0gdDsKICAgICAgICBpZiAoeTAgIT0geUV4dGVudFswXSB8fCB5MSAhPSB5RXh0ZW50WzFdKSB5RXh0ZW50ID0gWyB5MCwgeTEgXTsKICAgICAgfQogICAgICByZXR1cm4gYnJ1c2g7CiAgICB9OwogICAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFicnVzaC5lbXB0eSgpKSB7CiAgICAgICAgeEV4dGVudCA9IFsgMCwgMCBdLCB5RXh0ZW50ID0gWyAwLCAwIF07CiAgICAgICAgeEV4dGVudERvbWFpbiA9IHlFeHRlbnREb21haW4gPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBicnVzaDsKICAgIH07CiAgICBicnVzaC5lbXB0eSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gISF4ICYmIHhFeHRlbnRbMF0gPT0geEV4dGVudFsxXSB8fCAhIXkgJiYgeUV4dGVudFswXSA9PSB5RXh0ZW50WzFdOwogICAgfTsKICAgIHJldHVybiBkMy5yZWJpbmQoYnJ1c2gsIGV2ZW50LCAib24iKTsKICB9OwogIHZhciBkM19zdmdfYnJ1c2hDdXJzb3IgPSB7CiAgICBuOiAibnMtcmVzaXplIiwKICAgIGU6ICJldy1yZXNpemUiLAogICAgczogIm5zLXJlc2l6ZSIsCiAgICB3OiAiZXctcmVzaXplIiwKICAgIG53OiAibndzZS1yZXNpemUiLAogICAgbmU6ICJuZXN3LXJlc2l6ZSIsCiAgICBzZTogIm53c2UtcmVzaXplIiwKICAgIHN3OiAibmVzdy1yZXNpemUiCiAgfTsKICB2YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsgWyAibiIsICJlIiwgInMiLCAidyIsICJudyIsICJuZSIsICJzZSIsICJzdyIgXSwgWyAiZSIsICJ3IiBdLCBbICJuIiwgInMiIF0sIFtdIF07CiAgdmFyIGQzX3RpbWVfZm9ybWF0ID0gZDNfdGltZS5mb3JtYXQgPSBkM19sb2NhbGVfZW5VUy50aW1lRm9ybWF0OwogIHZhciBkM190aW1lX2Zvcm1hdFV0YyA9IGQzX3RpbWVfZm9ybWF0LnV0YzsKICB2YXIgZDNfdGltZV9mb3JtYXRJc28gPSBkM190aW1lX2Zvcm1hdFV0YygiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7CiAgZDNfdGltZV9mb3JtYXQuaXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgJiYgK25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKSA/IGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlIDogZDNfdGltZV9mb3JtYXRJc287CiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUoZGF0ZSkgewogICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTsKICB9CiAgZDNfdGltZV9mb3JtYXRJc29OYXRpdmUucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsKICAgIHZhciBkYXRlID0gbmV3IERhdGUoc3RyaW5nKTsKICAgIHJldHVybiBpc05hTihkYXRlKSA/IG51bGwgOiBkYXRlOwogIH07CiAgZDNfdGltZV9mb3JtYXRJc29OYXRpdmUudG9TdHJpbmcgPSBkM190aW1lX2Zvcm1hdElzby50b1N0cmluZzsKICBkM190aW1lLnNlY29uZCA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIG5ldyBkM19kYXRlKE1hdGguZmxvb3IoZGF0ZSAvIDFlMykgKiAxZTMpOwogIH0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogMWUzKTsKICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICByZXR1cm4gZGF0ZS5nZXRTZWNvbmRzKCk7CiAgfSk7CiAgZDNfdGltZS5zZWNvbmRzID0gZDNfdGltZS5zZWNvbmQucmFuZ2U7CiAgZDNfdGltZS5zZWNvbmRzLnV0YyA9IGQzX3RpbWUuc2Vjb25kLnV0Yy5yYW5nZTsKICBkM190aW1lLm1pbnV0ZSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIG5ldyBkM19kYXRlKE1hdGguZmxvb3IoZGF0ZSAvIDZlNCkgKiA2ZTQpOwogIH0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogNmU0KTsKICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICByZXR1cm4gZGF0ZS5nZXRNaW51dGVzKCk7CiAgfSk7CiAgZDNfdGltZS5taW51dGVzID0gZDNfdGltZS5taW51dGUucmFuZ2U7CiAgZDNfdGltZS5taW51dGVzLnV0YyA9IGQzX3RpbWUubWludXRlLnV0Yy5yYW5nZTsKICBkM190aW1lLmhvdXIgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciB0aW1lem9uZSA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwOwogICAgcmV0dXJuIG5ldyBkM19kYXRlKChNYXRoLmZsb29yKGRhdGUgLyAzNmU1IC0gdGltZXpvbmUpICsgdGltZXpvbmUpICogMzZlNSk7CiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiAzNmU1KTsKICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpOwogIH0pOwogIGQzX3RpbWUuaG91cnMgPSBkM190aW1lLmhvdXIucmFuZ2U7CiAgZDNfdGltZS5ob3Vycy51dGMgPSBkM190aW1lLmhvdXIudXRjLnJhbmdlOwogIGQzX3RpbWUubW9udGggPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIGRhdGUgPSBkM190aW1lLmRheShkYXRlKTsKICAgIGRhdGUuc2V0RGF0ZSgxKTsKICAgIHJldHVybiBkYXRlOwogIH0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBvZmZzZXQpOwogIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCk7CiAgfSk7CiAgZDNfdGltZS5tb250aHMgPSBkM190aW1lLm1vbnRoLnJhbmdlOwogIGQzX3RpbWUubW9udGhzLnV0YyA9IGQzX3RpbWUubW9udGgudXRjLnJhbmdlOwogIGZ1bmN0aW9uIGQzX3RpbWVfc2NhbGUobGluZWFyLCBtZXRob2RzLCBmb3JtYXQpIHsKICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgICAgcmV0dXJuIGxpbmVhcih4KTsKICAgIH0KICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfc2NhbGVEYXRlKGxpbmVhci5pbnZlcnQoeCkpOwogICAgfTsKICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGluZWFyLmRvbWFpbigpLm1hcChkM190aW1lX3NjYWxlRGF0ZSk7CiAgICAgIGxpbmVhci5kb21haW4oeCk7CiAgICAgIHJldHVybiBzY2FsZTsKICAgIH07CiAgICBmdW5jdGlvbiB0aWNrTWV0aG9kKGV4dGVudCwgY291bnQpIHsKICAgICAgdmFyIHNwYW4gPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sIHRhcmdldCA9IHNwYW4gLyBjb3VudCwgaSA9IGQzLmJpc2VjdChkM190aW1lX3NjYWxlU3RlcHMsIHRhcmdldCk7CiAgICAgIHJldHVybiBpID09IGQzX3RpbWVfc2NhbGVTdGVwcy5sZW5ndGggPyBbIG1ldGhvZHMueWVhciwgZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGV4dGVudC5tYXAoZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiBkIC8gMzE1MzZlNjsKICAgICAgfSksIGNvdW50KVsyXSBdIDogIWkgPyBbIGQzX3RpbWVfc2NhbGVNaWxsaXNlY29uZHMsIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShleHRlbnQsIGNvdW50KVsyXSBdIDogbWV0aG9kc1t0YXJnZXQgLyBkM190aW1lX3NjYWxlU3RlcHNbaSAtIDFdIDwgZDNfdGltZV9zY2FsZVN0ZXBzW2ldIC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTsKICAgIH0KICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihpbnRlcnZhbCwgc2tpcCkgewogICAgICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluKCksIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGRvbWFpbiksIG1ldGhvZCA9IGludGVydmFsID09IG51bGwgPyB0aWNrTWV0aG9kKGV4dGVudCwgMTApIDogdHlwZW9mIGludGVydmFsID09PSAibnVtYmVyIiAmJiB0aWNrTWV0aG9kKGV4dGVudCwgaW50ZXJ2YWwpOwogICAgICBpZiAobWV0aG9kKSBpbnRlcnZhbCA9IG1ldGhvZFswXSwgc2tpcCA9IG1ldGhvZFsxXTsKICAgICAgZnVuY3Rpb24gc2tpcHBlZChkYXRlKSB7CiAgICAgICAgcmV0dXJuICFpc05hTihkYXRlKSAmJiAhaW50ZXJ2YWwucmFuZ2UoZGF0ZSwgZDNfdGltZV9zY2FsZURhdGUoK2RhdGUgKyAxKSwgc2tpcCkubGVuZ3RoOwogICAgICB9CiAgICAgIHJldHVybiBzY2FsZS5kb21haW4oZDNfc2NhbGVfbmljZShkb21haW4sIHNraXAgPiAxID8gewogICAgICAgIGZsb29yOiBmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgICB3aGlsZSAoc2tpcHBlZChkYXRlID0gaW50ZXJ2YWwuZmxvb3IoZGF0ZSkpKSBkYXRlID0gZDNfdGltZV9zY2FsZURhdGUoZGF0ZSAtIDEpOwogICAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgICAgfSwKICAgICAgICBjZWlsOiBmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgICB3aGlsZSAoc2tpcHBlZChkYXRlID0gaW50ZXJ2YWwuY2VpbChkYXRlKSkpIGRhdGUgPSBkM190aW1lX3NjYWxlRGF0ZSgrZGF0ZSArIDEpOwogICAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgICAgfQogICAgICB9IDogaW50ZXJ2YWwpKTsKICAgIH07CiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsLCBza2lwKSB7CiAgICAgIHZhciBleHRlbnQgPSBkM19zY2FsZUV4dGVudChzY2FsZS5kb21haW4oKSksIG1ldGhvZCA9IGludGVydmFsID09IG51bGwgPyB0aWNrTWV0aG9kKGV4dGVudCwgMTApIDogdHlwZW9mIGludGVydmFsID09PSAibnVtYmVyIiA/IHRpY2tNZXRob2QoZXh0ZW50LCBpbnRlcnZhbCkgOiAhaW50ZXJ2YWwucmFuZ2UgJiYgWyB7CiAgICAgICAgcmFuZ2U6IGludGVydmFsCiAgICAgIH0sIHNraXAgXTsKICAgICAgaWYgKG1ldGhvZCkgaW50ZXJ2YWwgPSBtZXRob2RbMF0sIHNraXAgPSBtZXRob2RbMV07CiAgICAgIHJldHVybiBpbnRlcnZhbC5yYW5nZShleHRlbnRbMF0sIGQzX3RpbWVfc2NhbGVEYXRlKCtleHRlbnRbMV0gKyAxKSwgc2tpcCA8IDEgPyAxIDogc2tpcCk7CiAgICB9OwogICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZm9ybWF0OwogICAgfTsKICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX3RpbWVfc2NhbGUobGluZWFyLmNvcHkoKSwgbWV0aG9kcywgZm9ybWF0KTsKICAgIH07CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpOwogIH0KICBmdW5jdGlvbiBkM190aW1lX3NjYWxlRGF0ZSh0KSB7CiAgICByZXR1cm4gbmV3IERhdGUodCk7CiAgfQogIHZhciBkM190aW1lX3NjYWxlU3RlcHMgPSBbIDFlMywgNWUzLCAxNWUzLCAzZTQsIDZlNCwgM2U1LCA5ZTUsIDE4ZTUsIDM2ZTUsIDEwOGU1LCAyMTZlNSwgNDMyZTUsIDg2NGU1LCAxNzI4ZTUsIDYwNDhlNSwgMjU5MmU2LCA3Nzc2ZTYsIDMxNTM2ZTYgXTsKICB2YXIgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcyA9IFsgWyBkM190aW1lLnNlY29uZCwgMSBdLCBbIGQzX3RpbWUuc2Vjb25kLCA1IF0sIFsgZDNfdGltZS5zZWNvbmQsIDE1IF0sIFsgZDNfdGltZS5zZWNvbmQsIDMwIF0sIFsgZDNfdGltZS5taW51dGUsIDEgXSwgWyBkM190aW1lLm1pbnV0ZSwgNSBdLCBbIGQzX3RpbWUubWludXRlLCAxNSBdLCBbIGQzX3RpbWUubWludXRlLCAzMCBdLCBbIGQzX3RpbWUuaG91ciwgMSBdLCBbIGQzX3RpbWUuaG91ciwgMyBdLCBbIGQzX3RpbWUuaG91ciwgNiBdLCBbIGQzX3RpbWUuaG91ciwgMTIgXSwgWyBkM190aW1lLmRheSwgMSBdLCBbIGQzX3RpbWUuZGF5LCAyIF0sIFsgZDNfdGltZS53ZWVrLCAxIF0sIFsgZDNfdGltZS5tb250aCwgMSBdLCBbIGQzX3RpbWUubW9udGgsIDMgXSwgWyBkM190aW1lLnllYXIsIDEgXSBdOwogIHZhciBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXQgPSBkM190aW1lX2Zvcm1hdC5tdWx0aShbIFsgIi4lTCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldE1pbGxpc2Vjb25kcygpOwogIH0gXSwgWyAiOiVTIiwgZnVuY3Rpb24oZCkgewogICAgcmV0dXJuIGQuZ2V0U2Vjb25kcygpOwogIH0gXSwgWyAiJUk6JU0iLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRNaW51dGVzKCk7CiAgfSBdLCBbICIlSSAlcCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldEhvdXJzKCk7CiAgfSBdLCBbICIlYSAlZCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldERheSgpICYmIGQuZ2V0RGF0ZSgpICE9IDE7CiAgfSBdLCBbICIlYiAlZCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldERhdGUoKSAhPSAxOwogIH0gXSwgWyAiJUIiLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRNb250aCgpOwogIH0gXSwgWyAiJVkiLCBkM190cnVlIF0gXSk7CiAgdmFyIGQzX3RpbWVfc2NhbGVNaWxsaXNlY29uZHMgPSB7CiAgICByYW5nZTogZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHsKICAgICAgcmV0dXJuIGQzLnJhbmdlKE1hdGguY2VpbChzdGFydCAvIHN0ZXApICogc3RlcCwgK3N0b3AsIHN0ZXApLm1hcChkM190aW1lX3NjYWxlRGF0ZSk7CiAgICB9LAogICAgZmxvb3I6IGQzX2lkZW50aXR5LAogICAgY2VpbDogZDNfaWRlbnRpdHkKICB9OwogIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMueWVhciA9IGQzX3RpbWUueWVhcjsKICBkM190aW1lLnNjYWxlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfdGltZV9zY2FsZShkMy5zY2FsZS5saW5lYXIoKSwgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcywgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0KTsKICB9OwogIHZhciBkM190aW1lX3NjYWxlVXRjTWV0aG9kcyA9IGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMubWFwKGZ1bmN0aW9uKG0pIHsKICAgIHJldHVybiBbIG1bMF0udXRjLCBtWzFdIF07CiAgfSk7CiAgdmFyIGQzX3RpbWVfc2NhbGVVdGNGb3JtYXQgPSBkM190aW1lX2Zvcm1hdFV0Yy5tdWx0aShbIFsgIi4lTCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldFVUQ01pbGxpc2Vjb25kcygpOwogIH0gXSwgWyAiOiVTIiwgZnVuY3Rpb24oZCkgewogICAgcmV0dXJuIGQuZ2V0VVRDU2Vjb25kcygpOwogIH0gXSwgWyAiJUk6JU0iLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRVVENNaW51dGVzKCk7CiAgfSBdLCBbICIlSSAlcCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldFVUQ0hvdXJzKCk7CiAgfSBdLCBbICIlYSAlZCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldFVUQ0RheSgpICYmIGQuZ2V0VVRDRGF0ZSgpICE9IDE7CiAgfSBdLCBbICIlYiAlZCIsIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBkLmdldFVUQ0RhdGUoKSAhPSAxOwogIH0gXSwgWyAiJUIiLCBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gZC5nZXRVVENNb250aCgpOwogIH0gXSwgWyAiJVkiLCBkM190cnVlIF0gXSk7CiAgZDNfdGltZV9zY2FsZVV0Y01ldGhvZHMueWVhciA9IGQzX3RpbWUueWVhci51dGM7CiAgZDNfdGltZS5zY2FsZS51dGMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM190aW1lX3NjYWxlKGQzLnNjYWxlLmxpbmVhcigpLCBkM190aW1lX3NjYWxlVXRjTWV0aG9kcywgZDNfdGltZV9zY2FsZVV0Y0Zvcm1hdCk7CiAgfTsKICBkMy50ZXh0ID0gZDNfeGhyVHlwZShmdW5jdGlvbihyZXF1ZXN0KSB7CiAgICByZXR1cm4gcmVxdWVzdC5yZXNwb25zZVRleHQ7CiAgfSk7CiAgZDMuanNvbiA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHsKICAgIHJldHVybiBkM194aHIodXJsLCAiYXBwbGljYXRpb24vanNvbiIsIGQzX2pzb24sIGNhbGxiYWNrKTsKICB9OwogIGZ1bmN0aW9uIGQzX2pzb24ocmVxdWVzdCkgewogICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpOwogIH0KICBkMy5odG1sID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogICAgcmV0dXJuIGQzX3hocih1cmwsICJ0ZXh0L2h0bWwiLCBkM19odG1sLCBjYWxsYmFjayk7CiAgfTsKICBmdW5jdGlvbiBkM19odG1sKHJlcXVlc3QpIHsKICAgIHZhciByYW5nZSA9IGQzX2RvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICByYW5nZS5zZWxlY3ROb2RlKGQzX2RvY3VtZW50LmJvZHkpOwogICAgcmV0dXJuIHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CiAgfQogIGQzLnhtbCA9IGQzX3hoclR5cGUoZnVuY3Rpb24ocmVxdWVzdCkgewogICAgcmV0dXJuIHJlcXVlc3QucmVzcG9uc2VYTUw7CiAgfSk7CiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKGQzKTsgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gIm9iamVjdCIgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZDM7CiAgdGhpcy5kMyA9IGQzOwp9KCk7DQqM3O9WbzUCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LexAAEAGfPHAqAc2wKgHYJUnH/Xbkng3OVWmx4AQDzPpIQAAAQEICgCjXskATaXEjNzvVhA2AgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOTeZQABABnM/wKgHYMCoBzYf9ZUnOVWmx9uSeDeAGADtkBIAAAEBCAoATaXEAKNeyTANCg0KjNzvVis2AgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3tQABABnzwwKgHNsCoB2CVJx/125J4NzlVpsyAEA8z6RwAAAEBCAoAo17JAE2lxIzc71auNwIAnQIAAJ0CAAAIACetHhNo9ygf0sUIAEUAAo8t7kAAQAZ6lMCoBzbAqAdglScf9duSeDc5VabMgBgPM3gVAAABAQgKAKNeyQBNpcRHRVQgL29ub3MvdWkvYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WxjgCAF0IAABdCAAAaPcoH9LFCAAnrR4TCABFAAhPkiNAAEAGEJ/AqAdgwKgHNh/1lSbjFSRwIA9pT4AYAPeYKAAAAQEICgBNpcUAo17ASFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo3OTcNCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTWFzdGhlYWQgLS0gQ1NTIGZpbGUKICovCgojbWFzdCB7CiAgICBoZWlnaHQ6IDM2cHg7CiAgICBwYWRkaW5nOiA0cHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Cn0KCmh0bWxbZGF0YS1wbGF0Zm9ybT0naVBhZCddICNtYXN0IHsKICAgIHBhZGRpbmctdG9wOiAxNnB4Owp9CgoubGlnaHQgI21hc3QgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2JiYjsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCAjNzc3Owp9Ci5kYXJrICNtYXN0IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggIzIyMjsKfQoKI21hc3QgLm5hdi1tZW51LWJ1dHRvbiB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmxpZ2h0ICNtYXN0IC5uYXYtbWVudS1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjbWFzdCAubmF2LW1lbnUtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM3Nzc7Cn0KCiNtYXN0IGltZy5sb2dvIHsKICAgIGhlaWdodDogMzhweDsKICAgIHBhZGRpbmctbGVmdDogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgojbWFzdCBpbWcubG9nbzpob3ZlciB7CiAgICAvKiBuZWVkIHNvbWV0aGluZyBiZXR0ZXIgKi8KICAgIC8qYmFja2dyb3VuZC1jb2xvcjogIzg4ODsqLwp9CgojbWFzdCAudGl0bGUgewogICAgZm9udC1zaXplOiAxNHB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgdmVydGljYWwtYWxpZ246IDEycHg7Cn0KCi5saWdodCAjbWFzdCAudGl0bGUgewogICAgY29sb3I6ICMzNjk7Cn0KLmRhcmsgI21hc3QgLnRpdGxlIHsKICAgIGNvbG9yOiAjZWVlOwp9CgojbWFzdC1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwYWRkaW5nLXRvcDogOHB4OwogICAgcGFkZGluZy1yaWdodDogMTZweDsKICAgIGZsb2F0OiByaWdodDsKICAgIC8qYm9yZGVyOiAxcHggc29saWQgcmVkOyovCn0KCiNtYXN0LXJpZ2h0IGEgewogICAgZm9udC1zaXplOiAxMnB0OwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5saWdodCAjbWFzdC1yaWdodCBhIHsKICAgIGNvbG9yOiAjMzY5Owp9Ci5kYXJrICNtYXN0LXJpZ2h0IGEgewogICAgY29sb3I6ICNlZWU7Cn0KCiNtYXN0LXJpZ2h0IGE6aG92ZXIgewogICAgY29sb3I6ICNDRTU2NTA7Cn0KDQqM3O9WAjkCADwAAAA8AAAACAAnrR4TaPcoH9LFCABFAAAozeBAAEAG3QjAqAc2wKgHYJUmH/UgD2lPAAAAAFAEAADhfwAAAAAAAAAAjNzvVrY+AgBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNO0QABABncAwKgHYMCoBzYf9ZUiQbkVMFh6fNOAEAFT8DUAAAEBCAoATaXFAKNexzdGRTgNCnNlZnVsIHdoZW4gJFEgaXMgdGhlIFByb21pc2UgaXRzZWxmLgogICAgICByZXR1cm4gbmV3IFEocmVzb2x2ZXIpOwogICAgfQoKICAgIHZhciBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpOwoKICAgIGZ1bmN0aW9uIHJlc29sdmVGbih2YWx1ZSkgewogICAgICBkZWZlcnJlZC5yZXNvbHZlKHZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWplY3RGbihyZWFzb24pIHsKICAgICAgZGVmZXJyZWQucmVqZWN0KHJlYXNvbik7CiAgICB9CgogICAgcmVzb2x2ZXIocmVzb2x2ZUZuLCByZWplY3RGbik7CgogICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CiAgfTsKCiAgJFEuZGVmZXIgPSBkZWZlcjsKICAkUS5yZWplY3QgPSByZWplY3Q7CiAgJFEud2hlbiA9IHdoZW47CiAgJFEuYWxsID0gYWxsOwoKICByZXR1cm4gJFE7Cn0KCmZ1bmN0aW9uICQkUkFGUHJvdmlkZXIoKSB7IC8vckFGCiAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgJyR0aW1lb3V0JywgZnVuY3Rpb24oJHdpbmRvdywgJHRpbWVvdXQpIHsKICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAkd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7CgogICAgdmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gJHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7CgogICAgdmFyIHJhZlN1cHBvcnRlZCA9ICEhcmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogICAgdmFyIHJhZiA9IHJhZlN1cHBvcnRlZAogICAgICA/IGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgICB2YXIgaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgOiBmdW5jdGlvbihmbikgewogICAgICAgICAgdmFyIHRpbWVyID0gJHRpbWVvdXQoZm4sIDE2LjY2LCBmYWxzZSk7IC8vIDEwMDAgLyA2MCA9IDE2LjY2NgogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkdGltZW91dC5jYW5jZWwodGltZXIpOwogICAgICAgICAgfTsKICAgICAgICB9OwoKICAgIHJhZi5zdXBwb3J0ZWQgPSByYWZTdXBwb3J0ZWQ7CgogICAgcmV0dXJuIHJhZjsKICB9XTsKfQoKLyoqCiAqIERFU0lHTiBOT1RFUwogKgogKiBUaGUgZGVzaWduIGRlY2lzaW9ucyBiZWhpbmQgdGhlIHNjb3BlIGFyZSBoZWF2aWx5IGZhdm9yZWQgZm9yIHNwZWVkIGFuZCBtZW1vcnkgY29uc3VtcHRpb24uCiAqCiAqIFRoZSB0eXBpY2FsIHVzZSBvZiBzY29wZSBpcyB0byB3YXRjaCB0aGUgZXhwcmVzc2lvbnMsIHdoaWNoIG1vc3Qgb2YgdGhlIHRpbWUgcmV0dXJuIHRoZSBzYW1lCiAqIHZhbHVlIGFzIGxhc3QgdGltZSBzbyB3ZSBvcHRpbWl6ZSB0aGUgb3BlcmF0aW9uLgogKgogKiBDbG9zdXJlcyBjb25zdHJ1Y3Rpb24gaXMgZXhwZW5zaXZlIGluIHRlcm1zIG9mIHNwZWVkIGFzIHdlbGwgYXMgbWVtb3J5OgogKiAgIC0gTm8gY2xvc3VyZXMsIGluc3RlYWQgdXNlIHByb3RvdHlwaWNhbCBpbmhlcml0YW5jZSBmb3IgQVBJCiAqICAgLSBJbnRlcm5hbCBzdGF0ZSBuZWVkcyB0byBiZSBzdG9yZWQgb24gc2NvcGUgZGlyZWN0bHksIHdoaWNoIG1lYW5zIHRoYXQgcHJpdmF0ZSBzdGF0ZSBpcwogKiAgICAgZXhwb3NlZCBhcyAkJF9fX18gcHJvcGVydGllcwogKgogKiBMb29wIG9wZXJhdGlvbnMgYXJlIG9wdGltaXplZCBieSB1c2luZyB3aGlsZShjb3VudC0tKSB7IC4uLiB9CiAqICAgLSB0aGlzIG1lYW5zIHRoYXQgaW4gb3JkZXIgdG8ga2VlcCB0aGUgc2FtZSBvcmRlciBvZiBleGVjdXRpb24gYXMgYWRkaXRpb24gd2UgaGF2ZSB0byBhZGQKICogICAgIGl0ZW1zIHRvIHRoZSBhcnJheSBhdCB0aGUgYmVnaW5uaW5nICh1bnNoaWZ0KSBpbnN0ZWFkIG9mIGF0IHRoZSBlbmQgKHB1c2gpCiAqCiAqIENoaWxkIHNjb3BlcyBhcmUgY3JlYXRlZCBhbmQgcmVtb3ZlZCBvZnRlbgogKiAgIC0gVXNpbmcgYW4gYXJyYXkgd291bGQgYmUgc2xvdyBzaW5jZSBpbnNlcnRzIGluIG1pZGRsZSBhcmUgZXhwZW5zaXZlIHNvIHdlIHVzZSBsaW5rZWQgbGlzdAogKgogKiBUaGVyZSBhcmUgZmV3IHdhdGNoZXMgdGhlbiBhIGxvdCBvZiBvYnNlcnZlcnMuIFRoaXMgaXMgd2h5IHlvdSBkb24ndCB3YW50IHRoZSBvYnNlcnZlciB0byBiZQogKiBpbXBsZW1lbnRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2F0Y2guIFdhdGNoIHJlcXVpcmVzIHJldHVybiBvZiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGljaAogKiBhcmUgZXhwZW5zaXZlIHRvIGNvbnN0cnVjdC4KICovCgoKLyoqCiAqIEBuZ2RvYyBwcm92aWRlcgogKiBAbmFtZSAkcm9vdFNjb3BlUHJvdmlkZXIKICogQGRlc2NyaXB0aW9uCiAqCiAqIFByb3ZpZGVyIGZvciB0aGUgJHJvb3RTY29wZSBzZXJ2aWNlLgogKi8KCi8qKgogKiBAbmdkb2MgbWV0aG9kCiAqIEBuYW1lICRyb290U2NvcGVQcm92aWRlciNkaWdlc3RUdGwKICogQGRlc2NyaXB0aW9uCiAqCiAqIFNldHMgdGhlIG51bWJlciBvZiBgJGRpZ2VzdGAgaXRlcmF0aW9ucyB0aGUgc2NvcGUgc2hvdWxkIGF0dGVtcHQgdG8gZXhlY3V0ZSBiZWZvcmUgZ2l2aW5nIHVwIGFuZAogKiBhc3N1bWluZyB0aGF0IHRoZSBtb2RlbCBpcyB1bnN0YWJsZS4KICoKICogVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyAxMCBpdGVyYXRpb25zLgogKgogKiBJbiBjb21wbGV4IGFwcGxpY2F0aW9ucyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGAkd2F0Y2hgcyB3aWxsIHJlc3VsdCBpbgogKiBzZXZlcmFsIGRpZ2VzdCBpdGVyYXRpb25zLiBIb3dldmVyIGlmIGFuIGFwcGxpY2F0aW9uIG5lZWRzIG1vcmUgdGhhbiB0aGUgZGVmYXVsdCAxMCBkaWdlc3QKICogaXRlcmF0aW9ucyBmb3IgaXRzIG1vZGVsIHRvIHN0YWJpbGl6ZSB0aGVuIHlvdSBzaG91bGQgaW52ZXN0aWdhdGUgd2hhdCBpcyBjYXVzaW5nIHRoZSBtb2RlbCB0bwogKiBjb250aW51b3VzbHkgY2hhbmdlIGR1cmluZyB0aGUgZGlnZXN0LgogKgogKiBJbmNyZWFzaW5nIHRoZSBUVEwgY291bGQgaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMsIHNvIHlvdSBzaG91bGQgbm90IGNoYW5nZSBpdCB3aXRob3V0CiAqIHByb3BlciBqdXN0aWZpY2F0aW9uLgogKgogKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIG51bWJlciBvZiBkaWdlc3QgaXRlcmF0aW9ucy4KICovCgoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRyb290U2NvcGUKICogQGRlc2NyaXB0aW9uCiAqCiAqIEV2ZXJ5IGFwcGxpY2F0aW9uIGhhcyBhIHNpbmdsZSByb290IHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIHNjb3BlfS4KICogQWxsIG90aGVyIHNjb3BlcyBhcmUgZGVzY2VuZGFudCBzY29wZXMgb2YgdGhlIHJvb3Qgc2NvcGUuIFNjb3BlcyBwcm92aWRlIHNlcGFyYXRpb24KICogYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSB2aWV3LCB2aWEgYSBtZWNoYW5pc20gZm9yIHdhdGNoaW5nIHRoZSBtb2RlbCBmb3IgY2hhbmdlcy4KICogVGhleSBhbHNvIHByb3ZpZGUgYW4gZXZlbnQgZW1pc3Npb24vYnJvYWRjYXN0IGFuZCBzdWJzY3JpcHRpb24gZmFjaWxpdHkuIFNlZSB0aGUKICoge0BsaW5rIGd1aWRlL3Njb3BlIGRldmVsb3BlciBndWlkZSBvbiBzY29wZXN9LgogKi8KZnVuY3Rpb24gJFJvb3RTY29wZVByb3ZpZGVyKCkgewogIHZhciBUVEwgPSAxMDsKICB2YXIgJHJvb3RTY29wZU1pbkVyciA9IG1pbkVycignJHJvb3RTY29wZScpOwogIHZhciBsYXN0RGlydHlXYXRjaCA9IG51bGw7CiAgdmFyIGFwcGx5QXN5bmNJZCA9IG51bGw7CgogIHRoaXMuZGlnZXN0VHRsID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIFRUTCA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIFRUTDsKICB9OwoKICB0aGlzLiRnZXQgPSBbJyRpbmplY3RvcicsICckZXhjZXB0aW9uSGFuZGxlcicsICckcGFyc2UnLCAnJGJyb3dzZXInLAogICAgICBmdW5jdGlvbigkaW5qZWN0b3IsICRleGNlcHRpb25IYW5kbGVyLCAkcGFyc2UsICRicm93c2VyKSB7CgogICAgLyoqCiAgICAgKiBAbmdkb2MgdHlwZQogICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZQogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogQSByb290IHNjb3BlIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlICRyb290U2NvcGV9IGtleSBmcm9tIHRoZQogICAgICoge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIENoaWxkIHNjb3BlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUKICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRuZXcgJG5ldygpfSBtZXRob2QuIChNb3N0IHNjb3BlcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4KICAgICAqIGNvbXBpbGVkIEhUTUwgdGVtcGxhdGUgaXMgZXhlY3V0ZWQuKQogICAgICoKICAgICAqIEhlcmUgaXMgYSBzaW1wbGUgc2NvcGUgc25pcHBldCB0byBzaG93IGhvdyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIHNjb3BlLgogICAgICogYGBgaHRtbAogICAgICogPGZpbGUgc3JjPSIuL3Rlc3Qvbmcvcm9vdFNjb3BlU3BlYy5qcyIgdGFnPSJkb2NzMSIgLz4KICAgICAqIGBgYAogICAgICoKICAgICAqICMgSW5oZXJpdGFuY2UKICAgICAqIEEgc2NvcGUgY2FuIGluaGVyaXQgZnJvbSBhIHBhcmVudCBzY29wZSwgYXMgaW4gdGhpcyBleGFtcGxlOgogICAgICogYGBganMKICAgICAgICAgdmFyIHBhcmVudCA9ICRyb290U2NvcGU7CiAgICAgICAgIHZhciBjaGlsZCA9IHBhcmVudC4kbmV3KCk7CgogICAgICAgICBwYXJlbnQuc2FsdXRhdGlvbiA9ICJIZWxsbyI7CiAgICAgICAgIGNoaWxkLm5hbWUgPSAiV29ybGQiOwogICAgICAgICBleHBlY3QoY2hpbGQuc2FsdXRhdGlvbikudG9FcXVhbCgnSGVsbG8nKTsKCiAgICAgICAgIGNoaWxkLnNhbHV0YXRpb24gPSAiV2VsY29tZSI7CiAgICAgICAgIGV4cGVjdChjaGlsZC5zYWx1dGF0aW9uKS50b0VxdWFsKCdXZWxjb21lJyk7CiAgICAgICAgIGV4cGVjdChwYXJlbnQuc2FsdXRhdGlvbikudG9FcXVhbCgnSGVsbG8nKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBgU2NvcGVgIGluIHRlc3RzLCBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzIGFyZSBhdmFpbGFibGUgb24gdGhlCiAgICAgKiBpbnN0YW5jZXMgb2YgYFNjb3BlYCB0eXBlLiBTZWUge0BsaW5rIG5nTW9jay4kcm9vdFNjb3BlLlNjb3BlIG5nTW9jayBTY29wZX0gZm9yIGFkZGl0aW9uYWwKICAgICAqIGRldGFpbHMuCiAgICAgKgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uKCk+PX0gcHJvdmlkZXJzIE1hcCBvZiBzZXJ2aWNlIGZhY3Rvcnkgd2hpY2ggbmVlZCB0byBiZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuIERlZmF1bHRzIHRvIHtAbGluayBuZ30uCiAgICAgKiBAcGFyYW0ge09iamVjdC48c3RyaW5nLCAqPj19IGluc3RhbmNlQ2FjaGUgUHJvdmlkZXMgcHJlLWluc3RhbnRpYXRlZCBzZXJ2aWNlcyB3aGljaCBzaG91bGQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kL292ZXJyaWRlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IGBwcm92aWRlcnNgLiBUaGlzIGlzIGhhbmR5CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdW5pdC10ZXN0aW5nIGFuZCBoYXZpbmcgdGhlIG5lZWQgdG8gb3ZlcnJpZGUgYSBkZWZhdWx0CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBOZXdseSBjcmVhdGVkIHNjb3BlLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gU2NvcGUoKSB7CiAgICAgIHRoaXMuJGlkID0gbmV4dFVpZCgpOwogICAgICB0aGlzLiQkcGhhc2UgPSB0aGlzLiRwYXJlbnQgPSB0aGlzLiQkd2F0Y2hlcnMgPQogICAgICAgICAgICAgICAgICAgICB0aGlzLiQkbmV4dFNpYmxpbmcgPSB0aGlzLiQkcHJldlNpYmxpbmcgPQogICAgICAgICAgICAgICAgICAgICB0aGlzLiQkY2hpbGRIZWFkID0gdGhpcy4kJGNoaWxkVGFpbCA9IG51bGw7CiAgICAgIHRoaXMuJHJvb3QgPSB0aGlzOwogICAgICB0aGlzLiQkZGVzdHJveWVkID0gZmFsc2U7CiAgICAgIHRoaXMuJCRsaXN0ZW5lcnMgPSB7fTsKICAgICAgdGhpcy4kJGxpc3RlbmVyQ291bnQgPSB7fTsKICAgICAgdGhpcy4kJGlzb2xhdGVCaW5kaW5ncyA9IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmdkb2MgcHJvcGVydHkKICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGlkCiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBVbmlxdWUgc2NvcGUgSUQgKG1vbm90b25pY2FsbHkgaW5jcmVhc2luZykgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCiAgICAgKi8KCiAgICAgLyoqCiAgICAgICogQG5nZG9jIHByb3BlcnR5CiAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkcGFyZW50CiAgICAgICoKICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBzY29wZS4KICAgICAgKi8KCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgcHJvcGVydHkKICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkcm9vdAogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogUmVmZXJlbmNlIHRvIHRoZSByb290IHNjb3BlLgogICAgICAgKi8KCiAgICBTY29wZS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBTY29wZSwKICAgICAgLyoqCiAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkbmV3CiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBDcmVhdGVzIGEgbmV3IGNoaWxkIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIHNjb3BlfS4KICAgICAgICoKICAgICAgICogVGhlIHBhcmVudCBzY29wZSB3aWxsIHByb3BhZ2F0ZSB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IGV2ZW50LgogICAgICAgKiBUaGUgc2NvcGUgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2NvcGUgaGllcmFyY2h5IHVzaW5nIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkZXN0cm95ICRkZXN0cm95KCl9LgogICAgICAgKgogICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveSAkZGVzdHJveSgpfSBtdXN0IGJlIGNhbGxlZCBvbiBhIHNjb3BlIHdoZW4gaXQgaXMKICAgICAgICogZGVzaXJlZCBmb3IgdGhlIHNjb3BlIGFuZCBpdHMgY2hpbGQgc2NvcGVzIHRvIGJlIHBlcm1hbmVudGx5IGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCBhbmQKICAgICAgICogdGh1cyBzdG9wIHBhcnRpY2lwYXRpbmcgaW4gbW9kZWwgY2hhbmdlIGRldGVjdGlvbiBhbmQgbGlzdGVuZXIgbm90aWZpY2F0aW9uIGJ5IGludm9raW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzb2xhdGUgSWYgdHJ1ZSwgdGhlbiB0aGUgc2NvcGUgZG9lcyBub3QgcHJvdG90eXBpY2FsbHkgaW5oZXJpdCBmcm9tIHRoZQogICAgICAgKiAgICAgICAgIHBhcmVudCBzY29wZS4gVGhlIHNjb3BlIGlzIGlzb2xhdGVkLCBhcyBpdCBjYW4gbm90IHNlZSBwYXJlbnQgc2NvcGUgcHJvcGVydGllcy4KICAgICAgICogICAgICAgICBXaGVuIGNyZWF0aW5nIHdpZGdldHMsIGl0IGlzIHVzZWZ1bCBmb3IgdGhlIHdpZGdldCB0byBub3QgYWNjaWRlbnRhbGx5IHJlYWQgcGFyZW50CiAgICAgICAqICAgICAgICAgc3RhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7U2NvcGV9IFtwYXJlbnQ9dGhpc10gVGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIGBTY29wZWB9IHRoYXQgd2lsbCBiZSB0aGUgYCRwYXJlbnRgCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgc2NvcGUuIERlZmF1bHRzIHRvIGB0aGlzYCBzY29wZSBpZiBub3QgcHJvdmlkZWQuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0cmFuc2NsdWRlIHNjb3BlIHRvIGNvcnJlY3RseSBwbGFjZSBpdAogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBzY29wZSBoaWVyYXJjaHkgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGNvcnJlY3QgcHJvdG90eXBpY2FsCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBuZXdseSBjcmVhdGVkIGNoaWxkIHNjb3BlLgogICAgICAgKgogICAgICAgKi8KICAgICAgJG5ldzogZnVuY3Rpb24oaXNvbGF0ZSwgcGFyZW50KSB7CiAgICAgICAgdmFyIGNoaWxkOwoKICAgICAgICBwYXJlbnQgPSBwYXJlbnQgfHwgdGhpczsKCiAgICAgICAgaWYgKGlzb2xhdGUpIHsKICAgICAgICAgIGNoaWxkID0gbmV3IFNjb3BlKCk7CiAgICAgICAgICBjaGlsZC4kcm9vdCA9IHRoaXMuJHJvb3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE9ubHkgY3JlYXRlIGEgY2hpbGQgc2NvcGUgY2xhc3MgaWYgc29tZWJvZHkgYXNrcyBmb3Igb25lLAogICAgICAgICAgLy8gYnV0IGNhY2hlIGl0IHRvIGFsbG93IHRoZSBWTSB0byBvcHRpbWl6ZSBsb29rdXBzLgogICAgICAgICAgaWYgKCF0aGlzLiQkQ2hpbGRTY29wZSkgewogICAgICAgICAgICB0aGlzLiQkQ2hpbGRTY29wZSA9IGZ1bmN0aW9uIENoaWxkU2NvcGUoKSB7CiAgICAgICAgICAgICAgdGhpcy4kJHdhdGNoZXJzID0gdGhpcy4kJG5leHRTaWJsaW5nID0KICAgICAgICAgICAgICAgICAgdGhpcy4kJGNoaWxkSGVhZCA9IHRoaXMuJCRjaGlsZFRhaWwgPSBudWxsOwogICAgICAgICAgICAgIHRoaXMuJCRsaXN0ZW5lcnMgPSB7fTsKICAgICAgICAgICAgICB0aGlzLiQkbGlzdGVuZXJDb3VudCA9IHt9OwogICAgICAgICAgICAgIHRoaXMuJGlkID0gbmV4dFVpZCgpOwogICAgICAgICAgICAgIHRoaXMuJCRDaGlsZFNjb3BlID0gbnVsbDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy4kJENoaWxkU2NvcGUucHJvdG90eXBlID0gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGNoaWxkID0gbmV3IHRoaXMuJCRDaGlsZFNjb3BlKCk7CiAgICAgICAgfQogICAgICAgIGNoaWxkLiRwYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgY2hpbGQuJCRwcmV2U2libGluZyA9IHBhcmVudC4kJGNoaWxkVGFpbDsKICAgICAgICBpZiAocGFyZW50LiQkY2hpbGRIZWFkKSB7CiAgICAgICAgICBwYXJlbnQuJCRjaGlsZFRhaWwuJCRuZXh0U2libGluZyA9IGNoaWxkOwogICAgICAgICAgcGFyZW50LiQkY2hpbGRUYWlsID0gY2hpbGQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhcmVudC4kJGNoaWxkSGVhZCA9IHBhcmVudC4kJGNoaWxkVGFpbCA9IGNoaWxkOwogICAgICAgIH0KCiAgICAgICAgLy8gV2hlbiB0aGUgbmV3IHNjb3BlIGlzIG5vdCBpc29sYXRlZCBvciB3ZSBpbmhlcml0IGZyb20gYHRoaXNgLCBhbmQKICAgICAgICAvLyB0aGUgcGFyZW50IHNjb3BlIGlzIGRlc3Ryb3llZCwgdGhlIHByb3BlcnR5IGAkJGRlc3Ryb3llZGAgaXMgaW5oZXJpdGVkCiAgICAgICAgLy8gcHJvdG90eXBpY2FsbHkuIEluIGFsbCBvdGhlciBjYXNlcywgdGhpcyBwcm9wZXJ0eSBuZWVkcyB0byBiZSBzZXQKICAgICAgICAvLyB3aGVuIHRoZSBwYXJlbnQgc2NvcGUgaXMgZGVzdHJveWVkLgogICAgICAgIC8vIFRoZSBsaXN0ZW5lciBuZWVkcyB0byBiZSBhZGRlZCBhZnRlciB0aGUgcGFyZW50IGlzIHNldAogICAgICAgIGlmIChpc29sYXRlIHx8IHBhcmVudCAhPSB0aGlzKSBjaGlsZC4kb24oJyRkZXN0cm95JywgZGVzdHJveUNoaWxkKTsKCiAgICAgICAgcmV0dXJuIGNoaWxkOwoKICAgICAgICBmdW5jdGlvbiBkZXN0cm95Q2hpbGQoKSB7CiAgICAgICAgICBjaGlsZC4kJGRlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkd2F0Y2gKICAgICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIFJlZ2lzdGVycyBhIGBsaXN0ZW5lcmAgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQgd2hlbmV2ZXIgdGhlIGB3YXRjaEV4cHJlc3Npb25gIGNoYW5nZXMuCiAgICAgICAqCiAgICAgICAqIC0gVGhlIGB3YXRjaEV4cHJlc3Npb25gIGlzIGNhbGxlZCBvbiBldmVyeSBjYWxsIHRvIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QKICAgICAgICogICAkZGlnZXN0KCl9IGFuZCBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgd2F0Y2hlZC4gKFNpbmNlCiAgICAgICAqICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IHJlcnVucyB3aGVuIGl0IGRldGVjdHMgY2hhbmdlcyB0aGUKICAgICAgICogICBgd2F0Y2hFeHByZXNzaW9uYCBjYW4gZXhlY3V0ZSBtdWx0aXBsZSB0aW1lcyBwZXIKICAgICAgICogICB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3QoKX0gYW5kIHNob3VsZCBiZSBpZGVtcG90ZW50LikKICAgICAgICogLSBUaGUgYGxpc3RlbmVyYCBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGB3YXRjaEV4cHJlc3Npb25gIGFuZCB0aGUKICAgICAgICogICBwcmV2aW91cyBjYWxsIHRvIGB3YXRjaEV4cHJlc3Npb25gIGFyZSBub3QgZXF1YWwgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgaW5pdGlhbCBydW4sCiAgICAgICAqICAgc2VlIGJlbG93KS4gSW5lcXVhbGl0eSBpcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byByZWZlcmVuY2UgaW5lcXVhbGl0eSwKICAgICAgICogICBbc3RyaWN0IGNvbXBhcmlzb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9Db21wYXJpc29uX09wZXJhdG9ycykKICAgICAgICogICAgdmlhIHRoZSBgIT09YCBKYXZhc2NyaXB0IG9wZXJhdG9yLCB1bmxlc3MgYG9iamVjdEVxdWFsaXR5ID09IHRydWVgCiAgICAgICAqICAgKHNlZSBuZXh0IHBvaW50KQogICAgICAgKiAtIFdoZW4gYG9iamVjdEVxdWFsaXR5ID09IHRydWVgLCBpbmVxdWFsaXR5IG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uYCBpcyBkZXRlcm1pbmVkCiAgICAgICAqICAgYWNjb3JkaW5nIHRvIHRoZSB7QGxpbmsgYW5ndWxhci5lcXVhbHN9IGZ1bmN0aW9uLiBUbyBzYXZlIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0IGZvcgogICAgICAgKiAgIGxhdGVyIGNvbXBhcmlzb24sIHRoZSB7QGxpbmsgYW5ndWxhci5jb3B5fSBmdW5jdGlvbiBpcyB1c2VkLiBUaGlzIHRoZXJlZm9yZSBtZWFucyB0aGF0CiAgICAgICAqICAgd2F0Y2hpbmcgY29tcGxleCBvYmplY3RzIHdpbGwgaGF2ZSBhZHZlcnNlIG1lbW9yeSBhbmQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgogICAgICAgKiAtIFRoZSB3YXRjaCBgbGlzdGVuZXJgIG1heSBjaGFuZ2UgdGhlIG1vZGVsLCB3aGljaCBtYXkgdHJpZ2dlciBvdGhlciBgbGlzdGVuZXJgcyB0byBmaXJlLgogICAgICAgKiAgIFRoaXMgaXMgYWNoaWV2ZWQgYnkgcmVydW5uaW5nIHRoZSB3YXRjaGVycyB1bnRpbCBubyBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4gVGhlIHJlcnVuCiAgICAgICAqICAgaXRlcmF0aW9uIGxpbWl0IGlzIDEwIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBkZWFkbG9jay4KICAgICAgICoKICAgICAgICoKICAgICAgICogSWYgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBpcyBjYWxsZWQsCiAgICAgICAqIHlvdSBjYW4gcmVnaXN0ZXIgYSBgd2F0Y2hFeHByZXNzaW9uYCBmdW5jdGlvbiB3aXRoIG5vIGBsaXN0ZW5lcmAuIChTaW5jZSBgd2F0Y2hFeHByZXNzaW9uYAogICAgICAgKiBjYW4gZXhlY3V0ZSBtdWx0aXBsZSB0aW1lcyBwZXIge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBjeWNsZSB3aGVuIGEKICAgICAgICogY2hhbmdlIGlzIGRldGVjdGVkLCBiZSBwcmVwYXJlZCBmb3IgbXVsdGlwbGUgY2FsbHMgdG8geW91ciBsaXN0ZW5lci4pCiAgICAgICAqCiAgICAgICAqIEFmdGVyIGEgd2F0Y2hlciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHNjb3BlLCB0aGUgYGxpc3RlbmVyYCBmbiBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkKICAgICAgICogKHZpYSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZXZhbEFzeW5jICRldmFsQXN5bmN9KSB0byBpbml0aWFsaXplIHRoZQogICAgICAgKiB3YXRjaGVyLiBJbiByYXJlIGNhc2VzLCB0aGlzIGlzIHVuZGVzaXJhYmxlIGJlY2F1c2UgdGhlIGxpc3RlbmVyIGlzIGNhbGxlZCB3aGVuIHRoZSByZXN1bHQKICAgICAgICogb2YgYHdhdGNoRXhwcmVzc2lvbmAgZGlkbid0IGNoYW5nZS4gVG8gZGV0ZWN0IHRoaXMgc2NlbmFyaW8gd2l0aGluIHRoZSBgbGlzdGVuZXJgIGZuLCB5b3UKICAgICAgICogY2FuIGNvbXBhcmUgdGhlIGBuZXdWYWxgIGFuZCBgb2xkVmFsYC4gSWYgdGhlc2UgdHdvIHZhbHVlcyBhcmUgaWRlbnRpY2FsIChgPT09YCkgdGhlbiB0aGUKICAgICAgICogbGlzdGVuZXIgd2FzIGNhbGxlZCBkdWUgdG8gaW5pdGlhbGl6YXRpb24uCiAgICAgICAqCiAgICAgICAqCiAgICAgICAqCiAgICAgICAqICMgRXhhbXBsZQogICAgICAgKiBgYGBqcwogICAgICAgICAgIC8vIGxldCdzIGFzc3VtZSB0aGF0IHNjb3BlIHdhcyBkZXBlbmRlbmN5IGluamVjdGVkIGFzIHRoZSAkcm9vdFNjb3BlCiAgICAgICAgICAgdmFyIHNjb3BlID0gJHJvb3RTY29wZTsKICAgICAgICAgICBzY29wZS5uYW1lID0gJ21pc2tvJzsKICAgICAgICAgICBzY29wZS5jb3VudGVyID0gMDsKCiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7CiAgICAgICAgICAgc2NvcGUuJHdhdGNoKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7CiAgICAgICAgICAgICBzY29wZS5jb3VudGVyID0gc2NvcGUuY291bnRlciArIDE7CiAgICAgICAgICAgfSk7CiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7CgogICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsKICAgICAgICAgICAvLyB0aGUgbGlzdGVuZXIgaXMgYWx3YXlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0ICRkaWdlc3QgbG9vcCBhZnRlciBpdCB3YXMgcmVnaXN0ZXJlZAogICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDEpOwoKICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7CiAgICAgICAgICAgLy8gYnV0IG5vdyBpdCB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIHRoZSB2YWx1ZSBjaGFuZ2VzCiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7CgogICAgICAgICAgIHNjb3BlLm5hbWUgPSAnYWRhbSc7CiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpOwogICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDIpOwoKCgogICAgICAgICAgIC8vIFVzaW5nIGEgZnVuY3Rpb24gYXMgYSB3YXRjaEV4cHJlc3Npb24KICAgICAgICAgICB2YXIgZm9vZDsKICAgICAgICAgICBzY29wZS5mb29kQ291bnRlciA9IDA7CiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmZvb2RDb3VudGVyKS50b0VxdWFsKDApOwogICAgICAgICAgIHNjb3BlLiR3YXRjaCgKICAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgYmVpbmcgd2F0Y2hlZC4gSXQgaXMgY2FsbGVkIGZvciBlYWNoIHR1cm4gb2YgdGhlICRkaWdlc3QgbG9vcAogICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBmb29kOyB9LAogICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2hhbmdlIGxpc3RlbmVyLCBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgYWJvdmUgZnVuY3Rpb24gY2hhbmdlcwogICAgICAgICAgICAgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7CiAgICAgICAgICAgICAgIGlmICggbmV3VmFsdWUgIT09IG9sZFZhbHVlICkgewogICAgICAgICAgICAgICAgIC8vIE9ubHkgaW5jcmVtZW50IHRoZSBjb3VudGVyIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgc2NvcGUuZm9vZENvdW50ZXIgPSBzY29wZS5mb29kQ291bnRlciArIDE7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICApOwogICAgICAgICAgIC8vIE5vIGRpZ2VzdCBoYXMgYmVlbiBydW4gc28gdGhlIGNvdW50ZXIgd2lsbCBiZSB6ZXJvCiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmZvb2RDb3VudGVyKS50b0VxdWFsKDApOwoKICAgICAgICAgICAvLyBSdW4gdGhlIGRpZ2VzdCBidXQgc2luY2UgZm9vZCBoYXMgbm90IGNoYW5nZWQgY291bnQgd2lsbCBzdGlsbCBiZSB6ZXJvCiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpOwogICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgwKTsKCiAgICAgICAgICAgLy8gVXBkYXRlIGZvb2QgYW5kIHJ1biBkaWdlc3QuICBOb3cgdGhlIGNvdW50ZXIgd2lsbCBpbmNyZW1lbnQKICAgICAgICAgICBmb29kID0gJ2NoZWVzZWJ1cmdlcic7CiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpOwogICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgxKTsKCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhmdW5jdGlvbigpfHN0cmluZyl9IHdhdGNoRXhwcmVzc2lvbiBFeHByZXNzaW9uIHRoYXQgaXMgZXZhbHVhdGVkIG9uIGVhY2gKICAgICAgICogICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBjeWNsZS4gQSBjaGFuZ2UgaW4gdGhlIHJldHVybiB2YWx1ZSB0cmlnZ2VycwogICAgICAgKiAgICBhIGNhbGwgdG8gdGhlIGBsaXN0ZW5lcmAuCiAgICAgICAqCiAgICAgICAqICAgIC0gYHN0cmluZ2A6IEV2YWx1YXRlZCBhcyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufQogICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBjYWxsZWQgd2l0aCBjdXJyZW50IGBzY29wZWAgYXMgYSBwYXJhbWV0ZXIuCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwsIHNjb3BlKX0gbGlzdGVuZXIgQ2FsbGJhY2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB2YWx1ZQogICAgICAgKiAgICBvZiBgd2F0Y2hFeHByZXNzaW9uYCBjaGFuZ2VzLgogICAgICAgKgogICAgICAgKiAgICAtIGBuZXdWYWxgIGNvbnRhaW5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uYAogICAgICAgKiAgICAtIGBvbGRWYWxgIGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbmAKICAgICAgICogICAgLSBgc2NvcGVgIHJlZmVycyB0byB0aGUgY3VycmVudCBzY29wZQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvYmplY3RFcXVhbGl0eSBDb21wYXJlIGZvciBvYmplY3QgZXF1YWxpdHkgdXNpbmcge0BsaW5rIGFuZ3VsYXIuZXF1YWxzfSBpbnN0ZWFkIG9mCiAgICAgICAqICAgICBjb21wYXJpbmcgZm9yIHJlZmVyZW5jZSBlcXVhbGl0eS4KICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyBsaXN0ZW5lci4KICAgICAgICovCiAgICAgICR3YXRjaDogZnVuY3Rpb24od2F0Y2hFeHAsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSkgewogICAgICAgIHZhciBnZXQgPSAkcGFyc2Uod2F0Y2hFeHApOwoKICAgICAgICBpZiAoZ2V0LiQkd2F0Y2hEZWxlZ2F0ZSkgewogICAgICAgICAgcmV0dXJuIGdldC4kJHdhdGNoRGVsZWdhdGUodGhpcywgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBnZXQpOwogICAgICAgIH0KICAgICAgICB2YXIgc2NvcGUgPSB0aGlzLAogICAgICAgICAgICBhcnJheSA9IHNjb3BlLiQkd2F0Y2hlcnMsCiAgICAgICAgICAgIHdhdGNoZXIgPSB7CiAgICAgICAgICAgICAgZm46IGxpc3RlbmVyLAogICAgICAgICAgICAgIGxhc3Q6IGluaXRXYXRjaFZhbCwKICAgICAgICAgICAgICBnZXQ6IGdldCwKICAgICAgICAgICAgICBleHA6IHdhdGNoRXhwLAogICAgICAgICAgICAgIGVxOiAhIW9iamVjdEVxdWFsaXR5CiAgICAgICAgICAgIH07CgogICAgICAgIGxhc3REaXJ0eVdhdGNoID0gbnVsbDsKCiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgewogICAgICAgICAgd2F0Y2hlci5mbiA9IG5vb3A7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWFycmF5KSB7CiAgICAgICAgICBhcnJheSA9IHNjb3BlLiQkd2F0Y2hlcnMgPSBbXTsKICAgICAgICB9CiAgICAgICAgLy8gd2UgdXNlIHVuc2hpZnQgc2luY2Ugd2UgdXNlIGEgd2hpbGUgbG9vcCBpbiAkZGlnZXN0IGZvciBzcGVlZC4KICAgICAgICAvLyB0aGUgd2hpbGUgbG9vcCByZWFkcyBpbiByZXZlcnNlIG9yZGVyLgogICAgICAgIGFycmF5LnVuc2hpZnQod2F0Y2hlcik7CgogICAgICAgIHJldHVybiBmdW5jdGlvbiBkZXJlZ2lzdGVyV2F0Y2goKSB7CiAgICAgICAgICBhcnJheVJlbW92ZShhcnJheSwgd2F0Y2hlcik7CiAgICAgICAgICBsYXN0RGlydHlXYXRjaCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJHdhdGNoR3JvdXAKICAgICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIEEgdmFyaWFudCBvZiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggJHdhdGNoKCl9IHdoZXJlIGl0IHdhdGNoZXMgYW4gYXJyYXkgb2YgYHdhdGNoRXhwcmVzc2lvbnNgLgogICAgICAgKiBJZiBhbnkgb25lIGV4cHJlc3Npb24gaW4gdGhlIGNvbGxlY3Rpb24gY2hhbmdlcyB0aGUgYGxpc3RlbmVyYCBpcyBleGVjdXRlZC4KICAgICAgICoKICAgICAgICogLSBUaGUgaXRlbXMgaW4gdGhlIGB3YXRjaEV4cHJlc3Npb25zYCBhcnJheSBhcmUgb2JzZXJ2ZWQgdmlhIHN0YW5kYXJkICR3YXRjaCBvcGVyYXRpb24gYW5kIGFyZSBleGFtaW5lZCBvbiBldmVyeQogICAgICAgKiAgIGNhbGwgdG8gJGRpZ2VzdCgpIHRvIHNlZSBpZiBhbnkgaXRlbXMgY2hhbmdlcy4KICAgICAgICogLSBUaGUgYGxpc3RlbmVyYCBpcyBjYWxsZWQgd2hlbmV2ZXIgYW55IGV4cHJlc3Npb24gaW4gdGhlIGB3YXRjaEV4cHJlc3Npb25zYCBhcnJheSBjaGFuZ2VzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmd8RnVuY3Rpb24oc2NvcGUpPn0gd2F0Y2hFeHByZXNzaW9ucyBBcnJheSBvZiBleHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgaW5kaXZpZHVhbGx5CiAgICAgICAqIHdhdGNoZWQgdXNpbmcge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoICR3YXRjaCgpfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ld1ZhbHVlcywgb2xkVmFsdWVzLCBzY29wZSl9IGxpc3RlbmVyIENhbGxiYWNrIGNhbGxlZCB3aGVuZXZlciB0aGUgcmV0dXJuIHZhbHVlIG9mIGFueQogICAgICAgKiAgICBleHByZXNzaW9uIGluIGB3YXRjaEV4cHJlc3Npb25zYCBjaGFuZ2VzCiAgICAgICAqICAgIFRoZSBgbmV3VmFsdWVzYCBhcnJheSBjb250YWlucyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGB3YXRjaEV4cHJlc3Npb25zYCwgd2l0aCB0aGUgaW5kZXhlcyBtYXRjaGluZwogICAgICAgKiAgICB0aG9zZSBvZiBgd2F0Y2hFeHByZXNzaW9uYAogICAgICAgKiAgICBhbmQgdGhlIGBvbGRWYWx1ZXNgIGFycmF5IGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgdGhlIGB3YXRjaEV4cHJlc3Npb25zYCwgd2l0aCB0aGUgaW5kZXhlcyBtYXRjaGluZwogICAgICAgKiAgICB0aG9zZSBvZiBgd2F0Y2hFeHByZXNzaW9uYAogICAgICAgKiAgICBUaGUgYHNjb3BlYCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuCiAgICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSBSZXR1cm5zIGEgZGUtcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciBhbGwgbGlzdGVuZXJzLgogICAgICAgKi8KICAgICAgJHdhdGNoR3JvdXA6IGZ1bmN0aW9uKHdhdGNoRXhwcmVzc2lvbnMsIGxpc3RlbmVyKSB7CiAgICAgICAgdmFyIG9sZFZhbHVlcyA9IG5ldyBBcnJheSh3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCk7CiAgICAgICAgdmFyIG5ld1ZhbHVlcyA9IG5ldyBBcnJheSh3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCk7CiAgICAgICAgdmFyIGRlcmVnaXN0ZXJGbnMgPSBbXTsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgdmFyIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgICAgdmFyIGZpcnN0UnVuID0gdHJ1ZTsKCiAgICAgICAgaWYgKCF3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCkgewogICAgICAgICAgLy8gTm8gZXhwcmVzc2lvbnMgbWVhbnMgd2UgY2FsbCB0aGUgbGlzdGVuZXIgQVNBUAogICAgICAgICAgdmFyIHNob3VsZENhbGwgPSB0cnVlOwogICAgICAgICAgc2VsZi4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoc2hvdWxkQ2FsbCkgbGlzdGVuZXIobmV3VmFsdWVzLCBuZXdWYWx1ZXMsIHNlbGYpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVyZWdpc3RlcldhdGNoR3JvdXAoKSB7CiAgICAgICAgICAgIHNob3VsZENhbGwgPSBmYWxzZTsKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAod2F0Y2hFeHByZXNzaW9ucy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBzaXplIG9mIG9uZQogICAgICAgICAgcmV0dXJuIHRoaXMuJHdhdGNoKHdhdGNoRXhwcmVzc2lvbnNbMF0sIGZ1bmN0aW9uIHdhdGNoR3JvdXBBY3Rpb24odmFsdWUsIG9sZFZhbHVlLCBzY29wZSkgewogICAgICAgICAgICBuZXdWYWx1ZXNbMF0gPSB2YWx1ZTsKICAgICAgICAgICAgb2xkVmFsdWVzWzBdID0gb2xkVmFsdWU7CiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgKHZhbHVlID09PSBvbGRWYWx1ZSkgPyBuZXdWYWx1ZXMgOiBvbGRWYWx1ZXMsIHNjb3BlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgZm9yRWFjaCh3YXRjaEV4cHJlc3Npb25zLCBmdW5jdGlvbihleHByLCBpKSB7CiAgICAgICAgICB2YXIgdW53YXRjaEZuID0gc2VsZi4kd2F0Y2goZXhwciwgZnVuY3Rpb24gd2F0Y2hHcm91cFN1YkFjdGlvbih2YWx1ZSwgb2xkVmFsdWUpIHsKICAgICAgICAgICAgbmV3VmFsdWVzW2ldID0gdmFsdWU7CiAgICAgICAgICAgIG9sZFZhbHVlc1tpXSA9IG9sZFZhbHVlOwogICAgICAgICAgICBpZiAoIWNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkKSB7CiAgICAgICAgICAgICAgY2hhbmdlUmVhY3Rpb25TY2hlZHVsZWQgPSB0cnVlOwogICAgICAgICAgICAgIHNlbGYuJGV2YWxBc3luYyh3YXRjaEdyb3VwQWN0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBkZXJlZ2lzdGVyRm5zLnB1c2godW53YXRjaEZuKTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gd2F0Y2hHcm91cEFjdGlvbigpIHsKICAgICAgICAgIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gZmFsc2U7CgogICAgICAgICAgaWYgKGZpcnN0UnVuKSB7CiAgICAgICAgICAgIGZpcnN0UnVuID0gZmFsc2U7CiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgbmV3VmFsdWVzLCBzZWxmKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgb2xkVmFsdWVzLCBzZWxmKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmdW5jdGlvbiBkZXJlZ2lzdGVyV2F0Y2hHcm91cCgpIHsKICAgICAgICAgIHdoaWxlIChkZXJlZ2lzdGVyRm5zLmxlbmd0aCkgewogICAgICAgICAgICBkZXJlZ2lzdGVyRm5zLnNoaWZ0KCkoKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAoKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJHdhdGNoQ29sbGVjdGlvbgogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogU2hhbGxvdyB3YXRjaGVzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmQgZmlyZXMgd2hlbmV2ZXIgYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGNoYW5nZQogICAgICAgKiAoZm9yIGFycmF5cywgdGhpcyBpbXBsaWVzIHdhdGNoaW5nIHRoZSBhcnJheSBpdGVtczsgZm9yIG9iamVjdCBtYXBzLCB0aGlzIGltcGxpZXMgd2F0Y2hpbmcKICAgICAgICogdGhlIHByb3BlcnRpZXMpLiBJZiBhIGNoYW5nZSBpcyBkZXRlY3RlZCwgdGhlIGBsaXN0ZW5lcmAgY2FsbGJhY2sgaXMgZmlyZWQuCiAgICAgICAqCiAgICAgICAqIC0gVGhlIGBvYmpgIGNvbGxlY3Rpb24gaXMgb2JzZXJ2ZWQgdmlhIHN0YW5kYXJkICR3YXRjaCBvcGVyYXRpb24gYW5kIGlzIGV4YW1pbmVkIG9uIGV2ZXJ5CiAgICAgICAqICAgY2FsbCB0byAkZGlnZXN0KCkgdG8gc2VlIGlmIGFueSBpdGVtcyBoYXZlIGJlZW4gYWRkZWQsIHJlbW92ZWQsIG9yIG1vdmVkLgogICAgICAgKiAtIFRoZSBgbGlzdGVuZXJgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnl0aGluZyB3aXRoaW4gdGhlIGBvYmpgIGhhcyBjaGFuZ2VkLiBFeGFtcGxlcyBpbmNsdWRlCiAgICAgICAqICAgYWRkaW5nLCByZW1vdmluZywgYW5kIG1vdmluZyBpdGVtcyBiZWxvbmdpbmcgdG8gYW4gb2JqZWN0IG9yIGFycmF5LgogICAgICAgKgogICAgICAgKgogICAgICAgKiAjIEV4YW1wbGUKICAgICAgICogYGBganMKICAgICAgICAgICRzY29wZS5uYW1lcyA9IFsnaWdvcicsICdtYXRpYXMnLCAnbWlza28nLCAnamFtZXMnXTsKICAgICAgICAgICRzY29wZS5kYXRhQ291bnQgPSA0OwoKICAgICAgICAgICRzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCduYW1lcycsIGZ1bmN0aW9uKG5ld05hbWVzLCBvbGROYW1lcykgewogICAgICAgICAgICAkc2NvcGUuZGF0YUNvdW50ID0gbmV3TmFtZXMubGVuZ3RoOwogICAgICAgICAgfSk7CgogICAgICAgICAgZXhwZWN0KCRzY29wZS5kYXRhQ291bnQpLnRvRXF1YWwoNCk7CiAgICAgICAgICAkc2NvcGUuJGRpZ2VzdCgpOwoKICAgICAgICAgIC8vc3RpbGwgYXQgNCAuLi4gbm8gY2hhbmdlcwogICAgICAgICAgZXhwZWN0KCRzY29wZS5kYXRhQ291bnQpLnRvRXF1YWwoNCk7CgogICAgICAgICAgJHNjb3BlLm5hbWVzLnBvcCgpOwogICAgICAgICAgJHNjb3BlLiRkaWdlc3QoKTsKCiAgICAgICAgICAvL25vdyB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UKICAgICAgICAgIGV4cGVjdCgkc2NvcGUuZGF0YUNvdW50KS50b0VxdWFsKDMpOwogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oc2NvcGUpfSBvYmogRXZhbHVhdGVkIGFzIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LiBUaGUKICAgICAgICogICAgZXhwcmVzc2lvbiB2YWx1ZSBzaG91bGQgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9yIGFuIGFycmF5IHdoaWNoIGlzIG9ic2VydmVkIG9uIGVhY2gKICAgICAgICogICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBjeWNsZS4gQW55IHNoYWxsb3cgY2hhbmdlIHdpdGhpbiB0aGUKICAgICAgICogICAgY29sbGVjdGlvbiB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIHRoZSBgbGlzdGVuZXJgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ld0NvbGxlY3Rpb24sIG9sZENvbGxlY3Rpb24sIHNjb3BlKX0gbGlzdGVuZXIgYSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQKICAgICAgICogICAgd2hlbiBhIGNoYW5nZSBpcyBkZXRlY3RlZC4KICAgICAgICogICAgLSBUaGUgYG5ld0NvbGxlY3Rpb25gIG9iamVjdCBpcyB0aGUgbmV3bHkgbW9kaWZpZWQgZGF0YSBvYnRhaW5lZCBmcm9tIHRoZSBgb2JqYCBleHByZXNzaW9uCiAgICAgICAqICAgIC0gVGhlIGBvbGRDb2xsZWN0aW9uYCBvYmplY3QgaXMgYSBjb3B5IG9mIHRoZSBmb3JtZXIgY29sbGVjdGlvbiBkYXRhLgogICAgICAgKiAgICAgIER1ZSB0byBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucywgdGhlYG9sZENvbGxlY3Rpb25gIHZhbHVlIGlzIGNvbXB1dGVkIG9ubHkgaWYgdGhlCiAgICAgICAqICAgICAgYGxpc3RlbmVyYCBmdW5jdGlvbiBkZWNsYXJlcyB0d28gb3IgbW9yZSBhcmd1bWVudHMuCiAgICAgICAqICAgIC0gVGhlIGBzY29wZWAgYXJndW1lbnQgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHNjb3BlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlLXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyBsaXN0ZW5lci4gV2hlbiB0aGUKICAgICAgICogICAgZGUtcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLCB0aGUgaW50ZXJuYWwgd2F0Y2ggb3BlcmF0aW9uIGlzIHRlcm1pbmF0ZWQuCiAgICAgICAqLwogICAgICAkd2F0Y2hDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmosIGxpc3RlbmVyKSB7CiAgICAgICAgJHdhdGNoQ29sbGVjdGlvbkludGVyY2VwdG9yLiRzdGF0ZWZ1bCA9IHRydWU7CgogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAvLyB0aGUgY3VycmVudCB2YWx1ZSwgdXBkYXRlZCBvbiBlYWNoIGRpcnR5LWNoZWNrIHJ1bgogICAgICAgIHZhciBuZXdWYWx1ZTsKICAgICAgICAvLyBhIHNoYWxsb3cgY29weSBvZiB0aGUgbmV3VmFsdWUgZnJvbSB0aGUgbGFzdCBkaXJ0eS1jaGVjayBydW4sCiAgICAgICAgLy8gdXBkYXRlZCB0byBtYXRjaCBuZXdWYWx1ZSBkdXJpbmcgZGlydHktY2hlY2sgcnVuCiAgICAgICAgdmFyIG9sZFZhbHVlOwogICAgICAgIC8vIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBuZXdWYWx1ZSBmcm9tIHdoZW4gdGhlIGxhc3QgY2hhbmdlIGhhcHBlbmVkCiAgICAgICAgdmFyIHZlcnlPbGRWYWx1ZTsKICAgICAgICAvLyBvbmx5IHRyYWNrIHZlcnlPbGRWYWx1ZSBpZiB0aGUgbGlzdGVuZXIgaXMgYXNraW5nIGZvciBpdAogICAgICAgIHZhciB0cmFja1ZlcnlPbGRWYWx1ZSA9IChsaXN0ZW5lci5sZW5ndGggPiAxKTsKICAgICAgICB2YXIgY2hhbmdlRGV0ZWN0ZWQgPSAwOwogICAgICAgIHZhciBjaGFuZ2VEZXRlY3RvciA9ICRwYXJzZShvYmosICR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvcik7CiAgICAgICAgdmFyIGludGVybmFsQXJyYXkgPSBbXTsKICAgICAgICB2YXIgaW50ZXJuYWxPYmplY3QgPSB7fTsKICAgICAgICB2YXIgaW5pdFJ1biA9IHRydWU7CiAgICAgICAgdmFyIG9sZExlbmd0aCA9IDA7CgogICAgICAgIGZ1bmN0aW9uICR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvcihfdmFsdWUpIHsKICAgICAgICAgIG5ld1ZhbHVlID0gX3ZhbHVlOwogICAgICAgICAgdmFyIG5ld0xlbmd0aCwga2V5LCBib3RoTmFOLCBuZXdJdGVtLCBvbGRJdGVtOwoKICAgICAgICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgdW5kZWZpbmVkLCB0aGVuIHJldHVybiB1bmRlZmluZWQgYXMgdGhlIHdhdGNoIG1heSBiZSBhIG9uZS10aW1lIHdhdGNoCiAgICAgICAgICBpZiAoaXNVbmRlZmluZWQobmV3VmFsdWUpKSByZXR1cm47CgogICAgICAgICAgaWYgKCFpc09iamVjdChuZXdWYWx1ZSkpIHsgLy8gaWYgcHJpbWl0aXZlCiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHsKICAgICAgICAgICAgICBvbGRWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUxpa2UobmV3VmFsdWUpKSB7CiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gaW50ZXJuYWxBcnJheSkgewogICAgICAgICAgICAgIC8vIHdlIGFyZSB0cmFuc2l0aW9uaW5nIGZyb20gc29tZXRoaW5nIHdoaWNoIHdhcyBub3QgYW4gYXJyYXkgaW50byBhcnJheS4KICAgICAgICAgICAgICBvbGRWYWx1ZSA9IGludGVybmFsQXJyYXk7CiAgICAgICAgICAgICAgb2xkTGWM3O9W5z8CAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/808VAAEAGt0/AqAdgwKgHNh/1lSJBuXVYWHp804AYAVOv1QAAAQEICgBNpcUAo17Hbmd0aCA9IG9sZFZhbHVlLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV3TGVuZ3RoID0gbmV3VmFsdWUubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKG9sZExlbmd0aCAhPT0gbmV3TGVuZ3RoKSB7CiAgICAgICAgICAgICAgLy8gaWYgbGVuZ3RocyBkbyBub3QgbWF0Y2ggd2UgbmVlZCB0byB0cmlnZ2VyIGNoYW5nZSBub3RpZmljYXRpb24KICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOwogICAgICAgICAgICAgIG9sZFZhbHVlLmxlbmd0aCA9IG9sZExlbmd0aCA9IG5ld0xlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjb3B5IHRoZSBpdGVtcyB0byBvbGRWYWx1ZSBhbmQgbG9vayBmb3IgY2hhbmdlcy4KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdMZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIG9sZEl0ZW0gPSBvbGRWYWx1ZVtpXTsKICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3VmFsdWVbaV07CgogICAgICAgICAgICAgIGJvdGhOYU4gPSAob2xkSXRlbSAhPT0gb2xkSXRlbSkgJiYgKG5ld0l0ZW0gIT09IG5ld0l0ZW0pOwogICAgICAgICAgICAgIGlmICghYm90aE5hTiAmJiAob2xkSXRlbSAhPT0gbmV3SXRlbSkpIHsKICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7CiAgICAgICAgICAgICAgICBvbGRWYWx1ZVtpXSA9IG5ld0l0ZW07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IGludGVybmFsT2JqZWN0KSB7CiAgICAgICAgICAgICAgLy8gd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBzb21ldGhpbmcgd2hpY2ggd2FzIG5vdCBhbiBvYmplY3QgaW50byBvYmplY3QuCiAgICAgICAgICAgICAgb2xkVmFsdWUgPSBpbnRlcm5hbE9iamVjdCA9IHt9OwogICAgICAgICAgICAgIG9sZExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjb3B5IHRoZSBpdGVtcyB0byBvbGRWYWx1ZSBhbmQgbG9vayBmb3IgY2hhbmdlcy4KICAgICAgICAgICAgbmV3TGVuZ3RoID0gMDsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbmV3VmFsdWUpIHsKICAgICAgICAgICAgICBpZiAobmV3VmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgbmV3TGVuZ3RoKys7CiAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3VmFsdWVba2V5XTsKICAgICAgICAgICAgICAgIG9sZEl0ZW0gPSBvbGRWYWx1ZVtrZXldOwoKICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gb2xkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgYm90aE5hTiA9IChvbGRJdGVtICE9PSBvbGRJdGVtKSAmJiAobmV3SXRlbSAhPT0gbmV3SXRlbSk7CiAgICAgICAgICAgICAgICAgIGlmICghYm90aE5hTiAmJiAob2xkSXRlbSAhPT0gbmV3SXRlbSkpIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOwogICAgICAgICAgICAgICAgICAgIG9sZFZhbHVlW2tleV0gPSBuZXdJdGVtOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBvbGRMZW5ndGgrKzsKICAgICAgICAgICAgICAgICAgb2xkVmFsdWVba2V5XSA9IG5ld0l0ZW07CiAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvbGRMZW5ndGggPiBuZXdMZW5ndGgpIHsKICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGhhdmUgbW9yZSBrZXlzLCBuZWVkIHRvIGZpbmQgdGhlbSBhbmQgZGVzdHJveSB0aGVtLgogICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7CiAgICAgICAgICAgICAgZm9yIChrZXkgaW4gb2xkVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICghbmV3VmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgICBvbGRMZW5ndGgtLTsKICAgICAgICAgICAgICAgICAgZGVsZXRlIG9sZFZhbHVlW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY2hhbmdlRGV0ZWN0ZWQ7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiAkd2F0Y2hDb2xsZWN0aW9uQWN0aW9uKCkgewogICAgICAgICAgaWYgKGluaXRSdW4pIHsKICAgICAgICAgICAgaW5pdFJ1biA9IGZhbHNlOwogICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSwgbmV3VmFsdWUsIHNlbGYpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUsIHZlcnlPbGRWYWx1ZSwgc2VsZik7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gbWFrZSBhIGNvcHkgZm9yIHRoZSBuZXh0IHRpbWUgYSBjb2xsZWN0aW9uIGlzIGNoYW5nZWQKICAgICAgICAgIGlmICh0cmFja1ZlcnlPbGRWYWx1ZSkgewogICAgICAgICAgICBpZiAoIWlzT2JqZWN0KG5ld1ZhbHVlKSkgewogICAgICAgICAgICAgIC8vcHJpbWl0aXZlCiAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlID0gbmV3VmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUxpa2UobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlID0gbmV3IEFycmF5KG5ld1ZhbHVlLmxlbmd0aCk7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdWYWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlW2ldID0gbmV3VmFsdWVbaV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgeyAvLyBpZiBvYmplY3QKICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWUgPSB7fTsKICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld1ZhbHVlLCBrZXkpKSB7CiAgICAgICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZVtrZXldID0gbmV3VmFsdWVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLiR3YXRjaChjaGFuZ2VEZXRlY3RvciwgJHdhdGNoQ29sbGVjdGlvbkFjdGlvbik7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QKICAgICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIFByb2Nlc3NlcyBhbGwgb2YgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCB3YXRjaGVyc30gb2YgdGhlIGN1cnJlbnQgc2NvcGUgYW5kCiAgICAgICAqIGl0cyBjaGlsZHJlbi4gQmVjYXVzZSBhIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCB3YXRjaGVyfSdzIGxpc3RlbmVyIGNhbiBjaGFuZ2UKICAgICAgICogdGhlIG1vZGVsLCB0aGUgYCRkaWdlc3QoKWAga2VlcHMgY2FsbGluZyB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXJzfQogICAgICAgKiB1bnRpbCBubyBtb3JlIGxpc3RlbmVycyBhcmUgZmlyaW5nLiBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGludG8gYW4gaW5maW5pdGUKICAgICAgICogbG9vcC4gVGhpcyBmdW5jdGlvbiB3aWxsIHRocm93IGAnTWF4aW11bSBpdGVyYXRpb24gbGltaXQgZXhjZWVkZWQuJ2AgaWYgdGhlIG51bWJlciBvZgogICAgICAgKiBpdGVyYXRpb25zIGV4Y2VlZHMgMTAuCiAgICAgICAqCiAgICAgICAqIFVzdWFsbHksIHlvdSBkb24ndCBjYWxsIGAkZGlnZXN0KClgIGRpcmVjdGx5IGluCiAgICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDb250cm9sbGVyIGNvbnRyb2xsZXJzfSBvciBpbgogICAgICAgKiB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgZGlyZWN0aXZlc30uCiAgICAgICAqIEluc3RlYWQsIHlvdSBzaG91bGQgY2FsbCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkYXBwbHkgJGFwcGx5KCl9ICh0eXBpY2FsbHkgZnJvbSB3aXRoaW4KICAgICAgICogYSB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgZGlyZWN0aXZlfSksIHdoaWNoIHdpbGwgZm9yY2UgYSBgJGRpZ2VzdCgpYC4KICAgICAgICoKICAgICAgICogSWYgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgYCRkaWdlc3QoKWAgaXMgY2FsbGVkLAogICAgICAgKiB5b3UgY2FuIHJlZ2lzdGVyIGEgYHdhdGNoRXhwcmVzc2lvbmAgZnVuY3Rpb24gd2l0aAogICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggJHdhdGNoKCl9IHdpdGggbm8gYGxpc3RlbmVyYC4KICAgICAgICoKICAgICAgICogSW4gdW5pdCB0ZXN0cywgeW91IG1heSBuZWVkIHRvIGNhbGwgYCRkaWdlc3QoKWAgdG8gc2ltdWxhdGUgdGhlIHNjb3BlIGxpZmUgY3ljbGUuCiAgICAgICAqCiAgICAgICAqICMgRXhhbXBsZQogICAgICAgKiBgYGBqcwogICAgICAgICAgIHZhciBzY29wZSA9IC4uLjsKICAgICAgICAgICBzY29wZS5uYW1lID0gJ21pc2tvJzsKICAgICAgICAgICBzY29wZS5jb3VudGVyID0gMDsKCiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7CiAgICAgICAgICAgc2NvcGUuJHdhdGNoKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7CiAgICAgICAgICAgICBzY29wZS5jb3VudGVyID0gc2NvcGUuY291bnRlciArIDE7CiAgICAgICAgICAgfSk7CiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7CgogICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsKICAgICAgICAgICAvLyB0aGUgbGlzdGVuZXIgaXMgYWx3YXlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0ICRkaWdlc3QgbG9vcCBhZnRlciBpdCB3YXMgcmVnaXN0ZXJlZAogICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDEpOwoKICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7CiAgICAgICAgICAgLy8gYnV0IG5vdyBpdCB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIHRoZSB2YWx1ZSBjaGFuZ2VzCiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7CgogICAgICAgICAgIHNjb3BlLm5hbWUgPSAnYWRhbSc7CiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpOwogICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDIpOwogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICovCiAgICAgICRkaWdlc3Q6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB3YXRjaCwgdmFsdWUsIGxhc3QsCiAgICAgICAgICAgIHdhdGNoZXJzLAogICAgICAgICAgICBsZW5ndGgsCiAgICAgICAgICAgIGRpcnR5LCB0dGwgPSBUVEwsCiAgICAgICAgICAgIG5leHQsIGN1cnJlbnQsIHRhcmdldCA9IHRoaXMsCiAgICAgICAgICAgIHdhdGNoTG9nID0gW10sCiAgICAgICAgICAgIGxvZ0lkeCwgbG9nTXNnLCBhc3luY1Rhc2s7CgogICAgICAgIGJlZ2luUGhhc2UoJyRkaWdlc3QnKTsKICAgICAgICAvLyBDaGVjayBmb3IgY2hhbmdlcyB0byBicm93c2VyIHVybCB0aGF0IGhhcHBlbmVkIGluIHN5bmMgYmVmb3JlIHRoZSBjYWxsIHRvICRkaWdlc3QKICAgICAgICAkYnJvd3Nlci4kJGNoZWNrVXJsQ2hhbmdlKCk7CgogICAgICAgIGlmICh0aGlzID09PSAkcm9vdFNjb3BlICYmIGFwcGx5QXN5bmNJZCAhPT0gbnVsbCkgewogICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBzY29wZSwgYW5kICRhcHBseUFzeW5jIGhhcyBzY2hlZHVsZWQgYSBkZWZlcnJlZCAkYXBwbHkoKSwgdGhlbgogICAgICAgICAgLy8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgJGFwcGx5IGFuZCBmbHVzaCB0aGUgcXVldWUgb2YgZXhwcmVzc2lvbnMgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAgJGJyb3dzZXIuZGVmZXIuY2FuY2VsKGFwcGx5QXN5bmNJZCk7CiAgICAgICAgICBmbHVzaEFwcGx5QXN5bmMoKTsKICAgICAgICB9CgogICAgICAgIGxhc3REaXJ0eVdhdGNoID0gbnVsbDsKCiAgICAgICAgZG8geyAvLyAid2hpbGUgZGlydHkiIGxvb3AKICAgICAgICAgIGRpcnR5ID0gZmFsc2U7CiAgICAgICAgICBjdXJyZW50ID0gdGFyZ2V0OwoKICAgICAgICAgIHdoaWxlIChhc3luY1F1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGFzeW5jVGFzayA9IGFzeW5jUXVldWUuc2hpZnQoKTsKICAgICAgICAgICAgICBhc3luY1Rhc2suc2NvcGUuJGV2YWwoYXN5bmNUYXNrLmV4cHJlc3Npb24pOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsOwogICAgICAgICAgfQoKICAgICAgICAgIHRyYXZlcnNlU2NvcGVzTG9vcDoKICAgICAgICAgIGRvIHsgLy8gInRyYXZlcnNlIHRoZSBzY29wZXMiIGxvb3AKICAgICAgICAgICAgaWYgKCh3YXRjaGVycyA9IGN1cnJlbnQuJCR3YXRjaGVycykpIHsKICAgICAgICAgICAgICAvLyBwcm9jZXNzIG91ciB3YXRjaGVzCiAgICAgICAgICAgICAgbGVuZ3RoID0gd2F0Y2hlcnMubGVuZ3RoOwogICAgICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgd2F0Y2ggPSB3YXRjaGVyc1tsZW5ndGhdOwogICAgICAgICAgICAgICAgICAvLyBNb3N0IGNvbW1vbiB3YXRjaGVzIGFyZSBvbiBwcmltaXRpdmVzLCBpbiB3aGljaCBjYXNlIHdlIGNhbiBzaG9ydAogICAgICAgICAgICAgICAgICAvLyBjaXJjdWl0IGl0IHdpdGggPT09IG9wZXJhdG9yLCBvbmx5IHdoZW4gPT09IGZhaWxzIGRvIHdlIHVzZSAuZXF1YWxzCiAgICAgICAgICAgICAgICAgIGlmICh3YXRjaCkgewogICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPSB3YXRjaC5nZXQoY3VycmVudCkpICE9PSAobGFzdCA9IHdhdGNoLmxhc3QpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICEod2F0Y2guZXEKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXF1YWxzKHZhbHVlLCBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGFzdCA9PT0gJ251bWJlcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzTmFOKHZhbHVlKSAmJiBpc05hTihsYXN0KSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICBsYXN0RGlydHlXYXRjaCA9IHdhdGNoOwogICAgICAgICAgICAgICAgICAgICAgd2F0Y2gubGFzdCA9IHdhdGNoLmVxID8gY29weSh2YWx1ZSwgbnVsbCkgOiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLmZuKHZhbHVlLCAoKGxhc3QgPT09IGluaXRXYXRjaFZhbCkgPyB2YWx1ZSA6IGxhc3QpLCBjdXJyZW50KTsKICAgICAgICAgICAgICAgICAgICAgIGlmICh0dGwgPCA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0lkeCA9IDQgLSB0dGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2F0Y2hMb2dbbG9nSWR4XSkgd2F0Y2hMb2dbbG9nSWR4XSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB3YXRjaExvZ1tsb2dJZHhdLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgIG1zZzogaXNGdW5jdGlvbih3YXRjaC5leHApID8gJ2ZuOiAnICsgKHdhdGNoLmV4cC5uYW1lIHx8IHdhdGNoLmV4cC50b1N0cmluZygpKSA6IHdhdGNoLmV4cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWw6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFZhbDogbGFzdAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdhdGNoID09PSBsYXN0RGlydHlXYXRjaCkgewogICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIA0KjNzvVgZAAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDw+QABABm6fwKgHNsCoB2CVIh/1WHp800G5dViAEAu6lCUAAAEBCAoAo17KAE2lxYzc71axQAIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8P0AAQAZunsCoBzbAqAdglSIf9Vh6fNNBuZUggBAL8HQnAAABAQgKAKNeygBNpcWM3O9WSUECAGpgAABqYAAAaPcoH9LFCAAnrR4TCABFAGBc08tAAEAGdunAqAdgwKgHNh/1lSJBuZUgWHp804AQAVPwNQAAAQEICgBNpcUAo17KN0ZFOA0KbW9zdCByZWNlbnRseSBkaXJ0eSB3YXRjaGVyIGlzIG5vdyBjbGVhbiwgc2hvcnQgY2lyY3VpdCBzaW5jZSB0aGUgcmVtYWluaW5nIHdhdGNoZXJzCiAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGFscmVhZHkgYmVlbiB0ZXN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdHJhdmVyc2VTY29wZXNMb29wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEluc2FuaXR5IFdhcm5pbmc6IHNjb3BlIGRlcHRoLWZpcnN0IHRyYXZlcnNhbAogICAgICAgICAgICAvLyB5ZXMsIHRoaXMgY29kZSBpcyBhIGJpdCBjcmF6eSwgYnV0IGl0IHdvcmtzIGFuZCB3ZSBoYXZlIHRlc3RzIHRvIHByb3ZlIGl0IQogICAgICAgICAgICAvLyB0aGlzIHBpZWNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdHJhdmVyc2FsIGluICRicm9hZGNhc3QKICAgICAgICAgICAgaWYgKCEobmV4dCA9IChjdXJyZW50LiQkY2hpbGRIZWFkIHx8CiAgICAgICAgICAgICAgICAoY3VycmVudCAhPT0gdGFyZ2V0ICYmIGN1cnJlbnQuJCRuZXh0U2libGluZykpKSkgewogICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9PSB0YXJnZXQgJiYgIShuZXh0ID0gY3VycmVudC4kJG5leHRTaWJsaW5nKSkgewogICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuJHBhcmVudDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gbmV4dCkpOwoKICAgICAgICAgIC8vIGBicmVhayB0cmF2ZXJzZVNjb3Blc0xvb3A7YCB0YWtlcyB1cyB0byBoZXJlCgogICAgICAgICAgaWYgKChkaXJ0eSB8fCBhc3luY1F1ZXVlLmxlbmd0aCkgJiYgISh0dGwtLSkpIHsKICAgICAgICAgICAgY2xlYXJQaGFzZSgpOwogICAgICAgICAgICB0aHJvdyAkcm9vdFNjb3BlTWluRXJyKCdpbmZkaWcnLAogICAgICAgICAgICAgICAgJ3swfSAkZGlnZXN0KCkgaXRlcmF0aW9ucyByZWFjaGVkLiBBYm9ydGluZyFcbicgKwogICAgICAgICAgICAgICAgJ1dhdGNoZXJzIGZpcmVkIGluIHRoZSBsYXN0IDUgaXRlcmF0aW9uczogezF9JywKICAgICAgICAgICAgICAgIFRUTCwgd2F0Y2hMb2cpOwogICAgICAgICAgfQoKICAgICAgICB9IHdoaWxlIChkaXJ0eSB8fCBhc3luY1F1ZXVlLmxlbmd0aCk7CgogICAgICAgIGNsZWFyUGhhc2UoKTsKCiAgICAgICAgd2hpbGUgKHBvc3REaWdlc3RRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBvc3REaWdlc3RRdWV1ZS5zaGlmdCgpKCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCgogICAgICAvKioKICAgICAgICogQG5nZG9jIGV2ZW50CiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGRlc3Ryb3kKICAgICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gc2NvcGUgYmVpbmcgZGVzdHJveWVkCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBCcm9hZGNhc3RlZCB3aGVuIGEgc2NvcGUgYW5kIGl0cyBjaGlsZHJlbiBhcmUgYmVpbmcgZGVzdHJveWVkLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQsIGluIEFuZ3VsYXJKUywgdGhlcmUgaXMgYWxzbyBhIGAkZGVzdHJveWAgalF1ZXJ5IGV2ZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0bwogICAgICAgKiBjbGVhbiB1cCBET00gYmluZGluZ3MgYmVmb3JlIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uCiAgICAgICAqLwoKICAgICAgLyoqCiAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveQogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBzY29wZSAoYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4pIGZyb20gdGhlIHBhcmVudCBzY29wZS4gUmVtb3ZhbCBpbXBsaWVzCiAgICAgICAqIHRoYXQgY2FsbHMgdG8ge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IHdpbGwgbm8gbG9uZ2VyCiAgICAgICAqIHByb3BhZ2F0ZSB0byB0aGUgY3VycmVudCBzY29wZSBhbmQgaXRzIGNoaWxkcmVuLiBSZW1vdmFsIGFsc28gaW1wbGllcyB0aGF0IHRoZSBjdXJyZW50CiAgICAgICAqIHNjb3BlIGlzIGVsaWdpYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCiAgICAgICAqCiAgICAgICAqIFRoZSBgJGRlc3Ryb3koKWAgaXMgdXN1YWxseSB1c2VkIGJ5IGRpcmVjdGl2ZXMgc3VjaCBhcwogICAgICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IG5nUmVwZWF0fSBmb3IgbWFuYWdpbmcgdGhlCiAgICAgICAqIHVucm9sbGluZyBvZiB0aGUgbG9vcC4KICAgICAgICoKICAgICAgICogSnVzdCBiZWZvcmUgYSBzY29wZSBpcyBkZXN0cm95ZWQsIGEgYCRkZXN0cm95YCBldmVudCBpcyBicm9hZGNhc3RlZCBvbiB0aGlzIHNjb3BlLgogICAgICAgKiBBcHBsaWNhdGlvbiBjb2RlIGNhbiByZWdpc3RlciBhIGAkZGVzdHJveWAgZXZlbnQgaGFuZGxlciB0aGF0IHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0bwogICAgICAgKiBwZXJmb3JtIGFueSBuZWNlc3NhcnkgY2xlYW51cC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0LCBpbiBBbmd1bGFySlMsIHRoZXJlIGlzIGFsc28gYSBgJGRlc3Ryb3lgIGpRdWVyeSBldmVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8KICAgICAgICogY2xlYW4gdXAgRE9NIGJpbmRpbmdzIGJlZm9yZSBhbiBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLgogICAgICAgKi8KICAgICAgJGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIHdlIGNhbid0IGRlc3Ryb3kgdGhlIHJvb3Qgc2NvcGUgb3IgYSBzY29wZSB0aGF0IGhhcyBiZWVuIGFscmVhZHkgZGVzdHJveWVkCiAgICAgICAgaWYgKHRoaXMuJCRkZXN0cm95ZWQpIHJldHVybjsKICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50OwoKICAgICAgICB0aGlzLiRicm9hZGNhc3QoJyRkZXN0cm95Jyk7CiAgICAgICAgdGhpcy4kJGRlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMgPT09ICRyb290U2NvcGUpIHJldHVybjsKCiAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHRoaXMuJCRsaXN0ZW5lckNvdW50KSB7CiAgICAgICAgICBkZWNyZW1lbnRMaXN0ZW5lckNvdW50KHRoaXMsIHRoaXMuJCRsaXN0ZW5lckNvdW50W2V2ZW50TmFtZV0sIGV2ZW50TmFtZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZXZlciBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gcGFyZW50IHNjb3BlcyAoYWZ0ZXIgdGhpcyBjbGVhbnVwLCB0aGUgY3VycmVudCBzY29wZSBzaG91bGQKICAgICAgICAvLyBub3QgYmUgcmV0YWluZWQgYnkgYW55IG9mIG91ciByZWZlcmVuY2VzIGFuZCBzaG91bGQgYmUgZWxpZ2libGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbikKICAgICAgICBpZiAocGFyZW50LiQkY2hpbGRIZWFkID09IHRoaXMpIHBhcmVudC4kJGNoaWxkSGVhZCA9IHRoaXMuJCRuZXh0U2libGluZzsKICAgICAgICBpZiAocGFyZW50LiQkY2hpbGRUYWlsID09IHRoaXMpIHBhcmVudC4kJGNoaWxkVGFpbCA9IHRoaXMuJCRwcmV2U2libGluZzsKICAgICAgICBpZiAodGhpcy4kJHByZXZTaWJsaW5nKSB0aGlzLiQkcHJldlNpYmxpbmcuJCRuZXh0U2libGluZyA9IHRoaXMuJCRuZXh0U2libGluZzsKICAgICAgICBpZiAodGhpcy4kJG5leHRTaWJsaW5nKSB0aGlzLiQkbmV4dFNpYmxpbmcuJCRwcmV2U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZzsKCiAgICAgICAgLy8gRGlzYWJsZSBsaXN0ZW5lcnMsIHdhdGNoZXJzIGFuZCBhcHBseS9kaWdlc3QgbWV0aG9kcwogICAgICAgIHRoaXMuJGRlc3Ryb3kgPSB0aGlzLiRkaWdlc3QgPSB0aGlzLiRhcHBseSA9IHRoaXMuJGV2YWxBc3luYyA9IHRoaXMuJGFwcGx5QXN5bmMgPSBub29wOwogICAgICAgIHRoaXMuJG9uID0gdGhpcy4kd2F0Y2ggPSB0aGlzLiR3YXRjaEdyb3VwID0gZnVuY3Rpb24oKSB7IHJldHVybiBub29wOyB9OwogICAgICAgIHRoaXMuJCRsaXN0ZW5lcnMgPSB7fTsKCiAgICAgICAgLy8gQWxsIG9mIHRoZSBjb2RlIGJlbG93IGlzIGJvZ3VzIGNvZGUgdGhhdCB3b3JrcyBhcm91bmQgVjgncyBtZW1vcnkgbGVhayB2aWEgb3B0aW1pemVkIGNvZGUKICAgICAgICAvLyBhbmQgaW5saW5lIGNhY2hlcy4KICAgICAgICAvLwogICAgICAgIC8vIHNlZToKICAgICAgICAvLyAtIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDczI2MyNgogICAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvNjc5NCNpc3N1ZWNvbW1lbnQtMzg2NDg5MDkKICAgICAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzEzMTMjaXNzdWVjb21tZW50LTEwMzc4NDUxCgogICAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJCRuZXh0U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZyA9IHRoaXMuJCRjaGlsZEhlYWQgPQogICAgICAgICAgICB0aGlzLiQkY2hpbGRUYWlsID0gdGhpcy4kcm9vdCA9IHRoaXMuJCR3YXRjaGVycyA9IG51bGw7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRldmFsCiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBFeGVjdXRlcyB0aGUgYGV4cHJlc3Npb25gIG9uIHRoZSBjdXJyZW50IHNjb3BlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFueSBleGNlcHRpb25zIGluCiAgICAgICAqIHRoZSBleHByZXNzaW9uIGFyZSBwcm9wYWdhdGVkICh1bmNhdWdodCkuIFRoaXMgaXMgdXNlZnVsIHdoZW4gZXZhbHVhdGluZyBBbmd1bGFyCiAgICAgICAqIGV4cHJlc3Npb25zLgogICAgICAgKgogICAgICAgKiAjIEV4YW1wbGUKICAgICAgICogYGBganMKICAgICAgICAgICB2YXIgc2NvcGUgPSBuZy4kcm9vdFNjb3BlLlNjb3BlKCk7CiAgICAgICAgICAgc2NvcGUuYSA9IDE7CiAgICAgICAgICAgc2NvcGUuYiA9IDI7CgogICAgICAgICAgIGV4cGVjdChzY29wZS4kZXZhbCgnYStiJykpLnRvRXF1YWwoMyk7CiAgICAgICAgICAgZXhwZWN0KHNjb3BlLiRldmFsKGZ1bmN0aW9uKHNjb3BlKXsgcmV0dXJuIHNjb3BlLmEgKyBzY29wZS5iOyB9KSkudG9FcXVhbCgzKTsKICAgICAgICogYGBgCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cHJlc3Npb24gQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLgogICAgICAgKgogICAgICAgKiAgICAtIGBzdHJpbmdgOiBleGVjdXRlIHVzaW5nIHRoZSBydWxlcyBhcyBkZWZpbmVkIGluICB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS4KICAgICAgICogICAgLSBgZnVuY3Rpb24oc2NvcGUpYDogZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBgc2NvcGVgIHBhcmFtZXRlci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsob2JqZWN0KT19IGxvY2FscyBMb2NhbCB2YXJpYWJsZXMgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluIHNjb3BlLgogICAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLgogICAgICAgKi8KICAgICAgJGV2YWw6IGZ1bmN0aW9uKGV4cHIsIGxvY2FscykgewogICAgICAgIHJldHVybiAkcGFyc2UoZXhwcikodGhpcywgbG9jYWxzKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGV2YWxBc3luYwogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogRXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24gb24gdGhlIGN1cnJlbnQgc2NvcGUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLgogICAgICAgKgogICAgICAgKiBUaGUgYCRldmFsQXN5bmNgIG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gd2hlbiB0aGUgYGV4cHJlc3Npb25gIHdpbGwgYmUgZXhlY3V0ZWQsIG9ubHkKICAgICAgICogdGhhdDoKICAgICAgICoKICAgICAgICogICAtIGl0IHdpbGwgZXhlY3V0ZSBhZnRlciB0aGUgZnVuY3Rpb24gdGhhdCBzY2hlZHVsZWQgdGhlIGV2YWx1YXRpb24gKHByZWZlcmFibHkgYmVmb3JlIERPTQogICAgICAgKiAgICAgcmVuZGVyaW5nKS4KICAgICAgICogICAtIGF0IGxlYXN0IG9uZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3QgY3ljbGV9IHdpbGwgYmUgcGVyZm9ybWVkIGFmdGVyCiAgICAgICAqICAgICBgZXhwcmVzc2lvbmAgZXhlY3V0aW9uLgogICAgICAgKgogICAgICAgKiBBbnkgZXhjZXB0aW9ucyBmcm9tIHRoZSBleGVjdXRpb24gb2YgdGhlIGV4cHJlc3Npb24gYXJlIGZvcndhcmRlZCB0byB0aGUKICAgICAgICoge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLgogICAgICAgKgogICAgICAgKiBfX05vdGU6X18gaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhIGAkZGlnZXN0YCBjeWNsZSwgYSBuZXcgYCRkaWdlc3RgIGN5Y2xlCiAgICAgICAqIHdpbGwgYmUgc2NoZWR1bGVkLiBIb3dldmVyLCBpdCBpcyBlbmNvdXJhZ2VkIHRvIGFsd2F5cyBjYWxsIGNvZGUgdGhhdCBjaGFuZ2VzIHRoZSBtb2RlbAogICAgICAgKiBmcm9tIHdpdGhpbiBhbiBgJGFwcGx5YCBjYWxsLiBUaGF0IGluY2x1ZGVzIGNvZGUgZXZhbHVhdGVkIHZpYSBgJGV2YWxBc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cHJlc3Npb24gQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLgogICAgICAgKgogICAgICAgKiAgICAtIGBzdHJpbmdgOiBleGVjdXRlIHVzaW5nIHRoZSBydWxlcyBhcyBkZWZpbmVkIGluIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LgogICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IGBzY29wZWAgcGFyYW1ldGVyLgogICAgICAgKgogICAgICAgKi8KICAgICAgJGV2YWxBc3luYzogZnVuY3Rpb24oZXhwcikgewogICAgICAgIC8vIGlmIHdlIGFyZSBvdXRzaWRlIG9mIGFuICRkaWdlc3QgbG9vcCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgc2NoZWR1bGluZyBhc3luYwogICAgICAgIC8vIHRhc2sgYWxzbyBzY2hlZHVsZSBhc3luYyBhdXRvLWZsdXNoCiAgICAgICAgaWYgKCEkcm9vdFNjb3BlLiQkcGhhc2UgJiYgIWFzeW5jUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGFzeW5jUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgJHJvb3RTY29wZS4kZGlnZXN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgYXN5bmNRdWV1ZS5wdXNoKHtzY29wZTogdGhpcywgZXhwcmVzc2lvbjogZXhwcn0pOwogICAgICB9LAoKICAgICAgJCRwb3N0RGlnZXN0OiBmdW5jdGlvbihmbikgewogICAgICAgIHBvc3REaWdlc3RRdWV1ZS5wdXNoKGZuKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGFwcGx5CiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBgJGFwcGx5KClgIGlzIHVzZWQgdG8gZXhlY3V0ZSBhbiBleHByZXNzaW9uIGluIGFuZ3VsYXIgZnJvbSBvdXRzaWRlIG9mIHRoZSBhbmd1bGFyCiAgICAgICAqIGZyYW1ld29yay4gKEZvciBleGFtcGxlIGZyb20gYnJvd3NlciBET00gZXZlbnRzLCBzZXRUaW1lb3V0LCBYSFIgb3IgdGhpcmQgcGFydHkgbGlicmFyaWVzKS4KICAgICAgICogQmVjYXVzZSB3ZSBhcmUgY2FsbGluZyBpbnRvIHRoZSBhbmd1bGFyIGZyYW1ld29yayB3ZSBuZWVkIHRvIHBlcmZvcm0gcHJvcGVyIHNjb3BlIGxpZmUKICAgICAgICogY3ljbGUgb2Yge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbiBoYW5kbGluZ30sCiAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgZXhlY3V0aW5nIHdhdGNoZXN9LgogICAgICAgKgogICAgICAgKiAjIyBMaWZlIGN5Y2xlCiAgICAgICAqCiAgICAgICAqICMgUHNldWRvLUNvZGUgb2YgYCRhcHBseSgpYAogICAgICAgKiBgYGBqcwogICAgICAgICAgIGZ1bmN0aW9uICRhcHBseShleHByKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICByZXR1cm4gJGV2YWwoZXhwcik7CiAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgJHJvb3QuJGRpZ2VzdCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICogYGBgCiAgICAgICAqCiAgICAgICAqCiAgICAgICAqIFNjb3BlJ3MgYCRhcHBseSgpYCBtZXRob2QgdHJhbnNpdGlvbnMgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHN0YWdlczoKICAgICAgICoKICAgICAgICogMS4gVGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIGV4ZWN1dGVkIHVzaW5nIHRoZQogICAgICAgKiAgICB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZXZhbCAkZXZhbCgpfSBtZXRob2QuCiAgICAgICAqIDIuIEFueSBleGNlcHRpb25zIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZQogICAgICAgKiAgICB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9IHNlcnZpY2UuCiAgICAgICAqIDMuIFRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggd2F0Y2h9IGxpc3RlbmVycyBhcmUgZmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCiAgICAgICAqICAgIGV4cHJlc3Npb24gd2FzIGV4ZWN1dGVkIHVzaW5nIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3QoKX0gbWV0aG9kLgogICAgICAgKgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHAgQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLgogICAgICAgKgogICAgICAgKiAgICAtIGBzdHJpbmdgOiBleGVjdXRlIHVzaW5nIHRoZSBydWxlcyBhcyBkZWZpbmVkIGluIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LgogICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24uCiAgICAgICAqLwogICAgICAkYXBwbHk6IGZ1bmN0aW9uKGV4cHIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYmVnaW5QaGFzZSgnJGFwcGx5Jyk7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZXZhbChleHByKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgY2xlYXJQaGFzZSgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHJvb3RTY29wZS4kZGlnZXN0KCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOwogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGFwcGx5QXN5bmMKICAgICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIFNjaGVkdWxlIHRoZSBpbnZva2F0aW9uIG9mICRhcHBseSB0byBvY2N1ciBhdCBhIGxhdGVyIHRpbWUuIFRoZSBhY3R1YWwgdGltZSBkaWZmZXJlbmNlCiAgICAgICAqIHZhcmllcyBhY3Jvc3MgYnJvd3NlcnMsIGJ1dCBpcyB0eXBpY2FsbHkgYXJvdW5kIH4xMCBtaWxsaXNlY29uZHMuCiAgICAgICAqCiAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcXVldWUgdXAgbXVsdGlwbGUgZXhwcmVzc2lvbnMgd2hpY2ggbmVlZCB0byBiZSBldmFsdWF0ZWQgaW4gdGhlIHNhbWUKICAgICAgICogZGlnZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHAgQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLgogICAgICAgKgogICAgICAgKiAgICAtIGBzdHJpbmdgOiBleGVjdXRlIHVzaW5nIHRoZSBydWxlcyBhcyBkZWZpbmVkIGluIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LgogICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuCiAgICAgICAqLwogICAgICAkYXBwbHlBc3luYzogZnVuY3Rpb24oZXhwcikgewogICAgICAgIHZhciBzY29wZSA9IHRoaXM7CiAgICAgICAgZXhwciAmJiBhcHBseUFzeW5jUXVldWUucHVzaCgkYXBwbHlBc3luY0V4cHJlc3Npb24pOwogICAgICAgIHNjaGVkdWxlQXBwbHlBc3luYygpOwoKICAgICAgICBmdW5jdGlvbiAkYXBwbHlBc3luY0V4cHJlc3Npb24oKSB7CiAgICAgICAgICBzY29wZS4kZXZhbChleHByKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQG5nZG9jIG1ldGhvZAogICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRvbgogICAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICAgKgogICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICogTGlzdGVucyBvbiBldmVudHMgb2YgYSBnaXZlbiB0eXBlLiBTZWUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGVtaXQgJGVtaXR9IGZvcgogICAgICAgKiBkaXNjdXNzaW9uIG9mIGV2ZW50IGxpZmUgY3ljbGUuCiAgICAgICAqCiAgICAgICAqIFRoZSBldmVudCBsaXN0ZW5lciBmdW5jdGlvbiBmb3JtYXQgaXM6IGBmdW5jdGlvbihldmVudCwgYXJncy4uLilgLiBUaGUgYGV2ZW50YCBvYmplY3QKICAgICAgICogcGFzc2VkIGludG8gdGhlIGxpc3RlbmVyIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CiAgICAgICAqCiAgICAgICAqICAgLSBgdGFyZ2V0U2NvcGVgIC0gYHtTY29wZX1gOiB0aGUgc2NvcGUgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBgJGVtaXRgLWVkIG9yCiAgICAgICAqICAgICBgJGJyb2FkY2FzdGAtZWQuCiAgICAgICAqICAgLSBgY3VycmVudFNjb3BlYCAtIGB7U2NvcGV9YDogdGhlIHNjb3BlIHRoYXQgaXMgY3VycmVudGx5IGhhbmRsaW5nIHRoZSBldmVudC4gT25jZSB0aGUKICAgICAgICogICAgIGV2ZW50IHByb3BhZ2F0ZXMgdGhyb3VnaCB0aGUgc2NvcGUgaGllcmFyY2h5LCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBudWxsLgogICAgICAgKiAgIC0gYG5hbWVgIC0gYHtzdHJpbmd9YDogbmFtZSBvZiB0aGUgZXZlbnQuCiAgICAgICAqICAgLSBgc3RvcFByb3BhZ2F0aW9uYCAtIGB7ZnVuY3Rpb249fWA6IGNhbGxpbmcgYHN0b3BQcm9wYWdhdGlvbmAgZnVuY3Rpb24gd2lsbCBjYW5jZWwKICAgICAgICogICAgIGZ1cnRoZXIgZXZlbnQgcHJvcGFnYXRpb24gKGF2YWlsYWJsZSBvbmx5IGZvciBldmVudHMgdGhhdCB3ZXJlIGAkZW1pdGAtZWQpLgogICAgICAgKiAgIC0gYHByZXZlbnREZWZhdWx0YCAtIGB7ZnVuY3Rpb259YDogY2FsbGluZyBgcHJldmVudERlZmF1bHRgIHNldHMgYGRlZmF1bHRQcmV2ZW50ZWRgIGZsYWcKICAgICAgICogICAgIHRvIHRydWUuCiAgICAgICAqICAgLSBgZGVmYXVsdFByZXZlbnRlZGAgLSBge2Jvb2xlYW59YDogdHJ1ZSBpZiBgcHJldmVudERlZmF1bHRgIHdhcyBjYWxsZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gbGlzdGVuIG9uLgogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50LCAuLi5hcmdzKX0gbGlzdGVuZXIgRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyBlbWl0dGVkLgogICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIGxpc3RlbmVyLgogICAgICAgKi8KICAgICAgJG9uOiBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikgewogICAgICAgIHZhciBuYW1lZExpc3RlbmVycyA9IHRoaXMuJCRsaXN0ZW5lcnNbbmFtZV07CiAgICAgICAgaWYgKCFuYW1lZExpc3RlbmVycykgewogICAgICAgICAgdGhpcy4kJGxpc3RlbmVyc1tuYW1lXSA9IG5hbWVkTGlzdGVuZXJzID0gW107CiAgICAgICAgfQogICAgICAgIG5hbWVkTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOwoKICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKCFjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSkgewogICAgICAgICAgICBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSsrOwogICAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC4kcGFyZW50KSk7CgogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgaW5kZXhPZkxpc3RlbmVyID0gbmFtZWRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7CiAgICAgICAgICBpZiAoaW5kZXhPZkxpc3RlbmVyICE9PSAtMSkgewogICAgICAgICAgICBuYW1lZExpc3RlbmVyc1tpbmRleE9mTGlzdGVuZXJdID0gbnVsbDsKICAgICAgICAgICAgZGVjcmVtZW50TGlzdGVuZXJDb3VudChzZWxmLCAxLCBuYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAoKCiAgICAgIC8qKgogICAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGVtaXQKICAgICAgICogQGtpbmQgZnVuY3Rpb24KICAgICAgICoKICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYG5hbWVgIHVwd2FyZHMgdGhyb3VnaCB0aGUgc2NvcGUgaGllcmFyY2h5IG5vdGlmeWluZyB0aGUKICAgICAgICogcmVnaXN0ZXJlZCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259IGxpc3RlbmVycy4KICAgICAgICoKICAgICAgICogVGhlIGV2ZW50IGxpZmUgY3ljbGUgc3RhcnRzIGF0IHRoZSBzY29wZSBvbiB3aGljaCBgJGVtaXRgIHdhcyBjYWxsZWQuIEFsbAogICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSBsaXN0ZW5pbmcgZm9yIGBuYW1lYCBldmVudCBvbiB0aGlzIHNjb3BlIGdldAogICAgICAgKiBub3RpZmllZC4gQWZ0ZXJ3YXJkcywgdGhlIGV2ZW50IHRyYXZlcnNlcyB1cHdhcmRzIHRvd2FyZCB0aGUgcm9vdCBzY29wZSBhbmQgY2FsbHMgYWxsCiAgICAgICAqIHJlZ2lzdGVyZWQgbGlzdGVuZXJzIGFsb25nIHRoZSB3YXkuIFRoZSBldmVudCB3aWxsIHN0b3AgcHJvcGFnYXRpbmcgaWYgb25lIG9mIHRoZSBsaXN0ZW5lcnMKICAgICAgICogY2FuY2VscyBpdC4KICAgICAgICoKICAgICAgICogQW55IGV4Y2VwdGlvbiBlbWl0dGVkIGZyb20gdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IHdpbGwgYmUgcGFzc2VkCiAgICAgICAqIG9udG8gdGhlIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZSB0byBlbWl0LgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgb25lIG9yIG1vcmUgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIG9udG8gdGhlIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBFdmVudCBvYmplY3QgKHNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259KS4KICAgICAgICovCiAgICAgICRlbWl0OiBmdW5jdGlvbihuYW1lLCBhcmdzKSB7CiAgICAgICAgdmFyIGVtcHR5ID0gW10sCiAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzLAogICAgICAgICAgICBzY29wZSA9IHRoaXMsCiAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlLAogICAgICAgICAgICBldmVudCA9IHsKICAgICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICAgIHRhcmdldFNjb3BlOiBzY29wZSwKICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge3N0b3BQcm9wYWdhdGlvbiA9IHRydWU7fSwKICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxpc3RlbmVyQXJncyA9IGNvbmNhdChbZXZlbnRdLCBhcmd1bWVudHMsIDEpLAogICAgICAgICAgICBpLCBsZW5ndGg7CgogICAgICAgIGRvIHsKICAgICAgICAgIG5hbWVkTGlzdGVuZXJzID0gc2NvcGUuJCRsaXN0ZW5lcnNbbmFtZV0gfHwgZW1wdHk7CiAgICAgICAgICBldmVudC5jdXJyZW50U2NvcGUgPSBzY29wZTsKICAgICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IG5hbWVkTGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CgogICAgICAgICAgICAvLyBpZiBsaXN0ZW5lcnMgd2VyZSBkZXJlZ2lzdGVyZWQsIGRlZnJhZ21lbnQgdGhlIGFycmF5CiAgICAgICAgICAgIGlmICghbmFtZWRMaXN0ZW5lcnNbaV0pIHsKICAgICAgICAgICAgICBuYW1lZExpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgaS0tOwogICAgICAgICAgICAgIGxlbmd0aC0tOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgLy9hbGxvdyBhbGwgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IHNjb3BlIHRvIHJ1bgogICAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGxpc3RlbmVyQXJncyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy9pZiBhbnkgbGlzdGVuZXIgb24gdGhlIGN1cnJlbnQgc2NvcGUgc3RvcHMgcHJvcGFnYXRpb24sIHByZXZlbnQgYnViYmxpbmcKICAgICAgICAgIGlmIChzdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICAgICAgfQogICAgICAgICAgLy90cmF2ZXJzZSB1cHdhcmRzCiAgICAgICAgICBzY29wZSA9IHNjb3BlLiRwYXJlbnQ7CiAgICAgICAgfSB3aGlsZSAoc2NvcGUpOwoKICAgICAgICBldmVudC5jdXJyZW50U2NvcGUgPSBudWxsOwoKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0sCgoKICAgICAgLyoqCiAgICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkYnJvYWRjYXN0CiAgICAgICAqIEBraW5kIGZ1bmN0aW9uCiAgICAgICAqCiAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGBuYW1lYCBkb3dud2FyZHMgdG8gYWxsIGNoaWxkIHNjb3BlcyAoYW5kIHRoZWlyIGNoaWxkcmVuKSBub3RpZnlpbmcgdGhlCiAgICAgICAqIHJlZ2lzdGVyZWQge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG9ufSBsaXN0ZW5lcnMuCiAgICAgICAqCiAgICAgICAqIFRoZSBldmVudCBsaWZlIGN5Y2xlIHN0YXJ0cyBhdCB0aGUgc2NvcGUgb24gd2hpY2ggYCRicm9hZGNhc3RgIHdhcyBjYWxsZWQuIEFsbAogICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSBsaXN0ZW5pbmcgZm9yIGBuYW1lYCBldmVudCBvbiB0aGlzIHNjb3BlIGdldAogICAgICAgKiBub3RpZmllZC4gQWZ0ZXJ3YXJkcywgdGhlIGV2ZW50IHByb3BhZ2F0ZXMgdG8gYWxsIGRpcmVjdCBhbmQgaW5kaXJlY3Qgc2NvcGVzIG9mIHRoZSBjdXJyZW50CiAgICAgICAqIHNjb3BlIGFuZCBjYWxscyBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgYWxvbmcgdGhlIHdheS4gVGhlIGV2ZW50IGNhbm5vdCBiZSBjYW5jZWxlZC4KICAgICAgICoKICAgICAgICogQW55IGV4Y2VwdGlvbiBlbWl0dGVkIGZyb20gdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IHdpbGwgYmUgcGFzc2VkCiAgICAgICAqIG9udG8gdGhlIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZSB0byBicm9hZGNhc3QuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBPcHRpb25hbCBvbmUgb3IgbW9yZSBhcmd1bWVudHMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb250byB0aGUgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEV2ZW50IG9iamVjdCwgc2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0KICAgICAgICovCiAgICAgICRicm9hZGNhc3Q6IGZ1bmN0aW9uKG5hbWUsIGFyZ3MpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcywKICAgICAgICAgICAgY3VycmVudCA9IHRhcmdldCwKICAgICAgICAgICAgbmV4dCA9IHRhcmdldCwKICAgICAgICAgICAgZXZlbnQgPSB7CiAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICB0YXJnZXRTY29wZTogdGFyZ2V0LAogICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UKICAgICAgICAgICAgfTsKCiAgICAgICAgaWYgKCF0YXJnZXQuJCRsaXN0ZW5lckNvdW50W25hbWVdKSByZXR1cm4gZXZlbnQ7CgogICAgICAgIHZhciBsaXN0ZW5lckFyZ3MgPSBjb25jYXQoW2V2ZW50XSwgYXJndW1lbnRzLCAxKSwKICAgICAgICAgICAgbGlzdGVuZXJzLCBpLCBsZW5ndGg7CgogICAgICAgIC8vZG93biB3aGlsZSB5b3UgY2FuLCB0aGVuIHVwIGFuZCBuZXh0IHNpYmxpbmcgb3IgdXAgYW5kIG5leHQgc2libGluZyB1bnRpbCBiYWNrIGF0IHJvb3QKICAgICAgICB3aGlsZSAoKGN1cnJlbnQgPSBuZXh0KSkgewogICAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gY3VycmVudDsKICAgICAgICAgIGxpc3RlbmVycyA9IGN1cnJlbnQuJCRsaXN0ZW5lcnNbbmFtZV0gfHwgW107CiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gaWYgbGlzdGVuZXJzIHdlcmUgZGVyZWdpc3RlcmVkLCBkZWZyYWdtZW50IHRoZSBhcnJheQogICAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tpXSkgewogICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgaS0tOwogICAgICAgICAgICAgIGxlbmd0aC0tOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShudWxsLCBsaXN0ZW5lckFyZ3MpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBJbnNhbml0eSBXYXJuaW5nOiBzY29wZSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwKICAgICAgICAgIC8vIHllcywgdGhpcyBjb2RlIGlzIGEgYml0IGNyYXp5LCBidXQgaXQgd29ya3MgYW5kIHdlIGhhdmUgdGVzdHMgdG8gcHJvdmUgaXQhCiAgICAgICAgICAvLyB0aGlzIHBpZWNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdHJhdmVyc2FsIGluICRkaWdlc3QKICAgICAgICAgIC8vICh0aG91Z2ggaXQgZGlmZmVycyBkdWUgdG8gaGF2aW5nIHRoZSBleHRyYSBjaGVjayBmb3IgJCRsaXN0ZW5lckNvdW50KQogICAgICAgICAgaWYgKCEobmV4dCA9ICgoY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV0gJiYgY3VycmVudC4kJGNoaWxkSGVhZCkgfHwKICAgICAgICAgICAgICAoY3VycmVudCAhPT0gdGFyZ2V0ICYmIGN1cnJlbnQuJCRuZXh0U2libGluZykpKSkgewogICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPT0gdGFyZ2V0ICYmICEobmV4dCA9IGN1cnJlbnQuJCRuZXh0U2libGluZykpIHsKICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC4kcGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBldmVudC5jdXJyZW50U2NvcGUgPSBudWxsOwogICAgICAgIHJldHVybiBldmVudDsKICAgICAgfQogICAgfTsKCiAgICB2YXIgJHJvb3RTY29wZSA9IG5ldyBTY29wZSgpOwoKICAgIC8vVGhlIGludGVybmFsIHF1ZXVlcy4gRXhwb3NlIHRoZW0gb24gdGhlICRyb290U2NvcGUgZm9yIGRlYnVnZ2luZy90ZXN0aW5nIHB1cnBvc2VzLgogICAgdmFyIGFzeW5jUXVldWUgPSAkcm9vdFNjb3BlLiQkYXN5bmNRdWV1ZSA9IFtdOwogICAgdmFyIHBvc3REaWdlc3RRdWV1ZSA9ICRyb290U2NvcGUuJCRwb3N0RGlnZXN0UXVldWUgPSBbXTsKICAgIHZhciBhcHBseUFzeW5jUXVldWUgPSAkcm9vdFNjb3BlLiQkYXBwbHlBc3luY1F1ZXVlID0gW107CgogICAgcmV0dXJuICRyb290U2NvcGU7CgoKICAgIGZ1bmN0aW9uIGJlZ2luUGhhc2UocGhhc2UpIHsKICAgICAgaWYgKCRyb290U2NvcGUuJCRwaGFzZSkgewogICAgICAgIHRocm93ICRyb290U2NvcGVNaW5FcnIoJ2lucHJvZycsICd7MH0gYWxyZWFkeSBpbiBwcm9ncmVzcycsICRyb290U2NvcGUuJCRwaGFzZSk7CiAgICAgIH0KCiAgICAgICRyb290U2NvcGUuJCRwaGFzZSA9IHBoYXNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyUGhhc2UoKSB7CiAgICAgICRyb290U2NvcGUuJCRwaGFzZSA9IG51bGw7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGRlY3JlbWVudExpc3RlbmVyQ291bnQoY3VycmVudCwgY291bnQsIG5hbWUpIHsKICAgICAgZG8gewogICAgICAgIGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdIC09IGNvdW50OwoKICAgICAgICBpZiAoY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV0gPT09IDApIHsKICAgICAgICAgIGRlbGV0ZSBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXTsKICAgICAgICB9CiAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC4kcGFyZW50KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBmdW5jdGlvbiB1c2VkIGFzIGFuIGluaXRpYWwgdmFsdWUgZm9yIHdhdGNoZXJzLgogICAgICogYmVjYXVzZSBpdCdzIHVuaXF1ZSB3ZSBjYW4gZWFzaWx5IHRlbGwgaXQgYXBhcnQgZnJvbSBvdGhlciB2YWx1ZXMKICAgICAqLwogICAgZnVuY3Rpb24gaW5pdFdhdGNoVmFsKCkge30KCiAgICBmdW5jdGlvbiBmbHVzaEFwcGx5QXN5bmMoKSB7CiAgICAgIHdoaWxlIChhcHBseUFzeW5jUXVldWUubGVuZ3RoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGFwcGx5QXN5bmNRdWV1ZS5zaGlmdCgpKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGx5QXN5bmNJZCA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc2NoZWR1bGVBcHBseUFzeW5jKCkgewogICAgICBpZiAoYXBwbHlBc3luY0lkID09PSBudWxsKSB7CiAgICAgICAgYXBwbHlBc3luY0lkID0gJGJyb3dzZXIuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAkcm9vdFNjb3BlLiRhcHBseShmbHVzaEFwcGx5QXN5bmMpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfV07Cn0KCi8qKgogKiBAZGVzY3JpcHRpb24KICogUHJpdmF0ZSBzZXJ2aWNlIHRvIHNhbml0aXplIHVyaXMgZm9yIGxpbmtzIGFuZCBpbWFnZXMuIFVzZWQgYnkgJGNvbXBpbGUgYW5kICRzYW5pdGl6ZS4KICovCmZ1bmN0aW9uICQkU2FuaXRpemVVcmlQcm92aWRlcigpIHsKICB2YXIgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSAvXlxzKihodHRwcz98ZnRwfG1haWx0b3x0ZWx8ZmlsZSk6LywKICAgIGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA9IC9eXHMqKChodHRwcz98ZnRwfGZpbGV8YmxvYik6fGRhdGE6aW1hZ2VcLykvOwoKICAvKioKICAgKiBAZGVzY3JpcHRpb24KICAgKiBSZXRyaWV2ZXMgb3Igb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgZm9yIHdoaXRlbGlzdGluZyBvZiBzYWZlCiAgICogdXJscyBkdXJpbmcgYVtocmVmXSBzYW5pdGl6YXRpb24uCiAgICoKICAgKiBUaGUgc2FuaXRpemF0aW9uIGlzIGEgc2VjdXJpdHkgbWVhc3VyZSBhaW1lZCBhdCBwcmV2ZW50IFhTUyBhdHRhY2tzIHZpYSBodG1sIGxpbmtzLgogICAqCiAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBhW2hyZWZdIHZpYSBkYXRhLWJpbmRpbmcgaXMgZmlyc3Qgbm9ybWFsaXplZCBhbmQgdHVybmVkIGludG8KICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3RgCiAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsCiAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLgogICAqCiAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLgogICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3IKICAgKiAgICBjaGFpbmluZyBvdGhlcndpc2UuCiAgICovCiAgdGhpcy5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkgewogICAgaWYgKGlzRGVmaW5lZChyZWdleHApKSB7CiAgICAgIGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gcmVnZXhwOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdDsKICB9OwoKCiAgLyoqCiAgICogQGRlc2NyaXB0aW9uCiAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZQogICAqIHVybHMgZHVyaW5nIGltZ1tzcmNdIHNhbml0aXphdGlvbi4KICAgKgogICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnQgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuCiAgICoKICAgKiBBbnkgdXJsIGFib3V0IHRvIGJlIGFzc2lnbmVkIHRvIGltZ1tzcmNdIHZpYSBkYXRhLWJpbmRpbmcgaXMgZmlyc3Qgbm9ybWFsaXplZCBhbmQgdHVybmVkIGludG8KICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0YAogICAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG9yaWdpbmFsIHVybCBpcyB3cml0dGVuIGludG8gdGhlIGRvbS4gT3RoZXJ3aXNlLAogICAqIHRoZSBhYnNvbHV0ZSB1cmwgaXMgcHJlZml4ZWQgd2l0aCBgJ3Vuc2FmZTonYCBzdHJpbmcgYW5kIG9ubHkgdGhlbiBpcyBpdCB3cml0dGVuIGludG8gdGhlIERPTS4KICAgKgogICAqIEBwYXJhbSB7UmVnRXhwPX0gcmVnZXhwIE5ldyByZWdleHAgdG8gd2hpdGVsaXN0IHVybHMgd2l0aC4KICAgKiBAcmV0dXJucyB7UmVnRXhwfG5nLiRjb21waWxlUHJvdmlkZXJ9IEN1cnJlbnQgUmVnRXhwIGlmIGNhbGxlZCB3aXRob3V0IHZhbHVlIG9yIHNlbGYgZm9yCiAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLgogICAqLwogIHRoaXMuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gZnVuY3Rpb24ocmVnZXhwKSB7CiAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHsKICAgICAgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gcmVnZXhwOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3Q7CiAgfTsKCiAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gc2FuaXRpemVVcmkodXJpLCBpc0ltYWdlKSB7CiAgICAgIHZhciByZWdleCA9IGlzSW1hZ2UgPyBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgOiBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdDsKICAgICAgdmFyIG5vcm1hbGl6ZWRWYWw7CiAgICAgIG5vcm1hbGl6ZWRWYWwgPSB1cmxSZXNvbHZlKHVyaSkuaHJlZjsKICAgICAgaWYgKG5vcm1hbGl6ZWRWYWwgIT09ICcnICYmICFub3JtYWxpemVkVmFsLm1hdGNoKHJlZ2V4KSkgewogICAgICAgIHJldHVybiAndW5zYWZlOicgKyBub3JtYWxpemVkVmFsOwogICAgICB9CiAgICAgIHJldHVybiB1cmk7CiAgICB9OwogIH07Cn0KCnZhciAkc2NlTWluRXJyID0gbWluRXJyKCckc2NlJyk7Cgp2YXIgU0NFX0NPTlRFWFRTID0gewogIEhUTUw6ICdodG1sJywKICBDU1M6ICdjc3MnLAogIFVSTDogJ3VybCcsCiAgLy8gUkVTT1VSQ0VfVVJMIGlzIGEgc3VidHlwZSBvZiBVUkwgdXNlZCBpbiBjb250ZXh0cyB3aGVyZSBhIHByaXZpbGVnZWQgcmVzb3VyY2UgaXMgc291cmNlZCBmcm9tIGEKICAvLyB1cmwuICAoZS5nLiBuZy1pbmNsdWRlLCBzY3JpcHQgc3JjLCB0ZW1wbGF0ZVVybCkKICBSRVNPVVJDRV9VUkw6ICdyZXNvdXJjZVVybCcsCiAgSlM6ICdqcycKfTsKCi8vIEhlbHBlciBmdW5jdGlvbnMgZm9sbG93LgoKZnVuY3Rpb24gYWRqdXN0TWF0Y2hlcihtYXRjaGVyKSB7CiAgaWYgKG1hdGNoZXIgPT09ICdzZWxmJykgewogICAgcmV0dXJuIG1hdGNoZXI7CiAgfSBlbHNlIGlmIChpc1N0cmluZyhtYXRjaGVyKSkgewogICAgLy8gU3RyaW5ncyBtYXRjaCBleGFjdGx5IGV4Y2VwdCBmb3IgMiB3aWxkY2FyZHMgLSAnKicgYW5kICcqKicuCiAgICAvLyAnKicgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCB0aG9zZSBmcm9tIHRoZSBzZXQgJzovLj8mJy4KICAgIC8vICcqKicgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIChsaWtlIC4qIGluIGEgUmVnRXhwKS4KICAgIC8vIE1vcmUgdGhhbiAyIConcyByYWlzZXMgYW4gZXJyb3IgYXMgaXQncyBpbGwgZGVmaW5lZC4KICAgIGlmIChtYXRjaGVyLmluZGV4T2YoJyoqKicpID4gLTEpIHsKICAgICAgdGhyb3cgJHNjZU1pbkVycignaXdjYXJkJywKICAgICAgICAgICdJbGxlZ2FsIHNlcXVlbmNlICoqKiBpbiBzdHJpbmcgbWF0Y2hlci4gIFN0cmluZzogezB9JywgbWF0Y2hlcik7CiAgICB9CiAgICBtYXRjaGVyID0gZXNjYXBlRm9yUmVnZXhwKG1hdGNoZXIpLgogICAgICAgICAgICAgICAgICByZXBsYWNlKCdcXCpcXConLCAnLionKS4KICAgICAgICAgICAgICAgICAgcmVwbGFjZSgnXFwqJywgJ1teOi8uPyY7XSonKTsKICAgIHJldHVybiBuZXcgUmVnRXhwKCdeJyArIG1hdGNoZXIgKyAnJCcpOwogIH0gZWxzZSBpZiAoaXNSZWdFeHAobWF0Y2hlcikpIHsKICAgIC8vIFRoZSBvbmx5IG90aGVyIHR5cGUgb2YgbWF0Y2hlciBhbGxvd2VkIGlzIGEgUmVnZXhwLgogICAgLy8gTWF0Y2ggZW50aXJlIFVSTCAvIGRpc2FsbG93IHBhcnRpYWwgbWF0Y2hlcy4KICAgIC8vIEZsYWdzIGFyZSByZXNldCAoaS5lLiBubyBnbG9iYWwsIGlnbm9yZUNhc2Ugb3IgbXVsdGlsaW5lKQogICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgbWF0Y2hlci5zb3VyY2UgKyAnJCcpOwogIH0gZWxzZSB7CiAgICB0aHJvdyAkc2NlTWluRXJyKCdpbWF0Y2hlcicsCiAgICAgICAgJ01hdGNoZXJzIG1heSBvbmx5IGJlICJzZWxmIozc71bUQQIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8QEAAQAZuncCoBzbAqAdglSIf9Vh6fNNBufVIgBAL8BP/AAABAQgKAKNeygBNpcWM3O9W70ECAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/809xAAEAGtzjAqAdgwKgHNh/1lSJBufVIWHp804AYAVOv1QAAAQEICgBNpcUAo17KLCBzdHJpbmcgcGF0dGVybnMgb3IgUmVnRXhwIG9iamVjdHMnKTsKICB9Cn0KCgpmdW5jdGlvbiBhZGp1c3RNYXRjaGVycyhtYXRjaGVycykgewogIHZhciBhZGp1c3RlZE1hdGNoZXJzID0gW107CiAgaWYgKGlzRGVmaW5lZChtYXRjaGVycykpIHsKICAgIGZvckVhY2gobWF0Y2hlcnMsIGZ1bmN0aW9uKG1hdGNoZXIpIHsKICAgICAgYWRqdXN0ZWRNYXRjaGVycy5wdXNoKGFkanVzdE1hdGNoZXIobWF0Y2hlcikpOwogICAgfSk7CiAgfQogIHJldHVybiBhZGp1c3RlZE1hdGNoZXJzOwp9CgoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRzY2VEZWxlZ2F0ZQogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICoKICogYCRzY2VEZWxlZ2F0ZWAgaXMgYSBzZXJ2aWNlIHRoYXQgaXMgdXNlZCBieSB0aGUgYCRzY2VgIHNlcnZpY2UgdG8gcHJvdmlkZSB7QGxpbmsgbmcuJHNjZSBTdHJpY3QKICogQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0gc2VydmljZXMgdG8gQW5ndWxhckpTLgogKgogKiBUeXBpY2FsbHksIHlvdSB3b3VsZCBjb25maWd1cmUgb3Igb3ZlcnJpZGUgdGhlIHtAbGluayBuZy4kc2NlRGVsZWdhdGUgJHNjZURlbGVnYXRlfSBpbnN0ZWFkIG9mCiAqIHRoZSBgJHNjZWAgc2VydmljZSB0byBjdXN0b21pemUgdGhlIHdheSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyB3b3JrcyBpbiBBbmd1bGFySlMuICBUaGlzIGlzCiAqIGJlY2F1c2UsIHdoaWxlIHRoZSBgJHNjZWAgcHJvdmlkZXMgbnVtZXJvdXMgc2hvcnRoYW5kIG1ldGhvZHMsIGV0Yy4sIHlvdSByZWFsbHkgb25seSBuZWVkIHRvCiAqIG92ZXJyaWRlIDMgY29yZSBmdW5jdGlvbnMgKGB0cnVzdEFzYCwgYGdldFRydXN0ZWRgIGFuZCBgdmFsdWVPZmApIHRvIHJlcGxhY2UgdGhlIHdheSB0aGluZ3MKICogd29yayBiZWNhdXNlIGAkc2NlYCBkZWxlZ2F0ZXMgdG8gYCRzY2VEZWxlZ2F0ZWAgZm9yIHRoZXNlIG9wZXJhdGlvbnMuCiAqCiAqIFJlZmVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciAkc2NlRGVsZWdhdGVQcm92aWRlcn0gdG8gY29uZmlndXJlIHRoaXMgc2VydmljZS4KICoKICogVGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgYCRzY2VEZWxlZ2F0ZWAgc2hvdWxkIHdvcmsgb3V0IG9mIHRoZSBib3ggd2l0aCBsaXR0bGUgcGFpbi4gIFdoaWxlIHlvdQogKiBjYW4gb3ZlcnJpZGUgaXQgY29tcGxldGVseSB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGAkc2NlYCwgdGhlIGNvbW1vbiBjYXNlIHdvdWxkCiAqIGludm9sdmUgY29uZmlndXJpbmcgdGhlIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciAkc2NlRGVsZWdhdGVQcm92aWRlcn0gaW5zdGVhZCBieSBzZXR0aW5nCiAqIHlvdXIgb3duIHdoaXRlbGlzdHMgYW5kIGJsYWNrbGlzdHMgZm9yIHRydXN0aW5nIFVSTHMgdXNlZCBmb3IgbG9hZGluZyBBbmd1bGFySlMgcmVzb3VyY2VzIHN1Y2ggYXMKICogdGVtcGxhdGVzLiAgUmVmZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0CiAqICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0fSBhbmQge0BsaW5rCiAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsQmxhY2tsaXN0fQogKi8KCi8qKgogKiBAbmdkb2MgcHJvdmlkZXIKICogQG5hbWUgJHNjZURlbGVnYXRlUHJvdmlkZXIKICogQGRlc2NyaXB0aW9uCiAqCiAqIFRoZSBgJHNjZURlbGVnYXRlUHJvdmlkZXJgIHByb3ZpZGVyIGFsbG93cyBkZXZlbG9wZXJzIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZQogKiAkc2NlRGVsZWdhdGV9IHNlcnZpY2UuICBUaGlzIGFsbG93cyBvbmUgdG8gZ2V0L3NldCB0aGUgd2hpdGVsaXN0cyBhbmQgYmxhY2tsaXN0cyB1c2VkIHRvIGVuc3VyZQogKiB0aGF0IHRoZSBVUkxzIHVzZWQgZm9yIHNvdXJjaW5nIEFuZ3VsYXIgdGVtcGxhdGVzIGFyZSBzYWZlLiAgUmVmZXIge0BsaW5rCiAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0fSBhbmQKICoge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsQmxhY2tsaXN0fQogKgogKiBGb3IgdGhlIGdlbmVyYWwgZGV0YWlscyBhYm91dCB0aGlzIHNlcnZpY2UgaW4gQW5ndWxhciwgcmVhZCB0aGUgbWFpbiBwYWdlIGZvciB7QGxpbmsgbmcuJHNjZQogKiBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0uCiAqCiAqICoqRXhhbXBsZSoqOiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlLiA8YSBuYW1lPSJleGFtcGxlIj48L2E+CiAqCiAqIC0geW91ciBhcHAgaXMgaG9zdGVkIGF0IHVybCBgaHR0cDovL215YXBwLmV4YW1wbGUuY29tL2AKICogLSBidXQgc29tZSBvZiB5b3VyIHRlbXBsYXRlcyBhcmUgaG9zdGVkIG9uIG90aGVyIGRvbWFpbnMgeW91IGNvbnRyb2wgc3VjaCBhcwogKiAgIGBodHRwOi8vc3J2MDEuYXNzZXRzLmV4YW1wbGUuY29tL2AswqAgYGh0dHA6Ly9zcnYwMi5hc3NldHMuZXhhbXBsZS5jb20vYCwgZXRjLgogKiAtIGFuZCB5b3UgaGF2ZSBhbiBvcGVuIHJlZGlyZWN0IGF0IGBodHRwOi8vbXlhcHAuZXhhbXBsZS5jb20vY2xpY2tUaHJ1Py4uLmAuCiAqCiAqIEhlcmUgaXMgd2hhdCBhIHNlY3VyZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNjZW5hcmlvIG1pZ2h0IGxvb2sgbGlrZToKICoKICogYGBgCiAqICBhbmd1bGFyLm1vZHVsZSgnbXlBcHAnLCBbXSkuY29uZmlnKGZ1bmN0aW9uKCRzY2VEZWxlZ2F0ZVByb3ZpZGVyKSB7CiAqICAgICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0KFsKICogICAgICAvLyBBbGxvdyBzYW1lIG9yaWdpbiByZXNvdXJjZSBsb2Fkcy4KICogICAgICAnc2VsZicsCiAqICAgICAgLy8gQWxsb3cgbG9hZGluZyBmcm9tIG91ciBhc3NldHMgZG9tYWluLiAgTm90aWNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gKiBhbmQgKiouCiAqICAgICAgJ2h0dHA6Ly9zcnYqLmFzc2V0cy5leGFtcGxlLmNvbS8qKicKICogICAgXSk7CiAqCiAqICAgIC8vIFRoZSBibGFja2xpc3Qgb3ZlcnJpZGVzIHRoZSB3aGl0ZWxpc3Qgc28gdGhlIG9wZW4gcmVkaXJlY3QgaGVyZSBpcyBibG9ja2VkLgogKiAgICAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybEJsYWNrbGlzdChbCiAqICAgICAgJ2h0dHA6Ly9teWFwcC5leGFtcGxlLmNvbS9jbGlja1RocnUqKicKICogICAgXSk7CiAqICB9KTsKICogYGBgCiAqLwoKZnVuY3Rpb24gJFNjZURlbGVnYXRlUHJvdmlkZXIoKSB7CiAgdGhpcy5TQ0VfQ09OVEVYVFMgPSBTQ0VfQ09OVEVYVFM7CgogIC8vIFJlc291cmNlIFVSTHMgY2FuIGFsc28gYmUgdHJ1c3RlZCBieSBwb2xpY3kuCiAgdmFyIHJlc291cmNlVXJsV2hpdGVsaXN0ID0gWydzZWxmJ10sCiAgICAgIHJlc291cmNlVXJsQmxhY2tsaXN0ID0gW107CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdAogICAqIEBraW5kIGZ1bmN0aW9uCiAgICoKICAgKiBAcGFyYW0ge0FycmF5PX0gd2hpdGVsaXN0IFdoZW4gcHJvdmlkZWQsIHJlcGxhY2VzIHRoZSByZXNvdXJjZVVybFdoaXRlbGlzdCB3aXRoIHRoZSB2YWx1ZQogICAqICAgICBwcm92aWRlZC4gIFRoaXMgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsLiAgQSBzbmFwc2hvdCBvZiB0aGlzIGFycmF5IGlzIHVzZWQgc28gZnVydGhlcgogICAqICAgICBjaGFuZ2VzIHRvIHRoZSBhcnJheSBhcmUgaWdub3JlZC4KICAgKgogICAqICAgICBGb2xsb3cge0BsaW5rIG5nLiRzY2UjcmVzb3VyY2VVcmxQYXR0ZXJuSXRlbSB0aGlzIGxpbmt9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtcwogICAqICAgICBhbGxvd2VkIGluIHRoaXMgYXJyYXkuCiAgICoKICAgKiAgICAgTm90ZTogKiphbiBlbXB0eSB3aGl0ZWxpc3QgYXJyYXkgd2lsbCBibG9jayBhbGwgVVJMcyoqIQogICAqCiAgICogQHJldHVybiB7QXJyYXl9IHRoZSBjdXJyZW50bHkgc2V0IHdoaXRlbGlzdCBhcnJheS4KICAgKgogICAqIFRoZSAqKmRlZmF1bHQgdmFsdWUqKiB3aGVuIG5vIHdoaXRlbGlzdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCBpcyBgWydzZWxmJ11gIGFsbG93aW5nIG9ubHkKICAgKiBzYW1lIG9yaWdpbiByZXNvdXJjZSByZXF1ZXN0cy4KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFNldHMvR2V0cyB0aGUgd2hpdGVsaXN0IG9mIHRydXN0ZWQgcmVzb3VyY2UgVVJMcy4KICAgKi8KICB0aGlzLnJlc291cmNlVXJsV2hpdGVsaXN0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHJlc291cmNlVXJsV2hpdGVsaXN0ID0gYWRqdXN0TWF0Y2hlcnModmFsdWUpOwogICAgfQogICAgcmV0dXJuIHJlc291cmNlVXJsV2hpdGVsaXN0OwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdAogICAqIEBraW5kIGZ1bmN0aW9uCiAgICoKICAgKiBAcGFyYW0ge0FycmF5PX0gYmxhY2tsaXN0IFdoZW4gcHJvdmlkZWQsIHJlcGxhY2VzIHRoZSByZXNvdXJjZVVybEJsYWNrbGlzdCB3aXRoIHRoZSB2YWx1ZQogICAqICAgICBwcm92aWRlZC4gIFRoaXMgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsLiAgQSBzbmFwc2hvdCBvZiB0aGlzIGFycmF5IGlzIHVzZWQgc28gZnVydGhlcgogICAqICAgICBjaGFuZ2VzIHRvIHRoZSBhcnJheSBhcmUgaWdub3JlZC4KICAgKgogICAqICAgICBGb2xsb3cge0BsaW5rIG5nLiRzY2UjcmVzb3VyY2VVcmxQYXR0ZXJuSXRlbSB0aGlzIGxpbmt9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtcwogICAqICAgICBhbGxvd2VkIGluIHRoaXMgYXJyYXkuCiAgICoKICAgKiAgICAgVGhlIHR5cGljYWwgdXNhZ2UgZm9yIHRoZSBibGFja2xpc3QgaXMgdG8gKipibG9jawogICAqICAgICBbb3BlbiByZWRpcmVjdHNdKGh0dHA6Ly9jd2UubWl0cmUub3JnL2RhdGEvZGVmaW5pdGlvbnMvNjAxLmh0bWwpKiogc2VydmVkIGJ5IHlvdXIgZG9tYWluIGFzCiAgICogICAgIHRoZXNlIHdvdWxkIG90aGVyd2lzZSBiZSB0cnVzdGVkIGJ1dCBhY3R1YWxseSByZXR1cm4gY29udGVudCBmcm9tIHRoZSByZWRpcmVjdGVkIGRvbWFpbi4KICAgKgogICAqICAgICBGaW5hbGx5LCAqKnRoZSBibGFja2xpc3Qgb3ZlcnJpZGVzIHRoZSB3aGl0ZWxpc3QqKiBhbmQgaGFzIHRoZSBmaW5hbCBzYXkuCiAgICoKICAgKiBAcmV0dXJuIHtBcnJheX0gdGhlIGN1cnJlbnRseSBzZXQgYmxhY2tsaXN0IGFycmF5LgogICAqCiAgICogVGhlICoqZGVmYXVsdCB2YWx1ZSoqIHdoZW4gbm8gd2hpdGVsaXN0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IGlzIHRoZSBlbXB0eSBhcnJheSAoaS5lLiB0aGVyZQogICAqIGlzIG5vIGJsYWNrbGlzdC4pCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBTZXRzL0dldHMgdGhlIGJsYWNrbGlzdCBvZiB0cnVzdGVkIHJlc291cmNlIFVSTHMuCiAgICovCgogIHRoaXMucmVzb3VyY2VVcmxCbGFja2xpc3QgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgcmVzb3VyY2VVcmxCbGFja2xpc3QgPSBhZGp1c3RNYXRjaGVycyh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gcmVzb3VyY2VVcmxCbGFja2xpc3Q7CiAgfTsKCiAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCBmdW5jdGlvbigkaW5qZWN0b3IpIHsKCiAgICB2YXIgaHRtbFNhbml0aXplciA9IGZ1bmN0aW9uIGh0bWxTYW5pdGl6ZXIoaHRtbCkgewogICAgICB0aHJvdyAkc2NlTWluRXJyKCd1bnNhZmUnLCAnQXR0ZW1wdGluZyB0byB1c2UgYW4gdW5zYWZlIHZhbHVlIGluIGEgc2FmZSBjb250ZXh0LicpOwogICAgfTsKCiAgICBpZiAoJGluamVjdG9yLmhhcygnJHNhbml0aXplJykpIHsKICAgICAgaHRtbFNhbml0aXplciA9ICRpbmplY3Rvci5nZXQoJyRzYW5pdGl6ZScpOwogICAgfQoKCiAgICBmdW5jdGlvbiBtYXRjaFVybChtYXRjaGVyLCBwYXJzZWRVcmwpIHsKICAgICAgaWYgKG1hdGNoZXIgPT09ICdzZWxmJykgewogICAgICAgIHJldHVybiB1cmxJc1NhbWVPcmlnaW4ocGFyc2VkVXJsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZpbml0ZWx5IGEgcmVnZXguICBTZWUgYWRqdXN0TWF0Y2hlcnMoKQogICAgICAgIHJldHVybiAhIW1hdGNoZXIuZXhlYyhwYXJzZWRVcmwuaHJlZik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpc1Jlc291cmNlVXJsQWxsb3dlZEJ5UG9saWN5KHVybCkgewogICAgICB2YXIgcGFyc2VkVXJsID0gdXJsUmVzb2x2ZSh1cmwudG9TdHJpbmcoKSk7CiAgICAgIHZhciBpLCBuLCBhbGxvd2VkID0gZmFsc2U7CiAgICAgIC8vIEVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBpdGVtIGZyb20gdGhlIHdoaXRlbGlzdCBhbGxvd3MgdGhpcyB1cmwuCiAgICAgIGZvciAoaSA9IDAsIG4gPSByZXNvdXJjZVVybFdoaXRlbGlzdC5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAobWF0Y2hVcmwocmVzb3VyY2VVcmxXaGl0ZWxpc3RbaV0sIHBhcnNlZFVybCkpIHsKICAgICAgICAgIGFsbG93ZWQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChhbGxvd2VkKSB7CiAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm8gaXRlbSBmcm9tIHRoZSBibGFja2xpc3QgYmxvY2tlZCB0aGlzIHVybC4KICAgICAgICBmb3IgKGkgPSAwLCBuID0gcmVzb3VyY2VVcmxCbGFja2xpc3QubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICBpZiAobWF0Y2hVcmwocmVzb3VyY2VVcmxCbGFja2xpc3RbaV0sIHBhcnNlZFVybCkpIHsKICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGFsbG93ZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gZ2VuZXJhdGVIb2xkZXJUeXBlKEJhc2UpIHsKICAgICAgdmFyIGhvbGRlclR5cGUgPSBmdW5jdGlvbiBUcnVzdGVkVmFsdWVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZSkgewogICAgICAgIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0cnVzdGVkVmFsdWU7CiAgICAgICAgfTsKICAgICAgfTsKICAgICAgaWYgKEJhc2UpIHsKICAgICAgICBob2xkZXJUeXBlLnByb3RvdHlwZSA9IG5ldyBCYXNlKCk7CiAgICAgIH0KICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uIHNjZVZhbHVlT2YoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTsKICAgICAgfTsKICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBzY2VUb1N0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpLnRvU3RyaW5nKCk7CiAgICAgIH07CiAgICAgIHJldHVybiBob2xkZXJUeXBlOwogICAgfQoKICAgIHZhciB0cnVzdGVkVmFsdWVIb2xkZXJCYXNlID0gZ2VuZXJhdGVIb2xkZXJUeXBlKCksCiAgICAgICAgYnlUeXBlID0ge307CgogICAgYnlUeXBlW1NDRV9DT05URVhUUy5IVE1MXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTsKICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuQ1NTXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTsKICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuVVJMXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTsKICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuSlNdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpOwogICAgYnlUeXBlW1NDRV9DT05URVhUUy5SRVNPVVJDRV9VUkxdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKGJ5VHlwZVtTQ0VfQ09OVEVYVFMuVVJMXSk7CgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aA0KjNzvVhxCAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxBQABABm6cwKgHNsCoB2CVIh/1WHp800G6FRCAEAvw9DYAAAEBCAoAo17KAE2lxYzc71aFdQIAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzT4kAAQAZ20sCoB2DAqAc2H/WVIkG6FRBYenzTgBABU/A1AAABAQgKAE2lyQCjXso3RkU4DQpvZAogICAgICogQG5hbWUgJHNjZURlbGVnYXRlI3RydXN0QXMKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgaXMgdHJ1c3RlZCBieSBhbmd1bGFyIGZvciB1c2UgaW4gc3BlY2lmaWVkIHN0cmljdAogICAgICogY29udGV4dHVhbCBlc2NhcGluZyBjb250ZXh0cyAoc3VjaCBhcyBuZy1iaW5kLWh0bWwsIG5nLWluY2x1ZGUsIGFueSBzcmMKICAgICAqIGF0dHJpYnV0ZSBpbnRlcnBvbGF0aW9uLCBhbnkgZG9tIGV2ZW50IGJpbmRpbmcgYXR0cmlidXRlIGludGVycG9sYXRpb24KICAgICAqIHN1Y2ggYXMgZm9yIG9uY2xpY2ssICBldGMuKSB0aGF0IHVzZXMgdGhlIHByb3ZpZGVkIHZhbHVlLgogICAgICogU2VlIHtAbGluayBuZy4kc2NlICRzY2V9IGZvciBlbmFibGluZyBzdHJpY3QgY29udGV4dHVhbCBlc2NhcGluZy4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgc2FmZSBmb3IgdXNlLiAgZS5nLiB1cmwsCiAgICAgKiAgIHJlc291cmNlVXJsLCBodG1sLCBqcyBhbmQgY3NzLgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRydXN0ZWQvc2FmZS4KICAgICAqIEByZXR1cm5zIHsqfSBBIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RhbmQgaW4gZm9yIHRoZSBwcm92aWRlZCBgdmFsdWVgIGluIHBsYWNlcwogICAgICogd2hlcmUgQW5ndWxhciBleHBlY3RzIGEgJHNjZS50cnVzdEFzKCkgcmV0dXJuIHZhbHVlLgogICAgICovCiAgICBmdW5jdGlvbiB0cnVzdEFzKHR5cGUsIHRydXN0ZWRWYWx1ZSkgewogICAgICB2YXIgQ29uc3RydWN0b3IgPSAoYnlUeXBlLmhhc093blByb3BlcnR5KHR5cGUpID8gYnlUeXBlW3R5cGVdIDogbnVsbCk7CiAgICAgIGlmICghQ29uc3RydWN0b3IpIHsKICAgICAgICB0aHJvdyAkc2NlTWluRXJyKCdpY29udGV4dCcsCiAgICAgICAgICAgICdBdHRlbXB0ZWQgdG8gdHJ1c3QgYSB2YWx1ZSBpbiBpbnZhbGlkIGNvbnRleHQuIENvbnRleHQ6IHswfTsgVmFsdWU6IHsxfScsCiAgICAgICAgICAgIHR5cGUsIHRydXN0ZWRWYWx1ZSk7CiAgICAgIH0KICAgICAgaWYgKHRydXN0ZWRWYWx1ZSA9PT0gbnVsbCB8fCB0cnVzdGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0cnVzdGVkVmFsdWUgPT09ICcnKSB7CiAgICAgICAgcmV0dXJuIHRydXN0ZWRWYWx1ZTsKICAgICAgfQogICAgICAvLyBBbGwgdGhlIGN1cnJlbnQgY29udGV4dHMgaW4gU0NFX0NPTlRFWFRTIGhhcHBlbiB0byBiZSBzdHJpbmdzLiAgSW4gb3JkZXIgdG8gYXZvaWQgdHJ1c3RpbmcKICAgICAgLy8gbXV0YWJsZSBvYmplY3RzLCB3ZSBlbnN1cmUgaGVyZSB0aGF0IHRoZSB2YWx1ZSBwYXNzZWQgaW4gaXMgYWN0dWFsbHkgYSBzdHJpbmcuCiAgICAgIGlmICh0eXBlb2YgdHJ1c3RlZFZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgIHRocm93ICRzY2VNaW5FcnIoJ2l0eXBlJywKICAgICAgICAgICAgJ0F0dGVtcHRlZCB0byB0cnVzdCBhIG5vbi1zdHJpbmcgdmFsdWUgaW4gYSBjb250ZW50IHJlcXVpcmluZyBhIHN0cmluZzogQ29udGV4dDogezB9JywKICAgICAgICAgICAgdHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0cnVzdGVkVmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJHNjZURlbGVnYXRlI3ZhbHVlT2YKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIElmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGhhZCBiZWVuIHJldHVybmVkIGJ5IGEgcHJpb3IgY2FsbCB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMKICAgICAqIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9LCByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IGhhZCBiZWVuIHBhc3NlZCB0byB7QGxpbmsKICAgICAqIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9LgogICAgICoKICAgICAqIElmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbHVlIHRoYXQgaGFkIGJlZW4gcmV0dXJuZWQgYnkge0BsaW5rCiAgICAgKiBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSwgcmV0dXJucyBpdCBhcy1pcy4KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSByZXN1bHQgb2YgYSBwcmlvciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0KICAgICAqICAgICAgY2FsbCBvciBhbnl0aGluZyBlbHNlLgogICAgICogQHJldHVybnMgeyp9IFRoZSBgdmFsdWVgIHRoYXQgd2FzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzCiAgICAgKiAgICAgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0gaWYgYHZhbHVlYCBpcyB0aGUgcmVzdWx0IG9mIHN1Y2ggYSBjYWxsLiAgT3RoZXJ3aXNlLCByZXR1cm5zCiAgICAgKiAgICAgYHZhbHVlYCB1bmNoYW5nZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHZhbHVlT2YobWF5YmVUcnVzdGVkKSB7CiAgICAgIGlmIChtYXliZVRydXN0ZWQgaW5zdGFuY2VvZiB0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKSB7CiAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZC4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBtYXliZVRydXN0ZWQ7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAqIEBuYW1lICRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkCiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBUYWtlcyB0aGUgcmVzdWx0IG9mIGEge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9IGNhbGwgYW5kCiAgICAgKiByZXR1cm5zIHRoZSBvcmlnaW5hbGx5IHN1cHBsaWVkIHZhbHVlIGlmIHRoZSBxdWVyaWVkIGNvbnRleHQgdHlwZSBpcyBhIHN1cGVydHlwZSBvZiB0aGUKICAgICAqIGNyZWF0ZWQgdHlwZS4gIElmIHRoaXMgY29uZGl0aW9uIGlzbid0IHNhdGlzZmllZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgdG8gYmUgdXNlZC4KICAgICAqIEBwYXJhbSB7Kn0gbWF5YmVUcnVzdGVkIFRoZSByZXN1bHQgb2YgYSBwcmlvciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMKICAgICAqICAgICBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBjYWxsLgogICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGUgd2FzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzCiAgICAgKiAgICAgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0gaWYgdmFsaWQgaW4gdGhpcyBjb250ZXh0LiAgT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRUcnVzdGVkKHR5cGUsIG1heWJlVHJ1c3RlZCkgewogICAgICBpZiAobWF5YmVUcnVzdGVkID09PSBudWxsIHx8IG1heWJlVHJ1c3RlZCA9PT0gdW5kZWZpbmVkIHx8IG1heWJlVHJ1c3RlZCA9PT0gJycpIHsKICAgICAgICByZXR1cm4gbWF5YmVUcnVzdGVkOwogICAgICB9CiAgICAgIHZhciBjb25zdHJ1Y3RvciA9IChieVR5cGUuaGFzT3duUHJvcGVydHkodHlwZSkgPyBieVR5cGVbdHlwZV0gOiBudWxsKTsKICAgICAgaWYgKGNvbnN0cnVjdG9yICYmIG1heWJlVHJ1c3RlZCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7CiAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZC4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpOwogICAgICB9CiAgICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGVuIHdlIG1heSBvbmx5IHRha2Ugb25lIG9mIHR3byBhY3Rpb25zLgogICAgICAvLyAxLiBzYW5pdGl6ZSB0aGUgdmFsdWUgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZSwgb3IKICAgICAgLy8gMi4gdGhyb3cgYW4gZXhjZXB0aW9uLgogICAgICBpZiAodHlwZSA9PT0gU0NFX0NPTlRFWFRTLlJFU09VUkNFX1VSTCkgewogICAgICAgIGlmIChpc1Jlc291cmNlVXJsQWxsb3dlZEJ5UG9saWN5KG1heWJlVHJ1c3RlZCkpIHsKICAgICAgICAgIHJldHVybiBtYXliZVRydXN0ZWQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93ICRzY2VNaW5FcnIoJ2luc2VjdXJsJywKICAgICAgICAgICAgICAnQmxvY2tlZCBsb2FkaW5nIHJlc291cmNlIGZyb20gdXJsIG5vdCBhbGxvd2VkIGJ5ICRzY2VEZWxlZ2F0ZSBwb2xpY3kuICBVUkw6IHswfScsCiAgICAgICAgICAgICAgbWF5YmVUcnVzdGVkLnRvU3RyaW5nKCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBTQ0VfQ09OVEVYVFMuSFRNTCkgewogICAgICAgIHJldHVybiBodG1sU2FuaXRpemVyKG1heWJlVHJ1c3RlZCk7CiAgICAgIH0KICAgICAgdGhyb3cgJHNjZU1pbkVycigndW5zYWZlJywgJ0F0dGVtcHRpbmcgdG8gdXNlIGFuIHVuc2FmZSB2YWx1ZSBpbiBhIHNhZmUgY29udGV4dC4nKTsKICAgIH0KCiAgICByZXR1cm4geyB0cnVzdEFzOiB0cnVzdEFzLAogICAgICAgICAgICAgZ2V0VHJ1c3RlZDogZ2V0VHJ1c3RlZCwKICAgICAgICAgICAgIHZhbHVlT2Y6IHZhbHVlT2YgfTsKICB9XTsKfQoKCi8qKgogKiBAbmdkb2MgcHJvdmlkZXIKICogQG5hbWUgJHNjZVByb3ZpZGVyCiAqIEBkZXNjcmlwdGlvbgogKgogKiBUaGUgJHNjZVByb3ZpZGVyIHByb3ZpZGVyIGFsbG93cyBkZXZlbG9wZXJzIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIG5nLiRzY2UgJHNjZX0gc2VydmljZS4KICogLSAgIGVuYWJsZS9kaXNhYmxlIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIChTQ0UpIGluIGEgbW9kdWxlCiAqIC0gICBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgY3VzdG9tIGRlbGVnYXRlCiAqCiAqIFJlYWQgbW9yZSBhYm91dCB7QGxpbmsgbmcuJHNjZSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0uCiAqLwoKLyoganNoaW50IG1heGxlbjogZmFsc2UqLwoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRzY2UKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqCiAqIGAkc2NlYCBpcyBhIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyBzZXJ2aWNlcyB0byBBbmd1bGFySlMuCiAqCiAqICMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcKICoKICogU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSkgaXMgYSBtb2RlIGluIHdoaWNoIEFuZ3VsYXJKUyByZXF1aXJlcyBiaW5kaW5ncyBpbiBjZXJ0YWluCiAqIGNvbnRleHRzIHRvIHJlc3VsdCBpbiBhIHZhbHVlIHRoYXQgaXMgbWFya2VkIGFzIHNhZmUgdG8gdXNlIGZvciB0aGF0IGNvbnRleHQuICBPbmUgZXhhbXBsZSBvZgogKiBzdWNoIGEgY29udGV4dCBpcyBiaW5kaW5nIGFyYml0cmFyeSBodG1sIGNvbnRyb2xsZWQgYnkgdGhlIHVzZXIgdmlhIGBuZy1iaW5kLWh0bWxgLiAgV2UgcmVmZXIKICogdG8gdGhlc2UgY29udGV4dHMgYXMgcHJpdmlsZWdlZCBvciBTQ0UgY29udGV4dHMuCiAqCiAqIEFzIG9mIHZlcnNpb24gMS4yLCBBbmd1bGFyIHNoaXBzIHdpdGggU0NFIGVuYWJsZWQgYnkgZGVmYXVsdC4KICoKICogTm90ZTogIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBJRTwxMSBpbiBxdWlya3MgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLiAgSW4gdGhpcyBtb2RlLCBJRTwxMSBhbGxvdwogKiBvbmUgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgamF2YXNjcmlwdCBieSB0aGUgdXNlIG9mIHRoZSBleHByZXNzaW9uKCkgc3ludGF4LiAgUmVmZXIKICogPGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2llL2FyY2hpdmUvMjAwOC8xMC8xNi9lbmRpbmctZXhwcmVzc2lvbnMuYXNweD4gdG8gbGVhcm4gbW9yZSBhYm91dCB0aGVtLgogKiBZb3UgY2FuIGVuc3VyZSB5b3VyIGRvY3VtZW50IGlzIGluIHN0YW5kYXJkcyBtb2RlIGFuZCBub3QgcXVpcmtzIG1vZGUgYnkgYWRkaW5nIGA8IWRvY3R5cGUgaHRtbD5gCiAqIHRvIHRoZSB0b3Agb2YgeW91ciBIVE1MIGRvY3VtZW50LgogKgogKiBTQ0UgYXNzaXN0cyBpbiB3cml0aW5nIGNvZGUgaW4gd2F5IHRoYXQgKGEpIGlzIHNlY3VyZSBieSBkZWZhdWx0IGFuZCAoYikgbWFrZXMgYXVkaXRpbmcgZm9yCiAqIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyBzdWNoIGFzIFhTUywgY2xpY2tqYWNraW5nLCBldGMuIGEgbG90IGVhc2llci4KICoKICogSGVyZSdzIGFuIGV4YW1wbGUgb2YgYSBiaW5kaW5nIGluIGEgcHJpdmlsZWdlZCBjb250ZXh0OgogKgogKiBgYGAKICogPGlucHV0IG5nLW1vZGVsPSJ1c2VySHRtbCI+CiAqIDxkaXYgbmctYmluZC1odG1sPSJ1c2VySHRtbCI+PC9kaXY+CiAqIGBgYAogKgogKiBOb3RpY2UgdGhhdCBgbmctYmluZC1odG1sYCBpcyBib3VuZCB0byBgdXNlckh0bWxgIGNvbnRyb2xsZWQgYnkgdGhlIHVzZXIuICBXaXRoIFNDRQogKiBkaXNhYmxlZCwgdGhpcyBhcHBsaWNhdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gcmVuZGVyIGFyYml0cmFyeSBIVE1MIGludG8gdGhlIERJVi4KICogSW4gYSBtb3JlIHJlYWxpc3RpYyBleGFtcGxlLCBvbmUgbWF5IGJlIHJlbmRlcmluZyB1c2VyIGNvbW1lbnRzLCBibG9nIGFydGljbGVzLCBldGMuIHZpYQogKiBiaW5kaW5ncy4gIChIVE1MIGlzIGp1c3Qgb25lIGV4YW1wbGUgb2YgYSBjb250ZXh0IHdoZXJlIHJlbmRlcmluZyB1c2VyIGNvbnRyb2xsZWQgaW5wdXQgY3JlYXRlcwogKiBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuKQogKgogKiBGb3IgdGhlIGNhc2Ugb2YgSFRNTCwgeW91IG1pZ2h0IHVzZSBhIGxpYnJhcnksIGVpdGhlciBvbiB0aGUgY2xpZW50IHNpZGUsIG9yIG9uIHRoZSBzZXJ2ZXIgc2lkZSwKICogdG8gc2FuaXRpemUgdW5zYWZlIEhUTUwgYmVmb3JlIGJpbmRpbmcgdG8gdGhlIHZhbHVlIGFuZCByZW5kZXJpbmcgaXQgaW4gdGhlIGRvY3VtZW50LgogKgogKiBIb3cgd291bGQgeW91IGVuc3VyZSB0aGF0IGV2ZXJ5IHBsYWNlIHRoYXQgdXNlZCB0aGVzZSB0eXBlcyBvZiBiaW5kaW5ncyB3YXMgYm91bmQgdG8gYSB2YWx1ZSB0aGF0CiAqIHdhcyBzYW5pdGl6ZWQgYnkgeW91ciBsaWJyYXJ5IChvciByZXR1cm5lZCBhcyBzYWZlIGZvciByZW5kZXJpbmcgYnkgeW91ciBzZXJ2ZXI/KSAgSG93IGNhbiB5b3UKICogZW5zdXJlIHRoYXQgeW91IGRpZG4ndCBhY2NpZGVudGFsbHkgZGVsZXRlIHRoZSBsaW5lIHRoYXQgc2FuaXRpemVkIHRoZSB2YWx1ZSwgb3IgcmVuYW1lZCBzb21lCiAqIHByb3BlcnRpZXMvZmllbGRzIGFuZCBmb3Jnb3QgdG8gdXBkYXRlIHRoZSBiaW5kaW5nIHRvIHRoZSBzYW5pdGl6ZWQgdmFsdWU/CiAqCiAqIFRvIGJlIHNlY3VyZSBieSBkZWZhdWx0LCB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCBhbnkgc3VjaCBiaW5kaW5ncyBhcmUgZGlzYWxsb3dlZCB1bmxlc3MgeW91IGNhbgogKiBkZXRlcm1pbmUgdGhhdCBzb21ldGhpbmcgZXhwbGljaXRseSBzYXlzIGl0J3Mgc2FmZSB0byB1c2UgYSB2YWx1ZSBmb3IgYmluZGluZyBpbiB0aGF0CiAqIGNvbnRleHQuICBZb3UgY2FuIHRoZW4gYXVkaXQgeW91ciBjb2RlIChhIHNpbXBsZSBncmVwIHdvdWxkIGRvKSB0byBlbnN1cmUgdGhhdCB0aGlzIGlzIG9ubHkgZG9uZQogKiBmb3IgdGhvc2UgdmFsdWVzIHRoYXQgeW91IGNhbiBlYXNpbHkgdGVsbCBhcmUgc2FmZSAtIGJlY2F1c2UgdGhleSB3ZXJlIHJlY2VpdmVkIGZyb20geW91ciBzZXJ2ZXIsCiAqIHNhbml0aXplZCBieSB5b3VyIGxpYnJhcnksIGV0Yy4gIFlvdSBjYW4gb3JnYW5pemUgeW91ciBjb2RlYmFzZSB0byBoZWxwIHdpdGggdGhpcyAtIHBlcmhhcHMKICogYWxsb3dpbmcgb25seSB0aGUgZmlsZXMgaW4gYSBzcGVjaWZpYyBkaXJlY3RvcnkgdG8gZG8gdGhpcy4gIEVuc3VyaW5nIHRoYXQgdGhlIGludGVybmFsIEFQSQogKiBleHBvc2VkIGJ5IHRoYXQgY29kZSBkb2Vzbid0IG1hcmt1cCBhcmJpdHJhcnkgdmFsdWVzIGFzIHNhZmUgdGhlbiBiZWNvbWVzIGEgbW9yZSBtYW5hZ2VhYmxlIHRhc2suCiAqCiAqIEluIHRoZSBjYXNlIG9mIEFuZ3VsYXJKUycgU0NFIHNlcnZpY2UsIG9uZSB1c2VzIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfQogKiAoYW5kIHNob3J0aGFuZCBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIG5nLiRzY2UjdHJ1c3RBc0h0bWwgJHNjZS50cnVzdEFzSHRtbH0sIGV0Yy4pIHRvCiAqIG9idGFpbiB2YWx1ZXMgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IFNDRSAvIHByaXZpbGVnZWQgY29udGV4dHMuCiAqCiAqCiAqICMjIEhvdyBkb2VzIGl0IHdvcms/CiAqCiAqIEluIHByaXZpbGVnZWQgY29udGV4dHMsIGRpcmVjdGl2ZXMgYW5kIGNvZGUgd2lsbCBiaW5kIHRvIHRoZSByZXN1bHQgb2Yge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZAogKiAkc2NlLmdldFRydXN0ZWQoY29udGV4dCwgdmFsdWUpfSByYXRoZXIgdGhhbiB0byB0aGUgdmFsdWUgZGlyZWN0bHkuICBEaXJlY3RpdmVzIHVzZSB7QGxpbmsKICogbmcuJHNjZSNwYXJzZUFzICRzY2UucGFyc2VBc30gcmF0aGVyIHRoYW4gYCRwYXJzZWAgdG8gd2F0Y2ggYXR0cmlidXRlIGJpbmRpbmdzLCB3aGljaCBwZXJmb3JtcyB0aGUKICoge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZCAkc2NlLmdldFRydXN0ZWR9IGJlaGluZCB0aGUgc2NlbmVzIG9uIG5vbi1jb25zdGFudCBsaXRlcmFscy4KICoKICogQXMgYW4gZXhhbXBsZSwge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0JpbmRIdG1sIG5nQmluZEh0bWx9IHVzZXMge0BsaW5rCiAqIG5nLiRzY2UjcGFyc2VBc0h0bWwgJHNjZS5wYXJzZUFzSHRtbChiaW5kaW5nIGV4cHJlc3Npb24pfS4gIEhlcmUncyB0aGUgYWN0dWFsIGNvZGUgKHNsaWdodGx5CiAqIHNpbXBsaWZpZWQpOgogKgogKiBgYGAKICogdmFyIG5nQmluZEh0bWxEaXJlY3RpdmUgPSBbJyRzY2UnLCBmdW5jdGlvbigkc2NlKSB7CiAqICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CiAqICAgICBzY29wZS4kd2F0Y2goJHNjZS5wYXJzZUFzSHRtbChhdHRyLm5nQmluZEh0bWwpLCBmdW5jdGlvbih2YWx1ZSkgewogKiAgICAgICBlbGVtZW50Lmh0bWwodmFsdWUgfHwgJycpOwogKiAgICAgfSk7CiAqICAgfTsKICogfV07CiAqIGBgYAogKgogKiAjIyBJbXBhY3Qgb24gbG9hZGluZyB0ZW1wbGF0ZXMKICoKICogVGhpcyBhcHBsaWVzIGJvdGggdG8gdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdJbmNsdWRlIGBuZy1pbmNsdWRlYH0gZGlyZWN0aXZlIGFzIHdlbGwgYXMKICogYHRlbXBsYXRlVXJsYCdzIHNwZWNpZmllZCBieSB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlIGRpcmVjdGl2ZXN9LgogKgogKiBCeSBkZWZhdWx0LCBBbmd1bGFyIG9ubHkgbG9hZHMgdGVtcGxhdGVzIGZyb20gdGhlIHNhbWUgZG9tYWluIGFuZCBwcm90b2NvbCBhcyB0aGUgYXBwbGljYXRpb24KICogZG9jdW1lbnQuICBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkUmVzb3VyY2VVcmwKICogJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmx9IG9uIHRoZSB0ZW1wbGF0ZSBVUkwuICBUbyBsb2FkIHRlbXBsYXRlcyBmcm9tIG90aGVyIGRvbWFpbnMgYW5kL29yCiAqIHByb3RvY29scywgeW91IG1heSBlaXRoZXIgZWl0aGVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCB3aGl0ZWxpc3QKICogdGhlbX0gb3Ige0BsaW5rIG5nLiRzY2UjdHJ1c3RBc1Jlc291cmNlVXJsIHdyYXAgaXR9IGludG8gYSB0cnVzdGVkIHZhbHVlLgogKgogKiAqUGxlYXNlIG5vdGUqOgogKiBUaGUgYnJvd3NlcidzCiAqIFtTYW1lIE9yaWdpbiBQb2xpY3ldKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYnJvd3NlcnNlYy93aWtpL1BhcnQyI1NhbWUtb3JpZ2luX3BvbGljeV9mb3JfWE1MSHR0cFJlcXVlc3QpCiAqIGFuZCBbQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpXShodHRwOi8vd3d3LnczLm9yZy9UUi9jb3JzLykKICogcG9saWN5IGFwcGx5IGluIGFkZGl0aW9uIHRvIHRoaXMgYW5kIG1heSBmdXJ0aGVyIHJlc3RyaWN0IHdoZXRoZXIgdGhlIHRlbXBsYXRlIGlzIHN1Y2Nlc3NmdWxseQogKiBsb2FkZWQuICBUaGlzIG1lYW5zIHRoYXQgd2l0aG91dCB0aGUgcmlnaHQgQ09SUyBwb2xpY3ksIGxvYWRpbmcgdGVtcGxhdGVzIGZyb20gYSBkaWZmZXJlbnQgZG9tYWluCiAqIHdvbid0IHdvcmsgb24gYWxsIGJyb3dzZXJzLiAgQWxzbywgbG9hZGluZyB0ZW1wbGF0ZXMgZnJvbSBgZmlsZTovL2AgVVJMIGRvZXMgbm90IHdvcmsgb24gc29tZQogKiBicm93c2Vycy4KICoKICogIyMgVGhpcyBmZWVscyBsaWtlIHRvbyBtdWNoIG92ZXJoZWFkCiAqCiAqIEl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgU0NFIG9ubHkgYXBwbGllcyB0byBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb25zLgogKgogKiBJZiB5b3VyIGV4cHJlc3Npb25zIGFyZSBjb25zdGFudCBsaXRlcmFscywgdGhleSdyZSBhdXRvbWF0aWNhbGx5IHRydXN0ZWQgYW5kIHlvdSBkb24ndCBuZWVkIHRvCiAqIGNhbGwgYCRzY2UudHJ1c3RBc2Agb24gdGhlbSAocmVtZW1iZXIgdG8gaW5jbHVkZSB0aGUgYG5nU2FuaXRpemVgIG1vZHVsZSkgKGUuZy4KICogYDxkaXYgbmctYmluZC1odG1sPSInPGI+aW1wbGljaXRseSB0cnVzdGVkPC9iPiciPjwvZGl2PmApIGp1c3Qgd29ya3MuCiAqCiAqIEFkZGl0aW9uYWxseSwgYGFbaHJlZl1gIGFuZCBgaW1nW3NyY11gIGF1dG9tYXRpY2FsbHkgc2FuaXRpemUgdGhlaXIgVVJMcyBhbmQgZG8gbm90IHBhc3MgdGhlbQogKiB0aHJvdWdoIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWQgJHNjZS5nZXRUcnVzdGVkfS4gIFNDRSBkb2Vzbid0IHBsYXkgYSByb2xlIGhlcmUuCiAqCiAqIFRoZSBpbmNsdWRlZCB7QGxpbmsgbmcuJHNjZURlbGVnYXRlICRzY2VEZWxlZ2F0ZX0gY29tZXMgd2l0aCBzYW5lIGRlZmF1bHRzIHRvIGFsbG93IHlvdSB0byBsb2FkCiAqIHRlbXBsYXRlcyBpbiBgbmctaW5jbHVkZWAgZnJvbSB5b3VyIGFwcGxpY2F0aW9uJ3MgZG9tYWluIHdpdGhvdXQgaGF2aW5nIHRvIGV2ZW4ga25vdyBhYm91dCBTQ0UuCiAqIEl0IGJsb2NrcyBsb2FkaW5nIHRlbXBsYXRlcyBmcm9tIG90aGVyIGRvbWFpbnMgb3IgbG9hZGluZyB0ZW1wbGF0ZXMgb3ZlciBodHRwIGZyb20gYW4gaHR0cHMKICogc2VydmVkIGRvY3VtZW50LiAgWW91IGNhbiBjaGFuZ2UgdGhlc2UgYnkgc2V0dGluZyB5b3VyIG93biBjdXN0b20ge0BsaW5rCiAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0IHdoaXRlbGlzdHN9IGFuZCB7QGxpbmsKICogbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxCbGFja2xpc3QgYmxhY2tsaXN0c30gZm9yIG1hdGNoaW5nIHN1Y2ggVVJMcy4KICoKICogVGhpcyBzaWduaWZpY2FudGx5IHJlZHVjZXMgdGhlIG92ZXJoZWFkLiAgSXQgaXMgZmFyIGVhc2llciB0byBwYXkgdGhlIHNtYWxsIG92ZXJoZWFkIGFuZCBoYXZlIGFuCiAqIGFwcGxpY2F0aW9uIHRoYXQncyBzZWN1cmUgYW5kIGNhbiBiZSBhdWRpdGVkIHRvIHZlcmlmeSB0aGF0IHdpdGggbXVjaCBtb3JlIGVhc2UgdGhhbiBib2x0aW5nCiAqIHNlY3VyaXR5IG9udG8gYW4gYXBwbGljYXRpb24gbGF0ZXIuCiAqCiAqIDxhIG5hbWU9ImNvbnRleHRzIj48L2E+CiAqICMjIFdoYXQgdHJ1c3RlZCBjb250ZXh0IHR5cGVzIGFyZSBzdXBwb3J0ZWQ/CiAqCiAqIHwgQ29udGV4dCAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgIHwKICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfAogKiB8IGAkc2NlLkhUTUxgICAgICAgICAgfCBGb3IgSFRNTCB0aGF0J3Mgc2FmZSB0byBzb3VyY2UgaW50byB0aGUgYXBwbGljYXRpb24uICBUaGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0JpbmRIdG1sIG5nQmluZEh0bWx9IGRpcmVjdGl2ZSB1c2VzIHRoaXMgY29udGV4dCBmb3IgYmluZGluZ3MuIElmIGFuIHVuc2FmZSB2YWx1ZSBpcyBlbmNvdW50ZXJlZCBhbmQgdGhlIHtAbGluayBuZ1Nhbml0aXplICRzYW5pdGl6ZX0gbW9kdWxlIGlzIHByZXNlbnQgdGhpcyB3aWxsIHNhbml0aXplIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLiB8CiAqIHwgYCRzY2UuQ1NTYCAgICAgICAgICB8IEZvciBDU1MgdGhhdCdzIHNhZmUgdG8gc291cmNlIGludG8gdGhlIGFwcGxpY2F0aW9uLiAgQ3VycmVudGx5IHVudXNlZC4gIEZlZWwgZnJlZSB0byB1c2UgaXQgaW4geW91ciBvd24gZGlyZWN0aXZlcy4gfAogKiB8IGAkc2NlLlVSTGAgICAgICAgICAgfCBGb3IgVVJMcyB0aGF0IGFyZSBzYWZlIHRvIGZvbGxvdyBhcyBsaW5rcy4gIEN1cnJlbnRseSB1bnVzZWQgKGA8YSBocmVmPWAgYW5kIGA8aW1nIHNyYz1gIHNhbml0aXplIHRoZWlyIHVybHMgYW5kIGRvbid0IGNvbnN0aXR1dGUgYW4gU0NFIGNvbnRleHQuIHwKICogfCBgJHNjZS5SRVNPVVJDRV9VUkxgIHwgRm9yIFVSTHMgdGhhdCBhcmUgbm90IG9ubHkgc2FmZSB0byBmb2xsb3cgYXMgbGlua3MsIGJ1dCB3aG9zZSBjb250ZW50cyBhcmUgYWxzbyBzYWZlIHRvIGluY2x1ZGUgaW4geW91ciBhcHBsaWNhdGlvbi4gIEV4YW1wbGVzIGluY2x1ZGUgYG5nLWluY2x1ZGVgLCBgc3JjYCAvIGBuZ1NyY2AgYmluZGluZ3MgZm9yIHRhZ3Mgb3RoZXIgdGhhbiBgSU1HYCAoZS5nLiBgSUZSQU1FYCwgYE9CSkVDVGAsIGV0Yy4pICA8YnI+PGJyPk5vdGUgdGhhdCBgJHNjZS5SRVNPVVJDRV9VUkxgIG1ha2VzIGEgc3Ryb25nZXIgc3RhdGVtZW50IGFib3V0IHRoZSBVUkwgdGhhbiBgJHNjZS5VUkxgIGRvZXMgYW5kIHRoZXJlZm9yZSBjb250ZXh0cyByZXF1aXJpbmcgdmFsdWVzIHRydXN0ZWQgZm9yIGAkc2NlLlJFU09VUkNFX1VSTGAgY2FuIGJlIHVzZWQgYW55d2hlcmUgdGhhdCB2YWx1ZXMgdHJ1c3RlZCBmb3IgYCRzY2UuVVJMYCBhcmUgcmVxdWlyZWQuIHwKICogfCBgJHNjZS5KU2AgICAgICAgICAgIHwgRm9yIEphdmFTY3JpcHQgdGhhdCBpcyBzYWZlIHRvIGV4ZWN1dGUgaW4geW91ciBhcHBsaWNhdGlvbidzIGNvbnRleHQuICBDdXJyZW50bHkgdW51c2VkLiAgRmVlbCBmcmVlIHRvIHVzZSBpdCBpbiB5b3VyIG93biBkaXJlY3RpdmVzLiB8CiAqCiAqICMjIEZvcm1hdCBvZiBpdGVtcyBpbiB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3QgcmVzb3VyY2VVcmxXaGl0ZWxpc3R9L3tAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdCBCbGFja2xpc3R9IDxhIG5hbWU9InJlc291cmNlVXJsUGF0dGVybkl0ZW0iPjwvYT4KICoKICogIEVhY2ggZWxlbWVudCBpbiB0aGVzZSBhcnJheXMgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKICoKICogIC0gKionc2VsZicqKgogKiAgICAtIFRoZSBzcGVjaWFsICoqc3RyaW5nKiosIGAnc2VsZidgLCBjYW4gYmUgdXNlZCB0byBtYXRjaCBhZ2FpbnN0IGFsbCBVUkxzIG9mIHRoZSAqKnNhbWUKICogICAgICBkb21haW4qKiBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQgdXNpbmcgdGhlICoqc2FtZSBwcm90b2NvbCoqLgogKiAgLSAqKlN0cmluZyoqIChleGNlcHQgdGhlIHNwZWNpYWwgdmFsdWUgYCdzZWxmJ2ApCiAqICAgIC0gVGhlIHN0cmluZyBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGZ1bGwgKm5vcm1hbGl6ZWQgLyBhYnNvbHV0ZSBVUkwqIG9mIHRoZSByZXNvdXJjZQogKiAgICAgIGJlaW5nIHRlc3RlZCAoc3Vic3RyaW5nIG1hdGNoZXMgYXJlIG5vdCBnb29kIGVub3VnaC4pCiAqICAgIC0gVGhlcmUgYXJlIGV4YWN0bHkgKip0d28gd2lsZGNhcmQgc2VxdWVuY2VzKiogLSBgKmAgYW5kIGAqKmAuICBBbGwgb3RoZXIgY2hhcmFjdGVycwogKiAgICAgIG1hdGNoIHRoZW1zZWx2ZXMuCiAqICAgIC0gYCpgOiBtYXRjaGVzIHplcm8gb3IgbW9yZSBvY2N1cnJlbmNlcyBvZiBhbnkgY2hhcmFjdGVyIG90aGVyIHRoYW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgNgogKiAgICAgIGNoYXJhY3RlcnM6ICdgOmAnLCAnYC9gJywgJ2AuYCcsICdgP2AnLCAnYCZgJyBhbmQgJzsnLiAgSXQncyBhIHVzZWZ1bCB3aWxkY2FyZCBmb3IgdXNlCiAqICAgICAgaW4gYSB3aGl0ZWxpc3QuCiAqICAgIC0gYCoqYDogbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgb2NjdXJyZW5jZXMgb2YgKmFueSogY2hhcmFjdGVyLiAgQXMgc3VjaCwgaXQncyBub3QKICogICAgICBub3QgYXBwcm9wcmlhdGUgdG8gdXNlIGluIGZvciBhIHNjaGVtZSwgZG9tYWluLCBldGMuIGFzIGl0IHdvdWxkIG1hdGNoIHRvbyBtdWNoLiAgKGUuZy4KICogICAgICBodHRwOi8vKiouZXhhbXBsZS5jb20vIHdvdWxkIG1hdGNoIGh0dHA6Ly9ldmlsLmNvbS8/aWdub3JlPS5leGFtcGxlLmNvbS8gYW5kIHRoYXQgbWlnaHQKICogICAgICBub3QgaGF2ZSBiZWVuIHRoZSBpbnRlbnRpb24uKSAgSXRzIHVzYWdlIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgcGF0aCBpcyBvay4gIChlLmcuCiAqICAgICAgaHR0cDovL2Zvby5leGFtcGxlLmNvbS90ZW1wbGF0ZXMvKiopLgogKiAgLSAqKlJlZ0V4cCoqICgqc2VlIGNhdmVhdCBiZWxvdyopCiAqICAgIC0gKkNhdmVhdCo6ICBXaGlsZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBwb3dlcmZ1bCBhbmQgb2ZmZXIgZ3JlYXQgZmxleGliaWxpdHksICB0aGVpciBzeW50YXgKICogICAgICAoYW5kIGFsbCB0aGUgaW5ldml0YWJsZSBlc2NhcGluZykgbWFrZXMgdGhlbSAqaGFyZGVyIHRvIG1haW50YWluKi4gIEl0J3MgZWFzeSB0bwogKiAgICAgIGFjY2lkZW50YWxseSBpbnRyb2R1Y2UgYSBidWcgd2hlbiBvbmUgdXBkYXRlcyBhIGNvbXBsZXggZXhwcmVzc2lvbiAoaW1obywgYWxsIHJlZ2V4ZXMgc2hvdWxkCiAqICAgICAgaGF2ZSBnb29kIHRlc3QgY292ZXJhZ2UuKS4gIEZvciBpbnN0YW5jZSwgdGhlIHVzZSBvZiBgLmAgaW4gdGhlIHJlZ2V4IGlzIGNvcnJlY3Qgb25seSBpbiBhCiAqICAgICAgc21hbGwgbnVtYmVyIG9mIGNhc2VzLiAgQSBgLmAgY2hhcmFjdGVyIGluIHRoZSByZWdleCB1c2VkIHdoZW4gbWF0Y2hpbmcgdGhlIHNjaGVtZSBvciBhCiAqICAgICAgc3ViZG9tYWluIGNvdWxkIGJlIG1hdGNoZWQgYWdhaW5zdCBhIGA6YCBvciBsaXRlcmFsIGAuYCB0aGF0IHdhcyBsaWtlbHkgbm90IGludGVuZGVkLiAgIEl0CiAqICAgICAgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgc3RyaW5nIHBhdHRlcm5zIGFuZCBvbmx5IGZhbGwgYmFjayB0byByZWd1bGFyIGV4cHJlc3Npb25zCiAqICAgICAgaWYgdGhleSBhcyBhIGxhc3QgcmVzb3J0LgogKiAgICAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBSZWdFeHAgKGkuZS4gbm90IGEgc3RyaW5nLikgIEl0IGlzCiAqICAgICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSAqKmVudGlyZSoqICpub3JtYWxpemVkIC8gYWJzb2x1dGUgVVJMKiBvZiB0aGUgcmVzb3VyY2UgYmVpbmcgdGVzdGVkCiAqICAgICAgKGV2ZW4gd2hlbiB0aGUgUmVnRXhwIGRpZCBub3QgaGF2ZSB0aGUgYF5gIGFuZCBgJGAgY29kZXMuKSAgSW4gYWRkaXRpb24sIGFueSBmbGFncwogKiAgICAgIHByZXNlbnQgb24gdGhlIFJlZ0V4cCAoc3VjaCBhcyBtdWx0aWxpbmUsIGdsb2JhbCwgaWdub3JlQ2FzZSkgYXJlIGlnbm9yZWQuCiAqICAgIC0gSWYgeW91IGFyZSBnZW5lcmF0aW5nIHlvdXIgSmF2YVNjcmlwdCBmcm9tIHNvbWUgb3RoZXIgdGVtcGxhdGluZyBlbmdpbmUgKG5vdAogKiAgICAgIHJlY29tbWVuZGVkLCBlLmcuIGluIGlzc3VlIFsjNDAwNl0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvNDAwNikpLAogKiAgICAgIHJlbWVtYmVyIHRvIGVzY2FwZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiAoYW5kIGJlIGF3YXJlIHRoYXQgeW91IG1pZ2h0IG5lZWQgbW9yZSB0aGFuCiAqICAgICAgb25lIGxldmVsIG9mIGVzY2FwaW5nIGRlcGVuZGluZyBvbiB5b3VyIHRlbXBsYXRpbmcgZW5naW5lIGFuZCB0aGUgd2F5IHlvdSBpbnRlcnBvbGF0ZWQKICogICAgICB0aGUgdmFsdWUuKSAgRG8gbWFrZSB1c2Ugb2YgeW91ciBwbGF0Zm9ybSdzIGVzY2FwaW5nIG1lY2hhbmlzbSBhcyBpdCBtaWdodCBiZSBnb29kCiAqICAgICAgZW5vdWdoIGJlZm9yZSBjb2RpbmcgeW91ciBvd24uICBlLmcuIFJ1YnkgaGFzCiAqICAgICAgW1JlZ2V4cC5lc2NhcGUoc3RyKV0oaHR0cDovL3d3dy5ydWJ5LWRvYy5vcmcvY29yZS0yLjAuMC9SZWdleHAuaHRtbCNtZXRob2QtYy1lc2NhcGUpCiAqICAgICAgYW5kIFB5dGhvbiBoYXMgW3JlLmVzY2FwZV0oaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3JlLmh0bWwjcmUuZXNjYXBlKS4KICogICAgICBKYXZhc2NyaXB0IGxhY2tzIGEgc2ltaWxhciBidWlsdCBpbiBmdW5jdGlvbiBmb3IgZXNjYXBpbmcuICBUYWtlIGEgbG9vayBhdCBHb29nbGUKICogICAgICBDbG9zdXJlIGxpYnJhcnkncyBbZ29vZy5zdHJpbmcucmVnRXhwRXNjYXBlKHMpXSgKICogICAgICBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19zdHJpbmdfc3RyaW5nLmpzLnNvdXJjZS5odG1sI2xpbmU5NjIpLgogKgogKiBSZWZlciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIgJHNjZURlbGVnYXRlUHJvdmlkZXJ9IGZvciBhbiBleGFtcGxlLgogKgogKiAjIyBTaG93IG1lIGFuIGV4YW1wbGUgdXNpbmcgU0NFLgogKgogKiA8ZXhhbXBsZSBtb2R1bGU9Im15U2NlQXBwIiBkZXBzPSJhbmd1bGFyLXNhbml0aXplLmpzIj4KICogPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAqICAgPGRpdiBuZy1jb250cm9sbGVyPSJBcHBDb250cm9sbGVyIGFzIG15Q3RybCI+CiAqICAgICA8aSBuZy1iaW5kLWh0bWw9Im15Q3RybC5leHBsaWNpdGx5VHJ1c3RlZEh0bWwiIGlkPSJleHBsaWNpdGx5VHJ1c3RlZEh0bWwiPjwvaT48YnI+PGJyPgogKiAgICAgPGI+VXNlciBjb21tZW50czwvYj48YnI+CiAqICAgICBCeSBkZWZhdWx0LCBIVE1MIHRoYXQgaXNuJ3QgZXhwbGljaXRseSB0cnVzdGVkIChlLmcuIEFsaWNlJ3MgY29tbWVudCkgaXMgc2FuaXRpemVkIHdoZW4KICogICAgICRzYW5pdGl6ZSBpcyBhdmFpbGFibGUuICBJZiAkc2FuaXRpemUgaXNuJ3QgYXZhaWxhYmxlLCB0aGlzIHJlc3VsdHMgaW4gYW4gZXJyb3IgaW5zdGVhZCBvZiBhbgogKiAgICAgZXhwbG9pdC4KICogICAgIDxkaXYgY2xhc3M9IndlbGwiPgogKiAgICAgICA8ZGl2IG5nLXJlcGVhdD0idXNlckNvbW1lbnQgaW4gbXlDdHJsLnVzZXJDb21tZW50cyI+CiAqICAgICAgICAgPGI+e3t1c2VyQ29tbWVudC5uYW1lfX08L2I+OgogKiAgICAgICAgIDxzcGFuIG5nLWJpbmQtaHRtbD0idXNlckNvbW1lbnQuaHRtbENvbW1lbnQiIGNsYXNzPSJodG1sQ29tbWVudCI+PC9zcGFuPgogKiAgICAgICAgIDxicj4KICogICAgICAgPC9kaXY+CiAqICAgICA8L2Rpdj4KICogICA8L2Rpdj4KICogPC9maWxlPgogKgogKiA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgogKiAgIGFuZ3VsYXIubW9kdWxlKCdteVNjZUFwcCcsIFsnbmdTYW5pdGl6ZSddKQogKiAgICAgLmNvbnRyb2xsZXIoJ0FwcENvbnRyb2xsZXInLCBbJyRodHRwJywgJyR0ZW1wbGF0ZUNhY2hlJywgJyRzY2UnLAogKiAgICAgICBmdW5jdGlvbigkaHR0cCwgJHRlbXBsYXRlQ2FjaGUsICRzY2UpIHsKICogICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAqICAgICAgICAgJGh0dHAuZ2V0KCJ0ZXN0X2RhdGEuanNvbiIsIHtjYWNoZTogJHRlbXBsYXRlQ2FjaGV9KS5zdWNjZXNzKGZ1bmN0aW9uKHVzZXJDb21tZW50cykgewogKiAgICAgICAgICAgc2VsZi51c2VyQ29tbWVudHMgPSB1c2VyQ29tbWVudHM7CiAqICAgICAgICAgfSk7CiAqICAgICAgICAgc2VsZi5leHBsaWNpdGx5VHJ1c3RlZEh0bWwgPSAkc2NlLnRydXN0QXNIdG1sKAogKiAgICAgICAgICAgICAnPHNwYW4gb25tb3VzZW92ZXI9InRoaXMudGV4dENvbnRlbnQ9JnF1b3Q7RXhwbGljaXRseSB0cnVzdGVkIEhUTUwgYnlwYXNzZXMgJyArCiAqICAgICAgICAgICAgICdzYW5pdGl6YXRpb24uJnF1b3Q7Ij5Ib3ZlciBvdmVyIHRoaXMgdGV4dC48L3NwYW4+Jyk7CiAqICAgICAgIH1dKTsKICogPC9maWxlPgogKgogKiA8ZmlsZSBuYW1lPSJ0ZXN0X2RhdGEuanNvbiI+CiAqIFsKICogICB7ICJuYW1lIjogIkFsaWNlIiwKICogICAgICJodG1sQ29tbWVudCI6CiAqICAgICAgICAgIjxzcGFuIG9ubW91c2VvdmVyPSd0aGlzLnRleHRDb250ZW50PVwiUFdOM0QhXCInPklzIDxpPmFueW9uZTwvaT4gcmVhZGluZyB0aGlzPzwvc3Bhbj4iCiAqICAgfSwKICogICB7ICJuYW1lIjogIkJvYiIsCiAqICAgICAiaHRtbENvbW1lbnQiOiAiPGk+WWVzITwvaT4gIEFtIEkgdGhlIG9ubHkgb3RoZXIgb25lPyIKICogICB9CiAqIF0KICogPC9maWxlPgogKgogKiA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICogICBkZXNjcmliZSgnU0NFIGRvYyBkZW1vJywgZnVuY3Rpb24oKSB7CiAqICAgICBpdCgnc2hvdWxkIHNhbml0aXplIHVudHJ1c3RlZCB2YWx1ZXMnLCBmdW5jdGlvbigpIHsKICogICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnLmh0bWxDb21tZW50JykpLmZpcnN0KCkuZ2V0SW5uZXJIdG1sKCkpCiAqICAgICAgICAgICAudG9CZSgnPHNwYW4+SXMgPGk+YW55b25lPC9pPiByZWFkaW5nIHRoaXM/PC9zcGFuPicpOwogKiAgICAgfSk7CiAqCiAqICAgICBpdCgnc2hvdWxkIE5PVCBzYW5pdGl6ZSBleHBsaWNpdGx5IHRydXN0ZWQgdmFsdWVzJywgZnVuY3Rpb24oKSB7CiAqICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdleHBsaWNpdGx5VHJ1c3RlZEh0bWwnKSkuZ2V0SW5uZXJIdG1sKCkpLnRvQmUoCiAqICAgICAgICAgICAnPHNwYW4gb25tb3VzZW92ZXI9InRoaXMudGV4dENvbnRlbnQ9JnF1b3Q7RXhwbGljaXRseSB0cnVzdGVkIEhUTUwgYnlwYXNzZXMgJyArCiAqICAgICAgICAgICAnc2FuaXRpemF0aW9uLiZxdW90OyI+SG92ZXIgb3ZlciB0aGlzIHRleHQuPC9zcGFuPicpOwogKiAgICAgfSk7CiAqICAgfSk7CiAqIDwvZmlsZT4KICogPC9leGFtcGxlPgogKgogKgogKgogKiAjIyBDYW4gSSBkaXNhYmxlIFNDRSBjb21wbGV0ZWx5PwogKgogKiBZZXMsIHlvdSBjYW4uICBIb3dldmVyLCB0aGlzIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLiAgU0NFIGdpdmVzIHlvdSBhIGxvdCBvZiBzZWN1cml0eSBiZW5lZml0cwogKiBmb3IgbGl0dGxlIGNvZGluZyBvdmVyaGVhZC4gIEl0IHdpbGwgYmUgbXVjaCBoYXJkZXIgdG8gdGFrZSBhbiBTQ0UgZGlzYWJsZWQgYXBwbGljYXRpb24gYW5kCiAqIGVpdGhlciBzZWN1cmUgaXQgb24geW91ciBvd24gb3IgZW5hYmxlIFNDRSBhdCBhIGxhdGVyIHN0YWdlLiAgSXQgbWlnaHQgbWFrZSBzZW5zZSB0byBkaXNhYmxlIFNDRQogKiBmb3IgY2FzZXMgd2hlcmUgeW91IGhhdmUgYSBsb3Qgb2YgZXhpc3RpbmcgY29kZSB0aGF0IHdhcyB3cml0dGVuIGJlZm9yZSBTQ0Ugd2FzIGludHJvZHVjZWQgYW5kCiAqIHlvdSdyZSBtaWdyYXRpbmcgdGhlbSBhIG1vZHVsZSBhdCBhIHRpbWUuCiAqCiAqIFRoYXQgc2FpZCwgaGVyZSdzIGhvdyB5b3UgY2FuIGNvbXBsZXRlbHkgZGlzYWJsZSBTQ0U6CiAqCiAqIGBgYAogKiBhbmd1bGFyLm1vZHVsZSgnbXlBcHBXaXRoU2NlRGlzYWJsZWRteUFwcCcsIFtdKS5jb25maWcoZnVuY3Rpb24oJHNjZVByb3ZpZGVyKSB7CiAqICAgLy8gQ29tcGxldGVseSBkaXNhYmxlIFNDRS4gIEZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIG9ubHkhCiAqICAgLy8gRG8gbm90IHVzZSBpbiBuZXcgcHJvamVjdHMuCiAqICAgJHNjZVByb3ZpZGVyLmVuYWJsZWQoZmFsc2UpOwogKiB9KTsKICogYGBgCiAqCiAqLwovKiBqc2hpbnQgbWF4bGVuOiAxMDAgKi8KCmZ1bmN0aW9uICRTY2VQcm92aWRlcigpIHsKICB2YXIgZW5hYmxlZCA9IHRydWU7CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSAkc2NlUHJvdmlkZXIjZW5hYmxlZAogICAqIEBraW5kIGZ1bmN0aW9uCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB2YWx1ZSBJZiBwcm92aWRlZCwgdGhlbiBlbmFibGVzL2Rpc2FibGVzIFNDRS4KICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIFNDRSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBFbmFibGVzL2Rpc2FibGVzIFNDRSBhbmQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZS4KICAgKi8KICB0aGlzLmVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgZW5hYmxlZCA9ICEhdmFsdWU7CiAgICB9CiAgICByZXR1cm4gZW5hYmxlZDsKICB9OwoKCiAgLyogRGVzaWduIG5vdGVzIG9uIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBTQ0UuCiAgICoKICAgKiBUaGUgQVBJIGNvbnRyYWN0IGZvciB0aGUgU0NFIGRlbGVnYXRlCiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAqIFRoZSBTQ0UgZGVsZWdhdGUgb2JqZWN0IG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIDMgbWV0aG9kczoKICAgKgogICAqIC0gdHJ1c3RBcyhjb250ZXh0RW51bSwgdmFsdWUpCiAgICogICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdGVsbCB0aGUgU0NFIHNlcnZpY2UgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgT0sgdG8gdXNlIGluIHRoZQogICAqICAgICBjb250ZXh0cyBzcGVjaWZpZWQgYnkgY29udGV4dEVudW0uICBJdCBtdXN0IHJldHVybiBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5CiAgICogICAgIGdldFRydXN0ZWQoKSBmb3IgYSBjb21wYXRpYmxlIGNvbnRleHRFbnVtIGFuZCByZXR1cm4gdGhpcyB2YWx1ZS4KICAgKgogICAqIC0gdmFsdWVPZih2YWx1ZSkKICAgKiAgICAgRm9yIHZhbHVlcyB0aGF0IHdlcmUgbm90IHByb2R1Y2VkIGJ5IHRydXN0QXMoKSwgcmV0dXJuIHRoZW0gYXMgaXMuICBGb3IgdmFsdWVzIHRoYXQgd2VyZQogICAqICAgICBwcm9kdWNlZCBieSB0cnVzdEFzKCksIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCB2YWx1ZSB0byB0cnVzdEFzLiAgQmFzaWNhbGx5LCBpZgogICAqICAgICB0cnVzdEFzIGlzIHdyYXBwaW5nIHRoZSBnaXZlbiB2YWx1ZXMgaW50byBzb21lIHR5cGUsIHRoaXMgb3BlcmF0aW9uIHVud3JhcHMgaXQgd2hlbiBnaXZlbgogICAqICAgICBzdWNoIGEgdmFsdWUuCiAgICoKICAgKiAtIGdldFRydXN0ZWQoY29udGV4dEVudW0sIHZhbHVlKQogICAqICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGEgdmFsdWUgdGhhdCBpcyBzYWZlIHRvIHVzZSBpbiB0aGUgY29udGV4dCBzcGVjaWZpZWQgYnkKICAgKiAgICAgY29udGV4dEVudW0gb3IgdGhyb3cgYW5kIGV4Y2VwdGlvbiBvdGhlcndpc2UuCiAgICoKICAgKiBOT1RFOiBUaGlzIGNvbnRyYWN0IGRlbGliZXJhdGVseSBkb2VzIE5PVCBzdGF0ZSB0aGF0IHZhbHVlcyByZXR1cm5lZCBieSB0cnVzdEFzKCkgbXVzdCBiZQogICAqIG9wYXF1ZSBvciB3cmFwcGVkIGluIHNvbWUgaG9sZGVyIG9iamVjdC4gIFRoYXQgaGFwcGVucyB0byBiZSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBGb3IKICAgKiBpbnN0YW5jZSwgYW4gaW1wbGVtZW50YXRpb24gY291bGQgbWFpbnRhaW4gYSByZWdpc3RyeSBvZiBhbGwgdHJ1c3RlZCBvYmplY3RzIGJ5IGNvbnRleHQuICBJbgogICAqIHN1Y2ggYSBjYXNlLCB0cnVzdEFzKCkgd291bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgaW4uICBnZXRUcnVzdGVkKCkgd291bGQKICAgKiByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHBhc3NlZCBpbiBpZiBpdCB3YXMgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5IHVuZGVyIGEgY29tcGF0aWJsZSBjb250ZXh0IG9yCiAgICogdGhyb3cgYW4gZXhjZXB0aW9uIG90aGVyd2lzZS4gIEFuIGltcGxlbWVudGF0aW9uIG1pZ2h0IG9ubHkgd3JhcCB2YWx1ZXMgc29tZSBvZiB0aGUgdGltZSBiYXNlZAogICAqIG9uIHNvbWUgY3JpdGVyaWEuICBnZXRUcnVzdGVkKCkgbWlnaHQgcmV0dXJuIGEgdmFsdWUgYW5kIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHNwZWNpYWwKICAgKiBjb25zdGFudHMgb3Igb2JqZWN0cyBldmVuIGlmIG5vdCB3cmFwcGVkLiAgQWxsIHN1Y2ggaW1wbGVtZW50YXRpb25zIGZ1bGZpbGwgdGhpcyBjb250cmFjdC4KICAgKgogICAqCiAgICogQSBub3RlIG9uIHRoZSBpbmhlcml0YW5jZSBtb2RlbCBmb3IgU0NFIGNvbnRleHRzCiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICogSSd2ZSB1c2VkIGluaGVyaXRhbmNlIGFuZCBtYWRlIFJFU09VUkNFX1VSTCB3cmFwcGVkIHR5cGVzIGEgc3VidHlwZSBvZiBVUkwgd3JhcHBlZCB0eXBlcy4gIFRoaXMKICAgKiBpcyBwdXJlbHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlscy4KICAgKgogICAqIFRoZSBjb250cmFjdCBpcyBzaW1wbHkgdGhpczoKICAgKgogICAqICAgICBnZXRUcnVzdGVkKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSkgc3VjY2VlZGluZyBpbXBsaWVzIHRoYXQgZ2V0VHJ1c3RlZCgkc2NlLlVSTCwgdmFsdWUpCiAgICogICAgIHdpbGwgYWxzbyBzdWNjZWVkLgogICAqCiAgICogSW5oZXJpdGFuY2UgaGFwcGVucyB0byBjYXB0dXJlIHRoaXMgaW4gYSBuYXR1cmFsIHdheS4gIEluIHNvbWUgZnV0dXJlLCB3ZQogICAqIG1heSBub3QgdXNlIGluaGVyaXRhbmNlIGFueW1vcmUuICBUaGF0IGlzIE9LIGJlY2F1c2Ugbm8gY29kZSBvdXRzaWRlIG9mCiAgICogc2NlLmpzIGFuZCBzY2VTcGVjcy5qcyB3b3VsZCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoaXMgZGV0YWlsLgogICAqLwoKICB0aGlzLiRnZXQgPSBbJyRwYXJzZScsICckc2NlRGVsZWdhdGUnLCBmdW5jdGlvbigKICAgICAgICAgICAgICAgICRwYXJzZSwgICAkc2NlRGVsZWdhdGUpIHsKICAgIC8vIFByZXJlcTogRW5zdXJlIHRoYXQgd2UncmUgbm90IHJ1bm5pbmcgaW4gSUU8MTEgcXVpcmtzIG1vZGUuICBJbiB0aGF0IG1vZGUsIElFIDwgMTEgYWxsb3cKICAgIC8vIHRoZSAiZXhwcmVzc2lvbihqYXZhc2NyaXB0IGV4cHJlc3Npb24pIiBzeW50YXggd2hpY2ggaXMgaW5zZWN1cmUuCiAgICBpZiAoZW5hYmxlZCAmJiBtc2llIDwgOCkgewogICAgICB0aHJvdyAkc2NlTWluRXJyKCdpZXF1aXJrcycsCiAgICAgICAgJ1N0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIGRvZXMgbm90IHN1cHBvcnQgSW50ZXJuZXQgRXhwbG9yZXIgdmVyc2lvbiA8IDExIGluIHF1aXJrcyAnICsKICAgICAgICAnbW9kZS4gIFlvdSBjYW4gZml4IHRoaXMgYnkgYWRkaW5nIHRoZSB0ZXh0IDwhZG9jdHlwZSBodG1sPiB0byB0aGUgdG9wIG9mIHlvdXIgSFRNTCAnICsKICAgICAgICAnZG9jdW1lbnQuICBTZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJHNjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTsKICAgIH0KCiAgICB2YXIgc2NlID0gc2hhbGxvd0NvcHkoU0NFX0NPTlRFWFRTKTsKCiAgICAvKioKICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAqIEBuYW1lICRzY2UjaXNFbmFibGVkCiAgICAgKiBAa2luZCBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgU0NFIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4gIElmIHlvdSB3YW50IHRvIHNldCB0aGUgdmFsdWUsIHlvdQogICAgICogaGF2ZSB0byBkbyBpdCBhdCBtb2R1bGUgY29uZmlnIHRpbWUgb24ge0BsaW5rIG5nLiRzY2VQcm92aWRlciAkc2NlUHJvdmlkZXJ9LgogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBTQ0UgaXMgZW5hYmxlZC4KICAgICAqLwogICAgc2NlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZW5hYmxlZDsKICAgIH07CiAgICBzY2UudHJ1c3RBcyA9ICRzY2VEZWxlZ2F0ZS50cnVzdEFzOwogICAgc2NlLmdldFRydXN0ZWQgPSAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZDsKICAgIHNjZS52YWx1ZU9mID0gJHNjZURlbGVnYXRlLnZhbHVlT2Y7CgogICAgaWYgKCFlbmFibGVkKSB7CiAgICAgIHNjZS50cnVzdEFzID0gc2NlLmdldFRydXN0ZWQgPSBmdW5jdGlvbih0eXBlLCB2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07CiAgICAgIHNjZS52YWx1ZU9mID0gaWRlbnRpdHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI3BhcnNlQXMKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIENvbnZlcnRzIEFuZ3VsYXIge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaW50byBhIGZ1bmN0aW9uLiAgVGhpcyBpcyBsaWtlIHtAbGluawogICAgICogbmcuJHBhcnNlICRwYXJzZX0gYW5kIGlzIGlkZW50aWNhbCB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGEgbGl0ZXJhbCBjb25zdGFudC4gIE90aGVyd2lzZSwgaXQKICAgICAqIHdyYXBzIHRojNzvVuJ1AgAKIAAACiAAAGj3KB/SxQgAJ60eEwgARQAf/NPzQABABrchwKgHYMCoBzYf9ZUiQbp1OFh6fNOAGAFTr9UAAAEBCAoATaXJAKNeymUgZXhwcmVzc2lvbiBpbiBhIGNhbGwgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZCAkc2NlLmdldFRydXN0ZWQoKnR5cGUqLAogICAgICogKnJlc3VsdCopfQogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBraW5kIG9mIFNDRSBjb250ZXh0IGluIHdoaWNoIHRoaXMgcmVzdWx0IHdpbGwgYmUgdXNlZC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuCiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOgogICAgICoKICAgICAqICAgICogYGNvbnRleHRgIOKAkyBge29iamVjdH1gIOKAkyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3MKICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLgogICAgICogICAgKiBgbG9jYWxzYCDigJMgYHtvYmplY3Q9fWAg4oCTIGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbgogICAgICogICAgICBgY29udGV4dGAuCiAgICAgKi8KICAgIHNjZS5wYXJzZUFzID0gZnVuY3Rpb24gc2NlUGFyc2VBcyh0eXBlLCBleHByKSB7CiAgICAgIHZhciBwYXJzZWQgPSAkcGFyc2UoZXhwcik7CiAgICAgIGlmIChwYXJzZWQubGl0ZXJhbCAmJiBwYXJzZWQuY29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gcGFyc2VkOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkcGFyc2UoZXhwciwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiBzY2UuZ2V0VHJ1c3RlZCh0eXBlLCB2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXMKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIERlbGVnYXRlcyB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0uICBBcyBzdWNoLAogICAgICogcmV0dXJucyBhbiBvYmplY3QgdGhhdCBpcyB0cnVzdGVkIGJ5IGFuZ3VsYXIgZm9yIHVzZSBpbiBzcGVjaWZpZWQgc3RyaWN0IGNvbnRleHR1YWwKICAgICAqIGVzY2FwaW5nIGNvbnRleHRzIChzdWNoIGFzIG5nLWJpbmQtaHRtbCwgbmctaW5jbHVkZSwgYW55IHNyYyBhdHRyaWJ1dGUKICAgICAqIGludGVycG9sYXRpb24sIGFueSBkb20gZXZlbnQgYmluZGluZyBhdHRyaWJ1dGUgaW50ZXJwb2xhdGlvbiBzdWNoIGFzIGZvciBvbmNsaWNrLCAgZXRjLikKICAgICAqIHRoYXQgdXNlcyB0aGUgcHJvdmlkZWQgdmFsdWUuICBTZWUgKiB7QGxpbmsgbmcuJHNjZSAkc2NlfSBmb3IgZW5hYmxpbmcgc3RyaWN0IGNvbnRleHR1YWwKICAgICAqIGVzY2FwaW5nLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBraW5kIG9mIGNvbnRleHQgaW4gd2hpY2ggdGhpcyB2YWx1ZSBpcyBzYWZlIGZvciB1c2UuICBlLmcuIHVybCwKICAgICAqICAgcmVzb3VyY2VfdXJsLCBodG1sLCBqcyBhbmQgY3NzLgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRydXN0ZWQvc2FmZS4KICAgICAqIEByZXR1cm5zIHsqfSBBIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RhbmQgaW4gZm9yIHRoZSBwcm92aWRlZCBgdmFsdWVgIGluIHBsYWNlcwogICAgICogd2hlcmUgQW5ndWxhciBleHBlY3RzIGEgJHNjZS50cnVzdEFzKCkgcmV0dXJuIHZhbHVlLgogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNIdG1sCiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UudHJ1c3RBc0h0bWwodmFsdWUpYCDihpIKICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzKCRzY2UuSFRNTCwgdmFsdWUpYH0KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0cnVzdEFzLgogICAgICogQHJldHVybnMgeyp9IEFuIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZEh0bWwKICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRIdG1sKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXMKICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZQogICAgICogICAgIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzICRzY2UudHJ1c3RBc30uKQogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNVcmwKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzVXJsKHZhbHVlKWAg4oaSCiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLlVSTCwgdmFsdWUpYH0KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0cnVzdEFzLgogICAgICogQHJldHVybnMgeyp9IEFuIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFVybAogICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZFVybCh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzCiAgICAgKiAgICAgb25seSBhY2NlcHQgZXhwcmVzc2lvbnMgdGhhdCBhcmUgZWl0aGVyIGxpdGVyYWwgY29uc3RhbnRzIG9yIGFyZSB0aGUKICAgICAqICAgICByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LikKICAgICAqLwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJHNjZSN0cnVzdEFzUmVzb3VyY2VVcmwKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodmFsdWUpYCDihpIKICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSlgfQogICAgICoKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRydXN0QXMuCiAgICAgKiBAcmV0dXJucyB7Kn0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkUmVzb3VyY2VVcmwKICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzCiAgICAgKiAgICAgb25seSBhY2NlcHQgZXhwcmVzc2lvbnMgdGhhdCBhcmUgZWl0aGVyIGxpdGVyYWwgY29uc3RhbnRzIG9yIGFyZSB0aGUgcmV0dXJuCiAgICAgKiAgICAgdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LikKICAgICAqLwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJHNjZSN0cnVzdEFzSnMKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzSnModmFsdWUpYCDihpIKICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzKCRzY2UuSlMsIHZhbHVlKWB9CiAgICAgKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJ1c3RBcy4KICAgICAqIEByZXR1cm5zIHsqfSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWRKcwogICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZEpzKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXMKICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZQogICAgICogICAgIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzICRzY2UudHJ1c3RBc30uKQogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWQKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIERlbGVnYXRlcyB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkYH0uICBBcyBzdWNoLAogICAgICogdGFrZXMgdGhlIHJlc3VsdCBvZiBhIHtAbGluayBuZy4kc2NlI3RydXN0QXMgYCRzY2UudHJ1c3RBc2B9KCkgY2FsbCBhbmQgcmV0dXJucyB0aGUKICAgICAqIG9yaWdpbmFsbHkgc3VwcGxpZWQgdmFsdWUgaWYgdGhlIHF1ZXJpZWQgY29udGV4dCB0eXBlIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZSBjcmVhdGVkIHR5cGUuCiAgICAgKiBJZiB0aGlzIGNvbmRpdGlvbiBpc24ndCBzYXRpc2ZpZWQsIHRocm93cyBhbiBleGNlcHRpb24uCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHRvIGJlIHVzZWQuCiAgICAgKiBAcGFyYW0geyp9IG1heWJlVHJ1c3RlZCBUaGUgcmVzdWx0IG9mIGEgcHJpb3Ige0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyBgJHNjZS50cnVzdEFzYH0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwuCiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoZSB3YXMgb3JpZ2luYWxseSBwcm92aWRlZCB0bwogICAgICogICAgICAgICAgICAgIHtAbGluayBuZy4kc2NlI3RydXN0QXMgYCRzY2UudHJ1c3RBc2B9IGlmIHZhbGlkIGluIHRoaXMgY29udGV4dC4KICAgICAqICAgICAgICAgICAgICBPdGhlcndpc2UsIHRocm93cyBhbiBleGNlcHRpb24uCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZEh0bWwKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkSHRtbCh2YWx1ZSlgIOKGkgogICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5IVE1MLCB2YWx1ZSlgfQogICAgICoKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuCiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBgJHNjZS5nZXRUcnVzdGVkKCRzY2UuSFRNTCwgdmFsdWUpYAogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRDc3MKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkQ3NzKHZhbHVlKWAg4oaSCiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZCgkc2NlLkNTUywgdmFsdWUpYH0KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlLmdldFRydXN0ZWRgLgogICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLkNTUywgdmFsdWUpYAogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRVcmwKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkVXJsKHZhbHVlKWAg4oaSCiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZCgkc2NlLlVSTCwgdmFsdWUpYH0KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlLmdldFRydXN0ZWRgLgogICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLlVSTCwgdmFsdWUpYAogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRSZXNvdXJjZVVybAogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh2YWx1ZSlgIOKGkgogICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKWB9CiAgICAgKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWRgLgogICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpYAogICAgICovCgogICAgLyoqCiAgICAgKiBAbmdkb2MgbWV0aG9kCiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRKcwogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRKcyh2YWx1ZSlgIOKGkgogICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5KUywgdmFsdWUpYH0KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlLmdldFRydXN0ZWRgLgogICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLkpTLCB2YWx1ZSlgCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc0h0bWwKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzSHRtbChleHByZXNzaW9uIHN0cmluZylgIOKGkgogICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLkhUTUwsIHZhbHVlKWB9CiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4KICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246CiAgICAgKgogICAgICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncwogICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuCiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluCiAgICAgKiAgICAgIGBjb250ZXh0YC4KICAgICAqLwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJHNjZSNwYXJzZUFzQ3NzCiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc0Nzcyh2YWx1ZSlgIOKGkgogICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLkNTUywgdmFsdWUpYH0KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHINCozc71YedgIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8QkAAQAZum8CoBzbAqAdglSIf9Vh6fNNBunU4gBAL8JQHAAABAQgKAKNezQBNpcmM3O9WLnYCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PENAAEAGbprAqAc2wKgHYJUiH/VYenzTQbqVAIAQC/B0PwAAAQEICgCjXs0ATaXJjNzvVnR3AgBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNP5QABABna7wKgHYMCoBzYf9ZUiQbqVAFh6fNOAEAFT8DUAAAEBCAoATaXJAKNezTdGRTgNCmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuCiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOgogICAgICoKICAgICAqICAgICogYGNvbnRleHRgIOKAkyBge29iamVjdH1gIOKAkyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3MKICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLgogICAgICogICAgKiBgbG9jYWxzYCDigJMgYHtvYmplY3Q9fWAg4oCTIGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbgogICAgICogICAgICBgY29udGV4dGAuCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc1VybAogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnBhcnNlQXNVcmwodmFsdWUpYCDihpIKICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5VUkwsIHZhbHVlKWB9CiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4KICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246CiAgICAgKgogICAgICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncwogICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuCiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluCiAgICAgKiAgICAgIGBjb250ZXh0YC4KICAgICAqLwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJHNjZSNwYXJzZUFzUmVzb3VyY2VVcmwKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzUmVzb3VyY2VVcmwodmFsdWUpYCDihpIKICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKWB9CiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4KICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246CiAgICAgKgogICAgICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncwogICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuCiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluCiAgICAgKiAgICAgIGBjb250ZXh0YC4KICAgICAqLwoKICAgIC8qKgogICAgICogQG5nZG9jIG1ldGhvZAogICAgICogQG5hbWUgJHNjZSNwYXJzZUFzSnMKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzSnModmFsdWUpYCDihpIKICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5KUywgdmFsdWUpYH0KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLgogICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjoKICAgICAqCiAgICAgKiAgICAqIGBjb250ZXh0YCDigJMgYHtvYmplY3R9YCDigJMgYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzCiAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS4KICAgICAqICAgICogYGxvY2Fsc2Ag4oCTIGB7b2JqZWN0PX1gIOKAkyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW4KICAgICAqICAgICAgYGNvbnRleHRgLgogICAgICovCgogICAgLy8gU2hvcnRoYW5kIGRlbGVnYXRpb25zLgogICAgdmFyIHBhcnNlID0gc2NlLnBhcnNlQXMsCiAgICAgICAgZ2V0VHJ1c3RlZCA9IHNjZS5nZXRUcnVzdGVkLAogICAgICAgIHRydXN0QXMgPSBzY2UudHJ1c3RBczsKCiAgICBmb3JFYWNoKFNDRV9DT05URVhUUywgZnVuY3Rpb24oZW51bVZhbHVlLCBuYW1lKSB7CiAgICAgIHZhciBsTmFtZSA9IGxvd2VyY2FzZShuYW1lKTsKICAgICAgc2NlW2NhbWVsQ2FzZSgicGFyc2VfYXNfIiArIGxOYW1lKV0gPSBmdW5jdGlvbihleHByKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlKGVudW1WYWx1ZSwgZXhwcik7CiAgICAgIH07CiAgICAgIHNjZVtjYW1lbENhc2UoImdldF90cnVzdGVkXyIgKyBsTmFtZSldID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gZ2V0VHJ1c3RlZChlbnVtVmFsdWUsIHZhbHVlKTsKICAgICAgfTsKICAgICAgc2NlW2NhbWVsQ2FzZSgidHJ1c3RfYXNfIiArIGxOYW1lKV0gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiB0cnVzdEFzKGVudW1WYWx1ZSwgdmFsdWUpOwogICAgICB9OwogICAgfSk7CgogICAgcmV0dXJuIHNjZTsKICB9XTsKfQoKLyoqCiAqICEhISBUaGlzIGlzIGFuIHVuZG9jdW1lbnRlZCAicHJpdmF0ZSIgc2VydmljZSAhISEKICoKICogQG5hbWUgJHNuaWZmZXIKICogQHJlcXVpcmVzICR3aW5kb3cKICogQHJlcXVpcmVzICRkb2N1bWVudAogKgogKiBAcHJvcGVydHkge2Jvb2xlYW59IGhpc3RvcnkgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IGh0bWw1IGhpc3RvcnkgYXBpID8KICogQHByb3BlcnR5IHtib29sZWFufSB0cmFuc2l0aW9ucyBEb2VzIHRoZSBicm93c2VyIHN1cHBvcnQgQ1NTIHRyYW5zaXRpb24gZXZlbnRzID8KICogQHByb3BlcnR5IHtib29sZWFufSBhbmltYXRpb25zIERvZXMgdGhlIGJyb3dzZXIgc3VwcG9ydCBDU1MgYW5pbWF0aW9uIGV2ZW50cyA/CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGlzIGlzIHZlcnkgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRlc3RpbmcgYnJvd3NlcidzIGZlYXR1cmVzLgogKi8KZnVuY3Rpb24gJFNuaWZmZXJQcm92aWRlcigpIHsKICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCAnJGRvY3VtZW50JywgZnVuY3Rpb24oJHdpbmRvdywgJGRvY3VtZW50KSB7CiAgICB2YXIgZXZlbnRTdXBwb3J0ID0ge30sCiAgICAgICAgYW5kcm9pZCA9CiAgICAgICAgICBpbnQoKC9hbmRyb2lkIChcZCspLy5leGVjKGxvd2VyY2FzZSgoJHdpbmRvdy5uYXZpZ2F0b3IgfHwge30pLnVzZXJBZ2VudCkpIHx8IFtdKVsxXSksCiAgICAgICAgYm94ZWUgPSAvQm94ZWUvaS50ZXN0KCgkd2luZG93Lm5hdmlnYXRvciB8fCB7fSkudXNlckFnZW50KSwKICAgICAgICBkb2N1bWVudCA9ICRkb2N1bWVudFswXSB8fCB7fSwKICAgICAgICB2ZW5kb3JQcmVmaXgsCiAgICAgICAgdmVuZG9yUmVnZXggPSAvXihNb3p8d2Via2l0fG1zKSg/PVtBLVpdKS8sCiAgICAgICAgYm9keVN0eWxlID0gZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LnN0eWxlLAogICAgICAgIHRyYW5zaXRpb25zID0gZmFsc2UsCiAgICAgICAgYW5pbWF0aW9ucyA9IGZhbHNlLAogICAgICAgIG1hdGNoOwoKICAgIGlmIChib2R5U3R5bGUpIHsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBib2R5U3R5bGUpIHsKICAgICAgICBpZiAobWF0Y2ggPSB2ZW5kb3JSZWdleC5leGVjKHByb3ApKSB7CiAgICAgICAgICB2ZW5kb3JQcmVmaXggPSBtYXRjaFswXTsKICAgICAgICAgIHZlbmRvclByZWZpeCA9IHZlbmRvclByZWZpeC5zdWJzdHIoMCwgMSkudG9VcHBlckNhc2UoKSArIHZlbmRvclByZWZpeC5zdWJzdHIoMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICghdmVuZG9yUHJlZml4KSB7CiAgICAgICAgdmVuZG9yUHJlZml4ID0gKCdXZWJraXRPcGFjaXR5JyBpbiBib2R5U3R5bGUpICYmICd3ZWJraXQnOwogICAgICB9CgogICAgICB0cmFuc2l0aW9ucyA9ICEhKCgndHJhbnNpdGlvbicgaW4gYm9keVN0eWxlKSB8fCAodmVuZG9yUHJlZml4ICsgJ1RyYW5zaXRpb24nIGluIGJvZHlTdHlsZSkpOwogICAgICBhbmltYXRpb25zICA9ICEhKCgnYW5pbWF0aW9uJyBpbiBib2R5U3R5bGUpIHx8ICh2ZW5kb3JQcmVmaXggKyAnQW5pbWF0aW9uJyBpbiBib2R5U3R5bGUpKTsKCiAgICAgIGlmIChhbmRyb2lkICYmICghdHJhbnNpdGlvbnMgfHwgICFhbmltYXRpb25zKSkgewogICAgICAgIHRyYW5zaXRpb25zID0gaXNTdHJpbmcoZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uKTsKICAgICAgICBhbmltYXRpb25zID0gaXNTdHJpbmcoZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRBbmltYXRpb24pOwogICAgICB9CiAgICB9CgoKICAgIHJldHVybiB7CiAgICAgIC8vIEFuZHJvaWQgaGFzIGhpc3RvcnkucHVzaFN0YXRlLCBidXQgaXQgZG9lcyBub3QgdXBkYXRlIGxvY2F0aW9uIGNvcnJlY3RseQogICAgICAvLyBzbyBsZXQncyBub3QgdXNlIHRoZSBoaXN0b3J5IEFQSSBhdCBhbGwuCiAgICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MTc0NzEKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvOTA0CgogICAgICAvLyBvbGRlciB3ZWJraXQgYnJvd3NlciAoNTMzLjkpIG9uIEJveGVlIGJveCBoYXMgZXhhY3RseSB0aGUgc2FtZSBwcm9ibGVtIGFzIEFuZHJvaWQgaGFzCiAgICAgIC8vIHNvIGxldCdzIG5vdCB1c2UgdGhlIGhpc3RvcnkgQVBJIGFsc28KICAgICAgLy8gV2UgYXJlIHB1cnBvc2VmdWxseSB1c2luZyBgIShhbmRyb2lkIDwgNClgIHRvIGNvdmVyIHRoZSBjYXNlIHdoZW4gYGFuZHJvaWRgIGlzIHVuZGVmaW5lZAogICAgICAvLyBqc2hpbnQgLVcwMTgKICAgICAgaGlzdG9yeTogISEoJHdpbmRvdy5oaXN0b3J5ICYmICR3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgJiYgIShhbmRyb2lkIDwgNCkgJiYgIWJveGVlKSwKICAgICAgLy8ganNoaW50ICtXMDE4CiAgICAgIGhhc0V2ZW50OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIC8vIElFOSBpbXBsZW1lbnRzICdpbnB1dCcgZXZlbnQgaXQncyBzbyBmdWJhcmVkIHRoYXQgd2UgcmF0aGVyIHByZXRlbmQgdGhhdCBpdCBkb2Vzbid0IGhhdmUKICAgICAgICAvLyBpdC4gSW4gcGFydGljdWxhciB0aGUgZXZlbnQgaXMgbm90IGZpcmVkIHdoZW4gYmFja3NwYWNlIG9yIGRlbGV0ZSBrZXkgYXJlIHByZXNzZWQgb3IKICAgICAgICAvLyB3aGVuIGN1dCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgogICAgICAgIGlmIChldmVudCA9PSAnaW5wdXQnICYmIG1zaWUgPT0gOSkgcmV0dXJuIGZhbHNlOwoKICAgICAgICBpZiAoaXNVbmRlZmluZWQoZXZlbnRTdXBwb3J0W2V2ZW50XSkpIHsKICAgICAgICAgIHZhciBkaXZFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgIGV2ZW50U3VwcG9ydFtldmVudF0gPSAnb24nICsgZXZlbnQgaW4gZGl2RWxtOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGV2ZW50U3VwcG9ydFtldmVudF07CiAgICAgIH0sCiAgICAgIGNzcDogY3NwKCksCiAgICAgIHZlbmRvclByZWZpeDogdmVuZG9yUHJlZml4LAogICAgICB0cmFuc2l0aW9uczogdHJhbnNpdGlvbnMsCiAgICAgIGFuaW1hdGlvbnM6IGFuaW1hdGlvbnMsCiAgICAgIGFuZHJvaWQ6IGFuZHJvaWQKICAgIH07CiAgfV07Cn0KCnZhciAkY29tcGlsZU1pbkVyciA9IG1pbkVycignJGNvbXBpbGUnKTsKCi8qKgogKiBAbmdkb2Mgc2VydmljZQogKiBAbmFtZSAkdGVtcGxhdGVSZXF1ZXN0CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgYCR0ZW1wbGF0ZVJlcXVlc3RgIHNlcnZpY2UgZG93bmxvYWRzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB1c2luZyBgJGh0dHBgIGFuZCwgdXBvbiBzdWNjZXNzLAogKiBzdG9yZXMgdGhlIGNvbnRlbnRzIGluc2lkZSBvZiBgJHRlbXBsYXRlQ2FjaGVgLiBJZiB0aGUgSFRUUCByZXF1ZXN0IGZhaWxzIG9yIHRoZSByZXNwb25zZSBkYXRhCiAqIG9mIHRoZSBIVFRQIHJlcXVlc3QgaXMgZW1wdHkgdGhlbiBhIGAkY29tcGlsZWAgZXJyb3Igd2lsbCBiZSB0aHJvd24gKHRoZSBleGNlcHRpb24gY2FuIGJlIHRod2FydGVkCiAqIGJ5IHNldHRpbmcgdGhlIDJuZCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIHRvIHRydWUpLgogKgogKiBAcGFyYW0ge3N0cmluZ30gdHBsIFRoZSBIVFRQIHJlcXVlc3QgdGVtcGxhdGUgVVJMCiAqIEBwYXJhbSB7Ym9vbGVhbj19IGlnbm9yZVJlcXVlc3RFcnJvciBXaGV0aGVyIG9yIG5vdCB0byBpZ25vcmUgdGhlIGV4Y2VwdGlvbiB3aGVuIHRoZSByZXF1ZXN0IGZhaWxzIG9yIHRoZSB0ZW1wbGF0ZSBpcyBlbXB0eQogKgogKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgSFRUUCBQcm9taXNlIGZvciB0aGUgZ2l2ZW4uCiAqCiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3RhbFBlbmRpbmdSZXF1ZXN0cyB0b3RhbCBhbW91bnQgb2YgcGVuZGluZyB0ZW1wbGF0ZSByZXF1ZXN0cyBiZWluZyBkb3dubG9hZGVkLgogKi8KZnVuY3Rpb24gJFRlbXBsYXRlUmVxdWVzdFByb3ZpZGVyKCkgewogIHRoaXMuJGdldCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCAnJGh0dHAnLCAnJHEnLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSwgJGh0dHAsICRxKSB7CiAgICBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0Rm4odHBsLCBpZ25vcmVSZXF1ZXN0RXJyb3IpIHsKICAgICAgdmFyIHNlbGYgPSBoYW5kbGVSZXF1ZXN0Rm47CiAgICAgIHNlbGYudG90YWxQZW5kaW5nUmVxdWVzdHMrKzsKCiAgICAgIHZhciB0cmFuc2Zvcm1SZXNwb25zZSA9ICRodHRwLmRlZmF1bHRzICYmICRodHRwLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlOwoKICAgICAgaWYgKGlzQXJyYXkodHJhbnNmb3JtUmVzcG9uc2UpKSB7CiAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2UgPSB0cmFuc2Zvcm1SZXNwb25zZS5maWx0ZXIoZnVuY3Rpb24odHJhbnNmb3JtZXIpIHsKICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lciAhPT0gZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1SZXNwb25zZSA9PT0gZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybSkgewogICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlID0gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIGh0dHBPcHRpb25zID0gewogICAgICAgIGNhY2hlOiAkdGVtcGxhdGVDYWNoZSwKICAgICAgICB0cmFuc2Zvcm1SZXNwb25zZTogdHJhbnNmb3JtUmVzcG9uc2UKICAgICAgfTsKCiAgICAgIHJldHVybiAkaHR0cC5nZXQodHBsLCBodHRwT3B0aW9ucykKICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgdmFyIGh0bWwgPSByZXNwb25zZS5kYXRhOwogICAgICAgICAgc2VsZi50b3RhbFBlbmRpbmdSZXF1ZXN0cy0tOwogICAgICAgICAgJHRlbXBsYXRlQ2FjaGUucHV0KHRwbCwgaHRtbCk7CiAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LCBoYW5kbGVFcnJvcik7CgogICAgICBmdW5jdGlvbiBoYW5kbGVFcnJvcihyZXNwKSB7CiAgICAgICAgc2VsZi50b3RhbFBlbmRpbmdSZXF1ZXN0cy0tOwogICAgICAgIGlmICghaWdub3JlUmVxdWVzdEVycm9yKSB7CiAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigndHBsb2FkJywgJ0ZhaWxlZCB0byBsb2FkIHRlbXBsYXRlOiB7MH0nLCB0cGwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHEucmVqZWN0KHJlc3ApOwogICAgICB9CiAgICB9CgogICAgaGFuZGxlUmVxdWVzdEZuLnRvdGFsUGVuZGluZ1JlcXVlc3RzID0gMDsKCiAgICByZXR1cm4gaGFuZGxlUmVxdWVzdEZuOwogIH1dOwp9CgpmdW5jdGlvbiAkJFRlc3RhYmlsaXR5UHJvdmlkZXIoKSB7CiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRsb2NhdGlvbicsCiAgICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAgICRicm93c2VyLCAgICRsb2NhdGlvbikgewoKICAgIC8qKgogICAgICogQG5hbWUgJHRlc3RhYmlsaXR5CiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgcHJpdmF0ZSAkJHRlc3RhYmlsaXR5IHNlcnZpY2UgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGhvZHMgZm9yIHVzZSB3aGVuIGRlYnVnZ2luZwogICAgICogb3IgYnkgYXV0b21hdGVkIHRlc3QgYW5kIGRlYnVnZ2luZyB0b29scy4KICAgICAqLwogICAgdmFyIHRlc3RhYmlsaXR5ID0ge307CgogICAgLyoqCiAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I2ZpbmRCaW5kaW5ncwogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSBib3VuZCAodmlhIG5nLWJpbmQgb3Ige3t9fSkKICAgICAqIHRvIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoZSBpbnB1dC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgcm9vdCB0byBzZWFyY2ggZnJvbS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gbWF0Y2guCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF9leGFjdE1hdGNoIElmIHRydWUsIG9ubHkgcmV0dXJucyBleGFjdCBtYXRjaGVzCiAgICAgKiAgICAgZm9yIHRoZSBleHByZXNzaW9uLiBGaWx0ZXJzIGFuZCB3aGl0ZXNwYWNlIGFyZSBpZ25vcmVkLgogICAgICovCiAgICB0ZXN0YWJpbGl0eS5maW5kQmluZGluZ3MgPSBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBvcHRfZXhhY3RNYXRjaCkgewogICAgICB2YXIgYmluZGluZ3MgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25nLWJpbmRpbmcnKTsKICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICAgIHZhciBkYXRhQmluZGluZyA9IGFuZ3VsYXIuZWxlbWVudChiaW5kaW5nKS5kYXRhKCckYmluZGluZycpOwogICAgICAgIGlmIChkYXRhQmluZGluZykgewogICAgICAgICAgZm9yRWFjaChkYXRhQmluZGluZywgZnVuY3Rpb24oYmluZGluZ05hbWUpIHsKICAgICAgICAgICAgaWYgKG9wdF9leGFjdE1hdGNoKSB7CiAgICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUmVnRXhwKCcoXnxcXHMpJyArIGVzY2FwZUZvclJlZ2V4cChleHByZXNzaW9uKSArICcoXFxzfFxcfHwkKScpOwogICAgICAgICAgICAgIGlmIChtYXRjaGVyLnRlc3QoYmluZGluZ05hbWUpKSB7CiAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goYmluZGluZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChiaW5kaW5nTmFtZS5pbmRleE9mKGV4cHJlc3Npb24pICE9IC0xKSB7CiAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goYmluZGluZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbWF0Y2hlczsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I2ZpbmRNb2RlbHMKICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdHdvLXdheSBmb3VuZCB2aWEgbmctbW9kZWwgdG8KICAgICAqIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoZSBpbnB1dC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgcm9vdCB0byBzZWFyY2ggZnJvbS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBtb2RlbCBleHByZXNzaW9uIHRvIG1hdGNoLgogICAgICogQHBhcmFtIHtib29sZWFufSBvcHRfZXhhY3RNYXRjaCBJZiB0cnVlLCBvbmx5IHJldHVybnMgZXhhY3QgbWF0Y2hlcwogICAgICogICAgIGZvciB0aGUgZXhwcmVzc2lvbi4KICAgICAqLwogICAgdGVzdGFiaWxpdHkuZmluZE1vZGVscyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIG9wdF9leGFjdE1hdGNoKSB7CiAgICAgIHZhciBwcmVmaXhlcyA9IFsnbmctJywgJ2RhdGEtbmctJywgJ25nXFw6J107CiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcHJlZml4ZXMubGVuZ3RoOyArK3ApIHsKICAgICAgICB2YXIgYXR0cmlidXRlRXF1YWxzID0gb3B0X2V4YWN0TWF0Y2ggPyAnPScgOiAnKj0nOwogICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIHByZWZpeGVzW3BdICsgJ21vZGVsJyArIGF0dHJpYnV0ZUVxdWFscyArICciJyArIGV4cHJlc3Npb24gKyAnIl0nOwogICAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIGVsZW1lbnRzOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjZ2V0TG9jYXRpb24KICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0Y3V0IGZvciBnZXR0aW5nIHRoZSBsb2NhdGlvbiBpbiBhIGJyb3dzZXIgYWdub3N0aWMgd2F5LiBSZXR1cm5zCiAgICAgKiAgICAgdGhlIHBhdGgsIHNlYXJjaCwgYW5kIGhhc2guIChlLmcuIC9wYXRoP2E9YiNoYXNoKQogICAgICovCiAgICB0ZXN0YWJpbGl0eS5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gJGxvY2F0aW9uLnVybCgpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjc2V0TG9jYXRpb24KICAgICAqCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIFNob3J0Y3V0IGZvciBuYXZpZ2F0aW5nIHRvIGEgbG9jYXRpb24gd2l0aG91dCBkb2luZyBhIGZ1bGwgcGFnZSByZWxvYWQuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgbG9jYXRpb24gdXJsIChwYXRoLCBzZWFyY2ggYW5kIGhhc2gsCiAgICAgKiAgICAgZS5nLiAvcGF0aD9hPWIjaGFzaCkgdG8gZ28gdG8uCiAgICAgKi8KICAgIHRlc3RhYmlsaXR5LnNldExvY2F0aW9uID0gZnVuY3Rpb24odXJsKSB7CiAgICAgIGlmICh1cmwgIT09ICRsb2NhdGlvbi51cmwoKSkgewogICAgICAgICRsb2NhdGlvbi51cmwodXJsKTsKICAgICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjd2hlblN0YWJsZQogICAgICoKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogQ2FsbHMgdGhlIGNhbGxiYWNrIHdoZW4gJHRpbWVvdXQgYW5kICRodHRwIHJlcXVlc3RzIGFyZSBjb21wbGV0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sKICAgICAqLwogICAgdGVzdGFiaWxpdHkud2hlblN0YWJsZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICRicm93c2VyLm5vdGlmeVdoZW5Ob091dHN0YW5kaW5nUmVxdWVzdHMoY2FsbGJhY2spOwogICAgfTsKCiAgICByZXR1cm4gdGVzdGFiaWxpdHk7CiAgfV07Cn0KCmZ1bmN0aW9uICRUaW1lb3V0UHJvdmlkZXIoKSB7CiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRxJywgJyQkcScsICckZXhjZXB0aW9uSGFuZGxlcicsCiAgICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAgICRicm93c2VyLCAgICRxLCAgICQkcSwgICAkZXhjZXB0aW9uSGFuZGxlcikgewogICAgdmFyIGRlZmVycmVkcyA9IHt9OwoKCiAgICAgLyoqCiAgICAgICogQG5nZG9jIHNlcnZpY2UKICAgICAgKiBAbmFtZSAkdGltZW91dAogICAgICAqCiAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICogQW5ndWxhcidzIHdyYXBwZXIgZm9yIGB3aW5kb3cuc2V0VGltZW91dGAuIFRoZSBgZm5gIGZ1bmN0aW9uIGlzIHdyYXBwZWQgaW50byBhIHRyeS9jYXRjaAogICAgICAqIGJsb2NrIGFuZCBkZWxlZ2F0ZXMgYW55IGV4Y2VwdGlvbnMgdG8KICAgICAgKiB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9IHNlcnZpY2UuCiAgICAgICoKICAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHJlZ2lzdGVyaW5nIGEgdGltZW91dCBmdW5jdGlvbiBpcyBhIHByb21pc2UsIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbgogICAgICAqIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQgYW5kIHRoZSB0aW1lb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLgogICAgICAqCiAgICAgICogVG8gY2FuY2VsIGEgdGltZW91dCByZXF1ZXN0LCBjYWxsIGAkdGltZW91dC5jYW5jZWwocHJvbWlzZSlgLgogICAgICAqCiAgICAgICogSW4gdGVzdHMgeW91IGNhbiB1c2Uge0BsaW5rIG5nTW9jay4kdGltZW91dCBgJHRpbWVvdXQuZmx1c2goKWB9IHRvCiAgICAgICogc3luY2hyb25vdXNseSBmbHVzaCB0aGUgcXVldWUgb2YgZGVmZXJyZWQgZnVuY3Rpb25zLgogICAgICAqCiAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBBIGZ1bmN0aW9uLCB3aG9zZSBleGVjdXRpb24gc2hvdWxkIGJlIGRlbGF5ZWQuCiAgICAgICogQHBhcmFtIHtudW1iZXI9fSBbZGVsYXk9MF0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtpbnZva2VBcHBseT10cnVlXSBJZiBzZXQgdG8gYGZhbHNlYCBza2lwcyBtb2RlbCBkaXJ0eSBjaGVja2luZywgb3RoZXJ3aXNlCiAgICAgICogICB3aWxsIGludm9rZSBgZm5gIHdpdGhpbiB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5ICRhcHBseX0gYmxvY2suCiAgICAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4gVGhlIHZhbHVlIHRoaXMKICAgICAgKiAgIHByb21pc2Ugd2lsbCBiZSByZXNvbHZlZCB3aXRoIGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGBmbmAgZnVuY3Rpb24uCiAgICAgICoKICAgICAgKi8KICAgIGZ1bmN0aW9uIHRpbWVvdXQoZm4sIGRlbGF5LCBpbnZva2VBcHBseSkgewogICAgICB2YXIgc2tpcEFwcGx5ID0gKGlzRGVmaW5lZChpbnZva2VBcHBseSkgJiYgIWludm9rZUFwcGx5KSwKICAgICAgICAgIGRlZmVycmVkID0gKHNraXBBcHBseSA/ICQkcSA6ICRxKS5kZWZlcigpLAogICAgICAgICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2UsCiAgICAgICAgICB0aW1lb3V0SWQ7CgogICAgICB0aW1lb3V0SWQgPSAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShmbigpKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZSk7CiAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICBkZWxldGUgZGVmZXJyZWRzW3Byb21pc2UuJCR0aW1lb3V0SWRdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFza2lwQXBwbHkpICRyb290U2NvcGUuJGFwcGx5KCk7CiAgICAgIH0sIGRlbGF5KTsKCiAgICAgIHByb21pc2UuJCR0aW1lb3V0SWQgPSB0aW1lb3V0SWQ7CiAgICAgIGRlZmVycmVkc1t0aW1lb3V0SWRdID0gZGVmZXJyZWQ7CgogICAgICByZXR1cm4gcHJvbWlzZTsKICAgIH0KCgogICAgIC8qKgogICAgICAqIEBuZ2RvYyBtZXRob2QKICAgICAgKiBAbmFtZSAkdGltZW91dCNjYW5jZWwKICAgICAgKgogICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAqIENhbmNlbHMgYSB0YXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHByb21pc2VgLiBBcyBhIHJlc3VsdCBvZiB0aGlzLCB0aGUgcHJvbWlzZSB3aWxsIGJlCiAgICAgICogcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi4KICAgICAgKgogICAgICAqIEBwYXJhbSB7UHJvbWlzZT19IHByb21pc2UgUHJvbWlzZSByZXR1cm5lZCBieSB0aGUgYCR0aW1lb3V0YCBmdW5jdGlvbi4KICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhc2sgaGFzbid0IGV4ZWN1dGVkIHlldCBhbmQgd2FzIHN1Y2Nlc3NmdWxseQogICAgICAqICAgY2FuY2VsZWQuCiAgICAgICovCiAgICB0aW1lb3V0LmNhbmNlbCA9IGZ1bmN0aW9uKHByb21pc2UpIHsKICAgICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS4kJHRpbWVvdXRJZCBpbiBkZWZlcnJlZHMpIHsKICAgICAgICBkZWZlcnJlZHNbcHJvbWlzZS4kJHRpbWVvdXRJZF0ucmVqZWN0KCdjYW5jZWxlZCcpOwogICAgICAgIGRlbGV0ZSBkZWZlcnJlZHNbcHJvbWlzZS4kJHRpbWVvdXRJZF07CiAgICAgICAgcmV0dXJuICRicm93c2VyLmRlZmVyLmNhbmNlbChwcm9taXNlLiQkdGltZW91dElkKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIHJldHVybiB0aW1lb3V0OwogIH1dOwp9CgovLyBOT1RFOiAgVGhlIHVzYWdlIG9mIHdpbmRvdyBhbmQgZG9jdW1lbnQgaW5zdGVhZCBvZiAkd2luZG93IGFuZCAkZG9jdW1lbnQgaGVyZSBpcwovLyBkZWxpYmVyYXRlLiAgVGhpcyBzZXJ2aWNlIGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIGJlaGF2aW9yIG9mIGFuY2hvciBub2RlcyBjcmVhdGVkIGJ5IHRoZQovLyBicm93c2VyIChyZXNvbHZpbmcgYW5kIHBhcnNpbmcgVVJMcykgdGhhdCBpcyB1bmxpa2VseSB0byBiZSBwcm92aWRlZCBieSBtb2NrIG9iamVjdHMgYW5kCi8vIGNhdXNlIHVzIHRvIGJyZWFrIHRlc3RzLiAgSW4gYWRkaXRpb24sIHdoZW4gdGhlIGJyb3dzZXIgcmVzb2x2ZXMgYSBVUkwgZm9yIFhIUiwgaXQKLy8gZG9lc24ndCBrbm93IGFib3V0IG1vY2tlZCBsb2NhdGlvbnMgYW5kIHJlc29sdmVzIFVSTHMgdG8gdGhlIHJlYWwgZG9jdW1lbnQgLSB3aGljaCBpcwovLyBleGFjdGx5IHRoZSBiZWhhdmlvciBuZWVkZWQgaGVyZS4gIFRoZXJlIGlzIGxpdHRsZSB2YWx1ZSBpcyBtb2NraW5nIHRoZXNlIG91dCBmb3IgdGhpcwovLyBzZXJ2aWNlLgp2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CnZhciBvcmlnaW5VcmwgPSB1cmxSZXNvbHZlKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCgovKioKICoKICogSW1wbGVtZW50YXRpb24gTm90ZXMgZm9yIG5vbi1JRSBicm93c2VycwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEFzc2lnbmluZyBhIFVSTCB0byB0aGUgaHJlZiBwcm9wZXJ0eSBvZiBhbiBhbmNob3IgRE9NIG5vZGUsIGV2ZW4gb25lIGF0dGFjaGVkIHRvIHRoZSBET00sCiAqIHJlc3VsdHMgYm90aCBpbiB0aGUgbm9ybWFsaXppbmcgYW5kIHBhcnNpbmcgb2YgdGhlIFVSTC4gIE5vcm1hbGl6aW5nIG1lYW5zIHRoYXQgYSByZWxhdGl2ZQogKiBVUkwgd2lsbCBiZSByZXNvbHZlZCBpbnRvIGFuIGFic29sdXRlIFVSTCBpbiB0aGUgY29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuCiAqIFBhcnNpbmcgbWVhbnMgdGhhdCB0aGUgYW5jaG9yIG5vZGUncyBob3N0LCBob3N0bmFtZSwgcHJvdG9jb2wsIHBvcnQsIHBhdGhuYW1lIGFuZCByZWxhdGVkCiAqIHByb3BlcnRpZXMgYXJlIGFsbCBwb3B1bGF0ZWQgdG8gcmVmbGVjdCB0aGUgbm9ybWFsaXplZCBVUkwuICBUaGlzIGFwcHJvYWNoIGhhcyB3aWRlCiAqIGNvbXBhdGliaWxpdHkgLSBTYWZhcmkgMSssIE1vemlsbGEgMSssIE9wZXJhIDcrLGUgZXRjLiAgU2VlCiAqIGh0dHA6Ly93d3cuYXB0YW5hLmNvbS9yZWZlcmVuY2UvaHRtbC9hcGkvSFRNTEFuY2hvckVsZW1lbnQuaHRtbAogKgogKiBJbXBsZW1lbnRhdGlvbiBOb3RlcyBmb3IgSUUKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIElFID49IDggYW5kIDw9IDEwIG5vcm1hbGl6ZXMgdGhlIFVSTCB3aGVuIGFzc2lnbmVkIHRvIHRoZSBhbmNob3Igbm9kZSBzaW1pbGFyIHRvIHRoZSBvdGhlcgogKiBicm93c2Vycy4gIEhvd2V2ZXIsIHRoZSBwYXJzZWQgY29tcG9uZW50cyB3aWxsIG5vdCBiZSBzZXQgaWYgdGhlIFVSTCBhc3NpZ25lZCBkaWQgbm90IHNwZWNpZnkKICogdGhlbS4gIChlLmcuIGlmIHlvdSBhc3NpZ24gYS5ocmVmID0gImZvbyIsIHRoZW4gYS5wcm90b2NvbCwgYS5ob3N0LCBldGMuIHdpbGwgYmUgZW1wdHkuKSAgV2UKICogd29yayBhcm91bmQgdGhhdCBieSBwZXJmb3JtaW5nIHRoZSBwYXJzaW5nIGluIGEgMm5kIHN0ZXAgYnkgdGFraW5nIGEgcHJldmlvdXNseSBub3JtYWxpemVkCiAqIFVSTCAoZS5nLiBieSBhc3NpZ25pbmcgdG8gYS5ocmVmKSBhbmQgYXNzaWduaW5nIGl0IGEuaHJlZiBhZ2Fpbi4gIFRoaXMgY29ycmVjdGx5IHBvcHVsYXRlcyB0aGUKICogcHJvcGVydGllcyBzdWNoIGFzIHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCwgZXRjLgogKgogKiBJRTcgZG9lcyBub3Qgbm9ybWFsaXplIHRoZSBVUkwgd2hlbiBhc3NpZ25lZCB0byBhbiBhbmNob3Igbm9kZS4gIChBcHBhcmVudGx5LCBpdCBkb2VzLCBpZiBvbmUKICogdXNlcyB0aGUgaW5uZXIgSFRNTCBhcHByb2FjaCB0byBhc3NpZ24gdGhlIFVSTCBhcyBwYXJ0IG9mIGFuIEhUTUwgc25pcHBldCAtCiAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ3MjcyOSkgIEhvd2V2ZXIsIHNldHRpbmcgaW1nW3NyY10gZG9lcyBub3JtYWxpemUgdGhlIFVSTC4KICogVW5mb3J0dW5hdGVseSwgc2V0dGluZyBpbWdbc3JjXSB0byBzb21ldGhpbmcgbGlrZSAiamF2YXNjcmlwdDpmb28iIG9uIElFIHRocm93cyBhbiBleGNlcHRpb24uCiAqIFNpbmNlIHRoZSBwcmltYXJ5IHVzYWdlIGZvciBub3JtYWxpemluZyBVUkxzIGlzIHRvIHNhbml0aXplIHN1Y2ggVVJMcywgd2UgY2FuJ3QgdXNlIHRoYXQKICogbWV0aG9kIGFuZCBJRSA8IDggaXMgdW5zdXBwb3J0ZWQuCiAqCiAqIFJlZmVyZW5jZXM6CiAqICAgaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEFuY2hvckVsZW1lbnQKICogICBodHRwOi8vd3d3LmFwdGFuYS5jb20vcmVmZXJlbmNlL2h0bWwvYXBpL0hUTUxBbmNob3JFbGVtZW50Lmh0bWwKICogICBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHMKICogICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3B1bGwvMjkwMgogKiAgIGh0dHA6Ly9qYW1lcy5wYWRvbHNleS5jb20vamF2YXNjcmlwdC9wYXJzaW5nLXVybHMtd2l0aC10aGUtZG9tLwogKgogKiBAa2luZCBmdW5jdGlvbgogKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkLgogKiBAZGVzY3JpcHRpb24gTm9ybWFsaXplcyBhbmQgcGFyc2VzIGEgVVJMLgogKiBAcmV0dXJucyB7b2JqZWN0fSBSZXR1cm5zIHRoZSBub3JtYWxpemVkIFVSTCBhcyBhIGRpY3Rpb25hcnkuCiAqCiAqICAgfCBtZW1iZXIgbmFtZSAgIHwgRGVzY3JpcHRpb24gICAgfAogKiAgIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwKICogICB8IGhyZWYgICAgICAgICAgfCBBIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZWQgVVJMIGlmIGl0IHdhcyBub3QgYW4gYWJzb2x1dGUgVVJMIHwKICogICB8IHByb3RvY29sICAgICAgfCBUaGUgcHJvdG9jb2wgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBjb2xvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogICB8IGhvc3QgICAgICAgICAgfCBUaGUgaG9zdCBhbmQgcG9ydCAoaWYgdGhlIHBvcnQgaXMgbm9uLWRlZmF1bHQpIG9mIHRoZSBub3JtYWxpemVkVXJsICAgIHwKICogICB8IHNlYXJjaCAgICAgICAgfCBUaGUgc2VhcmNoIHBhcmFtcywgbWludXMgdGhlIHF1ZXN0aW9uIG1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogICB8IGhhc2ggICAgICAgICAgfCBUaGUgaGFzaCBzdHJpbmcsIG1pbnVzIHRoZSBoYXNoIHN5bWJvbAogKiAgIHwgaG9zdG5hbWUgICAgICB8IFRoZSBob3N0bmFtZQogKiAgIHwgcG9ydCAgICAgICAgICB8IFRoZSBwb3J0LCB3aXRob3V0ICI6IgogKiAgIHwgcGF0aG5hbWUgICAgICB8IFRoZSBwYXRobmFtZSwgYmVnaW5uaW5nIHdpdGggIi8iCiAqCiAqLwpmdW5jdGlvbiB1cmxSZXNvbHZlKHVybCkgewogIHZhciBocmVmID0gdXJsOwoKICBpZiAobXNpZSkgewogICAgLy8gTm9ybWFsaXplIGJlZm9yZSBwYXJzZS4gIFJlZmVyIEltcGxlbWVudGF0aW9uIE5vdGVzIG9uIHdoeSB0aGlzIGlzCiAgICAvLyBkb25lIGluIHR3byBzdGVwcyBvbiBJRS4KICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGhyZWYpOwogICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7CiAgfQoKICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTsKCiAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlscwogIHJldHVybiB7CiAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLAogICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJywKICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsCiAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCAnJykgOiAnJywKICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsCiAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsCiAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LAogICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykKICAgICAgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZQogICAgICA6ICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lCiAgfTsKfQoKLyoqCiAqIFBhcnNlIGEgcmVxdWVzdCBVUkwgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBzYW1lLW9yaWdpbiByZXF1ZXN0IGFzIHRoZSBhcHBsaWNhdGlvbiBkb2N1bWVudC4KICoKICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZXF1ZXN0VXJsIFRoZSB1cmwgb2YgdGhlIHJlcXVlc3QgYXMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHJlc29sdmVkCiAqIG9yIGEgcGFyc2VkIFVSTCBvYmplY3QuCiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGZvciB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGFwcGxpY2F0aW9uIGRvY3VtZW50LgogKi8KZnVuY3Rpb24gdXJsSXNTYW1lT3JpZ2luKHJlcXVlc3RVcmwpIHsKICB2YXIgcGFyc2VkID0gKGlzU3RyaW5nKHJlcXVlc3RVcmwpKSA/IHVybFJlc29sdmUocmVxdWVzdFVybCkgOiByZXF1ZXN0VXJsOwogIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VcmwucHJvdG9jb2wgJiYKICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VcmwuaG9zdCk7Cn0KCi8qKgogKiBAbmdkb2Mgc2VydmljZQogKiBAbmFtZSAkd2luZG93CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBBIHJlZmVyZW5jZSB0byB0aGUgYnJvd3NlcidzIGB3aW5kb3dgIG9iamVjdC4gV2hpbGUgYHdpbmRvd2AKICogaXMgZ2xvYmFsbHkgYXZhaWxhYmxlIGluIEphdmFTY3JpcHQsIGl0IGNhdXNlcyB0ZXN0YWJpbGl0eSBwcm9ibGVtcywgYmVjYXVzZQogKiBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gSW4gYW5ndWxhciB3ZSBhbHdheXMgcmVmZXIgdG8gaXQgdGhyb3VnaCB0aGUKICogYCR3aW5kb3dgIHNlcnZpY2UsIHNvIGl0IG1heSBiZSBvdmVycmlkZGVuLCByZW1vdmVkIG9yIG1vY2tlZCBmb3IgdGVzdGluZy4KICoKICogRXhwcmVzc2lvbnMsIGxpa2UgdGhlIG9uZSBkZWZpbmVkIGZvciB0aGUgYG5nQ2xpY2tgIGRpcmVjdGl2ZSBpbiB0aGUgZXhhbXBsZQogKiBiZWxvdywgYXJlIGV2YWx1YXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgc2NvcGUuICBUaGVyZWZvcmUsIHRoZXJlIGlzCiAqIG5vIHJpc2sgb2YgaW5hZHZlcnRlbnRseSBjb2RpbmcgaW4gYSBkZXBlbmRlbmN5IG9uIGEgZ2xvYmFsIHZhbHVlIGluIHN1Y2ggYW4KICogZXhwcmVzc2lvbi4KICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGUgbW9kdWxlPSJ3aW5kb3dFeGFtcGxlIj4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgIDxzY3JpcHQ+CiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCd3aW5kb3dFeGFtcGxlJywgW10pCiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJHdpbmRvdycsIGZ1bmN0aW9uKCRzY29wZSwgJHdpbmRvdykgewogICAgICAgICAgICAgJHNjb3BlLmdyZWV0aW5nID0gJ0hlbGxvLCBXb3JsZCEnOwogICAgICAgICAgICAgJHNjb3BlLmRvR3JlZXRpbmcgPSBmdW5jdGlvbihncmVldGluZykgewogICAgICAgICAgICAgICAkd2luZG93LmFsZXJ0KGdyZWV0aW5nKTsKICAgICAgICAgICAgIH07CiAgICAgICAgICAgfV0pOwogICAgICAgPC9zY3JpcHQ+CiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJncmVldGluZyIgLz4KICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iZG9HcmVldGluZyhncmVldGluZykiPkFMRVJUPC9idXR0b24+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgIGl0KCdzaG91bGQgZGlzcGxheSB0aGUgZ3JlZXRpbmcgaW4gdGhlIGlucHV0IGJveCcsIGZ1bmN0aW9uKCkgewogICAgICAgZWxlbWVudChieS5tb2RlbCgnZ3JlZXRpbmcnKSkuc2VuZEtleXMoJ0hlbGxvLCBFMkUgVGVzdHMnKTsKICAgICAgIC8vIElmIHdlIGNsaWNrIHRoZSBidXR0b24gaXQgd2lsbCBibG9jayB0aGUgdGVzdCBydW5uZXIKICAgICAgIC8vIGVsZW1lbnQoJzpidXR0b24nKS5jbGljaygpOwogICAgICB9KTsKICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCmZ1bmN0aW9uICRXaW5kb3dQcm92aWRlcigpIHsKICB0aGlzLiRnZXQgPSB2YWx1ZUZuKHdpbmRvdyk7Cn0KCi8qIGdsb2JhbCBjdXJyZW5jeUZpbHRlcjogdHJ1ZSwKIGRhdGVGaWx0ZXI6IHRydWUsCiBmaWx0ZXJGaWx0ZXI6IHRydWUsCiBqc29uRmlsdGVyOiB0cnVlLAogbGltaXRUb0ZpbHRlcjogdHJ1ZSwKIGxvd2VyY2FzZUZpbHRlcjogdHJ1ZSwKIG51bWJlckZpbHRlcjogdHJ1ZSwKIG9yZGVyQnlGaWx0ZXI6IHRydWUsCiB1cHBlcmNhc2VGaWx0ZXI6IHRydWUsCiAqLwoKLyoqCiAqIEBuZ2RvYyBwcm92aWRlcgogKiBAbmFtZSAkZmlsdGVyUHJvdmlkZXIKICogQGRlc2NyaXB0aW9uCiAqCiAqIEZpbHRlcnMgYXJlIGp1c3QgZnVuY3Rpb25zIHdoaWNoIHRyYW5zZm9ybSBpbnB1dCB0byBhbiBvdXRwdXQuIEhvd2V2ZXIgZmlsdGVycyBuZWVkIHRvIGJlCiAqIERlcGVuZGVuY3kgSW5qZWN0ZWQuIFRvIGFjaGlldmUgdGhpcyBhIGZpbHRlciBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCBpcwogKiBhbm5vdGF0ZWQgd2l0aCBkZXBlbmRlbmNpZXMgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIGZpbHRlciBmdW5jdGlvbi4KICoKICogYGBganMKICogICAvLyBGaWx0ZXIgcmVnaXN0cmF0aW9uCiAqICAgZnVuY3Rpb24gTXlNb2R1bGUoJHByb3ZpZGUsICRmaWx0ZXJQcm92aWRlcikgewogKiAgICAgLy8gY3JlYXRlIGEgc2VydmljZSB0byBkZW1vbnN0cmF0ZSBpbmplY3Rpb24gKG5vdCBhbHdheXMgbmVlZGVkKQogKiAgICAgJHByb3ZpZGUudmFsdWUoJ2dyZWV0JywgZnVuY3Rpb24obmFtZSl7CiAqICAgICAgIHJldHVybiAnSGVsbG8gJyArIG5hbWUgKyAnISc7CiAqICAgICB9KTsKICoKICogICAgIC8vIHJlZ2lzdGVyIGEgZmlsdGVyIGZhY3Rvcnkgd2hpY2ggdXNlcyB0aGUKICogICAgIC8vIGdyZWV0IHNlcnZpY2UgdG8gZGVtb25zdHJhdGUgREkuCiAqICAgICAkZmlsdGVyUHJvdmlkZXIucmVnaXN0ZXIoJ2dyZWV0JywgZnVuY3Rpb24oZ3JlZXQpewogKiAgICAgICAvLyByZXR1cm4gdGhlIGZpbHRlciBmdW5jdGlvbiB3aGljaCB1c2VzIHRoZSBncmVldCBzZXJ2aWNlCiAqICAgICAgIC8vIHRvIGdlbmVyYXRlIHNhbHV0YXRpb24KICogICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRleHQpIHsKICogICAgICAgICAvLyBmaWx0ZXJzIG5lZWQgdG8gYmUgZm9yZ2l2aW5nIHNvIGNoZWNrIGlucHV0IHZhbGlkaXR5CiAqICAgICAgICAgcmV0dXJuIHRleHQgJiYgZ3JlZXQodGV4dCkgfHwgdGV4dDsKICogICAgICAgfTsKICogICAgIH0pOwogKiAgIH0KICogYGBgCiAqCiAqIFRoZSBmaWx0ZXIgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgJGluamVjdG9yYCB1bmRlciB0aGUgZmlsdGVyIG5hbWUgc3VmZml4IHdpdGgKICogYEZpbHRlcmAuCiAqCiAqIGBgYGpzCiAqICAgaXQoJ3Nob3VsZCBiZSB0aGUgc2FtZSBpbnN0YW5jZScsIGluamVjdCgKICogICAgIGZ1bmN0aW9uKCRmaWx0ZXJQcm92aWRlcikgewogKiAgICAgICAkZmlsdGVyUHJvdmlkZXIucmVnaXN0ZXIoJ3JldmVyc2UnLCBmdW5jdGlvbigpewogKiAgICAgICAgIHJldHVybiAuLi47CiAqICAgICAgIH0pOwogKiAgICAgfSwKICogICAgIGZ1bmN0aW9uKCRmaWx0ZXIsIHJldmVyc2VGaWx0ZXIpIHsKICogICAgICAgZXhwZWN0KCRmaWx0ZXIoJ3JldmVyc2UnKSkudG9CZShyZXZlcnNlRmlsdGVyKTsKICogICAgIH0pOwogKiBgYGAKICoKICoKICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGFuZ3VsYXIgZmlsdGVycyB3b3JrLCBhbmQgaG93IHRvIGNyZWF0ZSB5b3VyIG93biBmaWx0ZXJzLCBzZWUKICoge0BsaW5rIGd1aWRlL2ZpbHRlciBGaWx0ZXJzfSBpbiB0aGUgQW5ndWxhciBEZXZlbG9wZXIgR3VpZGUuCiAqLwoKLyoqCiAqIEBuZ2RvYyBzZXJ2aWNlCiAqIEBuYW1lICRmaWx0ZXIKICogQGtpbmQgZnVuY3Rpb24KICogQGRlc2NyaXB0aW9uCiAqIEZpbHRlcnMgYXJlIHVzZWQgZm9yIGZvcm1hdHRpbmcgZGF0YSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCiAqCiAqIFRoZSBnZW5lcmFsIHN5bnRheCBpbiB0ZW1wbGF0ZXMgaXMgYXMgZm9sbG93czoKICoKICogICAgICAgICB7eyBleHByZXNzaW9uIFt8IGZpbHRlcl9uYW1lWzpwYXJhbWV0ZXJfdmFsdWVdIC4uLiBdIH19CiAqCiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpbHRlciBmdW5jdGlvbiB0byByZXRyaWV2ZQogKiBAcmV0dXJuIHtGdW5jdGlvbn0gdGhlIGZpbHRlciBmdW5jdGlvbgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZSBuYW1lPSIkZmlsdGVyIiBtb2R1bGU9ImZpbHRlckV4YW1wbGUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJNYWluQ3RybCI+CiAgICAgICAgPGgzPnt7IG9yaWdpbmFsVGV4dCB9fTwvaDM+CiAgICAgICAgPGgzPnt7IGZpbHRlcmVkVGV4dCB9fTwvaDM+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CgogICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CiAgICAgIGFuZ3VsYXIubW9kdWxlKCdmaWx0ZXJFeGFtcGxlJywgW10pCiAgICAgIC5jb250cm9sbGVyKCdNYWluQ3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGZpbHRlcikgewogICAgICAgICRzY29wZS5vcmlnaW5hbFRleHQgPSAnaGVsbG8nOwogICAgICAgICRzY29wZS5maWx0ZXJlZFRleHQgPSAkZmlsdGVyKCd1cHBlcmNhc2UnKSgkc2NvcGUub3JpZ2luYWxUZXh0KTsKICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAgKi8KJEZpbHRlclByb3ZpZGVyLiRpbmplY3QgPSBbJyRwcm92aWRlJ107CmZ1bmN0aW9uICRGaWx0ZXJQcm92aWRlcigkcHJvdmlkZSkgewogIHZhciBzdWZmaXggPSAnRmlsdGVyJzsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lICRmaWx0ZXJQcm92aWRlciNyZWdpc3RlcgogICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBOYW1lIG9mIHRoZSBmaWx0ZXIgZnVuY3Rpb24sIG9yIGFuIG9iamVjdCBtYXAgb2YgZmlsdGVycyB3aGVyZQogICAqICAgIHRoZSBrZXlzIGFyZSB0aGUgZmlsdGVyIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGWM3O9WmncCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PERAAEAGbpnAqAc2wKgHYJUiH/VYenzTQbr1KIAQC/AUFwAAAQEICgCjXs0ATaXJjNzvVpp3AgAKIAAACiAAAGj3KB/SxQgAJ60eEwgARQAf/NQKQABABrcKwKgHYMCoBzYf9ZUiQbr1KFh6fNOAGAFTr9UAAAEBCAoATaXJAKNezSBmaWx0ZXIgZmFjdG9yaWVzLgogICAqIEByZXR1cm5zIHtPYmplY3R9IFJlZ2lzdGVyZWQgZmlsdGVyIGluc3RhbmNlLCBvciBpZiBhIG1hcCBvZiBmaWx0ZXJzIHdhcyBwcm92aWRlZCB0aGVuIGEgbWFwCiAgICogICAgb2YgdGhlIHJlZ2lzdGVyZWQgZmlsdGVyIGluc3RhbmNlcy4KICAgKi8KICBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCBmYWN0b3J5KSB7CiAgICBpZiAoaXNPYmplY3QobmFtZSkpIHsKICAgICAgdmFyIGZpbHRlcnMgPSB7fTsKICAgICAgZm9yRWFjaChuYW1lLCBmdW5jdGlvbihmaWx0ZXIsIGtleSkgewogICAgICAgIGZpbHRlcnNba2V5XSA9IHJlZ2lzdGVyKGtleSwgZmlsdGVyKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBmaWx0ZXJzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICRwcm92aWRlLmZhY3RvcnkobmFtZSArIHN1ZmZpeCwgZmFjdG9yeSk7CiAgICB9CiAgfQogIHRoaXMucmVnaXN0ZXIgPSByZWdpc3RlcjsKCiAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCBmdW5jdGlvbigkaW5qZWN0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbihuYW1lKSB7CiAgICAgIHJldHVybiAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBzdWZmaXgpOwogICAgfTsKICB9XTsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAvKiBnbG9iYWwKICAgIGN1cnJlbmN5RmlsdGVyOiBmYWxzZSwKICAgIGRhdGVGaWx0ZXI6IGZhbHNlLAogICAgZmlsdGVyRmlsdGVyOiBmYWxzZSwKICAgIGpzb25GaWx0ZXI6IGZhbHNlLAogICAgbGltaXRUb0ZpbHRlcjogZmFsc2UsCiAgICBsb3dlcmNhc2VGaWx0ZXI6IGZhbHNlLAogICAgbnVtYmVyRmlsdGVyOiBmYWxzZSwKICAgIG9yZGVyQnlGaWx0ZXI6IGZhbHNlLAogICAgdXBwZXJjYXNlRmlsdGVyOiBmYWxzZSwKICAqLwoKICByZWdpc3RlcignY3VycmVuY3knLCBjdXJyZW5jeUZpbHRlcik7CiAgcmVnaXN0ZXIoJ2RhdGUnLCBkYXRlRmlsdGVyKTsKICByZWdpc3RlcignZmlsdGVyJywgZmlsdGVyRmlsdGVyKTsKICByZWdpc3RlcignanNvbicsIGpzb25GaWx0ZXIpOwogIHJlZ2lzdGVyKCdsaW1pdFRvJywgbGltaXRUb0ZpbHRlcik7CiAgcmVnaXN0ZXIoJ2xvd2VyY2FzZScsIGxvd2VyY2FzZUZpbHRlcik7CiAgcmVnaXN0ZXIoJ251bWJlcicsIG51bWJlckZpbHRlcik7CiAgcmVnaXN0ZXIoJ29yZGVyQnknLCBvcmRlckJ5RmlsdGVyKTsKICByZWdpc3RlcigndXBwZXJjYXNlJywgdXBwZXJjYXNlRmlsdGVyKTsKfQoKLyoqCiAqIEBuZ2RvYyBmaWx0ZXIKICogQG5hbWUgZmlsdGVyCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBTZWxlY3RzIGEgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYGFycmF5YCBhbmQgcmV0dXJucyBpdCBhcyBhIG5ldyBhcnJheS4KICoKICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvdXJjZSBhcnJheS4KICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fGZ1bmN0aW9uKCl9IGV4cHJlc3Npb24gVGhlIHByZWRpY2F0ZSB0byBiZSB1c2VkIGZvciBzZWxlY3RpbmcgaXRlbXMgZnJvbQogKiAgIGBhcnJheWAuCiAqCiAqICAgQ2FuIGJlIG9uZSBvZjoKICoKICogICAtIGBzdHJpbmdgOiBUaGUgc3RyaW5nIGlzIGV2YWx1YXRlZCBhcyBhbiBleHByZXNzaW9uIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzIHVzZWQgZm9yIHN1YnN0cmluZyBtYXRjaCBhZ2FpbnN0CiAqICAgICB0aGUgY29udGVudHMgb2YgdGhlIGBhcnJheWAuIEFsbCBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBzdHJpbmcgcHJvcGVydGllcyBpbiBgYXJyYXlgIHRoYXQgY29udGFpbiB0aGlzIHN0cmluZwogKiAgICAgd2lsbCBiZSByZXR1cm5lZC4gVGhlIHByZWRpY2F0ZSBjYW4gYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoIGAhYC4KICoKICogICAtIGBPYmplY3RgOiBBIHBhdHRlcm4gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9uIG9iamVjdHMgY29udGFpbmVkCiAqICAgICBieSBgYXJyYXlgLiBGb3IgZXhhbXBsZSBge25hbWU6Ik0iLCBwaG9uZToiMSJ9YCBwcmVkaWNhdGUgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgaXRlbXMKICogICAgIHdoaWNoIGhhdmUgcHJvcGVydHkgYG5hbWVgIGNvbnRhaW5pbmcgIk0iIGFuZCBwcm9wZXJ0eSBgcGhvbmVgIGNvbnRhaW5pbmcgIjEiLiBBIHNwZWNpYWwKICogICAgIHByb3BlcnR5IG5hbWUgYCRgIGNhbiBiZSB1c2VkIChhcyBpbiBgeyQ6InRleHQifWApIHRvIGFjY2VwdCBhIG1hdGNoIGFnYWluc3QgYW55CiAqICAgICBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0LiBUaGF0J3MgZXF1aXZhbGVudCB0byB0aGUgc2ltcGxlIHN1YnN0cmluZyBtYXRjaCB3aXRoIGEgYHN0cmluZ2AKICogICAgIGFzIGRlc2NyaWJlZCBhYm92ZS4gVGhlIHByZWRpY2F0ZSBjYW4gYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoIGAhYC4KICogICAgIEZvciBFeGFtcGxlIGB7bmFtZTogIiFNIn1gIHByZWRpY2F0ZSB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBoYXZlIHByb3BlcnR5IGBuYW1lYAogKiAgICAgbm90IGNvbnRhaW5pbmcgIk0iLgogKgogKiAgIC0gYGZ1bmN0aW9uKHZhbHVlLCBpbmRleClgOiBBIHByZWRpY2F0ZSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB3cml0ZSBhcmJpdHJhcnkgZmlsdGVycy4gVGhlCiAqICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgLiBUaGUgZmluYWwgcmVzdWx0IGlzIGFuIGFycmF5IG9mIHRob3NlCiAqICAgICBlbGVtZW50cyB0aGF0IHRoZSBwcmVkaWNhdGUgcmV0dXJuZWQgdHJ1ZSBmb3IuCiAqCiAqIEBwYXJhbSB7ZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCl8dHJ1ZXx1bmRlZmluZWR9IGNvbXBhcmF0b3IgQ29tcGFyYXRvciB3aGljaCBpcyB1c2VkIGluCiAqICAgICBkZXRlcm1pbmluZyBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgKGZyb20gdGhlIGZpbHRlciBleHByZXNzaW9uKSBhbmQgYWN0dWFsIHZhbHVlIChmcm9tCiAqICAgICB0aGUgb2JqZWN0IGluIHRoZSBhcnJheSkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBtYXRjaC4KICoKICogICBDYW4gYmUgb25lIG9mOgogKgogKiAgIC0gYGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpYDoKICogICAgIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGdpdmVuIHRoZSBvYmplY3QgdmFsdWUgYW5kIHRoZSBwcmVkaWNhdGUgdmFsdWUgdG8gY29tcGFyZSBhbmQKICogICAgIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGUgaXRlbSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZmlsdGVyZWQgcmVzdWx0LgogKgogKiAgIC0gYHRydWVgOiBBIHNob3J0aGFuZCBmb3IgYGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHsgcmV0dXJuIGFuZ3VsYXIuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpfWAuCiAqICAgICB0aGlzIGlzIGVzc2VudGlhbGx5IHN0cmljdCBjb21wYXJpc29uIG9mIGV4cGVjdGVkIGFuZCBhY3R1YWwuCiAqCiAqICAgLSBgZmFsc2V8dW5kZWZpbmVkYDogQSBzaG9ydCBoYW5kIGZvciBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgbG9vayBmb3IgYSBzdWJzdHJpbmcgbWF0Y2ggaW4gY2FzZQogKiAgICAgaW5zZW5zaXRpdmUgd2F5LgogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZT4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgIDxkaXYgbmctaW5pdD0iZnJpZW5kcyA9IFt7bmFtZTonSm9obicsIHBob25lOic1NTUtMTI3Nid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidNYXJ5JywgcGhvbmU6JzgwMC1CSUctTUFSWSd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidNaWtlJywgcGhvbmU6JzU1NS00MzIxJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J0FkYW0nLCBwaG9uZTonNTU1LTU2NzgnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonSnVsaWUnLCBwaG9uZTonNTU1LTg3NjUnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonSnVsaWV0dGUnLCBwaG9uZTonNTU1LTU2NzgnfV0iPjwvZGl2PgoKICAgICAgIFNlYXJjaDogPGlucHV0IG5nLW1vZGVsPSJzZWFyY2hUZXh0Ij4KICAgICAgIDx0YWJsZSBpZD0ic2VhcmNoVGV4dFJlc3VsdHMiPgogICAgICAgICA8dHI+PHRoPk5hbWU8L3RoPjx0aD5QaG9uZTwvdGg+PC90cj4KICAgICAgICAgPHRyIG5nLXJlcGVhdD0iZnJpZW5kIGluIGZyaWVuZHMgfCBmaWx0ZXI6c2VhcmNoVGV4dCI+CiAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+CiAgICAgICAgICAgPHRkPnt7ZnJpZW5kLnBob25lfX08L3RkPgogICAgICAgICA8L3RyPgogICAgICAgPC90YWJsZT4KICAgICAgIDxocj4KICAgICAgIEFueTogPGlucHV0IG5nLW1vZGVsPSJzZWFyY2guJCI+IDxicj4KICAgICAgIE5hbWUgb25seSA8aW5wdXQgbmctbW9kZWw9InNlYXJjaC5uYW1lIj48YnI+CiAgICAgICBQaG9uZSBvbmx5IDxpbnB1dCBuZy1tb2RlbD0ic2VhcmNoLnBob25lIj48YnI+CiAgICAgICBFcXVhbGl0eSA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJzdHJpY3QiPjxicj4KICAgICAgIDx0YWJsZSBpZD0ic2VhcmNoT2JqUmVzdWx0cyI+CiAgICAgICAgIDx0cj48dGg+TmFtZTwvdGg+PHRoPlBob25lPC90aD48L3RyPgogICAgICAgICA8dHIgbmctcmVwZWF0PSJmcmllbmRPYmogaW4gZnJpZW5kcyB8IGZpbHRlcjpzZWFyY2g6c3RyaWN0Ij4KICAgICAgICAgICA8dGQ+e3tmcmllbmRPYmoubmFtZX19PC90ZD4KICAgICAgICAgICA8dGQ+e3tmcmllbmRPYmoucGhvbmV9fTwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICA8L3RhYmxlPgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIHZhciBleHBlY3RGcmllbmROYW1lcyA9IGZ1bmN0aW9uKGV4cGVjdGVkTmFtZXMsIGtleSkgewogICAgICAgICBlbGVtZW50LmFsbChieS5yZXBlYXRlcihrZXkgKyAnIGluIGZyaWVuZHMnKS5jb2x1bW4oa2V5ICsgJy5uYW1lJykpLnRoZW4oZnVuY3Rpb24oYXJyKSB7CiAgICAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24od2QsIGkpIHsKICAgICAgICAgICAgIGV4cGVjdCh3ZC5nZXRUZXh0KCkpLnRvTWF0Y2goZXhwZWN0ZWROYW1lc1tpXSk7CiAgICAgICAgICAgfSk7CiAgICAgICAgIH0pOwogICAgICAgfTsKCiAgICAgICBpdCgnc2hvdWxkIHNlYXJjaCBhY3Jvc3MgYWxsIGZpZWxkcyB3aGVuIGZpbHRlcmluZyB3aXRoIGEgc3RyaW5nJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIHZhciBzZWFyY2hUZXh0ID0gZWxlbWVudChieS5tb2RlbCgnc2VhcmNoVGV4dCcpKTsKICAgICAgICAgc2VhcmNoVGV4dC5jbGVhcigpOwogICAgICAgICBzZWFyY2hUZXh0LnNlbmRLZXlzKCdtJyk7CiAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnTWFyeScsICdNaWtlJywgJ0FkYW0nXSwgJ2ZyaWVuZCcpOwoKICAgICAgICAgc2VhcmNoVGV4dC5jbGVhcigpOwogICAgICAgICBzZWFyY2hUZXh0LnNlbmRLZXlzKCc3NicpOwogICAgICAgICBleHBlY3RGcmllbmROYW1lcyhbJ0pvaG4nLCAnSnVsaWUnXSwgJ2ZyaWVuZCcpOwogICAgICAgfSk7CgogICAgICAgaXQoJ3Nob3VsZCBzZWFyY2ggaW4gc3BlY2lmaWMgZmllbGRzIHdoZW4gZmlsdGVyaW5nIHdpdGggYSBwcmVkaWNhdGUgb2JqZWN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgIHZhciBzZWFyY2hBbnkgPSBlbGVtZW50KGJ5Lm1vZGVsKCdzZWFyY2guJCcpKTsKICAgICAgICAgc2VhcmNoQW55LmNsZWFyKCk7CiAgICAgICAgIHNlYXJjaEFueS5zZW5kS2V5cygnaScpOwogICAgICAgICBleHBlY3RGcmllbmROYW1lcyhbJ01hcnknLCAnTWlrZScsICdKdWxpZScsICdKdWxpZXR0ZSddLCAnZnJpZW5kT2JqJyk7CiAgICAgICB9KTsKICAgICAgIGl0KCdzaG91bGQgdXNlIGEgZXF1YWwgY29tcGFyaXNvbiB3aGVuIGNvbXBhcmF0b3IgaXMgdHJ1ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICB2YXIgc2VhcmNoTmFtZSA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlYXJjaC5uYW1lJykpOwogICAgICAgICB2YXIgc3RyaWN0ID0gZWxlbWVudChieS5tb2RlbCgnc3RyaWN0JykpOwogICAgICAgICBzZWFyY2hOYW1lLmNsZWFyKCk7CiAgICAgICAgIHNlYXJjaE5hbWUuc2VuZEtleXMoJ0p1bGllJyk7CiAgICAgICAgIHN0cmljdC5jbGljaygpOwogICAgICAgICBleHBlY3RGcmllbmROYW1lcyhbJ0p1bGllJ10sICdmcmllbmRPYmonKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KZnVuY3Rpb24gZmlsdGVyRmlsdGVyKCkgewogIHJldHVybiBmdW5jdGlvbihhcnJheSwgZXhwcmVzc2lvbiwgY29tcGFyYXRvcikgewogICAgaWYgKCFpc0FycmF5KGFycmF5KSkgcmV0dXJuIGFycmF5OwoKICAgIHZhciBjb21wYXJhdG9yVHlwZSA9IHR5cGVvZihjb21wYXJhdG9yKSwKICAgICAgICBwcmVkaWNhdGVzID0gW107CgogICAgcHJlZGljYXRlcy5jaGVjayA9IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByZWRpY2F0ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICBpZiAoIXByZWRpY2F0ZXNbal0odmFsdWUsIGluZGV4KSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgaWYgKGNvbXBhcmF0b3JUeXBlICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIGlmIChjb21wYXJhdG9yVHlwZSA9PT0gJ2Jvb2xlYW4nICYmIGNvbXBhcmF0b3IpIHsKICAgICAgICBjb21wYXJhdG9yID0gZnVuY3Rpb24ob2JqLCB0ZXh0KSB7CiAgICAgICAgICByZXR1cm4gYW5ndWxhci5lcXVhbHMob2JqLCB0ZXh0KTsKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIGNvbXBhcmF0b3IgPSBmdW5jdGlvbihvYmosIHRleHQpIHsKICAgICAgICAgIGlmIChvYmogJiYgdGV4dCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGV4dCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgZm9yICh2YXIgb2JqS2V5IGluIG9iaikgewogICAgICAgICAgICAgIGlmIChvYmpLZXkuY2hhckF0KDApICE9PSAnJCcgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmosIG9iaktleSkgJiYKICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcihvYmpbb2JqS2V5XSwgdGV4dFtvYmpLZXldKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHRleHQgPSAoJycgKyB0ZXh0KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgcmV0dXJuICgnJyArIG9iaikudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRleHQpID4gLTE7CiAgICAgICAgfTsKICAgICAgfQogICAgfQoKICAgIHZhciBzZWFyY2ggPSBmdW5jdGlvbihvYmosIHRleHQpIHsKICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyAmJiB0ZXh0LmNoYXJBdCgwKSA9PT0gJyEnKSB7CiAgICAgICAgcmV0dXJuICFzZWFyY2gob2JqLCB0ZXh0LnN1YnN0cigxKSk7CiAgICAgIH0KICAgICAgc3dpdGNoICh0eXBlb2Ygb2JqKSB7CiAgICAgICAgY2FzZSAnYm9vbGVhbic6CiAgICAgICAgY2FzZSAnbnVtYmVyJzoKICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3Iob2JqLCB0ZXh0KTsKICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgc3dpdGNoICh0eXBlb2YgdGV4dCkgewogICAgICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgICAgIHJldHVybiBjb21wYXJhdG9yKG9iaiwgdGV4dCk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgZm9yICh2YXIgb2JqS2V5IGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iaktleS5jaGFyQXQoMCkgIT09ICckJyAmJiBzZWFyY2gob2JqW29iaktleV0sIHRleHQpKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICANCozc71aadwIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8RUAAQAZumMCoBzbAqAdglSIf9Vh6fNNBuxTwgBAL8PROAAABAQgKAKNezQBNpcmM3O9Wq38CAGpgAABqYAAAaPcoH9LFCAAnrR4TCABFAGBc1BBAAEAGdqTAqAdgwKgHNh/1lSJBuxTwWHp804AQAVPwNQAAAQEICgBNpckAo17NN0ZFOA0KICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgY2FzZSAnYXJyYXknOgogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHNlYXJjaChvYmpbaV0sIHRleHQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9OwogICAgc3dpdGNoICh0eXBlb2YgZXhwcmVzc2lvbikgewogICAgICBjYXNlICdib29sZWFuJzoKICAgICAgY2FzZSAnbnVtYmVyJzoKICAgICAgY2FzZSAnc3RyaW5nJzoKICAgICAgICAvLyBTZXQgdXAgZXhwcmVzc2lvbiBvYmplY3QgYW5kIGZhbGwgdGhyb3VnaAogICAgICAgIGV4cHJlc3Npb24gPSB7JDpleHByZXNzaW9ufTsKICAgICAgICAvLyBqc2hpbnQgLVcwODYKICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICAvLyBqc2hpbnQgK1cwODYKICAgICAgICBmb3IgKHZhciBrZXkgaW4gZXhwcmVzc2lvbikgewogICAgICAgICAgKGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByZXNzaW9uW3BhdGhdID09PSAndW5kZWZpbmVkJykgcmV0dXJuOwogICAgICAgICAgICBwcmVkaWNhdGVzLnB1c2goZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VhcmNoKHBhdGggPT0gJyQnID8gdmFsdWUgOiAodmFsdWUgJiYgdmFsdWVbcGF0aF0pLCBleHByZXNzaW9uW3BhdGhdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KShrZXkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAnZnVuY3Rpb24nOgogICAgICAgIHByZWRpY2F0ZXMucHVzaChleHByZXNzaW9uKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICB9CiAgICB2YXIgZmlsdGVyZWQgPSBbXTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXJyYXkubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIHZhbHVlID0gYXJyYXlbal07CiAgICAgIGlmIChwcmVkaWNhdGVzLmNoZWNrKHZhbHVlLCBqKSkgewogICAgICAgIGZpbHRlcmVkLnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmlsdGVyZWQ7CiAgfTsKfQoKLyoqCiAqIEBuZ2RvYyBmaWx0ZXIKICogQG5hbWUgY3VycmVuY3kKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgYSBjdXJyZW5jeSAoaWUgJDEsMjM0LjU2KS4gV2hlbiBubyBjdXJyZW5jeSBzeW1ib2wgaXMgcHJvdmlkZWQsIGRlZmF1bHQKICogc3ltYm9sIGZvciBjdXJyZW50IGxvY2FsZSBpcyB1c2VkLgogKgogKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IElucHV0IHRvIGZpbHRlci4KICogQHBhcmFtIHtzdHJpbmc9fSBzeW1ib2wgQ3VycmVuY3kgc3ltYm9sIG9yIGlkZW50aWZpZXIgdG8gYmUgZGlzcGxheWVkLgogKiBAcGFyYW0ge251bWJlcj19IGZyYWN0aW9uU2l6ZSBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdGhlIGFtb3VudCB0bywgZGVmYXVsdHMgdG8gZGVmYXVsdCBtYXggZnJhY3Rpb24gc2l6ZSBmb3IgY3VycmVudCBsb2NhbGUKICogQHJldHVybnMge3N0cmluZ30gRm9ybWF0dGVkIG51bWJlci4KICoKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGUgbW9kdWxlPSJjdXJyZW5jeUV4YW1wbGUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHNjcmlwdD4KICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2N1cnJlbmN5RXhhbXBsZScsIFtdKQogICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgICAkc2NvcGUuYW1vdW50ID0gMTIzNC41NjsKICAgICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBuZy1tb2RlbD0iYW1vdW50Ij4gPGJyPgogICAgICAgICBkZWZhdWx0IGN1cnJlbmN5IHN5bWJvbCAoJCk6IDxzcGFuIGlkPSJjdXJyZW5jeS1kZWZhdWx0Ij57e2Ftb3VudCB8IGN1cnJlbmN5fX08L3NwYW4+PGJyPgogICAgICAgICBjdXN0b20gY3VycmVuY3kgaWRlbnRpZmllciAoVVNEJCk6IDxzcGFuIGlkPSJjdXJyZW5jeS1jdXN0b20iPnt7YW1vdW50IHwgY3VycmVuY3k6IlVTRCQifX08L3NwYW4+CiAgICAgICAgIG5vIGZyYWN0aW9ucyAoMCk6IDxzcGFuIGlkPSJjdXJyZW5jeS1uby1mcmFjdGlvbnMiPnt7YW1vdW50IHwgY3VycmVuY3k6IlVTRCQiOjB9fTwvc3Bhbj4KICAgICAgIDwvZGl2PgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIGl0KCdzaG91bGQgaW5pdCB3aXRoIDEyMzQuNTYnLCBmdW5jdGlvbigpIHsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LWRlZmF1bHQnKSkuZ2V0VGV4dCgpKS50b0JlKCckMSwyMzQuNTYnKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LWN1c3RvbScpKS5nZXRUZXh0KCkpLnRvQmUoJ1VTRCQxLDIzNC41NicpOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktbm8tZnJhY3Rpb25zJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM1Jyk7CiAgICAgICB9KTsKICAgICAgIGl0KCdzaG91bGQgdXBkYXRlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdzYWZhcmknKSB7CiAgICAgICAgICAgLy8gU2FmYXJpIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlIG1pbnVzIGtleS4gU2VlCiAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNDgxCiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2Ftb3VudCcpKS5jbGVhcigpOwogICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdhbW91bnQnKSkuc2VuZEtleXMoJy0xMjM0Jyk7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXJyZW5jeS1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnKCQxLDIzNC4wMCknKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LWN1c3RvbScpKS5nZXRUZXh0KCkpLnRvQmUoJyhVU0QkMSwyMzQuMDApJyk7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXJyZW5jeS1uby1mcmFjdGlvbnMnKSkuZ2V0VGV4dCgpKS50b0JlKCcoVVNEJDEsMjM0KScpOwogICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwpjdXJyZW5jeUZpbHRlci4kaW5qZWN0ID0gWyckbG9jYWxlJ107CmZ1bmN0aW9uIGN1cnJlbmN5RmlsdGVyKCRsb2NhbGUpIHsKICB2YXIgZm9ybWF0cyA9ICRsb2NhbGUuTlVNQkVSX0ZPUk1BVFM7CiAgcmV0dXJuIGZ1bmN0aW9uKGFtb3VudCwgY3VycmVuY3lTeW1ib2wsIGZyYWN0aW9uU2l6ZSkgewogICAgaWYgKGlzVW5kZWZpbmVkKGN1cnJlbmN5U3ltYm9sKSkgewogICAgICBjdXJyZW5jeVN5bWJvbCA9IGZvcm1hdHMuQ1VSUkVOQ1lfU1lNOwogICAgfQoKICAgIGlmIChpc1VuZGVmaW5lZChmcmFjdGlvblNpemUpKSB7CiAgICAgIGZyYWN0aW9uU2l6ZSA9IGZvcm1hdHMuUEFUVEVSTlNbMV0ubWF4RnJhYzsKICAgIH0KCiAgICAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZCBwYXNzIGl0IHRocm91Z2gKICAgIHJldHVybiAoYW1vdW50ID09IG51bGwpCiAgICAgICAgPyBhbW91bnQKICAgICAgICA6IGZvcm1hdE51bWJlcihhbW91bnQsIGZvcm1hdHMuUEFUVEVSTlNbMV0sIGZvcm1hdHMuR1JPVVBfU0VQLCBmb3JtYXRzLkRFQ0lNQUxfU0VQLCBmcmFjdGlvblNpemUpLgogICAgICAgICAgICByZXBsYWNlKC9cdTAwQTQvZywgY3VycmVuY3lTeW1ib2wpOwogIH07Cn0KCi8qKgogKiBAbmdkb2MgZmlsdGVyCiAqIEBuYW1lIG51bWJlcgogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogRm9ybWF0cyBhIG51bWJlciBhcyB0ZXh0LgogKgogKiBJZiB0aGUgaW5wdXQgaXMgbm90IGEgbnVtYmVyIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KICoKICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBudW1iZXIgTnVtYmVyIHRvIGZvcm1hdC4KICogQHBhcmFtIHsobnVtYmVyfHN0cmluZyk9fSBmcmFjdGlvblNpemUgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRoZSBudW1iZXIgdG8uCiAqIElmIHRoaXMgaXMgbm90IHByb3ZpZGVkIHRoZW4gdGhlIGZyYWN0aW9uIHNpemUgaXMgY29tcHV0ZWQgZnJvbSB0aGUgY3VycmVudCBsb2NhbGUncyBudW1iZXIKICogZm9ybWF0dGluZyBwYXR0ZXJuLiBJbiB0aGUgY2FzZSBvZiB0aGUgZGVmYXVsdCBsb2NhbGUsIGl0IHdpbGwgYmUgMy4KICogQHJldHVybnMge3N0cmluZ30gTnVtYmVyIHJvdW5kZWQgdG8gZGVjaW1hbFBsYWNlcyBhbmQgcGxhY2VzIGEg4oCcLOKAnSBhZnRlciBlYWNoIHRoaXJkIGRpZ2l0LgogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZSBtb2R1bGU9Im51bWJlckZpbHRlckV4YW1wbGUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHNjcmlwdD4KICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ251bWJlckZpbHRlckV4YW1wbGUnLCBbXSkKICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgJHNjb3BlLnZhbCA9IDEyMzQuNTY3ODk7CiAgICAgICAgICAgfV0pOwogICAgICAgPC9zY3JpcHQ+CiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgRW50ZXIgbnVtYmVyOiA8aW5wdXQgbmctbW9kZWw9J3ZhbCc+PGJyPgogICAgICAgICBEZWZhdWx0IGZvcm1hdHRpbmc6IDxzcGFuIGlkPSdudW1iZXItZGVmYXVsdCc+e3t2YWwgfCBudW1iZXJ9fTwvc3Bhbj48YnI+CiAgICAgICAgIE5vIGZyYWN0aW9uczogPHNwYW4+e3t2YWwgfCBudW1iZXI6MH19PC9zcGFuPjxicj4KICAgICAgICAgTmVnYXRpdmUgbnVtYmVyOiA8c3Bhbj57ey12YWwgfCBudW1iZXI6NH19PC9zcGFuPgogICAgICAgPC9kaXY+CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgbnVtYmVycycsIGZ1bmN0aW9uKCkgewogICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbnVtYmVyLWRlZmF1bHQnKSkuZ2V0VGV4dCgpKS50b0JlKCcxLDIzNC41NjgnKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygndmFsIHwgbnVtYmVyOjAnKSkuZ2V0VGV4dCgpKS50b0JlKCcxLDIzNScpOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCctdmFsIHwgbnVtYmVyOjQnKSkuZ2V0VGV4dCgpKS50b0JlKCctMSwyMzQuNTY3OScpOwogICAgICAgfSk7CgogICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHsKICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsJykpLmNsZWFyKCk7CiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbCcpKS5zZW5kS2V5cygnMzM3NC4zMzMnKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ251bWJlci1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnMywzNzQuMzMzJyk7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbCB8IG51bWJlcjowJykpLmdldFRleHQoKSkudG9CZSgnMywzNzQnKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnLXZhbCB8IG51bWJlcjo0JykpLmdldFRleHQoKSkudG9CZSgnLTMsMzc0LjMzMzAnKTsKICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwoKCm51bWJlckZpbHRlci4kaW5qZWN0ID0gWyckbG9jYWxlJ107CmZ1bmN0aW9uIG51bWJlckZpbHRlcigkbG9jYWxlKSB7CiAgdmFyIGZvcm1hdHMgPSAkbG9jYWxlLk5VTUJFUl9GT1JNQVRTOwogIHJldHVybiBmdW5jdGlvbihudW1iZXIsIGZyYWN0aW9uU2l6ZSkgewoKICAgIC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkIHBhc3MgaXQgdGhyb3VnaAogICAgcmV0dXJuIChudW1iZXIgPT0gbnVsbCkKICAgICAgICA/IG51bWJlcgogICAgICAgIDogZm9ybWF0TnVtYmVyKG51bWJlciwgZm9ybWF0cy5QQVRURVJOU1swXSwgZm9ybWF0cy5HUk9VUF9TRVAsIGZvcm1hdHMuREVDSU1BTF9TRVAsCiAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplKTsKICB9Owp9Cgp2YXIgREVDSU1BTF9TRVAgPSAnLic7CmZ1bmN0aW9uIGZvcm1hdE51bWJlcihudW1iZXIsIHBhdHRlcm4sIGdyb3VwU2VwLCBkZWNpbWFsU2VwLCBmcmFjdGlvblNpemUpIHsKICBpZiAoIWlzRmluaXRlKG51bWJlcikgfHwgaXNPYmplY3QobnVtYmVyKSkgcmV0dXJuICcnOwoKICB2YXIgaXNOZWdhdGl2ZSA9IG51bWJlciA8IDA7CiAgbnVtYmVyID0gTWF0aC5hYnMobnVtYmVyKTsKICB2YXIgbnVtU3RyID0gbnVtYmVyICsgJycsCiAgICAgIGZvcm1hdGVkVGV4dCA9ICcnLAogICAgICBwYXJ0cyA9IFtdOwoKICB2YXIgaGFzRXhwb25lbnQgPSBmYWxzZTsKICBpZiAobnVtU3RyLmluZGV4T2YoJ2UnKSAhPT0gLTEpIHsKICAgIHZhciBtYXRjaCA9IG51bVN0ci5tYXRjaCgvKFtcZFwuXSspZSgtPykoXGQrKS8pOwogICAgaWYgKG1hdGNoICYmIG1hdGNoWzJdID09ICctJyAmJiBtYXRjaFszXSA+IGZyYWN0aW9uU2l6ZSArIDEpIHsKICAgICAgbnVtU3RyID0gJzAnOwogICAgICBudW1iZXIgPSAwOwogICAgfSBlbHNlIHsKICAgICAgZm9ybWF0ZWRUZXh0ID0gbnVtU3RyOwogICAgICBoYXNFeHBvbmVudCA9IHRydWU7CiAgICB9CiAgfQoKICBpZiAoIWhhc0V4cG9uZW50KSB7CiAgICB2YXIgZnJhY3Rpb25MZW4gPSAobnVtU3RyLnNwbGl0KERFQ0lNQUxfU0VQKVsxXSB8fCAnJykubGVuZ3RoOwoKICAgIC8vIGRldGVybWluZSBmcmFjdGlvblNpemUgaWYgaXQgaXMgbm90IHNwZWNpZmllZAogICAgaWYgKGlzVW5kZWZpbmVkKGZyYWN0aW9uU2l6ZSkpIHsKICAgICAgZnJhY3Rpb25TaXplID0gTWF0aC5taW4oTWF0aC5tYXgocGF0dGVybi5taW5GcmFjLCBmcmFjdGlvbkxlbiksIHBhdHRlcm4ubWF4RnJhYyk7CiAgICB9CgogICAgLy8gc2FmZWx5IHJvdW5kIG51bWJlcnMgaW4gSlMgd2l0aG91dCBoaXR0aW5nIGltcHJlY2lzaW9ucyBvZiBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljcwogICAgLy8gaW5zcGlyZWQgYnk6CiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3JvdW5kCiAgICBudW1iZXIgPSArKE1hdGgucm91bmQoKyhudW1iZXIudG9TdHJpbmcoKSArICdlJyArIGZyYWN0aW9uU2l6ZSkpLnRvU3RyaW5nKCkgKyAnZScgKyAtZnJhY3Rpb25TaXplKTsKCiAgICBpZiAobnVtYmVyID09PSAwKSB7CiAgICAgIGlzTmVnYXRpdmUgPSBmYWxzZTsKICAgIH0KCiAgICB2YXIgZnJhY3Rpb24gPSAoJycgKyBudW1iZXIpLnNwbGl0KERFQ0lNQUxfU0VQKTsKICAgIHZhciB3aG9sZSA9IGZyYWN0aW9uWzBdOwogICAgZnJhY3Rpb24gPSBmcmFjdGlvblsxXSB8fCAnJzsKCiAgICB2YXIgaSwgcG9zID0gMCwKICAgICAgICBsZ3JvdXAgPSBwYXR0ZXJuLmxnU2l6ZSwKICAgICAgICBncm91cCA9IHBhdHRlcm4uZ1NpemU7CgogICAgaWYgKHdob2xlLmxlbmd0aCA+PSAobGdyb3VwICsgZ3JvdXApKSB7CiAgICAgIHBvcyA9IHdob2xlLmxlbmd0aCAtIGxncm91cDsKICAgICAgZm9yIChpID0gMDsgaSA8IHBvczsgaSsrKSB7CiAgICAgICAgaWYgKChwb3MgLSBpKSAlIGdyb3VwID09PSAwICYmIGkgIT09IDApIHsKICAgICAgICAgIGZvcm1hdGVkVGV4dCArPSBncm91cFNlcDsKICAgICAgICB9CiAgICAgICAgZm9ybWF0ZWRUZXh0ICs9IHdob2xlLmNoYXJBdChpKTsKICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IHBvczsgaSA8IHdob2xlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICgod2hvbGUubGVuZ3RoIC0gaSkgJSBsZ3JvdXAgPT09IDAgJiYgaSAhPT0gMCkgewogICAgICAgIGZvcm1hdGVkVGV4dCArPSBncm91cFNlcDsKICAgICAgfQogICAgICBmb3JtYXRlZFRleHQgKz0gd2hvbGUuY2hhckF0KGkpOwogICAgfQoKICAgIC8vIGZvcm1hdCBmcmFjdGlvbiBwYXJ0LgogICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IGZyYWN0aW9uU2l6ZSkgewogICAgICBmcmFjdGlvbiArPSAnMCc7CiAgICB9CgogICAgaWYgKGZyYWN0aW9uU2l6ZSAmJiBmcmFjdGlvblNpemUgIT09ICIwIikgZm9ybWF0ZWRUZXh0ICs9IGRlY2ltYWxTZXAgKyBmcmFjdGlvbi5zdWJzdHIoMCwgZnJhY3Rpb25TaXplKTsKICB9IGVsc2UgewoKICAgIGlmIChmcmFjdGlvblNpemUgPiAwICYmIG51bWJlciA+IC0xICYmIG51bWJlciA8IDEpIHsKICAgICAgZm9ybWF0ZWRUZXh0ID0gbnVtYmVyLnRvRml4ZWQoZnJhY3Rpb25TaXplKTsKICAgIH0KICB9CgogIHBhcnRzLnB1c2goaXNOZWdhdGl2ZSA/IHBhdHRlcm4ubmVnUHJlIDogcGF0dGVybi5wb3NQcmUsCiAgICAgICAgICAgICBmb3JtYXRlZFRleHQsCiAgICAgICAgICAgICBpc05lZ2F0aXZlID8gcGF0dGVybi5uZWdTdWYgOiBwYXR0ZXJuLnBvc1N1Zik7CiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpOwp9CgpmdW5jdGlvbiBwYWROdW1iZXIobnVtLCBkaWdpdHMsIHRyaW0pIHsKICB2YXIgbmVnID0gJyc7CiAgaWYgKG51bSA8IDApIHsKICAgIG5lZyA9ICAnLSc7CiAgICBudW0gPSAtbnVtOwogIH0KICBudW0gPSAnJyArIG51bTsKICB3aGlsZSAobnVtLmxlbmd0aCA8IGRpZ2l0cykgbnVtID0gJzAnICsgbnVtOwogIGlmICh0cmltKQogICAgbnVtID0gbnVtLnN1YnN0cihudW0ubGVuZ3RoIC0gZGlnaXRzKTsKICByZXR1cm4gbmVnICsgbnVtOwp9CgoKZnVuY3Rpb24gZGF0ZUdldHRlcihuYW1lLCBzaXplLCBvZmZzZXQsIHRyaW0pIHsKICBvZmZzZXQgPSBvZmZzZXQgfHwgMDsKICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIHZhbHVlID0gZGF0ZVsnZ2V0JyArIG5hbWVdKCk7CiAgICBpZiAob2Zmc2V0ID4gMCB8fCB2YWx1ZSA+IC1vZmZzZXQpCiAgICAgIHZhbHVlICs9IG9mZnNldDsKICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBvZmZzZXQgPT0gLTEyKSB2YWx1ZSA9IDEyOwogICAgcmV0dXJuIHBhZE51bWJlcih2YWx1ZSwgc2l6ZSwgdHJpbSk7CiAgfTsKfQoKZnVuY3Rpb24gZGF0ZVN0ckdldHRlcihuYW1lLCBzaG9ydEZvcm0pIHsKICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgZm9ybWF0cykgewogICAgdmFyIHZhbHVlID0gZGF0ZVsnZ2V0JyArIG5hbWVdKCk7CiAgICB2YXIgZ2V0ID0gdXBwZXJjYXNlKHNob3J0Rm9ybSA/ICgnU0hPUlQnICsgbmFtZSkgOiBuYW1lKTsKCiAgICByZXR1cm4gZm9ybWF0c1tnZXRdW3ZhbHVlXTsKICB9Owp9CgpmdW5jdGlvbiB0aW1lWm9uZUdldHRlcihkYXRlKSB7CiAgdmFyIHpvbmUgPSAtMSAqIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICB2YXIgcGFkZGVkWm9uZSA9ICh6b25lID49IDApID8gIisiIDogIiI7CgogIHBhZGRlZFpvbmUgKz0gcGFkTnVtYmVyKE1hdGhbem9uZSA+IDAgPyAnZmxvb3InIDogJ2NlaWwnXSh6b25lIC8gNjApLCAyKSArCiAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMik7CgogIHJldHVybiBwYWRkZWRab25lOwp9CgpmdW5jdGlvbiBnZXRGaXJzdFRodXJzZGF5T2ZZZWFyKHllYXIpIHsKICAgIC8vIDAgPSBpbmRleCBvZiBKYW51YXJ5CiAgICB2YXIgZGF5T2ZXZWVrT25GaXJzdCA9IChuZXcgRGF0ZSh5ZWFyLCAwLCAxKSkuZ2V0RGF5KCk7CiAgICAvLyA0ID0gaW5kZXggb2YgVGh1cnNkYXkgKCsxIHRvIGFjY291bnQgZm9yIDFzdCA9IDUpCiAgICAvLyAxMSA9IGluZGV4IG9mICpuZXh0KiBUaHVyc2RheSAoKzEgYWNjb3VudCBmb3IgMXN0ID0gMTIpCiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMCwgKChkYXlPZldlZWtPbkZpcnN0IDw9IDQpID8gNSA6IDEyKSAtIGRheU9mV2Vla09uRmlyc3QpOwp9CgpmdW5jdGlvbiBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGV0aW1lKSB7CiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZXRpbWUuZ2V0RnVsbFllYXIoKSwgZGF0ZXRpbWUuZ2V0TW9udGgoKSwKICAgICAgLy8gNCA9IGluZGV4IG9mIFRodXJzZGF5CiAgICAgIGRhdGV0aW1lLmdldERhdGUoKSArICg0IC0gZGF0ZXRpbWUuZ2V0RGF5KCkpKTsKfQoKZnVuY3Rpb24gd2Vla0dldHRlcihzaXplKSB7CiAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHZhciBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkpLAogICAgICAgICB0aGlzVGh1cnMgPSBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGUpOwoKICAgICAgdmFyIGRpZmYgPSArdGhpc1RodXJzIC0gK2ZpcnN0VGh1cnMsCiAgICAgICAgIHJlc3VsdCA9IDEgKyBNYXRoLnJvdW5kKGRpZmYgLyA2LjA0OGU4KTsgLy8gNi4wNDhlOCBtcyBwZXIgd2VlawoKICAgICAgcmV0dXJuIHBhZE51bWJlcihyZXN1bHQsIHNpemUpOwogICB9Owp9CgpmdW5jdGlvbiBhbXBtR2V0dGVyKGRhdGUsIGZvcm1hdHMpIHsKICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgMTIgPyBmb3JtYXRzLkFNUE1TWzBdIDogZm9ybWF0cy5BTVBNU1sxXTsKfQoKdmFyIERBVEVfRk9STUFUUyA9IHsKICB5eXl5OiBkYXRlR2V0dGVyKCdGdWxsWWVhcicsIDQpLAogICAgeXk6IGRhdGVHZXR0ZXIoJ0Z1bGxZZWFyJywgMiwgMCwgdHJ1ZSksCiAgICAgeTogZGF0ZUdldHRlcignRnVsbFllYXInLCAxKSwKICBNTU1NOiBkYXRlU3RyR2V0dGVyKCdNb250aCcpLAogICBNTU06IGRhdGVTdHJHZXR0ZXIoJ01vbnRoJywgdHJ1ZSksCiAgICBNTTogZGF0ZUdldHRlcignTW9udGgnLCAyLCAxKSwKICAgICBNOiBkYXRlR2V0dGVyKCdNb250aCcsIDEsIDEpLAogICAgZGQ6IGRhdGVHZXR0ZXIoJ0RhdGUnLCAyKSwKICAgICBkOiBkYXRlR2V0dGVyKCdEYXRlJywgMSksCiAgICBISDogZGF0ZUdldHRlcignSG91cnMnLCAyKSwKICAgICBIOiBkYXRlR2V0dGVyKCdIb3VycycsIDEpLAogICAgaGg6IGRhdGVHZXR0ZXIoJ0hvdXJzJywgMiwgLTEyKSwKICAgICBoOiBkYXRlR2V0dGVyKCdIb3VycycsIDEsIC0xMiksCiAgICBtbTogZGF0ZUdldHRlcignTWludXRlcycsIDIpLAogICAgIG06IGRhdGVHZXR0ZXIoJ01pbnV0ZXMnLCAxKSwKICAgIHNzOiBkYXRlR2V0dGVyKCdTZWNvbmRzJywgMiksCiAgICAgczogZGF0ZUdldHRlcignU2Vjb25kcycsIDEpLAogICAgIC8vIHdoaWxlIElTTyA4NjAxIHJlcXVpcmVzIGZyYWN0aW9ucyB0byBiZSBwcmVmaXhlZCB3aXRoIGAuYCBvciBgLGAKICAgICAvLyB3ZSBjYW4gYmUganVzdCBzYWZlbHkgcmVseSBvbiB1c2luZyBgc3NzYCBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBzaW5nbGUgb3IgdHdvIGRpZ2l0IGZyYWN0aW9ucwogICBzc3M6IGRhdGVHZXR0ZXIoJ01pbGxpc2Vjb25kcycsIDMpLAogIEVFRUU6IGRhdGVTdHJHZXR0ZXIoJ0RheScpLAogICBFRUU6IGRhdGVTdHJHZXR0ZXIoJ0RheScsIHRydWUpLAogICAgIGE6IGFtcG1HZXR0ZXIsCiAgICAgWjogdGltZVpvbmVHZXR0ZXIsCiAgICB3dzogd2Vla0dldHRlcigyKSwKICAgICB3OiB3ZWVrR2V0dGVyKDEpCn07Cgp2YXIgREFURV9GT1JNQVRTX1NQTElUID0gLygoPzpbXnlNZEhobXNhWkV3J10rKXwoPzonKD86W14nXXwnJykqJyl8KD86RSt8eSt8TSt8ZCt8SCt8aCt8bSt8cyt8YXxafHcrKSkoLiopLywKICAgIE5VTUJFUl9TVFJJTkcgPSAvXlwtP1xkKyQvOwoKLyoqCiAqIEBuZ2RvYyBmaWx0ZXIKICogQG5hbWUgZGF0ZQogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogICBGb3JtYXRzIGBkYXRlYCB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGBmb3JtYXRgLgogKgogKiAgIGBmb3JtYXRgIHN0cmluZyBjYW4gYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50czoKICoKICogICAqIGAneXl5eSdgOiA0IGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIgKGUuZy4gQUQgMSA9PiAwMDAxLCBBRCAyMDEwID0+IDIwMTApCiAqICAgKiBgJ3l5J2A6IDIgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgeWVhciwgcGFkZGVkICgwMC05OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApCiAqICAgKiBgJ3knYDogMSBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB5ZWFyLCBlLmcuIChBRCAxID0+IDEsIEFEIDE5OSA9PiAxOTkpCiAqICAgKiBgJ01NTU0nYDogTW9udGggaW4geWVhciAoSmFudWFyeS1EZWNlbWJlcikKICogICAqIGAnTU1NJ2A6IE1vbnRoIGluIHllYXIgKEphbi1EZWMpCiAqICAgKiBgJ01NJ2A6IE1vbnRoIGluIHllYXIsIHBhZGRlZCAoMDEtMTIpCiAqICAgKiBgJ00nYDogTW9udGggaW4geWVhciAoMS0xMikKICogICAqIGAnZGQnYDogRGF5IGluIG1vbnRoLCBwYWRkZWQgKDAxLTMxKQogKiAgICogYCdkJ2A6IERheSBpbiBtb250aCAoMS0zMSkKICogICAqIGAnRUVFRSdgOiBEYXkgaW4gV2VlaywoU3VuZGF5LVNhdHVyZGF5KQogKiAgICogYCdFRUUnYDogRGF5IGluIFdlZWssIChTdW4tU2F0KQogKiAgICogYCdISCdgOiBIb3VyIGluIGRheSwgcGFkZGVkICgwMC0yMykKICogICAqIGAnSCdgOiBIb3VyIGluIGRheSAoMC0yMykKICogICAqIGAnaGgnYDogSG91ciBpbiBBTS9QTSwgcGFkZGVkICgwMS0xMikKICogICAqIGAnaCdgOiBIb3VyIGluIEFNL1BNLCAoMS0xMikKICogICAqIGAnbW0nYDogTWludXRlIGluIGhvdXIsIHBhZGRlZCAoMDAtNTkpCiAqICAgKiBgJ20nYDogTWludXRlIGluIGhvdXIgKDAtNTkpCiAqICAgKiBgJ3NzJ2A6IFNlY29uZCBpbiBtaW51dGUsIHBhZGRlZCAoMDAtNTkpCiAqICAgKiBgJ3MnYDogU2Vjb25kIGluIG1pbnV0ZSAoMC01OSkKICogICAqIGAnLnNzcycgb3IgJyxzc3MnYDogTWlsbGlzZWNvbmQgaW4gc2Vjb25kLCBwYWRkZWQgKDAwMC05OTkpCiAqICAgKiBgJ2EnYDogQU0vUE0gbWFya2VyCiAqICAgKiBgJ1onYDogNCBkaWdpdCAoK3NpZ24pIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0aW1lem9uZSBvZmZzZXQgKC0xMjAwLSsxMjAwKQogKiAgICogYCd3dydgOiBJU08tODYwMSB3ZWVrIG9mIHllYXIgKDAwLTUzKQogKiAgICogYCd3J2A6IElTTy04NjAxIHdlZWsgb2YgeWVhciAoMC01MykKICoKICogICBgZm9ybWF0YCBzdHJpbmcgY2FuIGFsc28gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgcHJlZGVmaW5lZAogKiAgIHtAbGluayBndWlkZS9pMThuIGxvY2FsaXphYmxlIGZvcm1hdHN9OgogKgogKiAgICogYCdtZWRpdW0nYDogZXF1aXZhbGVudCB0byBgJ01NTSBkLCB5IGg6bW06c3MgYSdgIGZvciBlbl9VUyBsb2NhbGUKICogICAgIChlLmcuIFNlcCAzLCAyMDEwIDEyOjA1OjA4IFBNKQogKiAgICogYCdzaG9ydCdgOiBlcXVpdmFsZW50IHRvIGAnTS9kL3l5IGg6bW0gYSdgIGZvciBlbl9VUyAgbG9jYWxlIChlLmcuIDkvMy8xMCAxMjowNSBQTSkKICogICAqIGAnZnVsbERhdGUnYDogZXF1aXZhbGVudCB0byBgJ0VFRUUsIE1NTU0gZCwgeSdgIGZvciBlbl9VUyAgbG9jYWxlCiAqICAgICAoZS5nLiBGcmlkYXksIFNlcHRlbWJlciAzLCAyMDEwKQogKiAgICogYCdsb25nRGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAnTU1NTSBkLCB5J2AgZm9yIGVuX1VTICBsb2NhbGUgKGUuZy4gU2VwdGVtYmVyIDMsIDIwMTApCiAqICAgKiBgJ21lZGl1bURhdGUnYDogZXF1aXZhbGVudCB0byBgJ01NTSBkLCB5J2AgZm9yIGVuX1VTICBsb2NhbGUgKGUuZy4gU2VwIDMsIDIwMTApCiAqICAgKiBgJ3Nob3J0RGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAnTS9kL3l5J2AgZm9yIGVuX1VTIGxvY2FsZSAoZS5nLiA5LzMvMTApCiAqICAgKiBgJ21lZGl1bVRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW06c3MgYSdgIGZvciBlbl9VUyBsb2NhbGUgKGUuZy4gMTI6MDU6MDggUE0pCiAqICAgKiBgJ3Nob3J0VGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbSBhJ2AgZm9yIGVuX1VTIGxvY2FsZSAoZS5nLiAxMjowNSBQTSkKICoKICogICBgZm9ybWF0YCBzdHJpbmcgY2FuIGNvbnRhaW4gbGl0ZXJhbCB2YWx1ZXMuIFRoZXNlIG5lZWQgdG8gYmUgZXNjYXBlZCBieSBzdXJyb3VuZGluZyB3aXRoIHNpbmdsZSBxdW90ZXMgKGUuZy4KICogICBgImggJ2luIHRoZSBtb3JuaW5nJyJgKS4gSW4gb3JkZXIgdG8gb3V0cHV0IGEgc2luZ2xlIHF1b3RlLCBlc2NhcGUgaXQgLSBpLmUuLCB0d28gc2luZ2xlIHF1b3RlcyBpbiBhIHNlcXVlbmNlCiAqICAgKGUuZy4gYCJoICdvJydjbG9jayciYCkuCiAqCiAqIEBwYXJhbSB7KERhdGV8bnVtYmVyfHN0cmluZyl9IGRhdGUgRGF0ZSB0byBmb3JtYXQgZWl0aGVyIGFzIERhdGUgb2JqZWN0LCBtaWxsaXNlY29uZHMgKHN0cmluZyBvcgogKiAgICBudW1iZXIpIG9yIHZhcmlvdXMgSVNPIDg2MDEgZGF0ZXRpbWUgc3RyaW5nIGZvcm1hdHMgKGUuZy4geXl5eS1NTS1kZFRISDptbTpzcy5zc3NaIGFuZCBpdHMKICogICAgc2hvcnRlciB2ZXJzaW9ucyBsaWtlIHl5eXktTU0tZGRUSEg6bW1aLCB5eXl5LU1NLWRkIG9yIHl5eXlNTWRkVEhIbW1zc1opLiBJZiBubyB0aW1lem9uZSBpcwogKiAgICBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpbnB1dCwgdGhlIHRpbWUgaXMgY29uc2lkZXJlZCB0byBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuCiAqIEBwYXJhbSB7c3RyaW5nPX0gZm9ybWF0IEZvcm1hdHRpbmcgcnVsZXMgKHNlZSBEZXNjcmlwdGlvbikuIElmIG5vdCBzcGVjaWZpZWQsCiAqICAgIGBtZWRpdW1EYXRlYCBpcyB1c2VkLgogKiBAcGFyYW0ge3N0cmluZz19IHRpbWV6b25lIFRpbWV6b25lIHRvIGJlIHVzZWQgZm9yIGZvcm1hdHRpbmcuIFJpZ2h0IG5vdywgb25seSBgJ1VUQydgIGlzIHN1cHBvcnRlZC4KICogICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyIHdpbGwgYmUgdXNlZC4KICogQHJldHVybnMge3N0cmluZ30gRm9ybWF0dGVkIHN0cmluZyBvciB0aGUgaW5wdXQgaWYgaW5wdXQgaXMgbm90IHJlY29nbml6ZWQgYXMgZGF0ZS9taWxsaXMuCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHNwYW4gbmctbm9uLWJpbmRhYmxlPnt7MTI4ODMyMzYyMzAwNiB8IGRhdGU6J21lZGl1bSd9fTwvc3Bhbj46CiAgICAgICAgICAgPHNwYW4+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZTonbWVkaXVtJ319PC9zcGFuPjxicj4KICAgICAgIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57ezEyODgzMjM2MjMwMDYgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tOnNzIFonfX08L3NwYW4+OgogICAgICAgICAgPHNwYW4+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJ319PC9zcGFuPjxicj4KICAgICAgIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57ezEyODgzMjM2MjMwMDYgfCBkYXRlOidNTS9kZC95eXl5IEAgaDptbWEnfX08L3NwYW4+OgogICAgICAgICAgPHNwYW4+e3snMTI4ODMyMzYyMzAwNicgfCBkYXRlOidNTS9kZC95eXl5IEAgaDptbWEnfX08L3NwYW4+PGJyPgogICAgICAgPHNwYW4gbmctbm9uLWJpbmRhYmxlPnt7MTI4ODMyMzYyMzAwNiB8IGRhdGU6Ik1NL2RkL3l5eXkgJ2F0JyBoOm1tYSJ9fTwvc3Bhbj46CiAgICAgICAgICA8c3Bhbj57eycxMjg4MzIzNjIzMDA2JyB8IGRhdGU6Ik1NL2RkL3l5eXkgJ2F0JyBoOm1tYSJ9fTwvc3Bhbj48YnI+CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgZGF0ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCIxMjg4MzIzNjIzMDA2IHwgZGF0ZTonbWVkaXVtJyIpKS5nZXRUZXh0KCkpLgogICAgICAgICAgICB0b01hdGNoKC9PY3QgMlxkLCAyMDEwIFxkezEsMn06XGR7Mn06XGR7Mn0gKEFNfFBNKS8pOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCIxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJyIpKS5nZXRUZXh0KCkpLgogICAgICAgICAgICB0b01hdGNoKC8yMDEwXC0xMFwtMlxkIFxkezJ9OlxkezJ9OlxkezJ9IChcLXxcKyk/XGR7NH0vKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygiJzEyODgzMjM2MjMwMDYnIHwgZGF0ZTonTU0vZGQveXl5eSBAIGg6bW1hJyIpKS5nZXRUZXh0KCkpLgogICAgICAgICAgICB0b01hdGNoKC8xMFwvMlxkXC8yMDEwIEAgXGR7MSwyfTpcZHsyfShBTXxQTSkvKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygiJzEyODgzMjM2MjMwMDYnIHwgZGF0ZTpcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVwiIikpLmdldFRleHQoKSkuCiAgICAgICAgICAgIHRvTWF0Y2goLzEwXC8yXGRcLzIwMTAgYXQgXGR7MSwyfTpcZHsyfShBTXxQTSkvKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KZGF0ZUZpbHRlci4kaW5qZWN0ID0gWyckbG9jYWxlJ107CmZ1bmN0aW9uIGRhdGVGaWx0ZXIoJGxvY2FsZSkgewoKCiAgdmFyIFJfSVNPODYwMV9TVFIgPSAvXihcZHs0fSktPyhcZFxkKS0/KFxkXGQpKD86VChcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpcLihcZCspKT8pPyk/KFp8KFsrLV0pKFxkXGQpOj8oXGRcZCkpPyk/JC87CiAgICAgICAgICAgICAgICAgICAgIC8vIDEgICAgICAgIDIgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNSAgICAgICAgICA2ICAgICAgICAgIDcgICAgICAgICAgOCAgOSAgICAgMTAgICAgICAxMQogIGZ1bmN0aW9uIGpzb25TdHJpbmdUb0RhdGUoc3RyaW5nKSB7CiAgICB2YXIgbWF0Y2g7CiAgICBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goUl9JU084NjAxX1NUUikpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgwKSwKICAgICAgICAgIHR6SG91ciA9IDAsCiAgICAgICAgICB0ek1pbiAgPSAwLAogICAgICAgICAgZGF0ZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENGdWxsWWVhciA6IGRhdGUuc2V0RnVsbFllYXIsCiAgICAgICAgICB0aW1lU2V0dGVyID0gbWF0Y2hbOF0gPyBkYXRlLnNldFVUQ0hvdXJzIDogZGF0ZS5zZXRIb3VyczsKCiAgICAgIGlmIChtYXRjaFs5XSkgewogICAgICAgIHR6SG91ciA9IGludChtYXRjaFs5XSArIG1hdGNoWzEwXSk7CiAgICAgICAgdHpNaW4gPSBpbnQobWF0Y2hbOV0gKyBtYXRjaFsxMV0pOwogICAgICB9CiAgICAgIGRhdGVTZXR0ZXIuY2FsbChkYXRlLCBpbnQobWF0Y2hbMV0pLCBpbnQobWF0Y2hbMl0pIC0gMSwgaW50KG1hdGNoWzNdKSk7CiAgICAgIHZhciBoID0gaW50KG1hdGNoWzRdIHx8IDApIC0gdHpIb3VyOwogICAgICB2YXIgbSA9IGludChtYXRjaFs1XSB8fCAwKSAtIHR6TWluOwogICAgICB2YXIgcyA9IGludChtYXRjaFs2XSB8fCAwKTsKICAgICAgdmFyIG1zID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KCcwLicgKyAobWF0Y2hbN10gfHwgMCkpICogMTAwMCk7CiAgICAgIHRpbWVTZXR0ZXIuY2FsbChkYXRlLCBoLCBtLCBzLCBtcyk7CiAgICAgIHJldHVybiBkYXRlOwogICAgfQogICAgcmV0dXJuIHN0cmluZzsKICB9CgoKICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgZm9ybWF0LCB0aW1lem9uZSkgewogICAgdmFyIHRleHQgPSAnJywKICAgICAgICBwYXJ0cyA9IFtdLAogICAgICAgIGZuLCBtYXRjaDsKCiAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJ21lZGl1bURhdGUnOwogICAgZm9ybWF0ID0gJGxvY2FsZS5EQVRFVElNRV9GT1JNQVRTW2Zvcm1hdF0gfHwgZm9ybWF0OwogICAgaWYgKGlzU3RyaW5nKGRhdGUpKSB7CiAgICAgIGRhdGUgPSBOVU1CRVJfU1RSSU5HLnRlc3QoZGF0ZSkgPyBpbnQoZGF0ZSkgOiBqc29uU3RyaW5nVG9EYXRlKGRhdGUpOwogICAgfQoKICAgIGlmIChpc051bWJlcihkYXRlKSkgewogICAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSk7CiAgICB9CgogICAgaWYgKCFpc0RhdGUoZGF0ZSkpIHsKICAgICAgcmV0dXJuIGRhdGU7CiAgICB9CgogICAgd2hpbGUgKGZvcm1hdCkgewogICAgICBtYXRjaCA9IERBVEVfRk9STUFUU19TUExJVC5leGVjKGZvcm1hdCk7CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIHBhcnRzID0gY29uY2F0KHBhcnRzLCBtYXRjaCwgMSk7CiAgICAgICAgZm9ybWF0ID0gcGFydHMucG9wKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFydHMucHVzaChmb3JtYXQpOwogICAgICAgIGZvcm1hdCA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGltZXpvbmUgJiYgdGltZXpvbmUgPT09ICdVVEMnKSB7CiAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7CiAgICAgIGRhdGUuc2V0TWludXRlcyhkYXRlLmdldE1pbnV0ZXMoKSArIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSk7CiAgICB9CiAgICBmb3JFYWNoKHBhcnRzLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICBmbiA9IERBVEVfRk9STUFUU1t2YWx1ZV07CiAgICAgIHRleHQgKz0gZm4gPyBmbihkYXRlLCAkbG9jYWxlLkRBVEVUSU1FX0ZPUk1BVFMpCiAgICAgICAgICAgICAgICAgOiB2YWx1ZS5yZXBsYWNlKC8oXid8JyQpL2csICcnKS5yZXBsYWNlKC8nJy9nLCAiJyIpOwogICAgfSk7CgogICAgcmV0dXJuIHRleHQ7CiAgfTsKfQoKCi8qKgogKiBAbmdkb2MgZmlsdGVyCiAqIEBuYW1lIGpzb24KICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqICAgQWxsb3dzIHlvdSB0byBjb252ZXJ0IGEgSmF2YVNjcmlwdCBvYmplY3QgaW50byBKU09OIHN0cmluZy4KICoKICogICBUaGlzIGZpbHRlciBpcyBtb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuIFdoZW4gdXNpbmcgdGhlIGRvdWJsZSBjdXJseSB7e3ZhbHVlfX0gbm90YXRpb24KICogICB0aGUgYmluZGluZyBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBKU09OLgogKgogKiBAcGFyYW0geyp9IG9iamVjdCBBbnkgSmF2YVNjcmlwdCBvYmplY3QgKGluY2x1ZGluZyBhcnJheXMgYW5kIHByaW1pdGl2ZSB0eXBlcykgdG8gZmlsdGVyLgogKiBAcmV0dXJucyB7c3RyaW5nfSBKU09OIHN0cmluZy4KICoKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICA8cHJlPnt7IHsnbmFtZSc6J3ZhbHVlJ30gfCBqc29uIH19PC9wcmU+CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgaXQoJ3Nob3VsZCBqc29uaWZ5IGZpbHRlcmVkIG9iamVjdHMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygieyduYW1lJzondmFsdWUnfSIpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1x7XG4gICJuYW1lIjogPyJ2YWx1ZSJcbn0vKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKgogKi8KZnVuY3Rpb24ganNvbkZpbHRlcigpIHsKICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICByZXR1cm4gdG9Kc29uKG9iamVjdCwgdHJ1ZSk7CiAgfTsKfQoKCi8qKgogKiBAbmdkb2MgZmlsdGVyCiAqIEBuYW1lIGxvd2VyY2FzZQogKiBAa2luZCBmdW5jdGlvbgogKiBAZGVzY3JpcHRpb24KICogQ29udmVydHMgc3RyaW5nIHRvIGxvd2VyY2FzZS4KICogQHNlZSBhbmd1bGFyLmxvd2VyY2FzZQogKi8KdmFyIGxvd2VyY2FzZUZpbHRlciA9IHZhbHVlRm4obG93ZXJjYXNlKTsKCgovKioKICogQG5nZG9jIGZpbHRlcgogKiBAbmFtZSB1cHBlcmNhc2UKICogQGtpbmQgZnVuY3Rpb24KICogQGRlc2NyaXB0aW9uCiAqIENvbnZlcnRzIHN0cmluZyB0byB1cHBlcmNhc2UuCiAqIEBzZWUgYW5ndWxhci51cHBlcmNhc2UKICovCnZhciB1cHBlcmNhc2VGaWx0ZXIgPSB2YWx1ZUZuKHVwcGVyY2FzZSk7CgovKioKICogQG5nZG9jIGZpbHRlcgogKiBAbmFtZSBsaW1pdFRvCiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9yIHN0cmluZyBjb250YWluaW5nIG9ubHkgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMKICogYXJlIHRha2VuIGZyb20gZWl0aGVyIHRoZSBiZWdpbm5pbmcgb3IgdGhlIGVuZCBvZiB0aGUgc291cmNlIGFycmF5LCBzdHJpbmcgb3IgbnVtYmVyLCBhcyBzcGVjaWZpZWQgYnkKICogdGhlIHZhbHVlIGFuZCBzaWduIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgb2YgYGxpbWl0YC4gSWYgYSBudW1iZXIgaXMgdXNlZCBhcyBpbnB1dCwgaXQgaXMKICogY29udmVydGVkIHRvIGEgc3RyaW5nLgogKgogKiBAcGFyYW0ge0FycmF5fHN0cmluZ3xudW1iZXJ9IGlucHV0IFNvdXJjZSBhcnJheSwgc3RyaW5nIG9yIG51bWJlciB0byBiZSBsaW1pdGVkLgogKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxpbWl0IFRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIGFycmF5IG9yIHN0cmluZy4gSWYgdGhlIGBsaW1pdGAgbnVtYmVyCiAqICAgICBpcyBwb3NpdGl2ZSwgYGxpbWl0YCBudW1iZXIgb2YgaXRlbXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzb3VyY2UgYXJyYXkvc3RyaW5nIGFyZSBjb3BpZWQuCiAqICAgICBJZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLCBgbGltaXRgIG51bWJlciAgb2YgaXRlbXMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYXJyYXkvc3RyaW5nCiAqICAgICBhcmUgY29waWVkLiBUaGUgYGxpbWl0YCB3aWxsIGJlIHRyaW1tZWQgaWYgaXQgZXhjZWVkcyBgYXJyYXkubGVuZ3RoYAogKiBAcmV0dXJucyB7QXJyYXl8c3RyaW5nfSBBIG5ldyBzdWItYXJyYXkgb3Igc3Vic3RyaW5nIG9mIGxlbmd0aCBgbGltaXRgIG9yIGxlc3MgaWYgaW5wdXQgYXJyYXkKICogICAgIGhhZCBsZXNzIHRoYW4gYGxpbWl0YCBlbGVtZW50cy4KICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGUgbW9kdWxlPSJsaW1pdFRvRXhhbXBsZSI+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICA8c2NyaXB0PgogICAgICAgICBhbmd1bGFyLm1vZHVsZSgnbGltaXRUb0V4YW1wbGUnLCBbXSkKICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgJHNjb3BlLm51bWJlcnMgPSBbMSwyLDMsNCw1LDYsNyw4LDldOwogICAgICAgICAgICAgJHNjb3BlLmxldHRlcnMgPSAiYWJjZGVmZ2hpIjsKICAgICAgICAgICAgICRzY29wZS5sb25nTnVtYmVyID0gMjM0NTQzMjM0MjsKICAgICAgICAgICAgICRzY29wZS5udW1MaW1pdCA9IDM7CiAgICAgICAgICAgICAkc2NvcGUubGV0dGVyTGltaXQgPSAzOwogICAgICAgICAgICAgJHNjb3BlLmxvbmdOdW1iZXJMaW1pdCA9IDM7CiAgICAgICAgICAgfV0pOwogICAgICAgPC9zY3JpcHQ+CiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgTGltaXQge3tudW1iZXJzfX0gdG86IDxpbnB1dCB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG5nLW1vZGVsPSJudW1MaW1pdCI+CiAgICAgICAgIDxwPk91dHB1dCBudW1iZXJzOiB7eyBudW1iZXJzIHwgbGltaXRUbzpudW1MaW1pdCB9fTwvcD4KICAgICAgICAgTGltaXQge3tsZXR0ZXJzfX0gdG86IDxpbnB1dCB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG5nLW1vZGVsPSJsZXR0ZXJMaW1pdCI+CiAgICAgICAgIDxwPk91dHB1dCBsZXR0ZXJzOiB7eyBsZXR0ZXJzIHwgbGltaXRUbzpsZXR0ZXJMaW1pdCB9fTwvcD4KICAgICAgICAgTGltaXQge3tsb25nTnVtYmVyfX0gdG86IDxpbnB1dCB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG5nLW1vZGVsPSJsb25nTnVtYmVyTGltaXQiPgogICAgICAgICA8cD5PdXRwdXQgbG9uZyBudW1iZXI6IHt7IGxvbmdOdW1iZXIgfCBsaW1pdFRvOmxvbmdOdW1iZXJMaW1pdCB9fTwvcD4KICAgICAgIDwvZGl2PgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIHZhciBudW1MaW1pdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbnVtTGltaXQnKSk7CiAgICAgICB2YXIgbGV0dGVyTGltaXRJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ2xldHRlckxpbWl0JykpOwogICAgICAgdmFyIGxvbmdOdW1iZXJMaW1pdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbG9uZ051bWJlckxpbWl0JykpOwogICAgICAgdmFyIGxpbWl0ZWROdW1iZXJzID0gZWxlbWVudChieS5iaW5kaW5nKCdudW1iZXJzIHwgbGltaXRUbzpudW1MaW1pdCcpKTsKICAgICAgIHZhciBsaW1pdGVkTGV0dGVycyA9IGVsZW1lbnQoYnkuYmluZGluZygnbGV0dGVycyB8IGxpbWl0VG86bGV0dGVyTGltaXQnKSk7CiAgICAgICB2YXIgbGltaXRlZExvbmdOdW1iZXIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xvbmdOdW1iZXIgfCBsaW1pdFRvOmxvbmdOdW1iZXJMaW1pdCcpKTsKCiAgICAgICBpdCgnc2hvdWxkIGxpbWl0IHRoZSBudW1iZXIgYXJyYXkgdG8gZmlyc3QgdGhyZWUgaXRlbXMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgZXhwZWN0KG51bUxpbWl0SW5wdXQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCczJyk7CiAgICAgICAgIGV4cGVjdChsZXR0ZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpOwogICAgICAgICBleHBlY3QobG9uZ051bWJlckxpbWl0SW5wdXQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCczJyk7CiAgICAgICAgIGV4cGVjdChsaW1pdGVkTnVtYmVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBudW1iZXJzOiBbMSwyLDNdJyk7CiAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmMnKTsKICAgICAgICAgZXhwZWN0KGxpbWl0ZWRMb25nTnVtYmVyLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IGxvbmcgbnVtYmVyOiAyMzQnKTsKICAgICAgIH0pOwoKICAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIGluIHNhZmFyaSBhbmQgcHJvdHJhY3RvciB0aGF0IGRvZXNuJ3QgbGlrZSB0aGUgbWludXMga2V5CiAgICAgICAvLyBpdCgnc2hvdWxkIHVwZGF0ZSB0aGUgb3V0cHV0IHdoZW4gLTMgaXMgZW50ZXJlZCcsIGZ1bmN0aW9uKCkgewogICAgICAgLy8gICBudW1MaW1pdElucHV0LmNsZWFyKCk7CiAgICAgICAvLyAgIG51bUxpbWl0SW5wdXQuc2VuZEtleXMoJy0zJyk7CiAgICAgICAvLyAgIGxldHRlckxpbWl0SW5wdXQuY2xlYXIoKTsKICAgICAgIC8vICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnLTMnKTsKICAgICAgIC8vICAgbG9uZ051bWJlckxpbWl0SW5wdXQuY2xlYXIoKTsKICAgICAgIC8vICAgbG9uZ051bWJlckxpbWl0SW5wdXQuc2VuZEtleXMoJy0zJyk7CiAgICAgICAvLyAgIGV4cGVjdChsaW1pdGVkTnVtYmVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBudW1iZXJzOiBbNyw4LDldJyk7CiAgICAgICAvLyAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBnaGknKTsKICAgICAgIC8vICAgZXhwZWN0KGxpbWl0ZWRMb25nTnVtYmVyLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IGxvbmcgbnVtYmVyOiAzNDInKTsKICAgICAgIC8vIH0pOwoKICAgICAgIGl0KCdzaG91bGQgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIG9mIGlucHV0IGFycmF5JywgZnVuY3Rpb24oKSB7CiAgICAgICAgIG51bUxpbWl0SW5wdXQuY2xlYXIoKTsKICAgICAgICAgbnVtTGltaXRJbnB1dC5zZW5kS2V5cygnMTAwJyk7CiAgICAgICAgIGxldHRlckxpbWl0SW5wdXQuY2xlYXIoKTsKICAgICAgICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnMTAwJyk7CiAgICAgICAgIGxvbmdOdW1iZXJMaW1pdElucHV0LmNsZWFyKCk7CiAgICAgICAgIGxvbmdOdW1iZXJMaW1pdElucHV0LnNlbmRLZXlzKCcxMDAnKTsKICAgICAgICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFsxLDIsMyw0LDUsNiw3LDgsOV0nKTsKICAgICAgICAgZXhwZWN0KGxpbWl0ZWRMZXR0ZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IGxldHRlcnM6IGFiY2RlZmdoaScpOwogICAgICAgICBleHBlY3QobGltaXRlZExvbmdOdW1iZXIuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbG9uZyBudW1iZXI6IDIzNDU0MzIzNDInKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgoqLwpmdW5jdGlvbiBsaW1pdFRvRmlsdGVyKCkgewogIHJldHVybiBmdW5jdGlvbihpbnB1dCwgbGltaXQpIHsKICAgIGlmIChpc051bWJlcihpbnB1dCkpIGlucHV0ID0gaW5wdXQudG9TdHJpbmcoKTsKICAgIGlmICghaXNBcnJheShpbnB1dCkgJiYgIWlzU3RyaW5nKGlucHV0KSkgcmV0dXJuIGlucHV0OwoKICAgIGlmIChNYXRoLmFic4zc71bxfwIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8RkAAQAZul8CoBzbAqAdglSIf9Vh6fNNBu3UYgBAL8JQlAAABAQgKAKNezgBNpcmM3O9WRYACAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/81CFAAEAGtvPAqAdgwKgHNh/1lSJBu3UYWHp804AYAVOv1QAAAQEICgBNpckAo17NKE51bWJlcihsaW1pdCkpID09PSBJbmZpbml0eSkgewogICAgICBsaW1pdCA9IE51bWJlcihsaW1pdCk7CiAgICB9IGVsc2UgewogICAgICBsaW1pdCA9IGludChsaW1pdCk7CiAgICB9CgogICAgaWYgKGlzU3RyaW5nKGlucHV0KSkgewogICAgICAvL05hTiBjaGVjayBvbiBsaW1pdAogICAgICBpZiAobGltaXQpIHsKICAgICAgICByZXR1cm4gbGltaXQgPj0gMCA/IGlucHV0LnNsaWNlKDAsIGxpbWl0KSA6IGlucHV0LnNsaWNlKGxpbWl0LCBpbnB1dC5sZW5ndGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgfQoKICAgIHZhciBvdXQgPSBbXSwKICAgICAgaSwgbjsKCiAgICAvLyBpZiBhYnMobGltaXQpIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGgsIHRyaW0gaXQKICAgIGlmIChsaW1pdCA+IGlucHV0Lmxlbmd0aCkKICAgICAgbGltaXQgPSBpbnB1dC5sZW5ndGg7CiAgICBlbHNlIGlmIChsaW1pdCA8IC1pbnB1dC5sZW5ndGgpCiAgICAgIGxpbWl0ID0gLWlucHV0Lmxlbmd0aDsKCiAgICBpZiAobGltaXQgPiAwKSB7CiAgICAgIGkgPSAwOwogICAgICBuID0gbGltaXQ7CiAgICB9IGVsc2UgewogICAgICBpID0gaW5wdXQubGVuZ3RoICsgbGltaXQ7CiAgICAgIG4gPSBpbnB1dC5sZW5ndGg7CiAgICB9CgogICAgZm9yICg7IGkgPCBuOyBpKyspIHsKICAgICAgb3V0LnB1c2goaW5wdXRbaV0pOwogICAgfQoKICAgIHJldHVybiBvdXQ7CiAgfTsKfQoKLyoqCiAqIEBuZ2RvYyBmaWx0ZXIKICogQG5hbWUgb3JkZXJCeQogKiBAa2luZCBmdW5jdGlvbgogKgogKiBAZGVzY3JpcHRpb24KICogT3JkZXJzIGEgc3BlY2lmaWVkIGBhcnJheWAgYnkgdGhlIGBleHByZXNzaW9uYCBwcmVkaWNhdGUuIEl0IGlzIG9yZGVyZWQgYWxwaGFiZXRpY2FsbHkKICogZm9yIHN0cmluZ3MgYW5kIG51bWVyaWNhbGx5IGZvciBudW1iZXJzLiBOb3RlOiBpZiB5b3Ugbm90aWNlIG51bWJlcnMgYXJlIG5vdCBiZWluZyBzb3J0ZWQKICogY29ycmVjdGx5LCBtYWtlIHN1cmUgdGhleSBhcmUgYWN0dWFsbHkgYmVpbmcgc2F2ZWQgYXMgbnVtYmVycyBhbmQgbm90IHN0cmluZ3MuCiAqCiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LgogKiBAcGFyYW0ge2Z1bmN0aW9uKCopfHN0cmluZ3xBcnJheS48KGZ1bmN0aW9uKCopfHN0cmluZyk+PX0gZXhwcmVzc2lvbiBBIHByZWRpY2F0ZSB0byBiZQogKiAgICB1c2VkIGJ5IHRoZSBjb21wYXJhdG9yIHRvIGRldGVybWluZSB0aGUgb3JkZXIgb2YgZWxlbWVudHMuCiAqCiAqICAgIENhbiBiZSBvbmUgb2Y6CiAqCiAqICAgIC0gYGZ1bmN0aW9uYDogR2V0dGVyIGZ1bmN0aW9uLiBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzb3J0ZWQgdXNpbmcgdGhlCiAqICAgICAgYDxgLCBgPWAsIGA+YCBvcGVyYXRvci4KICogICAgLSBgc3RyaW5nYDogQW4gQW5ndWxhciBleHByZXNzaW9uLiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiBpcyB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMKICogICAgICAoZm9yIGV4YW1wbGUgYG5hbWVgIHRvIHNvcnQgYnkgYSBwcm9wZXJ0eSBjYWxsZWQgYG5hbWVgIG9yIGBuYW1lLnN1YnN0cigwLCAzKWAgdG8gc29ydCBieQogKiAgICAgIDMgZmlyc3QgY2hhcmFjdGVycyBvZiBhIHByb3BlcnR5IGNhbGxlZCBgbmFtZWApLiBUaGUgcmVzdWx0IG9mIGEgY29uc3RhbnQgZXhwcmVzc2lvbgogKiAgICAgIGlzIGludGVycHJldGVkIGFzIGEgcHJvcGVydHkgbmFtZSB0byBiZSB1c2VkIGluIGNvbXBhcmlzb25zIChmb3IgZXhhbXBsZSBgInNwZWNpYWwgbmFtZSJgCiAqICAgICAgdG8gc29ydCBvYmplY3QgYnkgdGhlIHZhbHVlIG9mIHRoZWlyIGBzcGVjaWFsIG5hbWVgIHByb3BlcnR5KS4gQW4gZXhwcmVzc2lvbiBjYW4gYmUKICogICAgICBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYCtgIG9yIGAtYCB0byBjb250cm9sIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIHNvcnQgb3JkZXIKICogICAgICAoZm9yIGV4YW1wbGUsIGArbmFtZWAgb3IgYC1uYW1lYCkuIElmIG5vIHByb3BlcnR5IGlzIHByb3ZpZGVkLCAoZS5nLiBgJysnYCkgdGhlbiB0aGUgYXJyYXkKICogICAgICBlbGVtZW50IGl0c2VsZiBpcyB1c2VkIHRvIGNvbXBhcmUgd2hlcmUgc29ydGluZy4KICogICAgLSBgQXJyYXlgOiBBbiBhcnJheSBvZiBmdW5jdGlvbiBvciBzdHJpbmcgcHJlZGljYXRlcy4gVGhlIGZpcnN0IHByZWRpY2F0ZSBpbiB0aGUgYXJyYXkKICogICAgICBpcyB1c2VkIGZvciBzb3J0aW5nLCBidXQgd2hlbiB0d28gaXRlbXMgYXJlIGVxdWl2YWxlbnQsIHRoZSBuZXh0IHByZWRpY2F0ZSBpcyB1c2VkLgogKgogKiAgICBJZiB0aGUgcHJlZGljYXRlIGlzIG1pc3Npbmcgb3IgZW1wdHkgdGhlbiBpdCBkZWZhdWx0cyB0byBgJysnYC4KICoKICogQHBhcmFtIHtib29sZWFuPX0gcmV2ZXJzZSBSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgYXJyYXkuCiAqIEByZXR1cm5zIHtBcnJheX0gU29ydGVkIGNvcHkgb2YgdGhlIHNvdXJjZSBhcnJheS4KICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGUgbW9kdWxlPSJvcmRlckJ5RXhhbXBsZSI+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICA8c2NyaXB0PgogICAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUnLCBbXSkKICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgJHNjb3BlLmZyaWVuZHMgPQogICAgICAgICAgICAgICAgIFt7bmFtZTonSm9obicsIHBob25lOic1NTUtMTIxMicsIGFnZToxMH0sCiAgICAgICAgICAgICAgICAgIHtuYW1lOidNYXJ5JywgcGhvbmU6JzU1NS05ODc2JywgYWdlOjE5fSwKICAgICAgICAgICAgICAgICAge25hbWU6J01pa2UnLCBwaG9uZTonNTU1LTQzMjEnLCBhZ2U6MjF9LAogICAgICAgICAgICAgICAgICB7bmFtZTonQWRhbScsIHBob25lOic1NTUtNTY3OCcsIGFnZTozNX0sCiAgICAgICAgICAgICAgICAgIHtuYW1lOidKdWxpZScsIHBob25lOic1NTUtODc2NScsIGFnZToyOX1dOwogICAgICAgICAgICAgJHNjb3BlLnByZWRpY2F0ZSA9ICctYWdlJzsKICAgICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgICA8cHJlPlNvcnRpbmcgcHJlZGljYXRlID0ge3twcmVkaWNhdGV9fTsgcmV2ZXJzZSA9IHt7cmV2ZXJzZX19PC9wcmU+CiAgICAgICAgIDxoci8+CiAgICAgICAgIFsgPGEgaHJlZj0iIiBuZy1jbGljaz0icHJlZGljYXRlPScnIj51bnNvcnRlZDwvYT4gXQogICAgICAgICA8dGFibGUgY2xhc3M9ImZyaWVuZCI+CiAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiIgbmctY2xpY2s9InByZWRpY2F0ZSA9ICduYW1lJzsgcmV2ZXJzZT1mYWxzZSI+TmFtZTwvYT4KICAgICAgICAgICAgICAgICAoPGEgaHJlZj0iIiBuZy1jbGljaz0icHJlZGljYXRlID0gJy1uYW1lJzsgcmV2ZXJzZT1mYWxzZSI+XjwvYT4pPC90aD4KICAgICAgICAgICAgIDx0aD48YSBocmVmPSIiIG5nLWNsaWNrPSJwcmVkaWNhdGUgPSAncGhvbmUnOyByZXZlcnNlPSFyZXZlcnNlIj5QaG9uZSBOdW1iZXI8L2E+PC90aD4KICAgICAgICAgICAgIDx0aD48YSBocmVmPSIiIG5nLWNsaWNrPSJwcmVkaWNhdGUgPSAnYWdlJzsgcmV2ZXJzZT0hcmV2ZXJzZSI+QWdlPC9hPjwvdGg+CiAgICAgICAgICAgPC90cj4KICAgICAgICAgICA8dHIgbmctcmVwZWF0PSJmcmllbmQgaW4gZnJpZW5kcyB8IG9yZGVyQnk6cHJlZGljYXRlOnJldmVyc2UiPgogICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+CiAgICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+CiAgICAgICAgICAgICA8dGQ+e3tmcmllbmQuYWdlfX08L3RkPgogICAgICAgICAgIDwvdHI+CiAgICAgICAgIDwvdGFibGU+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICoKICogSXQncyBhbHNvIHBvc3NpYmxlIHRvIGNhbGwgdGhlIG9yZGVyQnkgZmlsdGVyIG1hbnVhbGx5LCBieSBpbmplY3RpbmcgYCRmaWx0ZXJgLCByZXRyaWV2aW5nIHRoZQogKiBmaWx0ZXIgcm91dGluZSB3aXRoIGAkZmlsdGVyKCdvcmRlckJ5JylgLCBhbmQgY2FsbGluZyB0aGUgcmV0dXJuZWQgZmlsdGVyIHJvdXRpbmUgd2l0aCB0aGUKICogZGVzaXJlZCBwYXJhbWV0ZXJzLgogKgogKiBFeGFtcGxlOgogKgogKiBAZXhhbXBsZQogIDxleGFtcGxlIG1vZHVsZT0ib3JkZXJCeUV4YW1wbGUiPgogICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgIDx0YWJsZSBjbGFzcz0iZnJpZW5kIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiIgbmctY2xpY2s9InJldmVyc2U9ZmFsc2U7b3JkZXIoJ25hbWUnLCBmYWxzZSkiPk5hbWU8L2E+CiAgICAgICAgICAgICAgKDxhIGhyZWY9IiIgbmctY2xpY2s9Im9yZGVyKCctbmFtZScsZmFsc2UpIj5ePC9hPik8L3RoPgogICAgICAgICAgICA8dGg+PGEgaHJlZj0iIiBuZy1jbGljaz0icmV2ZXJzZT0hcmV2ZXJzZTtvcmRlcigncGhvbmUnLCByZXZlcnNlKSI+UGhvbmUgTnVtYmVyPC9hPjwvdGg+CiAgICAgICAgICAgIDx0aD48YSBocmVmPSIiIG5nLWNsaWNrPSJyZXZlcnNlPSFyZXZlcnNlO29yZGVyKCdhZ2UnLHJldmVyc2UpIj5BZ2U8L2E+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgbmctcmVwZWF0PSJmcmllbmQgaW4gZnJpZW5kcyI+CiAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5uYW1lfX08L3RkPgogICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+CiAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5hZ2V9fTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZGl2PgogICAgPC9maWxlPgoKICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CiAgICAgIGFuZ3VsYXIubW9kdWxlKCdvcmRlckJ5RXhhbXBsZScsIFtdKQogICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRmaWx0ZXInLCBmdW5jdGlvbigkc2NvcGUsICRmaWx0ZXIpIHsKICAgICAgICAgIHZhciBvcmRlckJ5ID0gJGZpbHRlcignb3JkZXJCeScpOwogICAgICAgICAgJHNjb3BlLmZyaWVuZHMgPSBbCiAgICAgICAgICAgIHsgbmFtZTogJ0pvaG4nLCAgICBwaG9uZTogJzU1NS0xMjEyJywgICAgYWdlOiAxMCB9LAogICAgICAgICAgICB7IG5hbWU6ICdNYXJ5JywgICAgcGhvbmU6ICc1NTUtOTg3NicsICAgIGFnZTogMTkgfSwKICAgICAgICAgICAgeyBuYW1lOiAnTWlrZScsICAgIHBob25lOiAnNTU1LTQzMjEnLCAgICBhZ2U6IDIxIH0sCiAgICAgICAgICAgIHsgbmFtZTogJ0FkYW0nLCAgICBwaG9uZTogJzU1NS01Njc4JywgICAgYWdlOiAzNSB9LAogICAgICAgICAgICB7IG5hbWU6ICdKdWxpZScsICAgcGhvbmU6ICc1NTUtODc2NScsICAgIGFnZTogMjkgfQogICAgICAgICAgXTsKICAgICAgICAgICRzY29wZS5vcmRlciA9IGZ1bmN0aW9uKHByZWRpY2F0ZSwgcmV2ZXJzZSkgewogICAgICAgICAgICAkc2NvcGUuZnJpZW5kcyA9IG9yZGVyQnkoJHNjb3BlLmZyaWVuZHMsIHByZWRpY2F0ZSwgcmV2ZXJzZSk7CiAgICAgICAgICB9OwogICAgICAgICAgJHNjb3BlLm9yZGVyKCctYWdlJyxmYWxzZSk7CiAgICAgICAgfV0pOwogICAgPC9maWxlPgo8L2V4YW1wbGU+CiAqLwpvcmRlckJ5RmlsdGVyLiRpbmplY3QgPSBbJyRwYXJzZSddOwpmdW5jdGlvbiBvcmRlckJ5RmlsdGVyKCRwYXJzZSkgewogIHJldHVybiBmdW5jdGlvbihhcnJheSwgc29ydFByZWRpY2F0ZSwgcmV2ZXJzZU9yZGVyKSB7CiAgICBpZiAoIShpc0FycmF5TGlrZShhcnJheSkpKSByZXR1cm4gYXJyYXk7CiAgICBzb3J0UHJlZGljYXRlID0gaXNBcnJheShzb3J0UHJlZGljYXRlKSA/IHNvcnRQcmVkaWNhdGUgOiBbc29ydFByZWRpY2F0ZV07CiAgICBpZiAoc29ydFByZWRpY2F0ZS5sZW5ndGggPT09IDApIHsgc29ydFByZWRpY2F0ZSA9IFsnKyddOyB9CiAgICBzb3J0UHJlZGljYXRlID0gc29ydFByZWRpY2F0ZS5tYXAoZnVuY3Rpb24ocHJlZGljYXRlKSB7CiAgICAgIHZhciBkZXNjZW5kaW5nID0gZmFsc2UsIGdldCA9IHByZWRpY2F0ZSB8fCBpZGVudGl0eTsKICAgICAgaWYgKGlzU3RyaW5nKHByZWRpY2F0ZSkpIHsKICAgICAgICBpZiAoKHByZWRpY2F0ZS5jaGFyQXQoMCkgPT0gJysnIHx8IHByZWRpY2F0ZS5jaGFyQXQoMCkgPT0gJy0nKSkgewogICAgICAgICAgZGVzY2VuZGluZyA9IHByZWRpY2F0ZS5jaGFyQXQoMCkgPT0gJy0nOwogICAgICAgICAgcHJlZGljYXRlID0gcHJlZGljYXRlLnN1YnN0cmluZygxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWRpY2F0ZSA9PT0gJycpIHsKICAgICAgICAgIC8vIEVmZmVjdGl2ZWx5IG5vIHByZWRpY2F0ZSB3YXMgcGFzc2VkIHNvIHdlIGNvbXBhcmUgaWRlbnRpdHkKICAgICAgICAgIHJldHVybiByZXZlcnNlQ29tcGFyYXRvcihmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wYXJlKGEsIGIpOwogICAgICAgICAgfSwgZGVzY2VuZGluZyk7CiAgICAgICAgfQogICAgICAgIGdldCA9ICRwYXJzZShwcmVkaWNhdGUpOwogICAgICAgIGlmIChnZXQuY29uc3RhbnQpIHsKICAgICAgICAgIHZhciBrZXkgPSBnZXQoKTsKICAgICAgICAgIHJldHVybiByZXZlcnNlQ29tcGFyYXRvcihmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wYXJlKGFba2V5XSwgYltrZXldKTsKICAgICAgICAgIH0sIGRlc2NlbmRpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmV2ZXJzZUNvbXBhcmF0b3IoZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBjb21wYXJlKGdldChhKSxnZXQoYikpOwogICAgICB9LCBkZXNjZW5kaW5nKTsKICAgIH0pOwogICAgcmV0dXJuIHNsaWNlLmNhbGwoYXJyYXkpLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IoY29tcGFyYXRvciwgcmV2ZXJzZU9yZGVyKSk7CgogICAgZnVuY3Rpb24gY29tcGFyYXRvcihvMSwgbzIpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0UHJlZGljYXRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNvbXAgPSBzb3J0UHJlZGljYXRlW2ldKG8xLCBvMik7CiAgICAgICAgaWYgKGNvbXAgIT09IDApIHJldHVybiBjb21wOwogICAgICB9CiAgICAgIHJldHVybiAwOwogICAgfQogICAgZnVuY3Rpb24gcmV2ZXJzZUNvbXBhcmF0b3IoY29tcCwgZGVzY2VuZGluZykgewogICAgICByZXR1cm4gZGVzY2VuZGluZwogICAgICAgICAgPyBmdW5jdGlvbihhLCBiKSB7cmV0dXJuIGNvbXAoYixhKTt9CiAgICAgICAgICA6IGNvbXA7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlKHYxLCB2MikgewogICAgICB2YXIgdDEgPSB0eXBlb2YgdjE7CiAgICAgIHZhciB0MiA9IHR5cGVvZiB2MjsKICAgICAgaWYgKHQxID09IHQyKSB7CiAgICAgICAgaWYgKGlzRGF0ZSh2MSkgJiYgaXNEYXRlKHYyKSkgewogICAgICAgICAgdjEgPSB2MS52YWx1ZU9mKCk7CiAgICAgICAgICB2MiA9IHYyLnZhbHVlT2YoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHQxID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgdjEgPSB2MS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgIHYyID0gdjIudG9Mb3dlckNhc2UoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHYxID09PSB2MikgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIHYxIDwgdjIgPyAtMSA6IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHQxIDwgdDIgPyAtMSA6IDE7CiAgICAgIH0KICAgIH0KICB9Owp9CgpmdW5jdGlvbiBuZ0RpcmVjdGl2ZShkaXJlY3RpdmUpIHsKICBpZiAoaXNGdW5jdGlvbihkaXJlY3RpdmUpKSB7CiAgICBkaXJlY3RpdmUgPSB7CiAgICAgIGxpbms6IGRpcmVjdGl2ZQogICAgfTsKICB9CiAgZGlyZWN0aXZlLnJlc3RyaWN0ID0gZGlyZWN0aXZlLnJlc3RyaWN0IHx8ICdBQyc7CiAgcmV0dXJuIHZhbHVlRm4oZGlyZWN0aXZlKTsKfQoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgYQogKiBAcmVzdA0KjNzvVniBAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxHQABABm6WwKgHNsCoB2CVIh/1WHp800G7lOCAEAvwdF0AAAEBCAoAo17OAE2lyYzc71ZghgIAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzUJ0AAQAZ2jcCoB2DAqAc2H/WVIkG7lOBYenzTgBABU/A1AAABAQgKAE2lygCjXs43RkU4DQpyaWN0IEUKICoKICogQGRlc2NyaXB0aW9uCiAqIE1vZGlmaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBodG1sIEEgdGFnIHNvIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uIGlzIHByZXZlbnRlZCB3aGVuCiAqIHRoZSBocmVmIGF0dHJpYnV0ZSBpcyBlbXB0eS4KICoKICogVGhpcyBjaGFuZ2UgcGVybWl0cyB0aGUgZWFzeSBjcmVhdGlvbiBvZiBhY3Rpb24gbGlua3Mgd2l0aCB0aGUgYG5nQ2xpY2tgIGRpcmVjdGl2ZQogKiB3aXRob3V0IGNoYW5naW5nIHRoZSBsb2NhdGlvbiBvciBjYXVzaW5nIHBhZ2UgcmVsb2FkcywgZS5nLjoKICogYDxhIGhyZWY9IiIgbmctY2xpY2s9Imxpc3QuYWRkSXRlbSgpIj5BZGQgSXRlbTwvYT5gCiAqLwp2YXIgaHRtbEFuY2hvckRpcmVjdGl2ZSA9IHZhbHVlRm4oewogIHJlc3RyaWN0OiAnRScsCiAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cikgewogICAgaWYgKCFhdHRyLmhyZWYgJiYgIWF0dHIueGxpbmtIcmVmICYmICFhdHRyLm5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7CiAgICAgICAgLy8gU1ZHQUVsZW1lbnQgZG9lcyBub3QgdXNlIHRoZSBocmVmIGF0dHJpYnV0ZSwgYnV0IHJhdGhlciB0aGUgJ3hsaW5rSHJlZicgYXR0cmlidXRlLgogICAgICAgIHZhciBocmVmID0gdG9TdHJpbmcuY2FsbChlbGVtZW50LnByb3AoJ2hyZWYnKSkgPT09ICdbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXScgPwogICAgICAgICAgICAgICAgICAgJ3hsaW5rOmhyZWYnIDogJ2hyZWYnOwogICAgICAgIGVsZW1lbnQub24oJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgIC8vIGlmIHdlIGhhdmUgbm8gaHJlZiB1cmwsIHRoZW4gZG9uJ3QgbmF2aWdhdGUgYW55d2hlcmUuCiAgICAgICAgICBpZiAoIWVsZW1lbnQuYXR0cihocmVmKSkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgfQogIH0KfSk7CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0hyZWYKICogQHJlc3RyaWN0IEEKICogQHByaW9yaXR5IDk5CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBVc2luZyBBbmd1bGFyIG1hcmt1cCBsaWtlIGB7e2hhc2h9fWAgaW4gYW4gaHJlZiBhdHRyaWJ1dGUgd2lsbAogKiBtYWtlIHRoZSBsaW5rIGdvIHRvIHRoZSB3cm9uZyBVUkwgaWYgdGhlIHVzZXIgY2xpY2tzIGl0IGJlZm9yZQogKiBBbmd1bGFyIGhhcyBhIGNoYW5jZSB0byByZXBsYWNlIHRoZSBge3toYXNofX1gIG1hcmt1cCB3aXRoIGl0cwogKiB2YWx1ZS4gVW50aWwgQW5ndWxhciByZXBsYWNlcyB0aGUgbWFya3VwIHRoZSBsaW5rIHdpbGwgYmUgYnJva2VuCiAqIGFuZCB3aWxsIG1vc3QgbGlrZWx5IHJldHVybiBhIDQwNCBlcnJvci4gVGhlIGBuZ0hyZWZgIGRpcmVjdGl2ZQogKiBzb2x2ZXMgdGhpcyBwcm9ibGVtLgogKgogKiBUaGUgd3Jvbmcgd2F5IHRvIHdyaXRlIGl0OgogKiBgYGBodG1sCiAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSI+bGluazE8L2E+CiAqIGBgYAogKgogKiBUaGUgY29ycmVjdCB3YXkgdG8gd3JpdGUgaXQ6CiAqIGBgYGh0bWwKICogPGEgbmctaHJlZj0iaHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyL3t7aGFzaH19Ij5saW5rMTwvYT4KICogYGBgCiAqCiAqIEBlbGVtZW50IEEKICogQHBhcmFtIHt0ZW1wbGF0ZX0gbmdIcmVmIGFueSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW4gYHt7fX1gIG1hcmt1cC4KICoKICogQGV4YW1wbGUKICogVGhpcyBleGFtcGxlIHNob3dzIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGBocmVmYCwgYG5nLWhyZWZgIGFuZCBgbmctY2xpY2tgIGF0dHJpYnV0ZXMKICogaW4gbGlua3MgYW5kIHRoZWlyIGRpZmZlcmVudCBiZWhhdmlvcnM6CiAgICA8ZXhhbXBsZT4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgPGlucHV0IG5nLW1vZGVsPSJ2YWx1ZSIgLz48YnIgLz4KICAgICAgICA8YSBpZD0ibGluay0xIiBocmVmIG5nLWNsaWNrPSJ2YWx1ZSA9IDEiPmxpbmsgMTwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz4KICAgICAgICA8YSBpZD0ibGluay0yIiBocmVmPSIiIG5nLWNsaWNrPSJ2YWx1ZSA9IDIiPmxpbmsgMjwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz4KICAgICAgICA8YSBpZD0ibGluay0zIiBuZy1ocmVmPSIve3snMTIzJ319Ij5saW5rIDM8L2E+IChsaW5rLCByZWxvYWQhKTxiciAvPgogICAgICAgIDxhIGlkPSJsaW5rLTQiIGhyZWY9IiIgbmFtZT0ieHgiIG5nLWNsaWNrPSJ2YWx1ZSA9IDQiPmFuY2hvcjwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz4KICAgICAgICA8YSBpZD0ibGluay01IiBuYW1lPSJ4eHgiIG5nLWNsaWNrPSJ2YWx1ZSA9IDUiPmFuY2hvcjwvYT4gKG5vIGxpbmspPGJyIC8+CiAgICAgICAgPGEgaWQ9ImxpbmstNiIgbmctaHJlZj0ie3t2YWx1ZX19Ij5saW5rPC9hPiAobGluaywgY2hhbmdlIGxvY2F0aW9uKQogICAgICA8L2ZpbGU+CiAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBidXQgbm90IHJlbG9hZCB3aGVuIGhyZWYgd2l0aG91dCB2YWx1ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay0xJykpLmNsaWNrKCk7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCcxJyk7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGluay0xJykpLmdldEF0dHJpYnV0ZSgnaHJlZicpKS50b0JlKCcnKTsKICAgICAgICB9KTsKCiAgICAgICAgaXQoJ3Nob3VsZCBleGVjdXRlIG5nLWNsaWNrIGJ1dCBub3QgcmVsb2FkIHdoZW4gaHJlZiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstMicpKS5jbGljaygpOwogICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnMicpOwogICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstMicpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9CZSgnJyk7CiAgICAgICAgfSk7CgogICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBhbmQgY2hhbmdlIHVybCB3aGVuIG5nLWhyZWYgc3BlY2lmaWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGluay0zJykpLmdldEF0dHJpYnV0ZSgnaHJlZicpKS50b01hdGNoKC9cLzEyMyQvKTsKCiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTMnKSkuY2xpY2soKTsKCiAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBuYXZpZ2F0ZSBhd2F5IGZyb20gYW4gQW5ndWxhciBwYWdlLCBzbyB3ZSBuZWVkCiAgICAgICAgICAvLyB0byB1c2UgYnJvd3Nlci5kcml2ZXIgdG8gZ2V0IHRoZSBiYXNlIHdlYmRyaXZlci4KCiAgICAgICAgICBicm93c2VyLndhaXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBicm93c2VyLmRyaXZlci5nZXRDdXJyZW50VXJsKCkudGhlbihmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9cLzEyMyQvKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LCA1MDAwLCAncGFnZSBzaG91bGQgbmF2aWdhdGUgdG8gLzEyMycpOwogICAgICAgIH0pOwoKICAgICAgICB4aXQoJ3Nob3VsZCBleGVjdXRlIG5nLWNsaWNrIGJ1dCBub3QgcmVsb2FkIHdoZW4gaHJlZiBlbXB0eSBzdHJpbmcgYW5kIG5hbWUgc3BlY2lmaWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTQnKSkuY2xpY2soKTsKICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvRXF1YWwoJzQnKTsKICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTQnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUoJycpOwogICAgICAgIH0pOwoKICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBubyBocmVmIGJ1dCBuYW1lIHNwZWNpZmllZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay01JykpLmNsaWNrKCk7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCc1Jyk7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGluay01JykpLmdldEF0dHJpYnV0ZSgnaHJlZicpKS50b0JlKG51bGwpOwogICAgICAgIH0pOwoKICAgICAgICBpdCgnc2hvdWxkIG9ubHkgY2hhbmdlIHVybCB3aGVuIG9ubHkgbmctaHJlZicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuY2xlYXIoKTsKICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLnNlbmRLZXlzKCc2Jyk7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGluay02JykpLmdldEF0dHJpYnV0ZSgnaHJlZicpKS50b01hdGNoKC9cLzYkLyk7CgogICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay02JykpLmNsaWNrKCk7CgogICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbmF2aWdhdGUgYXdheSBmcm9tIGFuIEFuZ3VsYXIgcGFnZSwgc28gd2UgbmVlZAogICAgICAgICAgLy8gdG8gdXNlIGJyb3dzZXIuZHJpdmVyIHRvIGdldCB0aGUgYmFzZSB3ZWJkcml2ZXIuCiAgICAgICAgICBicm93c2VyLndhaXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBicm93c2VyLmRyaXZlci5nZXRDdXJyZW50VXJsKCkudGhlbihmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9cLzYkLyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwgNTAwMCwgJ3BhZ2Ugc2hvdWxkIG5hdmlnYXRlIHRvIC82Jyk7CiAgICAgICAgfSk7CiAgICAgIDwvZmlsZT4KICAgIDwvZXhhbXBsZT4KICovCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ1NyYwogKiBAcmVzdHJpY3QgQQogKiBAcHJpb3JpdHkgOTkKICoKICogQGRlc2NyaXB0aW9uCiAqIFVzaW5nIEFuZ3VsYXIgbWFya3VwIGxpa2UgYHt7aGFzaH19YCBpbiBhIGBzcmNgIGF0dHJpYnV0ZSBkb2Vzbid0CiAqIHdvcmsgcmlnaHQ6IFRoZSBicm93c2VyIHdpbGwgZmV0Y2ggZnJvbSB0aGUgVVJMIHdpdGggdGhlIGxpdGVyYWwKICogdGV4dCBge3toYXNofX1gIHVudGlsIEFuZ3VsYXIgcmVwbGFjZXMgdGhlIGV4cHJlc3Npb24gaW5zaWRlCiAqIGB7e2hhc2h9fWAuIFRoZSBgbmdTcmNgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtLgogKgogKiBUaGUgYnVnZ3kgd2F5IHRvIHdyaXRlIGl0OgogKiBgYGBodG1sCiAqIDxpbWcgc3JjPSJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX0iLz4KICogYGBgCiAqCiAqIFRoZSBjb3JyZWN0IHdheSB0byB3cml0ZSBpdDoKICogYGBgaHRtbAogKiA8aW1nIG5nLXNyYz0iaHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyL3t7aGFzaH19Ii8+CiAqIGBgYAogKgogKiBAZWxlbWVudCBJTUcKICogQHBhcmFtIHt0ZW1wbGF0ZX0gbmdTcmMgYW55IHN0cmluZyB3aGljaCBjYW4gY29udGFpbiBge3t9fWAgbWFya3VwLgogKi8KCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nU3Jjc2V0CiAqIEByZXN0cmljdCBBCiAqIEBwcmlvcml0eSA5OQogKgogKiBAZGVzY3JpcHRpb24KICogVXNpbmcgQW5ndWxhciBtYXJrdXAgbGlrZSBge3toYXNofX1gIGluIGEgYHNyY3NldGAgYXR0cmlidXRlIGRvZXNuJ3QKICogd29yayByaWdodDogVGhlIGJyb3dzZXIgd2lsbCBmZXRjaCBmcm9tIHRoZSBVUkwgd2l0aCB0aGUgbGl0ZXJhbAogKiB0ZXh0IGB7e2hhc2h9fWAgdW50aWwgQW5ndWxhciByZXBsYWNlcyB0aGUgZXhwcmVzc2lvbiBpbnNpZGUKICogYHt7aGFzaH19YC4gVGhlIGBuZ1NyY3NldGAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0uCiAqCiAqIFRoZSBidWdneSB3YXkgdG8gd3JpdGUgaXQ6CiAqIGBgYGh0bWwKICogPGltZyBzcmNzZXQ9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSAyeCIvPgogKiBgYGAKICoKICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0OgogKiBgYGBodG1sCiAqIDxpbWcgbmctc3Jjc2V0PSJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX0gMngiLz4KICogYGBgCiAqCiAqIEBlbGVtZW50IElNRwogKiBAcGFyYW0ge3RlbXBsYXRlfSBuZ1NyY3NldCBhbnkgc3RyaW5nIHdoaWNoIGNhbiBjb250YWluIGB7e319YCBtYXJrdXAuCiAqLwoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdEaXNhYmxlZAogKiBAcmVzdHJpY3QgQQogKiBAcHJpb3JpdHkgMTAwCiAqCiAqIEBkZXNjcmlwdGlvbgogKgogKiBXZSBzaG91bGRuJ3QgZG8gdGhpcywgYmVjYXVzZSBpdCB3aWxsIG1ha2UgdGhlIGJ1dHRvbiBlbmFibGVkIG9uIENocm9tZS9GaXJlZm94IGJ1dCBub3Qgb24gSUU4IGFuZCBvbGRlciBJRXM6CiAqIGBgYGh0bWwKICogPGRpdiBuZy1pbml0PSJzY29wZSA9IHsgaXNEaXNhYmxlZDogZmFsc2UgfSI+CiAqICA8YnV0dG9uIGRpc2FibGVkPSJ7e3Njb3BlLmlzRGlzYWJsZWR9fSI+RGlzYWJsZWQ8L2J1dHRvbj4KICogPC9kaXY+CiAqIGBgYAogKgogKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMKICogc3VjaCBhcyBkaXNhYmxlZC4gKFRoZWlyIHByZXNlbmNlIG1lYW5zIHRydWUgYW5kIHRoZWlyIGFic2VuY2UgbWVhbnMgZmFsc2UuKQogKiBJZiB3ZSBwdXQgYW4gQW5ndWxhciBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24gaW50byBzdWNoIGFuIGF0dHJpYnV0ZSB0aGVuIHRoZQogKiBiaW5kaW5nIGluZm9ybWF0aW9uIHdvdWxkIGJlIGxvc3Qgd2hlbiB0aGUgYnJvd3NlciByZW1vdmVzIHRoZSBhdHRyaWJ1dGUuCiAqIFRoZSBgbmdEaXNhYmxlZGAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgZGlzYWJsZWRgIGF0dHJpYnV0ZS4KICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMKICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uCiAqCiAqIEBleGFtcGxlCiAgICA8ZXhhbXBsZT4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgQ2xpY2sgbWUgdG8gdG9nZ2xlOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjaGVja2VkIj48YnIvPgogICAgICAgIDxidXR0b24gbmctbW9kZWw9ImJ1dHRvbiIgbmctZGlzYWJsZWQ9ImNoZWNrZWQiPkJ1dHRvbjwvYnV0dG9uPgogICAgICA8L2ZpbGU+CiAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgIGl0KCdzaG91bGQgdG9nZ2xlIGJ1dHRvbicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCdidXR0b24nKSkuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpKS50b0JlRmFsc3koKTsKICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2NoZWNrZWQnKSkuY2xpY2soKTsKICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnYnV0dG9uJykpLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSkudG9CZVRydXRoeSgpOwogICAgICAgIH0pOwogICAgICA8L2ZpbGU+CiAgICA8L2V4YW1wbGU+CiAqCiAqIEBlbGVtZW50IElOUFVUCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdEaXNhYmxlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LAogKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSAiZGlzYWJsZWQiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50CiAqLwoKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nQ2hlY2tlZAogKiBAcmVzdHJpY3QgQQogKiBAcHJpb3JpdHkgMTAwCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMKICogc3VjaCBhcyBjaGVja2VkLiAoVGhlaXIgcHJlc2VuY2UgbWVhbnMgdHJ1ZSBhbmQgdGhlaXIgYWJzZW5jZSBtZWFucyBmYWxzZS4pCiAqIElmIHdlIHB1dCBhbiBBbmd1bGFyIGludGVycG9sYXRpb24gZXhwcmVzc2lvbiBpbnRvIHN1Y2ggYW4gYXR0cmlidXRlIHRoZW4gdGhlCiAqIGJpbmRpbmcgaW5mb3JtYXRpb24gd291bGQgYmUgbG9zdCB3aGVuIHRoZSBicm93c2VyIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZS4KICogVGhlIGBuZ0NoZWNrZWRgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtIGZvciB0aGUgYGNoZWNrZWRgIGF0dHJpYnV0ZS4KICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMKICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uCiAqIEBleGFtcGxlCiAgICA8ZXhhbXBsZT4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgQ2hlY2sgbWUgdG8gY2hlY2sgYm90aDogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibWFzdGVyIj48YnIvPgogICAgICAgIDxpbnB1dCBpZD0iY2hlY2tTbGF2ZSIgdHlwZT0iY2hlY2tib3giIG5nLWNoZWNrZWQ9Im1hc3RlciI+CiAgICAgIDwvZmlsZT4KICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgaXQoJ3Nob3VsZCBjaGVjayBib3RoIGNoZWNrQm94ZXMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjaGVja1NsYXZlJykpLmdldEF0dHJpYnV0ZSgnY2hlY2tlZCcpKS50b0JlRmFsc3koKTsKICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ21hc3RlcicpKS5jbGljaygpOwogICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2NoZWNrU2xhdmUnKSkuZ2V0QXR0cmlidXRlKCdjaGVja2VkJykpLnRvQmVUcnV0aHkoKTsKICAgICAgICB9KTsKICAgICAgPC9maWxlPgogICAgPC9leGFtcGxlPgogKgogKiBAZWxlbWVudCBJTlBVVAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2hlY2tlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LAogKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSAiY2hlY2tlZCIgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnQKICovCgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdSZWFkb25seQogKiBAcmVzdHJpY3QgQQogKiBAcHJpb3JpdHkgMTAwCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMKICogc3VjaCBhcyByZWFkb25seS4gKFRoZWlyIHByZXNlbmNlIG1lYW5zIHRydWUgYW5kIHRoZWlyIGFic2VuY2UgbWVhbnMgZmFsc2UuKQogKiBJZiB3ZSBwdXQgYW4gQW5ndWxhciBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24gaW50byBzdWNoIGFuIGF0dHJpYnV0ZSB0aGVuIHRoZQogKiBiaW5kaW5nIGluZm9ybWF0aW9uIHdvdWxkIGJlIGxvc3Qgd2hlbiB0aGUgYnJvd3NlciByZW1vdmVzIHRoZSBhdHRyaWJ1dGUuCiAqIFRoZSBgbmdSZWFkb25seWAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgcmVhZG9ubHlgIGF0dHJpYnV0ZS4KICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMKICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uCiAqIEBleGFtcGxlCiAgICA8ZXhhbXBsZT4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgQ2hlY2sgbWUgdG8gbWFrZSB0ZXh0IHJlYWRvbmx5OiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjaGVja2VkIj48YnIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1yZWFkb25seT0iY2hlY2tlZCIgdmFsdWU9IkknbSBBbmd1bGFyIi8+CiAgICAgIDwvZmlsZT4KICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgaXQoJ3Nob3VsZCB0b2dnbGUgcmVhZG9ubHkgYXR0cicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCdbdHlwZT0idGV4dCJdJykpLmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSkudG9CZUZhbHN5KCk7CiAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJ1t0eXBlPSJ0ZXh0Il0nKSkuZ2V0QXR0cmlidXRlKCdyZWFkb25seScpKS50b0JlVHJ1dGh5KCk7CiAgICAgICAgfSk7CiAgICAgIDwvZmlsZT4KICAgIDwvZXhhbXBsZT4KICoKICogQGVsZW1lbnQgSU5QVVQKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ1JlYWRvbmx5IElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHksCiAqICAgICB0aGVuIHNwZWNpYWwgYXR0cmlidXRlICJyZWFkb25seSIgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnQKICovCgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdTZWxlY3RlZAogKiBAcmVzdHJpY3QgQQogKiBAcHJpb3JpdHkgMTAwCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMKICogc3VjaCBhcyBzZWxlY3RlZC4gKFRoZWlyIHByZXNlbmNlIG1lYW5zIHRydWUgYW5kIHRoZWlyIGFic2VuY2UgbWVhbnMgZmFsc2UuKQogKiBJZiB3ZSBwdXQgYW4gQW5ndWxhciBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24gaW50byBzdWNoIGFuIGF0dHJpYnV0ZSB0aGVuIHRoZQogKiBiaW5kaW5nIGluZm9ybWF0aW9uIHdvdWxkIGJlIGxvc3Qgd2hlbiB0aGUgYnJvd3NlciByZW1vdmVzIHRoZSBhdHRyaWJ1dGUuCiAqIFRoZSBgbmdTZWxlY3RlZGAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgc2VsZWN0ZWRgIGF0dHJpYnV0ZS4KICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMKICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uCiAqCiAqIEBleGFtcGxlCiAgICA8ZXhhbXBsZT4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgQ2hlY2sgbWUgdG8gc2VsZWN0OiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJzZWxlY3RlZCI+PGJyLz4KICAgICAgICA8c2VsZWN0PgogICAgICAgICAgPG9wdGlvbj5IZWxsbyE8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gaWQ9ImdyZWV0IiBuZy1zZWxlY3RlZD0ic2VsZWN0ZWQiPkdyZWV0aW5ncyE8L29wdGlvbj4KICAgICAgICA8L3NlbGVjdD4KICAgICAgPC9maWxlPgogICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgICBpdCgnc2hvdWxkIHNlbGVjdCBHcmVldGluZ3MhJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZ3JlZXQnKSkuZ2V0QXR0cmlidXRlKCdzZWxlY3RlZCcpKS50b0JlRmFsc3koKTsKICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NlbGVjdGVkJykpLmNsaWNrKCk7CiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZ3JlZXQnKSkuZ2V0QXR0cmlidXRlKCdzZWxlY3RlZCcpKS50b0JlVHJ1dGh5KCk7CiAgICAgICAgfSk7CiAgICAgIDwvZmlsZT4KICAgIDwvZXhhbXBsZT4KICoKICogQGVsZW1lbnQgT1BUSU9OCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTZWxlY3RlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LAogKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSAic2VsZWN0ZWQiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50CiAqLwoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdPcGVuCiAqIEByZXN0cmljdCBBCiAqIEBwcmlvcml0eSAxMDAKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBIVE1MIHNwZWNpZmljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBicm93c2VycyB0byBwcmVzZXJ2ZSB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcwogKiBzdWNoIGFzIG9wZW4uIChUaGVpciBwcmVzZW5jZSBtZWFucyB0cnVlIGFuZCB0aGVpciBhYnNlbmNlIG1lYW5zIGZhbHNlLikKICogSWYgd2UgcHV0IGFuIEFuZ3VsYXIgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uIGludG8gc3VjaCBhbiBhdHRyaWJ1dGUgdGhlbiB0aGUKICogYmluZGluZyBpbmZvcm1hdGlvbiB3b3VsZCBiZSBsb3N0IHdoZW4gdGhlIGJyb3dzZXIgcmVtb3ZlcyB0aGUgYXR0cmlidXRlLgogKiBUaGUgYG5nT3BlbmAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgb3BlbmAgYXR0cmlidXRlLgogKiBUaGlzIGNvbXBsZW1lbnRhcnkgZGlyZWN0aXZlIGlzIG5vdCByZW1vdmVkIGJ5IHRoZSBicm93c2VyIGFuZCBzbyBwcm92aWRlcwogKiBhIHBlcm1hbmVudCByZWxpYWJsZSBwbGFjZSB0byBzdG9yZSB0aGUgYmluZGluZyBpbmZvcm1hdGlvbi4KICogQGV4YW1wbGUKICAgICA8ZXhhbXBsZT4KICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgICBDaGVjayBtZSBjaGVjayBtdWx0aXBsZTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ib3BlbiI+PGJyLz4KICAgICAgICAgPGRldGFpbHMgaWQ9ImRldGFpbHMiIG5nLW9wZW49Im9wZW4iPgogICAgICAgICAgICA8c3VtbWFyeT5TaG93L0hpZGUgbWU8L3N1bW1hcnk+CiAgICAgICAgIDwvZGV0YWlscz4KICAgICAgIDwvZmlsZT4KICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgICBpdCgnc2hvdWxkIHRvZ2dsZSBvcGVuJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2RldGFpbHMnKSkuZ2V0QXR0cmlidXRlKCdvcGVuJykpLnRvQmVGYWxzeSgpOwogICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ29wZW4nKSkuY2xpY2soKTsKICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZGV0YWlscycpKS5nZXRBdHRyaWJ1dGUoJ29wZW4nKSkudG9CZVRydXRoeSgpOwogICAgICAgICB9KTsKICAgICAgIDwvZmlsZT4KICAgICA8L2V4YW1wbGU+CiAqCiAqIEBlbGVtZW50IERFVEFJTFMKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ09wZW4gSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIHRydXRoeSwKICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgIm9wZW4iIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50CiAqLwoKdmFyIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzID0ge307CgoKLy8gYm9vbGVhbiBhdHRycyBhcmUgZXZhbHVhdGVkCmZvckVhY2goQk9PTEVBTl9BVFRSLCBmdW5jdGlvbihwcm9wTmFtZSwgYXR0ck5hbWUpIHsKICAvLyBiaW5kaW5nIHRvIG11bHRpcGxlIGlzIG5vdCBzdXBwb3J0ZWQKICBpZiAocHJvcE5hbWUgPT0gIm11bHRpcGxlIikgcmV0dXJuOwoKICB2YXIgbm9ybWFsaXplZCA9IGRpcmVjdGl2ZU5vcm1hbGl6ZSgnbmctJyArIGF0dHJOYW1lKTsKICBuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlc1tub3JtYWxpemVkXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgcmVzdHJpY3Q6ICdBJywKICAgICAgcHJpb3JpdHk6IDEwMCwKICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKICAgICAgICBzY29wZS4kd2F0Y2goYXR0cltub3JtYWxpemVkXSwgZnVuY3Rpb24gbmdCb29sZWFuQXR0cldhdGNoQWN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBhdHRyLiRzZXQoYXR0ck5hbWUsICEhdmFsdWUpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogIH07Cn0pOwoKLy8gYWxpYXNlZCBpbnB1dCBhdHRycyBhcmUgZXZhbHVhdGVkCmZvckVhY2goQUxJQVNFRF9BVFRSLCBmdW5jdGlvbihodG1sQXR0ciwgbmdBdHRyKSB7CiAgbmdBdHRyaWJ1dGVBbGlhc0RpcmVjdGl2ZXNbbmdBdHRyXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgcHJpb3JpdHk6IDEwMCwKICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKICAgICAgICAvL3NwZWNpYWwgY2FzZSBuZ1BhdHRlcm4gd2hlbiBhIGxpdGVyYWwgcmVndWxhciBleHByZXNzaW9uIHZhbHVlCiAgICAgICAgLy9pcyB1c2VkIGFzIHRoZSBleHByZXNzaW9uICh0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHdhdGNoIGFueXRoaW5nKS4KICAgICAgICBpZiAobmdBdHRyID09PSAibmdQYXR0ZXJuIiAmJiBhdHRyLm5nUGF0dGVybi5jaGFyQXQoMCkgPT0gIi8iKSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBhdHRyLm5nUGF0dGVybi5tYXRjaChSRUdFWF9TVFJJTkdfUkVHRVhQKTsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICBhdHRyLiRzZXQoIm5nUGF0dGVybiIsIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHNjb3BlLiR3YXRjaChhdHRyW25nQXR0cl0sIGZ1bmN0aW9uIG5nQXR0ckFsaWFzV2F0Y2hBY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGF0dHIuJHNldChuZ0F0dHIsIHZhbHVlKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICB9Owp9KTsKCi8vIG5nLXNyYywgbmctc3Jjc2V0LCBuZy1ocmVmIGFyZSBpbnRlcnBvbGF0ZWQKZm9yRWFjaChbJ3NyYycsICdzcmNzZXQnLCAnaHJlZiddLCBmdW5jdGlvbihhdHRyTmFtZSkgewogIHZhciBub3JtYWxpemVkID0gZGlyZWN0aXZlTm9ybWFsaXplKCduZy0nICsgYXR0ck5hbWUpOwogIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25vcm1hbGl6ZWRdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gewogICAgICBwcmlvcml0eTogOTksIC8vIGl0IG5lZWRzIHRvIHJ1biBhZnRlciB0aGUgYXR0cmlidXRlcyBhcmUgaW50ZXJwb2xhdGVkCiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CiAgICAgICAgdmFyIHByb3BOYW1lID0gYXR0ck5hbWUsCiAgICAgICAgICAgIG5hbWUgPSBhdHRyTmFtZTsKCiAgICAgICAgaWYgKGF0dHJOYW1lID09PSAnaHJlZicgJiYKICAgICAgICAgICAgdG9TdHJpbmcuY2FsbChlbGVtZW50LnByb3AoJ2hyZWYnKSkgPT09ICdbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXScpIHsKICAgICAgICAgIG5hbWUgPSAneGxpbmtIcmVmJzsKICAgICAgICAgIGF0dHIuJGF0dHJbbmFtZV0gPSAneGxpbms6aHJlZic7CiAgICAgICAgICBwcm9wTmFtZSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBhdHRyLiRvYnNlcnZlKG5vcm1hbGl6ZWQsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PT0gJ2hyZWYnKSB7CiAgICAgICAgICAgICAgYXR0ci4kc2V0KG5hbWUsIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBhdHRyLiRzZXQobmFtZSwgdmFsdWUpOwoKICAgICAgICAgIC8vIG9uIElFLCBpZiAibmc6c3JjIiBkaXJlY3RpdmUgZGVjbGFyYXRpb24gaXMgdXNlZCBhbmQgInNyYyIgYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3QKICAgICAgICAgIC8vIHRoZW4gY2FsbGluZyBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3JjJywgJ2ZvbycpIGRvZXNuJ3QgZG8gYW55dGhpbmcsIHNvIHdlIG5lZWQKICAgICAgICAgIC8vIHRvIHNldCB0aGUgcHJvcGVydHkgYXMgd2VsbCB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIGVmZmVjdC4KICAgICAgICAgIC8vIHdlIHVzZSBhdHRyW2F0dHJOYW1lXSB2YWx1ZSBzaW5jZSAkc2V0IGNhbiBzYW5pdGl6ZSB0aGUgdXJsLgogICAgICAgICAgaWYgKG1zaWUgJiYgcHJvcE5hbWUpIGVsZW1lbnQucHJvcChwcm9wTmFtZSwgYXR0cltuYW1lXSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgfTsKfSk7CgovKiBnbG9iYWwgLW51bGxGb3JtQ3RybCwgLVNVQk1JVFRFRF9DTEFTUywgYWRkU2V0VmFsaWRpdHlNZXRob2Q6IHRydWUKICovCnZhciBudWxsRm9ybUN0cmwgPSB7CiAgJGFkZENvbnRyb2w6IG5vb3AsCiAgJCRyZW5hbWVDb250cm9sOiBudWxsRm9ybVJlbmFtZUNvbnRyb2wsCiAgJHJlbW92ZUNvbnRyb2w6IG5vb3AsCiAgJHNldFZhbGlkaXR5OiBub29wLAogICRzZXREaXJ0eTogbm9vcCwKICAkc2V0UHJpc3RpbmU6IG5vb3AsCiAgJHNldFN1Ym1pdHRlZDogbm9vcAp9LApTVUJNSVRURURfQ0xBU1MgPSAnbmctc3VibWl0dGVkJzsKCmZ1bmN0aW9uIG51bGxGb3JtUmVuYW1lQ29udHJvbChjb250cm9sLCBuYW1lKSB7CiAgY29udHJvbC4kbmFtZSA9IG5hbWU7Cn0KCi8qKgogKiBAbmdkb2MgdHlwZQogKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyCiAqCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHByaXN0aW5lIFRydWUgaWYgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybSB5ZXQuCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJGRpcnR5IFRydWUgaWYgdXNlciBoYXMgYWxyZWFkeSBpbnRlcmFjdGVkIHdpdGggdGhlIGZvcm0uCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHZhbGlkIFRydWUgaWYgYWxsIG9mIHRoZSBjb250YWluaW5nIGZvcm1zIGFuZCBjb250cm9scyBhcmUgdmFsaWQuCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJGludmFsaWQgVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgY29udGFpbmluZyBjb250cm9sIG9yIGZvcm0gaXMgaW52YWxpZC4KICogQHByb3BlcnR5IHtib29sZWFufSAkc3VibWl0dGVkIFRydWUgaWYgdXNlciBoYXMgc3VibWl0dGVkIHRoZSBmb3JtIGV2ZW4gaWYgaXRzIGludmFsaWQuCiAqCiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSAkZXJyb3IgSXMgYW4gb2JqZWN0IGhhc2gsIGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBjb250cm9scyBvcgogKiAgZm9ybXMgd2l0aCBmYWlsaW5nIHZhbGlkYXRvcnMsIHdoZXJlOgogKgogKiAgLSBrZXlzIGFyZSB2YWxpZGF0aW9uIHRva2VucyAoZXJyb3IgbmFtZXMpLAogKiAgLSB2YWx1ZXMgYXJlIGFycmF5cyBvZiBjb250cm9scyBvciBmb3JtcyB0aGF0IGhhdmUgYSBmYWlsaW5nIHZhbGlkYXRvciBmb3IgZ2l2ZW4gZXJyb3IgbmFtZS4KICoKICogIEJ1aWx0LWluIHZhbGlkYXRpb24gdG9rZW5zOgogKgogKiAgLSBgZW1haWxgCiAqICAtIGBtYXhgCiAqICAtIGBtYXhsZW5ndGhgCiAqICAtIGBtaW5gCiAqICAtIGBtaW5sZW5ndGhgCiAqICAtIGBudW1iZXJgCiAqICAtIGBwYXR0ZXJuYAogKiAgLSBgcmVxdWlyZWRgCiAqICAtIGB1cmxgCiAqICAtIGBkYXRlYAogKiAgLSBgZGF0ZXRpbWVsb2NhbGAKICogIC0gYHRpbWVgCiAqICAtIGB3ZWVrYAogKiAgLSBgbW9udGhgCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBgRm9ybUNvbnRyb2xsZXJgIGtlZXBzIHRyYWNrIG9mIGFsbCBpdHMgY29udHJvbHMgYW5kIG5lc3RlZCBmb3JtcyBhcyB3ZWxsIGFzIHRoZSBzdGF0ZSBvZiB0aGVtLAogKiBzdWNoIGFzIGJlaW5nIHZhbGlkL2ludmFsaWQgb3IgZGlydHkvcHJpc3RpbmUuCiAqCiAqIEVhY2gge0BsaW5rIG5nLmRpcmVjdGl2ZTpmb3JtIGZvcm19IGRpcmVjdGl2ZSBjcmVhdGVzIGFuIGluc3RhbmNlCiAqIG9mIGBGb3JtQ29udHJvbGxlcmAuCiAqCiAqLwovL2Fza3MgZm9yICRzY29wZSB0byBmb29sIHRoZSBCQyBjb250cm9sbGVyIG1vZHVsZQpGb3JtQ29udHJvbGxlci4kaW5qZWN0ID0gWyckZWxlbWVudCcsICckYXR0cnMnLCAnJHNjb3BlJywgJyRhbmltYXRlJywgJyRpbnRlcnBvbGF0ZSddOwpmdW5jdGlvbiBGb3JtQ29udHJvbGxlcihlbGVtZW50LCBhdHRycywgJHNjb3BlLCAkYW5pbWF0ZSwgJGludGVycG9sYXRlKSB7CiAgdmFyIGZvcm0gPSB0aGlzLAogICAgICBjb250cm9scyA9IFtdOwoKICB2YXIgcGFyZW50Rm9ybSA9IGZvcm0uJCRwYXJlbnRGb3JtID0gZWxlbWVudC5wYXJlbnQoKS5jb250cm9sbGVyKCdmb3JtJykgfHwgbnVsbEZvcm1DdHJsOwoKICAvLyBpbml0IHN0YXRlCiAgZm9ybS4kZXJyb3IgPSB7fTsKICBmb3JtLiQkc3VjY2VzcyA9IHt9OwogIGZvcm0uJHBlbmRpbmcgPSB1bmRlZmluZWQ7CiAgZm9ybS4kbmFtZSA9ICRpbnRlcnBvbGF0ZShhdHRycy5uYW1lIHx8IGF0dHJzLm5nRm9ybSB8fCAnJykoJHNjb3BlKTsKICBmb3JtLiRkaXJ0eSA9IGZhbHNlOwogIGZvcm0uJHByaXN0aW5lID0gdHJ1ZTsKICBmb3JtLiR2YWxpZCA9IHRydWU7CiAgZm9ybS4kaW52YWxpZCA9IGZhbHNlOwogIGZvcm0uJHN1Ym1pdHRlZCA9IGZhbHNlOwoKICBwYXJlbnRGb3JtLiRhZGRDb250cm9sKGZvcm0pOwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkcm9sbGJhY2tWaWV3VmFsdWUKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFJvbGxiYWNrIGFsbCBmb3JtIGNvbnRyb2xzIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgYCRtb2RlbFZhbHVlYC4KICAgKgogICAqIFVwZGF0ZXMgbWF5IGJlIHBlbmRpbmcgYnkgYSBkZWJvdW5jZWQgZXZlbnQgb3IgYmVjYXVzZSB0aGUgaW5wdXQgaXMgd2FpdGluZyBmb3IgYSBzb21lIGZ1dHVyZQogICAqIGV2ZW50IGRlZmluZWQgaW4gYG5nLW1vZGVsLW9wdGlvbnNgLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgbmVlZGVkIGJ5IHRoZSByZXNldCBidXR0b24gb2YKICAgKiBhIGZvcm0gdGhhdCB1c2VzIGBuZy1tb2RlbC1vcHRpb25zYCB0byBwZW5kIHVwZGF0ZXMuCiAgICovCiAgZm9ybS4kcm9sbGJhY2tWaWV3VmFsdWUgPSBmdW5jdGlvbigpIHsKICAgIGZvckVhY2goY29udHJvbHMsIGZ1bmN0aW9uKGNvbnRyb2wpIHsKICAgICAgY29udHJvbC4kcm9sbGJhY2tWaWV3VmFsdWUoKTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRjb21taXRWaWV3VmFsdWUKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIENvbW1pdCBhbGwgZm9ybSBjb250cm9scyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGAkbW9kZWxWYWx1ZWAuCiAgICoKICAgKiBVcGRhdGVzIG1heSBiZSBwZW5kaW5nIGJ5IGEgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZSBmdXR1cmUKICAgKiBldmVudCBkZWZpbmVkIGluIGBuZy1tb2RlbC1vcHRpb25zYC4gVGhpcyBtZXRob2QgaXMgcmFyZWx5IG5lZWRlZCBhcyBgTmdNb2RlbENvbnRyb2xsZXJgCiAgICogdXN1YWxseSBoYW5kbGVzIGNhbGxpbmcgdGhpcyBpbiByZXNwb25zZSB0byBpbnB1dCBldmVudHMuCiAgICovCiAgZm9ybS4kY29tbWl0Vmlld1ZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICBmb3JFYWNoKGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7CiAgICAgIGNvbnRyb2wuJGNvbW1pdFZpZXdWYWx1ZSgpOwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJGFkZENvbnRyb2wKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFJlZ2lzdGVyIGEgY29udHJvbCB3aXRoIHRoZSBmb3JtLgogICAqCiAgICogSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhcmUgbGlua2VkLgogICAqLwogIGZvcm0uJGFkZENvbnRyb2wgPSBmdW5jdGlvbihjb250cm9sKSB7CiAgICAvLyBCcmVha2luZyBjaGFuZ2UgLSBiZWZvcmUsIGlucHV0cyB3aG9zZSBuYW1lIHdhcyAiaGFzT3duUHJvcGVydHkiIHdlcmUgcXVpZXRseSBpZ25vcmVkCiAgICAvLyBhbmQgbm90IGFkZGVkIHRvIHRoZSBzY29wZS4gIE5vdyB3ZSB0aHJvdyBhbiBlcnJvci4KICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KGNvbnRyb2wuJG5hbWUsICdpbnB1dCcpOwogICAgY29udHJvbHMucHVzaChjb250cm9sKTsKCiAgICBpZiAoY29udHJvbC4kbmFtZSkgewogICAgICBmb3JtW2NvbnRyb2wuJG5hbWVdID0gY29udHJvbDsKICAgIH0KICB9OwoKICAvLyBQcml2YXRlIEFQSTogcmVuYW1lIGEgZm9ybSBjb250cm9sCiAgZm9ybS4kJHJlbmFtZUNvbnRyb2wgPSBmdW5jdGlvbihjb250cm9sLCBuZXdOYW1lKSB7CiAgICB2YXIgb2xkTmFtZSA9IGNvbnRyb2wuJG5hbWU7CgogICAgaWYgKGZvcm1bb2xkTmFtZV0gPT09IGNvbnRyb2wpIHsKICAgICAgZGVsZXRlIGZvcm1bb2xkTmFtZV07CiAgICB9CiAgICBmb3JtW25ld05hbWVdID0gY29udHJvbDsKICAgIGNvbnRyb2wuJG5hbWUgPSBuZXdOYW1lOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRyZW1vdmVDb250cm9sCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBEZXJlZ2lzdGVyIGEgY29udHJvbCBmcm9tIHRoZSBmb3JtLgogICAqCiAgICogSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhcmUgZGVzdHJveWVkLgogICAqLwogIGZvcm0uJHJlbW92ZUNvbnRyb2wgPSBmdW5jdGlvbihjb250cm9sKSB7CiAgICBpZiAoY29udHJvbC4kbmFtZSAmJiBmb3JtW2NvbnRyb2wuJG5hbWVdID09PSBjb250cm9sKSB7CiAgICAgIGRlbGV0ZSBmb3JtW2NvbnRyb2wuJG5hbWVdOwogICAgfQogICAgZm9yRWFjaChmb3JtLiRwZW5kaW5nLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkgewogICAgICBmb3JtLiRzZXRWYWxpZGl0eShuYW1lLCBudWxsLCBjb250cm9sKTsKICAgIH0pOwogICAgZm9yRWFjaChmb3JtLiRlcnJvciwgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsKICAgICAgZm9ybS4kc2V0VmFsaWRpdHkobmFtZSwgbnVsbCwgY29udHJvbCk7CiAgICB9KTsKCiAgICBhcnJheVJlbW92ZShjb250cm9scywgY29udHJvbCk7CiAgfTsKCgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRWYWxpZGl0eQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogU2V0cyB0aGUgdmFsaWRpdHkgb2YgYSBmb3JtIGNvbnRyb2wuCiAgICoKICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIHBhcmVudCBmb3Jtcy4KICAgKi8KICBhZGRTZXRWYWxpZGl0eU1ldGhvZCh7CiAgICBjdHJsOiB0aGlzLAogICAgJGVsZW1lbnQ6IGVsZW1lbnQsCiAgICBzZXQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIGNvbnRyb2wpIHsKICAgICAgdmFyIGxpc3QgPSBvYmplY3RbcHJvcGVydHldOwogICAgICBpZiAoIWxpc3QpIHsKICAgICAgICBvYmplY3RbcHJvcGVydHldID0gW2NvbnRyb2xdOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihjb250cm9sKTsKICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgICBsaXN0LnB1c2goY29udHJvbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgdW5zZXQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIGNvbnRyb2wpIHsKICAgICAgdmFyIGxpc3QgPSBvYmplY3RbcHJvcGVydHldOwogICAgICBpZiAoIWxpc3QpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYXJyYXlSZW1vdmUobGlzdCwgY29udHJvbCk7CiAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldOwogICAgICB9CiAgICB9LAogICAgcGFyZW50Rm9ybTogcGFyZW50Rm9ybSwKICAgICRhbmltYXRlOiAkYW5pbWF0ZQogIH0pOwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkc2V0RGlydHkKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFNldHMgdGhlIGZvcm0gdG8gYSBkaXJ0eSBzdGF0ZS4KICAgKgogICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gYWRkIHRoZSAnbmctZGlydHknIGNsYXNzIGFuZCBzZXQgdGhlIGZvcm0gdG8gYSBkaXJ0eQogICAqIHN0YXRlIChuZy1kaXJ0eSBjbGFzcykuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBwcm9wYWdhdGUgdG8gcGFyZW50IGZvcm1zLgogICAqLwogIGZvcm0uJHNldERpcnR5ID0gZnVuY3Rpb24oKSB7CiAgICAkYW5pbWF0ZS5yZW1vdmVDbGFzcyhlbGVtZW50LCBQUklTVElORV9DTEFTUyk7CiAgICAkYW5pbWF0ZS5hZGRDbGFzcyhlbGVtZW50LCBESVJUWV9DTEFTUyk7CiAgICBmb3JtLiRkaXJ0eSA9IHRydWU7CiAgICBmb3JtLiRwcmlzdGluZSA9IGZhbHNlOwogICAgcGFyZW50Rm9ybS4kc2V0RGlydHkoKTsKICB9OwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkc2V0UHJpc3RpbmUKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHByaXN0aW5lIHN0YXRlLgogICAqCiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlICduZy1kaXJ0eScgY2xhc3MgYW5kIHNldCB0aGUgZm9ybSB0byBpdHMgcHJpc3RpbmUKICAgKiBzdGF0ZSAobmctcHJpc3RpbmUgY2xhc3MpLiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIGFsbCB0aGUgY29udHJvbHMgY29udGFpbmVkCiAgICogaW4gdGhpcyBmb3JtLgogICAqCiAgICogU2V0dGluZyBhIGZvcm0gYmFjayB0byBhIHByaXN0aW5lIHN0YXRlIGlzIG9mdGVuIHVzZWZ1bCB3aGVuIHdlIHdhbnQgdG8gJ3JldXNlJyBhIGZvcm0gYWZ0ZXIKICAgKiBzYXZpbmcgb3IgcmVzZXR0aW5nIGl0LgogICAqLwogIGZvcm0uJHNldFByaXN0aW5lID0gZnVuY3Rpb24oKSB7CiAgICAkYW5pbWF0ZS5zZXRDbGFzcyhlbGVtZW50LCBQUklTVElORV9DTEFTUywgRElSVFlfQ0xBU1MgKyAnICcgKyBTVUJNSVRURURfQ0xBU1MpOwogICAgZm9ybS4kZGlydHkgPSBmYWxzZTsKICAgIGZvcm0uJHByaXN0aW5lID0gdHJ1ZTsKICAgIGZvcm0uJHN1Ym1pdHRlZCA9IGZhbHNlOwogICAgZm9yRWFjaChjb250cm9scywgZnVuY3Rpb24oY29udHJvbCkgewogICAgICBjb250cm9sLiRzZXRQcmlzdGluZSgpOwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFVudG91Y2hlZAogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogU2V0cyB0aGUgZm9ybSB0byBpdHMgdW50b3VjaGVkIHN0YXRlLgogICAqCiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlICduZy10b3VjaGVkJyBjbGFzcyBhbmQgc2V0IHRoZSBmb3JtIGNvbnRyb2xzIHRvIHRoZWlyCiAgICogdW50b3VjaGVkIHN0YXRlIChuZy11bnRvdWNoZWQgY2xhc3MpLgogICAqCiAgICogU2V0dGluZyBhIGZvcm0gY29udHJvbHMgYmFjayB0byB0aGVpciB1bnRvdWNoZWQgc3RhdGUgaXMgb2Z0ZW4gdXNlZnVsIHdoZW4gc2V0dGluZyB0aGUgZm9ybQogICAqIGJhY2sgdG8gaXRzIHByaXN0aW5lIHN0YXRlLgogICAqLwogIGZvcm0uJHNldFVudG91Y2hlZCA9IGZ1bmN0aW9uKCkgewogICAgZm9yRWFjaChjb250cm9scywgZnVuY3Rpb24oY29udHJvbCkgewogICAgICBjb250cm9sLiRzZXRVbnRvdWNoZWQoKTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRTdWJtaXR0ZWQKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHN1Ym1pdHRlZCBzdGF0ZS4KICAgKi8KICBmb3JtLiRzZXRTdWJtaXR0ZWQgPSBmdW5jdGlvbigpIHsKICAgICRhbmltYXRlLmFkZENsYXNzKGVsZW1lbnQsIFNVQk1JVFRFRF9DTEFTUyk7CiAgICBmb3JtLiRzdWJtaXR0ZWQgPSB0cnVlOwogICAgcGFyZW50Rm9ybS4kc2V0U3VibWl0dGVkKCk7CiAgfTsKfQoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdGb3JtCiAqIEByZXN0cmljdCBFQUMKICoKICogQGRlc2NyaXB0aW9uCiAqIE5lc3RhYmxlIGFsaWFzIG9mIHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBgZm9ybWB9IGRpcmVjdGl2ZS4gjNzvVsWHAgAKIAAACiAAAGj3KB/SxQgAJ60eEwgARQAf/NQ4QABABrbcwKgHYMCoBzYf9ZUiQbv1CFh6fNOAGAFTr9UAAAEBCAoATaXKAKNezkhUTUwKICogZG9lcyBub3QgYWxsb3cgbmVzdGluZyBvZiBmb3JtIGVsZW1lbnRzLiBJdCBpcyB1c2VmdWwgdG8gbmVzdCBmb3JtcywgZm9yIGV4YW1wbGUgaWYgdGhlIHZhbGlkaXR5IG9mIGEKICogc3ViLWdyb3VwIG9mIGNvbnRyb2xzIG5lZWRzIHRvIGJlIGRldGVybWluZWQuCiAqCiAqIE5vdGU6IHRoZSBwdXJwb3NlIG9mIGBuZ0Zvcm1gIGlzIHRvIGdyb3VwIGNvbnRyb2xzLAogKiBidXQgbm90IHRvIGJlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBgPGZvcm0+YCB0YWcgd2l0aCBhbGwgb2YgaXRzIGNhcGFiaWxpdGllcwogKiAoZS5nLiBwb3N0aW5nIHRvIHRoZSBzZXJ2ZXIsIC4uLikuCiAqCiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdGb3JtfG5hbWUgTmFtZSBvZiB0aGUgZm9ybS4gSWYgc3BlY2lmaWVkLCB0aGUgZm9ybSBjb250cm9sbGVyIHdpbGwgYmUgcHVibGlzaGVkIGludG8KICogICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgc2NvcGUsIHVuZGVyIHRoaXMgbmFtZS4KICoKICovCgogLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgZm9ybQogKiBAcmVzdHJpY3QgRQogKgogKiBAZGVzY3JpcHRpb24KICogRGlyZWN0aXZlIHRoYXQgaW5zdGFudGlhdGVzCiAqIHtAbGluayBmb3JtLkZvcm1Db250cm9sbGVyIEZvcm1Db250cm9sbGVyfS4KICoKICogSWYgdGhlIGBuYW1lYCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZm9ybSBjb250cm9sbGVyIGlzIHB1Ymxpc2hlZCBvbnRvIHRoZSBjdXJyZW50IHNjb3BlIHVuZGVyCiAqIHRoaXMgbmFtZS4KICoKICogIyBBbGlhczoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Zvcm0gYG5nRm9ybWB9CiAqCiAqIEluIEFuZ3VsYXIgZm9ybXMgY2FuIGJlIG5lc3RlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBvdXRlciBmb3JtIGlzIHZhbGlkIHdoZW4gYWxsIG9mIHRoZSBjaGlsZAogKiBmb3JtcyBhcmUgdmFsaWQgYXMgd2VsbC4gSG93ZXZlciwgYnJvd3NlcnMgZG8gbm90IGFsbG93IG5lc3Rpbmcgb2YgYDxmb3JtPmAgZWxlbWVudHMsIHNvCiAqIEFuZ3VsYXIgcHJvdmlkZXMgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdGb3JtIGBuZ0Zvcm1gfSBkaXJlY3RpdmUgd2hpY2ggYmVoYXZlcyBpZGVudGljYWxseSB0bwogKiBgPGZvcm0+YCBidXQgY2FuIGJlIG5lc3RlZC4gIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIG5lc3RlZCBmb3Jtcywgd2hpY2ggaXMgdmVyeSB1c2VmdWwgd2hlbgogKiB1c2luZyBBbmd1bGFyIHZhbGlkYXRpb24gZGlyZWN0aXZlcyBpbiBmb3JtcyB0aGF0IGFyZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgdXNpbmcgdGhlCiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgYG5nUmVwZWF0YH0gZGlyZWN0aXZlLiBTaW5jZSB5b3UgY2Fubm90IGR5bmFtaWNhbGx5IGdlbmVyYXRlIHRoZSBgbmFtZWAKICogYXR0cmlidXRlIG9mIGlucHV0IGVsZW1lbnRzIHVzaW5nIGludGVycG9sYXRpb24sIHlvdSBoYXZlIHRvIHdyYXAgZWFjaCBzZXQgb2YgcmVwZWF0ZWQgaW5wdXRzIGluIGFuCiAqIGBuZ0Zvcm1gIGRpcmVjdGl2ZSBhbmQgbmVzdCB0aGVzZSBpbiBhbiBvdXRlciBgZm9ybWAgZWxlbWVudC4KICoKICoKICogIyBDU1MgY2xhc3NlcwogKiAgLSBgbmctdmFsaWRgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyB2YWxpZC4KICogIC0gYG5nLWludmFsaWRgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyBpbnZhbGlkLgogKiAgLSBgbmctcHJpc3RpbmVgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyBwcmlzdGluZS4KICogIC0gYG5nLWRpcnR5YCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgZGlydHkuCiAqICAtIGBuZy1zdWJtaXR0ZWRgIGlzIHNldCBpZiB0aGUgZm9ybSB3YXMgc3VibWl0dGVkLgogKgogKiBLZWVwIGluIG1pbmQgdGhhdCBuZ0FuaW1hdGUgY2FuIGRldGVjdCBlYWNoIG9mIHRoZXNlIGNsYXNzZXMgd2hlbiBhZGRlZCBhbmQgcmVtb3ZlZC4KICoKICoKICogIyBTdWJtaXR0aW5nIGEgZm9ybSBhbmQgcHJldmVudGluZyB0aGUgZGVmYXVsdCBhY3Rpb24KICoKICogU2luY2UgdGhlIHJvbGUgb2YgZm9ybXMgaW4gY2xpZW50LXNpZGUgQW5ndWxhciBhcHBsaWNhdGlvbnMgaXMgZGlmZmVyZW50IHRoYW4gaW4gY2xhc3NpY2FsCiAqIHJvdW5kdHJpcCBhcHBzLCBpdCBpcyBkZXNpcmFibGUgZm9yIHRoZSBicm93c2VyIG5vdCB0byB0cmFuc2xhdGUgdGhlIGZvcm0gc3VibWlzc2lvbiBpbnRvIGEgZnVsbAogKiBwYWdlIHJlbG9hZCB0aGF0IHNlbmRzIHRoZSBkYXRhIHRvIHRoZSBzZXJ2ZXIuIEluc3RlYWQgc29tZSBqYXZhc2NyaXB0IGxvZ2ljIHNob3VsZCBiZSB0cmlnZ2VyZWQKICogdG8gaGFuZGxlIHRoZSBmb3JtIHN1Ym1pc3Npb24gaW4gYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgd2F5LgogKgogKiBGb3IgdGhpcyByZWFzb24sIEFuZ3VsYXIgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uIChmb3JtIHN1Ym1pc3Npb24gdG8gdGhlIHNlcnZlcikgdW5sZXNzIHRoZQogKiBgPGZvcm0+YCBlbGVtZW50IGhhcyBhbiBgYWN0aW9uYCBhdHRyaWJ1dGUgc3BlY2lmaWVkLgogKgogKiBZb3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gd2F5cyB0byBzcGVjaWZ5IHdoYXQgamF2YXNjcmlwdCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuCiAqIGEgZm9ybSBpcyBzdWJtaXR0ZWQ6CiAqCiAqIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1N1Ym1pdCBuZ1N1Ym1pdH0gZGlyZWN0aXZlIG9uIHRoZSBmb3JtIGVsZW1lbnQKICogLSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xpY2sgbmdDbGlja30gZGlyZWN0aXZlIG9uIHRoZSBmaXJzdAogICogIGJ1dHRvbiBvciBpbnB1dCBmaWVsZCBvZiB0eXBlIHN1Ym1pdCAoaW5wdXRbdHlwZT1zdWJtaXRdKQogKgogKiBUbyBwcmV2ZW50IGRvdWJsZSBleGVjdXRpb24gb2YgdGhlIGhhbmRsZXIsIHVzZSBvbmx5IG9uZSBvZiB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1N1Ym1pdCBuZ1N1Ym1pdH0KICogb3Ige0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9IGRpcmVjdGl2ZXMuCiAqIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gc3VibWlzc2lvbiBydWxlcyBpbiB0aGUgSFRNTCBzcGVjaWZpY2F0aW9uOgogKgogKiAtIElmIGEgZm9ybSBoYXMgb25seSBvbmUgaW5wdXQgZmllbGQgdGhlbiBoaXR0aW5nIGVudGVyIGluIHRoaXMgZmllbGQgdHJpZ2dlcnMgZm9ybSBzdWJtaXQKICogKGBuZ1N1Ym1pdGApCiAqIC0gaWYgYSBmb3JtIGhhcyAyKyBpbnB1dCBmaWVsZHMgYW5kIG5vIGJ1dHRvbnMgb3IgaW5wdXRbdHlwZT1zdWJtaXRdIHRoZW4gaGl0dGluZyBlbnRlcgogKiBkb2Vzbid0IHRyaWdnZXIgc3VibWl0CiAqIC0gaWYgYSBmb3JtIGhhcyBvbmUgb3IgbW9yZSBpbnB1dCBmaWVsZHMgYW5kIG9uZSBvciBtb3JlIGJ1dHRvbnMgb3IgaW5wdXRbdHlwZT1zdWJtaXRdIHRoZW4KICogaGl0dGluZyBlbnRlciBpbiBhbnkgb2YgdGhlIGlucHV0IGZpZWxkcyB3aWxsIHRyaWdnZXIgdGhlIGNsaWNrIGhhbmRsZXIgb24gdGhlICpmaXJzdCogYnV0dG9uIG9yCiAqIGlucHV0W3R5cGU9c3VibWl0XSAoYG5nQ2xpY2tgKSAqYW5kKiBhIHN1Ym1pdCBoYW5kbGVyIG9uIHRoZSBlbmNsb3NpbmcgZm9ybSAoYG5nU3VibWl0YCkKICoKICogQW55IHBlbmRpbmcgYG5nTW9kZWxPcHRpb25zYCBjaGFuZ2VzIHdpbGwgdGFrZSBwbGFjZSBpbW1lZGlhdGVseSB3aGVuIGFuIGVuY2xvc2luZyBmb3JtIGlzCiAqIHN1Ym1pdHRlZC4gTm90ZSB0aGF0IGBuZ0NsaWNrYCBldmVudHMgd2lsbCBvY2N1ciBiZWZvcmUgdGhlIG1vZGVsIGlzIHVwZGF0ZWQuIFVzZSBgbmdTdWJtaXRgCiAqIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSB1cGRhdGVkIG1vZGVsLgogKgogKiAjIyBBbmltYXRpb24gSG9va3MKICoKICogQW5pbWF0aW9ucyBpbiBuZ0Zvcm0gYXJlIHRyaWdnZXJlZCB3aGVuIGFueSBvZiB0aGUgYXNzb2NpYXRlZCBDU1MgY2xhc3NlcyBhcmUgYWRkZWQgYW5kIHJlbW92ZWQuCiAqIFRoZXNlIGNsYXNzZXMgYXJlOiBgLm5nLXByaXN0aW5lYCwgYC5uZy1kaXJ0eWAsIGAubmctaW52YWxpZGAgYW5kIGAubmctdmFsaWRgIGFzIHdlbGwgYXMgYW55CiAqIG90aGVyIHZhbGlkYXRpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCB3aXRoaW4gdGhlIGZvcm0uIEFuaW1hdGlvbnMgaW4gbmdGb3JtIGFyZSBzaW1pbGFyIHRvIGhvdwogKiB0aGV5IHdvcmsgaW4gbmdDbGFzcyBhbmQgYW5pbWF0aW9ucyBjYW4gYmUgaG9va2VkIGludG8gdXNpbmcgQ1NTIHRyYW5zaXRpb25zLCBrZXlmcmFtZXMgYXMgd2VsbAogKiBhcyBKUyBhbmltYXRpb25zLgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBzaW1wbGUgd2F5IHRvIHV0aWxpemUgQ1NTIHRyYW5zaXRpb25zIHRvIHN0eWxlIGEgZm9ybSBlbGVtZW50CiAqIHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQgYXMgaW52YWxpZCBhZnRlciBpdCBoYXMgYmVlbiB2YWxpZGF0ZWQ6CiAqCiAqIDxwcmU+CiAqIC8vYmUgc3VyZSB0byBpbmNsdWRlIG5nQW5pbWF0ZSBhcyBhIG1vZHVsZSB0byBob29rIGludG8gbW9yZQogKiAvL2FkdmFuY2VkIGFuaW1hdGlvbnMKICogLm15LWZvcm0gewogKiAgIHRyYW5zaXRpb246MC41cyBsaW5lYXIgYWxsOwogKiAgIGJhY2tncm91bmQ6IHdoaXRlOwogKiB9CiAqIC5teS1mb3JtLm5nLWludmFsaWQgewogKiAgIGJhY2tncm91bmQ6IHJlZDsKICogICBjb2xvcjp3aGl0ZTsKICogfQogKiA8L3ByZT4KICoKICogQGV4YW1wbGUKICAgIDxleGFtcGxlIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSIgZml4QmFzZT0idHJ1ZSIgbW9kdWxlPSJmb3JtRXhhbXBsZSI+CiAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHNjcmlwdD4KICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2Zvcm1FeGFtcGxlJywgW10pCiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0Zvcm1Db250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICAgICRzY29wZS51c2VyVHlwZSA9ICdndWVzdCc7CiAgICAgICAgICAgfV0pOwogICAgICAgPC9zY3JpcHQ+CiAgICAgICA8c3R5bGU+CiAgICAgICAgLm15LWZvcm0gewogICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBsaW5lYXIgMC41czsKICAgICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgfQogICAgICAgIC5teS1mb3JtLm5nLWludmFsaWQgewogICAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICAgIH0KICAgICAgIDwvc3R5bGU+CiAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkZvcm1Db250cm9sbGVyIiBjbGFzcz0ibXktZm9ybSI+CiAgICAgICAgIHVzZXJUeXBlOiA8aW5wdXQgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ1c2VyVHlwZSIgcmVxdWlyZWQ+CiAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+UmVxdWlyZWQhPC9zcGFuPjxicj4KICAgICAgICAgPHR0PnVzZXJUeXBlID0ge3t1c2VyVHlwZX19PC90dD48YnI+CiAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxicj4KICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyPgogICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnI+CiAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyPgogICAgICAgIDwvZm9ybT4KICAgICAgPC9maWxlPgogICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciB1c2VyVHlwZSA9IGVsZW1lbnQoYnkuYmluZGluZygndXNlclR5cGUnKSk7CiAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7CgogICAgICAgICAgZXhwZWN0KHVzZXJUeXBlLmdldFRleHQoKSkudG9Db250YWluKCdndWVzdCcpOwogICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CiAgICAgICAgfSk7CgogICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHVzZXJUeXBlID0gZWxlbWVudChieS5iaW5kaW5nKCd1c2VyVHlwZScpKTsKICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKICAgICAgICAgIHZhciB1c2VySW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyVHlwZScpKTsKCiAgICAgICAgICB1c2VySW5wdXQuY2xlYXIoKTsKICAgICAgICAgIHVzZXJJbnB1dC5zZW5kS2V5cygnJyk7CgogICAgICAgICAgZXhwZWN0KHVzZXJUeXBlLmdldFRleHQoKSkudG9FcXVhbCgndXNlclR5cGUgPScpOwogICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgIH0pOwogICAgICA8L2ZpbGU+CiAgICA8L2V4YW1wbGU+CiAqCiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBOYW1lIG9mIHRoZSBmb3JtLiBJZiBzcGVjaWZpZWQsIHRoZSBmb3JtIGNvbnRyb2xsZXIgd2lsbCBiZSBwdWJsaXNoZWQgaW50bwogKiAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBzY29wZSwgdW5kZXIgdGhpcyBuYW1lLgogKi8KdmFyIGZvcm1EaXJlY3RpdmVGYWN0b3J5ID0gZnVuY3Rpb24oaXNOZ0Zvcm0pIHsKICByZXR1cm4gWyckdGltZW91dCcsIGZ1bmN0aW9uKCR0aW1lb3V0KSB7CiAgICB2YXIgZm9ybURpcmVjdGl2ZSA9IHsKICAgICAgbmFtZTogJ2Zvcm0nLAogICAgICByZXN0cmljdDogaXNOZ0Zvcm0gPyAnRUFDJyA6ICdFJywKICAgICAgY29udHJvbGxlcjogRm9ybUNvbnRyb2xsZXIsCiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nRm9ybUNvbXBpbGUoZm9ybUVsZW1lbnQpIHsKICAgICAgICAvLyBTZXR1cCBpbml0aWFsIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgZm9ybUVsZW1lbnQuYWRkQ2xhc3MoUFJJU1RJTkVfQ0xBU1MpLmFkZENsYXNzKFZBTElEX0NMQVNTKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHByZTogZnVuY3Rpb24gbmdGb3JtUHJlTGluayhzY29wZSwgZm9ybUVsZW1lbnQsIGF0dHIsIGNvbnRyb2xsZXIpIHsKICAgICAgICAgICAgLy8gaWYgYGFjdGlvbmAgYXR0ciBpcyBub3QgcHJlc2VudCBvbiB0aGUgZm9ybSwgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gKHN1Ym1pc3Npb24pCiAgICAgICAgICAgIGlmICghKCdhY3Rpb24nIGluIGF0dHIpKSB7CiAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGpxIGV2ZW50cyBiZWNhdXNlIGlmIGEgZm9ybSBpcyBkZXN0cm95ZWQgZHVyaW5nIHN1Ym1pc3Npb24gdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAvLyBhY3Rpb24gaXMgbm90IHByZXZlbnRlZC4gc2VlICMxMjM4CiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBJRSA5IGlzIG5vdCBhZmZlY3RlZCBiZWNhdXNlIGl0IGRvZXNuJ3QgZmlyZSBhIHN1Ym1pdCBldmVudCBhbmQgdHJ5IHRvIGRvIGEgZnVsbAogICAgICAgICAgICAgIC8vIHBhZ2UgcmVsb2FkIGlmIHRoZSBmb3JtIHdhcyBkZXN0cm95ZWQgYnkgc3VibWlzc2lvbiBvZiB0aGUgZm9ybSB2aWEgYSBjbGljayBoYW5kbGVyCiAgICAgICAgICAgICAgLy8gb24gYSBidXR0b24gaW4gdGhlIGZvcm0uIExvb2tzIGxpa2UgYW4gSUU5IHNwZWNpZmljIGJ1Zy4KICAgICAgICAgICAgICB2YXIgaGFuZGxlRm9ybVN1Ym1pc3Npb24gPSBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRjb21taXRWaWV3VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kc2V0U3VibWl0dGVkKCk7CiAgICAgICAgICAgICAgICB9KTsNCozc71b4hwIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8SEAAQAZulcCoBzbAqAdglSIf9Vh6fNNBu/UIgBAL8BQ0AAABAQgKAKNezgBNpcqM3O9W+IcCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PElAAEAGbpTAqAc2wKgHYJUiH/VYenzTQbwU0IAQC/D0awAAAQEICgCjXs4ATaXKjNzvViqJAgBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNQ+QABABnZ2wKgHYMCoBzYf9ZUiQbwU0Fh6fNOAEAFT8DUAAAEBCAoATaXKAKNezjdGRTgNCgoKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lckZuKGZvcm1FbGVtZW50WzBdLCAnc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pOwoKICAgICAgICAgICAgICAvLyB1bnJlZ2lzdGVyIHRoZSBwcmV2ZW50RGVmYXVsdCBsaXN0ZW5lciBzbyB0aGF0IHdlIGRvbid0IG5vdCBsZWFrIG1lbW9yeSBidXQgaW4gYQogICAgICAgICAgICAgIC8vIHdheSB0aGF0IHdpbGwgYWNoaWV2ZSB0aGUgcHJldmVudGlvbiBvZiB0aGUgZGVmYXVsdCBhY3Rpb24uCiAgICAgICAgICAgICAgZm9ybUVsZW1lbnQub24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuKGZvcm1FbGVtZW50WzBdLCAnc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pOwogICAgICAgICAgICAgICAgfSwgMCwgZmFsc2UpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcGFyZW50Rm9ybUN0cmwgPSBjb250cm9sbGVyLiQkcGFyZW50Rm9ybSwKICAgICAgICAgICAgICAgIGFsaWFzID0gY29udHJvbGxlci4kbmFtZTsKCiAgICAgICAgICAgIGlmIChhbGlhcykgewogICAgICAgICAgICAgIHNldHRlcihzY29wZSwgYWxpYXMsIGNvbnRyb2xsZXIsIGFsaWFzKTsKICAgICAgICAgICAgICBhdHRyLiRvYnNlcnZlKGF0dHIubmFtZSA/ICduYW1lJyA6ICduZ0Zvcm0nLCBmdW5jdGlvbihuZXdWYWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKGFsaWFzID09PSBuZXdWYWx1ZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgc2V0dGVyKHNjb3BlLCBhbGlhcywgdW5kZWZpbmVkLCBhbGlhcyk7CiAgICAgICAgICAgICAgICBhbGlhcyA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgc2V0dGVyKHNjb3BlLCBhbGlhcywgY29udHJvbGxlciwgYWxpYXMpOwogICAgICAgICAgICAgICAgcGFyZW50Rm9ybUN0cmwuJCRyZW5hbWVDb250cm9sKGNvbnRyb2xsZXIsIGFsaWFzKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JtRWxlbWVudC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBwYXJlbnRGb3JtQ3RybC4kcmVtb3ZlQ29udHJvbChjb250cm9sbGVyKTsKICAgICAgICAgICAgICBpZiAoYWxpYXMpIHsKICAgICAgICAgICAgICAgIHNldHRlcihzY29wZSwgYWxpYXMsIHVuZGVmaW5lZCwgYWxpYXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBleHRlbmQoY29udHJvbGxlciwgbnVsbEZvcm1DdHJsKTsgLy9zdG9wIHByb3BhZ2F0aW5nIGNoaWxkIGRlc3RydWN0aW9uIGhhbmRsZXJzIHVwd2FyZHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gZm9ybURpcmVjdGl2ZTsKICB9XTsKfTsKCnZhciBmb3JtRGlyZWN0aXZlID0gZm9ybURpcmVjdGl2ZUZhY3RvcnkoKTsKdmFyIG5nRm9ybURpcmVjdGl2ZSA9IGZvcm1EaXJlY3RpdmVGYWN0b3J5KHRydWUpOwoKLyogZ2xvYmFsIFZBTElEX0NMQVNTOiB0cnVlLAogIElOVkFMSURfQ0xBU1M6IHRydWUsCiAgUFJJU1RJTkVfQ0xBU1M6IHRydWUsCiAgRElSVFlfQ0xBU1M6IHRydWUsCiAgVU5UT1VDSEVEX0NMQVNTOiB0cnVlLAogIFRPVUNIRURfQ0xBU1M6IHRydWUsCiovCgovLyBSZWdleCBjb2RlIGlzIG9idGFpbmVkIGZyb20gU086IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMxNDMwNzAvamF2YXNjcmlwdC1yZWdleC1pc28tZGF0ZXRpbWUjYW5zd2VyLTMxNDMyMzEKdmFyIElTT19EQVRFX1JFR0VYUCA9IC9cZHs0fS1bMDFdXGQtWzAtM11cZFRbMC0yXVxkOlswLTVdXGQ6WzAtNV1cZFwuXGQrKFsrLV1bMC0yXVxkOlswLTVdXGR8WikvOwp2YXIgVVJMX1JFR0VYUCA9IC9eKGZ0cHxodHRwfGh0dHBzKTpcL1wvKFx3Kzp7MCwxfVx3KkApPyhcUyspKDpbMC05XSspPyhcL3xcLyhbXHcjITouPys9JiVAIVwtXC9dKSk/JC87CnZhciBFTUFJTF9SRUdFWFAgPSAvXlthLXowLTkhIyQlJicqK1wvPT9eX2B7fH1+Li1dK0BbYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPyhcLlthLXowLTldKFthLXowLTktXSpbYS16MC05XSk/KSokL2k7CnZhciBOVU1CRVJfUkVHRVhQID0gL15ccyooXC18XCspPyhcZCt8KFxkKihcLlxkKikpKVxzKiQvOwp2YXIgREFURV9SRUdFWFAgPSAvXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pJC87CnZhciBEQVRFVElNRUxPQ0FMX1JFR0VYUCA9IC9eKFxkezR9KS0oXGRcZCktKFxkXGQpVChcZFxkKTooXGRcZCkoPzo6KFxkXGQpKFwuXGR7MSwzfSk/KT8kLzsKdmFyIFdFRUtfUkVHRVhQID0gL14oXGR7NH0pLVcoXGRcZCkkLzsKdmFyIE1PTlRIX1JFR0VYUCA9IC9eKFxkezR9KS0oXGRcZCkkLzsKdmFyIFRJTUVfUkVHRVhQID0gL14oXGRcZCk6KFxkXGQpKD86OihcZFxkKShcLlxkezEsM30pPyk/JC87CnZhciBERUZBVUxUX1JFR0VYUCA9IC8oXHMrfF4pZGVmYXVsdChccyt8JCkvOwoKdmFyICRuZ01vZGVsTWluRXJyID0gbmV3IG1pbkVycignbmdNb2RlbCcpOwoKdmFyIGlucHV0VHlwZSA9IHsKCiAgLyoqCiAgICogQG5nZG9jIGlucHV0CiAgICogQG5hbWUgaW5wdXRbdGV4dF0KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFN0YW5kYXJkIEhUTUwgdGV4dCBpbnB1dCB3aXRoIGFuZ3VsYXIgZGF0YSBiaW5kaW5nLCBpbmhlcml0ZWQgYnkgbW9zdCBvZiB0aGUgYGlucHV0YCBlbGVtZW50cy4KICAgKgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCiAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YKICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhbgogICAqICAgIG1pbmxlbmd0aC4KICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuCiAgICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mCiAgICogICAgYW55IGxlbmd0aC4KICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nCiAgICogICAgdGhhdCBjb250YWlucyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJvZHkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAqICAgIGFzIGluIHRoZSBuZ1BhdHRlcm4gZGlyZWN0aXZlLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHZhbHVlIGRvZXMgbm90IG1hdGNoCiAgICogICAgYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCiAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCB0aGVuIHRoaXMgaXMgdXNlZCBkaXJlY3RseS4KICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIHN0cmluZyB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgCiAgICogICAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgImFiYyJgIHdpbGwgYmUgY29udmVydGVkIHRvIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC4KICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIKICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtuZ1RyaW09dHJ1ZV0gSWYgc2V0IHRvIGZhbHNlIEFuZ3VsYXIgd2lsbCBub3QgYXV0b21hdGljYWxseSB0cmltIHRoZSBpbnB1dC4KICAgKiAgICBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciBpbnB1dFt0eXBlPXBhc3N3b3JkXSBjb250cm9scywgd2hpY2ggd2lsbCBuZXZlciB0cmltIHRoZQogICAqICAgIGlucHV0LgogICAqCiAgICogQGV4YW1wbGUKICAgICAgPGV4YW1wbGUgbmFtZT0idGV4dC1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0idGV4dElucHV0RXhhbXBsZSI+CiAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3RleHRJbnB1dEV4YW1wbGUnLCBbXSkKICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgICAgICRzY29wZS50ZXh0ID0gJ2d1ZXN0JzsKICAgICAgICAgICAgICAgJHNjb3BlLndvcmQgPSAvXlxzKlx3KlxzKiQvOwogICAgICAgICAgICAgfV0pOwogICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgICAgU2luZ2xlIHdvcmQ6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1wYXR0ZXJuPSJ3b3JkIiByZXF1aXJlZCBuZy10cmltPSJmYWxzZSI+CiAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucGF0dGVybiI+CiAgICAgICAgICAgICBTaW5nbGUgd29yZCBvbmx5ITwvc3Bhbj4KCiAgICAgICAgICAgPHR0PnRleHQgPSB7e3RleHR9fTwvdHQ+PGJyLz4KICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPgogICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CiAgICAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+CiAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9maWxlPgogICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgICAgdmFyIHRleHQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3RleHQnKSk7CiAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7CiAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd0ZXh0JykpOwoKICAgICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvQ29udGFpbignZ3Vlc3QnKTsKICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CiAgICAgICAgICB9KTsKCiAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTsKICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJycpOwoKICAgICAgICAgICAgZXhwZWN0KHRleHQuZ2V0VGV4dCgpKS50b0VxdWFsKCd0ZXh0ID0nKTsKICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgICAgfSk7CgogICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG11bHRpIHdvcmQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTsKICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJ2hlbGxvIHdvcmxkJyk7CgogICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CiAgICAgICAgICB9KTsKICAgICAgICA8L2ZpbGU+CiAgICAgIDwvZXhhbXBsZT4KICAgKi8KICAndGV4dCc6IHRleHRJbnB1dFR5cGUsCgogICAgLyoqCiAgICAgKiBAbmdkb2MgaW5wdXQKICAgICAqIEBuYW1lIGlucHV0W2RhdGVdCiAgICAgKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiBJbnB1dCB3aXRoIGRhdGUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0CiAgICAgKiB0aGUgSFRNTDUgZGF0ZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRleHQgbXVzdCBiZSBlbnRlcmVkIGluIGEgdmFsaWQgSVNPLTg2MDEKICAgICAqIGRhdGUgZm9ybWF0ICh5eXl5LU1NLWRkKSwgZm9yIGV4YW1wbGU6IGAyMDA5LTAxLTA2YC4gU2luY2UgbWFueQogICAgICogbW9kZXJuIGJyb3dzZXJzIGRvIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGlucHV0IHR5cGUsIGl0IGlzIGltcG9ydGFudCB0byBwcm92aWRlIGN1ZXMgdG8gdXNlcnMgb24gdGhlCiAgICAgKiBleHBlY3RlZCBpbnB1dCBmb3JtYXQgdmlhIGEgcGxhY2Vob2xkZXIgb3IgbGFiZWwuCiAgICAgKgogICAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuCiAgICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCiAgICAgKgogICAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZwogICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC4gVGhpcyBtdXN0IGJlIGEKICAgICAqIHZhbGlkIElTTyBkYXRlIHN0cmluZyAoeXl5eS1NTS1kZCkuCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdCBiZQogICAgICogYSB2YWxpZCBJU08gZGF0ZSBzdHJpbmcgKHl5eXktTU0tZGQpLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCiAgICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgogICAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIKICAgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgKgogICAgICogQGV4YW1wbGUKICAgICA8ZXhhbXBsZSBuYW1lPSJkYXRlLWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJkYXRlSW5wdXRFeGFtcGxlIj4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnZGF0ZUlucHV0RXhhbXBsZScsIFtdKQogICAgICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgICRzY29wZS52YWx1ZSA9IG5ldyBEYXRlKDIwMTMsIDksIDIyKTsKICAgICAgICAgICAgfV0pOwogICAgICAgPC9zY3JpcHQ+CiAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkRhdGVDb250cm9sbGVyIGFzIGRhdGVDdHJsIj4KICAgICAgICAgIFBpY2sgYSBkYXRlIGluIDIwMTM6CiAgICAgICAgICA8aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImV4YW1wbGVJbnB1dCIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ2YWx1ZSIKICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0ieXl5eS1NTS1kZCIgbWluPSIyMDEzLTAxLTAxIiBtYXg9IjIwMTMtMTItMzEiIHJlcXVpcmVkIC8+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgogICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5kYXRlIj4KICAgICAgICAgICAgICBOb3QgYSB2YWxpZCBkYXRlITwvc3Bhbj4KICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlIHwgZGF0ZTogInl5eXktTU0tZGQifX08L3R0Pjxici8+CiAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgogICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CiAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPgogICAgICAgPC9mb3JtPgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgICB2YXIgdmFsdWUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlIHwgZGF0ZTogInl5eXktTU0tZGQiJykpOwogICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsKCiAgICAgICAgLy8gY3VycmVudGx5IHByb3RyYWN0b3Ivd2ViZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKICAgICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzCiAgICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy81NjIpLgogICAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgewogICAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi4KICAgICAgICAgIHZhciBzY3IgPSAidmFyIGlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlSW5wdXQnKTsgIiArCiAgICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsKICAgICAgICAgICJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCciICsgdmFsICsgIicpOyB9KTsiOwogICAgICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcik7CiAgICAgICAgfQoKICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy0xMC0yMicpOwogICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpOwogICAgICAgIH0pOwoKICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHNldElucHV0KCcnKTsKICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsKICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7CiAgICAgICAgfSk7CgogICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgc2V0SW5wdXQoJzIwMTUtMDEtMDEnKTsKICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7CiAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOwogICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgICA8L2V4YW1wbGU+CiAgICAgKi8KICAnZGF0ZSc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ2RhdGUnLCBEQVRFX1JFR0VYUCwKICAgICAgICAgY3JlYXRlRGF0ZVBhcnNlcihEQVRFX1JFR0VYUCwgWyd5eXl5JywgJ01NJywgJ2RkJ10pLAogICAgICAgICAneXl5eS1NTS1kZCcpLAoKICAgLyoqCiAgICAqIEBuZ2RvYyBpbnB1dAogICAgKiBAbmFtZSBpbnB1dFtkYXRldGltZS1sb2NhbF0KICAgICoKICAgICogQGRlc2NyaXB0aW9uCiAgICAqIElucHV0IHdpdGggZGF0ZXRpbWUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0CiAgICAqIHRoZSBIVE1MNSBkYXRlIGlucHV0LCBhIHRleHQgZWxlbWVudCB3aWxsIGJlIHVzZWQuIEluIHRoYXQgY2FzZSwgdGhlIHRleHQgbXVzdCBiZSBlbnRlcmVkIGluIGEgdmFsaWQgSVNPLTg2MDEKICAgICogbG9jYWwgZGF0ZXRpbWUgZm9ybWF0ICh5eXl5LU1NLWRkVEhIOm1tOnNzKSwgZm9yIGV4YW1wbGU6IGAyMDEwLTEyLTI4VDE0OjU3OjAwYC4KICAgICoKICAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuCiAgICAqIEludmFsaWQgYERhdGVgIG9iamVjdHMgKGRhdGVzIHdob3NlIGBnZXRUaW1lKClgIGlzIGBOYU5gKSB3aWxsIGJlIHJlbmRlcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KICAgICoKICAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZwogICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfS4gQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgdGltZXpvbmUgb2YgdGhlIGJyb3dzZXIuCiAgICAqCiAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KICAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgogICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuIFRoaXMgbXVzdCBiZSBhCiAgICAqIHZhbGlkIElTTyBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLgogICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdCBiZQogICAgKiBhIHZhbGlkIElTTyBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLgogICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bwogICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgogICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCiAgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCiAgICAqCiAgICAqIEBleGFtcGxlCiAgICA8ZXhhbXBsZSBuYW1lPSJkYXRldGltZWxvY2FsLWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJkYXRlRXhhbXBsZSI+CiAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgPHNjcmlwdD4KICAgICAgICBhbmd1bGFyLm1vZHVsZSgnZGF0ZUV4YW1wbGUnLCBbXSkKICAgICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgICRzY29wZS52YWx1ZSA9IG5ldyBEYXRlKDIwMTAsIDExLCAyOCwgMTQsIDU3KTsKICAgICAgICAgIH1dKTsKICAgICAgPC9zY3JpcHQ+CiAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmwiPgogICAgICAgIFBpY2sgYSBkYXRlIGJldHdlZW4gaW4gMjAxMzoKICAgICAgICA8aW5wdXQgdHlwZT0iZGF0ZXRpbWUtbG9jYWwiIGlkPSJleGFtcGxlSW5wdXQiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idmFsdWUiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJ5eXl5LU1NLWRkVEhIOm1tOnNzIiBtaW49IjIwMDEtMDEtMDFUMDA6MDA6MDAiIG1heD0iMjAxMy0xMi0zMVQwMDowMDowMCIgcmVxdWlyZWQgLz4KICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgogICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLmRhdGV0aW1lbG9jYWwiPgogICAgICAgICAgICBOb3QgYSB2YWxpZCBkYXRlITwvc3Bhbj4KICAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlIHwgZGF0ZTogInl5eXktTU0tZGRUSEg6bW06c3MifX08L3R0Pjxici8+CiAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgogICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CiAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPgogICAgICA8L2Zvcm0+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCd2YWx1ZSB8IGRhdGU6ICJ5eXl5LU1NLWRkVEhIOm1tOnNzIicpKTsKICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOwogICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsKCiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CiAgICAgIC8vIHNlbmRpbmcga2V5cyB0byBhbGwga25vd24gSFRNTDUgaW5wdXQgY29udHJvbHMKICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuCiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgewogICAgICAgIC8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYW5kIGZvcmNlIHZhbGlkYXRpb24uCiAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsKICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsKICAgICAgICAiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnIiArIHZhbCArICInKTsgfSk7IjsKICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsKICAgICAgfQoKICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7CiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcyMDEwLTEyLTI4VDE0OjU3OjAwJyk7CiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpOwogICAgICB9KTsKCiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgewogICAgICAgIHNldElucHV0KCcnKTsKICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0VxdWFsKCd2YWx1ZSA9Jyk7CiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKICAgICAgfSk7CgogICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHsKICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMVQyMzo1OTowMCcpOwogICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7CiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKICAgICAgfSk7CiAgICA8L2ZpbGU+CiAgICA8L2V4YW1wbGU+CiAgICAqLwogICdkYXRldGltZS1sb2NhbCc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ2RhdGV0aW1lbG9jYWwnLCBEQVRFVElNRUxPQ0FMX1JFR0VYUCwKICAgICAgY3JlYXRlRGF0ZVBhcnNlcihEQVRFVElNRUxPQ0FMX1JFR0VYUCwgWyd5eXl5JywgJ01NJywgJ2RkJywgJ0hIJywgJ21tJywgJ3NzJywgJ3NzcyddKSwKICAgICAgJ3l5eXktTU0tZGRUSEg6bW06c3Muc3NzJyksCgogIC8qKgogICAqIEBuZ2RvYyBpbnB1dAogICAqIEBuYW1lIGlucHV0W3RpbWVdCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBJbnB1dCB3aXRoIHRpbWUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0CiAgICogdGhlIEhUTUw1IGRhdGUgaW5wdXQsIGEgdGV4dCBlbGVtZW50IHdpbGwgYmUgdXNlZC4gSW4gdGhhdCBjYXNlLCB0aGUgdGV4dCBtdXN0IGJlIGVudGVyZWQgaW4gYSB2YWxpZCBJU08tODYwMQogICAqIGxvY2FsIHRpbWUgZm9ybWF0IChISDptbTpzcyksIGZvciBleGFtcGxlOiBgMTQ6NTc6MDBgLiBNb2RlbCBtdXN0IGJlIGEgRGF0ZSBvYmplY3QuIFRoaXMgYmluZGluZyB3aWxsIGFsd2F5cyBvdXRwdXQgYQogICAqIERhdGUgb2JqZWN0IHRvIHRoZSBtb2RlbCBvZiBKYW51YXJ5IDEsIDE5NzAsIG9yIGxvY2FsIGRhdGUgYG5ldyBEYXRlKDE5NzAsIDAsIDEsIEhILCBtbSwgc3MpYC4KICAgKgogICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLgogICAqIEludmFsaWQgYERhdGVgIG9iamVjdHMgKGRhdGVzIHdob3NlIGBnZXRUaW1lKClgIGlzIGBOYU5gKSB3aWxsIGJlIHJlbmRlcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KICAgKgogICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmcKICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfS4gQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgdGltZXpvbmUgb2YgdGhlIGJyb3dzZXIuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC4gVGhpcyBtdXN0IGJlIGEKICAgKiB2YWxpZCBJU08gdGltZSBmb3JtYXQgKEhIOm1tOnNzKS4KICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdCBiZSBhCiAgICogdmFsaWQgSVNPIHRpbWUgZm9ybWF0IChISDptbTpzcykuCiAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bwogICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCiAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4KICAgKgogICAqIEBleGFtcGxlCiAgIDxleGFtcGxlIG5hbWU9InRpbWUtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9InRpbWVFeGFtcGxlIj4KICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgPHNjcmlwdD4KICAgICAgYW5ndWxhci5tb2R1bGUoJ3RpbWVFeGFtcGxlJywgW10pCiAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICRzY29wZS52YWx1ZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIDE0LCA1NywgMCk7CiAgICAgICAgfV0pOwogICAgIDwvc2NyaXB0PgogICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmwiPgogICAgICAgIFBpY2sgYSBiZXR3ZWVuIDhhbSBhbmQgNXBtOgogICAgICAgIDxpbnB1dCB0eXBlPSJ0aW1lIiBpZD0iZXhhbXBsZUlucHV0IiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIgogICAgICAgICAgICBwbGFjZWhvbGRlcj0iSEg6bW06c3MiIG1pbj0iMDg6MDA6MDAiIG1heD0iMTc6MDA6MDAiIHJlcXVpcmVkIC8+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci50aW1lIj4KICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+CiAgICAgICAgPHR0PnZhbHVlID0ge3t2YWx1ZSB8IGRhdGU6ICJISDptbTpzcyJ9fTwvdHQ+PGJyLz4KICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPgogICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CiAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+CiAgICAgPC9mb3JtPgogICA8L2ZpbGU+CiAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICB2YXIgdmFsdWUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlIHwgZGF0ZTogIkhIOm1tOnNzIicpKTsKICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOwogICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsKCiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CiAgICAgIC8vIHNlbmRpbmcga2V5cyB0byBhbGwga25vd24gSFRNTDUgaW5wdXQgY29udHJvbHMKICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuCiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgewogICAgICAgIC8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYW5kIGZvcmNlIHZhbGlkYXRpb24uCiAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsKICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsKICAgICAgICAiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnIiArIHZhbCArICInKTsgfSk7IjsKICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsKICAgICAgfQoKICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7CiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcxNDo1NzowMCcpOwogICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTsKICAgICAgfSk7CgogICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsKICAgICAgICBzZXRJbnB1dCgnJyk7CiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOwogICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7CiAgICAgIH0pOwoKICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0SW5wdXQoJzIzOjU5OjAwJyk7CiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcnKTsKICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOwogICAgICB9KTsKICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAgICovCiAgJ3RpbWUnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCd0aW1lJywgVElNRV9SRUdFWFAsCiAgICAgIGNyZWF0ZURhdGVQYXJzZXIoVElNRV9SRUdFWFAsIFsnSEgnLCAnbW0nLCAnc3MnLCAnc3NzJ10pLAogICAgICdISDptbTpzcy5zc3MnKSwKCiAgIC8qKgogICAgKiBAbmdkb2MgaW5wdXQKICAgICogQG5hbWUgaW5wdXRbd2Vla10KICAgICoKICAgICogQGRlc2NyaXB0aW9uCiAgICAqIElucHV0IHdpdGggd2Vlay1vZi10aGUteWVhciB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiB0byBEYXRlLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydAogICAgKiB0aGUgSFRNTDUgd2VlayBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxCiAgICAqIHdlZWsgZm9ybWF0ICh5eXl5LVcjIyksIGZvciBleGFtcGxlOiBgMjAxMy1XMDJgLgogICAgKgogICAgKiBUaGUgbW9kZWwgbXVzdCBhbHdheXMgYmUgYSBEYXRlIG9iamVjdCwgb3RoZXJ3aXNlIEFuZ3VsYXIgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgogICAgKgogICAgKiBUaGUgdGltZXpvbmUgdG8gYmUgdXNlZCB0byByZWFkL3dyaXRlIHRoZSBgRGF0ZWAgaW5zdGFuY2UgaW4gdGhlIG1vZGVsIGNhbiBiZSBkZWZpbmVkIHVzaW5nCiAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci4KICAgICoKICAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLgogICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuCiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC4gVGhpcyBtdXN0IGJlIGEKICAgICogdmFsaWQgSVNPIHdlZWsgZm9ybWF0ICh5eXl5LVcjIykuCiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YC4gVGhpcyBtdXN0IGJlCiAgICAqIGEgdmFsaWQgSVNPIHdlZWsgZm9ybWF0ICh5eXl5LVcjIykuCiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4KICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCiAgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCiAgICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLgogICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIKICAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4KICAgICoKICAgICogQGV4YW1wbGUKICAgIDxleGFtcGxlIG5hbWU9IndlZWstaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9IndlZWtFeGFtcGxlIj4KICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8c2NyaXB0PgogICAgICBhbmd1bGFyLm1vZHVsZSgnd2Vla0V4YW1wbGUnLCBbXSkKICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgJHNjb3BlLnZhbHVlID0gbmV3IERhdGUoMjAxMywgMCwgMyk7CiAgICAgICAgfV0pOwogICAgICA8L3NjcmlwdD4KICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybCI+CiAgICAgICAgUGljayBhIGRhdGUgYmV0d2VlbiBpbiAyMDEzOgogICAgICAgIDxpbnB1dCBpZD0iZXhhbXBsZUlucHV0IiB0eXBlPSJ3ZWVrIiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIgogICAgICAgICAgICBwbGFjZWhvbGRlcj0iWVlZWS1XIyMiIG1pbj0iMjAxMi1XMzIiIG1heD0iMjAxMy1XNTIiIHJlcXVpcmVkIC8+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci53ZWVrIj4KICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+CiAgICAgICAgPHR0PnZhbHVlID0ge3t2YWx1ZSB8IGRhdGU6ICJ5eXl5LVd3dyJ9fTwvdHQ+PGJyLz4KICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPgogICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CiAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+CiAgICAgIDwvZm9ybT4KICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICB2YXIgdmFsdWUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlIHwgZGF0ZTogInl5eXktV3d3IicpKTsKICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOwogICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsKCiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CiAgICAgIC8vIHNlbmRpbmcga2V5cyB0byBhbGwga25vd24gSFRNTDUgaW5wdXQgY29udHJvbHMKICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuCiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgewogICAgICAgIC8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYW5kIGZvcmNlIHZhbGlkYXRpb24uCiAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsKICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsKICAgICAgICAiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnIiArIHZhbCArICInKTsgfSk7IjsKICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsKICAgICAgfQoKICCM3O9WUYkCAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/81E9AAEAGtsXAqAdgwKgHNh/1lSJBvHT4WHp804AYAVOv1QAAAQEICgBNpcoAo17OICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy1XMDEnKTsKICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7CiAgICAgIH0pOwoKICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0SW5wdXQoJycpOwogICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsKICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOwogICAgICB9KTsKCiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkgewogICAgICAgIHNldElucHV0KCcyMDE1LVcwMScpOwogICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7CiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKICAgICAgfSk7CiAgICA8L2ZpbGU+CiAgICA8L2V4YW1wbGU+CiAgICAqLwogICd3ZWVrJzogY3JlYXRlRGF0ZUlucHV0VHlwZSgnd2VlaycsIFdFRUtfUkVHRVhQLCB3ZWVrUGFyc2VyLCAneXl5eS1Xd3cnKSwKCiAgLyoqCiAgICogQG5nZG9jIGlucHV0CiAgICogQG5hbWUgaW5wdXRbbW9udGhdCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBJbnB1dCB3aXRoIG1vbnRoIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydAogICAqIHRoZSBIVE1MNSBtb250aCBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxCiAgICogbW9udGggZm9ybWF0ICh5eXl5LU1NKSwgZm9yIGV4YW1wbGU6IGAyMDA5LTAxYC4KICAgKgogICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLgogICAqIEludmFsaWQgYERhdGVgIG9iamVjdHMgKGRhdGVzIHdob3NlIGBnZXRUaW1lKClgIGlzIGBOYU5gKSB3aWxsIGJlIHJlbmRlcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KICAgKiBJZiB0aGUgbW9kZWwgaXMgbm90IHNldCB0byB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLCB0aGUgbmV4dCB2aWV3IHRvIG1vZGVsIHVwZGF0ZSB3aWxsIHNldCBpdAogICAqIHRvIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguCiAgICoKICAgKiBUaGUgdGltZXpvbmUgdG8gYmUgdXNlZCB0byByZWFkL3dyaXRlIHRoZSBgRGF0ZWAgaW5zdGFuY2UgaW4gdGhlIG1vZGVsIGNhbiBiZSBkZWZpbmVkIHVzaW5nCiAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuIFRoaXMgbXVzdCBiZQogICAqIGEgdmFsaWQgSVNPIG1vbnRoIGZvcm1hdCAoeXl5eS1NTSkuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLiBUaGlzIG11c3QKICAgKiBiZSBhIHZhbGlkIElTTyBtb250aCBmb3JtYXQgKHl5eXktTU0pLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4KICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8KICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgogICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgogICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCiAgICoKICAgKiBAZXhhbXBsZQogICA8ZXhhbXBsZSBuYW1lPSJtb250aC1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0ibW9udGhFeGFtcGxlIj4KICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgPHNjcmlwdD4KICAgICAgYW5ndWxhci5tb2R1bGUoJ21vbnRoRXhhbXBsZScsIFtdKQogICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAkc2NvcGUudmFsdWUgPSBuZXcgRGF0ZSgyMDEzLCA5LCAxKTsKICAgICAgICB9XSk7CiAgICAgPC9zY3JpcHQ+CiAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybCI+CiAgICAgICBQaWNrIGEgbW9udGggaW50IDIwMTM6CiAgICAgICA8aW5wdXQgaWQ9ImV4YW1wbGVJbnB1dCIgdHlwZT0ibW9udGgiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idmFsdWUiCiAgICAgICAgICBwbGFjZWhvbGRlcj0ieXl5eS1NTSIgbWluPSIyMDEzLTAxIiBtYXg9IjIwMTMtMTIiIHJlcXVpcmVkIC8+CiAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgogICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPgogICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLm1vbnRoIj4KICAgICAgICAgIE5vdCBhIHZhbGlkIG1vbnRoITwvc3Bhbj4KICAgICAgIDx0dD52YWx1ZSA9IHt7dmFsdWUgfCBkYXRlOiAieXl5eS1NTSJ9fTwvdHQ+PGJyLz4KICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CiAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgogICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KICAgICA8L2Zvcm0+CiAgIDwvZmlsZT4KICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUgfCBkYXRlOiAieXl5eS1NTSInKSk7CiAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSk7CgogICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAogICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzCiAgICAgIC8vIGZvciB2YXJpb3VzIGJyb3dzZXJzIChodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy81NjIpLgogICAgICBmdW5jdGlvbiBzZXRJbnB1dCh2YWwpIHsKICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLgogICAgICAgIHZhciBzY3IgPSAidmFyIGlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlSW5wdXQnKTsgIiArCiAgICAgICAgImlwdC52YWx1ZSA9ICciICsgdmFsICsgIic7IiArCiAgICAgICAgImFuZ3VsYXIuZWxlbWVudChpcHQpLnNjb3BlKCkuJGFwcGx5KGZ1bmN0aW9uKHMpIHsgcy5teUZvcm1baXB0Lm5hbWVdLiRzZXRWaWV3VmFsdWUoJyIgKyB2YWwgKyAiJyk7IH0pOyI7CiAgICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcik7CiAgICAgIH0KCiAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy0xMCcpOwogICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTsKICAgICAgfSk7CgogICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsKICAgICAgICBzZXRJbnB1dCgnJyk7CiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOwogICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7CiAgICAgIH0pOwoKICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0SW5wdXQoJzIwMTUtMDEnKTsKICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpOwogICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7CiAgICAgIH0pOwogICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICAgKi8KICAnbW9udGgnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCdtb250aCcsIE1PTlRIX1JFR0VYUCwKICAgICBjcmVhdGVEYXRlUGFyc2VyKE1PTlRIX1JFR0VYUCwgWyd5eXl5JywgJ01NJ10pLAogICAgICd5eXl5LU1NJyksCgogIC8qKgogICAqIEBuZ2RvYyBpbnB1dAogICAqIEBuYW1lIGlucHV0W251bWJlcl0KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFRleHQgaW5wdXQgd2l0aCBudW1iZXIgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIFNldHMgdGhlIGBudW1iZXJgIHZhbGlkYXRpb24KICAgKiBlcnJvciBpZiBub3QgYSB2YWxpZCBudW1iZXIuCiAgICoKICAgKiBUaGUgbW9kZWwgbXVzdCBhbHdheXMgYmUgYSBudW1iZXIsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC4KICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuCiAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bwogICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCiAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuCiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4KICAgKiAgICBtaW5sZW5ndGguCiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01heGxlbmd0aCBTZXRzIGBtYXhsZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBsb25nZXIgdGhhbgogICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZgogICAqICAgIGFueSBsZW5ndGguCiAgICogQHBhcmFtIHtzdHJpbmc9fSBwYXR0ZXJuIFNpbWlsYXIgdG8gYG5nUGF0dGVybmAgZXhjZXB0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZwogICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24KICAgKiAgICBhcyBpbiB0aGUgbmdQYXR0ZXJuIGRpcmVjdGl2ZS4KICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgbmdNb2RlbCB2YWx1ZSBkb2VzIG5vdCBtYXRjaAogICAqICAgIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLgogICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuCiAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gaXMgYSBzdHJpbmcgdGhlbiBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFJlZ0V4cCBhZnRlciB3cmFwcGluZyBpdCBpbiBgXmAgYW5kIGAkYAogICAqICAgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYCJhYmMiYCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4KICAgKgogICAqIEBleGFtcGxlCiAgICAgIDxleGFtcGxlIG5hbWU9Im51bWJlci1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0ibnVtYmVyRXhhbXBsZSI+CiAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ251bWJlckV4YW1wbGUnLCBbXSkKICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgICAgICRzY29wZS52YWx1ZSA9IDEyOwogICAgICAgICAgICAgfV0pOwogICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgICAgTnVtYmVyOiA8aW5wdXQgdHlwZT0ibnVtYmVyIiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj0iMCIgbWF4PSI5OSIgcmVxdWlyZWQ+CiAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3Iubg0KjNzvVlGJAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxKQABABm6TwKgHNsCoB2CVIh/1WHp800G8lMCAEAvwdHsAAAEBCAoAo17OAE2lyozc71bakgIAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzUVUAAQAZ2X8CoB2DAqAc2H/WVIkG8lMBYenzTgBABU/A1AAABAQgKAE2lygCjXs43RkU4DQp1bWJlciI+CiAgICAgICAgICAgICBOb3QgdmFsaWQgbnVtYmVyITwvc3Bhbj4KICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlfX08L3R0Pjxici8+CiAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgogICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CiAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPgogICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZmlsZT4KICAgICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUnKSk7CiAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7CiAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsKCiAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcxMicpOwogICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpbnB1dC5jbGVhcigpOwogICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7CiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsKICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgICAgfSk7CgogICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7CiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcxMjMnKTsKICAgICAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOwogICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CiAgICAgICAgICB9KTsKICAgICAgICA8L2ZpbGU+CiAgICAgIDwvZXhhbXBsZT4KICAgKi8KICAnbnVtYmVyJzogbnVtYmVySW5wdXRUeXBlLAoKCiAgLyoqCiAgICogQG5nZG9jIGlucHV0CiAgICogQG5hbWUgaW5wdXRbdXJsXQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogVGV4dCBpbnB1dCB3aXRoIFVSTCB2YWxpZGF0aW9uLiBTZXRzIHRoZSBgdXJsYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgY29udGVudCBpcyBub3QgYQogICAqIHZhbGlkIFVSTC4KICAgKgogICAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgogICAqICoqTm90ZToqKiBgaW5wdXRbdXJsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIHVybHMgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlZ2V4CiAgICogdXNlZCBpbiBDaHJvbWl1bS4gSWYgeW91IG5lZWQgc3RyaWN0ZXIgdmFsaWRhdGlvbiwgeW91IGNhbiB1c2UgYG5nLXBhdHRlcm5gIG9yIG1vZGlmeQogICAqIHRoZSBidWlsdC1pbiB2YWxpZGF0b3JzIChzZWUgdGhlIHtAbGluayBndWlkZS9mb3JtcyBGb3JtcyBndWlkZX0pCiAgICogPC9kaXY+CiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4KICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8KICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgogICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLgogICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuCiAgICogICAgbWlubGVuZ3RoLgogICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW4KICAgKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2YKICAgKiAgICBhbnkgbGVuZ3RoLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gcGF0dGVybiBTaW1pbGFyIHRvIGBuZ1BhdHRlcm5gIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcKICAgKiAgICB0aGF0IGNvbnRhaW5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYm9keSB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgcmVndWxhciBleHByZXNzaW9uCiAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIG5nTW9kZWwgdmFsdWUgZG9lcyBub3QgbWF0Y2gKICAgKiAgICBhIFJlZ0V4cCBmb3VuZCBieSBldmFsdWF0aW5nIHRoZSBBbmd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBSZWdFeHAgb2JqZWN0IHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LgogICAqICAgIElmIHRoZSBleHByZXNzaW9uIGlzIGEgc3RyaW5nIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGAKICAgKiAgICBjaGFyYWN0ZXJzLiBGb3IgaW5zdGFuY2UsIGAiYWJjImAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYG5ldyBSZWdFeHAoJ15hYmMkJylgLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgogICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCiAgICoKICAgKiBAZXhhbXBsZQogICAgICA8ZXhhbXBsZSBuYW1lPSJ1cmwtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9InVybEV4YW1wbGUiPgogICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgICA8c2NyaXB0PgogICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCd1cmxFeGFtcGxlJywgW10pCiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgICAkc2NvcGUudGV4dCA9ICdodHRwOi8vZ29vZ2xlLmNvbSc7CiAgICAgICAgICAgICB9XSk7CiAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgICBVUkw6IDxpbnB1dCB0eXBlPSJ1cmwiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idGV4dCIgcmVxdWlyZWQ+CiAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IudXJsIj4KICAgICAgICAgICAgIE5vdCB2YWxpZCB1cmwhPC9zcGFuPgogICAgICAgICAgIDx0dD50ZXh0ID0ge3t0ZXh0fX08L3R0Pjxici8+CiAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgogICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CiAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPgogICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnVybCA9IHt7ISFteUZvcm0uJGVycm9yLnVybH19PC90dD48YnIvPgogICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZmlsZT4KICAgICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgICAgIHZhciB0ZXh0ID0gZWxlbWVudChieS5iaW5kaW5nKCd0ZXh0JykpOwogICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOwogICAgICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndGV4dCcpKTsKCiAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZXhwZWN0KHRleHQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2h0dHA6Ly9nb29nbGUuY29tJyk7CiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOwogICAgICAgICAgfSk7CgogICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7CiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcnKTsKCiAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9FcXVhbCgndGV4dCA9Jyk7CiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBub3QgdXJsJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7CiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCdib3gnKTsKCiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKICAgICAgICAgIH0pOwogICAgICAgIDwvZmlsZT4KICAgICAgPC9leGFtcGxlPgogICAqLwogICd1cmwnOiB1cmxJbnB1dFR5cGUsCgoKICAvKioKICAgKiBAbmdkb2MgaW5wdXQKICAgKiBAbmFtZSBpbnB1dFtlbWFpbF0KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFRleHQgaW5wdXQgd2l0aCBlbWFpbCB2YWxpZGF0aW9uLiBTZXRzIHRoZSBgZW1haWxgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIG5vdCBhIHZhbGlkIGVtYWlsCiAgICogYWRkcmVzcy4KICAgKgogICAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgogICAqICoqTm90ZToqKiBgaW5wdXRbZW1haWxdYCB1c2VzIGEgcmVnZXggdG8gdmFsaWRhdGUgZW1haWwgYWRkcmVzc2VzIHRoYXQgaXMgZGVyaXZlZCBmcm9tIHRoZSByZWdleAogICAqIHVzZWQgaW4gQ2hyb21pdW0uIElmIHlvdSBuZWVkIHN0cmljdGVyIHZhbGlkYXRpb24gKGUuZy4gcmVxdWlyaW5nIGEgdG9wLWxldmVsIGRvbWFpbiksIHlvdSBjYW4KICAgKiB1c2UgYG5nLXBhdHRlcm5gIG9yIG1vZGlmeSB0aGUgYnVpbHQtaW4gdmFsaWRhdG9ycyAoc2VlIHRoZSB7QGxpbmsgZ3VpZGUvZm9ybXMgRm9ybXMgZ3VpZGV9KQogICAqIDwvZGl2PgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCiAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YKICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhbgogICAqICAgIG1pbmxlbmd0aC4KICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuCiAgICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mCiAgICogICAgYW55IGxlbmd0aC4KICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nCiAgICogICAgdGhhdCBjb250YWlucyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJvZHkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAqICAgIGFzIGluIHRoZSBuZ1BhdHRlcm4gZGlyZWN0aXZlLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHZhbHVlIGRvZXMgbm90IG1hdGNoCiAgICogICAgYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCiAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCB0aGVuIHRoaXMgaXMgdXNlZCBkaXJlY3RseS4KICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIHN0cmluZyB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgCiAgICogICAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgImFiYyJgIHdpbGwgYmUgY29udmVydGVkIHRvIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC4KICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIKICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgogICAqCiAgICogQGV4YW1wbGUKICAgICAgPGV4YW1wbGUgbmFtZT0iZW1haWwtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImVtYWlsRXhhbXBsZSI+CiAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2VtYWlsRXhhbXBsZScsIFtdKQogICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnbWVAZXhhbXBsZS5jb20nOwogICAgICAgICAgICAgfV0pOwogICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgICAgIEVtYWlsOiA8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idGV4dCIgcmVxdWlyZWQ+CiAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgogICAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+CiAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IuZW1haWwiPgogICAgICAgICAgICAgICBOb3QgdmFsaWQgZW1haWwhPC9zcGFuPgogICAgICAgICAgICAgPHR0PnRleHQgPSB7e3RleHR9fTwvdHQ+PGJyLz4KICAgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CiAgICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgogICAgICAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4KICAgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KICAgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLmVtYWlsID0ge3shIW15Rm9ybS4kZXJyb3IuZW1haWx9fTwvdHQ+PGJyLz4KICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgIDwvZmlsZT4KICAgICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgICAgIHZhciB0ZXh0ID0gZWxlbWVudChieS5iaW5kaW5nKCd0ZXh0JykpOwogICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOwogICAgICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndGV4dCcpKTsKCiAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZXhwZWN0KHRleHQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ21lQGV4YW1wbGUuY29tJyk7CiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOwogICAgICAgICAgfSk7CgogICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7CiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcnKTsKICAgICAgICAgICAgZXhwZWN0KHRleHQuZ2V0VGV4dCgpKS50b0VxdWFsKCd0ZXh0ID0nKTsKICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgICAgfSk7CgogICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCBlbWFpbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpbnB1dC5jbGVhcigpOwogICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygneHh4Jyk7CgogICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CiAgICAgICAgICB9KTsKICAgICAgICA8L2ZpbGU+CiAgICAgIDwvZXhhbXBsZT4KICAgKi8KICAnZW1haWwnOiBlbWFpbElucHV0VHlwZSwKCgogIC8qKgogICAqIEBuZ2RvYyBpbnB1dAogICAqIEBuYW1lIGlucHV0W3JhZGlvXQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogSFRNTCByYWRpbyBidXR0b24uCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgc2V0IHdoZW4gc2VsZWN0ZWQuCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgogICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCiAgICogQHBhcmFtIHtzdHJpbmd9IG5nVmFsdWUgQW5ndWxhciBleHByZXNzaW9uIHdoaWNoIHNldHMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHNob3VsZAogICAqICAgIGJlIHNldCB3aGVuIHNlbGVjdGVkLgogICAqCiAgICogQGV4YW1wbGUKICAgICAgPGV4YW1wbGUgbmFtZT0icmFkaW8taW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9InJhZGlvRXhhbXBsZSI+CiAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3JhZGlvRXhhbXBsZScsIFtdKQogICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICAgICAgJHNjb3BlLmNvbG9yID0gJ2JsdWUnOwogICAgICAgICAgICAgICAkc2NvcGUuc3BlY2lhbFZhbHVlID0gewogICAgICAgICAgICAgICAgICJpZCI6ICIxMjM0NSIsCiAgICAgICAgICAgICAgICAgInZhbHVlIjogImdyZWVuIgogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfV0pOwogICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuZy1tb2RlbD0iY29sb3IiIHZhbHVlPSJyZWQiPiAgUmVkIDxici8+CiAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuZy1tb2RlbD0iY29sb3IiIG5nLXZhbHVlPSJzcGVjaWFsVmFsdWUiPiBHcmVlbiA8YnIvPgogICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmctbW9kZWw9ImNvbG9yIiB2YWx1ZT0iYmx1ZSI+IEJsdWUgPGJyLz4KICAgICAgICAgICA8dHQ+Y29sb3IgPSB7e2NvbG9yIHwganNvbn19PC90dD48YnIvPgogICAgICAgICAgPC9mb3JtPgogICAgICAgICAgTm90ZSB0aGF0IGBuZy12YWx1ZT0ic3BlY2lhbFZhbHVlImAgc2V0cyByYWRpbyBpdGVtJ3MgdmFsdWUgdG8gYmUgdGhlIHZhbHVlIG9mIGAkc2NvcGUuc3BlY2lhbFZhbHVlYC4KICAgICAgICA8L2ZpbGU+CiAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgICBpdCgnc2hvdWxkIGNoYW5nZSBzdGF0ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY29sb3IgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2NvbG9yJykpOwoKICAgICAgICAgICAgZXhwZWN0KGNvbG9yLmdldFRleHQoKSkudG9Db250YWluKCdibHVlJyk7CgogICAgICAgICAgICBlbGVtZW50LmFsbChieS5tb2RlbCgnY29sb3InKSkuZ2V0KDApLmNsaWNrKCk7CgogICAgICAgICAgICBleHBlY3QoY29sb3IuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3JlZCcpOwogICAgICAgICAgfSk7CiAgICAgICAgPC9maWxlPgogICAgICA8L2V4YW1wbGU+CiAgICovCiAgJ3JhZGlvJzogcmFkaW9JbnB1dFR5cGUsCgoKICAvKioKICAgKiBAbmdkb2MgaW5wdXQKICAgKiBAbmFtZSBpbnB1dFtjaGVja2JveF0KICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIEhUTUwgY2hlY2tib3guCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgogICAqIEBwYXJhbSB7ZXhwcmVzc2lvbj19IG5nVHJ1ZVZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgc2V0IHdoZW4gc2VsZWN0ZWQuCiAgICogQHBhcmFtIHtleHByZXNzaW9uPX0gbmdGYWxzZVZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgc2V0IHdoZW4gbm90IHNlbGVjdGVkLgogICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgogICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCiAgICoKICAgKiBAZXhhbXBsZQogICAgICA8ZXhhbXBsZSBuYW1lPSJjaGVja2JveC1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0iY2hlY2tib3hFeGFtcGxlIj4KICAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnY2hlY2tib3hFeGFtcGxlJywgW10pCiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgICAkc2NvcGUudmFsdWUxID0gdHJ1ZTsKICAgICAgICAgICAgICAgJHNjb3BlLnZhbHVlMiA9ICdZRVMnCiAgICAgICAgICAgICB9XSk7CiAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgICBWYWx1ZTE6IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9InZhbHVlMSI+IDxici8+CiAgICAgICAgICAgVmFsdWUyOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJ2YWx1ZTIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmctdHJ1ZS12YWx1ZT0iJ1lFUyciIG5nLWZhbHNlLXZhbHVlPSInTk8nIj4gPGJyLz4KICAgICAgICAgICA8dHQ+dmFsdWUxID0ge3t2YWx1ZTF9fTwvdHQ+PGJyLz4KICAgICAgICAgICA8dHQ+dmFsdWUyID0ge3t2YWx1ZTJ9fTwvdHQ+PGJyLz4KICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2ZpbGU+CiAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgICBpdCgnc2hvdWxkIGNoYW5nZSBzdGF0ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdmFsdWUxID0gZWxlbWVudChieS5iaW5kaW5nKCd2YWx1ZTEnKSk7CiAgICAgICAgICAgIHZhciB2YWx1ZTIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlMicpKTsKCiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZTEuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsKICAgICAgICAgICAgZXhwZWN0KHZhbHVlMi5nZXRUZXh0KCkpLnRvQ29udGFpbignWUVTJyk7CgogICAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZTEnKSkuY2xpY2soKTsKICAgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUyJykpLmNsaWNrKCk7CgogICAgICAgICAgICBleHBlY3QodmFsdWUxLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgICAgICBleHBlY3QodmFsdWUyLmdldFRleHQoKSkudG9Db250YWluKCdOTycpOwogICAgICAgICAgfSk7CiAgICAgICAgPC9maWxlPgogICAgICA8L2V4YW1wbGU+CiAgICovCiAgJ2NoZWNrYm94JzogY2hlY2tib3hJbnB1dFR5cGUsCgogICdoaWRkZW4nOiBub29wLAogICdidXR0b24nOiBub29wLAogICdzdWJtaXQnOiBub29wLAogICdyZXNldCc6IG5vb3AsCiAgJ2ZpbGUnOiBub29wCn07CgpmdW5jdGlvbiBzdHJpbmdCYXNlZElucHV0VHlwZShjdHJsKSB7CiAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHRleHRJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3NlcikgewogIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7CiAgc3RyaW5nQmFzZWRJbnB1dFR5cGUoY3RybCk7Cn0KCmZ1bmN0aW9uIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3NlcikgewogIHZhciBwbGFjZWhvbGRlciA9IGVsZW1lbnRbMF0ucGxhY2Vob2xkZXIsIG5vZXZlbnQgPSB7fTsKICB2YXIgdHlwZSA9IGxvd2VyY2FzZShlbGVtZW50WzBdLnR5cGUpOwoKICAvLyBJbiBjb21wb3NpdGlvbiBtb2RlLCB1c2VycyBhcmUgc3RpbGwgaW5wdXRpbmcgaW50ZXJtZWRpYXRlIHRleHQgYnVmZmVyLAogIC8vIGhvbGQgdGhlIGxpc3RlbmVyIHVudGlsIGNvbXBvc2l0aW9uIGlzIGRvbmUuCiAgLy8gTW9yZSBhYm91dCBjb21wb3NpdGlvbiBldmVudHM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Db21wb3NpdGlvbkV2ZW50CiAgaWYgKCEkc25pZmZlci5hbmRyb2lkKSB7CiAgICB2YXIgY29tcG9zaW5nID0gZmFsc2U7CgogICAgZWxlbWVudC5vbignY29tcG9zaXRpb25zdGFydCcsIGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgY29tcG9zaW5nID0gdHJ1ZTsKICAgIH0pOwoKICAgIGVsZW1lbnQub24oJ2NvbXBvc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7CiAgICAgIGNvbXBvc2luZyA9IGZhbHNlOwogICAgICBsaXN0ZW5lcigpOwogICAgfSk7CiAgfQoKICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldikgewogICAgaWYgKGNvbXBvc2luZykgcmV0dXJuOwogICAgdmFyIHZhbHVlID0gZWxlbWVudC52YWwoKSwKICAgICAgICBldmVudCA9IGV2ICYmIGV2LnR5cGU7CgogICAgLy8gSUUgKDExIGFuZCB1bmRlcikgc2VlbSB0byBlbWl0IGFuICdpbnB1dCcgZXZlbnQgaWYgdGhlIHBsYWNlaG9sZGVyIHZhbHVlIGNoYW5nZXMuCiAgICAvLyBXZSBkb24ndCB3YW50IHRvIGRpcnR5IHRoZSB2YWx1ZSB3aGVuIHRoaXMgaGFwcGVucywgc28gd2UgYWJvcnQgaGVyZS4gVW5mb3J0dW5hdGVseSwKICAgIC8vIElFIGFsc28gc2VuZHMgaW5wdXQgZXZlbnRzIGZvciBvdGhlciBub24taW5wdXQtcmVsYXRlZCB0aGluZ3MsIChzdWNoIGFzIGZvY3VzaW5nIG9uIGEKICAgIC8vIGZvcm0gY29udHJvbCksIHNvIHRoaXMgY2hhbmdlIGlzIG5vdCBlbnRpcmVseSBlbm91Z2ggdG8gc29sdmUgdGhpcy4KICAgIGlmIChtc2llICYmIChldiB8fCBub2V2ZW50KS50eXBlID09PSAnaW5wdXQnICYmIGVsZW1lbnRbMF0ucGxhY2Vob2xkZXIgIT09IHBsYWNlaG9sZGVyKSB7CiAgICAgIHBsYWNlaG9sZGVyID0gZWxlbWVudFswXS5wbGFjZWhvbGRlcjsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEJ5IGRlZmF1bHQgd2Ugd2lsbCB0cmltIHRoZSB2YWx1ZQogICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBuZy10cmltIGV4aXN0cyB3ZSB3aWxsIGF2b2lkIHRyaW1taW5nCiAgICAvLyBJZiBpbnB1dCB0eXBlIGlzICdwYXNzd29yZCcsIHRoZSB2YWx1ZSBpcyBuZXZlciB0cmltbWVkCiAgICBpZiAodHlwZSAhPT0gJ3Bhc3N3b3JkJyAmJiAoIWF0dHIubmdUcmltIHx8IGF0dHIubmdUcmltICE9PSAnZmFsc2UnKSkgewogICAgICB2YWx1ZSA9IHRyaW0odmFsdWUpOwogICAgfQoKICAgIC8vIElmIGEgY29udHJvbCBpcyBzdWZmZXJpbmcgZnJvbSBiYWQgaW5wdXQgKGR1ZSB0byBuYXRpdmUgdmFsaWRhdG9ycyksIGJyb3dzZXJzIGRpc2NhcmQgaXRzCiAgICAvLyB2YWx1ZSwgc28gaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZXZhbGlkYXRlIChieSBjYWxsaW5nICRzZXRWaWV3VmFsdWUgYWdhaW4pIGV2ZW4gaWYgdGhlCiAgICAvLyBjb250cm9sJ3MgdmFsdWUgaXMgdGhlIHNhbWUgZW1wdHkgdmFsdWUgdHdpY2UgaW4gYSByb3cuCiAgICBpZiAoY3RybC4kdmlld1ZhbHVlICE9PSB2YWx1ZSB8fCAodmFsdWUgPT09ICcnICYmIGN0cmwuJCRoYXNOYXRpdmVWYWxpZGF0b3JzKSkgewogICAgICBjdHJsLiRzZXRWaWV3VmFsdWUodmFsdWUsIGV2ZW50KTsKICAgIH0KICB9OwoKICAvLyBpZiB0aGUgYnJvd3NlciBkb2VzIHN1cHBvcnQgImlucHV0IiBldmVudCwgd2UgYXJlIGZpbmUgLSBleGNlcHQgb24gSUU5IHdoaWNoIGRvZXNuJ3QgZmlyZSB0aGUKICAvLyBpbnB1dCBldmVudCBvbiBiYWNrc3BhY2UsIGRlbGV0ZSBvciBjdXQKICBpZiAoJHNuaWZmZXIuaGFzRXZlbnQoJ2lucHV0JykpIHsKICAgIGVsZW1lbnQub24oJ2lucHV0JywgbGlzdGVuZXIpOwogIH0gZWxzZSB7CiAgICB2YXIgdGltZW91dDsKCiAgICB2YXIgZGVmZXJMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGlmICghdGltZW91dCkgewogICAgICAgIHRpbWVvdXQgPSAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHsKICAgICAgICAgIGxpc3RlbmVyKGV2KTsKICAgICAgICAgIHRpbWVvdXQgPSBudWxsOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwoKICAgIGVsZW1lbnQub24oJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkgewogICAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZTsKCiAgICAgIC8vIGlnbm9yZQogICAgICAvLyAgICBjb21tYW5kICAgICAgICAgICAgbW9kaWZpZXJzICAgICAgICAgICAgICAgICAgIGFycm93cwogICAgICBpZiAoa2V5ID09PSA5MSB8fCAoMTUgPCBrZXkgJiYga2V5IDwgMTkpIHx8ICgzNyA8PSBrZXkgJiYga2V5IDw9IDQwKSkgcmV0dXJuOwoKICAgICAgZGVmZXJMaXN0ZW5lcihldmVudCk7CiAgICB9KTsKCiAgICAvLyBpZiB1c2VyIG1vZGlmaWVzIGlucHV0IHZhbHVlIHVzaW5nIGNvbnRleHQgbWVudSBpbiBJRSwgd2UgbmVlZCAicGFzdGUiIGFuZCAiY3V0IiBldmVudHMgdG8gY2F0Y2ggaXQKICAgIGlmICgkc25pZmZlci5oYXNFdmVudCgncGFzdGUnKSkgewogICAgICBlbGVtZW50Lm9uKCdwYXN0ZSBjdXQnLCBkZWZlckxpc3RlbmVyKTsKICAgIH0KICB9CgogIC8vIGlmIHVzZXIgcGFzdGUgaW50byBpbnB1dCB1c2luZyBtb3VzZSBvbiBvbGRlciBicm93c2VyCiAgLy8gb3IgZm9ybSBhdXRvY29tcGxldGUgb24gbmV3ZXIgYnJvd3Nlciwgd2UgbmVlZCAiY2hhbmdlIiBldmVudCB0byBjYXRjaCBpdAogIGVsZW1lbnQub24oJ2NoYW5nZScsIGxpc3RlbmVyKTsKCiAgY3RybC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICBlbGVtZW50LnZhbChjdHJsLiRpc0VtcHR5KGN0cmwuJHZpZXdWYWx1ZSkgPyAnJyA6IGN0cmwuJHZpZXdWYWx1ZSk7CiAgfTsKfQoKZnVuY3Rpb24gd2Vla1BhcnNlcihpc29XZWVrLCBleGlzdGluZ0RhdGUpIHsKICBpZiAoaXNEYXRlKGlzb1dlZWspKSB7CiAgICByZXR1cm4gaXNvV2VlazsKICB9CgogIGlmIChpc1N0cmluZyhpc29XZWVrKSkgewogICAgV0VFS19SRUdFWFAubGFzdEluZGV4ID0gMDsKICAgIHZhciBwYXJ0cyA9IFdFRUtfUkVHRVhQLmV4ZWMoaXNvV2Vlayk7CiAgICBpZiAocGFydHMpIHsKICAgICAgdmFyIHllYXIgPSArcGFydHNbMV0sCiAgICAgICAgICB3ZWVrID0gK3BhcnRzWzJdLAogICAgICAgICAgaG91cnMgPSAwLAogICAgICAgICAgbWludXRlcyA9IDAsCiAgICAgICAgICBzZWNvbmRzID0gMCwKICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IDAsCiAgICAgICAgICBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSwKICAgICAgICAgIGFkZERheXMgPSAod2VlayAtIDEpICogNzsKCiAgICAgIGlmIChleGlzdGluZ0RhdGUpIHsKICAgICAgICBob3VycyA9IGV4aXN0aW5nRGF0ZS5nZXRIb3VycygpOwogICAgICAgIG1pbnV0ZXMgPSBleGlzdGluZ0RhdGUuZ2V0TWludXRlcygpOwogICAgICAgIHNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0U2Vjb25kcygpOwogICAgICAgIG1pbGxpc2Vjb25kcyA9IGV4aXN0aW5nRGF0ZS5nZXRNaWxsaXNlY29uZHMoKTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIDAsIGZpcnN0VGh1cnMuZ2V0RGF0ZSgpICsgYWRkRGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcyk7CiAgICB9CiAgfQoKICByZXR1cm4gTmFOOwp9CgpmdW5jdGlvbiBjcmVhdGVEYXRlUGFyc2VyKHJlZ2V4cCwgbWFwcGluZykgewogIHJldHVybiBmdW5jdGlvbihpc28sIGRhdGUpIHsKICAgIHZhciBwYXJ0cywgbWFwOwoKICAgIGlmIChpc0RhdGUoaXNvKSkgewogICAgICByZXR1cm4gaXNvOwogICAgfQoKICAgIGlmIChpc1N0cmluZyhpc28pKSB7CiAgICAgIC8vIFdoZW4gYSBkYXRlIGlzIEpTT04naWZpZWQgdG8gd3JhcHMgaXRzZWxmIGluc2lkZSBvZiBhbiBleHRyYQogICAgICAvLyBzZXQgb2YgZG91YmxlIHF1b3Rlcy4gVGhpcyBtYWtlcyB0aGUgZGF0ZSBwYXJzaW5nIGNvZGUgdW5hYmxlCiAgICAgIC8vIHRvIG1hdGNoIHRoZSBkYXRlIHN0cmluZyBhbmQgcGFyc2UgaXQgYXMgYSBkYXRlLgogICAgICBpZiAoaXNvLmNoYXJBdCgwKSA9PSAnIicgJiYgaXNvLmNoYXJBdChpc28ubGVuZ3RoIC0gMSkgPT0gJyInKSB7CiAgICAgICAgaXNvID0gaXNvLnN1YnN0cmluZygxLCBpc28ubGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgICAgaWYgKElTT19EQVRFX1JFR0VYUC50ZXN0KGlzbykpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoaXNvKTsKICAgICAgfQogICAgICByZWdleHAubGFzdEluZGV4ID0gMDsKICAgICAgcGFydHMgPSByZWdleHAuZXhlYyhpc28pOwoKICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgcGFydHMuc2hpZnQoKTsKICAgICAgICBpZiAoZGF0ZSkgewogICAgICAgICAgbWFwID0gewogICAgICAgICAgICB5eXl5OiBkYXRlLmdldEZ1bGxZZWFyKCksCiAgICAgICAgICAgIE1NOiBkYXRlLmdldE1vbnRoKCkgKyAxLAogICAgICAgICAgICBkZDogZGF0ZS5nZXREYXRlKCksCiAgICAgICAgICAgIEhIOiBkYXRlLmdldEhvdXJzKCksCiAgICAgICAgICAgIG1tOiBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgc3M6IGRhdGUuZ2V0U2Vjb25kcygpLAogICAgICAgICAgICBzc3M6IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLyAxMDAwCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXAgPSB7IHl5eXk6IDE5NzAsIE1NOiAxLCBkZDogMSwgSEg6IDAsIG1tOiAwLCBzczogMCwgc3NzOiAwIH07CiAgICAgICAgfQoKICAgICAgICBmb3JFYWNoKHBhcnRzLCBmdW5jdGlvbihwYXJ0LCBpbmRleCkgewogICAgICAgICAgaWYgKGluZGV4IDwgbWFwcGluZy5sZW5ndGgpIHsKICAgICAgICAgICAgbWFwW21hcHBpbmdbaW5kZXhdXSA9ICtwYXJ0OwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXAueXl5eSwgbWFwLk1NIC0gMSwgbWFwLmRkLCBtYXAuSEgsIG1hcC5tbSwgbWFwLnNzIHx8IDAsIG1hcC5zc3MgKiAxMDAwIHx8IDApOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE5hTjsKICB9Owp9CgpmdW5jdGlvbiBjcmVhdGVEYXRlSW5wdXRUeXBlKHR5cGUsIHJlZ2V4cCwgcGFyc2VEYXRlLCBmb3JtYXQpIHsKICByZXR1cm4gZnVuY3Rpb24gZHluYW1pY0RhdGVJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3NlciwgJGZpbHRlcikgewogICAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTsKICAgIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7CiAgICB2YXIgdGltZXpvbmUgPSBjdHJsICYmIGN0cmwuJG9wdGlvbnMgJiYgY3RybC4kb3B0aW9ucy50aW1lem9uZTsKICAgIHZhciBwcmV2aW91c0RhdGU7CgogICAgY3RybC4kJHBhcnNlck5hbWUgPSB0eXBlOwogICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmIChjdHJsLiRpc0VtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7CiAgICAgIGlmIChyZWdleHAudGVzdCh2YWx1ZSkpIHsKICAgICAgICAvLyBOb3RlOiBXZSBjYW5ub3QgcmVhZCBjdHJsLiRtb2RlbFZhbHVlLCBhcyB0aGVyZSBtaWdodCBiZSBhIGRpZmZlcmVudAogICAgICAgIC8vIHBhcnNlci9mb3JtYXR0ZXIgaW4gdGhlIHByb2Nlc3NpbmcgY2hhaW4gc28gdGhhdCB0aGUgbW9kZWwKICAgICAgICAvLyBjb250YWlucyBzb21lIGRpZmZlcmVudCBkYXRhIGZvcm1hdCEKICAgICAgICB2YXIgcGFyc2VkRGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgcHJldmlvdXNEYXRlKTsKICAgICAgICBpZiAodGltZXpvbmUgPT09ICdVVEMnKSB7CiAgICAgICAgICBwYXJzZWREYXRlLnNldE1pbnV0ZXMocGFyc2VkRGF0ZS5nZXRNaW51dGVzKCkgLSBwYXJzZWREYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyc2VkRGF0ZTsKICAgICAgfQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfSk7CgogICAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSAmJiAhaXNEYXRlKHZhbHVlKSkgewogICAgICAgIHRocm93ICRuZ01vZGVsTWluRXJyKCdkYXRlZm10JywgJ0V4cGVjdGVkIGB7MH1gIHRvIGJlIGEgZGF0ZScsIHZhbHVlKTsKICAgICAgfQogICAgICBpZiAoaXNWYWxpZERhdGUodmFsdWUpKSB7CiAgICAgICAgcHJldmlvdXNEYXRlID0gdmFsdWU7CiAgICAgICAgaWYgKHByZXZpb3VzRGF0ZSAmJiB0aW1lem9uZSA9PT0gJ1VUQycpIHsKICAgICAgICAgIHZhciB0aW1lem9uZU9mZnNldCA9IDYwMDAwICogcHJldmlvdXNEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgICBwcmV2aW91c0RhdGUgPSBuZXcgRGF0ZShwcmV2aW91c0RhdGUuZ2V0VGltZSgpICsgdGltZXpvbmVPZmZzZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZpbHRlcignZGF0ZScpKHZhbHVlLCBmb3JtYXQsIHRpbWV6b25lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcmV2aW91c0RhdGUgPSBudWxsOwogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfSk7CgogICAgaWYgKGlzRGVmaW5lZChhdHRyLm1pbikgfHwgYXR0ci5uZ01pbikgewogICAgICB2YXIgbWluVmFsOwogICAgICBjdHJsLiR2YWxpZGF0b3JzLm1pbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuICFpc1ZhbGlkRGF0ZSh2YWx1ZSkgfHwgaXNVbmRlZmluZWQobWluVmFsKSB8fCBwYXJzZURhdGUodmFsdWUpID49IG1pblZhbDsKICAgICAgfTsKICAgICAgYXR0ci4kb2JzZXJ2ZSgnbWluJywgZnVuY3Rpb24odmFsKSB7CiAgICAgICAgbWluVmFsID0gcGFyc2VPYnNlcnZlZERhdGVWYWx1ZSh2YWwpOwogICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CiAgICAgIH0pOwogICAgfQoKICAgIGlmIChpc0RlZmluZWQoYXR0ci5tYXgpIHx8IGF0dHIubmdNYXgpIHsKICAgICAgdmFyIG1heFZhbDsKICAgICAgY3RybC4kdmFsaWRhdG9ycy5tYXggPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiAhaXNWYWxpZERhdGUodmFsdWUpIHx8IGlzVW5kZWZpbmVkKG1heFZhbCkgfHwgcGFyc2VEYXRlKHZhbHVlKSA8PSBtYXhWYWw7CiAgICAgIH07CiAgICAgIGF0dHIuJG9ic2VydmUoJ21heCcsIGZ1bmN0aW9uKHZhbCkgewogICAgICAgIG1heFZhbCA9IHBhcnNlT2JzZXJ2ZWREYXRlVmFsdWUodmFsKTsKICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkgewogICAgICAvLyBJbnZhbGlkIERhdGU6IGdldFRpbWUoKSByZXR1cm5zIE5hTgogICAgICByZXR1cm4gdmFsdWUgJiYgISh2YWx1ZS5nZXRUaW1lICYmIHZhbHVlLmdldFRpbWUoKSAhPT0gdmFsdWUuZ2V0VGltZSgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU9ic2VydmVkRGF0ZVZhbHVlKHZhbCkgewogICAgICByZXR1cm4gaXNEZWZpbmVkKHZhbCkgPyAoaXNEYXRlKHZhbCkgPyB2YWwgOiBwYXJzZURhdGUodmFsKSkgOiB1bmRlZmluZWQ7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7CiAgdmFyIG5vZGUgPSBlbGVtZW50WzBdOwogIHZhciBuYXRpdmVWYWxpZGF0aW9uID0gY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMgPSBpc09iamVjdChub2RlLnZhbGlkaXR5KTsKICBpZiAobmF0aXZlVmFsaWRhdGlvbikgewogICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciB2YWxpZGl0eSA9IGVsZW1lbnQucHJvcChWQUxJRElUWV9TVEFURV9QUk9QRVJUWSkgfHwge307CiAgICAgIC8vIERldGVjdCBidWcgaW4gRkYzNSBmb3IgaW5wdXRbZW1haWxdIChodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDY0NDMwKToKICAgICAgLy8gLSBhbHNvIHNldHMgdmFsaWRpdHkuYmFkSW5wdXQgKHNob3VsZCBvbmx5IGJlIHZhbGlkaXR5LnR5cGVNaXNtYXRjaCkuCiAgICAgIC8vIC0gc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAvLyAtIGNhbiBpZ25vcmUgdGhpcyBjYXNlIGFzIHdlIGNhbiBzdGlsbCByZWFkIG91dCB0aGUgZXJyb25lb3VzIGVtYWlsLi4uCiAgICAgIHJldHVybiB2YWxpZGl0eS5iYWRJbnB1dCAmJiAhdmFsaWRpdHkudHlwZU1pc21hdGNoID8gdW5kZWZpbmVkIDogdmFsdWU7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIG51bWJlcklucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKSB7CiAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTsKICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpOwoKICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdudW1iZXInOwogIGN0cmwuJHBhcnNlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKGN0cmwuJGlzRW1wdHkodmFsdWUpKSAgICAgIHJldHVybiBudWxsOwogICAgaWYgKE5VTUJFUl9SRUdFWFAudGVzdCh2YWx1ZSkpIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfSk7CgogIGN0cmwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKCFjdHJsLiRpc0VtcHR5KHZhbHVlKSkgewogICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkgewogICAgICAgIHRocm93ICRuZ01vZGVsTWluRXJyKCdudW1mbXQnLCAnRXhwZWN0ZWQgYHswfWAgdG8gYmUgYSBudW1iZXInLCB2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0pOwoKICBpZiAoYXR0ci5taW4gfHwgYXR0ci5uZ01pbikgewogICAgdmFyIG1pblZhbDsKICAgIGN0cmwuJHZhbGlkYXRvcnMubWluID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IGlzVW5kZWZpbmVkKG1pblZhbCkgfHwgdmFsdWUgPj0gbWluVmFsOwogICAgfTsKCiAgICBhdHRyLiRvYnNlcnZlKCdtaW4nLCBmdW5jdGlvbih2YWwpIHsKICAgICAgaWYgKGlzRGVmaW5lZCh2YWwpICYmICFpc051bWJlcih2YWwpKSB7CiAgICAgICAgdmFsID0gcGFyc2VGbG9hdCh2YWwsIDEwKTsKICAgICAgfQogICAgICBtaW5WYWwgPSBpc051bWJlcih2YWwpICYmICFpc05hTih2YWwpID8gdmFsIDogdW5kZWZpbmVkOwogICAgICAvLyBUT0RPKG1hdHNrbyk6IGltcGxlbWVudCB2YWxpZGF0ZUxhdGVyIHRvIHJlZHVjZSBudW1iZXIgb2YgdmFsaWRhdGlvbnMKICAgICAgY3RybC4kdmFsaWRhdGUoKTsKICAgIH0pOwogIH0KCiAgaWYgKGF0dHIubWF4IHx8IGF0dHIubmdNYXgpIHsKICAgIHZhciBtYXhWYWw7CiAgICBjdHJsLiR2YWxpZGF0b3JzLm1heCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtYXhWYWwpIHx8IHZhbHVlIDw9IG1heFZhbDsKICAgIH07CgogICAgYXR0ci4kb2JzZXJ2ZSgnbWF4JywgZnVuY3Rpb24odmFsKSB7CiAgICAgIGlmIChpc0RlZmluZWQodmFsKSAmJiAhaXNOdW1iZXIodmFsKSkgewogICAgICAgIHZhbCA9IHBhcnNlRmxvYXQodmFsLCAxMCk7CiAgICAgIH0KICAgICAgbWF4VmFsID0gaXNOdW1iZXIodmFsKSAmJiAhaXNOYU4odmFsKSA/IHZhbCA6IHVuZGVmaW5lZDsKICAgICAgLy8gVE9ETyhtYXRza28pOiBpbXBsZW1lbnQgdmFsaWRhdGVMYXRlciB0byByZWR1Y2UgbnVtYmVyIG9mIHZhbGlkYXRpb25zCiAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIHVybElucHV0VHlwZShzY29wZSwgZWxlbWVujNzvViGUAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxLQABABm6SwKgHNsCoB2CVIh/1WHp800G89OiAEAzcE2YAAAEBCAoAo17PAE2lyozc71a5lAIACiAAAAogAABo9ygf0sUIACetHhMIAEUAH/zUZkAAQAa2rsCoB2DAqAc2H/WVIkG89OhYenzTgBgBU6/VAAABAQgKAE2lywCjXs50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHsKICAvLyBOb3RlOiBubyBiYWRJbnB1dENoZWNrZXIgaGVyZSBieSBwdXJwb3NlIGFzIGB1cmxgIGlzIG9ubHkgYSB2YWxpZGF0aW9uCiAgLy8gaW4gYnJvd3NlcnMsIGkuZS4gd2UgY2FuIGFsd2F5cyByZWFkIG91dCBpbnB1dC52YWx1ZSBldmVuIGlmIGl0IGlzIG5vdCB2YWxpZCEKICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpOwogIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpOwoKICBjdHJsLiQkcGFyc2VyTmFtZSA9ICd1cmwnOwogIGN0cmwuJHZhbGlkYXRvcnMudXJsID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7CiAgICB2YXIgdmFsdWUgPSBtb2RlbFZhbHVlIHx8IHZpZXdWYWx1ZTsKICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBVUkxfUkVHRVhQLnRlc3QodmFsdWUpOwogIH07Cn0KCmZ1bmN0aW9uIGVtYWlsSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHsKICAvLyBOb3RlOiBubyBiYWRJbnB1dENoZWNrZXIgaGVyZSBieSBwdXJwb3NlIGFzIGB1cmxgIGlzIG9ubHkgYSB2YWxpZGF0aW9uCiAgLy8gaW4gYnJvd3NlcnMsIGkuZS4gd2UgY2FuIGFsd2F5cyByZWFkIG91dCBpbnB1dC52YWx1ZSBldmVuIGlmIGl0IGlzIG5vdCB2YWxpZCEKICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpOwogIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpOwoKICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdlbWFpbCc7CiAgY3RybC4kdmFsaWRhdG9ycy5lbWFpbCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgewogICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7CiAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2YWx1ZSkgfHwgRU1BSUxfUkVHRVhQLnRlc3QodmFsdWUpOwogIH07Cn0KCmZ1bmN0aW9uIHJhZGlvSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7CiAgLy8gbWFrZSB0aGUgbmFtZSB1bmlxdWUsIGlmIG5vdCBkZWZpbmVkCiAgaWYgKGlzVW5kZWZpbmVkKGF0dHIubmFtZSkpIHsKICAgIGVsZW1lbnQuYXR0cignbmFtZScsIG5leHRVaWQoKSk7CiAgfQoKICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldikgewogICAgaWYgKGVsZW1lbnRbMF0uY2hlY2tlZCkgewogICAgICBjdHJsLiRzZXRWaWV3VmFsdWUoYXR0ci52YWx1ZSwgZXYgJiYgZXYudHlwZSk7CiAgICB9CiAgfTsKCiAgZWxlbWVudC5vbignY2xpY2snLCBsaXN0ZW5lcik7CgogIGN0cmwuJHJlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gYXR0ci52YWx1ZTsKICAgIGVsZW1lbnRbMF0uY2hlY2tlZCA9ICh2YWx1ZSA9PSBjdHJsLiR2aWV3VmFsdWUpOwogIH07CgogIGF0dHIuJG9ic2VydmUoJ3ZhbHVlJywgY3RybC4kcmVuZGVyKTsKfQoKZnVuY3Rpb24gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBjb250ZXh0LCBuYW1lLCBleHByZXNzaW9uLCBmYWxsYmFjaykgewogIHZhciBwYXJzZUZuOwogIGlmIChpc0RlZmluZWQoZXhwcmVzc2lvbikpIHsKICAgIHBhcnNlRm4gPSAkcGFyc2UoZXhwcmVzc2lvbik7CiAgICBpZiAoIXBhcnNlRm4uY29uc3RhbnQpIHsKICAgICAgdGhyb3cgbWluRXJyKCduZ01vZGVsJykoJ2NvbnN0ZXhwcicsICdFeHBlY3RlZCBjb25zdGFudCBleHByZXNzaW9uIGZvciBgezB9YCwgYnV0IHNhdyAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYHsxfWAuJywgbmFtZSwgZXhwcmVzc2lvbik7CiAgICB9CiAgICByZXR1cm4gcGFyc2VGbihjb250ZXh0KTsKICB9CiAgcmV0dXJuIGZhbGxiYWNrOwp9CgpmdW5jdGlvbiBjaGVja2JveElucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyLCAkZmlsdGVyLCAkcGFyc2UpIHsKICB2YXIgdHJ1ZVZhbHVlID0gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBzY29wZSwgJ25nVHJ1ZVZhbHVlJywgYXR0ci5uZ1RydWVWYWx1ZSwgdHJ1ZSk7CiAgdmFyIGZhbHNlVmFsdWUgPSBwYXJzZUNvbnN0YW50RXhwcigkcGFyc2UsIHNjb3BlLCAnbmdGYWxzZVZhbHVlJywgYXR0ci5uZ0ZhbHNlVmFsdWUsIGZhbHNlKTsKCiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHsKICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbGVtZW50WzBdLmNoZWNrZWQsIGV2ICYmIGV2LnR5cGUpOwogIH07CgogIGVsZW1lbnQub24oJ2NsaWNrJywgbGlzdGVuZXIpOwoKICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIGVsZW1lbnRbMF0uY2hlY2tlZCA9IGN0cmwuJHZpZXdWYWx1ZTsKICB9OwoKICAvLyBPdmVycmlkZSB0aGUgc3RhbmRhcmQgYCRpc0VtcHR5YCBiZWNhdXNlIHRoZSAkdmlld1ZhbHVlIG9mIGFuIGVtcHR5IGNoZWNrYm94IGlzIGFsd2F5cyBzZXQgdG8gYGZhbHNlYAogIC8vIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgcGFyc2VyIGJlbG93LCB3aGljaCBjb21wYXJlcyB0aGUgYCRtb2RlbFZhbHVlYCB3aXRoIGB0cnVlVmFsdWVgIHRvIGNvbnZlcnQKICAvLyBpdCB0byBhIGJvb2xlYW4uCiAgY3RybC4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlOwogIH07CgogIGN0cmwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGVxdWFscyh2YWx1ZSwgdHJ1ZVZhbHVlKTsKICB9KTsKCiAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPyB0cnVlVmFsdWUgOiBmYWxzZVZhbHVlOwogIH0pOwp9CgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgdGV4dGFyZWEKICogQHJlc3RyaWN0IEUKICoKICogQGRlc2NyaXB0aW9uCiAqIEhUTUwgdGV4dGFyZWEgZWxlbWVudCBjb250cm9sIHdpdGggYW5ndWxhciBkYXRhLWJpbmRpbmcuIFRoZSBkYXRhLWJpbmRpbmcgYW5kIHZhbGlkYXRpb24KICogcHJvcGVydGllcyBvZiB0aGlzIGVsZW1lbnQgYXJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhvc2Ugb2YgdGhlCiAqIHtAbGluayBuZy5kaXJlY3RpdmU6aW5wdXQgaW5wdXQgZWxlbWVudH0uCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgogKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bwogKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgogKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4KICogICAgbWlubGVuZ3RoLgogKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuCiAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZiBhbnkKICogICAgbGVuZ3RoLgogKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlCiAqICAgIFJlZ0V4cCBwYXR0ZXJuIGV4cHJlc3Npb24uIEV4cGVjdGVkIHZhbHVlIGlzIGAvcmVnZXhwL2AgZm9yIGlubGluZSBwYXR0ZXJucyBvciBgcmVnZXhwYCBmb3IKICogICAgcGF0dGVybnMgZGVmaW5lZCBhcyBzY29wZSBleHByZXNzaW9ucy4KICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCiAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtuZ1RyaW09dHJ1ZV0gSWYgc2V0IHRvIGZhbHNlIEFuZ3VsYXIgd2lsbCBub3QgYXV0b21hdGljYWxseSB0cmltIHRoZSBpbnB1dC4KICovCgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgaW5wdXQKICogQHJlc3RyaWN0IEUKICoKICogQGRlc2NyaXB0aW9uCiAqIEhUTUwgaW5wdXQgZWxlbWVudCBjb250cm9sLiBXaGVuIHVzZWQgdG9nZXRoZXIgd2l0aCB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9LCBpdCBwcm92aWRlcyBkYXRhLWJpbmRpbmcsCiAqIGlucHV0IHN0YXRlIGNvbnRyb2wsIGFuZCB2YWxpZGF0aW9uLgogKiBJbnB1dCBjb250cm9sIGZvbGxvd3MgSFRNTDUgaW5wdXQgdHlwZXMgYW5kIHBvbHlmaWxscyB0aGUgSFRNTDUgdmFsaWRhdGlvbiBiZWhhdmlvciBmb3Igb2xkZXIgYnJvd3NlcnMuCiAqCiAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgogKiAqKk5vdGU6KiogTm90IGV2ZXJ5IGZlYXR1cmUgb2ZmZXJlZCBpcyBhdmFpbGFibGUgZm9yIGFsbCBpbnB1dCB0eXBlcy4KICogU3BlY2lmaWNhbGx5LCBkYXRhIGJpbmRpbmcgYW5kIGV2ZW50IGhhbmRsaW5nIHZpYSBgbmctbW9kZWxgIGlzIHVuc3VwcG9ydGVkIGZvciBgaW5wdXRbZmlsZV1gLgogKiA8L2Rpdj4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLgogKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuCiAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4KICogQHBhcmFtIHtib29sZWFuPX0gbmdSZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGlmIHNldCB0byB0cnVlCiAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuCiAqICAgIG1pbmxlbmd0aC4KICogQHBhcmFtIHtudW1iZXI9fSBuZ01heGxlbmd0aCBTZXRzIGBtYXhsZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBsb25nZXIgdGhhbgogKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2YgYW55CiAqICAgIGxlbmd0aC4KICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZQogKiAgICBSZWdFeHAgcGF0dGVybiBleHByZXNzaW9uLiBFeHBlY3RlZCB2YWx1ZSBpcyBgL3JlZ2V4cC9gIGZvciBpbmxpbmUgcGF0dGVybnMgb3IgYHJlZ2V4cGAgZm9yCiAqICAgIHBhdHRlcm5zIGRlZmluZWQgYXMgc2NvcGUgZXhwcmVzc2lvbnMuCiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgogKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgogKiBAcGFyYW0ge2Jvb2xlYW49fSBbbmdUcmltPXRydWVdIElmIHNldCB0byBmYWxzZSBBbmd1bGFyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJpbSB0aGUgaW5wdXQuCiAqICAgIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgZm9yIGlucHV0W3R5cGU9cGFzc3dvcmRdIGNvbnRyb2xzLCB3aGljaCB3aWxsIG5ldmVyIHRyaW0gdGhlCiAqICAgIGlucHV0LgogKgogKiBAZXhhbXBsZQogICAgPGV4YW1wbGUgbmFtZT0iaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImlucHV0RXhhbXBsZSI+CiAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHNjcmlwdD4KICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdpbnB1dEV4YW1wbGUnLCBbXSkKICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICAgICAkc2NvcGUudXNlciA9IHtuYW1lOiAnZ3Vlc3QnLCBsYXN0OiAndmlzaXRvcid9OwogICAgICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iPgogICAgICAgICAgIFVzZXIgbmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJOYW1lIiBuZy1tb2RlbD0idXNlci5uYW1lIiByZXF1aXJlZD4KICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS51c2VyTmFtZS4kZXJyb3IucmVxdWlyZWQiPgogICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPjxicj4KICAgICAgICAgICBMYXN0IG5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsYXN0TmFtZSIgbmctbW9kZWw9InVzZXIubGFzdCIKICAgICAgICAgICAgIG5nLW1pbmxlbmd0aD0iMyIgbmctbWF4bGVuZ3RoPSIxMCI+CiAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0ubGFzdE5hbWUuJGVycm9yLm1pbmxlbmd0aCI+CiAgICAgICAgICAgICBUb28gc2hvcnQhPC9zcGFuPgogICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmxhc3ROYW1lLiRlcnJvci5tYXhsZW5ndGgiPgogICAgICAgICAgICAgVG9vIGxvbmchPC9zcGFuPjxicj4KICAgICAgICAgPC9mb3JtPgogICAgICAgICA8aHI+CiAgICAgICAgIDx0dD51c2VyID0ge3t1c2VyfX08L3R0Pjxici8+CiAgICAgICAgIDx0dD5teUZvcm0udXNlck5hbWUuJHZhbGlkID0ge3tteUZvcm0udXNlck5hbWUuJHZhbGlkfX08L3R0Pjxicj4KICAgICAgICAgPHR0Pm15Rm9ybS51c2VyTmFtZS4kZXJyb3IgPSB7e215Rm9ybS51c2VyTmFtZS4kZXJyb3J9fTwvdHQ+PGJyPgogICAgICAgICA8dHQ+bXlGb3JtLmxhc3ROYW1lLiR2YWxpZCA9IHt7bXlGb3JtLmxhc3ROYW1lLiR2YWxpZH19PC90dD48YnI+CiAgICAgICAgIDx0dD5teUZvcm0ubGFzdE5hbWUuJGVycm9yID0ge3tteUZvcm0ubGFzdE5hbWUuJGVycm9yfX08L3R0Pjxicj4KICAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyPgogICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxicj4KICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IubWlubGVuZ3RoID0ge3shIW15Rm9ybS4kZXJyb3IubWlubGVuZ3RofX08L3R0Pjxicj4KICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IubWF4bGVuZ3RoID0ge3shIW15Rm9ybS4kZXJyb3IubWF4bGVuZ3RofX08L3R0Pjxicj4KICAgICAgIDwvZGl2PgogICAgICA8L2ZpbGU+CiAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgIHZhciB1c2VyID0gZWxlbWVudChieS5leGFjdEJpbmRpbmcoJ3VzZXInKSk7CiAgICAgICAgdmFyIHVzZXJOYW1lVmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS51c2VyTmFtZS4kdmFsaWQnKSk7CiAgICAgICAgdmFyIGxhc3ROYW1lVmFsaWQgDQqM3O9WGpYCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PExAAEAGbpHAqAc2wKgHYJUiH/VYenzTQb0UsIAQDQ7zagAAAQEICgCjXs8ATaXLjNzvVpGXAgBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNRsQABABnZIwKgHYMCoBzYf9ZUiQb0UsFh6fNOAEAFT8DUAAAEBCAoATaXLAKNezzdGRTgNCj0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0ubGFzdE5hbWUuJHZhbGlkJykpOwogICAgICAgIHZhciBsYXN0TmFtZUVycm9yID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0ubGFzdE5hbWUuJGVycm9yJykpOwogICAgICAgIHZhciBmb3JtVmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS4kdmFsaWQnKSk7CiAgICAgICAgdmFyIHVzZXJOYW1lSW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyLm5hbWUnKSk7CiAgICAgICAgdmFyIHVzZXJMYXN0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyLmxhc3QnKSk7CgogICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3sibmFtZSI6Imd1ZXN0IiwibGFzdCI6InZpc2l0b3IifScpOwogICAgICAgICAgZXhwZWN0KHVzZXJOYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsKICAgICAgICAgIGV4cGVjdChmb3JtVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsKICAgICAgICB9KTsKCiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5IHdoZW4gcmVxdWlyZWQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHVzZXJOYW1lSW5wdXQuY2xlYXIoKTsKICAgICAgICAgIHVzZXJOYW1lSW5wdXQuc2VuZEtleXMoJycpOwoKICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7Imxhc3QiOiJ2aXNpdG9yIn0nKTsKICAgICAgICAgIGV4cGVjdCh1c2VyTmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKICAgICAgICB9KTsKCiAgICAgICAgaXQoJ3Nob3VsZCBiZSB2YWxpZCBpZiBlbXB0eSB3aGVuIG1pbiBsZW5ndGggaXMgc2V0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICB1c2VyTGFzdElucHV0LmNsZWFyKCk7CiAgICAgICAgICB1c2VyTGFzdElucHV0LnNlbmRLZXlzKCcnKTsKCiAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigneyJuYW1lIjoiZ3Vlc3QiLCJsYXN0IjoiIn0nKTsKICAgICAgICAgIGV4cGVjdChsYXN0TmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CiAgICAgICAgICBleHBlY3QoZm9ybVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CiAgICAgICAgfSk7CgogICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBsZXNzIHRoYW4gcmVxdWlyZWQgbWluIGxlbmd0aCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpOwogICAgICAgICAgdXNlckxhc3RJbnB1dC5zZW5kS2V5cygneHgnKTsKCiAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigneyJuYW1lIjoiZ3Vlc3QifScpOwogICAgICAgICAgZXhwZWN0KGxhc3ROYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CiAgICAgICAgICBleHBlY3QobGFzdE5hbWVFcnJvci5nZXRUZXh0KCkpLnRvQ29udGFpbignbWlubGVuZ3RoJyk7CiAgICAgICAgICBleHBlY3QoZm9ybVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgIH0pOwoKICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgbG9uZ2VyIHRoYW4gbWF4IGxlbmd0aCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpOwogICAgICAgICAgdXNlckxhc3RJbnB1dC5zZW5kS2V5cygnc29tZSByaWRpY3Vsb3VzbHkgbG9uZyBuYW1lJyk7CgogICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3sibmFtZSI6Imd1ZXN0In0nKTsKICAgICAgICAgIGV4cGVjdChsYXN0TmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOwogICAgICAgICAgZXhwZWN0KGxhc3ROYW1lRXJyb3IuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ21heGxlbmd0aCcpOwogICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKICAgICAgICB9KTsKICAgICAgPC9maWxlPgogICAgPC9leGFtcGxlPgogKi8KdmFyIGlucHV0RGlyZWN0aXZlID0gWyckYnJvd3NlcicsICckc25pZmZlcicsICckZmlsdGVyJywgJyRwYXJzZScsCiAgICBmdW5jdGlvbigkYnJvd3NlciwgJHNuaWZmZXIsICRmaWx0ZXIsICRwYXJzZSkgewogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0UnLAogICAgcmVxdWlyZTogWyc/bmdNb2RlbCddLAogICAgbGluazogewogICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJscykgewogICAgICAgIGlmIChjdHJsc1swXSkgewogICAgICAgICAgKGlucHV0VHlwZVtsb3dlcmNhc2UoYXR0ci50eXBlKV0gfHwgaW5wdXRUeXBlLnRleHQpKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsc1swXSwgJHNuaWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJyb3dzZXIsICRmaWx0ZXIsICRwYXJzZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKfV07Cgp2YXIgVkFMSURfQ0xBU1MgPSAnbmctdmFsaWQnLAogICAgSU5WQUxJRF9DTEFTUyA9ICduZy1pbnZhbGlkJywKICAgIFBSSVNUSU5FX0NMQVNTID0gJ25nLXByaXN0aW5lJywKICAgIERJUlRZX0NMQVNTID0gJ25nLWRpcnR5JywKICAgIFVOVE9VQ0hFRF9DTEFTUyA9ICduZy11bnRvdWNoZWQnLAogICAgVE9VQ0hFRF9DTEFTUyA9ICduZy10b3VjaGVkJywKICAgIFBFTkRJTkdfQ0xBU1MgPSAnbmctcGVuZGluZyc7CgovKioKICogQG5nZG9jIHR5cGUKICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlcgogKgogKiBAcHJvcGVydHkge3N0cmluZ30gJHZpZXdWYWx1ZSBBY3R1YWwgc3RyaW5nIHZhbHVlIGluIHRoZSB2aWV3LgogKiBAcHJvcGVydHkgeyp9ICRtb2RlbFZhbHVlIFRoZSB2YWx1ZSBpbiB0aGUgbW9kZWwgdGhhdCB0aGUgY29udHJvbCBpcyBib3VuZCB0by4KICogQHByb3BlcnR5IHtBcnJheS48RnVuY3Rpb24+fSAkcGFyc2VycyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gZXhlY3V0ZSwgYXMgYSBwaXBlbGluZSwgd2hlbmV2ZXIKICAgICAgIHRoZSBjb250cm9sIHJlYWRzIHZhbHVlIGZyb20gdGhlIERPTS4gVGhlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGluIGFycmF5IG9yZGVyLCBlYWNoIHBhc3NpbmcKICAgICAgIGl0cyByZXR1cm4gdmFsdWUgdGhyb3VnaCB0byB0aGUgbmV4dC4gVGhlIGxhc3QgcmV0dXJuIHZhbHVlIGlzIGZvcndhcmRlZCB0byB0aGUKICAgICAgIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2YWxpZGF0b3JzIGAkdmFsaWRhdG9yc2B9IGNvbGxlY3Rpb24uCgpQYXJzZXJzIGFyZSB1c2VkIHRvIHNhbml0aXplIC8gY29udmVydCB0aGUge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZpZXdWYWx1ZQpgJHZpZXdWYWx1ZWB9LgoKUmV0dXJuaW5nIGB1bmRlZmluZWRgIGZyb20gYSBwYXJzZXIgbWVhbnMgYSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gSW4gdGhhdCBjYXNlLApubyB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdG9ycyBgJHZhbGlkYXRvcnNgfSB3aWxsIHJ1biBhbmQgdGhlIGBuZ01vZGVsYAp3aWxsIGJlIHNldCB0byBgdW5kZWZpbmVkYCB1bmxlc3Mge0BsaW5rIG5nTW9kZWxPcHRpb25zIGBuZ01vZGVsT3B0aW9ucy5hbGxvd0ludmFsaWRgfQppcyBzZXQgdG8gYHRydWVgLiBUaGUgcGFyc2UgZXJyb3IgaXMgc3RvcmVkIGluIGBuZ01vZGVsLiRlcnJvci5wYXJzZWAuCgogKgogKiBAcHJvcGVydHkge0FycmF5LjxGdW5jdGlvbj59ICRmb3JtYXR0ZXJzIEFycmF5IG9mIGZ1bmN0aW9ucyB0byBleGVjdXRlLCBhcyBhIHBpcGVsaW5lLCB3aGVuZXZlcgogICAgICAgdGhlIG1vZGVsIHZhbHVlIGNoYW5nZXMuIFRoZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbiByZXZlcnNlIGFycmF5IG9yZGVyLCBlYWNoIHBhc3NpbmcgdGhlIHZhbHVlIHRocm91Z2ggdG8gdGhlCiAgICAgICBuZXh0LiBUaGUgbGFzdCByZXR1cm4gdmFsdWUgaXMgdXNlZCBhcyB0aGUgYWN0dWFsIERPTSB2YWx1ZS4KICAgICAgIFVzZWQgdG8gZm9ybWF0IC8gY29udmVydCB2YWx1ZXMgZm9yIGRpc3BsYXkgaW4gdGhlIGNvbnRyb2wuCiAqIGBgYGpzCiAqIGZ1bmN0aW9uIGZvcm1hdHRlcih2YWx1ZSkgewogKiAgIGlmICh2YWx1ZSkgewogKiAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAqICAgfQogKiB9CiAqIG5nTW9kZWwuJGZvcm1hdHRlcnMucHVzaChmb3JtYXR0ZXIpOwogKiBgYGAKICoKICogQHByb3BlcnR5IHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24+fSAkdmFsaWRhdG9ycyBBIGNvbGxlY3Rpb24gb2YgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWVkCiAqICAgICAgd2hlbmV2ZXIgdGhlIG1vZGVsIHZhbHVlIGNoYW5nZXMuIFRoZSBrZXkgdmFsdWUgd2l0aGluIHRoZSBvYmplY3QgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIHRoZQogKiAgICAgIHZhbGlkYXRvciB3aGlsZSB0aGUgZnVuY3Rpb24gcmVmZXJzIHRvIHRoZSB2YWxpZGF0aW9uIG9wZXJhdGlvbi4gVGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uIGlzCiAqICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgbW9kZWwgdmFsdWUgYXMgYW4gYXJndW1lbnQgYW5kIG11c3QgcmV0dXJuIGEgdHJ1ZSBvciBmYWxzZSB2YWx1ZSBkZXBlbmRpbmcKICogICAgICBvbiB0aGUgcmVzcG9uc2Ugb2YgdGhhdCB2YWxpZGF0aW9uLgogKgogKiBgYGBqcwogKiBuZ01vZGVsLiR2YWxpZGF0b3JzLnZhbGlkQ2hhcmFjdGVycyA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgewogKiAgIHZhciB2YWx1ZSA9IG1vZGVsVmFsdWUgfHwgdmlld1ZhbHVlOwogKiAgIHJldHVybiAvWzAtOV0rLy50ZXN0KHZhbHVlKSAmJgogKiAgICAgICAgICAvW2Etel0rLy50ZXN0KHZhbHVlKSAmJgogKiAgICAgICAgICAvW0EtWl0rLy50ZXN0KHZhbHVlKSAmJgogKiAgICAgICAgICAvXFcrLy50ZXN0KHZhbHVlKTsKICogfTsKICogYGBgCiAqCiAqIEBwcm9wZXJ0eSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPn0gJGFzeW5jVmFsaWRhdG9ycyBBIGNvbGxlY3Rpb24gb2YgdmFsaWRhdGlvbnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8KICogICAgICBwZXJmb3JtIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIChlLmcuIGEgSFRUUCByZXF1ZXN0KS4gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gdGhhdCBpcyBwcm92aWRlZAogKiAgICAgIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIHByb21pc2Ugd2hlbiBpdCBpcyBydW4gZHVyaW5nIHRoZSBtb2RlbCB2YWxpZGF0aW9uIHByb2Nlc3MuIE9uY2UgdGhlIHByb21pc2UKICogICAgICBpcyBkZWxpdmVyZWQgdGhlbiB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIGZ1bGZpbGxlZCBhbmQgZmFsc2Ugd2hlbiByZWplY3RlZC4KICogICAgICBXaGVuIHRoZSBhc3luY2hyb25vdXMgdmFsaWRhdG9ycyBhcmUgdHJpZ2dlcmVkLCBlYWNoIG9mIHRoZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHBhcmFsbGVsIGFuZCB0aGUgbW9kZWwKICogICAgICB2YWx1ZSB3aWxsIG9ubHkgYmUgdXBkYXRlZCBvbmNlIGFsbCB2YWxpZGF0b3JzIGhhdmUgYmVlbiBmdWxmaWxsZWQuIEFzIGxvbmcgYXMgYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRvcgogKiAgICAgIGlzIHVuZnVsZmlsbGVkLCBpdHMga2V5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXJzIGAkcGVuZGluZ2AgcHJvcGVydHkuIEFsc28sIGFsbCBhc3luY2hyb25vdXMgdmFsaWRhdG9ycwogKiAgICAgIHdpbGwgb25seSBydW4gb25jZSBhbGwgc3luY2hyb25vdXMgdmFsaWRhdG9ycyBoYXZlIHBhc3NlZC4KICoKICogUGxlYXNlIG5vdGUgdGhhdCBpZiAkaHR0cCBpcyB1c2VkIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHNlcnZlciByZXR1cm5zIGEgc3VjY2VzcyBIVFRQIHJlc3BvbnNlIGNvZGUKICogaW4gb3JkZXIgdG8gZnVsZmlsbCB0aGUgdmFsaWRhdGlvbiBhbmQgYSBzdGF0dXMgbGV2ZWwgb2YgYDR4eGAgaW4gb3JkZXIgdG8gcmVqZWN0IHRoZSB2YWxpZGF0aW9uLgogKgogKiBgYGBqcwogKiBuZ01vZGVsLiRhc3luY1ZhbGlkYXRvcnMudW5pcXVlVXNlcm5hbWUgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHsKICogICB2YXIgdmFsdWUgPSBtb2RlbFZhbHVlIHx8IHZpZXdWYWx1ZTsKICoKICogICAvLyBMb29rdXAgdXNlciBieSB1c2VybmFtZQogKiAgIHJldHVybiAkaHR0cC5nZXQoJy9hcGkvdXNlcnMvJyArIHZhbHVlKS4KICogICAgICB0aGVuKGZ1bmN0aW9uIHJlc29sdmVkKCkgewogKiAgICAgICAgLy91c2VybmFtZSBleGlzdHMsIHRoaXMgbWVhbnMgdmFsaWRhdGlvbiBmYWlscwogKiAgICAgICAgcmV0dXJuICRxLnJlamVjdCgnZXhpc3RzJyk7CiAqICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0ZWQoKSB7CiAqICAgICAgICAvL3VzZXJuYW1lIGRvZXMgbm90IGV4aXN0LCB0aGVyZWZvcmUgdGhpcyB2YWxpZGF0aW9uIHBhc3NlcwogKiAgICAgICAgcmV0dXJuIHRydWU7CiAqICAgICAgfSk7CiAqIH07CiAqIGBgYAogKgogKiBAcHJvcGVydHkge0FycmF5LjxGdW5jdGlvbj59ICR2aWV3Q2hhbmdlTGlzdGVuZXJzIEFycmF5IG9mIGZ1bmN0aW9ucyB0byBleGVjdXRlIHdoZW5ldmVyIHRoZQogKiAgICAgdmlldyB2YWx1ZSBoYXMgY2hhbmdlZC4gSXQgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCBhbmQgaXRzIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgogKiAgICAgVGhpcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhZGRpdGlvbmFsICR3YXRjaGVzIGFnYWluc3QgdGhlIG1vZGVsIHZhbHVlLgogKgogKiBAcHJvcGVydHkge09iamVjdH0gJGVycm9yIEFuIG9iamVjdCBoYXNoIHdpdGggYWxsIGZhaWxpbmcgdmFsaWRhdG9yIGlkcyBhcyBrZXlzLgogKiBAcHJvcGVydHkge09iamVjdH0gJHBlbmRpbmcgQW4gb2JqZWN0IGhhc2ggd2l0aCBhbGwgcGVuZGluZyB2YWxpZGF0b3IgaWRzIGFzIGtleXMuCiAqCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHVudG91Y2hlZCBUcnVlIGlmIGNvbnRyb2wgaGFzIG5vdCBsb3N0IGZvY3VzIHlldC4KICogQHByb3BlcnR5IHtib29sZWFufSAkdG91Y2hlZCBUcnVlIGlmIGNvbnRyb2wgaGFzIGxvc3QgZm9jdXMuCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHByaXN0aW5lIFRydWUgaWYgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB0aGUgY29udHJvbCB5ZXQuCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJGRpcnR5IFRydWUgaWYgdXNlciBoYXMgYWxyZWFkeSBpbnRlcmFjdGVkIHdpdGggdGhlIGNvbnRyb2wuCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHZhbGlkIFRydWUgaWYgdGhlcmUgaXMgbm8gZXJyb3IuCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJGludmFsaWQgVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZXJyb3Igb24gdGhlIGNvbnRyb2wuCiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSAkbmFtZSBUaGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIGNvbnRyb2wuCiAqCiAqIEBkZXNjcmlwdGlvbgogKgogKiBgTmdNb2RlbENvbnRyb2xsZXJgIHByb3ZpZGVzIEFQSSBmb3IgdGhlIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0gZGlyZWN0aXZlLgogKiBUaGUgY29udHJvbGxlciBjb250YWlucyBzZXJ2aWNlcyBmb3IgZGF0YS1iaW5kaW5nLCB2YWxpZGF0aW9uLCBDU1MgdXBkYXRlcywgYW5kIHZhbHVlIGZvcm1hdHRpbmcKICogYW5kIHBhcnNpbmcuIEl0IHB1cnBvc2VmdWxseSBkb2VzIG5vdCBjb250YWluIGFueSBsb2dpYyB3aGljaCBkZWFscyB3aXRoIERPTSByZW5kZXJpbmcgb3IKICogbGlzdGVuaW5nIHRvIERPTSBldmVudHMuCiAqIFN1Y2ggRE9NIHJlbGF0ZWQgbG9naWMgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IG90aGVyIGRpcmVjdGl2ZXMgd2hpY2ggbWFrZSB1c2Ugb2YKICogYE5nTW9kZWxDb250cm9sbGVyYCBmb3IgZGF0YS1iaW5kaW5nIHRvIGNvbnRyb2wgZWxlbWVudHMuCiAqIEFuZ3VsYXIgcHJvdmlkZXMgdGhpcyBET00gbG9naWMgZm9yIG1vc3Qge0BsaW5rIGlucHV0IGBpbnB1dGB9IGVsZW1lbnRzLgogKiBBdCB0aGUgZW5kIG9mIHRoaXMgcGFnZSB5b3UgY2FuIGZpbmQgYSB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciNjdXN0b20tY29udHJvbC1leGFtcGxlCiAqIGN1c3RvbSBjb250cm9sIGV4YW1wbGV9IHRoYXQgdXNlcyBgbmdNb2RlbENvbnRyb2xsZXJgIHRvIGJpbmQgdG8gYGNvbnRlbnRlZGl0YWJsZWAgZWxlbWVudHMuCiAqCiAqIEBleGFtcGxlCiAqICMjIyBDdXN0b20gQ29udHJvbCBFeGFtcGxlCiAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBOZ01vZGVsQ29udHJvbGxlcmAgd2l0aCBhIGN1c3RvbSBjb250cm9sIHRvIGFjaGlldmUKICogZGF0YS1iaW5kaW5nLiBOb3RpY2UgaG93IGRpZmZlcmVudCBkaXJlY3RpdmVzIChgY29udGVudGVkaXRhYmxlYCwgYG5nLW1vZGVsYCwgYW5kIGByZXF1aXJlZGApCiAqIGNvbGxhYm9yYXRlIHRvZ2V0aGVyIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgcmVzdWx0LgogKgogKiBOb3RlIHRoYXQgYGNvbnRlbnRlZGl0YWJsZWAgaXMgYW4gSFRNTDUgYXR0cmlidXRlLCB3aGljaCB0ZWxscyB0aGUgYnJvd3NlciB0byBsZXQgdGhlIGVsZW1lbnQKICogY29udGVudHMgYmUgZWRpdGVkIGluIHBsYWNlIGJ5IHRoZSB1c2VyLiAgVGhpcyB3aWxsIG5vdCB3b3JrIG9uIG9sZGVyIGJyb3dzZXJzLgogKgogKiBXZSBhcmUgdXNpbmcgdGhlIHtAbGluayBuZy5zZXJ2aWNlOiRzY2UgJHNjZX0gc2VydmljZSBoZXJlIGFuZCBpbmNsdWRlIHRoZSB7QGxpbmsgbmdTYW5pdGl6ZSAkc2FuaXRpemV9CiAqIG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IHJlbW92ZSAiYmFkIiBjb250ZW50IGxpa2UgaW5saW5lIGV2ZW50IGxpc3RlbmVyIChlLmcuIGA8c3BhbiBvbmNsaWNrPSIuLi4iPmApLgogKiBIb3dldmVyLCBhcyB3ZSBhcmUgdXNpbmcgYCRzY2VgIHRoZSBtb2RlbCBjYW4gc3RpbGwgZGVjaWRlIHRvIHByb3ZpZGUgdW5zYWZlIGNvbnRlbnQgaWYgaXQgbWFya3MKICogdGhhdCBjb250ZW50IHVzaW5nIHRoZSBgJHNjZWAgc2VydmljZS4KICoKICogPGV4YW1wbGUgbmFtZT0iTmdNb2RlbENvbnRyb2xsZXIiIG1vZHVsZT0iY3VzdG9tQ29udHJvbCIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+CiAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgogICAgICBbY29udGVudGVkaXRhYmxlXSB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgbWluLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgLm5nLWludmFsaWQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZDsKICAgICAgfQoKICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CiAgICAgIGFuZ3VsYXIubW9kdWxlKCdjdXN0b21Db250cm9sJywgWyduZ1Nhbml0aXplJ10pLgogICAgICAgIGRpcmVjdGl2ZSgnY29udGVudGVkaXRhYmxlJywgWyckc2NlJywgZnVuY3Rpb24oJHNjZSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywgLy8gb25seSBhY3RpdmF0ZSBvbiBlbGVtZW50IGF0dHJpYnV0ZQogICAgICAgICAgICByZXF1aXJlOiAnP25nTW9kZWwnLCAvLyBnZXQgYSBob2xkIG9mIE5nTW9kZWxDb250cm9sbGVyCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgbmdNb2RlbCkgewogICAgICAgICAgICAgIGlmICghbmdNb2RlbCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nIGlmIG5vIG5nLW1vZGVsCgogICAgICAgICAgICAgIC8vIFNwZWNpZnkgaG93IFVJIHNob3VsZCBiZSB1cGRhdGVkCiAgICAgICAgICAgICAgbmdNb2RlbC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50Lmh0bWwoJHNjZS5nZXRUcnVzdGVkSHRtbChuZ01vZGVsLiR2aWV3VmFsdWUgfHwgJycpKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZSBldmVudHMgdG8gZW5hYmxlIGJpbmRpbmcKICAgICAgICAgICAgICBlbGVtZW50Lm9uKCdibHVyIGtleXVwIGNoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgc2NvcGUuJGV2YWxBc3luYyhyZWFkKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICByZWFkKCk7IC8vIGluaXRpYWxpemUKCiAgICAgICAgICAgICAgLy8gV3JpdGUgZGF0YSB0byB0aGUgbW9kZWwKICAgICAgICAgICAgICBmdW5jdGlvbiByZWFkKCkgewogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBlbGVtZW50Lmh0bWwoKTsKICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgY2xlYXIgdGhlIGNvbnRlbnQgZWRpdGFibGUgdGhlIGJyb3dzZXIgbGVhdmVzIGEgPGJyPiBiZWhpbmQKICAgICAgICAgICAgICAgIC8vIElmIHN0cmlwLWJyIGF0dHJpYnV0ZSBpcyBwcm92aWRlZCB0aGVuIHdlIHN0cmlwIHRoaXMgb3V0CiAgICAgICAgICAgICAgICBpZiAoIGF0dHJzLnN0cmlwQnIgJiYgaHRtbCA9PSAnPGJyPicgKSB7CiAgICAgICAgICAgICAgICAgIGh0bWwgPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5nTW9kZWwuJHNldFZpZXdWYWx1ZShodG1sKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgfV0pOwogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSI+CiAgICAgICA8ZGl2IGNvbnRlbnRlZGl0YWJsZQogICAgICAgICAgICBuYW1lPSJteVdpZGdldCIgbmctbW9kZWw9InVzZXJDb250ZW50IgogICAgICAgICAgICBzdHJpcC1icj0idHJ1ZSIKICAgICAgICAgICAgcmVxdWlyZWQ+Q2hhbmdlIG1lITwvZGl2PgogICAgICAgIDxzcGFuIG5nLXNob3c9Im15Rm9ybS5teVdpZGdldC4kZXJyb3IucmVxdWlyZWQiPlJlcXVpcmVkITwvc3Bhbj4KICAgICAgIDxocj4KICAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD0idXNlckNvbnRlbnQiPjwvdGV4dGFyZWE+CiAgICAgIDwvZm9ybT4KICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgaXQoJ3Nob3VsZCBkYXRhLWJpbmQgYW5kIGJlY29tZSBpbnZhbGlkJywgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdzYWZhcmknIHx8IGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgPT0gJ2ZpcmVmb3gnKSB7CiAgICAgICAgLy8gU2FmYXJpRHJpdmVyIGNhbid0IGhhbmRsZSBjb250ZW50ZWRpdGFibGUKICAgICAgICAvLyBhbmQgRmlyZWZveCBkcml2ZXIgY2FuJ3QgY2xlYXIgY29udGVudGVkaXRhYmxlcyB2ZXJ5IHdlbGwKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGNvbnRlbnRFZGl0YWJsZSA9IGVsZW1lbnQoYnkuY3NzKCdbY29udGVudGVkaXRhYmxlXScpKTsKICAgICAgdmFyIGNvbnRlbnQgPSAnQ2hhbmdlIG1lISc7CgogICAgICBleHBlY3QoY29udGVudEVkaXRhYmxlLmdldFRleHQoKSkudG9FcXVhbChjb250ZW50KTsKCiAgICAgIGNvbnRlbnRFZGl0YWJsZS5jbGVhcigpOwogICAgICBjb250ZW50RWRpdGFibGUuc2VuZEtleXMocHJvdHJhY3Rvci5LZXkuQkFDS19TUEFDRSk7CiAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0VGV4dCgpKS50b0VxdWFsKCcnKTsKICAgICAgZXhwZWN0KGNvbnRlbnRFZGl0YWJsZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvTWF0Y2goL25nLWludmFsaWQtcmVxdWlyZWQvKTsKICAgIH0pOwogICAgPC9maWxlPgogKiA8L2V4YW1wbGU+CiAqCiAqCiAqLwp2YXIgTmdNb2RlbENvbnRyb2xsZXIgPSBbJyRzY29wZScsICckZXhjZXB0aW9uSGFuZGxlcicsICckYXR0cnMnLCAnJGVsZW1lbnQnLCAnJHBhcnNlJywgJyRhbmltYXRlJywgJyR0aW1lb3V0JywgJyRyb290U2NvcGUnLCAnJHEnLCAnJGludGVycG9sYXRlJywKICAgIGZ1bmN0aW9uKCRzY29wZSwgJGV4Y2VwdGlvbkhhbmRsZXIsICRhdHRyLCAkZWxlbWVudCwgJHBhcnNlLCAkYW5pbWF0ZSwgJHRpbWVvdXQsICRyb290U2NvcGUsICRxLCAkaW50ZXJwb2xhdGUpIHsKICB0aGlzLiR2aWV3VmFsdWUgPSBOdW1iZXIuTmFOOwogIHRoaXMuJG1vZGVsVmFsdWUgPSBOdW1iZXIuTmFOOwogIHRoaXMuJCRyYXdNb2RlbFZhbHVlID0gdW5kZWZpbmVkOyAvLyBzdG9yZXMgdGhlIHBhcnNlZCBtb2RlbFZhbHVlIC8gbW9kZWwgc2V0IGZyb20gc2NvcGUgcmVnYXJkbGVzcyBvZiB2YWxpZGl0eS4KICB0aGlzLiR2YWxpZGF0b3JzID0ge307CiAgdGhpcy4kYXN5bmNWYWxpZGF0b3JzID0ge307CiAgdGhpcy4kcGFyc2VycyA9IFtdOwogIHRoaXMuJGZvcm1hdHRlcnMgPSBbXTsKICB0aGlzLiR2aWV3Q2hhbmdlTGlzdGVuZXJzID0gW107CiAgdGhpcy4kdW50b3VjaGVkID0gdHJ1ZTsKICB0aGlzLiR0b3VjaGVkID0gZmFsc2U7CiAgdGhpcy4kcHJpc3RpbmUgPSB0cnVlOwogIHRoaXMuJGRpcnR5ID0gZmFsc2U7CiAgdGhpcy4kdmFsaWQgPSB0cnVlOwogIHRoaXMuJGludmFsaWQgPSBmYWxzZTsKICB0aGlzLiRlcnJvciA9IHt9OyAvLyBrZWVwIGludmFsaWQga2V5cyBoZXJlCiAgdGhpcy4kJHN1Y2Nlc3MgPSB7fTsgLy8ga2VlcCB2YWxpZCBrZXlzIGhlcmUKICB0aGlzLiRwZW5kaW5nID0gdW5kZWZpbmVkOyAvLyBrZWVwIHBlbmRpbmcga2V5cyBoZXJlCiAgdGhpcy4kbmFtZSA9ICRpbnRlcnBvbGF0ZSgkYXR0ci5uYW1lIHx8ICcnLCBmYWxzZSkoJHNjb3BlKTsKCgogIHZhciBwYXJzZWROZ01vZGVsID0gJHBhcnNlKCRhdHRyLm5nTW9kZWwpLAogICAgICBwYXJzZWROZ01vZGVsQXNzaWduID0gcGFyc2VkTmdNb2RlbC5hc3NpZ24sCiAgICAgIG5nTW9kZWxHZXQgPSBwYXJzZWROZ01vZGVsLAogICAgICBuZ01vZGVsU2V0ID0gcGFyc2VkTmdNb2RlbEFzc2lnbiwKICAgICAgcGVuZGluZ0RlYm91bmNlID0gbnVsbCwKICAgICAgY3RybCA9IHRoaXM7CgogIHRoaXMuJCRzZXRPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgY3RybC4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdldHRlclNldHRlcikgewogICAgICB2YXIgaW52b2tlTW9kZWxHZXR0ZXIgPSAkcGFyc2UoJGF0dHIubmdNb2RlbCArICcoKScpLAogICAgICAgICAgaW52b2tlTW9kZWxTZXR0ZXIgPSAkcGFyc2UoJGF0dHIubmdNb2RlbCArICcoJCQkcCknKTsKCiAgICAgIG5nTW9kZWxHZXQgPSBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICB2YXIgbW9kZWxWYWx1ZSA9IHBhcnNlZE5nTW9kZWwoJHNjb3BlKTsKICAgICAgICBpZiAoaXNGdW5jdGlvbihtb2RlbFZhbHVlKSkgewogICAgICAgICAgbW9kZWxWYWx1ZSA9IGludm9rZU1vZGVsR2V0dGVyKCRzY29wZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtb2RlbFZhbHVlOwogICAgICB9OwogICAgICBuZ01vZGVsU2V0ID0gZnVuY3Rpb24oJHNjb3BlLCBuZXdWYWx1ZSkgewogICAgICAgIGlmIChpc0Z1bmN0aW9uKHBhcnNlZE5nTW9kZWwoJHNjb3BlKSkpIHsKICAgICAgICAgIGludm9rZU1vZGVsU2V0dGVyKCRzY29wZSwgeyQkJHA6IGN0cmwuJG1vZGVsVmFsdWV9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFyc2VkTmdNb2RlbEFzc2lnbigkc2NvcGUsIGN0cmwuJG1vZGVsVmFsdWUpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSBpZiAoIXBhcnNlZE5nTW9kZWwuYXNzaWduKSB7CiAgICAgIHRocm93ICRuZ01vZGVsTWluRXJyKCdub25hc3NpZ24nLCAiRXhwcmVzc2lvbiAnezB9JyBpcyBub24tYXNzaWduYWJsZS4gRWxlbWVudDogezF9IiwKICAgICAgICAgICRhdHRyLm5nTW9kZWwsIHN0YXJ0aW5nVGFnKCRlbGVtZW50KSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHJlbmRlcgogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZXcgbmVlZHMgdG8gYmUgdXBkYXRlZC4gSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgdXNlciBvZiB0aGUgbmctbW9kZWwKICAgKiBkaXJlY3RpdmUgd2lsbCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCiAgICoKICAgKiBUaGUgYCRyZW5kZXIoKWAgbWV0aG9kIGlzIGludm9rZWQgaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgogICAqCiAgICogKiBgJHJvbGxiYWNrVmlld1ZhbHVlKClgIGlzIGNhbGxlZC4gIElmIHdlIGFyZSByb2xsaW5nIGJhY2sgdGhlIHZpZXcgdmFsdWUgdG8gdGhlIGxhc3QKICAgKiAgIGNvbW1pdHRlZCB2YWx1ZSB0aGVuIGAkcmVuZGVyKClgIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIGlucHV0IGNvbnRyb2wuCiAgICogKiBUaGUgdmFsdWUgcmVmZXJlbmNlZCBieSBgbmctbW9kZWxgIGlzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseSBhbmQgYm90aCB0aGUgYCRtb2RlbFZhbHVlYCBhbmQKICAgKiAgIHRoZSBgJHZpZXdWYWx1ZWAgYXJlIGRpZmZlcmVudCB0byBsYXN0IHRpbWUuCiAgICoKICAgKiBTaW5jZSBgbmctbW9kZWxgIGRvZXMgbm90IGRvIGEgZGVlcCB3YXRjaCwgYCRyZW5kZXIoKWAgaXMgb25seSBpbnZva2VkIGlmIHRoZSB2YWx1ZXMgb2YKICAgKiBgJG1vZGVsVmFsdWVgIGFuZCBgJHZpZXdWYWx1ZWAgYXJlIGFjdHVhbGx5IGRpZmZlcmVudCB0byB0aGVpciBwcmV2aW91cyB2YWx1ZS4gSWYgYCRtb2RlbFZhbHVlYAogICAqIG9yIGAkdmlld1ZhbHVlYCBhcmUgb2JqZWN0cyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb3IgbnVtYmVyKSB0aGVuIGAkcmVuZGVyKClgIHdpbGwgbm90IGJlCiAgICogaW52b2tlZCBpZiB5b3Ugb25seSBjaGFuZ2UgYSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0cy4KICAgKi8KICB0aGlzLiRyZW5kZXIgPSBub29wOwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkaXNFbXB0eQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgaXMgZW1wdHkuCiAgICoKICAgKiBGb3IgaW5zdGFuY2UsIHRoZSByZXF1aXJlZCBkaXJlY3RpdmUgZG9lcyB0aGlzIHRvIHdvcmsgb3V0IGlmIHRoZSBpbnB1dCBoYXMgZGF0YSBvciBub3QuCiAgICoKICAgKiBUaGUgZGVmYXVsdCBgJGlzRW1wdHlgIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgYCcnYCwgYG51bGxgIG9yIGBOYU5gLgogICAqCiAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIGZvciBpbnB1dCBkaXJlY3RpdmVzIHdob3NlIGNvbmNlcHQgb2YgYmVpbmcgZW1wdHkgaXMgZGlmZmVyZW50IHRvIHRoZQogICAqIGRlZmF1bHQuIFRoZSBgY2hlY2tib3hJbnB1dFR5cGVgIGRpcmVjdGl2ZSBkb2VzIHRoaXMgYmVjYXVzZSBpbiBpdHMgY2FzZSBhIHZhbHVlIG9mIGBmYWxzZWAKICAgKiBpbXBsaWVzIGVtcHR5LgogICAqCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGlucHV0IHRvIGNoZWNrIGZvciBlbXB0aW5lc3MuCiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyAiZW1wdHkiLgogICAqLwogIHRoaXMuJGlzRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlOwogIH07CgogIHZhciBwYXJlbnRGb3JtID0gJGVsZW1lbnQuaW5oZXJpdGVkRGF0YSgnJGZvcm1Db250cm9sbGVyJykgfHwgbnVsbEZvcm1DdHJsLAogICAgICBjdXJyZW50VmFsaWRhdGlvblJ1bklkID0gMDsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFZhbGlkaXR5CiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBDaGFuZ2UgdGhlIHZhbGlkaXR5IHN0YXRlLCBhbmQgbm90aWZ5IHRoZSBmb3JtLgogICAqCiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aXRoaW4gJHBhcnNlcnMvJGZvcm1hdHRlcnMgb3IgYSBjdXN0b20gdmFsaWRhdGlvbiBpbXBsZW1lbnRhdGlvbi4KICAgKiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGl0IHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIHVzZSB0aGUgYG5nTW9kZWwuJHZhbGlkYXRvcnNgIGFuZAogICAqIGBuZ01vZGVsLiRhc3luY1ZhbGlkYXRvcnNgIGNvbGxlY3Rpb25zIHdoaWNoIHdpbGwgY2FsbCBgJHNldFZhbGlkaXR5YCBhdXRvbWF0aWNhbGx5LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRpb25FcnJvcktleSBOYW1lIG9mIHRoZSB2YWxpZGF0b3IuIFRoZSBgdmFsaWRhdGlvbkVycm9yS2V5YCB3aWxsIGJlIGFzc2lnbmVkCiAgICogICAgICAgIHRvIGVpdGhlciBgJGVycm9yW3ZhbGlkYXRpb25FcnJvcktleV1gIG9yIGAkcGVuZGluZ1t2YWxpZGF0aW9uRXJyb3JLZXldYAogICAqICAgICAgICAoZm9yIHVuZnVsZmlsbGVkIGAkYXN5bmNWYWxpZGF0b3JzYCksIHNvIHRoYXQgaXQgaXMgYXZhaWxhYmxlIGZvciBkYXRhLWJpbmRpbmcuCiAgICogICAgICAgIFRoZSBgdmFsaWRhdGlvbkVycm9yS2V5YCBzaG91bGQgYmUgaW4gY2FtZWxDYXNlIGFuZCB3aWxsIGdldCBjb252ZXJ0ZWQgaW50byBkYXNoLWNhc2UKICAgKiAgICAgICAgZm9yIGNsYXNzIG5hbWUuIEV4YW1wbGU6IGBteUVycm9yYCB3aWxsIHJlc3VsdCBpbiBgbmctdmFsaWQtbXktZXJyb3JgIGFuZCBgbmctaW52YWxpZC1teS1lcnJvcmAKICAgKiAgICAgICAgY2xhc3MgYW5kIGNhbiBiZSBib3VuZCB0byBhcyAgYHt7c29tZUZvcm0uc29tZUNvbnRyb2wuJGVycm9yLm15RXJyb3J9fWAgLgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNWYWxpZCBXaGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIGlzIHZhbGlkICh0cnVlKSwgaW52YWxpZCAoZmFsc2UpLCBwZW5kaW5nICh1bmRlZmluZWQpLAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBza2lwcGVkIChudWxsKS4gUGVuZGluZyBpcyB1c2VkIGZvciB1bmZ1bGZpbGxlZCBgJGFzeW5jVmFsaWRhdG9yc2AuCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBwZWQgaXMgdXNlZCBieSBBbmd1bGFyIHdoZW4gdmFsaWRhdG9ycyBkbyBub3QgcnVuIGJlY2F1c2Ugb2YgcGFyc2UgZXJyb3JzIGFuZAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGAkYXN5bmNWYWxpZGF0b3JzYCBkbyBub3QgcnVuIGJlY2F1c2UgYW55IG9mIHRoZSBgJHZhbGlkYXRvcnNgIGZhaWxlZC4KICAgKi8KICBhZGRTZXRWYWxpZGl0eU1ldGhvZCh7CiAgICBjdHJsOiB0aGlzLAogICAgJGVsZW1lbnQ6ICRlbGVtZW50LAogICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7CiAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSB0cnVlOwogICAgfSwKICAgIHVuc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7CiAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldOwogICAgfSwKICAgIHBhcmVudEZvcm06IHBhcmVudEZvcm0sCiAgICAkYW5pbWF0ZTogJGFuaW1hdGUKICB9KTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFByaXN0aW5lCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS4KICAgKgogICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBgbmctZGlydHlgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzIHByaXN0aW5lCiAgICogc3RhdGUgKGBuZy1wcmlzdGluZWAgY2xhc3MpLiBBIG1vZGVsIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJpc3RpbmUgd2hlbiB0aGUgY29udHJvbAogICAqIGhhcyBub3QgYmVlbiBjaGFuZ2VkIGZyb20gd2hlbiBmaXJzdCBjb21waWxlZC4KICAgKi8KICB0aGlzLiRzZXRQcmlzdGluZSA9IGZ1bmN0aW9uKCkgewogICAgY3RybC4kZGlydHkgPSBmYWxzZTsKICAgIGN0cmwuJHByaXN0aW5lID0gdHJ1ZTsKICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKCRlbGVtZW50LCBESVJUWV9DTEFTUyk7CiAgICAkYW5pbWF0ZS5hZGRDbGFzcygkZWxlbWVudCwgUFJJU1RJTkVfQ0xBU1MpOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXREaXJ0eQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogU2V0cyB0aGUgY29udHJvbCB0byBpdHMgZGlydHkgc3RhdGUuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgYG5nLXByaXN0aW5lYCBjbGFzcyBhbmQgc2V0IHRoZSBjb250cm9sIHRvIGl0cyBkaXJ0eQogICAqIHN0YXRlIChgbmctZGlydHlgIGNsYXNzKS4gQSBtb2RlbCBpcyBjb25zaWRlcmVkIHRvIGJlIGRpcnR5IHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gY2hhbmdlZAogICAqIGZyb20gd2hlbiBmaXJzdCBjb21waWxlZC4KICAgKi8KICB0aGlzLiRzZXREaXJ0eSA9IGZ1bmN0aW9uKCkgewogICAgY3RybC4kZGlydHkgPSB0cnVlOwogICAgY3RybC4kcHJpc3RpbmUgPSBmYWxzZTsKICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKCRlbGVtZW50LCBQUklTVElORV9DTEFTUyk7CiAgICAkYW5pbWF0ZS5hZGRDbGFzcygkZWxlbWVudCwgRElSVFlfQ0xBU1MpOwogICAgcGFyZW50Rm9ybS4kc2V0RGlydHkoKTsKICB9OwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0VW50b3VjaGVkCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyB1bnRvdWNoZWQgc3RhdGUuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgYG5nLXRvdWNoZWRgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzCiAgICogdW50b3VjaGVkIHN0YXRlIChgbmctdW50b3VjaGVkYCBjbGFzcykuIFVwb24gY29tcGlsYXRpb24sIGEgbW9kZWwgaXMgc2V0IGFzIHVudG91Y2hlZAogICAqIGJ5IGRlZmF1bHQsIGhvd2V2ZXIgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoYXQgc3RhdGUgaWYgdGhlIG1vZGVsIGhhcwogICAqIGFscmVhZHkgYmVlbiB0b3VjaGVkIGJ5IHRoZSB1c2VyLgogICAqLwogIHRoaXMuJHNldFVudG91Y2hlZCA9IGZ1bmN0aW9uKCkgewogICAgY3RybC4kdG91Y2hlZCA9IGZhbHNlOwogICAgY3RybC4kdW50b3VjaGVkID0gdHJ1ZTsKICAgICRhbmltYXRlLnNldENsYXNzKCRlbGVtZW50LCBVTlRPVUNIRURfQ0xBU1MsIFRPVUNIRURfQ0xBU1MpOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRUb3VjaGVkCiAgICoKICAgKiBAZGVzY3JpcHRpb24KICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyB0b3VjaGVkIHN0YXRlLgogICAqCiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGBuZy11bnRvdWNoZWRgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzCiAgICogdG91Y2hlZCBzdGF0ZSAoYG5nLXRvdWNoZWRgIGNsYXNzKS4gQSBtb2RlbCBpcyBjb25zaWRlcmVkIHRvIGJlIHRvdWNoZWQgd2hlbiB0aGUgdXNlciBoYXMKICAgKiBmaXJzdCBmb2N1c2VkIHRoZSBjb250cm9sIGVsZW1lbnQgYW5kIHRoZW4gc2hpZnRlZCBmb2N1cyBhd2F5IGZyb20gdGhlIGNvbnRyb2wgKGJsdXIgZXZlbnQpLgogICAqLwogIHRoaXMuJHNldFRvdWNoZWQgPSBmdW5jdGlvbigpIHsKICAgIGN0cmwuJHRvdWNoZWQgPSB0cnVlOwogICAgY3RybC4kdW50b3VjaGVkID0gZmFsc2U7CiAgICAkYW5pbWF0ZS5zZXRDbGFzcygkZWxlbWVudCwgVE9VQ0hFRF9DTEFTUywgVU5UT1VDSEVEX0NMQVNTKTsKICB9OwoKICAvKioKICAgKiBAbmdkb2MgbWV0aG9kCiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkcm9sbGJhY2tWaWV3VmFsdWUKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIENhbmNlbCBhbiB1cGRhdGUgYW5kIHJlc2V0IHRoZSBpbnB1dCBlbGVtZW50J3MgdmFsdWUgdG8gcHJldmVudCBhbiB1cGRhdGUgdG8gdGhlIGAkbW9kZWxWYWx1ZWAsCiAgICogd2hpY2ggbWF5IGJlIGNhdXNlZCBieSBhIHBlbmRpbmcgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZQogICAqIGZ1dHVyZSBldmVudC4KICAgKgogICAqIElmIHlvdSBoYXZlIGFuIGlucHV0IHRoYXQgdXNlcyBgbmctbW9kZWwtb3B0aW9uc2AgdG8gc2V0IHVwIGRlYm91bmNlZCBldmVudHMgb3IgZXZlbnRzIHN1Y2gKICAgKiBhcyBibHVyIHlvdSBjYW4gaGF2ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGVyZSBpcyBhIHBlcmlvZCB3aGVuIHRoZSBgJHZpZXdWYWx1ZWAKICAgKiBpcyBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgbmdNb2RlbCdzIGAkbW9kZWxWYWx1ZWAuCiAgICoKICAgKiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gcnVuIGludG8gZGlmZmljdWx0aWVzIGlmIHlvdSB0cnkgdG8gdXBkYXRlIHRoZSBuZ01vZGVsJ3MgYCRtb2RlbFZhbHVlYAogICAqIHByb2dyYW1tYXRpY2FsbHkgYmVmb3JlIHRoZXNlIGRlYm91bmNlZC9mdXR1cmUgZXZlbnRzIGhhdmUgcmVzb2x2ZWQvb2NjdXJyZWQsIGJlY2F1c2UgQW5ndWxhcidzCiAgICogZGlydHkgY2hlY2tpbmcgbWVjaGFuaXNtIGlzIG5vdCBhYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgbW9kZWwgaGFzIGFjdHVhbGx5IGNoYW5nZWQgb3Igbm90LgogICAqCiAgICogVGhlIGAkcm9sbGJhY2tWaWV3VmFsdWUoKWAgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHByb2dyYW1tYXRpY2FsbHkgY2hhbmdpbmcgdGhlIG1vZGVsIG9mIGFuCiAgICogaW5wdXQgd2hpY2ggbWF5IGhhdmUgc3VjaCBldmVudHMgcGVuZGluZy4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCiAgICogaW5wdXQgZmllbGQgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIG5ldyBtb2RlbCB2YWx1ZSBhbmQgYW55IHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgY2FuY2VsbGVkLgogICAqCiAgICogPGV4YW1wbGUgbmFtZT0ibmctbW9kZWwtY2FuY2VsLXVwZGF0ZSIgbW9kdWxlPSJjYW5jZWwtdXBkYXRlLWV4YW1wbGUiPgogICAqICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4KICAgKiAgICAgYW5ndWxhci5tb2R1bGUoJ2NhbmNlbC11cGRhdGUtZXhhbXBsZScsIFtdKQogICAqCiAgICogICAgIC5jb250cm9sbGVyKCdDYW5jZWxVcGRhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgKiAgICAgICAkc2NvcGUucmVzZXRXaXRoQ2FuY2VsID0gZnVuY3Rpb24oZSkgewogICAqICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAyNykgewogICAqICAgICAgICAgICAkc2NvcGUubXlGb3JtLm15SW5wdXQxLiRyb2xsYmFja1ZpZXdWYWx1ZSgpOwogICAqICAgICAgICAgICAkc2NvcGUubXlWYWx1ZSA9ICcnOwogICAqICAgICAgICAgfQogICAqICAgICAgIH07CiAgICogICAgICAgJHNjb3BlLnJlc2V0V2l0aG91dENhbmNlbCA9IGZ1bmN0aW9uKGUpIHsKICAgKiAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMjcpIHsKICAgKiAgICAgICAgICAgJHNjb3BlLm15VmFsdWUgPSAnJzsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9OwogICAqICAgICB9XSk7CiAgICogICA8L2ZpbGU+CiAgICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJDYW5jZWxVcGRhdGVDb250cm9sbGVyIj4KICAgKiAgICAgICA8cD5UcnkgdHlwaW5nIHNvbWV0aGluZyBpbiBlYWNoIGlucHV0LiAgU2VlIHRoYXQgdGhlIG1vZGVsIG9ubHkgdXBkYXRlcyB3aGVuIHlvdQogICAqICAgICAgICAgIGJsdXIgb2ZmIHRoZSBpbnB1dC4KICAgKiAgICAgICAgPC9wPgogICAqICAgICAgICA8cD5Ob3cgc2VlIHdoYXQgaGFwcGVucyBpZiB5b3Ugc3RhcnQgdHlwaW5nIHRoZW4gcHJlc3MgdGhlIEVzY2FwZSBrZXk8L3A+CiAgICoKICAgKiAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLW1vZGVsLW9wdGlvbnM9InsgdXBkYXRlT246ICdibHVyJyB9Ij4KICAgKiAgICAgICAgIDxwPldpdGggJHJvbGxiYWNrVmlld1ZhbHVlKCk8L3A+CiAgICogICAgICAgICA8aW5wdXQgbmFtZT0ibXlJbnB1dDEiIG5nLW1vZGVsPSJteVZhbHVlIiBuZy1rZXlkb3duPSJyZXNldFdpdGhDYW5jZWwoJGV2ZW50KSI+PGJyLz4KICAgKiAgICAgICAgIG15VmFsdWU6ICJ7eyBteVZhbHVlIH19IgogICAqCiAgICogICAgICAgICA8cD5XaXRob3V0ICRyb2xsYmFja1ZpZXdWYWx1ZSgpPC9wPgogICAqICAgICAgICAgPGlucHV0IG5hbWU9Im15SW5wdXQyIiBuZy1tb2RlbD0ibXlWYWx1ZSIgbmcta2V5ZG93bj0icmVzZXRXaXRob3V0Q2FuY2VsKCRldmVudCkiPjxici8+CiAgICogICAgICAgICBteVZhbHVlOiAie3sgbXlWYWx1ZSB9fSIKICAgKiAgICAgICA8L2Zvcm0+CiAgICogICAgIDwvZGl2PgogICAqICAgPC9maWxlPgogICAqIDwvZXhhbXBsZT4KICAgKi8KICB0aGlzLiRyb2xsYmFja1ZpZXdWYWx1ZSA9IGZ1bmN0aW9uKCkgewogICAgJHRpbWVvdXQuY2FuY2VsKHBlbmRpbmdEZWJvdW5jZSk7CiAgICBjdHJsLiR2aWV3VmFsdWUgPSBjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTsKICAgIGN0cmwuJHJlbmRlcigpOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2YWxpZGF0ZQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogUnVucyBlYWNoIG9mIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMgKGZpcnN0IHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgYW5kIHRoZW4KICAgKiBhc3luY2hyb25vdXMgdmFsaWRhdG9ycykuCiAgICogSWYgdGhlIHZhbGlkaXR5IGNoYW5nZXMgdG8gaW52YWxpZCwgdGhlIG1vZGVsIHdpbGwgYmUgc2V0IHRvIGB1bmRlZmluZWRgLAogICAqIHVubGVzcyB7QGxpbmsgbmdNb2RlbE9wdGlvbnMgYG5nTW9kZWxPcHRpb25zLmFsbG93SW52YWxpZGB9IGlzIGB0cnVlYC4KICAgKiBJZiB0aGUgdmFsaWRpdHkgY2hhbmdlcyB0byB2YWxpZCwgaXQgd2lsbCBzZXQgdGhlIG1vZGVsIHRvIHRoZSBsYXN0IGF2YWlsYWJsZSB2YWxpZAogICAqIG1vZGVsVmFsdWUsIGkuZS4gZWl0aGVyIHRoZSBsYXN0IHBhcnNlZCB2YWx1ZSBvciB0aGUgbGFzdCB2YWx1ZSBzZXQgZnJvbSB0aGUgc2NvcGUuCiAgICovCiAgdGhpcy4kdmFsaWRhdGUgPSBmdW5jdGlvbigpIHsKICAgIC8vIGlnbm9yZSAkdmFsaWRhdGUgYmVmb3JlIG1vZGVsIGlzIGluaXRpYWxpemVkCiAgICBpZiAoaXNOdW1iZXIoY3RybC4kbW9kZWxWYWx1ZSkgJiYgaXNOYU4oY3RybC4kbW9kZWxWYWx1ZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB2aWV3VmFsdWUgPSBjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTsKICAgIC8vIE5vdGU6IHdlIHVzZSB0aGUgJCRyYXdNb2RlbFZhbHVlIGFzICRtb2RlbFZhbHVlIG1pZ2h0IGhhdmUgYmVlbgogICAgLy8gc2V0IHRvIHVuZGVmaW5lZCBkdXJpbmcgYSB2aWV3IC0+IG1vZGVsIHVwZGF0ZSB0aGF0IGZvdW5kIHZhbGlkYXRpb24KICAgIC8vIGVycm9ycy4gV2UgY2FuJ3QgcGFyc2UgdGhlIHZpZXcgaGVyZSwgc2luY2UgdGhhdCBjb3VsZCBjaGFuZ2UKICAgIC8vIHRoZSBtb2RlbCBhbHRob3VnaCBuZWl0aGVyIHZpZXdWYWx1ZSBub3IgdGhlIG1vZGVsIG9uIHRoZSBzY29wZSBjaGFuZ2VkCiAgICB2YXIgbW9kZWxWYWx1ZSA9IGN0cmwuJCRyYXdNb2RlbFZhbHVlOwoKICAgIC8vIENoZWNrIGlmIHRoZSB0aGVyZSdzIGEgcGFyc2UgZXJyb3IsIHNvIHdlIGRvbid0IHVuc2V0IGl0IGFjY2lkZW50aWFsbHkKICAgIHZhciBwYXJzZXJOYW1lID0gY3RybC4kJHBhcnNlck5hbWUgfHwgJ3BhcnNlJzsKICAgIHZhciBwYXJzZXJWYWxpZCA9IGN0cmwuJGVycm9yW3BhcnNlck5hbWVdID8gZmFsc2UgOiB1bmRlZmluZWQ7CgogICAgdmFyIHByZXZWYWxpZCA9IGN0cmwuJHZhbGlkOwogICAgdmFyIHByZXZNb2RlbFZhbHVlID0gY3RybC4kbW9kZWxWYWx1ZTsKCiAgICB2YXIgYWxsb3dJbnZhbGlkID0gY3RybC4kb3B0aW9ucyAmJiBjdHJsLiRvcHRpb25zLmFsbG93SW52YWxpZDsKCiAgICBjdHJsLiQkcnVuVmFsaWRhdG9ycyhwYXJzZXJWYWxpZCwgbW9kZWxWYWx1ZSwgdmlld1ZhbHVlLCBmdW5jdGlvbihhbGxWYWxpZCkgewogICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gY2hhbmdlIGluIHZhbGlkaXR5LCBkb24ndCB1cGRhdGUgdGhlIG1vZGVsCiAgICAgIC8vIFRoaXMgcHJldmVudHMgY2hhbmdpbmcgYW4gaW52YWxpZCBtb2RlbFZhbHVlIHRvIHVuZGVmaW5lZAogICCM3O9W3ZcCAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/81H1AAEAGtpfAqAdgwKgHNh/1lSJBvXTYWHp804AYAVOv1QAAAQEICgBNpcsAo17PICAgaWYgKCFhbGxvd0ludmFsaWQgJiYgcHJldlZhbGlkICE9PSBhbGxWYWxpZCkgewogICAgICAgIC8vIE5vdGU6IERvbid0IGNoZWNrIGN0cmwuJHZhbGlkIGhlcmUsIGFzIHdlIGNvdWxkIGhhdmUKICAgICAgICAvLyBleHRlcm5hbCB2YWxpZGF0b3JzIChlLmcuIGNhbGN1bGF0ZWQgb24gdGhlIHNlcnZlciksCiAgICAgICAgLy8gdGhhdCBqdXN0IGNhbGwgJHNldFZhbGlkaXR5IGFuZCBuZWVkIHRoZSBtb2RlbCB2YWx1ZQogICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGVpciB2YWxpZGl0eS4KICAgICAgICBjdHJsLiRtb2RlbFZhbHVlID0gYWxsVmFsaWQgPyBtb2RlbFZhbHVlIDogdW5kZWZpbmVkOwoKICAgICAgICBpZiAoY3RybC4kbW9kZWxWYWx1ZSAhPT0gcHJldk1vZGVsVmFsdWUpIHsKICAgICAgICAgIGN0cmwuJCR3cml0ZU1vZGVsVG9TY29wZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogIH07CgogIHRoaXMuJCRydW5WYWxpZGF0b3JzID0gZnVuY3Rpb24ocGFyc2VWYWxpZCwgbW9kZWxWYWx1ZSwgdmlld1ZhbHVlLCBkb25lQ2FsbGJhY2spIHsKICAgIGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQrKzsKICAgIHZhciBsb2NhbFZhbGlkYXRpb25SdW5JZCA9IGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQ7CgogICAgLy8gY2hlY2sgcGFyc2VyIGVycm9yCiAgICBpZiAoIXByb2Nlc3NQYXJzZUVycm9ycyhwYXJzZVZhbGlkKSkgewogICAgICB2YWxpZGF0aW9uRG9uZShmYWxzZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghcHJvY2Vzc1N5bmNWYWxpZGF0b3JzKCkpIHsKICAgICAgdmFsaWRhdGlvbkRvbmUoZmFsc2UpOwogICAgICByZXR1cm47CiAgICB9CiAgICBwcm9jZXNzQXN5bmNWYWxpZGF0b3JzKCk7CgogICAgZnVuY3Rpb24gcHJvY2Vzc1BhcnNlRXJyb3JzKHBhcnNlVmFsaWQpIHsKICAgICAgdmFyIGVycm9yS2V5ID0gY3RybC4kJHBhcnNlck5hbWUgfHwgJ3BhcnNlJzsKICAgICAgaWYgKHBhcnNlVmFsaWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHNldFZhbGlkaXR5KGVycm9yS2V5LCBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRWYWxpZGl0eShlcnJvcktleSwgcGFyc2VWYWxpZCk7CiAgICAgICAgaWYgKCFwYXJzZVZhbGlkKSB7CiAgICAgICAgICBmb3JFYWNoKGN0cmwuJHZhbGlkYXRvcnMsIGZ1bmN0aW9uKHYsIG5hbWUpIHsKICAgICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgbnVsbCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGZvckVhY2goY3RybC4kYXN5bmNWYWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7CiAgICAgICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIG51bGwpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb2Nlc3NTeW5jVmFsaWRhdG9ycygpIHsKICAgICAgdmFyIHN5bmNWYWxpZGF0b3JzVmFsaWQgPSB0cnVlOwogICAgICBmb3JFYWNoKGN0cmwuJHZhbGlkYXRvcnMsIGZ1bmN0aW9uKHZhbGlkYXRvciwgbmFtZSkgewogICAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0b3IobW9kZWxWYWx1ZSwgdmlld1ZhbHVlKTsKICAgICAgICBzeW5jVmFsaWRhdG9yc1ZhbGlkID0gc3luY1ZhbGlkYXRvcnNWYWxpZCAmJiByZXN1bHQ7CiAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgcmVzdWx0KTsKICAgICAgfSk7CiAgICAgIGlmICghc3luY1ZhbGlkYXRvcnNWYWxpZCkgewogICAgICAgIGZvckVhY2goY3RybC4kYXN5bmNWYWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7CiAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCBudWxsKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gcHJvY2Vzc0FzeW5jVmFsaWRhdG9ycygpIHsKICAgICAgdmFyIHZhbGlkYXRvclByb21pc2VzID0gW107CiAgICAgIHZhciBhbGxWYWxpZCA9IHRydWU7CiAgICAgIGZvckVhY2goY3RybC4kYXN5bmNWYWxpZGF0b3JzLCBmdW5jdGlvbih2YWxpZGF0b3IsIG5hbWUpIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IHZhbGlkYXRvcihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpOwogICAgICAgIGlmICghaXNQcm9taXNlTGlrZShwcm9taXNlKSkgewogICAgICAgICAgdGhyb3cgJG5nTW9kZWxNaW5FcnIoIiRhc3luY1ZhbGlkYXRvcnMiLAogICAgICAgICAgICAiRXhwZWN0ZWQgYXN5bmNocm9ub3VzIHZhbGlkYXRvciB0byByZXR1cm4gYSBwcm9taXNlIGJ1dCBnb3QgJ3swfScgaW5zdGVhZC4iLCBwcm9taXNlKTsKICAgICAgICB9CiAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgdW5kZWZpbmVkKTsKICAgICAgICB2YWxpZGF0b3JQcm9taXNlcy5wdXNoKHByb21pc2UudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIHRydWUpOwogICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgICAgICBhbGxWYWxpZCA9IGZhbHNlOwogICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgZmFsc2UpOwogICAgICAgIH0pKTsKICAgICAgfSk7CiAgICAgIGlmICghdmFsaWRhdG9yUHJvbWlzZXMubGVuZ3RoKSB7CiAgICAgICAgdmFsaWRhdGlvbkRvbmUodHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJHEuYWxsKHZhbGlkYXRvclByb21pc2VzKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFsaWRhdGlvbkRvbmUoYWxsVmFsaWQpOwogICAgICAgIH0sIG5vb3ApOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VmFsaWRpdHkobmFtZSwgaXNWYWxpZCkgewogICAgICBpZiAobG9jYWxWYWxpZGF0aW9uUnVuSWQgPT09IGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQpIHsKICAgICAgICBjdHJsLiRzZXRWYWxpZGl0eShuYW1lLCBpc1ZhbGlkKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHZhbGlkYXRpb25Eb25lKGFsbFZhbGlkKSB7CiAgICAgIGlmIChsb2NhbFZhbGlkYXRpb25SdW5JZCA9PT0gY3VycmVudFZhbGlkYXRpb25SdW5JZCkgewoKICAgICAgICBkb25lQ2FsbGJhY2soYWxsVmFsaWQpOwogICAgICB9CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQG5nZG9jIG1ldGhvZAogICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJGNvbW1pdFZpZXdWYWx1ZQogICAqCiAgICogQGRlc2NyaXB0aW9uCiAgICogQ29tbWl0IGEgcGVuZGluZyB1cGRhdGUgdG8gdGhlIGAkbW9kZWxWYWx1ZWAuCiAgICoKICAgKiBVcGRhdGVzIG1heSBiZSBwZW5kaW5nIGJ5IGEgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZSBmdXR1cmUKICAgKiBldmVudCBkZWZpbmVkIGluIGBuZy1tb2RlbC1vcHRpb25zYC4gdGhpcyBtZXRob2QgaXMgcmFyZWx5IG5lZWRlZCBhcyBgTmdNb2RlbENvbnRyb2xsZXJgCiAgICogdXN1YWxseSBoYW5kbGVzIGNhbGxpbmcgdGhpcyBpbiByZXNwb25zZSB0byBpbnB1dCBldmVudHMuCiAgICovCiAgdGhpcy4kY29tbWl0Vmlld1ZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdmlld1ZhbHVlID0gY3RybC4kdmlld1ZhbHVlOwoKICAgICR0aW1lb3V0LmNhbmNlbChwZW5kaW5nRGVib3VuY2UpOwoKICAgIC8vIElmIHRoZSB2aWV3IHZhbHVlIGhhcyBub3QgY2hhbmdlZCB0aGVuIHdlIHNob3VsZCBqdXN0IGV4aXQsIGV4Y2VwdCBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcwogICAgLy8gYSBuYXRpdmUgdmFsaWRhdG9yIG9uIHRoZSBlbGVtZW50LiBJbiB0aGlzIGNhc2UgdGhlIHZhbGlkYXRpb24gc3RhdGUgbWF5IGhhdmUgY2hhbmdlZCBldmVuIHRob3VnaAogICAgLy8gdGhlIHZpZXdWYWx1ZSBoYXMgc3RheWVkIGVtcHR5LgogICAgaWYgKGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlID09PSB2aWV3VmFsdWUgJiYgKHZpZXdWYWx1ZSAhPT0gJycgfHwgIWN0cmwuJCRoYXNOYXRpdmVWYWxpZGF0b3JzKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSA9IHZpZXdWYWx1ZTsKCiAgICAvLyBjaGFuZ2UgdG8gZGlydHkKICAgIGlmIChjdHJsLiRwcmlzdGluZSkgewogICAgICB0aGlzLiRzZXREaXJ0eSgpOwogICAgfQogICAgdGhpcy4kJHBhcnNlQW5kVmFsaWRhdGUoKTsKICB9OwoKICB0aGlzLiQkcGFyc2VBbmRWYWxpZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHZpZXdWYWx1ZSA9IGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlOwogICAgdmFyIG1vZGVsVmFsdWUgPSB2aWV3VmFsdWU7CiAgICB2YXIgcGFyc2VyVmFsaWQgPSBpc1VuZGVmaW5lZChtb2RlbFZhbHVlKSA/IHVuZGVmaW5lZCA6IHRydWU7CgogICAgaWYgKHBhcnNlclZhbGlkKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3RybC4kcGFyc2Vycy5sZW5ndGg7IGkrKykgewogICAgICAgIG1vZGVsVmFsdWUgPSBjdHJsLiRwYXJzZXJzW2ldKG1vZGVsVmFsdWUpOwogICAgICAgIGlmIChpc1VuZGVmaW5lZChtb2RlbFZhbHVlKSkgewogICAgICAgICAgcGFyc2VyVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGlzTnVtYmVyKGN0cmwuJG1vZGVsVmFsdWUpICYmIGlzTmFOKGN0cmwuJG1vZGVsVmFsdWUpKSB7CiAgICAgIC8vIGN0cmwuJG1vZGVsVmFsdWUgaGFzIG5vdCBiZWVuIHRvdWNoZWQgeWV0Li4uCiAgICAgIGN0cmwuJG1vZGVsVmFsdWUgPSBuZ01vZGVsR2V0KCRzY29wZSk7CiAgICB9CiAgICB2YXIgcHJldk1vZGVsVmFsdWUgPSBjdHJsLiRtb2RlbFZhbHVlOwogICAgdmFyIGFsbG93SW52YWxpZCA9IGN0cmwuJG9wdGlvbnMgJiYgY3RybC4kb3B0aW9ucy5hbGxvd0ludmFsaWQ7CiAgICBjdHJsLiQkcmF3TW9kZWxWYWx1ZSA9IG1vZGVsVmFsdWU7CiAgICBpZiAoYWxsb3dJbnZhbGlkKSB7CiAgICAgIGN0cmwuJG1vZGVsVmFsdWUgPSBtb2RlbFZhbHVlOwogICAgICB3cml0ZVRvTW9kZWxJZk5lZWRlZCgpOwogICAgfQogICAgY3RybC4kJHJ1blZhbGlkYXRvcnMocGFyc2VyVmFsaWQsIG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSwgZnVuY3Rpb24oYWxsVmFsaWQpIHsKICAgICAgaWYgKCFhbGxvd0ludmFsaWQpIHsKICAgICAgICAvLyBOb3RlOiBEb24ndCBjaGVjayBjdHJsLiR2YWxpZCBoZXJlLCBhcyB3ZSBjb3VsZCBoYXZlCiAgICAgICAgLy8gZXh0ZXJuYWwgdmFsaWRhdG9ycyAoZS5nLiBjYWxjdWxhdGVkIG9uIHRoZSBzZXJ2ZXIpLAogICAgICAgIC8vIHRoYXQganVzdCBjYWxsICRzZXRWYWxpZGl0eSBhbmQgbmVlZCB0aGUgbW9kZWwgdmFsdWUKICAgICAgICAvLyB0byBjYWxjdWxhdGUgdGhlaXIgdmFsaWRpdHkuCiAgICAgICAgY3RybC4kbW9kZWxWYWx1ZSA9IGFsbFZhbGlkID8gbW9kZWxWYWx1ZSA6IHVuZGVmaW5lZDsKICAgICAgICB3cml0ZVRvTW9kZWxJZk5lZWRlZCgpOwogICAgICB9CiAgICB9KTsKCiAgICBmdW5jdGlvbiB3cml0ZVRvTW9kZWxJZk5lZWRlZCgpIHsKICAgICAgaWYgKGN0cmwuJG1vZGVsVmFsdWUgIT09IHByZXZNb2RlbFZhbHVlKSB7CiAgICAgICAgY3RybC4kJHdyaXRlTW9kZWxUb1Njb3BlKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICB0aGlzLiQkd3JpdGVNb2RlbFRvU2NvcGUgPSBmdW5jdGlvbigpIHsKICAgIG5nTW9kZWxTZXQoJHNjb3BlLCBjdHJsLiRtb2RlbFZhbHVlKTsKICAgIGZvckVhY2goY3RybC4kdmlld0NoYW5nZUxpc3RlbmVycywgZnVuY3Rpb24obGlzdGVuZXIpIHsKICAgICAgdHJ5IHsKICAgICAgICBsaXN0ZW5lcigpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CiAgICAgIH0KICAgIH0pOwogIH07CgogIC8qKgogICAqIEBuZ2RvYyBtZXRob2QKICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRWaWV3VmFsdWUKICAgKgogICAqIEBkZXNjcmlwdGlvbgogICAqIFVwZGF0ZSB0aGUgdmlldyB2YWx1ZS4KICAgKgogICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhbiBpbnB1dCBkaXJlY3RpdmUgd2FudCB0byBjaGFuZ2UgdGhlIHZpZXcgdmFsdWU7IHR5cGljYWxseSwKICAgKiB0aGlzIGlzIGRvbmUgZnJvbSB3aXRoaW4gYSBET00gZXZlbnQgaGFuZGxlci4KICAgKgogICAqIEZvciBleGFtcGxlIHtAbGluayBuZy5kaXJlY3RpdmU6aW5wdXQgaW5wdXR9IGNhbGxzIGl0IHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBjaGFuZ2VzIGFuZAogICAqIHtAbGluayBuZy5kaXJlY3RpdmU6c2VsZWN0IHNlbGVjdH0gY2FsbHMgaXQgd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQuCiAgICoKICAgKiBJZiB0aGUgbmV3IGB2YWx1ZWAgaXMgYW4gb2JqZWN0IChyYXRoZXIgdGhhbiBhIHN0cmluZyBvciBhIG51bWJlciksIHdlIHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGUKICAgKiBvYmplY3QgYmVmb3JlIHBhc3NpbmcgaXQgdG8gYCRzZXRWaWV3VmFsdWVgLiAgVGhpcyBpcyBiZWNhdXNlIGBuZ01vZGVsYCBkb2VzIG5vdCBwZXJmb3JtIGEgZGVlcAogICAqIHdhdGNoIG9mIG9iamVjdHMsIGl0IG9ubHkgbG9va3MgZm9yIGEgY2hhbmdlIG9mIGlkZW50aXR5LiBJZiB5b3Ugb25seSBjaGFuZ2UgdGhlIHByb3BlcnR5IG9mCiAgICogdGhlIG9iamVjdCB0aGVuIG5nTW9kZWwgd2lsbCBub3QgcmVhbGlzZSB0aGF0IHRoZSBvYmplY3QgaGFzIGNoYW5nZWQgYW5kIHdpbGwgbm90IGludm9rZSB0aGUKICAgKiBgJHBhcnNlcnNgIGFuZCBgJHZhbGlkYXRvcnNgIHBpcGVsaW5lcy4KICAgKgogICAqIEZvciB0aGlzIHJlYXNvbiwgeW91IHNob3VsZCBub3QgY2hhbmdlIHByb3BlcnRpZXMgb2YgdGhlIGNvcHkgb25jZSBpdCBoYXMgYmVlbiBwYXNzZWQgdG8KICAgKiBgJHNldFZpZXdWYWx1ZWAuIE90aGVyd2lzZSB5b3UgbWF5IGNhdXNlIHRoZSBtb2RlbCB2YWx1ZSBvbiB0aGUgc2NvcGUgdG8gY2hhbmdlIGluY29ycmVjdGx5LgogICAqCiAgICogV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBuZXcgYHZhbHVlYCB3aWxsIGJlIHN0YWdlZCBmb3IgY29tbWl0dGluZyB0aHJvdWdoIHRoZSBgJHBhcnNlcnNgCiAgICogYW5kIGAkdmFsaWRhdG9yc2AgcGlwZWxpbmVzLiBJZiB0aGVyZSBhcmUgbm8gc3BlY2lhbCB7QGxpbmsgbmdNb2RlbE9wdGlvbnN9IHNwZWNpZmllZCB0aGVuIHRoZSBzdGFnZWQKICAgKiB2YWx1ZSBzZW50IGRpcmVjdGx5IGZvciBwcm9jZXNzaW5nLCBmaW5hbGx5IHRvIGJlIGFwcGxpZWQgdG8gYCRtb2RlbFZhbHVlYCBhbmQgdGhlbiB0aGUKICAgKiAqKmV4cHJlc3Npb24qKiBzcGVjaWZpZWQgaW4gdGhlIGBuZy1tb2RlbGAgYXR0cmlidXRlLgogICAqCiAgICogTGFzdGx5LCBhbGwgdGhlIHJlZ2lzdGVyZWQgY2hhbmdlIGxpc3RlbmVycywgaW4gdGhlIGAkdmlld0NoYW5nZUxpc3RlbmVyc2AgbGlzdCwgYXJlIGNhbGxlZC4KICAgKgogICAqIEluIGNhc2UgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9IGRpcmVjdGl2ZSBpcyB1c2VkIHdpdGggYHVwZGF0ZU9uYAogICAqIGFuZCB0aGUgYGRlZmF1bHRgIHRyaWdnZXIgaXMgbm90IGxpc3RlZCwgYWxsIHRob3NlIGFjdGlvbnMgd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCBvbmUgb2YgdGhlCiAgICogYHVwZGF0ZU9uYCBldmVudHMgaXMgdHJpZ2dlcmVkIG9uIHRoZSBET00gZWxlbWVudC4KICAgKiBBbGwgdGhlc2UgYWN0aW9ucyB3aWxsIGJlIGRlYm91bmNlZCBpZiB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30KICAgKiBkaXJlY3RpdmUgaXMgdXNlZCB3aXRoIGEgY3VzdG9tIGRlYm91bmNlIGZvciB0aGlzIHBhcnRpY3VsYXIgZXZlbnQuCiAgICoKICAgKiBOb3RlIHRoYXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRyaWdnZXIgYSBgJGRpZ2VzdGAuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVmFsdWUgZnJvbSB0aGUgdmlldy4KICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlciBFdmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgdXBkYXRlLgogICAqLwogIHRoaXMuJHNldFZpZXdWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlLCB0cmlnZ2VyKSB7CiAgICBjdHJsLiR2aWV3Vg0KjNzvVjeYAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxNQABABm6QwKgHNsCoB2CVIh/1WHp800G9dNiAEA0Ok0IAAAEBCAoAo17PAE2ly4zc71Y8mAIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8TkAAQAZuj8CoBzbAqAdglSIf9Vh6fNNBvZSggBANDnN6AAABAQgKAKNezwBNpcuM3O9WVqECAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx87dpAAEAGoLrAqAdgwKgHNh/1lSqTpkhkxujrcoAQAOysVQAAAQEICgBNpcsAo17CSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMTcwMjMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBWaWV3IC0tIENTUyBmaWxlCiAqLwoKLyogLS0tIEJhc2UgU1ZHIExheWVyIC0tLSAqLwoKI292LXRvcG8gc3ZnIHsKICAgIC8qIHByZXZlbnRzIHRoZSBsaXR0bGUgY3V0L2NvcHkvcGFzdGUgc3F1YXJlIHRoYXQgd291bGQgYXBwZWFyIG9uIGlQYWQgKi8KICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmIyYjJiOwp9CgoKLyogLS0tICJObyBEZXZpY2VzIiBMYXllciAtLS0gKi8KCiNvdi10b3BvIHN2ZyAjdG9wby1ub0RldnNMYXllciB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgLm5vRGV2c0JpcmQgewogICAgZmlsbDogI2VjZDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vRGV2c0JpcmQgewogICAgZmlsbDogIzY4MzQzNDsKfQoKI292LXRvcG8gc3ZnICN0b3BvLW5vRGV2c0xheWVyIHRleHQgewogICAgZm9udC1zaXplOiA2MHB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tbm9EZXZzTGF5ZXIgdGV4dCB7CiAgICBmaWxsOiAjZGRlOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1ub0RldnNMYXllciB0ZXh0IHsKICAgIGZpbGw6ICMzYjNiNGY7Cn0KCgovKiAtLS0gVG9wbyBNYXAgLS0tICovCgojb3YtdG9wbyBzdmcgI3RvcG8tbWFwIHsKICAgIHN0cm9rZS13aWR0aDogMnB4OwogICAgZmlsbDogdHJhbnNwYXJlbnQ7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgI3RvcG8tbWFwIHsKICAgIHN0cm9rZTogI2RkZDsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tbWFwIHsKICAgIHN0cm9rZTogIzQ0NDsKfQoKCi8qIC0tLSBUb3BvIFN1bW1hcnkgUGFuZWwgLS0tICovCgojdG9wby1wLXN1bW1hcnkgewogICAgLyogQmFzZSBjc3MgZnJvbSBwYW5lbC5jc3MgKi8KfQoKLyogLS0tIFRvcG8gRGV0YWlsIFBhbmVsIC0tLSAqLwoKI3RvcG8tcC1kZXRhaWwgewogICAgLyogQmFzZSBjc3MgZnJvbSBwYW5lbC5jc3MgKi8KICAgIHRvcDogMzM4cHg7Cn0KaHRtbFtkYXRhLXBsYXRmb3JtPSdpUGFkJ10gI3RvcG8tcC1kZXRhaWwgewogICAgdG9wOiAzNTRweDsKfQoKI3RvcG8tcC1kZXRhaWwgLmFjdGlvbkJ0bnMgLmFjdGlvbkJ0biB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KI3RvcG8tcC1kZXRhaWwgLmFjdGlvbkJ0bnMgLmFjdGlvbkJ0biBzdmcgewogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7Cn0KCgovKiAtLS0gZ2VuZXJhbCB0b3BvLXBhbmVsIHN0eWxpbmcgLS0tICovCgoudG9wby1wIGRpdi5oZWFkZXIgZGl2Lmljb24gewogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoudG9wby1wIGRpdi5ib2R5IHsKICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKfQoKLnRvcG8tcCBkaXYuYm9keTo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnRvcG8tcCBzdmcgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDQycHg7CiAgICBoZWlnaHQ6IDQycHg7Cn0KCi5saWdodCAudG9wby1wIHN2ZyAuZ2x5cGggewogICAgZmlsbDogIzIyMjsKfQoKLmRhcmsgLnRvcG8tcCBzdmcgLmdseXBoLm92ZXJsYXkgewogICAgZmlsbDogIzIyMjsKfQoKLmRhcmsgLnRvcG8tcCBzdmcgLmdseXBoIHsKICAgIGZpbGw6ICNkZGQ7Cn0KLmxpZ2h0IC50b3BvLXAgc3ZnIC5nbHlwaC5vdmVybGF5IHsKICAgIGZpbGw6ICNmZmY7Cn0KCgoudG9wby1wIGgyIHsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgbWFyZ2luOiAwOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDIxMHB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoubGlnaHQgLnRvcG8tcCBoMiB7CiAgICBjb2xvcjogYmxhY2s7Cn0KLmRhcmsgLnRvcG8tcCBoMiB7CiAgICBjb2xvcjogI2RkZDsKfQoKLnRvcG8tcCBoMyB7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG1hcmdpbjogMDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIHRvcDogMjBweDsKICAgIGxlZnQ6IDUwcHg7Cn0KLmxpZ2h0IC50b3BvLXAgaDMgewogICAgY29sb3I6IGJsYWNrOwp9Ci5kYXJrIC50b3BvLXAgaDMgewogICAgY29sb3I6ICNkZGQ7Cn0KCi50b3BvLXAgcCwgdGFibGUgewogICAgcGFkZGluZzogNHB4OwogICAgbWFyZ2luOiAwOwp9CgoudG9wby1wIHRkIHsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoudG9wby1wIHRkLmxhYmVsIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIHBhZGRpbmctcmlnaHQ6IDEycHg7CiAgICAvKiB3b3JrcyBmb3IgYm90aCBsaWdodCBhbmQgZGFyayB0aGVtZXMgLi4uICovCiAgICBjb2xvcjogIzc3NzsKfQoudG9wby1wIHRkLnZhbHVlIHsKfQoKLnRvcG8tcCBociB7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJvcmRlcjogMDsKfQoubGlnaHQgLnRvcG8tcCBociB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICNjY2M7Cn0KLmRhcmsgLnRvcG8tcCBociB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4OwogICAgY29sb3I6ICM4ODg7Cn0KCi8qIC0tLSBUb3BvIEluc3RhbmNlIFBhbmVsIC0tLSAqLwoKI3RvcG8tcC1pbnN0YW5jZSB7CiAgICBoZWlnaHQ6IDEwMHB4Owp9CgojdG9wby1wLWluc3RhbmNlIGRpdi5vbm9zSW5zdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMTcwcHg7CiAgICBoZWlnaHQ6IDg1cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHJlY3QgewogICAgc3Ryb2tlLXdpZHRoOiAzLjU7Cn0KI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyByZWN0IHsKICAgIG9wYWNpdHk6IDE7Cn0KLmxpZ2h0ICN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHJlY3QgewogICAgZmlsbDogI2NjYzsKICAgIHN0cm9rZTogI2FhYTsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyByZWN0IHsKICAgIGZpbGw6ICM5Y2Y7CiAgICBzdHJva2U6ICM1NTU7Cn0KLmRhcmsgI3RvcG8tcC1pbnN0YW5jZSBzdmcgcmVjdCB7CiAgICBmaWxsOiAjNjY2OwogICAgc3Ryb2tlOiAjMjIyOwp9Ci5kYXJrICN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgcmVjdCB7CiAgICBmaWxsOiAjOWNmOwogICAgc3Ryb2tlOiAjOTk5Owp9CgoKI3RvcG8tcC1pbnN0YW5jZSBzdmcgLmdseXBoIHsKICAgIGZpbGw6ICM4ODg7CiAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7Cn0KI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyAuZ2x5cGggewogICAgZmlsbDogIzAwMDsKfQoKI3RvcG8tcC1pbnN0YW5jZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICBvcGFjaXR5OiAwLjQ7Cn0KLmxpZ2h0ICN0b3BvLXAtaW5zdGFuY2Ugc3ZnIC5iYWRnZUljb24gewogICAgZmlsbDogIzc3NzsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIHN2ZyAuYmFkZ2VJY29uIHsKICAgIGZpbGw6ICM1NTU7Cn0KCiN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBvcGFjaXR5OiAxLjA7Cn0KLmxpZ2h0ICN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBmaWxsOiAjZmZmOwp9Ci5kYXJrICN0b3BvLXAtaW5zdGFuY2UgLm9ubGluZSBzdmcgLmJhZGdlSWNvbiB7CiAgICBmaWxsOiAjZmZmOwp9CgojdG9wby1wLWluc3RhbmNlIHN2ZyB0ZXh0IHsKICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICBvcGFjaXR5OiAwLjM7Cn0KI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyB0ZXh0IHsKICAgIG9wYWNpdHk6IDEuMDsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSBzdmcgdGV4dCB7CiAgICBmaWxsOiAjNDQ0Owp9Ci5saWdodCAjdG9wby1wLWluc3RhbmNlIC5vbmxpbmUgc3ZnIHRleHQgewogICAgZmlsbDogI2VlZTsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIHN2ZyB0ZXh0IHsKICAgIGZpbGw6ICNhYWE7Cn0KLmRhcmsgI3RvcG8tcC1pbnN0YW5jZSAub25saW5lIHN2ZyB0ZXh0IHsKICAgIGZpbGw6ICNjY2M7Cn0KCiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHRleHQuaW5zdFRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9CiN0b3BvLXAtaW5zdGFuY2Ugc3ZnIHRleHQuaW5zdExhYmVsIHsKICAgIGZvbnQtc2l6ZTogOXB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgojdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwIHsKICAgIG9wYWNpdHk6IDAuMzsKfQojdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHsKICAgIG9wYWNpdHk6IDEuMDsKfQoubGlnaHQgI3RvcG8tcC1pbnN0YW5jZSAub25vc0luc3QubWFzdGVyc2hpcC5hZmZpbml0eSBzdmcgcmVjdCB7CiAgICBmaWx0ZXI6IHVybCgjYmx1ZS1nbG93KTsKfQouZGFyayAjdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHN2ZyByZWN0IHsKICAgIGZpbHRlcjogdXJsKCN5ZWxsb3ctZ2xvdyk7Cn0KLmxpZ2h0LmZpcmVmb3ggI3RvcG8tcC1pbnN0YW5jZSAub25vc0luc3QubWFzdGVyc2hpcC5hZmZpbml0eSBzdmcgcmVjdCB7CiAgICBmaWx0ZXI6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsIDxzdmcgeG1sbnMgPSBcJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCc+PGZpbHRlciB4PVwiLTUwJVwiIHk9XCItNTAlXCIgd2lkdGg9XCIyMDAlXCIgaGVpZ2h0PVwiMjAwJVwiIGlkPVwiYmx1ZS1nbG93XCI+PGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgIDAgMCAwIDAgMCAgMCAwIDAgMCAwICAwLjcgMCAwIDAgMSAgMCBcIj48L2ZlQ29sb3JNYXRyaXg+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjNcIiByZXN1bHQ9XCJjb2xvcmVkQmx1clwiPjwvZmVHYXVzc2lhbkJsdXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jYmx1ZS1nbG93Iik7Cn0KLmRhcmsuZmlyZWZveCAjdG9wby1wLWluc3RhbmNlIC5vbm9zSW5zdC5tYXN0ZXJzaGlwLmFmZmluaXR5IHN2ZyByZWN0IHsKICAgIGZpbHRlcjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwgPHN2ZyB4bWxucyA9IFwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJz48ZmlsdGVyIHg9XCItNTAlXCIgeT1cIi01MCVcIiB3aWR0aD1cIjIwMCVcIiBoZWlnaHQ9XCIyMDAlXCIgaWQ9XCJ5ZWxsb3ctZ2xvd1wiPjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwICAxLjAgMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDAuMyAwIDAgMCAxICAwIFwiPjwvZmVDb2xvck1hdHJpeD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIHJlc3VsdD1cImNvbG9yZWRCbHVyXCI+PC9mZUdhdXNzaWFuQmx1cj48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49XCJjb2xvcmVkQmx1clwiPjwvZmVNZXJnZU5vZGU+PGZlTWVyZ2VOb2RlIGluPVwiU291cmNlR3JhcGhpY1wiPjwvZmVNZXJnZU5vZGU+PC9mZU1lcmdlPjwvZmlsdGVyPjwvc3ZnPiN5ZWxsb3ctZ2xvdyIpOwp9CgoKLyogLS0tIFRvb2xiYXIgLS0tICovCgojdG9vbGJhci10b3BvLXRiYXIgLnRiYXItcm93LnJpZ2h0IHsKICAgIHdpZHRoOiAxMDAlOwp9CgojdG9vbGJhci10b3BvLXRiYXIgLnRiYXItcm93LXRleHQgewogICAgaGVpZ2h0OiAyMXB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBwYWRkaW5nOiA4cHggNjBweCAwIDA7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCgovKiAtLS0gVG9wbyBOb2RlcyAtLS0gKi8KCiNvdi10b3BvIHN2ZyAuc3VwcHJlc3NlZCB7CiAgICBvcGFjaXR5OiAwLjUgIWltcG9ydGFudDsKfQoKI292LXRvcG8gc3ZnIC5zdXBwcmVzc2VkbWF4IHsKICAgIG9wYWNpdHk6IDAuMiAhaW1wb3J0YW50Owp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIHJlY3QsCi5saWdodCAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgY2lyY2xlIHsKICAgIGZpbGw6ICNmOTA7CiAgICBmaWx0ZXI6IHVybCgjYmx1ZS1nbG93KTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgcmVjdCwKLmRhcmsgI292LXRvcG8gc3ZnIC5ub2RlLnNlbGVjdGVkIGNpcmNsZSB7CiAgICBmaWxsOiAjZjkwOwogICAgZmlsdGVyOiB1cmwoI3llbGxvdy1nbG93KTsKfQoubGlnaHQuZmlyZWZveCAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgcmVjdCwKLozc71aioQIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS33EAAQAbzAMCoBzbAqAdglSof9cbo63KTpmSsgBABVoAmAAABAQgKAKNe0ABNpcuM3O9W06ICAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx87d9AAEAGoLXAqAdgwKgHNh/1lSqTpmSsxujrcoAQAOysVQAAAQEICgBNpcsAo17CbGlnaHQuZmlyZWZveCAjb3YtdG9wbyBzdmcgLm5vZGUuc2VsZWN0ZWQgY2lyY2xlIHsKICAgIGZpbHRlcjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwgPHN2ZyB4bWxucyA9IFwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJz48ZmlsdGVyIHg9XCItNTAlXCIgeT1cIi01MCVcIiB3aWR0aD1cIjIwMCVcIiBoZWlnaHQ9XCIyMDAlXCIgaWQ9XCJibHVlLWdsb3dcIj48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAgMCAwIDAgMCAwICAwIDAgMCAwIDAgIDAuNyAwIDAgMCAxICAwIFwiPjwvZmVDb2xvck1hdHJpeD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIHJlc3VsdD1cImNvbG9yZWRCbHVyXCI+PC9mZUdhdXNzaWFuQmx1cj48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49XCJjb2xvcmVkQmx1clwiPjwvZmVNZXJnZU5vZGU+PGZlTWVyZ2VOb2RlIGluPVwiU291cmNlR3JhcGhpY1wiPjwvZmVNZXJnZU5vZGU+PC9mZU1lcmdlPjwvZmlsdGVyPjwvc3ZnPiNibHVlLWdsb3ciKTsKfQouZGFyay5maXJlZm94ICNvdi10b3BvIHN2ZyAubm9kZS5zZWxlY3RlZCByZWN0LAouZGFyay5maXJlZm94ICNvdi10b3BvIHN2ZyAubm9kZS5zZWxlY3RlZCBjaXJjbGUgewogICAgZmlsdGVyOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCA8c3ZnIHhtbG5zID0gXCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wnPjxmaWx0ZXIgeD1cIi01MCVcIiB5PVwiLTUwJVwiIHdpZHRoPVwiMjAwJVwiIGhlaWdodD1cIjIwMCVcIiBpZD1cInllbGxvdy1nbG93XCI+PGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgIDEuMCAwIDAgMCAwICAxLjAgMCAwIDAgMCAgMC4zIDAgMCAwIDEgIDAgXCI+PC9mZUNvbG9yTWF0cml4PjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIzXCIgcmVzdWx0PVwiY29sb3JlZEJsdXJcIj48L2ZlR2F1c3NpYW5CbHVyPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj1cImNvbG9yZWRCbHVyXCI+PC9mZU1lcmdlTm9kZT48ZmVNZXJnZU5vZGUgaW49XCJTb3VyY2VHcmFwaGljXCI+PC9mZU1lcmdlTm9kZT48L2ZlTWVyZ2U+PC9maWx0ZXI+PC9zdmc+I3llbGxvdy1nbG93Iik7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSB0ZXh0IHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgovKiBEZXZpY2UgTm9kZXMgKi8KCiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2Ugewp9Cgojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIHJlY3QgewogICAgc3Ryb2tlLXdpZHRoOiAxLjU7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UuZml4ZWQgcmVjdCB7CiAgICBzdHJva2Utd2lkdGg6IDEuNTsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZS5maXhlZCByZWN0IHsKICAgIHN0cm9rZTogI2FhYTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLmZpeGVkIHJlY3QgewogICAgc3Ryb2tlOiAjOTk5Owp9CgovKiBub3RlOiBkZXZpY2UgaXMgb2ZmbGluZSB3aXRob3V0IHRoZSAnb25saW5lJyBjbGFzcyAqLwoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLmRldmljZSB7CiAgICBmaWxsOiAjNzc3Owp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgewogICAgZmlsbDogIzU1NTsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgcmVjdCB7CiAgICBzdHJva2U6ICM2NjY7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgcmVjdCB7CiAgICBzdHJva2U6ICM5OTk7Cn0KCi5saWdodCAjb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSB7CiAgICBmaWxsOiAjNmU3ZmEzOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2Uub25saW5lIHsKICAgIGZpbGw6ICM0RTVDN0Y7Cn0KCi8qIG5vdGU6IGRldmljZSBpcyBvZmZsaW5lIHdpdGhvdXQgdGhlICdvbmxpbmUnIGNsYXNzICovCiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2UgdGV4dCB7CiAgICBmaWxsOiAjYmJiOwogICAgZm9udDogMTBwdCBzYW5zLXNlcmlmOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSB0ZXh0IHsKICAgIGZpbGw6IHdoaXRlOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIC5zdmdJY29uIHJlY3QgewogICAgZmlsbDogI2FhYTsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlIC5zdmdJY29uIHVzZSB7CiAgICBmaWxsOiAjNzc3Owp9CiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2Uuc2VsZWN0ZWQgLnN2Z0ljb24gcmVjdCB7CiAgICBmaWxsOiAjZjkwOwp9CiNvdi10b3BvIHN2ZyAubm9kZS5kZXZpY2Uub25saW5lIC5zdmdJY29uIHJlY3QgewogICAgZmlsbDogI2NjYzsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZSAuc3ZnSWNvbiB1c2UgewogICAgZmlsbDogIzAwMDsKfQojb3YtdG9wbyBzdmcgLm5vZGUuZGV2aWNlLm9ubGluZS5zZWxlY3RlZCAuc3ZnSWNvbiByZWN0IHsKICAgIGZpbGw6ICNmOTA7Cn0KCi8qIEJhZGdlcyAqLwovKiAoLi4uIHdvcmtzIGZvciBib3RoIGxpZ2h0IGFuZCBkYXJrIHRoZW1lcy4uLikgKi8KI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZSBjaXJjbGUgewogICAgc3Ryb2tlOiAjYWFhOwp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgLmJhZGdlLmJhZGdlSW5mbyBjaXJjbGUgewogICAgZmlsbDogIzk5ZDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZS5iYWRnZVdhcm4gY2lyY2xlIHsKICAgIGZpbGw6ICNkYTI7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UuYmFkZ2VFcnJvciBjaXJjbGUgewogICAgZmlsbDogI2U0NDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZSB1c2UgewogICAgZmlsbDogd2hpdGUgIWltcG9ydGFudDsKfQoKI292LXRvcG8gc3ZnIC5ub2RlIC5iYWRnZS5iYWRnZUluZm8gdXNlIHsKICAgIGZpbGw6ICM0NDg7Cn0KCiNvdi10b3BvIHN2ZyAubm9kZSAuYmFkZ2UgdGV4dCB7CiAgICBmaWxsOiB3aGl0ZSAhaW1wb3J0YW50Owp9Cgojb3YtdG9wbyBzdmcgLm5vZGUgLmJhZGdlLmJhZGdlSW5mbyB0ZXh0IHsKICAgIGZpbGw6ICM0NDg7Cn0KCi8qIEhvc3QgTm9kZXMgKi8KCiNvdi10b3BvIHN2ZyAubm9kZS5ob3N0IHsKfQoKI292LXRvcG8gc3ZnIC5ub2RlLmhvc3QgdGV4dCB7CiAgICBzdHJva2U6IG5vbmU7CiAgICBmb250OiA5cHQgc2Fucy1zZXJpZjsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5ub2RlLmhvc3QgdGV4dCB7CiAgICBmaWxsOiAjODQ2Owp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubm9kZS5ob3N0IHRleHQgewogICAgZmlsbDogI0JCODA5RDsKfQoKLmxpZ2h0IHN2ZyAubm9kZS5ob3N0IGNpcmNsZSB7CiAgICBzdHJva2U6ICMwMDA7CiAgICBmaWxsOiAjZWRiOwp9Ci5kYXJrIHN2ZyAubm9kZS5ob3N0IGNpcmNsZSB7CiAgICBzdHJva2U6ICNlZWU7CiAgICBmaWxsOiAjQjJBMTgwOwp9CgoubGlnaHQgc3ZnIC5ub2RlLmhvc3QgLnN2Z0ljb24gewogICAgZmlsbDogIzQ0NDsKfQouZGFyayBzdmcgLm5vZGUuaG9zdCAuc3ZnSWNvbiB7CiAgICBmaWxsOiAjMjIyOwp9CgovKiAtLS0gVG9wbyBMaW5rcyAtLS0gKi8KCiNvdi10b3BvIHN2ZyAubGluayB7CiAgICBvcGFjaXR5OiAuOTsKfQoKI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAojb3YtdG9wbyBzdmcgLmxpbmsuZW5oYW5jZWQgewogICAgc3Ryb2tlLXdpZHRoOiA0LjVweDsKfQoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLmVuaGFuY2VkIHsKICAgIGZpbHRlcjogdXJsKCNibHVlLWdsb3cpOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5zZWxlY3RlZCwKLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLmVuaGFuY2VkIHsKICAgIGZpbHRlcjogdXJsKCN5ZWxsb3ctZ2xvdyk7Cn0KLmxpZ2h0LmZpcmVmb3ggI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAoubGlnaHQuZmlyZWZveCAjb3YtdG9wbyBzdmcgLmxpbmsuZW5oYW5jZWQgewogICAgZmlsdGVyOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCA8c3ZnIHhtbG5zID0gXCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wnPjxmaWx0ZXIgeD1cIi01MCVcIiB5PVwiLTUwJVwiIHdpZHRoPVwiMjAwJVwiIGhlaWdodD1cIjIwMCVcIiBpZD1cImJsdWUtZ2xvd1wiPjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwICAwIDAgMCAwIDAgIDAgMCAwIDAgMCAgMC43IDAgMCAwIDEgIDAgXCI+PC9mZUNvbG9yTWF0cml4PjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIzXCIgcmVzdWx0PVwiY29sb3JlZEJsdXJcIj48L2ZlR2F1c3NpYW5CbHVyPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj1cImNvbG9yZWRCbHVyXCI+PC9mZU1lcmdlTm9kZT48ZmVNZXJnZU5vZGUgaW49XCJTb3VyY2VHcmFwaGljXCI+PC9mZU1lcmdlTm9kZT48L2ZlTWVyZ2U+PC9maWx0ZXI+PC9zdmc+I2JsdWUtZ2xvdyIpOwp9Ci5kYXJrLmZpcmVmb3ggI292LXRvcG8gc3ZnIC5saW5rLnNlbGVjdGVkLAouZGFyay5maXJlZm94ICNvdi10b3BvIHN2ZyAubGluay5lbmhhbmNlZCB7CiAgICBmaWx0ZXI6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsIDxzdmcgeG1sbnMgPSBcJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCc+PGZpbHRlciB4PVwiLTUwJVwiIHk9XCItNTAlXCIgd2lkdGg9XCIyMDAlXCIgaGVpZ2h0PVwiMjAwJVwiIGlkPVwieWVsbG93LWdsb3dcIj48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAgMS4wIDAgMCAwIDAgIDEuMCAwIDAgMCAwICAwLjMgMCAwIDAgMSAgMCBcIj48L2ZlQ29sb3JNYXRyaXg+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjNcIiByZXN1bHQ9XCJjb2xvcmVkQmx1clwiPjwvZmVHYXVzc2lhbkJsdXI+PGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPVwiY29sb3JlZEJsdXJcIj48L2ZlTWVyZ2VOb2RlPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIj48L2ZlTWVyZ2VOb2RlPjwvZmVNZXJnZT48L2ZpbHRlcj48L3N2Zz4jeWVsbG93LWdsb3ciKTsKCn0KCiNvdi10b3BvIHN2ZyAubGluay5pbmFjdGl2ZSB7CiAgICBvcGFjaXR5OiAuNTsKICAgIHN0cm9rZS1kYXNoYXJyYXk6IDggNDsKfQovKiBGSVhNRTogUmV2aWV3IGZvciBub3QtcGVybWl0dGVkIGxpbmtzICovCiNvdi10b3BvIHN2ZyAubGluay5ub3QtcGVybWl0dGVkIHsKICAgIHN0cm9rZTogcmdiKDI1NSwwLDApOwogICAgc3Ryb2tlLXdpZHRoOiA1LjA7CiAgICBzdHJva2UtZGFzaGFycmF5OiA4IDQ7Cn0KCiNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkgewogICAgc3Ryb2tlLXdpZHRoOiAzcHg7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkgewogICAgc3Ryb2tlOiByZ2JhKDAsMTUzLDUxLDAuNSk7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeSB7CiAgICBzdHJva2U6IHJnYmEoMTIxLDIzMSwxNTgsMC41KTsKfQoKLyogUG9ydCB0cmFmZmljIGNvbG9yIHZpc3VhbGl6YXRpb24gZm9yIEticHMsIE1icHMsIGFuZCBHYnBzICovCgoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtS2JwcyB7CiAgICBzdHJva2U6IHJnYigwLDE1Myw1MSk7CiAgICBzdHJva2Utd2lkdGg6IDUuMDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1LYnBzIHsKICAgIHN0cm9rZTogcmdiKDk4LCAxNTMsIDExOCk7CiAgICBzdHJva2Utd2lkdGg6IDUuMDsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkucG9ydC10cmFmZmljLU1icHMgewogICAgc3Ryb2tlOiByZ2IoMTI4LDE0NSwyNyk7CiAgICBzdHJva2Utd2lkdGg6IDYuNTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1NYnBzIHsKICAgIHN0cm9rZTogcmdiKDkxLCAxMDksIDU0KTsKICAgIHN0cm9rZS13aWR0aDogNi41Owp9CgoubGlnaHQgI292LXRvcG8gc3ZnIC5saW5rLnNlY29uZGFyeS5wb3J0LXRyYWZmaWMtR2JwcyB7CiAgICBzdHJva2U6IHJnYigyNTUsIDEzNywgMyk7CiAgICBzdHJva2Utd2lkdGg6IDguMDsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5LnBvcnQtdHJhZmZpYy1HYnBzIHsKICAgIHN0cm9rZTogcmdiKDE3NCwgMTE5LCA1NSk7CiAgICBzdHJva2Utd2lkdGg6IDguMDsKfQoKLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkucG9ydC10cmFmZmljLUdicHMtY2hva2VkIHsKICAgIHN0cm9rZTogcmdiKDE4MywgMzAsIDIxKTsKICAgIHN0cm9rZS13aWR0aDogOC4wOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkucG9ydC10cmFmZmljLUdicHMtY2hva2VkIHsKICAgIHN0cm9rZTogcmdiKDEyNywgNDAsIDM5KTsKICAgIHN0cm9rZS13aWR0aDogOC4wOwp9CgoKI292LXRvcG8gc3ZnIC5saW5rLmFuaW1hdGVkIHsKICAgIHN0cm9rZS1kYXNoYXJyYXk6IDggNTsKICAgIGFuaW1hdGlvbjogYW50cyA1cyBpbmZpbml0ZSBsaW5lYXI7CiAgICAvKiBiZWxvdyBsaW5lIHdpbGwgYmUgYWRkZWQgdmlhIEphdmFzY3JpcHQgYmFzZWQgb24gcGF0aCAqLwogICAgLyphbmltYXRpb24tZGlyZWN0aW9uOiByZXZlcnNlOyovCn0KQGtleWZyYW1lcyBhbnRzIHsKICAgIGZyb20gewogICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwOwogICAgfQogICAgdG8gewogICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiA0MDA7CiAgICB9Cn0KCiNvdi10b3BvIHN2ZyAubGluay5wcmltYXJ5IHsKICAgIHN0cm9rZS13aWR0aDogNHB4Owp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmsucHJpbWFyeSB7CiAgICBzdHJva2U6ICNmZkEzMDA7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rLnByaW1hcnkgewogICAgc3Ryb2tlOiAjRDU4RTBGOwp9Cgojb3YtdG9wbyBzdmcgLmxpbmsuc2Vjb25kYXJ5Lm9wdGljYWwgewogICAgc3Ryb2tlLXdpZHRoOiA0cHg7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkub3B0aWNhbCB7CiAgICBzdHJva2U6IHJnYmEoMTI4LDY0LDI1NSwwLjUpOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAubGluay5zZWNvbmRhcnkub3B0aWNhbCB7CiAgICBzdHJva2U6IHJnYmEoMTY0LDEzOSwyMTUsMC41KTsKfQoKI292LXRvcG8gc3ZnIC5saW5rLnByaW1hcnkub3B0aWNhbCB7CiAgICBzdHJva2Utd2lkdGg6IIzc71ZcowIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS33UAAQAby/8CoBzbAqAdglSof9cbo63KTpoD0gBABx2NtAAABAQgKAKNe0ABNpcuM3O9WeKMCAJQKAACUCgAAaPcoH9LFCAAnrR4TCABFAAqG7eRAAEAGsqbAqAdgwKgHNh/1lSqTpoD0xujrcoAYAOyaXwAAAQEICgBNpcwAo17QNnB4Owp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmsucHJpbWFyeS5vcHRpY2FsIHsKICAgIHN0cm9rZTogIzc0ZjsKfQouZGFyayAjb3YtdG9wbyBzdmcgLmxpbmsucHJpbWFyeS5vcHRpY2FsIHsKICAgIHN0cm9rZTogIzczNTJDRDsKfQoKLyogTGluayBMYWJlbHMgKi8KCiNvdi10b3BvIHN2ZyAubGlua0xhYmVsIHJlY3QgewogICAgc3Ryb2tlOiBub25lOwp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmtMYWJlbCByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rTGFiZWwgcmVjdCB7CiAgICBmaWxsOiAjNTU1Owp9Cgojb3YtdG9wbyBzdmcgLmxpbmtMYWJlbCB0ZXh0IHsKICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICBzdHJva2Utd2lkdGg6IDAuMTsKICAgIGZvbnQtc2l6ZTogOXB0Owp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLmxpbmtMYWJlbCB0ZXh0IHsKICAgIGZpbGw6ICM0NDQ7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5saW5rTGFiZWwgdGV4dCB7CiAgICBmaWxsOiAjZWVlOwp9CgovKiBQb3J0IExhYmVscyAqLwoKI292LXRvcG8gc3ZnIC5wb3J0TGFiZWwgcmVjdCB7CiAgICBzdHJva2U6IG5vbmU7Cn0KLmxpZ2h0ICNvdi10b3BvIHN2ZyAucG9ydExhYmVsIHJlY3QgewogICAgZmlsbDogI2VlZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgLnBvcnRMYWJlbCByZWN0IHsKICAgIGZpbGw6ICMyMjI7Cn0KCiNvdi10b3BvIHN2ZyAucG9ydExhYmVsIHRleHQgewogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgIHN0cm9rZS13aWR0aDogMC4xOwogICAgZm9udC1zaXplOiAxMXB0Owp9Ci5saWdodCAjb3YtdG9wbyBzdmcgLnBvcnRMYWJlbCB0ZXh0IHsKICAgIGZpbGw6ICM0NDQ7Cn0KLmRhcmsgI292LXRvcG8gc3ZnIC5wb3J0TGFiZWwgdGV4dCB7CiAgICBmaWxsOiAjZWVlOwp9CgovKiBOdW1iZXIgb2YgTGlua3MgTGFiZWxzICovCiNvdi10b3BvIGxpbmUubnVtTGlua0hhc2ggewogICAgc3Ryb2tlLXdpZHRoOiAzOwp9Cgojb3YtdG9wbyB0ZXh0Lm51bUxpbmtUZXh0IHsKICAgIGZvbnQtc2l6ZTogMTVwdDsKfQoKI292LXRvcG8gdGV4dC5udW1MaW5rVGV4dCB7CiAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwp9CgoubGlnaHQgI292LXRvcG8gdGV4dC5udW1MaW5rVGV4dCB7CiAgICBmaWxsOiAjNDQ0Owp9Ci5kYXJrICNvdi10b3BvIHRleHQubnVtTGlua1RleHQgewogICAgZmlsbDogI2VlZTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBTcHJpdGUgTGF5ZXIgKi8KCiNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIHVzZSB7CiAgICBzdHJva2Utd2lkdGg6IDI7Cn0KI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgdGV4dCB7CiAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgZm9udC1zaXplOiAyMHB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdvbGQxIHVzZSB7CiAgICBzdHJva2U6ICNmZGE7CiAgICBmaWxsOiBub25lOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5nb2xkMSB1c2UgewogICAgc3Ryb2tlOiAjNTQxOwogICAgZmlsbDogbm9uZTsKfQoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdvbGQxIHRleHQgewogICAgZmlsbDogI2VkYTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ29sZDEgdGV4dCB7CiAgICBmaWxsOiAjNTQzOwp9CgoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmJsdWUxIHVzZSB7CiAgICBzdHJva2U6ICNiYmQ7CiAgICBmaWxsOiBub25lOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ibHVlMSB1c2UgewogICAgc3Ryb2tlOiAjNDQ1OwogICAgZmlsbDogbm9uZTsKfQoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmJsdWUxIHRleHQgewogICAgZmlsbDogI2NjZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuYmx1ZTEgdGV4dCB7CiAgICBmaWxsOiAjNDQ2Owp9CgoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdyYXkxIHVzZSB7CiAgICBzdHJva2U6ICNjY2M7CiAgICBmaWxsOiBub25lOwp9Ci5kYXJrICNvdi10b3BvIHN2ZyAjdG9wby1zcHJpdGVzIC5ncmF5MSB1c2UgewogICAgc3Ryb2tlOiAjMzMzOwogICAgZmlsbDogbm9uZTsKfQoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgLmdyYXkxIHRleHQgewogICAgZmlsbDogI2RkZDsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyAuZ3JheTEgdGV4dCB7CiAgICBmaWxsOiAjNDQ0Owp9CgovKiBmaWxscyAqLwoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgdXNlLmZpbGwtZ3JheTIgewogICAgZmlsbDogI2VlZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyB1c2UuZmlsbC1ncmF5MiB7CiAgICBmaWxsOiAjNDQ0Owp9CgoubGlnaHQgI292LXRvcG8gc3ZnICN0b3BvLXNwcml0ZXMgdXNlLmZpbGwtYmx1ZTIgewogICAgZmlsbDogI2JjZTsKfQouZGFyayAjb3YtdG9wbyBzdmcgI3RvcG8tc3ByaXRlcyB1c2UuZmlsbC1ibHVlMiB7CiAgICBmaWxsOiAjNDQ3Owp9CgqM3O9Ws6MCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0t95AAEAG8v7AqAc2wKgHYJUqH/XG6Otyk6aLRoAQAfBY8QAAAQEICgCjXtAATaXMjNzvVlqnAgCdAgAAnQIAAAgAJ60eE2j3KB/SxQgARQACj7ffQABABvCiwKgHNsCoB2CVKh/1xujrcpOmi0aAGAHwziMAAAEBCAoAo17QAE2lzEdFVCAvb25vcy91aS9hcHAvdmlldy9tZXRlci9tZXRlci5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZppwIAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADTt5kAAQAa89sCoB2DAqAc2H/WVKpOmi0bG6O3NgBAA9pANAAABAQgKAE2lzACjXtCM3O9W464CAKYIAACmCAAAaPcoH9LFCAAnrR4TCABFAAiY7edAAEAGtJHAqAdgwKgHNh/1lSqTpotGxujtzYAYAPaYcQAAAQEICgBNpcwAo17QSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMjA1MA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNZXRlciBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LW1ldGVyIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LW1ldGVyIGRpdi5jdHJsLWJ0bnMgewp9CgoubGlnaHQgI292LW1ldGVyIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1tZXRlciAuY3VycmVudC12aWV3IHVzZSB7CiAgICBmaWxsOiAjMzA0ODYwOwp9CgoubGlnaHQgI292LW1ldGVyIC5jdXJyZW50LXZpZXcgcmVjdCB7CiAgICBmaWxsOiBkZWVwc2t5Ymx1ZTsKfQouZGFyayAjb3YtbWV0ZXIgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi5saWdodCAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5saWdodCAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDMpLAoubGlnaHQgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMSksCi5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAyKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9Ci5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAzKSwKLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKfQoKLyogaGlnaGxpZ2h0ZWQgY29sb3IgKi8KLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAxKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAyKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4pLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNGREZGREM7Cn0KLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0biArIDEpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtbWV0ZXIgdHI6bnRoLWNoaWxkKDRuICsgMikuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1tZXRlciB0cjpudGgtY2hpbGQoNG4gKyAzKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LW1ldGVyIHRyOm50aC1jaGlsZCg0bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVBNTYwMDsKfQoKI292LW1ldGVyIHRkIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojb3YtbWV0ZXIgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KI292LW1ldGVyIHRkLmJhbmRzIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBwYWRkaW5nLWxlZnQ6IDM2cHg7CiAgICBvcGFjaXR5OiAwLjY1Owp9jNzvVhqvAgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLfgQABABvL8wKgHNsCoB2CVKh/1xujtzZOmk6qAEAISTg8AAAEBCAoAo17RAE2lzIzc71aztQIAamAAAGpgAABo9ygf0sUIACetHhMIAEUAYFzUg0AAQAZ2McCoB2DAqAc2H/WVIkG9lKBYenzTgBABU/A1AAABAQgKAE2lzACjXs83RkU4DQphbHVlID0gdmFsdWU7CiAgICBpZiAoIWN0cmwuJG9wdGlvbnMgfHwgY3RybC4kb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQpIHsKICAgICAgY3RybC4kJGRlYm91bmNlVmlld1ZhbHVlQ29tbWl0KHRyaWdnZXIpOwogICAgfQogIH07CgogIHRoaXMuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdCA9IGZ1bmN0aW9uKHRyaWdnZXIpIHsKICAgIHZhciBkZWJvdW5jZURlbGF5ID0gMCwKICAgICAgICBvcHRpb25zID0gY3RybC4kb3B0aW9ucywKICAgICAgICBkZWJvdW5jZTsKCiAgICBpZiAob3B0aW9ucyAmJiBpc0RlZmluZWQob3B0aW9ucy5kZWJvdW5jZSkpIHsKICAgICAgZGVib3VuY2UgPSBvcHRpb25zLmRlYm91bmNlOwogICAgICBpZiAoaXNOdW1iZXIoZGVib3VuY2UpKSB7CiAgICAgICAgZGVib3VuY2VEZWxheSA9IGRlYm91bmNlOwogICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGRlYm91bmNlW3RyaWdnZXJdKSkgewogICAgICAgIGRlYm91bmNlRGVsYXkgPSBkZWJvdW5jZVt0cmlnZ2VyXTsKICAgICAgfSBlbHNlIGlmIChpc051bWJlcihkZWJvdW5jZVsnZGVmYXVsdCddKSkgewogICAgICAgIGRlYm91bmNlRGVsYXkgPSBkZWJvdW5jZVsnZGVmYXVsdCddOwogICAgICB9CiAgICB9CgogICAgJHRpbWVvdXQuY2FuY2VsKHBlbmRpbmdEZWJvdW5jZSk7CiAgICBpZiAoZGVib3VuY2VEZWxheSkgewogICAgICBwZW5kaW5nRGVib3VuY2UgPSAkdGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBjdHJsLiRjb21taXRWaWV3VmFsdWUoKTsKICAgICAgfSwgZGVib3VuY2VEZWxheSk7CiAgICB9IGVsc2UgaWYgKCRyb290U2NvcGUuJCRwaGFzZSkgewogICAgICBjdHJsLiRjb21taXRWaWV3VmFsdWUoKTsKICAgIH0gZWxzZSB7CiAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7CiAgICAgICAgY3RybC4kY29tbWl0Vmlld1ZhbHVlKCk7CiAgICAgIH0pOwogICAgfQogIH07CgogIC8vIG1vZGVsIC0+IHZhbHVlCiAgLy8gTm90ZTogd2UgY2Fubm90IHVzZSBhIG5vcm1hbCBzY29wZS4kd2F0Y2ggYXMgd2Ugd2FudCB0byBkZXRlY3QgdGhlIGZvbGxvd2luZzoKICAvLyAxLiBzY29wZSB2YWx1ZSBpcyAnYScKICAvLyAyLiB1c2VyIGVudGVycyAnYicKICAvLyAzLiBuZy1jaGFuZ2Uga2lja3MgaW4gYW5kIHJldmVydHMgc2NvcGUgdmFsdWUgdG8gJ2EnCiAgLy8gICAgLT4gc2NvcGUgdmFsdWUgZGlkIG5vdCBjaGFuZ2Ugc2luY2UgdGhlIGxhc3QgZGlnZXN0IGFzCiAgLy8gICAgICAgbmctY2hhbmdlIGV4ZWN1dGVzIGluIGFwcGx5IHBoYXNlCiAgLy8gNC4gdmlldyBzaG91bGQgYmUgY2hhbmdlZCBiYWNrIHRvICdhJwogICRzY29wZS4kd2F0Y2goZnVuY3Rpb24gbmdNb2RlbFdhdGNoKCkgewogICAgdmFyIG1vZGVsVmFsdWUgPSBuZ01vZGVsR2V0KCRzY29wZSk7CgogICAgLy8gaWYgc2NvcGUgbW9kZWwgdmFsdWUgYW5kIG5nTW9kZWwgdmFsdWUgYXJlIG91dCBvZiBzeW5jCiAgICAvLyBUT0RPKHBlcmYpOiB3aHkgbm90IG1vdmUgdGhpcyB0byB0aGUgYWN0aW9uIGZuPwogICAgaWYgKG1vZGVsVmFsdWUgIT09IGN0cmwuJG1vZGVsVmFsdWUpIHsKICAgICAgY3RybC4kbW9kZWxWYWx1ZSA9IGN0cmwuJCRyYXdNb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTsKCiAgICAgIHZhciBmb3JtYXR0ZXJzID0gY3RybC4kZm9ybWF0dGVycywKICAgICAgICAgIGlkeCA9IGZvcm1hdHRlcnMubGVuZ3RoOwoKICAgICAgdmFyIHZpZXdWYWx1ZSA9IG1vZGVsVmFsdWU7CiAgICAgIHdoaWxlIChpZHgtLSkgewogICAgICAgIHZpZXdWYWx1ZSA9IGZvcm1hdHRlcnNbaWR4XSh2aWV3VmFsdWUpOwogICAgICB9CiAgICAgIGlmIChjdHJsLiR2aWV3VmFsdWUgIT09IHZpZXdWYWx1ZSkgewogICAgICAgIGN0cmwuJHZpZXdWYWx1ZSA9IGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlID0gdmlld1ZhbHVlOwogICAgICAgIGN0cmwuJHJlbmRlcigpOwoKICAgICAgICBjdHJsLiQkcnVuVmFsaWRhdG9ycyh1bmRlZmluZWQsIG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSwgbm9vcCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbW9kZWxWYWx1ZTsKICB9KTsKfV07CgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdNb2RlbAogKgogKiBAZWxlbWVudCBpbnB1dAogKiBAcHJpb3JpdHkgMQogKgogKiBAZGVzY3JpcHRpb24KICogVGhlIGBuZ01vZGVsYCBkaXJlY3RpdmUgYmluZHMgYW4gYGlucHV0YCxgc2VsZWN0YCwgYHRleHRhcmVhYCAob3IgY3VzdG9tIGZvcm0gY29udHJvbCkgdG8gYQogKiBwcm9wZXJ0eSBvbiB0aGUgc2NvcGUgdXNpbmcge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIgTmdNb2RlbENvbnRyb2xsZXJ9LAogKiB3aGljaCBpcyBjcmVhdGVkIGFuZCBleHBvc2VkIGJ5IHRoaXMgZGlyZWN0aXZlLgogKgogKiBgbmdNb2RlbGAgaXMgcmVzcG9uc2libGUgZm9yOgogKgogKiAtIEJpbmRpbmcgdGhlIHZpZXcgaW50byB0aGUgbW9kZWwsIHdoaWNoIG90aGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyBgaW5wdXRgLCBgdGV4dGFyZWFgIG9yIGBzZWxlY3RgCiAqICAgcmVxdWlyZS4KICogLSBQcm92aWRpbmcgdmFsaWRhdGlvbiBiZWhhdmlvciAoaS5lLiByZXF1aXJlZCwgbnVtYmVyLCBlbWFpbCwgdXJsKS4KICogLSBLZWVwaW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29udHJvbCAodmFsaWQvaW52YWxpZCwgZGlydHkvcHJpc3RpbmUsIHRvdWNoZWQvdW50b3VjaGVkLCB2YWxpZGF0aW9uIGVycm9ycykuCiAqIC0gU2V0dGluZyByZWxhdGVkIGNzcyBjbGFzc2VzIG9uIHRoZSBlbGVtZW50IChgbmctdmFsaWRgLCBgbmctaW52YWxpZGAsIGBuZy1kaXJ0eWAsIGBuZy1wcmlzdGluZWAsIGBuZy10b3VjaGVkYCwgYG5nLXVudG91Y2hlZGApIGluY2x1ZGluZyBhbmltYXRpb25zLgogKiAtIFJlZ2lzdGVyaW5nIHRoZSBjb250cm9sIHdpdGggaXRzIHBhcmVudCB7QGxpbmsgbmcuZGlyZWN0aXZlOmZvcm0gZm9ybX0uCiAqCiAqIE5vdGU6IGBuZ01vZGVsYCB3aWxsIHRyeSB0byBiaW5kIHRvIHRoZSBwcm9wZXJ0eSBnaXZlbiBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIG9uIHRoZQogKiBjdXJyZW50IHNjb3BlLiBJZiB0aGUgcHJvcGVydHkgZG9lc24ndCBhbHJlYWR5IGV4aXN0IG9uIHRoaXMgc2NvcGUsIGl0IHdpbGwgYmUgY3JlYXRlZAogKiBpbXBsaWNpdGx5IGFuZCBhZGRlZCB0byB0aGUgc2NvcGUuCiAqCiAqIEZvciBiZXN0IHByYWN0aWNlcyBvbiB1c2luZyBgbmdNb2RlbGAsIHNlZToKICoKICogIC0gW1VuZGVyc3RhbmRpbmcgU2NvcGVzXShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3dpa2kvVW5kZXJzdGFuZGluZy1TY29wZXMpCiAqCiAqIEZvciBiYXNpYyBleGFtcGxlcywgaG93IHRvIHVzZSBgbmdNb2RlbGAsIHNlZToKICoKICogIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTppbnB1dCBpbnB1dH0KICogICAgLSB7QGxpbmsgaW5wdXRbdGV4dF0gdGV4dH0KICogICAgLSB7QGxpbmsgaW5wdXRbY2hlY2tib3hdIGNoZWNrYm94fQogKiAgICAtIHtAbGluayBpbnB1dFtyYWRpb10gcmFkaW99CiAqICAgIC0ge0BsaW5rIGlucHV0W251bWJlcl0gbnVtYmVyfQogKiAgICAtIHtAbGluayBpbnB1dFtlbWFpbF0gZW1haWx9CiAqICAgIC0ge0BsaW5rIGlucHV0W3VybF0gdXJsfQogKiAgICAtIHtAbGluayBpbnB1dFtkYXRlXSBkYXRlfQogKiAgICAtIHtAbGluayBpbnB1dFtkYXRldGltZS1sb2NhbF0gZGF0ZXRpbWUtbG9jYWx9CiAqICAgIC0ge0BsaW5rIGlucHV0W3RpbWVdIHRpbWV9CiAqICAgIC0ge0BsaW5rIGlucHV0W21vbnRoXSBtb250aH0KICogICAgLSB7QGxpbmsgaW5wdXRbd2Vla10gd2Vla30KICogIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTpzZWxlY3Qgc2VsZWN0fQogKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOnRleHRhcmVhIHRleHRhcmVhfQogKgogKiAjIENTUyBjbGFzc2VzCiAqIFRoZSBmb2xsb3dpbmcgQ1NTIGNsYXNzZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkIG9uIHRoZSBhc3NvY2lhdGVkIGlucHV0L3NlbGVjdC90ZXh0YXJlYSBlbGVtZW50CiAqIGRlcGVuZGluZyBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIG1vZGVsLgogKgogKiAgLSBgbmctdmFsaWRgOiB0aGUgbW9kZWwgaXMgdmFsaWQKICogIC0gYG5nLWludmFsaWRgOiB0aGUgbW9kZWwgaXMgaW52YWxpZAogKiAgLSBgbmctdmFsaWQtW2tleV1gOiBmb3IgZWFjaCB2YWxpZCBrZXkgYWRkZWQgYnkgYCRzZXRWYWxpZGl0eWAKICogIC0gYG5nLWludmFsaWQtW2tleV1gOiBmb3IgZWFjaCBpbnZhbGlkIGtleSBhZGRlZCBieSBgJHNldFZhbGlkaXR5YAogKiAgLSBgbmctcHJpc3RpbmVgOiB0aGUgY29udHJvbCBoYXNuJ3QgYmVlbiBpbnRlcmFjdGVkIHdpdGggeWV0CiAqICAtIGBuZy1kaXJ0eWA6IHRoZSBjb250cm9sIGhhcyBiZWVuIGludGVyYWN0ZWQgd2l0aAogKiAgLSBgbmctdG91Y2hlZGA6IHRoZSBjb250cm9sIGhhcyBiZWVuIGJsdXJyZWQKICogIC0gYG5nLXVudG91Y2hlZGA6IHRoZSBjb250cm9sIGhhc24ndCBiZWVuIGJsdXJyZWQKICogIC0gYG5nLXBlbmRpbmdgOiBhbnkgYCRhc3luY1ZhbGlkYXRvcnNgIGFyZSB1bmZ1bGZpbGxlZAogKgogKiBLZWVwIGluIG1pbmQgdGhhdCBuZ0FuaW1hdGUgY2FuIGRldGVjdCBlYWNoIG9mIHRoZXNlIGNsYXNzZXMgd2hlbiBhZGRlZCBhbmQgcmVtb3ZlZC4KICoKICogIyMgQW5pbWF0aW9uIEhvb2tzCiAqCiAqIEFuaW1hdGlvbnMgd2l0aGluIG1vZGVscyBhcmUgdHJpZ2dlcmVkIHdoZW4gYW55IG9mIHRoZSBhc3NvY2lhdGVkIENTUyBjbGFzc2VzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZAogKiBvbiB0aGUgaW5wdXQgZWxlbWVudCB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGUgbW9kZWwuIFRoZXNlIGNsYXNzZXMgYXJlOiBgLm5nLXByaXN0aW5lYCwgYC5uZy1kaXJ0eWAsCiAqIGAubmctaW52YWxpZGAgYW5kIGAubmctdmFsaWRgIGFzIHdlbGwgYXMgYW55IG90aGVyIHZhbGlkYXRpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCBvbiB0aGUgbW9kZWwgaXRzZWxmLgogKiBUaGUgYW5pbWF0aW9ucyB0aGF0IGFyZSB0cmlnZ2VyZWQgd2l0aGluIG5nTW9kZWwgYXJlIHNpbWlsYXIgdG8gaG93IHRoZXkgd29yayBpbiBuZ0NsYXNzIGFuZAogKiBhbmltYXRpb25zIGNhbiBiZSBob29rZWQgaW50byB1c2luZyBDU1MgdHJhbnNpdGlvbnMsIGtleWZyYW1lcyBhcyB3ZWxsIGFzIEpTIGFuaW1hdGlvbnMuCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSB3YXkgdG8gdXRpbGl6ZSBDU1MgdHJhbnNpdGlvbnMgdG8gc3R5bGUgYW4gaW5wdXQgZWxlbWVudAogKiB0aGF0IGhhcyBiZWVuIHJlbmRlcmVkIGFzIGludmFsaWQgYWZ0ZXIgaXQgaGFzIGJlZW4gdmFsaWRhdGVkOgogKgogKiA8cHJlPgogKiAvL2JlIHN1cmUgdG8gaW5jbHVkZSBuZ0FuaW1hdGUgYXMgYSBtb2R1bGUgdG8gaG9vayBpbnRvIG1vcmUKICogLy9hZHZhbmNlZCBhbmltYXRpb25zCiAqIC5teS1pbnB1dCB7CiAqICAgdHJhbnNpdGlvbjowLjVzIGxpbmVhciBhbGw7CiAqICAgYmFja2dyb3VuZDogd2hpdGU7CiAqIH0KICogLm15LWlucHV0Lm5nLWludmFsaWQgewogKiAgIGJhY2tncm91bmQ6IHJlZDsKICogICBjb2xvcjp3aGl0ZTsKICogfQogKiA8L3ByZT4KICoKICogQGV4YW1wbGUKICogPGV4YW1wbGUgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIiBmaXhCYXNlPSJ0cnVlIiBtb2R1bGU9ImlucHV0RXhhbXBsZSI+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICA8c2NyaXB0PgogICAgICAgIGFuZ3VsYXIubW9kdWxlKCdpbnB1dEV4YW1wbGUnLCBbXSkKICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgICRzY29wZS52YWwgPSAnMSc7CiAgICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgIDxzdHlsZT4KICAgICAgICAgLm15LWlucHV0IHsKICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOwogICAgICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOwogICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICB9CiAgICAgICAgIC5teS1pbnB1dC5uZy1pbnZhbGlkIHsKICAgICAgICAgICBjb2xvcjp3aGl0ZTsKICAgICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgICAgIH0KICAgICAgIDwvc3R5bGU+CiAgICAgICBVcGRhdGUgaW5wdXQgdG8gc2VlIHRyYW5zaXRpb25zIHdoZW4gdmFsaWQvaW52YWxpZC4KICAgICAgIEludGVnZXIgaXMgYSB2YWxpZCB2YWx1ZS4KICAgICAgIDxmb3JtIG5hbWU9InRlc3RGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0idmFsIiBuZy1wYXR0ZXJuPSIvXlxkKyQvIiBuYW1lPSJhbmltIiBjbGFzcz0ibXktaW5wdXQiIC8+CiAgICAgICA8L2Zvcm0+CiAgICAgPC9maWxlPgogKiA8L2V4YW1wbGU+CiAqCiAqICMjIEJpbmRpbmcgdG8gYSBnZXR0ZXIvc2V0dGVyCiAqCiAqIFNvbWV0aW1lcyBpdCdzIGhlbHBmdWwgdG8gYmluZCBgbmdNb2RlbGAgdG8gYSBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uLiAgQSBnZXR0ZXIvc2V0dGVyIGlzIGEKICogZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIHdoZW4gY2FsbGVkIHdpdGggemVybyBhcmd1bWVudHMsIGFuZCBzZXRzCiAqIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhIG1vZGVsIHdoZW4gY2FsbGVkIHdpdGggYW4gYXJndW1lbnQuIEl0J3Mgc29tZXRpbWVzIHVzZWZ1bCB0byB1c2UgdGhpcwogKiBmb3IgbW9kZWxzIHRoYXQgaGF2ZSBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0J3MgZGlmZmVyZW50IHRoYW4gd2hhdCB0aGUgbW9kZWwgZXhwb3NlcwogKiB0byB0aGUgdmlldy4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+CiAqICoqQmVzdCBQcmFjdGljZToqKiBJdCdzIGJlc3QgdG8ga2VlcCBnZXR0ZXJzIGZhc3QgYmVjYXVzZSBBbmd1bGFyIGlzIGxpa2VseSB0byBjYWxsIHRoZW0gbW9yZQogKiBmcmVxdWVudGx5IHRoYW4gb3RoZXIgcGFydHMgb2YgeW91ciBjb2RlLgogKiA8L2Rpdj4KICoKICogWW91IHVzZSB0aGlzIGJlaGF2aW9yIGJ5IGFkZGluZyBgbmctbW9kZWwtb3B0aW9ucz0ieyBnZXR0ZXJTZXR0ZXI6IHRydWUgfSJgIHRvIGFuIGVsZW1lbnQgdGhhdAogKiBoYXMgYG5nLW1vZGVsYCBhdHRhY2hlZCB0byBpdC4gWW91IGNhbiBhbHNvIGFkZCBgbmctbW9kZWwtb3B0aW9ucz0ieyBnZXR0ZXJTZXR0ZXI6IHRydWUgfSJgIHRvCiAqIGEgYDxmb3JtPmAsIHdoaWNoIHdpbGwgZW5hYmxlIHRoaXMgYmVoYXZpb3IgZm9yIGFsbCBgPGlucHV0PmBzIHdpdGhpbiBpdC4gU2VlCiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgYG5nTW9kZWxPcHRpb25zYH0gZm9yIG1vcmUuCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBuZ01vZGVsYCB3aXRoIGEgZ2V0dGVyL3NldHRlcjoKICoKICogQGV4YW1wbGUKICogPGV4YW1wbGUgbmFtZT0ibmdNb2RlbC1nZXR0ZXItc2V0dGVyIiBtb2R1bGU9ImdldHRlclNldHRlckV4YW1wbGUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgIDxmb3JtIG5hbWU9InVzZXJGb3JtIj4KICAgICAgICAgICBOYW1lOgogICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyTmFtZSIKICAgICAgICAgICAgICAgICAgbmctbW9kZWw9InVzZXIubmFtZSIKICAgICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz0ieyBnZXR0ZXJTZXR0ZXI6IHRydWUgfSIgLz4KICAgICAgICAgPC9mb3JtPgogICAgICAgICA8cHJlPnVzZXIubmFtZSA9IDxzcGFuIG5nLWJpbmQ9InVzZXIubmFtZSgpIj48L3NwYW4+PC9wcmU+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4KICAgICAgIGFuZ3VsYXIubW9kdWxlKCdnZXR0ZXJTZXR0ZXJFeGFtcGxlJywgW10pCiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgdmFyIF9uYW1lID0gJ0JyaWFuJzsKICAgICAgICAgICAkc2NvcGUudXNlciA9IHsKICAgICAgICAgICAgIG5hbWU6IGZ1bmN0aW9uKG5ld05hbWUpIHsKICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5ld05hbWUpKSB7CiAgICAgICAgICAgICAgICAgX25hbWUgPSBuZXdOYW1lOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9OwogICAgICAgICB9XSk7CiAgICAgPC9maWxlPgogKiA8L2V4YW1wbGU+CiAqLwp2YXIgbmdNb2RlbERpcmVjdGl2ZSA9IFsnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRyb290U2NvcGUpIHsKICByZXR1cm4gewogICAgcmVzdHJpY3Q6ICdBJywKICAgIHJlcXVpcmU6IFsnbmdNb2RlbCcsICdeP2Zvcm0nLCAnXj9uZ01vZGVsT3B0aW9ucyddLAogICAgY29udHJvbGxlcjogTmdNb2RlbENvbnRyb2xsZXIsCiAgICAvLyBQcmVsaW5rIG5lZWRzIHRvIHJ1biBiZWZvcmUgYW55IGlucHV0IGRpcmVjdGl2ZQogICAgLy8gc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBOZ01vZGVsT3B0aW9ucyBpbiBOZ01vZGVsQ29udHJvbGxlcgogICAgLy8gYmVmb3JlIGFueW9uZSBlbHNlIHVzZXMgaXQuCiAgICBwcmlvcml0eTogMSwKICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nTW9kZWxDb21waWxlKGVsZW1lbnQpIHsKICAgICAgLy8gU2V0dXAgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29udHJvbAogICAgICBlbGVtZW50LmFkZENsYXNzKFBSSVNUSU5FX0NMQVNTKS5hZGRDbGFzcyhVTlRPVUNIRURfQ0xBU1MpLmFkZENsYXNzKFZBTElEX0NMQVNTKTsKCiAgICAgIHJldHVybiB7CiAgICAgICAgcHJlOiBmdW5jdGlvbiBuZ01vZGVsUHJlTGluayhzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHMpIHsKICAgICAgICAgIHZhciBtb2RlbEN0cmwgPSBjdHJsc1swXSwKICAgICAgICAgICAgICBmb3JtQ3RybCA9IGN0cmxzWzFdIHx8IG51bGxGb3JtQ3RybDsKCiAgICAgICAgICBtb2RlbEN0cmwuJCRzZXRPcHRpb25zKGN0cmxzWzJdICYmIGN0cmxzWzJdLiRvcHRpb25zKTsKCiAgICAgICAgICAvLyBub3RpZnkgb3RoZXJzLCBlc3BlY2lhbGx5IHBhcmVudCBmb3JtcwogICAgICAgICAgZm9ybUN0cmwuJGFkZENvbnRyb2wobW9kZWxDdHJsKTsKCiAgICAgICAgICBhdHRyLiRvYnNlcnZlKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUpIHsKICAgICAgICAgICAgaWYgKG1vZGVsQ3RybC4kbmFtZSAhPT0gbmV3VmFsdWUpIHsKICAgICAgICAgICAgICBmb3JtQ3RybC4kJHJlbmFtZUNvbnRyb2wobW9kZWxDdHJsLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZm9ybUN0cmwuJHJlbW92ZUNvbnRyb2wobW9kZWxDdHJsKTsKICAgICAgICAgIH0pOwogICAgICAgIH0sCiAgICAgICAgcG9zdDogZnVuY3Rpb24gbmdNb2RlbFBvc3RMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJscykgewogICAgICAgICAgdmFyIG1vZGVsQ3RybCA9IGN0cmxzWzBdOwogICAgICAgICAgaWYgKG1vZGVsQ3RybC4kb3B0aW9ucyAmJiBtb2RlbEN0cmwuJG9wdGlvbnMudXBkYXRlT24pIHsKICAgICAgICAgICAgZWxlbWVudC5vbihtb2RlbEN0cmwuJG9wdGlvbnMudXBkYXRlT24sIGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgICAgICAgbW9kZWxDdHJsLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoZXYgJiYgZXYudHlwZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIGVsZW1lbnQub24oJ2JsdXInLCBmdW5jdGlvbihldikgewogICAgICAgICAgICBpZiAobW9kZWxDdHJsLiR0b3VjaGVkKSByZXR1cm47CgogICAgICAgICAgICBpZiAoJHJvb3RTY29wZS4kJHBoYXNlKSB7CiAgICAgICAgICAgICAgc2NvcGUuJGV2YWxBc3luYyhtb2RlbEN0cmwuJHNldFRvdWNoZWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNjb3BlLiRhcHBseShtb2RlbEN0cmwuJHNldFRvdWNoZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgfTsKfV07CgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdDaGFuZ2UKICoKICogQGRlc2NyaXB0aW9uCiAqIEV2YWx1YXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyB0aGUgaW5wdXQuCiAqIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBpbW1lZGlhdGVseSwgdW5saWtlIHRoZSBKYXZhU2NyaXB0IG9uY2hhbmdlIGV2ZW50CiAqIHdoaWNoIG9ubHkgdHJpZ2dlcnMgYXQgdGhlIGVuZCBvZiBhIGNoYW5nZSAodXN1YWxseSwgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlCiAqIGZvcm0gZWxlbWVudCBvciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5KS4KICoKICogVGhlIGBuZ0NoYW5nZWAgZXhwcmVzc2lvbiBpcyBvbmx5IGV2YWx1YXRlZCB3aGVuIGEgY2hhbmdlIGluIHRoZSBpbnB1dCB2YWx1ZSBjYXVzZXMKICogYSBuZXcgdmFsdWUgdG8gYmUgY29tbWl0dGVkIHRvIHRoZSBtb2RlbC4KICoKICogSXQgd2lsbCBub3QgYmUgZXZhbHVhdGVkOgogKiAqIGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBgJHBhcnNlcnNgIHRyYW5zZm9ybWF0aW9uIHBpcGVsaW5lIGhhcyBub3QgY2hhbmdlZAogKiAqIGlmIHRoZSBpbnB1dCBoYXMgY29udGludWVkIHRvIGJlIGludmFsaWQgc2luY2UgdGhlIG1vZGVsIHdpbGwgc3RheSBgbnVsbGAKICogKiBpZiB0aGUgbW9kZWwgaXMgY2hhbmdlZCBwcm9ncmFtbWF0aWNhbGx5IGFuZCBub3QgYnkgYSBjaGFuZ2UgdG8gdGhlIGlucHV0IHZhbHVlCiAqCiAqCiAqIE5vdGUsIHRoaXMgZGlyZWN0aXZlIHJlcXVpcmVzIGBuZ01vZGVsYCB0byBiZSBwcmVzZW50LgogKgogKiBAZWxlbWVudCBpbnB1dAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2hhbmdlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24gY2hhbmdlCiAqIGluIGlucHV0IHZhbHVlLgogKgogKiBAZXhhbXBsZQogKiA8ZXhhbXBsZSBuYW1lPSJuZ0NoYW5nZS1kaXJlY3RpdmUiIG1vZHVsZT0iY2hhbmdlRXhhbXBsZSI+CiAqICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAqICAgICA8c2NyaXB0PgogKiAgICAgICBhbmd1bGFyLm1vZHVsZSgnY2hhbmdlRXhhbXBsZScsIFtdKQogKiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAqICAgICAgICAgICAkc2NvcGUuY291bnRlciA9IDA7CiAqICAgICAgICAgICAkc2NvcGUuY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAqICAgICAgICAgICAgICRzY29wZS5jb3VudGVyKys7CiAqICAgICAgICAgICB9OwogKiAgICAgICAgIH1dKTsKICogICAgIDwvc2NyaXB0PgogKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAqICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImNvbmZpcm1lZCIgbmctY2hhbmdlPSJjaGFuZ2UoKSIgaWQ9Im5nLWNoYW5nZS1leGFtcGxlMSIgLz4KICogICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iY29uZmlybWVkIiBpZD0ibmctY2hhbmdlLWV4YW1wbGUyIiAvPgogKiAgICAgICA8bGFiZWwgZm9yPSJuZy1jaGFuZ2UtZXhhbXBsZTIiPkNvbmZpcm1lZDwvbGFiZWw+PGJyIC8+CiAqICAgICAgIDx0dD5kZWJ1ZyA9IHt7Y29uZmlybWVkfX08L3R0Pjxici8+CiAqICAgICAgIDx0dD5jb3VudGVyID0ge3tjb3VudGVyfX08L3R0Pjxici8+CiAqICAgICA8L2Rpdj4KICogICA8L2ZpbGU+CiAqICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAqICAgICB2YXIgY291bnRlciA9IGVsZW1lbnQoYnkuYmluZGluZygnY291bnRlcicpKTsKICogICAgIHZhciBkZWJ1ZyA9IGVsZW1lbnQoYnkuYmluZGluZygnY29uZmlybWVkJykpOwogKgogKiAgICAgaXQoJ3Nob3VsZCBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBpZiBjaGFuZ2luZyBmcm9tIHZpZXcnLCBmdW5jdGlvbigpIHsKICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzAnKTsKICoKICogICAgICAgZWxlbWVudChieS5pZCgnbmctY2hhbmdlLWV4YW1wbGUxJykpLmNsaWNrKCk7CiAqCiAqICAgICAgIGV4cGVjdChjb3VudGVyLmdldFRleHQoKSkudG9Db250YWluKCcxJyk7CiAqICAgICAgIGV4cGVjdChkZWJ1Zy5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOwogKiAgICAgfSk7CiAqCiAqICAgICBpdCgnc2hvdWxkIG5vdCBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBpZiBjaGFuZ2luZyBmcm9tIG1vZGVsJywgZnVuY3Rpb24oKSB7CiAqICAgICAgIGVsZW1lbnQoYnkuaWQoJ25nLWNoYW5nZS1leGFtcGxlMicpKS5jbGljaygpOwoKICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzAnKTsKICogICAgICAgZXhwZWN0KGRlYnVnLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CiAqICAgICB9KTsKICogICA8L2ZpbGU+CiAqIDwvZXhhbXBsZT4KICovCnZhciBuZ0NoYW5nZURpcmVjdGl2ZSA9IHZhbHVlRm4oewogIHJlc3RyaWN0OiAnQScsCiAgcmVxdWlyZTogJ25nTW9kZWwnLAogIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7CiAgICBjdHJsLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKSB7CiAgICAgIHNjb3BlLiRldmFsKGF0dHIubmdDaGFuZ2UpOwogICAgfSk7CiAgfQp9KTsKCgp2YXIgcmVxdWlyZWREaXJlY3RpdmUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gewogICAgcmVzdHJpY3Q6ICdBJywKICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsCiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7CiAgICAgIGlmICghY3RybCkgcmV0dXJuOwogICAgICBhdHRyLnJlcXVpcmVkID0gdHJ1ZTsgLy8gZm9yY2UgdHJ1dGh5IGluIGNhc2Ugd2UgYXJlIG9uIG5vbiBpbnB1dCBlbGVtZW50CgogICAgICBjdHJsLiR2YWxpZGF0b3JzLnJlcXVpcmVkID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7CiAgICAgICAgcmV0dXJuICFhdHRyLnJlcXVpcmVkIHx8ICFjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSk7CiAgICAgIH07CgogICAgICBhdHRyLiRvYnNlcnZlKCdyZXF1aXJlZCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CiAgICAgIH0pOwogICAgfQogIH07Cn07CgoKdmFyIHBhdHRlcm5EaXJlY3RpdmUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gewogICAgcmVzdHJpY3Q6ICdBJywKICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsCiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7CiAgICAgIGlmICghY3RybCkgcmV0dXJuOwoKICAgICAgdmFyIHJlZ2V4cCwgcGF0dGVybkV4cCA9IGF0dHIubmdQYXR0ZXJuIHx8IGF0dHIucGF0dGVybjsKICAgICAgYXR0ci4kb2JzZXJ2ZSgncGF0dGVybicsIGZ1bmN0aW9uKHJlZ2V4KSB7CiAgICAgICAgaWYgKGlzU3RyaW5nKHJlZ2V4KSAmJiByZWdleC5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgcmVnZXggKyAnJCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJlZ2V4ICYmICFyZWdleC50ZXN0KSB7CiAgICAgICAgICB0aHJvdyBtaW5FcnIoJ25nUGF0dGVybicpKCdub3JlZ2V4cCcsCiAgICAgICAgICAgICdFeHBlY3RlZCB7MH0gdG8gYmUgYSBSZWdFeHAgYnV0IHdhcyB7MX0uIEVsZW1lbnQ6IHsyfScsIHBhdHRlcm5FeHAsCiAgICAgICAgICAgIHJlZ2V4LCBzdGFydGluZ1RhZyhlbG0pKTsKICAgICAgICB9CgogICAgICAgIHJlZ2V4cCA9IHJlZ2V4IHx8IHVuZGVmaW5lZDsKICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpOwogICAgICB9KTsKCiAgICAgIGN0cmwuJHZhbGlkYXRvcnMucGF0dGVybiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IGlzVW5kZWZpbmVkKHJlZ2V4cCkgfHwgcmVnZXhwLnRlc3QodmFsdWUpOwogICAgICB9OwogICAgfQogIH07Cn07CgoKdmFyIG1heGxlbmd0aERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0EnLAogICAgcmVxdWlyZTogJz9uZ01vZGVsJywKICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbG0sIGF0dHIsIGN0cmwpIHsKICAgICAgaWYgKCFjdHJsKSByZXR1cm47CgogICAgICB2YXIgbWF4bGVuZ3RoID0gLTE7CiAgICAgIGF0dHIuJG9ic2VydmUoJ21heGxlbmd0aCcsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIGludFZhbCA9IGludCh2YWx1ZSk7CiAgICAgICAgbWF4bGVuZ3RoID0gaXNOYU4oaW50VmFsKSA/IC0xIDogaW50VmFsOwogICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CiAgICAgIH0pOwogICAgICBjdHJsLiR2YWxpZGF0b3JzLm1heGxlbmd0aCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgewogICAgICAgIHJldHVybiAobWF4bGVuZ3RoIDwgMCkgfHwgY3RybC4kaXNFbXB0eShtb2RlbFZhbHVlKSB8fCAodmlld1ZhbHVlLmxlbmd0aCA8PSBtYXhsZW5ndGgpOwogICAgICB9OwogICAgfQogIH07Cn07Cgp2YXIgbWlubGVuZ3RoRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnQScsCiAgICByZXF1aXJlOiAnP25nTW9kZWwnLAogICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsbSwgYXR0ciwgY3RybCkgewogICAgICBpZiAoIWN0cmwpIHJldHVybjsKCiAgICAgIHZhciBtaW5sZW5ndGggPSAwOwogICAgICBhdHRyLiRvYnNlcnZlKCdtaW5sZW5ndGgnLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIG1pbmxlbmd0aCA9IGludCh2YWx1ZSkgfHwgMDsKICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpOwogICAgICB9KTsKICAgICAgY3RybC4kdmFsaWRhdG9ycy5taW5sZW5ndGggPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHsKICAgICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2aWV3VmFsdWUpIHx8IHZpZXdWYWx1ZS5sZW5ndGggPj0gbWlubGVuZ3RoOwogICAgICB9OwogICAgfQogIH07Cn07CgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdMaXN0CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUZXh0IGlucHV0IHRoYXQgY29udmVydHMgYmV0d2VlbiBhIGRlbGltaXRlZCBzdHJpbmcgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3MuIFRoZSBkZWZhdWx0CiAqIGRlbGltaXRlciBpcyBhIGNvbW1hIGZvbGxvd2VkIGJ5IGEgc3BhY2UgLSBlcXVpdmFsZW50IHRvIGBuZy1saXN0PSIsICJgLiBZb3UgY2FuIHNwZWNpZnkgYSBjdXN0b20KICogZGVsaW1pdGVyIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYG5nTGlzdGAgYXR0cmlidXRlIC0gZm9yIGV4YW1wbGUsIGBuZy1saXN0PSIgfCAiYC4KICoKICogVGhlIGJlaGF2aW91ciBvZiB0aGUgZGlyZWN0aXZlIGlzIGFmZmVjdGVkIGJ5IHRoZSB1c2Ugb2YgdGhlIGBuZ1RyaW1gIGF0dHJpYnV0ZS4KICogKiBJZiBgbmdUcmltYCBpcyBzZXQgdG8gYCJmYWxzZSJgIHRoZW4gd2hpdGVzcGFjZSBhcm91bmQgYm90aCB0aGUgc2VwYXJhdG9yIGFuZCBlYWNoCiAqICAgbGlzdCBpdGVtIGlzIHJlc3BlY3RlZC4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIHVzZXIgb2YgdGhlIGRpcmVjdGl2ZSBpcyByZXNwb25zaWJsZSBmb3IKICogICBkZWFsaW5nIHdpdGggd2hpdGVzcGFjZSBidXQgYWxzbyBhbGxvd3MgeW91IHRvIHVzZSB3aGl0ZXNwYWNlIGFzIGEgZGVsaW1pdGVyLCBzdWNoIGFzIGEKICogICB0YWIgb3IgbmV3bGluZSBjaGFyYWN0ZXIuCiAqICogT3RoZXJ3aXNlIHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkZWxpbWl0ZXIgaXMgaWdub3JlZCB3aGVuIHNwbGl0dGluZyAoYWx0aG91Z2ggaXQgaXMgcmVzcGVjdGVkCiAqICAgd2hlbiBqb2luaW5nIHRoZSBsaXN0IGl0ZW1zIGJhY2sgdG9nZXRoZXIpIGFuZCB3aGl0ZXNwYWNlIGFyb3VuZCBlYWNoIGxpc3QgaXRlbSBpcyBzdHJpcHBlZAogKiAgIGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCiAqCiAqICMjIyBFeGFtcGxlIHdpdGggVmFsaWRhdGlvbgogKgogKiA8ZXhhbXBsZSBuYW1lPSJuZ0xpc3QtZGlyZWN0aXZlIiBtb2R1bGU9Imxpc3RFeGFtcGxlIj4KICogICA8ZmlsZSBuYW1lPSJhcHAuanMiPgogKiAgICAgIGFuZ3VsYXIubW9kdWxlKCdsaXN0RXhhbXBsZScsIFtdKQogKiAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICogICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydtb3JwaGV1cycsICduZW8nLCAndHJpbml0eSddOwogKiAgICAgICAgfV0pOwogKiAgIDwvZmlsZT4KICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICogICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAqICAgICAgTGlzdDogPGlucHV0IG5hbWU9Im5hbWVzSW5wdXQiIG5nLW1vZGVsPSJuYW1lcyIgbmctbGlzdCByZXF1aXJlZD4KICogICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5uYW1lc0lucHV0LiRlcnJvci5yZXF1aXJlZCI+CiAqICAgICAgICBSZXF1aXJlZCE8L3NwYW4+CiAqICAgICAgPGJyPgogKiAgICAgIDx0dD5uYW1lcyA9IHt7bmFtZXN9fTwvdHQ+PGJyLz4KICogICAgICA8dHQ+bXlGb3JtLm5hbWVzSW5wdXQuJHZhbGlkID0ge3tteUZvcm0ubmFtZXNJbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4KICogICAgICA8dHQ+bXlGb3JtLm5hbWVzSW5wdXQuJGVycm9yID0ge3tteUZvcm0ubmFtZXNJbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz4KICogICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPgogKiAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KICogICAgIDwvZm9ybT4KICogICA8L2ZpbGU+CiAqICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAqICAgICB2YXIgbGlzdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbmFtZXMnKSk7CiAqICAgICB2YXIgbmFtZXMgPSBlbGVtZW50KGJ5LmV4YWN0QmluZGluZygnbmFtZXMnKSk7CiAqICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5uYW1lc0lucHV0LiR2YWxpZCcpKTsKICogICAgIHZhciBlcnJvciA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmVycm9yJykpOwogKgogKiAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7CiAqICAgICAgIGV4cGVjdChuYW1lcy5nZXRUZXh0KCkpLnRvQ29udGFpbignWyJtb3JwaGV1cyIsIm5lbyIsInRyaW5pdHkiXScpOwogKiAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsKICogICAgICAgZXhwZWN0KGVycm9yLmdldENzc1ZhbHVlKCdkaXNwbGF5JykpLnRvQmUoJ25vbmUnKTsKICogICAgIH0pOwogKgogKiAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CiAqICAgICAgIGxpc3RJbnB1dC5jbGVhcigpOwogKiAgICAgICBsaXN0SW5wdXQuc2VuZEtleXMoJycpOwogKgogKiAgICAgICBleHBlY3QobmFtZXMuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpOwogKiAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CiAqICAgICAgIGV4cGVjdChlcnJvci5nZXRDc3NWYWx1ZSgnZGlzcGxheScpKS5ub3QudG9CZSgnbm9uZScpOwogKiAgICAgfSk7CiAqICAgPC9maWxlPgogKiA8L2V4YW1wbGU+CiAqCiAqICMjIyBFeGFtcGxlIC0gc3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UKICogPGV4YW1wbGUgbmFtZT0ibmdMaXN0LWRpcmVjdGl2ZS1uZXdsaW5lcyI+CiAqICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAqICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD0ibGlzdCIgbmctbGlzdD0iJiMxMDsiIG5nLXRyaW09ImZhbHNlIj48L3RleHRhcmVhPgogKiAgICA8cHJlPnt7IGxpc3QgfCBqc29uIH19PC9wcmU+CiAqICAgPC9maWxlPgogKiAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogKiAgICAgaXQoInNob3VsZCBzcGxpdCB0aGUgdGV4dCBieSBuZXdsaW5lcyIsIGZ1bmN0aW9uKCkgewogKiAgICAgICB2YXIgbGlzdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbGlzdCcpKTsKICogICAgICAgdmFyIG91dHB1dCA9IGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCB8IGpzb24nKSk7CiAqICAgICAgIGxpc3RJbnB1dC5zZW5kS2V5cygnYWJjXG5kZWZcbmdoaScpOwogKiAgICAgICBleHBlY3Qob3V0cHV0LmdldFRleHQoKSkudG9Db250YWluKCdbXG4gICJhYmMiLFxuICAiZGVmIixcbiAgImdoaSJcbl0nKTsKICogICAgIH0pOwogKiAgIDwvZmlsZT4KICogPC9leGFtcGxlPgogKgogKiBAZWxlbWVudCBpbnB1dAogKiBAcGFyYW0ge3N0cmluZz19IG5nTGlzdCBvcHRpb25hbCBkZWxpbWl0ZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzcGxpdCB0aGUgdmFsdWUuCiAqLwp2YXIgbmdMaXN0RGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnQScsCiAgICBwcmlvcml0eTogMTAwLAogICAgcmVxdWlyZTogJ25nTW9kZWwnLAogICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwpIHsKICAgICAgLy8gV2Ugd2FudCB0byBjb250cm9sIHdoaXRlc3BhY2UgdHJpbW1pbmcgc28gd2UgdXNlIHRoaXMgY29udm9sdXRlZCBhcHByb2FjaAogICAgICAvLyB0byBhY2Nlc3MgdGhlIG5nTGlzdCBhdHRyaWJ1dGUsIHdoaWNoIGRvZXNuJ3QgcHJlLXRyaW0gdGhlIGF0dHJpYnV0ZQogICAgICB2YXIgbmdMaXN0ID0gZWxlbWVudC5hdHRyKGF0dHIuJGF0dHIubmdMaXN0KSB8fCAnLCAnOwogICAgICB2YXIgdHJpbVZhbHVlcyA9IGF0dHIubmdUcmltICE9PSAnZmFsc2UnOwogICAgICB2YXIgc2VwYXJhdG9yID0gdHJpbVZhbHVlcyA/IHRyaW0obmdMaXN0KSA6IG5nTGlzdDsKCiAgICAgIHZhciBwYXJzZSA9IGZ1bmN0aW9uKHZpZXdWYWx1ZSkgewogICAgICAgIC8vIElmIHRoZSB2aWV3VmFsdWUgaXMgaW52YWxpZCAoc2F5IHJlcXVpcmVkIGJ1dCBlbXB0eSkgaXQgd2lsbCBiZSBgdW5kZWZpbmVkYAogICAgICAgIGlmIChpc1VuZGVmaW5lZCh2aWV3VmFsdWUpKSByZXR1cm47CgogICAgICAgIHZhciBsaXN0ID0gW107CgogICAgICAgIGlmICh2aWV3VmFsdWUpIHsKICAgICAgICAgIGZvckVhY2godmlld1ZhbHVlLnNwbGl0KHNlcGFyYXRvciksIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSkgbGlzdC5wdXNoKHRyaW1WYWx1ZXMgPyB0cmltKHZhbHVlKSA6IHZhbHVlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgIH07CgogICAgICBjdHJsLiRwYXJzZXJzLnB1c2gocGFyc2UpOwogICAgICBjdHJsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZS5qb2luKG5nTGlzdCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9KTsKCiAgICAgIC8vIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCAkaXNFbXB0eSBiZWNhdXNlIGFuIGVtcHR5IGFycmF5IG1lYW5zIHRoZSBpbnB1dCBpcyBlbXB0eS4KICAgICAgY3RybC4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuICF2YWx1ZSB8fCAhdmFsdWUubGVuZ3RoOwogICAgICB9OwogICAgfQogIH07Cn07CgoKdmFyIENPTlNUQU5UX1ZBTFVFX1JFR0VYUCA9IC9eKHRydWV8ZmFsc2V8XGQrKSQvOwovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ1ZhbHVlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBCaW5kcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB0byB0aGUgdmFsdWUgb2YgYDxvcHRpb24+YCBvciB7QGxpbmsgaW5wdXRbcmFkaW9dIGBpbnB1dFtyYWRpb11gfSwKICogc28gdGhhdCB3aGVuIHRoZSBlbGVtZW50IGlzIHNlbGVjdGVkLCB0aGUge0BsaW5rIG5nTW9kZWwgYG5nTW9kZWxgfSBvZiB0aGF0IGVsZW1lbnQgaXMgc2V0IHRvCiAqIHRoZSBib3VuZCB2YWx1ZS4KICoKICogYG5nVmFsdWVgIGlzIHVzZWZ1bCB3aGVuIGR5bmFtaWNhbGx5IGdlbmVyYXRpbmcgbGlzdHMgb2YgcmFkaW8gYnV0dG9ucyB1c2luZwogKiB7QGxpbmsgbmdSZXBlYXQgYG5nUmVwZWF0YH0sIGFzIHNob3duIGJlbG93LgogKgogKiBMaWtld2lzZSwgYG5nVmFsdWVgIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGA8b3B0aW9uPmAgZWxlbWVudHMgZm9yCiAqIHRoZSB7QGxpbmsgc2VsZWN0IGBzZWxlY3RgfSBlbGVtZW50LiBJbiB0aGF0IGNhc2UgaG93ZXZlciwgb25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQKICogZm9yIHRoZSBgdmFsdWUgYGF0dHJpYnV0ZSwgc28gdGhlIHJlc3VsdGluZyBgbmdNb2RlbGAgd2lsbCBhbHdheXMgYmUgYSBzdHJpbmcuCiAqIFN1cHBvcnQgZm9yIGBzZWxlY3RgIG1vZGVscyB3aXRoIG5vbi1zdHJpbmcgdmFsdWVzIGlzIGF2YWlsYWJsZSB2aWEgYG5nT3B0aW9uc2AuCiAqCiAqIEBlbGVtZW50IGlucHV0CiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdWYWx1ZSBhbmd1bGFyIGV4cHJlc3Npb24sIHdob3NlIHZhbHVlIHdpbGwgYmUgYm91bmQgdG8gdGhlIGB2YWx1ZWAgYXR0cmlidXRlCiAqICAgb2YgdGhlIGBpbnB1dGAgZWxlbWVudAogKgogKiBAZXhhbXBsZQogICAgPGV4YW1wbGUgbmFtZT0ibmdWYWx1ZS1kaXJlY3RpdmUiIG1vZHVsZT0idmFsdWVFeGFtcGxlIj4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICA8c2NyaXB0PgogICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3ZhbHVlRXhhbXBsZScsIFtdKQogICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgICRzY29wZS5uYW1lcyA9IFsncGl6emEnLCAndW5pY29ybnMnLCAncm9ib3RzJ107CiAgICAgICAgICAgICAgJHNjb3BlLm15ID0geyBmYXZvcml0ZTogJ3VuaWNvcm5zJyB9OwogICAgICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgICA8Zm9ybSBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgICA8aDI+V2hpY2ggaXMgeW91ciBmYXZvcml0ZT88L2gyPgogICAgICAgICAgICA8bGFiZWwgbmctcmVwZWF0PSJuYW1lIGluIG5hbWVzIiBmb3I9Int7bmFtZX19Ij4KICAgICAgICAgICAgICB7e25hbWV9fQogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIKICAgICAgICAgICAgICAgICAgICAgbmctbW9kZWw9Im15LmZhdm9yaXRlIgogICAgICAgICAgICAgICAgICAgICBuZy12YWx1ZT0ibmFtZSIKICAgICAgICAgICAgICAgICAgICAgaWQ9Int7bmFtZX19IgogICAgICAgICAgICAgICAgICAgICBuYW1lPSJmYXZvcml0ZSI+CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICA8ZGl2PllvdSBjaG9zZSB7e215LmZhdm9yaXRlfX08L2Rpdj4KICAgICAgICA8L2Zvcm0+CiAgICAgIDwvZmlsZT4KICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgdmFyIGZhdm9yaXRlID0gZWxlbWVudChieS5iaW5kaW5nKCdteS5mYXZvcml0ZScpKTsKCiAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBleHBlY3QoZmF2b3JpdGUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3VuaWNvcm5zJyk7CiAgICAgICAgfSk7CiAgICAgICAgaXQoJ3Nob3VsZCBiaW5kIHRoZSB2YWx1ZXMgdG8gdGhlIGlucHV0cycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZWxlbWVudC5hbGwoYnkubW9kZWwoJ215LmZhdm9yaXRlJykpLmdldCgwKS5jbGljaygpOwogICAgICAgICAgZXhwZWN0KGZhdm9yaXRlLmdldFRleHQoKSkudG9Db250YWluKCdwaXp6YScpOwogICAgICAgIH0pOwogICAgICA8L2ZpbGU+CiAgICA8L2V4YW1wbGU+CiAqLwp2YXIgbmdWYWx1ZURpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0EnLAogICAgcHJpb3JpdHk6IDEwMCwKICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRwbCwgdHBsQXR0cikgewogICAgICBpZiAoQ09OU1RBTlRfVkFMVUVfUkVHRVhQLnRlc3QodHBsQXR0ci5uZ1ZhbHVlKSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1ZhbHVlQ29uc3RhbnRMaW5rKHNjb3BlLCBlbG0sIGF0dHIpIHsKICAgICAgICAgIGF0dHIuJHNldCgndmFsdWUnLCBzY29wZS4kZXZhbChhdHRyLm5nVmFsdWUpKTsKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1ZhbHVlTGluayhzY29wZSwgZWxtLCBhdHRyKSB7CiAgICAgICAgICBzY29wZS4kd2F0Y2goYXR0ci5uZ1ZhbHVlLCBmdW5jdGlvbiB2YWx1ZVdhdGNoQWN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGF0dHIuJHNldCgndmFsdWUnLCB2YWx1ZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfTsKfTsKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nTW9kZWxPcHRpb25zCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBBbGxvd3MgdHVuaW5nIGhvdyBtb2RlbCB1cGRhdGVzIGFyZSBkb25lLiBVc2luZyBgbmdNb2RlbE9wdGlvbnNgIHlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbSBsaXN0IG9mCiAqIGV2ZW50cyB0aGF0IHdpbGwgdHJpZ2dlciBhIG1vZGVsIHVwZGF0ZSBhbmQvb3IgYSBkZWJvdW5jaW5nIGRlbGF5IHNvIHRoYXQgdGhlIGFjdHVhbCB1cGRhdGUgb25seQogKiB0YWtlcyBwbGFjZSB3aGVuIGEgdGltZXIgZXhwaXJlczsgdGhpcyB0aW1lciB3aWxsIGJlIHJlc2V0IGFmdGVyIGFub3RoZXIgY2hhbmdlIHRha2VzIHBsYWNlLgogKgogKiBHaXZlbiB0aGUgbmF0dXJlIG9mIGBuZ01vZGVsT3B0aW9uc2AsIHRoZSB2YWx1ZSBkaXNwbGF5ZWQgaW5zaWRlIGlucHV0IGZpZWxkcyBpbiB0aGUgdmlldyBtaWdodAogKiBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgdmFsdWUgaW4gdGhlIGFjdHVhbCBtb2RlbC4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSB1cGRhdGUgdGhlIG1vZGVsIHlvdQogKiBzaG91bGQgYWxzbyBpbnZva2Uge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIgYCRyb2xsYmFja1ZpZXdWYWx1ZWB9IG9uIHRoZSByZWxldmFudCBpbnB1dCBmaWVsZCBpbgogKiBvcmRlciB0byBtYWtlIHN1cmUgaXQgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGFuZCB0aGF0IGFueSBkZWJvdW5jZWQgYWN0aW9uIGlzIGNhbmNlbGVkLgogKgogKiBUaGUgZWFzaWVzdCB3YXkgdG8gcmVmZXJlbmNlIHRoZSBjb250cm9sJ3Mge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIgYCRyb2xsYmFja1ZpZXdWYWx1ZWB9CiAqIG1ldGhvZCBpcyBieSBtYWtpbmcgc3VyZSB0aGUgaW5wdXQgaXMgcGxhY2VkIGluc2lkZSBhIGZvcm0gdGhhdCBoYXMgYSBgbmFtZWAgYXR0cmlidXRlLiBUaGlzIGlzCiAqIGltcG9ydGFudCBiZWNhdXNlIGBmb3JtYCBjb250cm9sbGVycyBhcmUgcHVibGlzaGVkIHRvIHRoZSByZWxhdGVkIHNjb3BlIHVuZGVyIHRoZSBuYW1lIGluIHRoZWlyCiAqIGBuYW1lYCBhdHRyaWJ1dGUuCiAqCiAqIEFueSBwZW5kaW5nIGNoYW5nZXMgd2lsbCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5IHdoZW4gYW4gZW5jbG9zaW5nIGZvcm0gaXMgc3VibWl0dGVkIHZpYSB0aGUKICogYHN1Ym1pdGAgZXZlbnQuIE5vdGUgdGhhdCBgbmdDbGlja2AgZXZlbnRzIHdpbGwgb2NjdXIgYmVmb3JlIHRoZSBtb2RlbCBpcyB1cGRhdGVkLiBVc2UgYG5nU3VibWl0YAogKiB0byBoYXZlIGFjY2VzcyB0byB0aGUgdXBkYXRlZCBtb2RlbC4KICoKICogYG5nTW9kZWxPcHRpb25zYCBoYXMgYW4gZWZmZWN0IG9uIHRoZSBlbGVtZW50IGl0J3MgZGVjbGFyZWQgb24gYW5kIGl0cyBkZXNjZW5kYW50cy4KICoKICogQHBhcmFtIHtPYmplY3R9IG5nTW9kZWxPcHRpb25zIG9wdGlvbnMgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgbW9kZWwuIFZhbGlkIGtleXMgYXJlOgogKiAgIC0gYHVwZGF0ZU9uYDogc3RyaW5nIHNwZWNpZnlpbmcgd2hpY2ggZXZlbnQgc2hvdWxkIHRoZSBpbnB1dCBiZSBib3VuZCB0by4gWW91IGNhbiBzZXQgc2V2ZXJhbAogKiAgICAgZXZlbnRzIHVzaW5nIGFujNzvVv21AgCbAgAAmwIAAAgAJ60eE2j3KB/SxQgARQACjbfhQABABvCiwKgHNsCoB2CVKh/1xujtzZOmk6qAGAISjFkAAAEBCAoAo17RAE2lzEdFVCAvb25vcy91aS9hcHAvdmlldy9saW5rL2xpbmsuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9W/bUCAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PE9AAEAGbo7AqAc2wKgHYJUiH/VYenzTQb30yIAQDQ4TTwAAAQEICgCjXtEATaXMjNzvViK2AgAKIAAACiAAAGj3KB/SxQgAJ60eEwgARQAf/NSUQABABraAwKgHYMCoBzYf9ZUiQb30yFh6fNOAGAFTr9UAAAEBCAoATaXNAKNezyBzcGFjZSBkZWxpbWl0ZWQgbGlzdC4gVGhlcmUgaXMgYSBzcGVjaWFsIGV2ZW50IGNhbGxlZCBgZGVmYXVsdGAgdGhhdAogKiAgICAgbWF0Y2hlcyB0aGUgZGVmYXVsdCBldmVudHMgYmVsb25naW5nIG9mIHRoZSBjb250cm9sLgogKiAgIC0gYGRlYm91bmNlYDogaW50ZWdlciB2YWx1ZSB3aGljaCBjb250YWlucyB0aGUgZGVib3VuY2UgbW9kZWwgdXBkYXRlIHZhbHVlIGluIG1pbGxpc2Vjb25kcy4gQQogKiAgICAgdmFsdWUgb2YgMCB0cmlnZ2VycyBhbiBpbW1lZGlhdGUgdXBkYXRlLiBJZiBhbiBvYmplY3QgaXMgc3VwcGxpZWQgaW5zdGVhZCwgeW91IGNhbiBzcGVjaWZ5IGEKICogICAgIGN1c3RvbSB2YWx1ZSBmb3IgZWFjaCBldmVudC4gRm9yIGV4YW1wbGU6CiAqICAgICBgbmctbW9kZWwtb3B0aW9ucz0ieyB1cGRhdGVPbjogJ2RlZmF1bHQgYmx1cicsIGRlYm91bmNlOiB7J2RlZmF1bHQnOiA1MDAsICdibHVyJzogMH0gfSJgCiAqICAgLSBgYWxsb3dJbnZhbGlkYDogYm9vbGVhbiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kZWwgY2FuIGJlIHNldCB3aXRoIHZhbHVlcyB0aGF0IGRpZAogKiAgICAgbm90IHZhbGlkYXRlIGNvcnJlY3RseSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHNldHRpbmcgdGhlIG1vZGVsIHRvIHVuZGVmaW5lZC4KICogICAtIGBnZXR0ZXJTZXR0ZXJgOiBib29sZWFuIHZhbHVlIHdoaWNoIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gdHJlYXQgZnVuY3Rpb25zIGJvdW5kIHRvCiAgICAgICBgbmdNb2RlbGAgYXMgZ2V0dGVycy9zZXR0ZXJzLgogKiAgIC0gYHRpbWV6b25lYDogRGVmaW5lcyB0aGUgdGltZXpvbmUgdG8gYmUgdXNlZCB0byByZWFkL3dyaXRlIHRoZSBgRGF0ZWAgaW5zdGFuY2UgaW4gdGhlIG1vZGVsIGZvcgogKiAgICAgYDxpbnB1dCB0eXBlPSJkYXRlIj5gLCBgPGlucHV0IHR5cGU9InRpbWUiPmAsIC4uLiAuIFJpZ2h0IG5vdywgdGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGAnVVRDJ2AsCiAqICAgICBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdGltZXpvbmUgb2YgdGhlIGJyb3dzZXIgd2lsbCBiZSB1c2VkLgogKgogKiBAZXhhbXBsZQoKICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIG92ZXJyaWRlIGltbWVkaWF0ZSB1cGRhdGVzLiBDaGFuZ2VzIG9uIHRoZSBpbnB1dHMgd2l0aGluIHRoZQogIGZvcm0gd2lsbCB1cGRhdGUgdGhlIG1vZGVsIG9ubHkgd2hlbiB0aGUgY29udHJvbCBsb3NlcyBmb2N1cyAoYmx1ciBldmVudCkuIElmIGBlc2NhcGVgIGtleSBpcwogIHByZXNzZWQgd2hpbGUgdGhlIGlucHV0IGZpZWxkIGlzIGZvY3VzZWQsIHRoZSB2YWx1ZSBpcyByZXNldCB0byB0aGUgdmFsdWUgaW4gdGhlIGN1cnJlbnQgbW9kZWwuCgogIDxleGFtcGxlIG5hbWU9Im5nTW9kZWxPcHRpb25zLWRpcmVjdGl2ZS1ibHVyIiBtb2R1bGU9Im9wdGlvbnNFeGFtcGxlIj4KICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICA8Zm9ybSBuYW1lPSJ1c2VyRm9ybSI+CiAgICAgICAgICBOYW1lOgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJOYW1lIgogICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJ1c2VyLm5hbWUiCiAgICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz0ieyB1cGRhdGVPbjogJ2JsdXInIH0iCiAgICAgICAgICAgICAgICAgbmcta2V5dXA9ImNhbmNlbCgkZXZlbnQpIiAvPjxiciAvPgoKICAgICAgICAgIE90aGVyIGRhdGE6CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InVzZXIuZGF0YSIgLz48YnIgLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHByZT51c2VyLm5hbWUgPSA8c3BhbiBuZy1iaW5kPSJ1c2VyLm5hbWUiPjwvc3Bhbj48L3ByZT4KICAgICAgPC9kaXY+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJhcHAuanMiPgogICAgICBhbmd1bGFyLm1vZHVsZSgnb3B0aW9uc0V4YW1wbGUnLCBbXSkKICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgJHNjb3BlLnVzZXIgPSB7IG5hbWU6ICdzYXknLCBkYXRhOiAnJyB9OwoKICAgICAgICAgICRzY29wZS5jYW5jZWwgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMjcpIHsKICAgICAgICAgICAgICAkc2NvcGUudXNlckZvcm0udXNlck5hbWUuJHJvbGxiYWNrVmlld1ZhbHVlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgfV0pOwogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgIHZhciBtb2RlbCA9IGVsZW1lbnQoYnkuYmluZGluZygndXNlci5uYW1lJykpOwogICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyLm5hbWUnKSk7CiAgICAgIHZhciBvdGhlciA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXIuZGF0YScpKTsKCiAgICAgIGl0KCdzaG91bGQgYWxsb3cgY3VzdG9tIGV2ZW50cycsIGZ1bmN0aW9uKCkgewogICAgICAgIGlucHV0LnNlbmRLZXlzKCcgaGVsbG8nKTsKICAgICAgICBpbnB1dC5jbGljaygpOwogICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3NheScpOwogICAgICAgIG90aGVyLmNsaWNrKCk7CiAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9FcXVhbCgnc2F5IGhlbGxvJyk7CiAgICAgIH0pOwoKICAgICAgaXQoJ3Nob3VsZCAkcm9sbGJhY2tWaWV3VmFsdWUgd2hlbiBtb2RlbCBjaGFuZ2VzJywgZnVuY3Rpb24oKSB7CiAgICAgICAgaW5wdXQuc2VuZEtleXMoJyBoZWxsbycpOwogICAgICAgIGV4cGVjdChpbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvRXF1YWwoJ3NheSBoZWxsbycpOwogICAgICAgIGlucHV0LnNlbmRLZXlzKHByb3RyYWN0b3IuS2V5LkVTQ0FQRSk7CiAgICAgICAgZXhwZWN0KGlucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnc2F5Jyk7CiAgICAgICAgb3RoZXIuY2xpY2soKTsKICAgICAgICBleHBlY3QobW9kZWwuZ2V0VGV4dCgpKS50b0VxdWFsKCdzYXknKTsKICAgICAgfSk7CiAgICA8L2ZpbGU+CiAgPC9leGFtcGxlPgoKICBUaGlzIG9uZSBzaG93cyBob3cgdG8gZGVib3VuY2UgbW9kZWwgY2hhbmdlcy4gTW9kZWwgd2lsbCBiZSB1cGRhdGVkIG9ubHkgMSBzZWMgYWZ0ZXIgbGFzdCBjaGFuZ2UuCiAgSWYgdGhlIGBDbGVhcmAgYnV0dG9uIGlzIHByZXNzZWQsIGFueSBkZWJvdW5jZWQgYWN0aW9uIGlzIGNhbmNlbGVkIGFuZCB0aGUgdmFsdWUgYmVjb21lcyBlbXB0eS4KCiAgPGV4YW1wbGUgbmFtZT0ibmdNb2RlbE9wdGlvbnMtZGlyZWN0aXZlLWRlYm91bmNlIiBtb2R1bGU9Im9wdGlvbnNFeGFtcGxlIj4KICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICA8Zm9ybSBuYW1lPSJ1c2VyRm9ybSI+CiAgICAgICAgICBOYW1lOgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJOYW1lIgogICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJ1c2VyLm5hbWUiCiAgICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMTAwMCB9IiAvPgogICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0idXNlckZvcm0udXNlck5hbWUuJHJvbGxiYWNrVmlld1ZhbHVlKCk7IHVzZXIubmFtZT0nJyI+Q2xlYXI8L2J1dHRvbj48YnIgLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHByZT51c2VyLm5hbWUgPSA8c3BhbiBuZy1iaW5kPSJ1c2VyLm5hbWUiPjwvc3Bhbj48L3ByZT4KICAgICAgPC9kaXY+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJhcHAuanMiPgogICAgICBhbmd1bGFyLm1vZHVsZSgnb3B0aW9uc0V4YW1wbGUnLCBbXSkKICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgJHNjb3BlLnVzZXIgPSB7IG5hbWU6ICdzYXknIH07CiAgICAgICAgfV0pOwogICAgPC9maWxlPgogIDwvZXhhbXBsZT4KCiAgVGhpcyBvbmUgc2hvd3MgaG93IHRvIGJpbmQgdG8gZ2V0dGVyL3NldHRlcnM6CgogIDxleGFtcGxlIG5hbWU9Im5nTW9kZWxPcHRpb25zLWRpcmVjdGl2ZS1nZXR0ZXItc2V0dGVyIiBtb2R1bGU9ImdldHRlclNldHRlckV4YW1wbGUiPgogICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgIDxmb3JtIG5hbWU9InVzZXJGb3JtIj4KICAgICAgICAgIE5hbWU6CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idXNlck5hbWUiCiAgICAgICAgICAgICAgICAgbmctbW9kZWw9InVzZXIubmFtZSIKICAgICAgICAgICAgICAgICBuZy1tb2RlbC1vcHRpb25zPSJ7IGdldHRlclNldHRlcjogdHJ1ZSB9IiAvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8cHJlPnVzZXIubmFtZSA9IDxzcGFuIG5nLWJpbmQ9InVzZXIubmFtZSgpIj48L3NwYW4+PC9wcmU+CiAgICAgIDwvZGl2PgogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4KICAgICAgYW5ndWxhci5tb2R1bGUoJ2dldHRlclNldHRlckV4YW1wbGUnLCBbXSkKICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgdmFyIF9uYW1lID0gJ0JyaWFuJzsKICAgICAgICAgICRzY29wZS51c2VyID0gewogICAgICAgICAgICBuYW1lOiBmdW5jdGlvbihuZXdOYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXIuaXNEZWZpbmVkKG5ld05hbWUpID8gKF9uYW1lID0gbmV3TmFtZSkgOiBfbmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9XSk7CiAgICA8L2ZpbGU+CiAgPC9leGFtcGxlPgogKi8KdmFyIG5nTW9kZWxPcHRpb25zRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnQScsCiAgICBjb250cm9sbGVyOiBbJyRzY29wZScsICckYXR0cnMnLCBmdW5jdGlvbigkc2NvcGUsICRhdHRycykgewogICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgIHRoaXMuJG9wdGlvbnMgPSAkc2NvcGUuJGV2YWwoJGF0dHJzLm5nTW9kZWxPcHRpb25zKTsKICAgICAgLy8gQWxsb3cgYWRkaW5nL292ZXJyaWRpbmcgYm91bmQgZXZlbnRzCiAgICAgIGlmICh0aGlzLiRvcHRpb25zLnVwZGF0ZU9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCA9IGZhbHNlOwogICAgICAgIC8vIGV4dHJhY3QgImRlZmF1bHQiIHBzZXVkby1ldmVudCBmcm9tIGxpc3Qgb2YgZXZlbnRzIHRoYXQgY2FuIHRyaWdnZXIgYSBtb2RlbCB1cGRhdGUKICAgICAgICB0aGlzLiRvcHRpb25zLnVwZGF0ZU9uID0gdHJpbSh0aGlzLiRvcHRpb25zLnVwZGF0ZU9uLnJlcGxhY2UoREVGQVVMVF9SRUdFWFAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhhdC4kb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQgPSB0cnVlOwogICAgICAgICAgcmV0dXJuICcgJzsKICAgICAgICB9KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy4kb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQgPSB0cnVlOwogICAgICB9CiAgICB9XQogIH07Cn07CgovLyBoZWxwZXIgbWV0aG9kcwpmdW5jdGlvbiBhZGRTZXRWYWxpZGl0eU1ldGhvZChjb250ZXh0KSB7CiAgdmFyIGN0cmwgPSBjb250ZXh0LmN0cmwsCiAgICAgICRlbGVtZW50ID0gY29udGV4dC4kZWxlbWVudCwKICAgICAgY2xhc3NDYWNoZSA9IHt9LAogICAgICBzZXQgPSBjb250ZXh0LnNldCwKICAgICAgdW5zZXQgPSBjb250ZXh0LnVuc2V0LAogICAgICBwYXJlbnRGb3JtID0gY29udGV4dC5wYXJlbnRGb3JtLAogICAgICAkYW5pbWF0ZSA9IGNvbnRleHQuJGFuaW1hdGU7CgogIGNsYXNzQ2FjaGVbSU5WQUxJRF9DTEFTU10gPSAhKGNsYXNzQ2FjaGVbVkFMSURfQ0xBU1NdID0gJGVsZW1lbnQuaGFzQ2xhc3MoVkFMSURfQ0xBU1MpKTsKCiAgY3RybC4kc2V0VmFsaWRpdHkgPSBzZXRWYWxpZGl0eTsKCiAgZnVuY3Rpb24gc2V0VmFsaWRpdHkodmFsaWRhdGlvbkVycm9yS2V5LCBzdGF0ZSwgb3B0aW9ucykgewogICAgaWYgKHN0YXRlID09PSB1bmRlZmluZWQpIHsKICAgICAgY3JlYXRlQW5kU2V0KCckcGVuZGluZycsIHZhbGlkYXRpb25FcnJvcktleSwgb3B0aW9ucyk7CiAgICB9IGVsc2UgewogICAgICB1bnNldEFuZENsZWFudXAoJyRwZW5kaW5nJywgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsKICAgIH0KICAgIGlmICghaXNCb29sZWFuKHN0YXRlKSkgewogICAgICB1bnNldChjdHJsLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsKICAgICAgdW5zZXQoY3RybC4kJHN1Y2Nlc3MsIHZhbGlkYXRpb25FcnJvcktleSwgb3B0aW9ucyk7CiAgICB9IGVsc2UgewogICAgICBpZiAoc3RhdGUpIHsKICAgICAgICB1bnNldChjdHJsLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsKICAgICAgICBzZXQoY3RybC4kJHN1Y2Nlc3MsIHZhbGlkYXRpb25FcnJvcktleSwgb3B0aW9ucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0KGN0cmwuJGVycm9yLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOwogICAgICAgIHVuc2V0KGN0cmwuJCRzdWNjZXNzLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOwogICAgICB9CiAgICB9CiAgICBpZiAoY3RybC4kcGVuZGluZykgewogICAgICBjYWNoZWRUb2dnbGVDbGFzcyhQRU5ESU5HX0NMQVNTLCB0cnVlKTsKICAgICAgY3RybC4kdmFsaWQgPSBjdHJsLiRpbnZhbGlkID0gdW5kZWZpbmVkOwogICAgICB0b2dnbGVWYWxpZGF0aW9uQ3NzKCcnLCBudWxsKTsKICAgIH0gZWxzZSB7CiAgICAgIGNhY2hlZFRvZ2dsZUNsYXNzKFBFTkRJTkdfQ0xBU1MsIGZhbHNlKTsKICAgICAgY3RybC4kdmFsaWQgPSBpc09iamVjdEVtcHR5KGN0cmwuJGVycm9yKTsKICAgICAgY3RybC4kaW52YWxpZCA9ICFjdHJsLiR2YWxpZDsKICAgICAgdG9nZ2xlVmFsaWRhdGlvbkNzcygnJywgY3RybC4kdmFsaWQpOwogICAgfQoKICAgIC8vIHJlLXJlYWQgdGhlIHN0YXRlIGFzIHRoZSBzZXQvdW5zZXQgbWV0aG9kcyBjb3VsZCBoYXZlCiAgICAvLyBjb21iaW5lZCBzdGF0ZSBpbiBjdHJsLiRlcnJvclt2YWxpZGF0aW9uRXJyb3JdICh1c2VkIGZvciBmb3JtcyksCiAgICAvLyB3aGVyZSBzZXR0aW5nL3Vuc2V0dGluZyBvbmx5IGluY3JlbWVudHMvZGVjcmVtZW50cyB0aGUgdmFsdWUsCiAgICAvLyBhbmQgZG9lcyBub3QgcmVwbGFjZSBpdC4KICAgIHZhciBjb21iaW5lZFN0YXRlOwogICAgaWYgKGN0cmwuJHBlbmRpbmcgJiYgY3RybC4kcGVuZGluZ1t2YWxpZGF0aW9uRXJyb3JLZXldKSB7CiAgICAgIGNvbWJpbmVkU3RhdGUgPSB1bmRlZmluZWQ7CiAgICB9IGVsc2UgaWYgKGN0cmwuJGVycm9yW3ZhbGlkYXRpb25FcnJvcktleV0pIHsKICAgICAgY29tYmluZWRTdGF0ZSA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChjdHJsLiQkc3VjY2Vzc1t2YWxpZGF0aW9uRXJyb3JLZXldKSB7CiAgICAgIGNvbWJpbmVkU3RhdGUgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY29tYmluZWRTdGF0ZSA9IG51bGw7CiAgICB9CiAgICB0b2dnbGVWYWxpZGF0aW9uQ3NzKHZhbGlkYXRpb25FcnJvcktleSwgY29tYmluZWRTdGF0ZSk7CiAgICBwYXJlbnRGb3JtLiRzZXRWYWxpZGl0eSh2YWxpZGF0aW9uRXJyb3JLZXksIGNvbWJpbmVkU3RhdGUsIGN0cmwpOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQW5kU2V0KG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7CiAgICBpZiAoIWN0cmxbbmFtZV0pIHsKICAgICAgY3RybFtuYW1lXSA9IHt9OwogICAgfQogICAgc2V0KGN0cmxbbmFtZV0sIHZhbHVlLCBvcHRpb25zKTsKICB9CgogIGZ1bmN0aW9uIHVuc2V0QW5kQ2xlYW51cChuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgaWYgKGN0cmxbbmFtZV0pIHsKICAgICAgdW5zZXQoY3RybFtuYW1lXSwgdmFsdWUsIG9wdGlvbnMpOwogICANCozc71ZmtgIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8UEAAQAZujcCoBzbAqAdglSIf9Vh6fNNBvhSQgBANDvOFAAABAQgKAKNe0QBNpc2M3O9WXLcCAGpgAABqYAAAaPcoH9LFCAAnrR4TCABFAGBc1JpAAEAGdhrAqAdgwKgHNh/1lSJBvhSQWHp804AQAVPwNQAAAQEICgBNpc0Ao17RN0ZFOA0KIH0KICAgIGlmIChpc09iamVjdEVtcHR5KGN0cmxbbmFtZV0pKSB7CiAgICAgIGN0cmxbbmFtZV0gPSB1bmRlZmluZWQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjYWNoZWRUb2dnbGVDbGFzcyhjbGFzc05hbWUsIHN3aXRjaFZhbHVlKSB7CiAgICBpZiAoc3dpdGNoVmFsdWUgJiYgIWNsYXNzQ2FjaGVbY2xhc3NOYW1lXSkgewogICAgICAkYW5pbWF0ZS5hZGRDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKTsKICAgICAgY2xhc3NDYWNoZVtjbGFzc05hbWVdID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoIXN3aXRjaFZhbHVlICYmIGNsYXNzQ2FjaGVbY2xhc3NOYW1lXSkgewogICAgICAkYW5pbWF0ZS5yZW1vdmVDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKTsKICAgICAgY2xhc3NDYWNoZVtjbGFzc05hbWVdID0gZmFsc2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2dnbGVWYWxpZGF0aW9uQ3NzKHZhbGlkYXRpb25FcnJvcktleSwgaXNWYWxpZCkgewogICAgdmFsaWRhdGlvbkVycm9yS2V5ID0gdmFsaWRhdGlvbkVycm9yS2V5ID8gJy0nICsgc25ha2VfY2FzZSh2YWxpZGF0aW9uRXJyb3JLZXksICctJykgOiAnJzsKCiAgICBjYWNoZWRUb2dnbGVDbGFzcyhWQUxJRF9DTEFTUyArIHZhbGlkYXRpb25FcnJvcktleSwgaXNWYWxpZCA9PT0gdHJ1ZSk7CiAgICBjYWNoZWRUb2dnbGVDbGFzcyhJTlZBTElEX0NMQVNTICsgdmFsaWRhdGlvbkVycm9yS2V5LCBpc1ZhbGlkID09PSBmYWxzZSk7CiAgfQp9CgpmdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikgewogIGlmIChvYmopIHsKICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nQmluZAogKiBAcmVzdHJpY3QgQUMKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBgbmdCaW5kYCBhdHRyaWJ1dGUgdGVsbHMgQW5ndWxhciB0byByZXBsYWNlIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBIVE1MIGVsZW1lbnQKICogd2l0aCB0aGUgdmFsdWUgb2YgYSBnaXZlbiBleHByZXNzaW9uLCBhbmQgdG8gdXBkYXRlIHRoZSB0ZXh0IGNvbnRlbnQgd2hlbiB0aGUgdmFsdWUgb2YgdGhhdAogKiBleHByZXNzaW9uIGNoYW5nZXMuCiAqCiAqIFR5cGljYWxseSwgeW91IGRvbid0IHVzZSBgbmdCaW5kYCBkaXJlY3RseSwgYnV0IGluc3RlYWQgeW91IHVzZSB0aGUgZG91YmxlIGN1cmx5IG1hcmt1cCBsaWtlCiAqIGB7eyBleHByZXNzaW9uIH19YCB3aGljaCBpcyBzaW1pbGFyIGJ1dCBsZXNzIHZlcmJvc2UuCiAqCiAqIEl0IGlzIHByZWZlcmFibGUgdG8gdXNlIGBuZ0JpbmRgIGluc3RlYWQgb2YgYHt7IGV4cHJlc3Npb24gfX1gIGlmIGEgdGVtcGxhdGUgaXMgbW9tZW50YXJpbHkKICogZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIGluIGl0cyByYXcgc3RhdGUgYmVmb3JlIEFuZ3VsYXIgY29tcGlsZXMgaXQuIFNpbmNlIGBuZ0JpbmRgIGlzIGFuCiAqIGVsZW1lbnQgYXR0cmlidXRlLCBpdCBtYWtlcyB0aGUgYmluZGluZ3MgaW52aXNpYmxlIHRvIHRoZSB1c2VyIHdoaWxlIHRoZSBwYWdlIGlzIGxvYWRpbmcuCiAqCiAqIEFuIGFsdGVybmF0aXZlIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSB3b3VsZCBiZSB1c2luZyB0aGUKICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Nsb2FrIG5nQ2xvYWt9IGRpcmVjdGl2ZS4KICoKICoKICogQGVsZW1lbnQgQU5ZCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCaW5kIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlLgogKgogKiBAZXhhbXBsZQogKiBFbnRlciBhIG5hbWUgaW4gdGhlIExpdmUgUHJldmlldyB0ZXh0IGJveDsgdGhlIGdyZWV0aW5nIGJlbG93IHRoZSB0ZXh0IGJveCBjaGFuZ2VzIGluc3RhbnRseS4KICAgPGV4YW1wbGUgbW9kdWxlPSJiaW5kRXhhbXBsZSI+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICA8c2NyaXB0PgogICAgICAgICBhbmd1bGFyLm1vZHVsZSgnYmluZEV4YW1wbGUnLCBbXSkKICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgJHNjb3BlLm5hbWUgPSAnV2hpcmxlZCc7CiAgICAgICAgICAgfV0pOwogICAgICAgPC9zY3JpcHQ+CiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgRW50ZXIgbmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJuYW1lIj48YnI+CiAgICAgICAgIEhlbGxvIDxzcGFuIG5nLWJpbmQ9Im5hbWUiPjwvc3Bhbj4hCiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWJpbmQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgdmFyIG5hbWVJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ25hbWUnKSk7CgogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCduYW1lJykpLmdldFRleHQoKSkudG9CZSgnV2hpcmxlZCcpOwogICAgICAgICBuYW1lSW5wdXQuY2xlYXIoKTsKICAgICAgICAgbmFtZUlucHV0LnNlbmRLZXlzKCd3b3JsZCcpOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCduYW1lJykpLmdldFRleHQoKSkudG9CZSgnd29ybGQnKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KdmFyIG5nQmluZERpcmVjdGl2ZSA9IFsnJGNvbXBpbGUnLCBmdW5jdGlvbigkY29tcGlsZSkgewogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0FDJywKICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZENvbXBpbGUodGVtcGxhdGVFbGVtZW50KSB7CiAgICAgICRjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzKHRlbXBsYXRlRWxlbWVudCk7CiAgICAgIHJldHVybiBmdW5jdGlvbiBuZ0JpbmRMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CiAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZCk7CiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRbMF07CiAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdCaW5kLCBmdW5jdGlvbiBuZ0JpbmRXYXRjaEFjdGlvbih2YWx1ZSkgewogICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHZhbHVlID09PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICAgIH0pOwogICAgICB9OwogICAgfQogIH07Cn1dOwoKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nQmluZFRlbXBsYXRlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgYG5nQmluZFRlbXBsYXRlYCBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoYXQgdGhlIGVsZW1lbnQKICogdGV4dCBjb250ZW50IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBpbnRlcnBvbGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZQogKiBpbiB0aGUgYG5nQmluZFRlbXBsYXRlYCBhdHRyaWJ1dGUuCiAqIFVubGlrZSBgbmdCaW5kYCwgdGhlIGBuZ0JpbmRUZW1wbGF0ZWAgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYHt7YCBgfX1gCiAqIGV4cHJlc3Npb25zLiBUaGlzIGRpcmVjdGl2ZSBpcyBuZWVkZWQgc2luY2Ugc29tZSBIVE1MIGVsZW1lbnRzCiAqIChzdWNoIGFzIFRJVExFIGFuZCBPUFRJT04pIGNhbm5vdCBjb250YWluIFNQQU4gZWxlbWVudHMuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcGFyYW0ge3N0cmluZ30gbmdCaW5kVGVtcGxhdGUgdGVtcGxhdGUgb2YgZm9ybQogKiAgIDx0dD57ezwvdHQ+IDx0dD5leHByZXNzaW9uPC90dD4gPHR0Pn19PC90dD4gdG8gZXZhbC4KICoKICogQGV4YW1wbGUKICogVHJ5IGl0IGhlcmU6IGVudGVyIHRleHQgaW4gdGV4dCBib3ggYW5kIHdhdGNoIHRoZSBncmVldGluZyBjaGFuZ2UuCiAgIDxleGFtcGxlIG1vZHVsZT0iYmluZEV4YW1wbGUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHNjcmlwdD4KICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2JpbmRFeGFtcGxlJywgW10pCiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICAgICRzY29wZS5zYWx1dGF0aW9uID0gJ0hlbGxvJzsKICAgICAgICAgICAgICRzY29wZS5uYW1lID0gJ1dvcmxkJzsKICAgICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgIFNhbHV0YXRpb246IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic2FsdXRhdGlvbiI+PGJyPgogICAgICAgIE5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ibmFtZSI+PGJyPgogICAgICAgIDxwcmUgbmctYmluZC10ZW1wbGF0ZT0ie3tzYWx1dGF0aW9ufX0ge3tuYW1lfX0hIj48L3ByZT4KICAgICAgIDwvZGl2PgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctYmluZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICB2YXIgc2FsdXRhdGlvbkVsZW0gPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3NhbHV0YXRpb24nKSk7CiAgICAgICAgIHZhciBzYWx1dGF0aW9uSW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdzYWx1dGF0aW9uJykpOwogICAgICAgICB2YXIgbmFtZUlucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbmFtZScpKTsKCiAgICAgICAgIGV4cGVjdChzYWx1dGF0aW9uRWxlbS5nZXRUZXh0KCkpLnRvQmUoJ0hlbGxvIFdvcmxkIScpOwoKICAgICAgICAgc2FsdXRhdGlvbklucHV0LmNsZWFyKCk7CiAgICAgICAgIHNhbHV0YXRpb25JbnB1dC5zZW5kS2V5cygnR3JlZXRpbmdzJyk7CiAgICAgICAgIG5hbWVJbnB1dC5jbGVhcigpOwogICAgICAgICBuYW1lSW5wdXQuc2VuZEtleXMoJ3VzZXInKTsKCiAgICAgICAgIGV4cGVjdChzYWx1dGF0aW9uRWxlbS5nZXRUZXh0KCkpLnRvQmUoJ0dyZWV0aW5ncyB1c2VyIScpOwogICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwp2YXIgbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUgPSBbJyRpbnRlcnBvbGF0ZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZSwgJGNvbXBpbGUpIHsKICByZXR1cm4gewogICAgY29tcGlsZTogZnVuY3Rpb24gbmdCaW5kVGVtcGxhdGVDb21waWxlKHRlbXBsYXRlRWxlbWVudCkgewogICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyh0ZW1wbGF0ZUVsZW1lbnQpOwogICAgICByZXR1cm4gZnVuY3Rpb24gbmdCaW5kVGVtcGxhdGVMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CiAgICAgICAgdmFyIGludGVycG9sYXRlRm4gPSAkaW50ZXJwb2xhdGUoZWxlbWVudC5hdHRyKGF0dHIuJGF0dHIubmdCaW5kVGVtcGxhdGUpKTsKICAgICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdJbmZvKGVsZW1lbnQsIGludGVycG9sYXRlRm4uZXhwcmVzc2lvbnMpOwogICAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdOwogICAgICAgIGF0dHIuJG9ic2VydmUoJ25nQmluZFRlbXBsYXRlJywgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfTsKICAgIH0KICB9Owp9XTsKCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0JpbmRIdG1sCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBFdmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kIGluc2VydHMgdGhlIHJlc3VsdGluZyBIVE1MIGludG8gdGhlIGVsZW1lbnQgaW4gYSBzZWN1cmUgd2F5LiBCeSBkZWZhdWx0LAogKiB0aGUgcmVzdWx0aW5nIEhUTUwgY29udGVudCB3aWxsIGJlIHNhbml0aXplZCB1c2luZyB0aGUge0BsaW5rIG5nU2FuaXRpemUuJHNhbml0aXplICRzYW5pdGl6ZX0gc2VydmljZS4KICogVG8gdXRpbGl6ZSB0aGlzIGZ1bmN0aW9uYWxpdHksIGVuc3VyZSB0aGF0IGAkc2FuaXRpemVgIGlzIGF2YWlsYWJsZSwgZm9yIGV4YW1wbGUsIGJ5IGluY2x1ZGluZyB7QGxpbmsKICogbmdTYW5pdGl6ZX0gaW4geW91ciBtb2R1bGUncyBkZXBlbmRlbmNpZXMgKG5vdCBpbiBjb3JlIEFuZ3VsYXIpLiBJbiBvcmRlciB0byB1c2Uge0BsaW5rIG5nU2FuaXRpemV9CiAqIGluIHlvdXIgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzLCB5b3UgbmVlZCB0byBpbmNsdWRlICJhbmd1bGFyLXNhbml0aXplLmpzIiBpbiB5b3VyIGFwcGxpY2F0aW9uLgogKgogKiBZb3UgbWF5IGFsc28gYnlwYXNzIHNhbml0aXphdGlvbiBmb3IgdmFsdWVzIHlvdSBrbm93IGFyZSBzYWZlLiBUbyBkbyBzbywgYmluZCB0bwogKiBhbiBleHBsaWNpdGx5IHRydXN0ZWQgdmFsdWUgdmlhIHtAbGluayBuZy4kc2NlI3RydXN0QXNIdG1sICRzY2UudHJ1c3RBc0h0bWx9LiAgU2VlIHRoZSBleGFtcGxlCiAqIHVuZGVyIHtAbGluayBuZy4kc2NlI3Nob3ctbWUtYW4tZXhhbXBsZS11c2luZy1zY2UtIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIChTQ0UpfS4KICoKICogTm90ZTogSWYgYSBgJHNhbml0aXplYCBzZXJ2aWNlIGlzIHVuYXZhaWxhYmxlIGFuZCB0aGUgYm91bmQgdmFsdWUgaXNuJ3QgZXhwbGljaXRseSB0cnVzdGVkLCB5b3UKICogd2lsbCBoYXZlIGFuIGV4Y2VwdGlvbiAoaW5zdGVhZCBvZiBhbiBleHBsb2l0LikKICoKICogQGVsZW1lbnQgQU5ZCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCaW5kSHRtbCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS4KICoKICogQGV4YW1wbGUKCiAgIDxleGFtcGxlIG1vZHVsZT0iYmluZEh0bWxFeGFtcGxlIiBkZXBzPSJhbmd1bGFyLXNhbml0aXplLmpzIj4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgIDxwIG5nLWJpbmQtaHRtbD0ibXlIVE1MIj48L3A+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CgogICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CiAgICAgICBhbmd1bGFyLm1vZHVsZSgnYmluZEh0bWxFeGFtcGxlJywgWyduZ1Nhbml0aXplJ10pCiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgJHNjb3BlLm15SFRNTCA9CiAgICAgICAgICAgICAgJ0kgYW0gYW4gPGNvZGU+SFRNTDwvY29kZT5zdHJpbmcgd2l0aCAnICsKICAgICAgICAgICAgICAnPGEgaHJlZj0iIyI+bGlua3MhPC9hPiBhbmQgb3RoZXIgPGVtPnN0dWZmPC9lbT4nOwogICAgICAgICB9XSk7CiAgICAgPC9maWxlPgoKICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctYmluZC1odG1sJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ215SFRNTCcpKS5nZXRUZXh0KCkpLnRvQmUoCiAgICAgICAgICAgICAnSSBhbSBhbiBIVE1Mc3RyaW5nIHdpdGggbGlua3MhIGFuZCBvdGhlciBzdHVmZicpOwogICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwp2YXIgbmdCaW5kSHRtbERpcmVjdGl2ZSA9IFsnJHNjZScsICckcGFyc2UnLCAnJGNvbXBpbGUnLCBmdW5jdGlvbigkc2NlLCAkcGFyc2UsICRjb21waWxlKSB7CiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnQScsCiAgICBjb21waWxlOiBmdW5jdGlvbiBuZ0JpbmRIdG1sQ29tcGlsZSh0RWxlbWVudCwgdEF0dHJzKSB7CiAgICAgIHZhciBuZ0JpbmRIdG1sR2V0dGVyID0gJHBhcnNlKHRBdHRycy5uZ0JpbmRIdG1sKTsKICAgICAgdmFyIG5nQmluZEh0bWxXYXRjaCA9ICRwYXJzZSh0QXR0cnMubmdCaW5kSHRtbCwgZnVuY3Rpb24gZ2V0U3RyaW5nVmFsdWUodmFsdWUpIHsKICAgICAgICByZXR1cm4gKHZhbHVlIHx8ICcnKS50b1N0cmluZygpOwogICAgICB9KTsKICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModEVsZW1lbnQpOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nQmluZEh0bWxMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CiAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZEh0bWwpOwoKICAgICAgICBzY29wZS4kd2F0Y2gobmdCaW5kSHRtbFdhdGNoLCBmdW5jdGlvbiBuZ0JpbmRIdG1sV2F0Y2hBY3Rpb24oKSB7CiAgICAgICAgICAvLyB3ZSByZS1ldmFsdWF0ZSB0aGUgZXhwciBiZWNhdXNlIHdlIHdhbnQgYSBUcnVzdGVkVmFsdWVIb2xkZXJUeXBlCiAgICAgICAgICAvLyBmb3IgJHNjZSwgbm90IGEgc3RyaW5nCiAgICAgICAgICBlbGVtZW50Lmh0bWwoJHNjZS5nZXRUcnVzdGVkSHRtbChuZ0JpbmRIdG1sR2V0dGVyKHNjb3BlKSkgfHwgJycpOwogICAgICAgIH0pOwogICAgICB9OwogICAgfQogIH07Cn1dOwoKZnVuY3Rpb24gY2xhc3NEaXJlY3RpdmUobmFtZSwgc2VsZWN0b3IpIHsKICBuYW1lID0gJ25nQ2xhc3MnICsgbmFtZTsKICByZXR1cm4gWyckYW5pbWF0ZScsIGZ1bmN0aW9uKCRhbmltYXRlKSB7CiAgICByZXR1cm4gewogICAgICByZXN0cmljdDogJ0FDJywKICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKICAgICAgICB2YXIgb2xkVmFsOwoKICAgICAgICBzY29wZS4kd2F0Y2goYXR0cltuYW1lXSwgbmdDbGFzc1dhdGNoQWN0aW9uLCB0cnVlKTsKCiAgICAgICAgYXR0ci4kb2JzZXJ2ZSgnY2xhc3MnLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgbmdDbGFzc1dhdGNoQWN0aW9uKHNjb3BlLiRldmFsKGF0dHJbbmFtZV0pKTsKICAgICAgICB9KTsKCgogICAgICAgIGlmIChuYW1lICE9PSAnbmdDbGFzcycpIHsKICAgICAgICAgIHNjb3BlLiR3YXRjaCgnJGluZGV4JywgZnVuY3Rpb24oJGluZGV4LCBvbGQkaW5kZXgpIHsKICAgICAgICAgICAgLy8ganNoaW50IGJpdHdpc2U6IGZhbHNlCiAgICAgICAgICAgIHZhciBtb2QgPSAkaW5kZXggJiAxOwogICAgICAgICAgICBpZiAobW9kICE9PSAob2xkJGluZGV4ICYgMSkpIHsKICAgICAgICAgICAgICB2YXIgY2xhc3NlcyA9IGFycmF5Q2xhc3NlcyhzY29wZS4kZXZhbChhdHRyW25hbWVdKSk7CiAgICAgICAgICAgICAgbW9kID09PSBzZWxlY3RvciA/CiAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGNsYXNzZXMpIDoKICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoY2xhc3Nlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYWRkQ2xhc3NlcyhjbGFzc2VzKSB7CiAgICAgICAgICB2YXIgbmV3Q2xhc3NlcyA9IGRpZ2VzdENsYXNzQ291bnRzKGNsYXNzZXMsIDEpOwogICAgICAgICAgYXR0ci4kYWRkQ2xhc3MobmV3Q2xhc3Nlcyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVDbGFzc2VzKGNsYXNzZXMpIHsKICAgICAgICAgIHZhciBuZXdDbGFzc2VzID0gZGlnZXN0Q2xhc3NDb3VudHMoY2xhc3NlcywgLTEpOwogICAgICAgICAgYXR0ci4kcmVtb3ZlQ2xhc3MobmV3Q2xhc3Nlcyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkaWdlc3RDbGFzc0NvdW50cyhjbGFzc2VzLCBjb3VudCkgewogICAgICAgICAgdmFyIGNsYXNzQ291bnRzID0gZWxlbWVudC5kYXRhKCckY2xhc3NDb3VudHMnKSB8fCB7fTsKICAgICAgICAgIHZhciBjbGFzc2VzVG9VcGRhdGUgPSBbXTsKICAgICAgICAgIGZvckVhY2goY2xhc3NlcywgZnVuY3Rpb24oY2xhc3NOYW1lKSB7CiAgICAgICAgICAgIGlmIChjb3VudCA+IDAgfHwgY2xhc3NDb3VudHNbY2xhc3NOYW1lXSkgewogICAgICAgICAgICAgIGNsYXNzQ291bnRzW2NsYXNzTmFtZV0gPSAoY2xhc3NDb3VudHNbY2xhc3NOYW1lXSB8fCAwKSArIGNvdW50OwogICAgICAgICAgICAgIGlmIChjbGFzc0NvdW50c1tjbGFzc05hbWVdID09PSArKGNvdW50ID4gMCkpIHsKICAgICAgICAgICAgICAgIGNsYXNzZXNUb1VwZGF0ZS5wdXNoKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGVsZW1lbnQuZGF0YSgnJGNsYXNzQ291bnRzJywgY2xhc3NDb3VudHMpOwogICAgICAgICAgcmV0dXJuIGNsYXNzZXNUb1VwZGF0ZS5qb2luKCcgJyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVDbGFzc2VzKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpIHsKICAgICAgICAgIHZhciB0b0FkZCA9IGFycmF5RGlmZmVyZW5jZShuZXdDbGFzc2VzLCBvbGRDbGFzc2VzKTsKICAgICAgICAgIHZhciB0b1JlbW92ZSA9IGFycmF5RGlmZmVyZW5jZShvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsKICAgICAgICAgIHRvQWRkID0gZGlnZXN0Q2xhc3NDb3VudHModG9BZGQsIDEpOwogICAgICAgICAgdG9SZW1vdmUgPSBkaWdlc3RDbGFzc0NvdW50cyh0b1JlbW92ZSwgLTEpOwogICAgICAgICAgaWYgKHRvQWRkICYmIHRvQWRkLmxlbmd0aCkgewogICAgICAgICAgICAkYW5pbWF0ZS5hZGRDbGFzcyhlbGVtZW50LCB0b0FkZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodG9SZW1vdmUgJiYgdG9SZW1vdmUubGVuZ3RoKSB7CiAgICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKGVsZW1lbnQsIHRvUmVtb3ZlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG5nQ2xhc3NXYXRjaEFjdGlvbihuZXdWYWwpIHsKICAgICAgICAgIGlmIChzZWxlY3RvciA9PT0gdHJ1ZSB8fCBzY29wZS4kaW5kZXggJSAyID09PSBzZWxlY3RvcikgewogICAgICAgICAgICB2YXIgbmV3Q2xhc3NlcyA9IGFycmF5Q2xhc3NlcyhuZXdWYWwgfHwgW10pOwogICAgICAgICAgICBpZiAoIW9sZFZhbCkgewogICAgICAgICAgICAgIGFkZENsYXNzZXMobmV3Q2xhc3Nlcyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVxdWFscyhuZXdWYWwsb2xkVmFsKSkgewogICAgICAgICAgICAgIHZhciBvbGRDbGFzc2VzID0gYXJyYXlDbGFzc2VzKG9sZFZhbCk7CiAgICAgICAgICAgICAgdXBkYXRlQ2xhc3NlcyhvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgb2xkVmFsID0gc2hhbGxvd0NvcHkobmV3VmFsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYXJyYXlEaWZmZXJlbmNlKHRva2VuczEsIHRva2VuczIpIHsKICAgICAgdmFyIHZhbHVlcyA9IFtdOwoKICAgICAgb3V0ZXI6CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zMS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciB0b2tlbiA9IHRva2VuczFbaV07CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0b2tlbnMyLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBpZiAodG9rZW4gPT0gdG9rZW5zMltqXSkgY29udGludWUgb3V0ZXI7CiAgICAgICAgfQogICAgICAgIHZhbHVlcy5wdXNoKHRva2VuKTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWVzOwogICAgfQoKICAgIGZ1bmN0aW9uIGFycmF5Q2xhc3NlcyhjbGFzc1ZhbCkgewogICAgICBpZiAoaXNBcnJheShjbGFzc1ZhbCkpIHsKICAgICAgICByZXR1cm4gY2xhc3NWYWw7CiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoY2xhc3NWYWwpKSB7CiAgICAgICAgcmV0dXJuIGNsYXNzVmFsLnNwbGl0KCcgJyk7CiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoY2xhc3NWYWwpKSB7CiAgICAgICAgdmFyIGNsYXNzZXMgPSBbXTsKICAgICAgICBmb3JFYWNoKGNsYXNzVmFsLCBmdW5jdGlvbih2LCBrKSB7CiAgICAgICAgICBpZiAodikgewogICAgICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5jb25jYXQoay5zcGxpdCgnICcpKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gY2xhc3NlczsKICAgICAgfQogICAgICByZXR1cm4gY2xhc3NWYWw7CiAgICB9CiAgfV07Cn0KCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nQ2xhc3MKICogQHJlc3RyaWN0IEFDCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgYG5nQ2xhc3NgIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGR5bmFtaWNhbGx5IHNldCBDU1MgY2xhc3NlcyBvbiBhbiBIVE1MIGVsZW1lbnQgYnkgZGF0YWJpbmRpbmcKICogYW4gZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgYWxsIGNsYXNzZXMgdG8gYmUgYWRkZWQuCiAqCiAqIFRoZSBkaXJlY3RpdmUgb3BlcmF0ZXMgaW4gdGhyZWUgZGlmZmVyZW50IHdheXMsIGRlcGVuZGluZyBvbiB3aGljaCBvZiB0aHJlZSB0eXBlcyB0aGUgZXhwcmVzc2lvbgogKiBldmFsdWF0ZXMgdG86CiAqCiAqIDEuIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHN0cmluZywgdGhlIHN0cmluZyBzaG91bGQgYmUgb25lIG9yIG1vcmUgc3BhY2UtZGVsaW1pdGVkIGNsYXNzCiAqIG5hbWVzLgogKgogKiAyLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYW4gYXJyYXksIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgc2hvdWxkIGJlIGEgc3RyaW5nIHRoYXQgaXMKICogb25lIG9yIG1vcmUgc3BhY2UtZGVsaW1pdGVkIGNsYXNzIG5hbWVzLgogKgogKiAzLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYW4gb2JqZWN0LCB0aGVuIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyIG9mIHRoZQogKiBvYmplY3Qgd2l0aCBhIHRydXRoeSB2YWx1ZSB0aGUgY29ycmVzcG9uZGluZyBrZXkgaXMgdXNlZCBhcyBhIGNsYXNzIG5hbWUuCiAqCiAqIFRoZSBkaXJlY3RpdmUgd29uJ3QgYWRkIGR1cGxpY2F0ZSBjbGFzc2VzIGlmIGEgcGFydGljdWxhciBjbGFzcyB3YXMgYWxyZWFkeSBzZXQuCiAqCiAqIFdoZW4gdGhlIGV4cHJlc3Npb24gY2hhbmdlcywgdGhlIHByZXZpb3VzbHkgYWRkZWQgY2xhc3NlcyBhcmUgcmVtb3ZlZCBhbmQgb25seSB0aGVuIHRoZQogKiBuZXcgY2xhc3NlcyBhcmUgYWRkZWQuCiAqCiAqIEBhbmltYXRpb25zCiAqIGFkZCAtIGhhcHBlbnMganVzdCBiZWZvcmUgdGhlIGNsYXNzIGlzIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQKICogcmVtb3ZlIC0gaGFwcGVucyBqdXN0IGJlZm9yZSB0aGUgY2xhc3MgaXMgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50CiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2xhc3Mge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4gVGhlIHJlc3VsdAogKiAgIG9mIHRoZSBldmFsdWF0aW9uIGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgc3BhY2UgZGVsaW1pdGVkIGNsYXNzCiAqICAgbmFtZXMsIGFuIGFycmF5LCBvciBhIG1hcCBvZiBjbGFzcyBuYW1lcyB0byBib29sZWFuIHZhbHVlcy4gSW4gdGhlIGNhc2Ugb2YgYSBtYXAsIHRoZQogKiAgIG5hbWVzIG9mIHRoZSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgdHJ1dGh5IHdpbGwgYmUgYWRkZWQgYXMgY3NzIGNsYXNzZXMgdG8gdGhlCiAqICAgZWxlbWVudC4KICoKICogQGV4YW1wbGUgRXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBiYXNpYyBiaW5kaW5ncyB2aWEgbmdDbGFzcyBkaXJlY3RpdmUuCiAgIDxleGFtcGxlPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHAgbmctY2xhc3M9IntzdHJpa2U6IGRlbGV0ZWQsIGJvbGQ6IGltcG9ydGFudCwgcmVkOiBlcnJvcn0iPk1hcCBTeW50YXggRXhhbXBsZTwvcD4KICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImRlbGV0ZWQiPiBkZWxldGVkIChhcHBseSAic3RyaWtlIiBjbGFzcyk8YnI+CiAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpbXBvcnRhbnQiPiBpbXBvcnRhbnQgKGFwcGx5ICJib2xkIiBjbGFzcyk8YnI+CiAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJlcnJvciI+IGVycm9yIChhcHBseSAicmVkIiBjbGFzcykKICAgICAgIDxocj4KICAgICAgIDxwIG5nLWNsYXNzPSJzdHlsZSI+VXNpbmcgU3RyaW5nIFN5bnRheDwvcD4KICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3R5bGUiIHBsYWNlaG9sZGVyPSJUeXBlOiBib2xkIHN0cmlrZSByZWQiPgogICAgICAgPGhyPgogICAgICAgPHAgbmctY2xhc3M9IltzdHlsZTEsIHN0eWxlMiwgc3R5bGUzXSI+VXNpbmcgQXJyYXkgU3ludGF4PC9wPgogICAgICAgPGlucHV0IG5nLW1vZGVsPSJzdHlsZTEiIHBsYWNlaG9sZGVyPSJUeXBlOiBib2xkLCBzdHJpa2Ugb3IgcmVkIj48YnI+CiAgICAgICA8aW5wdXQgbmctbW9kZWw9InN0eWxlMiIgcGxhY2Vob2xkZXI9IlR5cGU6IGJvbGQsIHN0cmlrZSBvciByZWQiPjxicj4KICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ic3R5bGUzIiBwbGFjZWhvbGRlcj0iVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZCI+PGJyPgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgogICAgICAgLnN0cmlrZSB7CiAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogICAgICAgfQogICAgICAgLmJvbGQgewogICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgfQogICAgICAgLnJlZCB7CiAgICAgICAgICAgY29sb3I6IHJlZDsKICAgICAgIH0KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICB2YXIgcHMgPSBlbGVtZW50LmFsbChieS5jc3MoJ3AnKSk7CgogICAgICAgaXQoJ3Nob3VsZCBsZXQgeW91IHRvZ2dsZSB0aGUgY2xhc3MnLCBmdW5jdGlvbigpIHsKCiAgICAgICAgIGV4cGVjdChwcy5maXJzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkubm90LnRvTWF0Y2goL2JvbGQvKTsKICAgICAgICAgZXhwZWN0KHBzLmZpcnN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QudG9NYXRjaCgvcmVkLyk7CgogICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdpbXBvcnRhbnQnKSkuY2xpY2soKTsKICAgICAgICAgZXhwZWN0KHBzLmZpcnN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b01hdGNoKC9ib2xkLyk7CgogICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdlcnJvcicpKS5jbGljaygpOwogICAgICAgICBleHBlY3QocHMuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvTWF0Y2goL3JlZC8pOwogICAgICAgfSk7CgogICAgICAgaXQoJ3Nob3VsZCBsZXQgeW91IHRvZ2dsZSBzdHJpbmcgZXhhbXBsZScsIGZ1bmN0aW9uKCkgewogICAgICAgICBleHBlY3QocHMuZ2V0KDEpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9CZSgnJyk7CiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlJykpLmNsZWFyKCk7CiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlJykpLnNlbmRLZXlzKCdyZWQnKTsKICAgICAgICAgZXhwZWN0KHBzLmdldCgxKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJ3JlZCcpOwogICAgICAgfSk7CgogICAgICAgaXQoJ2FycmF5IGV4YW1wbGUgc2hvdWxkIGhhdmUgMyBjbGFzc2VzJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChwcy5sYXN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCcnKTsKICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGUxJykpLnNlbmRLZXlzKCdib2xkJyk7CiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlMicpKS5zZW5kS2V5cygnc3RyaWtlJyk7CiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlMycpKS5zZW5kS2V5cygncmVkJyk7CiAgICAgICAgIGV4cGVjdChwcy5sYXN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCdib2xkIHN0cmlrZSByZWQnKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgoKICAgIyMgQW5pbWF0aW9ucwoKICAgVGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIGhvdyB0byBwZXJmb3JtIGFuaW1hdGlvbnMgdXNpbmcgbmdDbGFzcy4KCiAgIDxleGFtcGxlIG1vZHVsZT0ibmdBbmltYXRlIiBkZXBzPSJhbmd1bGFyLWFuaW1hdGUuanMiIGFuaW1hdGlvbnM9InRydWUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8aW5wdXQgaWQ9InNldGJ0biIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0ic2V0IiBuZy1jbGljaz0ibXlWYXI9J215LWNsYXNzJyI+CiAgICAgIDxpbnB1dCBpZD0iY2xlYXJidG4iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9ImNsZWFyIiBuZy1jbGljaz0ibXlWYXI9JyciPgogICAgICA8YnI+CiAgICAgIDxzcGFuIGNsYXNzPSJiYXNlLWNsYXNzIiBuZy1jbGFzcz0ibXlWYXIiPlNhbXBsZSBUZXh0PC9zcGFuPgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgogICAgICAgLmJhc2UtY2xhc3MgewogICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMC41czsKICAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOwogICAgICAgfQoKICAgICAgIC5iYXNlLWNsYXNzLm15LWNsYXNzIHsKICAgICAgICAgY29sb3I6IHJlZDsKICAgICAgICAgZm9udC1zaXplOjNlbTsKICAgICAgIH0KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWNsYXNzJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmJhc2UtY2xhc3MnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QuCiAgICAgICAgICAgdG9NYXRjaCgvbXktY2xhc3MvKTsKCiAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ3NldGJ0bicpKS5jbGljaygpOwoKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcuYmFzZS1jbGFzcycpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLgogICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7CgogICAgICAgICBlbGVtZW50KGJ5LmlkKCdjbGVhcmJ0bicpKS5jbGljaygpOwoKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcuYmFzZS1jbGFzcycpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLm5vdC4KICAgICAgICAgICB0b01hdGNoKC9teS1jbGFzcy8pOwogICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CgoKICAgIyMgbmdDbGFzcyBhbmQgcHJlLWV4aXN0aW5nIENTUzMgVHJhbnNpdGlvbnMvQW5pbWF0aW9ucwogICBUaGUgbmdDbGFzcyBkaXJlY3RpdmUgc3RpbGwgc3VwcG9ydHMgQ1NTMyBUcmFuc2l0aW9ucy9BbmltYXRpb25zIGV2ZW4gaWYgdGhleSBkbyBub3QgZm9sbG93IHRoZSBuZ0FuaW1hdGUgQ1NTIG5hbWluZyBzdHJ1Y3R1cmUuCiAgIFVwb24gYW5pbWF0aW9uIG5nQW5pbWF0ZSB3aWxsIGFwcGx5IHN1cHBsZW1lbnRhcnkgQ1NTIGNsYXNzZXMgdG8gdHJhY2sgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgYW4gYW5pbWF0aW9uLCBidXQgdGhpcyB3aWxsIG5vdCBoaW5kZXIKICAgYW55IHByZS1leGlzdGluZyBDU1MgdHJhbnNpdGlvbnMgYWxyZWFkeSBvbiB0aGUgZWxlbWVudC4gVG8gZ2V0IGFuIGlkZWEgb2Ygd2hhdCBoYXBwZW5zIGR1cmluZyBhIGNsYXNzLWJhc2VkIGFuaW1hdGlvbiwgYmUgc3VyZQogICB0byB2aWV3IHRoZSBzdGVwIGJ5IHN0ZXAgZGV0YWlscyBvZiB7QGxpbmsgbmcuJGFuaW1hdGUjYWRkQ2xhc3MgJGFuaW1hdGUuYWRkQ2xhc3N9IGFuZAogICB7QGxpbmsgbmcuJGFuaW1hdGUjcmVtb3ZlQ2xhc3MgJGFuaW1hdGUucmVtb3ZlQ2xhc3N9LgogKi8KdmFyIG5nQ2xhc3NEaXJlY3RpdmUgPSBjbGFzc0RpcmVjdGl2ZSgnJywgdHJ1ZSk7CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0NsYXNzT2RkCiAqIEByZXN0cmljdCBBQwogKgogKiBAZGVzY3JpcHRpb24KICogVGhlIGBuZ0NsYXNzT2RkYCBhbmQgYG5nQ2xhc3NFdmVuYCBkaXJlY3RpdmVzIHdvcmsgZXhhY3RseSBhcwogKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xhc3MgbmdDbGFzc30sIGV4Y2VwdCB0aGV5IHdvcmsgaW4KICogY29uanVuY3Rpb24gd2l0aCBgbmdSZXBlYXRgIGFuZCB0YWtlIGVmZmVjdCBvbmx5IG9uIG9kZCAoZXZlbikgcm93cy4KICoKICogVGhpcyBkaXJlY3RpdmUgY2FuIGJlIGFwcGxpZWQgb25seSB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuCiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgbmdSZXBlYXR9LgogKgogKiBAZWxlbWVudCBBTlkKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NsYXNzT2RkIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuIFRoZSByZXN1bHQKICogICBvZiB0aGUgZXZhbHVhdGlvbiBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHNwYWNlIGRlbGltaXRlZCBjbGFzcyBuYW1lcyBvciBhbiBhcnJheS4KICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgPG9sIG5nLWluaXQ9Im5hbWVzPVsnSm9obicsICdNYXJ5JywgJ0NhdGUnLCAnU3V6J10iPgogICAgICAgICAgPGxpIG5nLXJlcGVhdD0ibmFtZSBpbiBuYW1lcyI+CiAgICAgICAgICAgPHNwYW4gbmctY2xhc3Mtb2RkPSInb2RkJyIgbmctY2xhc3MtZXZlbj0iJ2V2ZW4nIj4KICAgICAgICAgICAgIHt7bmFtZX19CiAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC9saT4KICAgICAgICA8L29sPgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgogICAgICAgLm9kZCB7CiAgICAgICAgIGNvbG9yOiByZWQ7CiAgICAgICB9CiAgICAgICAuZXZlbiB7CiAgICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgfQogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LnJlcGVhdGVyKCduYW1lIGluIG5hbWVzJykucm93KDApLmNvbHVtbignbmFtZScpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLgogICAgICAgICAgIHRvTWF0Y2goL29kZC8pOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4KICAgICAgICAgICB0b01hdGNoKC9ldmVuLyk7CiAgICAgICB9KTsKICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCnZhciBuZ0NsYXNzT2RkRGlyZWN0aXZlID0gY2xhc3NEaXJlY3RpdmUoJ09kZCcsIDApOwoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdDbGFzc0V2ZW4KICogQHJlc3RyaWN0IEFDCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgYG5nQ2xhc3NPZGRgIGFuZCBgbmdDbGFzc0V2ZW5gIGRpcmVjdGl2ZXMgd29yayBleGFjdGx5IGFzCiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGFzcyBuZ0NsYXNzfSwgZXhjZXB0IHRoZXkgd29yayBpbgogKiBjb25qdW5jdGlvbiB3aXRoIGBuZ1JlcGVhdGAgYW5kIHRha2UgZWZmZWN0IG9ubHkgb24gb2RkIChldmVuKSByb3dzLgogKgogKiBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYW4KICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBuZ1JlcGVhdH0uCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2xhc3NFdmVuIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuIFRoZQogKiAgIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbiBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHNwYWNlIGRlbGltaXRlZCBjbGFzcyBuYW1lcyBvciBhbiBhcnJheS4KICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgPG9sIG5nLWluaXQ9Im5hbWVzPVsnSm9obicsICdNYXJ5JywgJ0NhdGUnLCAnU3V6J10iPgogICAgICAgICAgPGxpIG5nLXJlcGVhdD0ibmFtZSBpbiBuYW1lcyI+CiAgICAgICAgICAgPHNwYW4gbmctY2xhc3Mtb2RkPSInb2RkJyIgbmctY2xhc3MtZXZlbj0iJ2V2ZW4nIj4KICAgICAgICAgICAgIHt7bmFtZX19ICZuYnNwOyAmbmJzcDsgJm5ic3A7CiAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC9saT4KICAgICAgICA8L29sPgogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgogICAgICAgLm9kZCB7CiAgICAgICAgIGNvbG9yOiByZWQ7CiAgICAgICB9CiAgICAgICAuZXZlbiB7CiAgICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgfQogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LnJlcGVhdGVyKCduYW1lIGluIG5hbWVzJykucm93KDApLmNvbHVtbignbmFtZScpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLgogICAgICAgICAgIHRvTWF0Y2goL29kZC8pOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4KICAgICAgICAgICB0b01hdGNoKC9ldmVuLyk7CiAgICAgICB9KTsKICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCnZhciBuZ0NsYXNzRXZlbkRpcmVjdGl2ZSA9IGNsYXNzRGlyZWN0aXZlKCdFdmVuJywgMSk7CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0Nsb2FrCiAqIEByZXN0cmljdCBBQwogKgogKiBAZGVzY3JpcHRpb24KICogVGhlIGBuZ0Nsb2FrYCBkaXJlY3RpdmUgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBBbmd1bGFyIGh0bWwgdGVtcGxhdGUgZnJvbSBiZWluZyBicmllZmx5CiAqIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciBpbiBpdHMgcmF3ICh1bmNvbXBpbGVkKSBmb3JtIHdoaWxlIHlvdXIgYXBwbGljYXRpb24gaXMgbG9hZGluZy4gVXNlIHRoaXMKICogZGlyZWN0aXZlIHRvIGF2b2lkIHRoZSB1bmRlc2lyYWJsZSBmbGlja2VyIGVmZmVjdCBjYXVzZWQgYnkgdGhlIGh0bWwgdGVtcGxhdGUgZGlzcGxheS4KICoKICogVGhlIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCB0byB0aGUgYDxib2R5PmAgZWxlbWVudCwgYnV0IHRoZSBwcmVmZXJyZWQgdXNhZ2UgaXMgdG8gYXBwbHkKICogbXVsdGlwbGUgYG5nQ2xvYWtgIGRpcmVjdGl2ZXMgdG8gc21hbGwgcG9ydGlvbnMgb2YgdGhlIHBhZ2UgdG8gcGVybWl0IHByb2dyZXNzaXZlIHJlbmRlcmluZwogKiBvZiB0aGUgYnJvd3NlciB2aWV3LgogKgogKiBgbmdDbG9ha2Agd29ya3MgaW4gY29vcGVyYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGNzcyBydWxlIGVtYmVkZGVkIHdpdGhpbiBgYW5ndWxhci5qc2AgYW5kCiAqIGBhbmd1bGFyLm1pbi5qc2AuCiAqIEZvciBDU1AgbW9kZSBwbGVhc2UgYWRkIGBhbmd1bGFyLWNzcC5jc3NgIHRvIHlvdXIgaHRtbCBmaWxlIChzZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NzcCBuZ0NzcH0pLgogKgogKiBgYGBjc3MKICogW25nXDpjbG9ha10sIFtuZy1jbG9ha10sIFtkYXRhLW5nLWNsb2FrXSwgW3gtbmctY2xvYWtdLCAubmctY2xvYWssIC54LW5nLWNsb2FrIHsKICogICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAqIH0KICogYGBgCiAqCiAqIFdoZW4gdGhpcyBjc3MgcnVsZSBpcyBsb2FkZWQgYnkgdGhlIGJyb3dzZXIsIGFsbCBodG1sIGVsZW1lbnRzIChpbmNsdWRpbmcgdGhlaXIgY2hpbGRyZW4pIHRoYXQKICogYXJlIHRhZ2dlZCB3aXRoIHRoZSBgbmdDbG9ha2AgZGlyZWN0aXZlIGFyZSBoaWRkZW4uIFdoZW4gQW5ndWxhciBlbmNvdW50ZXJzIHRoaXMgZGlyZWN0aXZlCiAqIGR1cmluZyB0aGUgY29tcGlsYXRpb24gb2YgdGhlIHRlbXBsYXRlIGl0IGRlbGV0ZXMgdGhlIGBuZ0Nsb2FrYCBlbGVtZW50IGF0dHJpYnV0ZSwgbWFraW5nCiAqIHRoZSBjb21waWxlZCBlbGVtZW50IHZpc2libGUuCiAqCiAqIEZvciB0aGUgYmVzdCByZXN1bHQsIHRoZSBgYW5ndWxhci5qc2Agc2NyaXB0IG11c3QgYmUgbG9hZGVkIGluIHRoZSBoZWFkIHNlY3Rpb24gb2YgdGhlIGh0bWwKICogZG9jdW1lbnQ7IGFsdGVybmF0aXZlbHksIHRoZSBjc3MgcnVsZSBhYm92ZSBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBleHRlcm5hbCBzdHlsZXNoZWV0IG9mIHRoZQogKiBhcHBsaWNhdGlvbi4KICoKICogTGVnYWN5IGJyb3dzZXJzLCBsaWtlIElFNywgZG8gbm90IHByb3ZpZGUgYXR0cmlidXRlIHNlbGVjdG9yIHN1cHBvcnQgKGFkZGVkIGluIENTUyAyLjEpIHNvIHRoZXkKICogY2Fubm90IG1hdGNoIHRoZSBgW25nXDpjbG9ha11gIHNlbGVjdG9yLiBUbyB3b3JrIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHlvdSBtdXN0IGFkZCB0aGUgY3NzCiAqIGNsYXNzIGBuZy1jbG9ha2AgaW4gYWRkaXRpb24gdG8gdGhlIGBuZ0Nsb2FrYCBkaXJlY3RpdmUgYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuCiAqCiAqIEBlbGVtZW50IEFOWQogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZT4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZTEiIG5nLWNsb2FrPnt7ICdoZWxsbycgfX08L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZTIiIG5nLWNsb2FrIGNsYXNzPSJuZy1jbG9hayI+e3sgJ2hlbGxvIElFNycgfX08L2Rpdj4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICBpdCgnc2hvdWxkIHJlbW92ZSB0aGUgdGVtcGxhdGUgZGlyZWN0aXZlIGFuZCBjc3MgY2xhc3MnLCBmdW5jdGlvbigpIHsKICAgICAgICAgZXhwZWN0KCQoJyN0ZW1wbGF0ZTEnKS5nZXRBdHRyaWJ1dGUoJ25nLWNsb2FrJykpLgogICAgICAgICAgIHRvQmVOdWxsKCk7CiAgICAgICAgIGV4cGVjdCgkKCcjdGVtcGxhdGUyJykuZ2V0QXR0cmlidXRlKCduZy1jbG9haycpKS4KICAgICAgICAgICB0b0JlTnVsbCgpOwogICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqCiAqLwp2YXIgbmdDbG9ha0RpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHsKICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyKSB7CiAgICBhdHRyLiRzZXQoJ25nQ2xvYWsnLCB1bmRlZmluZWQpOwogICAgZWxlbWVudC5yZW1vdmVDbGFzcygnbmctY2xvYWsnKTsKICB9Cn0pOwoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdDb250cm9sbGVyCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgYG5nQ29udHJvbGxlcmAgZGlyZWN0aXZlIGF0dGFjaGVzIGEgY29udHJvbGxlciBjbGFzcyB0byB0aGUgdmlldy4gVGhpcyBpcyBhIGtleSBhc3BlY3Qgb2YgaG93IGFuZ3VsYXIKICogc3VwcG9ydHMgdGhlIHByaW5jaXBsZXMgYmVoaW5kIHRoZSBNb2RlbC1WaWV3LUNvbnRyb2xsZXIgZGVzaWduIHBhdHRlcm4uCiAqCiAqIE1WQyBjb21wb25lbnRzIGluIGFuZ3VsYXI6CiAqCiAqICogTW9kZWwg4oCUIE1vZGVscyBhcmUgdGhlIHByb3BlcnRpZXMgb2YgYSBzY29wZTsgc2NvcGVzIGFyZSBhdHRhY2hlZCB0byB0aGUgRE9NIHdoZXJlIHNjb3BlIHByb3BlcnRpZXMKICogICBhcmUgYWNjZXNzZWQgdGhyb3VnaCBiaW5kaW5ncy4KICogKiBWaWV3IOKAlCBUaGUgdGVtcGxhdGUgKEhUTUwgd2l0aCBkYXRhIGJpbmRpbmdzKSB0aGF0IGlzIHJlbmRlcmVkIGludG8gdGhlIFZpZXcuCiAqICogQ29udHJvbGxlciDigJQgVGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBDb250cm9sbGVyIGNsYXNzOyB0aGUgY2xhc3MgY29udGFpbnMgYnVzaW5lc3MKICogICBsb2dpYyBiZWhpbmQgdGhlIGFwcGxpY2F0aW9uIHRvIGRlY29yYXRlIHRoZSBzY29wZSB3aXRoIGZ1bmN0aW9ucyBhbmQgdmFsdWVzCiAqCiAqIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gYXR0YWNoIGNvbnRyb2xsZXJzIHRvIHRoZSBET00gYnkgZGVjbGFyaW5nIGl0IGluIGEgcm91dGUgZGVmaW5pdGlvbgogKiB2aWEgdGhlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSAkcm91dGV9IHNlcnZpY2UuIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gZGVjbGFyZSB0aGUgY29udHJvbGxlcgogKiBhZ2FpbiB1c2luZyBgbmctY29udHJvbGxlcmAgaW4gdGhlIHRlbXBsYXRlIGl0c2VsZi4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgY29udHJvbGxlciB0byBiZSBhdHRhY2hlZAogKiBhbmQgZXhlY3V0ZWQgdHdpY2UuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAc2NvcGUKICogQHByaW9yaXR5IDUwMAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ29udHJvbGxlciBOYW1lIG9mIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSBjdXJyZW50CiAqIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyICRjb250cm9sbGVyUHJvdmlkZXJ9IG9yIGFuIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259CiAqIHRoYXQgb24gdGhlIGN1cnJlbnQgc4zc71Z9twIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8UUAAQAZujMCoBzbAqAdglSIf9Vh6fNNBvnS4gBANDpNdAAABAQgKAKNe0QBNpc2M3O9WfbcCAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/81KtAAEAGtmnAqAdgwKgHNh/1lSJBvnS4WHp804AYAVOv1QAAAQEICgBNpc0Ao17RY29wZSBldmFsdWF0ZXMgdG8gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogVGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UgY2FuIGJlIHB1Ymxpc2hlZCBpbnRvIGEgc2NvcGUgcHJvcGVydHkgYnkgc3BlY2lmeWluZwogKiBgbmctY29udHJvbGxlcj0iYXMgcHJvcGVydHlOYW1lImAuCiAqCiAqIElmIHRoZSBjdXJyZW50IGAkY29udHJvbGxlclByb3ZpZGVyYCBpcyBjb25maWd1cmVkIHRvIHVzZSBnbG9iYWxzICh2aWEKICoge0BsaW5rIG5nLiRjb250cm9sbGVyUHJvdmlkZXIjYWxsb3dHbG9iYWxzIGAkY29udHJvbGxlclByb3ZpZGVyLmFsbG93R2xvYmFscygpYCB9KSwgdGhpcyBtYXkKICogYWxzbyBiZSB0aGUgbmFtZSBvZiBhIGdsb2JhbGx5IGFjY2Vzc2libGUgY29uc3RydWN0b3IgZnVuY3Rpb24gKG5vdCByZWNvbW1lbmRlZCkuCiAqCiAqIEBleGFtcGxlCiAqIEhlcmUgaXMgYSBzaW1wbGUgZm9ybSBmb3IgZWRpdGluZyB1c2VyIGNvbnRhY3QgaW5mb3JtYXRpb24uIEFkZGluZywgcmVtb3ZpbmcsIGNsZWFyaW5nLCBhbmQKICogZ3JlZXRpbmcgYXJlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlIGNvbnRyb2xsZXIgKHNlZSBzb3VyY2UgdGFiKS4gVGhlc2UgbWV0aG9kcyBjYW4KICogZWFzaWx5IGJlIGNhbGxlZCBmcm9tIHRoZSBhbmd1bGFyIG1hcmt1cC4gQW55IGNoYW5nZXMgdG8gdGhlIGRhdGEgYXJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkCiAqIGluIHRoZSBWaWV3IHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgbWFudWFsIHVwZGF0ZS4KICoKICogVHdvIGRpZmZlcmVudCBkZWNsYXJhdGlvbiBzdHlsZXMgYXJlIGluY2x1ZGVkIGJlbG93OgogKgogKiAqIG9uZSBiaW5kcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGRpcmVjdGx5IG9udG8gdGhlIGNvbnRyb2xsZXIgdXNpbmcgYHRoaXNgOgogKiBgbmctY29udHJvbGxlcj0iU2V0dGluZ3NDb250cm9sbGVyMSBhcyBzZXR0aW5ncyJgCiAqICogb25lIGluamVjdHMgYCRzY29wZWAgaW50byB0aGUgY29udHJvbGxlcjoKICogYG5nLWNvbnRyb2xsZXI9IlNldHRpbmdzQ29udHJvbGxlcjIiYAogKgogKiBUaGUgc2Vjb25kIG9wdGlvbiBpcyBtb3JlIGNvbW1vbiBpbiB0aGUgQW5ndWxhciBjb21tdW5pdHksIGFuZCBpcyBnZW5lcmFsbHkgdXNlZCBpbiBib2lsZXJwbGF0ZXMKICogYW5kIGluIHRoaXMgZ3VpZGUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhZHZhbnRhZ2VzIHRvIGJpbmRpbmcgcHJvcGVydGllcyBkaXJlY3RseSB0byB0aGUgY29udHJvbGxlcgogKiBhbmQgYXZvaWRpbmcgc2NvcGUuCiAqCiAqICogVXNpbmcgYGNvbnRyb2xsZXIgYXNgIG1ha2VzIGl0IG9idmlvdXMgd2hpY2ggY29udHJvbGxlciB5b3UgYXJlIGFjY2Vzc2luZyBpbiB0aGUgdGVtcGxhdGUgd2hlbgogKiBtdWx0aXBsZSBjb250cm9sbGVycyBhcHBseSB0byBhbiBlbGVtZW50LgogKiAqIElmIHlvdSBhcmUgd3JpdGluZyB5b3VyIGNvbnRyb2xsZXJzIGFzIGNsYXNzZXMgeW91IGhhdmUgZWFzaWVyIGFjY2VzcyB0byB0aGUgcHJvcGVydGllcyBhbmQKICogbWV0aG9kcywgd2hpY2ggd2lsbCBhcHBlYXIgb24gdGhlIHNjb3BlLCBmcm9tIGluc2lkZSB0aGUgY29udHJvbGxlciBjb2RlLgogKiAqIFNpbmNlIHRoZXJlIGlzIGFsd2F5cyBhIGAuYCBpbiB0aGUgYmluZGluZ3MsIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHByb3RvdHlwYWwKICogaW5oZXJpdGFuY2UgbWFza2luZyBwcmltaXRpdmVzLgogKgogKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBgY29udHJvbGxlciBhc2Agc3ludGF4LgogKgogKiA8ZXhhbXBsZSBuYW1lPSJuZ0NvbnRyb2xsZXJBcyIgbW9kdWxlPSJjb250cm9sbGVyQXNFeGFtcGxlIj4KICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICogICAgPGRpdiBpZD0iY3RybC1hcy1leG1wbCIgbmctY29udHJvbGxlcj0iU2V0dGluZ3NDb250cm9sbGVyMSBhcyBzZXR0aW5ncyI+CiAqICAgICAgTmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzZXR0aW5ncy5uYW1lIi8+CiAqICAgICAgWyA8YSBocmVmPSIiIG5nLWNsaWNrPSJzZXR0aW5ncy5ncmVldCgpIj5ncmVldDwvYT4gXTxici8+CiAqICAgICAgQ29udGFjdDoKICogICAgICA8dWw+CiAqICAgICAgICA8bGkgbmctcmVwZWF0PSJjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzIj4KICogICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0iY29udGFjdC50eXBlIj4KICogICAgICAgICAgICAgPG9wdGlvbj5waG9uZTwvb3B0aW9uPgogKiAgICAgICAgICAgICA8b3B0aW9uPmVtYWlsPC9vcHRpb24+CiAqICAgICAgICAgIDwvc2VsZWN0PgogKiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImNvbnRhY3QudmFsdWUiLz4KICogICAgICAgICAgWyA8YSBocmVmPSIiIG5nLWNsaWNrPSJzZXR0aW5ncy5jbGVhckNvbnRhY3QoY29udGFjdCkiPmNsZWFyPC9hPgogKiAgICAgICAgICB8IDxhIGhyZWY9IiIgbmctY2xpY2s9InNldHRpbmdzLnJlbW92ZUNvbnRhY3QoY29udGFjdCkiPlg8L2E+IF0KICogICAgICAgIDwvbGk+CiAqICAgICAgICA8bGk+WyA8YSBocmVmPSIiIG5nLWNsaWNrPSJzZXR0aW5ncy5hZGRDb250YWN0KCkiPmFkZDwvYT4gXTwvbGk+CiAqICAgICA8L3VsPgogKiAgICA8L2Rpdj4KICogICA8L2ZpbGU+CiAqICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4KICogICAgYW5ndWxhci5tb2R1bGUoJ2NvbnRyb2xsZXJBc0V4YW1wbGUnLCBbXSkKICogICAgICAuY29udHJvbGxlcignU2V0dGluZ3NDb250cm9sbGVyMScsIFNldHRpbmdzQ29udHJvbGxlcjEpOwogKgogKiAgICBmdW5jdGlvbiBTZXR0aW5nc0NvbnRyb2xsZXIxKCkgewogKiAgICAgIHRoaXMubmFtZSA9ICJKb2huIFNtaXRoIjsKICogICAgICB0aGlzLmNvbnRhY3RzID0gWwogKiAgICAgICAge3R5cGU6ICdwaG9uZScsIHZhbHVlOiAnNDA4IDU1NSAxMjEyJ30sCiAqICAgICAgICB7dHlwZTogJ2VtYWlsJywgdmFsdWU6ICdqb2huLnNtaXRoQGV4YW1wbGUub3JnJ30gXTsKICogICAgfQogKgogKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5ncmVldCA9IGZ1bmN0aW9uKCkgewogKiAgICAgIGFsZXJ0KHRoaXMubmFtZSk7CiAqICAgIH07CiAqCiAqICAgIFNldHRpbmdzQ29udHJvbGxlcjEucHJvdG90eXBlLmFkZENvbnRhY3QgPSBmdW5jdGlvbigpIHsKICogICAgICB0aGlzLmNvbnRhY3RzLnB1c2goe3R5cGU6ICdlbWFpbCcsIHZhbHVlOiAneW91cm5hbWVAZXhhbXBsZS5vcmcnfSk7CiAqICAgIH07CiAqCiAqICAgIFNldHRpbmdzQ29udHJvbGxlcjEucHJvdG90eXBlLnJlbW92ZUNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0VG9SZW1vdmUpIHsKICogICAgIHZhciBpbmRleCA9IHRoaXMuY29udGFjdHMuaW5kZXhPZihjb250YWN0VG9SZW1vdmUpOwogKiAgICAgIHRoaXMuY29udGFjdHMuc3BsaWNlKGluZGV4LCAxKTsKICogICAgfTsKICoKICogICAgU2V0dGluZ3NDb250cm9sbGVyMS5wcm90b3R5cGUuY2xlYXJDb250YWN0ID0gZnVuY3Rpb24oY29udGFjdCkgewogKiAgICAgIGNvbnRhY3QudHlwZSA9ICdwaG9uZSc7CiAqICAgICAgY29udGFjdC52YWx1ZSA9ICcnOwogKiAgICB9OwogKiAgIDwvZmlsZT4KICogICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICogICAgIGl0KCdzaG91bGQgY2hlY2sgY29udHJvbGxlciBhcycsIGZ1bmN0aW9uKCkgewogKiAgICAgICB2YXIgY29udGFpbmVyID0gZWxlbWVudChieS5pZCgnY3RybC1hcy1leG1wbCcpKTsKICogICAgICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkubW9kZWwoJ3NldHRpbmdzLm5hbWUnKSkKICogICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJ0pvaG4gU21pdGgnKTsKICoKICogICAgICAgdmFyIGZpcnN0UmVwZWF0ID0KICogICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzJykucm93KDApKTsKICogICAgICAgdmFyIHNlY29uZFJlcGVhdCA9CiAqICAgICAgICAgICBjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBzZXR0aW5ncy5jb250YWN0cycpLnJvdygxKSk7CiAqCiAqICAgICAgIGV4cGVjdChmaXJzdFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkKICogICAgICAgICAgIC50b0JlKCc0MDggNTU1IDEyMTInKTsKICoKICogICAgICAgZXhwZWN0KHNlY29uZFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkKICogICAgICAgICAgIC50b0JlKCdqb2huLnNtaXRoQGV4YW1wbGUub3JnJyk7CiAqCiAqICAgICAgIGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubGlua1RleHQoJ2NsZWFyJykpLmNsaWNrKCk7CiAqCiAqICAgICAgIGV4cGVjdChmaXJzdFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkKICogICAgICAgICAgIC50b0JlKCcnKTsKICoKICogICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkubGlua1RleHQoJ2FkZCcpKS5jbGljaygpOwogKgogKiAgICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHMnKS5yb3coMikpCiAqICAgICAgICAgICAuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKQogKiAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkKICogICAgICAgICAgIC50b0JlKCd5b3VybmFtZUBleGFtcGxlLm9yZycpOwogKiAgICAgfSk7CiAqICAgPC9maWxlPgogKiA8L2V4YW1wbGU+CiAqCiAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlICJhdHRhY2ggdG8gYCRzY29wZWAiIHN0eWxlIG9mIGNvbnRyb2xsZXIuCiAqCiAqIDxleGFtcGxlIG5hbWU9Im5nQ29udHJvbGxlciIgbW9kdWxlPSJjb250cm9sbGVyRXhhbXBsZSI+CiAqICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICogICA8ZGl2IGlkPSJjdHJsLWV4bXBsIiBuZy1jb250cm9sbGVyPSJTZXR0aW5nc0NvbnRyb2xsZXIyIj4KICogICAgIE5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ibmFtZSIvPgogKiAgICAgWyA8YSBocmVmPSIiIG5nLWNsaWNrPSJncmVldCgpIj5ncmVldDwvYT4gXTxici8+CiAqICAgICBDb250YWN0OgogKiAgICAgPHVsPgogKiAgICAgICA8bGkgbmctcmVwZWF0PSJjb250YWN0IGluIGNvbnRhY3RzIj4KICogICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJjb250YWN0LnR5cGUiPgogKiAgICAgICAgICAgIDxvcHRpb24+cGhvbmU8L29wdGlvbj4KICogICAgICAgICAgICA8b3B0aW9uPmVtYWlsPC9vcHRpb24+CiAqICAgICAgICAgPC9zZWxlY3Q+CiAqICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJjb250YWN0LnZhbHVlIi8+CiAqICAgICAgICAgWyA8YSBocmVmPSIiIG5nLWNsaWNrPSJjbGVhckNvbnRhY3QoY29udGFjdCkiPmNsZWFyPC9hPgogKiAgICAgICAgIHwgPGEgaHJlZj0iIiBuZy1jbGljaz0icmVtb3ZlQ29udGFjdChjb250YWN0KSI+WDwvYT4gXQogKiAgICAgICA8L2xpPgogKiAgICAgICA8bGk+WyA8YSBocmVmPSIiIG5nLWNsaWNrPSJhZGRDb250YWN0KCkiPmFkZDwvYT4gXTwvbGk+CiAqICAgIDwvdWw+CiAqICAgPC9kaXY+CiAqICA8L2ZpbGU+CiAqICA8ZmlsZSBuYW1lPSJhcHAuanMiPgogKiAgIGFuZ3VsYXIubW9kdWxlKCdjb250cm9sbGVyRXhhbXBsZScsIFtdKQogKiAgICAgLmNvbnRyb2xsZXIoJ1NldHRpbmdzQ29udHJvbGxlcjInLCBbJyRzY29wZScsIFNldHRpbmdzQ29udHJvbGxlcjJdKTsKICoKICogICBmdW5jdGlvbiBTZXR0aW5nc0NvbnRyb2xsZXIyKCRzY29wZSkgewogKiAgICAgJHNjb3BlLm5hbWUgPSAiSm9obiBTbWl0aCI7CiAqICAgICAkc2NvcGUuY29udGFjdHMgPSBbCiAqICAgICAgIHt0eXBlOidwaG9uZScsIHZhbHVlOic0MDggNTU1IDEyMTInfSwKICogICAgICAge3R5cGU6J2VtYWlsJywgdmFsdWU6J2pvaG4uc21pdGhAZXhhbXBsZS5vcmcnfSBdOwogKgogKiAgICAgJHNjb3BlLmdyZWV0ID0gZnVuY3Rpb24oKSB7CiAqICAgICAgIGFsZXJ0KCRzY29wZS5uYW1lKTsKICogICAgIH07CiAqCiAqICAgICAkc2NvcGUuYWRkQ29udGFjdCA9IGZ1bmN0aW9uKCkgewogKiAgICAgICAkc2NvcGUuY29udGFjdHMucHVzaCh7dHlwZTonZW1haWwnLCB2YWx1ZToneW91cm5hbWVAZXhhbXBsZS5vcmcnfSk7CiAqICAgICB9OwogKgogKiAgICAgJHNjb3BlLnJlbW92ZUNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0VG9SZW1vdmUpIHsKICogICAgICAgdmFyIGluZGV4ID0gJHNjb3BlLmNvbnRhY3RzLmluZGV4T2YoY29udGFjdFRvUmVtb3ZlKTsKICogICAgICAgJHNjb3BlLmNvbnRhY3RzLnNwbGljZShpbmRleCwgMSk7CiAqICAgICB9OwogKgogKiAgICAgJHNjb3BlLmNsZWFyQ29udGFjdCA9IGZ1bmN0aW9uKGNvbnRhY3QpIHsKICogICAgICAgY29udGFjdC50eXBlID0gJ3Bob25lJzsKICogICAgICAgY29udGFjdC52YWx1ZSA9ICcnOwogKiAgICAgfTsKICogICB9CiAqICA8L2ZpbGU+CiAqICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICogICAgaXQoJ3Nob3VsZCBjaGVjayBjb250cm9sbGVyJywgZnVuY3Rpb24oKSB7CiAqICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuaWQoJ2N0cmwtZXhtcGwnKSk7CiAqCiAqICAgICAgZXhwZWN0KGNvbnRhaW5lci5lbGVtZW50KGJ5Lm1vZGVsKCduYW1lJykpCiAqICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJ0pvaG4gU21pdGgnKTsKICoKICogICAgICB2YXIgZmlyc3RSZXBlYXQgPQogKiAgICAgICAgICBjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBjb250YWN0cycpLnJvdygwKSk7CiAqICAgICAgdmFyIHNlY29uZFJlcGVhdCA9CiAqICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIGNvbnRhY3RzJykucm93KDEpKTsKICoKICogICAgICBleHBlY3QoZmlyc3RSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpCiAqICAgICAgICAgIC50b0JlKCc0MDggNTU1IDEyMTInKTsKICogICAgICBleHBlY3Qoc2Vjb25kUmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQogKiAgICAgICAgICAudG9CZSgnam9obi5zbWl0aEBleGFtcGxlLm9yZycpOwogKgogKiAgICAgIGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubGlua1RleHQoJ2NsZWFyJykpLmNsaWNrKCk7CiAqCiAqICAgICAgZXhwZWN0KGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQogKiAgICAgICAgICAudG9CZSgnJyk7CiAqCiAqICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkubGlua1RleHQoJ2FkZCcpKS5jbGljaygpOwogKgogKiAgICAgIGV4cGVjdChjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBjb250YWN0cycpLnJvdygyKSkKICogICAgICAgICAgLmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkKICogICAgICAgICAgLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkKICogICAgICAgICAgLnRvQmUoJ3lvdXJuYW1lQGV4YW1wbGUub3JnJyk7CiAqICAgIH0pOwogKiAgPC9maWxlPgogKjwvZXhhbXBsZT4KCiAqLwp2YXIgbmdDb250cm9sbGVyRGlyZWN0aXZlID0gW2Z1bmN0aW9uKCkgewogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0EnLAogICAgc2NvcGU6IHRydWUsCiAgICBjb250cm9sbGVyOiAnQCcsCiAgICBwcmlvcml0eTogNTAwCiAgfTsKfV07CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0NzcAogKgogKiBAZWxlbWVudCBodG1sCiAqIEBkZXNjcmlwdGlvbgogKiBFbmFibGVzIFtDU1AgKENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQKSBzdXBwb3J0LgogKgogKg0KjNzvVn23AgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxSQABABm6LwKgHNsCoB2CVIh/1WHp800G+lICAEA0Oc5UAAAEBCAoAo17RAE2lzYzc71ZPvQIAFQ4AABUOAABo9ygf0sUIACetHhMIAEUADgcYUkAAQAaEuMCoB2DAqAc2H/WVK2c8vez2ajDhgBgA7J3gAAABAQgKAE2lzQCjXsJIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAzNDQxDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIERldmljZSBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWRldmljZSBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNvdi1kZXZpY2UgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtZGV2aWNlIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1kZXZpY2UgLmN1cnJlbnQtdmlldyB1c2UgewogICAgZmlsbDogIzMwNDg2MDsKfQoKLmxpZ2h0ICNvdi1kZXZpY2UgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1kZXZpY2UgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi8qIE1vcmUgaW4gZ2VuZXJpYyBwYW5lbC5jc3MgKi8KCiNkZXZpY2UtZGV0YWlscy1wYW5lbC5mbG9hdHBhbmVsIHsKICAgIC1tb3otYm9yZGVyLXJhZGl1czogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICB6LWluZGV4OiAwOwp9CgoubGlnaHQgI2RldmljZS1kZXRhaWxzLXBhbmVsLmZsb2F0cGFuZWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyOSwgMjM0LCAyMzcpOwp9Ci5kYXJrICNkZXZpY2UtZGV0YWlscy1wYW5lbC5mbG9hdHBhbmVsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzQTQwNDI7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDAgMTJweDsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5jbG9zZS1idG4gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmxpZ2h0IC5jbG9zZS1idG4gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5wbHVzIC5nbHlwaCB7CiAgICBmaWxsOiAjYWFhOwp9Ci5kYXJrIC5jbG9zZS1idG4gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5wbHVzIC5nbHlwaCB7CiAgICBmaWxsOiAjY2NjOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmRldi1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmc6IDAgNnB4IDAgMDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLmxpZ2h0IC5kZXYtaWNvbiBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiByZ2IoMCwgMTcyLCAyMjkpOwp9Ci5kYXJrIC5kZXYtaWNvbiBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjNDg2RDkxOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbWFyZ2luOiA4cHggMDsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5lZGl0YWJsZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkIGRhcmtncmVlbjsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIGgyIGlucHV0IHsKICAgIGZvbnQtc2l6ZTogMS4wZW07Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAudG9wIGRpdi5sZWZ0IHsKICAgIGZsb2F0OiBsZWZ0OwogICAgcGFkZGluZzogMCAxOHB4IDAgMDsKfQojZGV2aWNlLWRldGFpbHMtcGFuZWwgLnRvcCBkaXYucmlnaHQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgdGQubGFiZWwgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgcGFkZGluZy1yaWdodDogMTJweDsKICAgIC8qIHdvcmtzIGZvciBib3RoIGxpZ2h0IGFuZCBkYXJrIHRoZW1lcyAuLi4gKi8KICAgIGNvbG9yOiAjNzc3Owp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmFjdGlvbkJ0bnMgZGl2IHsKICAgIHBhZGRpbmc6IDEycHggNnB4Owp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLnRvcCBociB7CiAgICB3aWR0aDogOTUlOwogICAgbWFyZ2luOiAwIGF1dG87Cn0KCi5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgaHIgewogICAgb3BhY2l0eTogLjU7CiAgICBib3JkZXItY29sb3I6ICNGRkY7Cn0KLmRhcmsgI2RldmljZS1kZXRhaWxzLXBhbmVsIGhyIHsKICAgIGJvcmRlci1jb2xvcjogIzY2NjsKfQoKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGFibGUgewogICAgYm9yZGVyLXNwYWNpbmc6IDA7Cn0KCiNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRoIHsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07Cn0KCi5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0aCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDOwogICAgLyogZGVmYXVsdCB0ZXh0IGNvbG9yICovCn0KLmRhcmsgI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogIzEzMTMxMzsKICAgIGNvbG9yOiAjY2NjOwp9CgojZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0aCwKI2RldmljZS1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGQgewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5Owp9Ci5saWdodCAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQoZXZlbikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0VCRURGMjsKfQouZGFyayAjZGV2aWNlLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9Ci5kYXJrICNkZXZpY2UtZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChldmVuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1Owp9Cozc71aBvQIAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwRUAAQAY6mMCoBzbAqAdglSsf9fZqMOFnPMu/gBABHNDBAAABAQgKAKNe0gBNpc2M3O9WqMECAJsCAACbAgAACAAnrR4TaPcoH9LFCABFAAKNcEZAAEAGOD7AqAc2wKgHYJUrH/X2ajDhZzzLv4AYARz++wAAAQEICgCjXtIATaXNR0VUIC9vbm9zL3VpL2FwcC92aWV3L2hvc3QvaG9zdC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUy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bnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAyMDUzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEdyb3VwIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtZ3JvdXAgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtZ3JvdXAgZGl2LmN0cmwtYnRucyB7Cn0KCi5saWdodCAjb3YtZ3JvdXAgLmN1cnJlbnQtdmlldyB1c2UgewogICAgZmlsbDogd2hpdGU7Cn0KLmRhcmsgI292LWdyb3VwIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6ICMzMDQ4NjA7Cn0KCi5saWdodCAjb3YtZ3JvdXAgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1ncm91cCAuY3VycmVudC12aWV3IHJlY3QgewogICAgZmlsbDogI2VlZTsKfQoKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAxKSwKLmxpZ2h0ICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAyKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9Ci5saWdodCAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMyksCi5saWdodCAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwp9Ci5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAxKSwKLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDIpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7Cn0KLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDMpLAouZGFyayAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9CgovKiBoaWdobGlnaHRlZCBjb2xvciAqLwoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDEpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDIpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDMpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0bikuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZERkZEQzsKfQouZGFyayAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuICsgMSkuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1ncm91cCB0cjpudGgtY2hpbGQoNG4gKyAyKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWdyb3VwIHRyOm50aC1jaGlsZCg0biArIDMpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZ3JvdXAgdHI6bnRoLWNoaWxkKDRuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUE1NjAwOwp9Cgojb3YtZ3JvdXAgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CiNvdi1ncm91cCB0ZC5yaWdodCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQojb3YtZ3JvdXAgdGQuYnVja2V0cyB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgcGFkZGluZy1sZWZ0OiAzNnB4OwogICAgb3BhY2l0eTogMC42NTsKfQqM3O9Wst4CAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0Le9AAEAGfO7AqAc2wKgHYJUnH/XbknqSOVWvM4AQDzPeRAAAAQEICgCjXtQATaXPjNzvVkXkAgCIAwAAiAMAAGj3KB/SxQgAJ60eEwgARQADehhWQABABo9BwKgHYMCoBzYf9ZUrZzzLv/ZqMzqAGAD2k1MAAAEBCAoATaXPAKNe0khUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDc0MQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBIb3N0IFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtaG9zdCBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNvdi1ob3N0IGRpdi5jdHJsLWJ0bnMgewogICAgd2lkdGg6IDQ1cHg7Cn2M3O9W++4CAJ8CAACfAgAACAAnrR4TaPcoH9LFCABFAAKRwbBAAEAG5s/AqAc2wKgHYJUtH/VP2aHIppItloAYAPu+uwAAAQEICgCjXtUATaXOR0VUIC9vbm9zL3VpL2FwcC92aWV3L2ludGVudC9pbnRlbnQuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9W++4CAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0jU9AAEAGHY7AqAdgwKgHNh/1lS2mki2WT9mkJYAQAPaQDQAAAQEICgBNpdAAo17VjNzvVqTyAgCZAgAAmQIAAAgAJ60eE2j3KB/SxQgARQACiy3wQABABnqWwKgHNsCoB2CVJx/125J6kjlVrzOAGA8zWC8AAAEBCAoAo17VAE2lz0dFVCAvb25vcy91aS9hcHAvdmlldy9hcHAvYXBwLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVqTyAgBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANDedQABABnNAwKgHYMCoBzYf9ZUnOVWvM9uSfOmAEAEAkA0AAAEBCAoATaXRAKNe1Yzc71ak8gIAowIAAKMCAAAIACetHhNo9ygf0sUIAEUAApVwR0AAQAY4NcCoBzbAqAdglSsf9fZqMzpnPM8FgBgBM0SEAAABAQgKAKNe1QBNpc9HRVQgL29ub3MvdWkvYXBwL3ZpZXcvc2V0dGluZ3Mvc2V0dGluZ3MuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WP/cCAJUDAACVAwAAaPcoH9LFCAAnrR4TCABFAAOHGFdAAEAGjzPAqAdgwKgHNh/1lStnPM8F9mo1m4AYAP+TYAAAAQEICgBNpdEAo17VSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogNzU0DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFNldHRpbmdzIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3Ytc2V0dGluZ3MgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3Ytc2V0dGluZ3MgZGl2LmN0cmwtYnRucyB7CiAgICB3aWR0aDogNDVweDsKfQqM3O9WOvwCAKECAAChAgAACAAnrR4TaPcoH9LFCABFAAKTcEhAAEAGODbAqAc2wKgHYJUrH/X2ajWbZzzSWIAYAUljcwAAAQEICgCjXtYATaXRR0VUIC9vbm9zL3VpL2FwcC92aWV3L2NsdXN0ZXIvY2x1c3Rlci5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71Yo/gIACA4AAAgOAABo9ygf0sUIACetHhMIAEUADfo3nkAAQAZlecCoB2DAqAc2H/WVJzlVrzPbknzpgBgBAJ3TAAABAQgKAE2l0QCjXtVIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiAzNDI4DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1LTIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gQXBwbGljYXRpb25zIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtYXBwIGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWFwcCBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiAyOTBweDsKfQoKI292LWFwcCBmb3JtI2lucHV0RmlsZUZvcm0sCiNvdi1hcHAgaW5wdXQjdXBsb2FkRmlsZSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgojYXBwLWRpYWxvZyBwIHsKICAgIGZvbnQtc2l6ZTogMTJwdDsKfQoubGlnaHQgI2FwcC1kaWFsb2cgcCB7CiAgICBjb2xvcjogZGFya3JlZDsKfQouZGFyayAjYXBwLWRpYWxvZyBwIHsKICAgIGNvbG9yOiAjYzU1Owp9CgojYXBwLWRpYWxvZyBwLnN0cm9uZyB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGlnaHQgI2FwcC1kaWFsb2cgcC5zdHJvbmcgewogICAgY29sb3I6IHJlZDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjA7Cn0KLmRhcmsgI2FwcC1kaWFsb2cgcC5zdHJvbmcgewogICAgY29sb3I6ICNjNTU7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGQ0Owp9CgoKLmxpZ2h0ICNhcHAtZGlhbG9nLmZsb2F0cGFuZWwuZGlhbG9nIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KLmRhcmsgI2FwcC1kaWFsb2cuZmxvYXRwYW5lbC5kaWFsb2cgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwuZmxvYXRwYW5lbCB7CiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgei1pbmRleDogMDsKfQoKLmxpZ2h0ICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsLmZsb2F0cGFuZWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyOSwgMjM0LCAyMzcpOwp9Ci5kYXJrICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsLmZsb2F0cGFuZWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzNBNDA0MjsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmNvbnRhaW5lciB7CiAgICBwYWRkaW5nOiAwIDEwcHg7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5jbG9zZS1idG4gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmxpZ2h0IC5jbG9zZS1idG4gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5wbHVzIC5nbHlwaCB7CiAgICBmaWxsOiAjYWFhOwp9Ci5kYXJrIC5jbG9zZS1idG4gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5wbHVzIC5nbHlwaCB7CiAgICBmaWxsOiAjY2NjOwp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYXBwLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogMCA2cHggMCAwOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbWFyZ2luOiA4cHggMDsKICAgIGZvbnQtc2l6ZTogMTJwdDsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLnRvcCBkaXYubGVmdCB7CiAgICBmbG9hdDogbGVmdDsKICAgIHBhZGRpbmc6IDAgMTJweCAwIDA7Cn0KI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLnRvcCBkaXYucmlnaHQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHdpZHRoOiAzMjBweDsKfQoKI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgdGQubGFiZWwsCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5hcHAtdXJsIGkgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgcGFkZGluZy1yaWdodDogMTJweDsKICAgIC8qIHdvcmtzIGZvciBib3RoIGxpZ2h0IGFuZCBkYXJrIHRoZW1lcyAuLi4gKi8KICAgIGNvbG9yOiAjNzc3Owp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCB0ZC52YWx1ZS1ib2xkIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYXBwLXVybCB7CiAgICBwYWRkaW5nOiAxMHB4IDZweCA2cHg7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIGhyIHsKICAgIHdpZHRoOiA5NSU7CiAgICBtYXJnaW46IDEwcHggYXV0bzsKfQoubGlnaHQgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgaHIgewogICAgb3BhY2l0eTogLjU7CiAgICBib3JkZXItY29sb3I6ICNGRkY7Cn0KLmRhcmsgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgaHIgewogICAgYm9yZGVyLWNvbG9yOiAjNjY2Owp9CgojYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYm90dG9tIHRhYmxlIHsKICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgd2lkdGg6IDEwMCU7Cn0KCiNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdGQgewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgoubGlnaHQgI2FwcGxpY2F0aW9uLWRldGFpbHMtcGFuZWwgLmJvdHRvbSB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5Owp9Ci5saWdodCAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChldmVuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUJFREYyOwp9Ci5kYXJrICNhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsIC5ib3R0b20gdHI6bnRoLWNoaWxkKG9kZCkgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKfQouZGFyayAjYXBwbGljYXRpb24tZGV0YWlscy1wYW5lbCAuYm90dG9tIHRyOm50aC1jaGlsZChldmVuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1Owp9jNzvVg3/AgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC3xQABABnzswKgHNsCoB2CVJx/125J86TlVvPmAEA8zziMAAAEBCAoAo17WAE2l0Yzc71YPBAMApQIAAKUCAAAIACetHhNo9ygf0sUIAEUAApct8kAAQAZ6iMCoBzbAqAdglScf9duSfOk5Vbz5gBgPM5VyAAABAQgKAKNe1gBNpdFHRVQgL29ub3MvdWkvYXBwL3ZpZXcvcHJvY2Vzc29yL3Byb2Nlc3Nvci5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YLCAMAkQMAAJEDAABo9ygf0sUIACetHhMIAEUAA4MYWEAAQAaPNsCoB2DAqAc2H/WVK2c80lj2ajf6gBgBCZNcAAABAQgKAE2l0gCjXtZIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNCkNvbnRlbnQtTGVuZ3RoOiA3NTANClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gQ2x1c3RlciBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWNsdXN0ZXIgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtY2x1c3RlciBkaXYuY3RybC1idG5zIHsKICAgIHdpZHRoOiA0NXB4Owp9jNzvVukMAwDUCAAA1AgAAGj3KB/SxQgAJ60eEwgARQAIxo1QQABABhT7wKgHYMCoBzYf9ZUtppItlk/ZpCWAGAD2mJ8AAAEBCAoATaXSAKNe1UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDIwOTYNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gSW50ZW50IFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtaW50ZW50IGgyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI292LWludGVudCBkaXYuY3RybC1idG5zIHsKfQoKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMSksCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDIpLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAzKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9Ci5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDQpLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA1KSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwp9Ci5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMSksCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMiksCi5kYXJrICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMykgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKfQouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDQpLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDUpLAouZGFyayAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKfQoKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgMSkuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDIpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAzKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1pbnRlbnQgdHI6bnRoLWNoaWxkKDZuICsgNCkuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtaW50ZW50IHRyOm50aC1jaGlsZCg2biArIDUpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4pLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNGREZGREM7Cn0KLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAxKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAyKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyAzKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA0KS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4gKyA1KS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWludGVudCB0cjpudGgtY2hpbGQoNm4pLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM1QTU2MDA7Cn0KCiNvdi1pbnRlbnQgdGQucmVzb3VyY2VzLAojb3YtaW50ZW50IHRkLmRldGFpbHMgewogICAgcGFkZGluZy1sZWZ0OiAzNnB4OwogICAgb3BhY2l0eTogMC42NTsKfQqM3O9WoQ4DAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wbFAAEAG6SvAqAc2wKgHYJUtH/VP2aQlppI2KIAQAR5aQgAAAQEICgCjXtcATaXSjNzvVjMaAwCfAgAAnwIAAAgAJ60eE2j3KB/SxQgARQACkXBJQABABjg3wKgHNsCoB2CVKx/19mo3+mc81aeAGAFgFNAAAAEBCAoAo17XAE2l0kdFVCAvb25vcy91aS9hcHAvdmlldy90dW5uZWwvdHVubmVsLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVowcAwDFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt8GyQABABuanwKgHNsCoB2CVLR/1T9mkJaaSNiiAGAEeG0IAAAEBCAoAo17YAE2l0kdFVCAvb25vcy91aS90cC9hbmd1bGFyLWNoYXJ0Lm1pbi5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9W6igDAIwDAACMAwAAaPcoH9LFCAAnrR4TCABFAAN+GFlAAEAGjzrAqAdgwKgHNh/1lStnPNWn9mo6V4AYARKTVwAAAQEICgBNpdQAo17XSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogNzQ1DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIExpbmsgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi10dW5uZWwgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtdHVubmVsIGRpdi5jdHJsLWJ0bnMgewogICAgd2lkdGg6IDQ1cHg7Cn2M3O9WHC4DAH0CAAB9AgAACAAnrR4TaPcoH9LFCABFAAJvcEpAAEAGOFjAqAc2wKgHYJUrH/X2ajpXZzzY8YAYAXaW+AAAAQEICgCjXtkATaXUR0VUIC9vbm9zL3VpL29ub3MuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YHLwMAOhcAADoXAABo9ygf0sUIACetHhMIAEUAFyyNUkAAQAYGk8CoB2DAqAc2H/WVLaaSNihP2aaogBgBAKcFAAABAQgKAE2l1ACjXthIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxNjYzDQohZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10KCJ1bmRlZmluZWQiIT10eXBlb2YgYW5ndWxhcj9hbmd1bGFyOnJlcXVpcmUoImFuZ3VsYXIiKSwidW5kZWZpbmVkIiE9dHlwZW9mIENoYXJ0P0NoYXJ0OnJlcXVpcmUoImNoYXJ0LmpzIikpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiYW5ndWxhciIsImNoYXJ0Il0sdCk6dChhbmd1bGFyLENoYXJ0KX0oZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe3ZhciBuPXt9LHI9e0NoYXJ0OmUsZ2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgcj1lJiZuW2VdfHx7fTtyZXR1cm4gdC5leHRlbmQoe30sbixyKX19O3RoaXMuc2V0T3B0aW9ucz1mdW5jdGlvbihlLHIpe3JldHVybiByP3ZvaWQobltlXT10LmV4dGVuZChuW2VdfHx7fSxyKSk6KHI9ZSx2b2lkKG49dC5leHRlbmQobixyKSkpfSx0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gcihuLHIpe2Z1bmN0aW9uIG8odCxlKXtyZXR1cm4gdCYmZSYmdC5sZW5ndGgmJmUubGVuZ3RoP0FycmF5LmlzQXJyYXkodFswXSk/dC5sZW5ndGg9PT1lLmxlbmd0aCYmdC5ldmVyeShmdW5jdGlvbih0LG4pe3JldHVybiB0Lmxlbmd0aD09PWVbbl0ubGVuZ3RofSk6ZS5yZWR1Y2UoaSwwKT4wP3QubGVuZ3RoPT09ZS5sZW5ndGg6ITE6ITF9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0K2V9ZnVuY3Rpb24gYyhlLG4scixhKXt2YXIgbz1udWxsO3JldHVybiBmdW5jdGlvbihpKXt2YXIgYz1uLmdldFBvaW50c0F0RXZlbnR8fG4uZ2V0QmFyc0F0RXZlbnR8fG4uZ2V0U2VnbWVudHNBdEV2ZW50O2lmKGMpe3ZhciBsPWMuY2FsbChuLGkpOyhhPT09ITF8fHQuZXF1YWxzKG8sbCk9PT0hMSkmJihvPWwsZVtyXShsLGkpLGUuJGFwcGx5KCkpfX19ZnVuY3Rpb24gbChyLGEpe2Zvcih2YXIgbz10LmNvcHkoYS5jb2xvdXJzfHxuLmdldE9wdGlvbnMocikuY29sb3Vyc3x8ZS5kZWZhdWx0cy5nbG9iYWwuY29sb3Vycyk7by5sZW5ndGg8YS5kYXRhLmxlbmd0aDspby5wdXNoKGEuZ2V0Q29sb3VyKCkpO3JldHVybiBvLm1hcCh1KX1mdW5jdGlvbiB1KHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQ/dDoic3RyaW5nIj09dHlwZW9mIHQmJiIjIj09PXRbMF0/ZihnKHQuc3Vic3RyKDEpKSk6cygpfWZ1bmN0aW9uIHMoKXt2YXIgdD1baCgwLDI1NSksaCgwLDI1NSksaCgwLDI1NSldO3JldHVybiBmKHQpfWZ1bmN0aW9uIGYodCl7cmV0dXJue2ZpbGxDb2xvcjpkKHQsLjIpLHN0cm9rZUNvbG9yOmQodCwxKSxwb2ludENvbG9yOmQodCwxKSxwb2ludFN0cm9rZUNvbG9yOiIjZmZmIixwb2ludEhpZ2hsaWdodEZpbGw6IiNmZmYiLHBvaW50SGlnaGxpZ2h0U3Ryb2tlOmQodCwuOCl9fWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihlLXQrMSkpK3R9ZnVuY3Rpb24gZCh0LGUpe3JldHVybiBhPyJyZ2IoIit0LmpvaW4oIiwiKSsiKSI6InJnYmEoIit0LmNvbmNhdChlKS5qb2luKCIsIikrIikifWZ1bmN0aW9uIGcodCl7dmFyIGU9cGFyc2VJbnQodCwxNiksbj1lPj4xNiYyNTUscj1lPj44JjI1NSxhPTI1NSZlO3JldHVybltuLHIsYV19ZnVuY3Rpb24gcChlLG4scixhKXtyZXR1cm57bGFiZWxzOmUsZGF0YXNldHM6bi5tYXAoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5leHRlbmQoe30sYVtuXSx7bGFiZWw6cltuXSxkYXRhOmV9KX0pfX1mdW5jdGlvbiB2KGUsbixyKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSxhKXtyZXR1cm4gdC5leHRlbmQoe30sclthXSx7bGFiZWw6ZSx2YWx1ZTpuW2FdLGNvbG9yOnJbYV0uc3Ryb2tlQ29sb3IsaGlnaGxpZ2h0OnJbYV0ucG9pbnRIaWdobGlnaHRTdHJva2V9KX0pfWZ1bmN0aW9uIHkodCxlKXt2YXIgbj10LnBhcmVudCgpLHI9bi5maW5kKCJjaGFydC1sZWdlbmQiKSxhPSI8Y2hhcnQtbGVnZW5kPiIrZS5nZW5lcmF0ZUxlZ2VuZCgpKyI8L2NoYXJ0LWxlZ2VuZD4iO3IubGVuZ3RoP3IucmVwbGFjZVdpdGgoYSk6bi5hcHBlbmQoYSl9ZnVuY3Rpb24gQyh0LGUsbixyKXtBcnJheS5pc0FycmF5KG4uZGF0YVswXSk/dC5kYXRhc2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHQsbil7KHQucG9pbnRzfHx0LmJhcnMpLmZvckVhY2goZnVuY3Rpb24odCxyKXt0LnZhbHVlPWVbbl1bcl19KX0pOnQuc2VnbWVudHMuZm9yRWFjaChmdW5jdGlvbih0LG4pe3QudmFsdWU9ZVtuXX0pLHQudXBkYXRlKCksbi4kZW1pdCgidXBkYXRlIix0KSxuLmxlZ2VuZCYmImZhbHNlIiE9PW4ubGVnZW5kJiZ5KHIsdCl9ZnVuY3Rpb24gYih0KXtyZXR1cm4hdHx8QXJyYXkuaXNBcnJheSh0KSYmIXQubGVuZ3RofHwib2JqZWN0Ij09dHlwZW9mIHQmJiFPYmplY3Qua2V5cyh0KS5sZW5ndGh9ZnVuY3Rpb24gbShyLGEpe3ZhciBvPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMuZ2xvYmFsLG4uZ2V0T3B0aW9ucyhyKSxhLm9wdGlvbnMpO3JldHVybiBvLnJlc3BvbnNpdmV9cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybntyZXN0cmljdDoiQ0EiLHNjb3BlOntkYXRhOiI9PyIsbGFiZWxzOiI9PyIsb3B0aW9uczoiPT8iLHNlcmllczoiPT8iLGNvbG91cnM6Ij0/IixnZXRDb2xvdXI6Ij0/IixjaGFydFR5cGU6Ij0iLGxlZ2VuZDoiQCIsY2xpY2s6Ij0/Iixob3ZlcjoiPT8iLGNoYXJ0RGF0YToiPT8iLGNoYXJ0TGFiZWxzOiI9PyIsY2hhcnRPcHRpb25zOiI9PyIsY2hhcnRTZXJpZXM6Ij0/IixjaGFydENvbG91cnM6Ij0/IixjaGFydExlZ2VuZDoiQCIsY2hhcnRDbGljazoiPT8iLGNoYXJ0SG92ZXI6Ij0/In0sbGluazpmdW5jdGlvbihpLHUpe2Z1bmN0aW9uIGYodCxlKXtpLiR3YXRjaCh0LGZ1bmN0aW9uKHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgdCYmKGlbZV09dCl9KX1mdW5jdGlvbiBoKG4scil7aWYoIWIobikmJiF0LmVxdWFscyhuLHIpKXt2YXIgYT1lfHxpLmNoYXJ0VHlwZTthJiYodyYmdy5kZXN0cm95KCksZChhKSl9fWZ1bmN0aW9uIGQoZSl7aWYobShlLGkpJiYwPT09dVswXS5jbGllbnRIZWlnaHQmJjA9PT1BLmNsaWVudEhlaWdodClyZXR1cm4gcihmdW5jdGlvbigpe2QoZSl9LDUwLCExKTtpZihpLmRhdGEmJmkuZGF0YS5sZW5ndGgpe2kuZ2V0Q29sb3VyPSJmdW5jdGlvbiI9PXR5cGVvZiBpLmdldENvbG91cj9pLmdldENvbG91cjpzLGkuY29sb3Vycz1sKGUsaSk7dmFyIGE9dVswXSxvPWEuZ2V0Q29udGV4dCgiMmQiKSxmPUFycmF5LmlzQXJyYXkoaS5kYXRhWzBdKT9wKGkubGFiZWxzLGkuZGF0YSxpLnNlcmllc3x8W10saS5jb2xvdXJzKTp2KGkubGFiZWxzLGkuZGF0YSxpLmNvbG91cnMpLGg9dC5leHRlbmQoe30sbi5nZXRPcHRpb25zKGUpLGkub3B0aW9ucyk7dz1uZXcgbi5DaGFydChvKVtlXShmLGgpLGkuJGVtaXQoImNyZWF0ZSIsdyksYS5vbmNsaWNrPWkuY2xpY2s/YyhpLHcsImNsaWNrIiwhMSk6dC5ub29wLGEub25tb3VzZW1vdmU9aS5ob3Zlcj9jKGksdywiaG92ZXIiLCEwKTp0Lm5vb3AsaS5sZWdlbmQmJiJmYWxzZSIhPT1pLmxlZ2VuZCYmeSh1LHcpfX1mdW5jdGlvbiBnKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSYmInRlc3QiIT09bi5nZXRPcHRpb25zKCkuZW52KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2Fybjpjb25zb2xlLmxvZztpW3RdJiZlLmNhbGwoY29uc29sZSwnIiVzIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gUGxlYXNlIHVzZSAiY2hhcnQtJXMiIGluc3RlYWQuJyx0LHQpfX12YXIgdyxBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0EuY2xhc3NOYW1lPSJjaGFydC1jb250YWluZXIiLHUucmVwbGFjZVdpdGgoQSksQS5hcHBlbmRDaGlsZCh1WzBdKSxhJiZ3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KHVbMF0pLFsiZGF0YSIsImxhYmVscyIsIm9wdGlvbnMiLCJzZXJpZXMiLCJjb2xvdXJzIiwibGVnZW5kIiwiY2xpY2siLCJob3ZlciJdLmZvckVhY2goZyksZigiY2hhcnREYXRhIiwiZGF0YSIpLGYoImNoYXJ0TGFiZWxzIiwibGFiZWxzIiksZigiY2hhcnRPcHRpb25zIiwib3B0aW9ucyIpLGYoImNoYXJ0U2VyaWVzIiwic2VyaWVzIiksZigiY2hhcnRDb2xvdXJzIiwiY29sb3VycyIpLGYoImNoYXJ0TGVnZW5kIiwibGVnZW5kIiksZigiY2hhcnRDbGljayIsImNsaWNrIiksZigiY2hhcnRIb3ZlciIsImhvdmVyIiksaS4kd2F0Y2goImRhdGEiLGZ1bmN0aW9uKHQsbil7aWYodCYmdC5sZW5ndGgmJighQXJyYXkuaXNBcnJheSh0WzBdKXx8dFswXS5sZW5ndGgpKXt2YXIgcj1lfHxpLmNoYXJ0VHlwZTtpZihyKXtpZih3KXtpZihvKHQsbikpcmV0dXJuIEModyx0LGksdSk7dy5kZXN0cm95KCl9ZChyKX19fSwhMCksaS4kd2F0Y2goInNlcmllcyIsaCwhMCksaS4kd2F0Y2goImxhYmVscyIsaCwhMCksaS4kd2F0Y2goIm9wdGlvbnMiLGgsITApLGkuJHdhdGNoKCJjb2xvdXJzIixoLCEwKSxpLiR3YXRjaCgiY2hhcnRUeXBlIixmdW5jdGlvbihlLG4pe2IoZSl8fHQuZXF1YWxzKGUsbil8fCh3JiZ3LmRlc3Ryb3koKSxkKGUpKX0pLGkuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXt3JiZ3LmRlc3Ryb3koKX0pfX19fWUuZGVmYXVsdHMuZ2xvYmFsLnJlc3BvbnNpdmU9ITAsZS5kZWZhdWx0cy5nbG9iYWwubXVsdGlUb29sdGlwVGVtcGxhdGU9IjwlaWYgKGRhdGFzZXRMYWJlbCl7JT48JT1kYXRhc2V0TGFiZWwlPjogPCV9JT48JT0gdmFsdWUgJT4iLGUuZGVmYXVsdHMuZ2xvYmFsLmNvbG91cnM9WyIjOTdCQkNEIiwiI0RDRENEQyIsIiNGNzQ2NEEiLCIjNDZCRkJEIiwiI0ZEQjQ1QyIsIiM5NDlGQjEiLCIjNEQ1MzYwIl07dmFyIGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyJiZudWxsIT09d2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlciYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIuaW5pdEVsZW1lbnQ7cmV0dXJuIGEmJihlLmRlZmF1bHRzLmdsb2JhbC5hbmltYXRpb249ITEpLHQubW9kdWxlKCJjaGFydC5qcyIsW10pLnByb3ZpZGVyKCJDaGFydEpzIixuKS5mYWN0b3J5KCJDaGFydEpzRmFjdG9yeSIsWyJDaGFydEpzIiwiJHRpbWVvdXQiLHJdKS5kaXJlY3RpdmUoImNoYXJ0QmFzZSIsWyJDaGFydEpzRmFjdG9yeSIsZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB0fV0pLmRpcmVjdGl2ZSgiY2hhcnRMaW5lIixbIkNoYXJ0SnNGYWN0b3J5IixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHQoIkxpbmUiKX1dKS5kaXJlY3RpdmUoImNoYXJ0QmFyIixbIkNoYXJ0SnNGYWN0b3J5IixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHQoIkJhciIpfV0pLmRpcmVjdGl2ZSgiY2hhcnRSYWRhciIsWyJDaGFydEpzRmFjdG9yeSIsZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB0KCJSYWRhciIpfV0pLmRpcmVjdGl2ZSgiY2hhcnREb3VnaG51dCIsWyJDaGFydEpzRmFjdG9yeSIsZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB0KCJEb3VnaG51dCIpfV0pLmRpcmVjdGl2ZSgiY2hhcnRQaWUiLFsiQ2hhcnRKc0ZhY3RvcnkiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdCgiUGllIil9XSkuZGlyZWN0aXZlKCJjaGFydFBvbGFyQXJlYSIsWyJDaGFydEpzRmFjdG9yeSIsZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB0KCJQb2xhckFyZWEiKX1dKX0pOwovLyMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLWNoYXJ0Lm1pbi5qcy5tYXAKDQqM3O9WXy8DAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wbNAAEAG6SnAqAc2wKgHYJUtH/VP2aaoppJNIIAQAXlAaAAAAQEICgCjXtkATaXUjNzvVvYvAwBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOY1XQABABh2BwKgHYMCoBzYf9ZUtppJNIE/ZpqiAGAEAkBIAAAEBCAoATaXUAKNe2TANCg0KjNzvVgU4AwD3FQAA9xUAAGj3KB/SxQgAJ60eEwgARQAV6RhaQABABnzOwKgHYMCoBzYf9ZUrZzzY8fZqPJKAGAEcpcIAAAEBCAoATaXVAKNe2UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA1NDUyDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE0LTIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTWFpbiBBcHBsaWNhdGlvbiBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nOwoKICAgIC8vIGRlZmluZSBjb3JlIG1vZHVsZSBkZXBlbmRlbmNpZXMgaGVyZS4uLgogICAgdmFyIGNvcmVEZXBlbmRlbmNpZXMgPSBbCiAgICAgICAgJ25nUm91dGUnLAogICAgICAgICdvbm9zTWFzdCcsCiAgICAgICAgJ29ub3NOYXYnLAogICAgICAgICdvbm9zVXRpbCcsCiAgICAgICAgJ29ub3NTdmcnLAogICAgICAgICdvbm9zUmVtb3RlJywKICAgICAgICAnb25vc0xheWVyJywKICAgICAgICAnb25vc1dpZGdldCcKICAgIF07CgogICAgLy8gdmlldyBJRHMuLiBpbmplY3RlZCB2aWEgdGhlIHNlcnZsZXQKICAgIHZhciB2aWV3SWRzID0gWwogICAgICAgIAogICAgICAgICdhcHAnLAogICAgICAgICdzZXR0aW5ncycsCiAgICAgICAgJ2NsdXN0ZXInLAogICAgICAgICdwcm9jZXNzb3InLAogICAgICAgICd0b3BvJywKICAgICAgICAnZGV2aWNlJywKICAgICAgICAnZmxvdycsCiAgICAgICAgJ3BvcnQnLAogICAgICAgICdncm91cCcsCiAgICAgICAgJ21ldGVyJywKICAgICAgICAnbGluaycsCiAgICAgICAgJ2hvc3QnLAogICAgICAgICdpbnRlbnQnLAogICAgICAgICd0dW5uZWwnLAoKICAgICAgICAvLyBkdW1teSBlbnRyeQogICAgICAgICcnCiAgICBdOwoKICAgIC8vIHNlY3JldCBzYXVjZQogICAgdmFyIHNhdWNlID0gWwogICAgICAgICc2OjY5ODU3NjY2JywKICAgICAgICAnOTo4MjY5NzAnLAogICAgICAgICcyMjo4MDY5ODI4NjY3JywKICAgICAgICAnNjo2OTg1NzA2ODg2Njk4ODc5NjcnLAogICAgICAgICc3OjY5NzE4MDY4ODk4NDcxODYnLAogICAgICAgICcyMjo4MzY5ODY3NjgyJywKICAgICAgICAnMTM6NzM2NTgzJywKICAgICAgICAnNzo2NjcxODY2OTgzODQnLAogICAgICAgICcxOjg1Nzc4MDg4ODc3ODg3Njc4NycsCiAgICAgICAgJzIwOjcwNzE3MDY2JywKICAgICAgICAnMjQ6ODg2Nzc0ODY4NDY5JwogICAgXTsKCiAgICB2YXIgZGVmYXVsdFZpZXcgPSAndG9wbycsCiAgICAgICAgdmlld0RlcGVuZGVuY2llcyA9IFtdOwoKICAgIHZpZXdJZHMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsKICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgICAgdmlld0RlcGVuZGVuY2llcy5wdXNoKCdvdicgKyBjYXAoaWQpKTsKICAgICAgICB9CiAgICB9KTsKCiAgICB2YXIgbW9kdWxlRGVwZW5kZW5jaWVzID0gY29yZURlcGVuZGVuY2llcy5jb25jYXQodmlld0RlcGVuZGVuY2llcyk7CgogICAgZnVuY3Rpb24gc2F1Y3koZWUsIGtzKSB7CiAgICAgICAgdmFyIG1hcCA9IGVlLmdlbk1hcChzYXVjZSk7CiAgICAgICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgIGtzLmFkZFNlcShrLCBtYXBba10pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhcChzKSB7CiAgICAgICAgcmV0dXJuIHMgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogczsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc0FwcCcsIG1vZHVsZURlcGVuZGVuY2llcykKCiAgICAgICAgLmNvbnRyb2xsZXIoJ09ub3NDdHJsJywgWwogICAgICAgICAgICAnJGxvZycsICckc2NvcGUnLCAnJHJvdXRlJywgJyRyb3V0ZVBhcmFtcycsICckbG9jYXRpb24nLAogICAgICAgICAgICAnS2V5U2VydmljZScsICdUaGVtZVNlcnZpY2UnLCAnR2x5cGhTZXJ2aWNlJywgJ1ZlaWxTZXJ2aWNlJywKICAgICAgICAgICAgJ1BhbmVsU2VydmljZScsICdGbGFzaFNlcnZpY2UnLCAnUXVpY2tIZWxwU2VydmljZScsICdFZVNlcnZpY2UnLAogICAgICAgICAgICAnV2ViU29ja2V0U2VydmljZScsCgogICAgICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCAkc2NvcGUsICRyb3V0ZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICBrcywgdHMsIGdzLCB2cywgcHMsIGZsYXNoLCBxaHMsIGVlLCB3c3MpIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CgogICAgICAgICAgICAgICAgc2VsZi4kcm91dGUgPSAkcm91dGU7CiAgICAgICAgICAgICAgICBzZWxmLiRyb3V0ZVBhcmFtcyA9ICRyb3V0ZVBhcmFtczsKICAgICAgICAgICAgICAgIHNlbGYuJGxvY2F0aW9uID0gJGxvY2F0aW9uOwogICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gJzEuNS4wJzsKCiAgICAgICAgICAgICAgICAvLyBzaGFyZWQgb2JqZWN0IGluaGVyaXRlZCBieSBhbGwgdmlld3M6CiAgICAgICAgICAgICAgICAkc2NvcGUub25vcyA9IHt9OwoKICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgc2VydmljZXMuLi4KICAgICAgICAgICAgICAgIHRzLmluaXQoKTsKICAgICAgICAgICAgICAgIGtzLmluc3RhbGxPbihkMy5zZWxlY3QoJ2JvZHknKSk7CiAgICAgICAgICAgICAgICBrcy5iaW5kUWhzKHFocyk7CiAgICAgICAgICAgICAgICBncy5pbml0KCk7CiAgICAgICAgICAgICAgICB2cy5pbml0KCk7CiAgICAgICAgICAgICAgICBwcy5pbml0KCk7CiAgICAgICAgICAgICAgICBzYXVjeShlZSwga3MpOwogICAgICAgICAgICAgICAgZmxhc2guaW5pdEZsYXNoKCk7CiAgICAgICAgICAgICAgICBxaHMuaW5pdFF1aWNrSGVscCgpOwoKICAgICAgICAgICAgICAgIHdzcy5jcmVhdGVXZWJTb2NrZXQoewogICAgICAgICAgICAgICAgICAgIHdzcG9ydDogJGxvY2F0aW9uLnNlYXJjaCgpLndzcG9ydAogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJGxvZy5sb2coJ09ub3NDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKCiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdyb3V0ZTogJywgc2VsZi4kcm91dGUpOwogICAgICAgICAgICAgICAgJGxvZy5kZWJ1Zygncm91dGVQYXJhbXM6ICcsIHNlbGYuJHJvdXRlUGFyYW1zKTsKICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ2xvY2F0aW9uOiAnLCBzZWxmLiRsb2NhdGlvbik7CiAgICAgICAgICAgIH1dKQoKICAgICAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCBmdW5jdGlvbiAoJHJvdXRlUHJvdmlkZXIpIHsKICAgICAgICAgICAgLy8gSWYgdmlldyBJRCBub3QgcHJvdmlkZWQsIHJvdXRlIHRvIHRoZSBkZWZhdWx0IHZpZXcKICAgICAgICAgICAgJHJvdXRlUHJvdmlkZXIKICAgICAgICAgICAgICAgIC5vdGhlcndpc2UoewogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86ICcvJyArIGRlZmF1bHRWaWV3CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHZpZXdDdHJsTmFtZSh2aWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnT3YnICsgY2FwKHZpZCkgKyAnQ3RybCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHZpZXdUZW1wbGF0ZVVybCh2aWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnYXBwL3ZpZXcvJyArIHZpZCArICcvJyArIHZpZCArICcuaHRtbCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFkZCByb3V0ZXMgZm9yIGVhY2ggZGVmaW5lZCB2aWV3LgogICAgICAgICAgICB2aWV3SWRzLmZvckVhY2goZnVuY3Rpb24gKHZpZCkgewogICAgICAgICAgICAgICAgaWYgKHZpZCkgewogICAgICAgICAgICAgICAgICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy8nICsgdmlkLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdDdHJsTmFtZSh2aWQpLAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJywKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6IHZpZXdUZW1wbGF0ZVVybCh2aWQpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1dKQoKICAgICAgICAuZGlyZWN0aXZlKCdkZXRlY3RCcm93c2VyJywgWyckbG9nJywgJ0ZuU2VydmljZScsCiAgICAgICAgICAgIGZ1bmN0aW9uICgkbG9nLCBmcykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBib2R5ID0gZDMuc2VsZWN0KCdib2R5JyksCiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoZnMuaXNDaHJvbWUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyID0gJ2Nocm9tZSc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcy5pc1NhZmFyaSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgPSAnc2FmYXJpJzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZzLmlzRmlyZWZveCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIgPSAnZmlyZWZveCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJvZHkuY2xhc3NlZChicm93c2VyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzY29wZS5vbm9zLmJyb3dzZXIgPSBicm93c2VyOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZnMuaXNNb2JpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBib2R5LmNsYXNzZWQoJ21vYmlsZScsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5vbm9zLm1vYmlsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdEZXRlY3RlZCBicm93c2VyIGlzJywgZnMuY2FwKGJyb3dzZXIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwp9KCkpOwqM3O9WezkDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0cEtAAEAGOpLAqAc2wKgHYJUrH/X2ajySZzzupoAQAc2haAAAAQEICgCjXtoATaXVjNzvVnQ9AwC/AgAAvwIAAAgAJ60eE2j3KB/SxQgARQACscG0QABABuarwKgHNsCoB2CVLR/1T9mmqKaSTSWAGAF5YRcAAAEBCAoAo17aAE2l1EdFVCAvb25vcy91aS9hcHAvZGlyZWN0aXZlcy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WPkIDAMECAADBAgAACAAnrR4TaPcoH9LFCABFAAKzcExAAEAGOBLAqAc2wKgHYJUrH/X2ajySZzzupoAYAc2IzwAAAQEICgCjXtoATaXVR0VUIC9vbm9zL3VpL2FwcC9mdy91dGlsL3V0aWwuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVo9EAwCwAwAAsAMAAGj3KB/SxQgAJ60eEwgARQADohheQABABo8RwKgHYMCoBzYf9ZUrZzzupvZqPxGAGAEmk3sAAAEBCAoATaXWAKNe2khUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjJEQQ0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBVdGlsaXRpZXMgTW9kdWxlCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zVXRpbCcsIFtdKTsKCn0oKSk7Cg0KjNzvVkNFAwBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAORhfQABABpJ5wKgHYMCoBzYf9ZUrZzzyFPZqPxGAGAEmkBIAAAEBCAoATaXWAKNe2jANCg0KjNzvVpVKAwB7CgAAewoAAGj3KB/SxQgAJ60eEwgARQAKbY1YQABABhNMwKgHYMCoBzYf9ZUtppJNJU/ZqSWAGAEKmkYAAAEBCAoATaXWAKNe2khUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjlBNQ0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gR2VuZXJhbCBQdXJwb3NlIEFuZ3VsYXIgZGlyZWN0aXZlcyBkZWZpbmVkIGhlcmUuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc0FwcCcpCgogICAgICAgIC8vIENyZWF0ZSBhIHJlc2l6ZSBkaXJlY3RpdmUsIHRoYXQgd2UgY2FuIGFwcGx5IHRvIGVsZW1lbnRzCiAgICAgICAgLy8gc28gdGhhdCB0aGV5IGNhbiByZXNwb25kIHRvIHdpbmRvdyByZXNpemUgZXZlbnRzLgogICAgICAgIC5kaXJlY3RpdmUoJ3Jlc2l6ZScsIFsnJHdpbmRvdycsICdGblNlcnZpY2UnLCBmdW5jdGlvbiAoJHdpbmRvdywgZnMpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNjb3BlOiB7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0SGVpZ2h0OiAnQCcsCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0V2lkdGg6ICdAJywKICAgICAgICAgICAgICAgICAgICBub3RpZmllcjogJyYnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBkMy5zZWxlY3QoZWxlbWVudFswXSk7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiAkd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogJHdpbmRvdy5pbm5lcldpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2ZmSCA9IHNjb3BlLm9mZnNldEhlaWdodCB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmVyA9IHNjb3BlLm9mZnNldFdpZHRoIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3ogPSBmcy53aW5kb3dTaXplKG9mZkgsIG9mZlcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHdzei5oZWlnaHQgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdzei53aWR0aCArICdweCcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnMuaXNGKHNjb3BlLm5vdGlmaWVyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubm90aWZpZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoJHdpbmRvdykuYmluZCgncmVzaXplJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9XSkKCiAgICAgICAgLmRpcmVjdGl2ZSgnbmdSZXBlYXRDb21wbGV0ZScsIFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUpIHsKICAgICAgICAgICAgICAgIGlmIChzY29wZS4kbGFzdCkgewogICAgICAgICAgICAgICAgICAgIHNjb3BlLiRlbWl0KCduZ1JlcGVhdENvbXBsZXRlJyk7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGJyb2FkY2FzdCgnbmdSZXBlYXRDb21wbGV0ZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKDQqM3O9WEUwDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wbVAAEAG6SfAqAc2wKgHYJUtH/VP2aklppJXXoAQAaIzgAAAAQEICgCjXtsATaXWjNzvVuVMAwACCgAAAgoAAGj3KB/SxQgAJ60eEwgARQAJ9G7FQABABjJYwKgHYMCoBzYf9ZUscNfLeQUJvKCAGADsmc0AAAEBCAoATaXWAKNewkhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KQ29udGVudC1MZW5ndGg6IDIzOTgNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gRmxvdyBWaWV3IC0tIENTUyBmaWxlCiAqLwoKI292LWZsb3cgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtZmxvdyBkaXYuY3RybC1idG5zIHsKfQoKLmxpZ2h0ICNvdi1mbG93IC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1mbG93IC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6ICMzMDQ4NjA7Cn0KCi5saWdodCAjb3YtZmxvdyAuY3VycmVudC12aWV3IHJlY3QgewogICAgZmlsbDogZGVlcHNreWJsdWU7Cn0KLmRhcmsgI292LWZsb3cgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAxKSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDIpLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMykgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgNCksCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA1KSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2bikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAxKSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMiksCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDMpIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7Cn0KLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgNCksCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDUpLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KCi8qIGhpZ2hsaWdodGVkIGNvbG9yICovCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAxKS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDIpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMykuZGF0YS1jaGFuZ2UsCi5saWdodCAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA0KS5kYXRhLWNoYW5nZSwKLmxpZ2h0ICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDUpLmRhdGEtY2hhbmdlLAoubGlnaHQgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGRkRDOwp9Ci5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDEpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyAyKS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuICsgMykuZGF0YS1jaGFuZ2UsCi5kYXJrICNvdi1mbG93IHRyOm50aC1jaGlsZCg2biArIDQpLmRhdGEtY2hhbmdlLAouZGFyayAjb3YtZmxvdyB0cjpudGgtY2hpbGQoNm4gKyA1KS5kYXRhLWNoYW5nZSwKLmRhcmsgI292LWZsb3cgdHI6bnRoLWNoaWxkKDZuKS5kYXRhLWNoYW5nZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUE1NjAwOwp9Cgojb3YtZmxvdyB0ZCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI292LWZsb3cgdGQucmlnaHQgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KI292LWZsb3cgdGQuc2VsZWN0b3IsCiNvdi1mbG93IHRkLnRyZWF0bWVudCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgcGFkZGluZy1sZWZ0OiAzNnB4OwogICAgb3BhY2l0eTogMC42NTsKfYzc71YaTQMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTkikAAQAbGUsCoBzbAqAdglSwf9QUJvKBw19U5gBABDCNMAAABAQgKAKNe2wBNpdaM3O9Ww04DAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0cE1AAEAGOpDAqAc2wKgHYJUrH/X2aj8RZzzyGYAQAeSbXQAAAQEICgCjXtsATaXWjNzvVpBRAwC/AgAAvwIAAAgAJ60eE2j3KB/SxQgARQACsXBOQABABjgSwKgHNsCoB2CVKx/19mo/EWc88hmAGAHk/j8AAAEBCAoAo17bAE2l1kdFVCAvb25vcy91aS9hcHAvZncvdXRpbC9lZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WFFIDAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA07elAAEAGvPPAqAdgwKgHNh/1lSqTppOqxujwJoAQAP+QDQAAAQEICgBNpdcAo17RjNzvVr1WAwD3CQAA9wkAAGj3KB/SxQgAJ60eEwgARQAJ6RhgQABABojIwKgHYMCoBzYf9ZUrZzzyGfZqQY6AGAEwmcIAAAEBCAoATaXXAKNe20hUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjkyMQ0KLyoKICogIENvcHlyaWdodCAyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFV0aWwgLS0gRUUgZnVuY3Rpb25zCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHNlcnZpY2VzCiAgICB2YXIgJGxvZywgZnMsIGZsYXNoOwoKICAgIC8vIGZ1bmN0aW9uIHJlZmVyZW5jZXMKICAgIHZhciBmY2MgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwoKICAgIC8vIG1hZ2ljIGJlYW5zCiAgICB2YXIgYmVhbnMgPSBbCiAgICAgICAgJ3VtcHh3bndjdycsCiAgICAgICAgJ2V1ZmR2ZXhvYycsCiAgICAgICAgJ2VncGR5dGd2JywKICAgICAgICAneGNqdnRlJywKICAgICAgICAnYmd2ZXN0JywKICAgICAgICAnc2V2bHInLAogICAgICAgICdpYXMnCiAgICBdOwoKICAgIGZ1bmN0aW9uIHBpY2tCZWFuKCkgewogICAgICAgIHJldHVybiBiZWFuc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBiZWFucy5sZW5ndGgpXSArICcuZm9vJzsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wdXRlVHJhbnNmb3JtKHgpIHsKICAgICAgICB2YXIgbSA9IHguc3BsaXQoJzonKSwKICAgICAgICAgICAgaCA9IE51bWJlcihtWzBdKSwKICAgICAgICAgICAgZCA9IG1bMV0sCiAgICAgICAgICAgIG4gPSBkLmxlbmd0aCwKICAgICAgICAgICAgdyA9IFtdLAogICAgICAgICAgICBpOwoKICAgICAgICBmb3IgKGkgPSAwOyBpPG47IGkrPTIpCiAgICAgICAgICAgIHcucHVzaChmY2MoTnVtYmVyKGQuc2xpY2UoaSwgaSsyKSkpKTsKCiAgICAgICAgcmV0dXJuIGZzLmVlY29kZShoLCB3LmpvaW4oJycpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZW5NYXAoZGF0YSkgewogICAgICAgIHZhciBtYXAgPSB7fTsKCiAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgIHZhciByID0gY29tcHV0ZVRyYW5zZm9ybSh4KTsKICAgICAgICAgICAgbWFwW3IuZV0gPSByLm8udG9Mb3dlckNhc2UoKSArICcuZm9vJzsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbWFwOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsdWNrKGZvbykgewogICAgICAgIHZhciBmID0gZnMuaXNGKGZvbyksCiAgICAgICAgICAgIHMgPSBmcy5pc1MoZm9vKTsKCiAgICAgICAgJGxvZy5kZWJ1ZygnPj4+IENMVUNLISA8PDwnLCBmb28pOwoKICAgICAgICBpZiAocyA9PT0gJ2ZnZmIuZm9vJykgewogICAgICAgICAgICBzID0gcGlja0JlYW4oKTsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygnYmVhbiBwaWNrZWQ6Jywgcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAocyAmJiBmcy5lbmRzV2l0aChzLCAnLmZvbycpKSB7CiAgICAgICAgICAgIGZsYXNoLnRlbXBEaXYoKS5hcHBlbmQoJ2ltZycpLmF0dHIoJ3NyYycsICdyYXcvJytzKTsKICAgICAg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CiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVXRpbCAtLSBHZW5lcmFsIFB1cnBvc2UgRnVuY3Rpb25zCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHNlcnZpY2VzCiAgICB2YXIgJHdpbmRvdywgJGxvZzsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIGRlYnVnRmxhZ3MgPSB7fTsKCiAgICAvLyBmdW5jdGlvbiByZWZlcmVuY2VzCiAgICB2YXIgZmNjID0gU3RyaW5nLmZyb21DaGFyQ29kZSwKICAgICAgICBjY2EgPSBTdHJpbmcucHJvdG90eXBlLmNoYXJDb2RlQXQ7CgogICAgZnVuY3Rpb24gX3BhcnNlRGVidWdGbGFncyhkYmdzdHIpIHsKICAgICAgICB2YXIgYml0cyA9IGRiZ3N0ciA/IGRiZ3N0ci5zcGxpdCgiLCIpIDogW107CiAgICAgICAgYml0cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgZGVidWdGbGFnc1trZXldID0gdHJ1ZTsKICAgICAgICB9KTsKICAgICAgICAkbG9nLmRlYnVnKCdEZWJ1ZyBmbGFnczonLCBkYmdzdHIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzRihmKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBmID09PSAnZnVuY3Rpb24nID8gZiA6IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gaXNBKGEpIHsKICAgICAgICAvLyBOT1RFOiBBcnJheS5pc0FycmF5KCkgaXMgcGFydCBvZiBFTUNBU2NyaXB0IDUuMQogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGEpID8gYSA6IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gaXNTKHMpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gaXNPKG8pIHsKICAgICAgICByZXR1cm4gKG8gJiYgdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG8uY29uc3RydWN0b3IgPT09IE9iamVjdCkgPyBvIDogbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250YWlucyhhLCB4KSB7CiAgICAgICAgcmV0dXJuIGlzQShhKSAmJiBhLmluZGV4T2YoeCkgPiAtMTsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIG5hbWVzIGluIHRoZSBhcnJheSBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMKICAgIC8vIG9uIHRoZSBnaXZlbiBhcGkgb2JqZWN0OyBmYWxzZSBvdGhlcndpc2UuCiAgICAvLyBBbHNvIHJldHVybnMgZmFsc2UgaWYgdGhlcmUgYXJlIHByb3BlcnRpZXMgb24gdGhlIGFwaSB0aGF0IGFyZSBOT1QKICAgIC8vICBsaXN0ZWQgaW4gdGhlIGFycmF5IG9mIG5hbWVzLgogICAgZnVuY3Rpb24gYXJlRnVuY3Rpb25zKGFwaSwgZm5OYW1lcykgewogICAgICAgIHZhciBmbkxvb2t1cCA9IHt9LAogICAgICAgICAgICBleHRyYUZvdW5kID0gZmFsc2U7CgogICAgICAgIGlmICghaXNBKGZuTmFtZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIG4gPSBmbk5hbWVzLmxlbmd0aCwKICAgICAgICAgICAgaSwgbmFtZTsKICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKICAgICAgICAgICAgbmFtZSA9IGZuTmFtZXNbaV07CiAgICAgICAgICAgIGlmICghaXNGKGFwaVtuYW1lXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmbkxvb2t1cFtuYW1lXSA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayBmb3IgcHJvcGVydGllcyBvbiB0aGUgQVBJIHRoYXQgYXJlIG5vdCBsaXN0ZWQgaW4gdGhlIGFycmF5LAogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChhcGksIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgIGlmICghZm5Mb29rdXBba2V5XSkgewogICAgICAgICAgICAgICAgZXh0cmFGb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gIWV4dHJhRm91bmQ7CiAgICB9CgogICAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBuYW1lcyBpbiB0aGUgYXJyYXkgYXJlIGRlZmluZWQgYXMgZnVuY3Rpb25zCiAgICAvLyBvbiB0aGUgZ2l2ZW4gYXBpIG9iamVjdDsgZmFsc2Ugb3RoZXJ3aXNlLiBUaGlzIGlzIGEgbm9uLXN0cmljdCB2ZXJzaW9uCiAgICAvLyB0aGF0IGRvZXMgbm90IGNhcmUgYWJvdXQgb3RoZXIgcHJvcGVydGllcyBvbiB0aGUgYXBpLgogICAgZnVuY3Rpb24gYXJlRnVuY3Rpb25zTm9uU3RyaWN0KGFwaSwgZm5OYW1lcykgewogICAgICAgIGlmICghaXNBKGZuTmFtZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIG4gPSBmbk5hbWVzLmxlbmd0aCwKICAgICAgICAgICAgaSwgbmFtZTsKICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKICAgICAgICAgICAgbmFtZSA9IGZuTmFtZXNbaV07CiAgICAgICAgICAgIGlmICghaXNGKGFwaVtuYW1lXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHdpZHRoIGFuZCBoZWlnaHQgb2Ygd2luZG93IGlubmVyIGRpbWVuc2lvbnMuCiAgICAvLyBvZmZILCBvZmZXIDogb2Zmc2V0IHdpZHRoL2hlaWdodCBhcmUgc3VidHJhY3RlZCwgaWYgcHJlc2VudAogICAgZnVuY3Rpb24gd2luZG93U2l6ZShvZmZILCBvZmZXKSB7CiAgICAgICAgdmFyIG9oID0gb2ZmSCB8fCAwLAogICAgICAgICAgICBvdyA9IG9mZlcgfHwgMDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBoZWlnaHQ6ICR3aW5kb3cuaW5uZXJIZWlnaHQgLSBvaCwKICAgICAgICAgICAgd2lkdGg6ICR3aW5kb3cuaW5uZXJXaWR0aCAtIG93CiAgICAgICAgfTsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgY3VycmVudCBicm93c2VyIGRldGVybWluZWQgdG8gYmUgYSBtb2JpbGUgZGV2aWNlCiAgICBmdW5jdGlvbiBpc01vYmlsZSgpIHsKICAgICAgICB2YXIgdWEgPSAkd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsCiAgICAgICAgICAgIHBhdHQgPSAvaVBob25lfGlQb2R8aVBhZHxTaWxrfEFuZHJvaWR8QmxhY2tCZXJyeXxPcGVyYSBNaW5pfElFTW9iaWxlLzsKICAgICAgICByZXR1cm4gcGF0dC50ZXN0KHVhKTsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkZXRlcm1pbmVkIHRvIGJlIENocm9tZQogICAgZnVuY3Rpb24gaXNDaHJvbWUoKSB7CiAgICAgICAgdmFyIGlzQ2hyb21pdW0gPSAkd2luZG93LmNocm9tZSwKICAgICAgICAgICAgdmVuZG9yTmFtZSA9ICR3aW5kb3cubmF2aWdhdG9yLnZlbmRvciwKICAgICAgICAgICAgaXNPcGVyYSA9ICR3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPUFIiKSA+IC0xOwogICAgICAgIHJldHVybiAoaXNDaHJvbWl1bSAhPT0gbnVsbCAmJgogICAgICAgIGlzQ2hyb21pdW0gIT09IHVuZGVmaW5lZCAmJgogICAgICAgIHZlbmRvck5hbWUgPT09ICJHb29nbGUgSW5jLiIgJiYKICAgICAgICBpc09wZXJhID09IGZhbHNlKTsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkZXRlcm1pbmVkIHRvIGJlIFNhZmFyaQogICAgZnVuY3Rpb24gaXNTYWZhcmkoKSB7CiAgICAgICAgcmV0dXJuICgkd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignU2FmYXJpJykgIT09IC0xICYmCiAgICAgICAgJHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID09PSAtMSk7CiAgICB9CgogICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGJyb3dzZXIgZGV0ZXJtaW5lZCB0byBiZSBGaXJlZm94CiAgICBmdW5jdGlvbiBpc0ZpcmVmb3goKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCc7CiAgICB9CgogICAgLy8gc2VhcmNoIHRocm91Z2ggYW4gYXJyYXkgb2Ygb2JqZWN0cywgbG9va2luZyBmb3IgdGhlIG9uZSB3aXRoIHRoZQogICAgLy8gdGFnZ2VkIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkuIHRhZyBkZWZhdWx0cyB0byAnaWQnLgogICAgLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoaW5nIG9iamVjdCwgb3IgLTEgZm9yIG5vIG1hdGNoLgogICAgZnVuY3Rpb24gZmluZChrZXksIGFycmF5LCB0YWcpIHsKICAgICAgICB2YXIgX3RhZyA9IHRhZyB8fCAnaWQnLAogICAgICAgICAgICBpZHgsIG4sIGQ7CiAgICAgICAgZm9yIChpZHggPSAwLCBuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBuOyBpZHgrKykgewogICAgICAgICAgICBkID0gYXJyYXlbaWR4XTsKICAgICAgICAgICAgaWYgKGRbX3RhZ10gPT09IGtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlkeDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLy8gc2VhcmNoIHRocm91Z2ggYXJyYXkgdG8gZmluZCAodGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YpIGl0ZW0sCiAgICAvLyByZXR1cm5pbmcgaXRzIGluZGV4IGlmIGZvdW5kOyBvdGhlcndpc2UgcmV0dXJuaW5nIC0xLgogICAgZnVuY3Rpb24gaW5BcnJheShpdGVtLCBhcnJheSkgewogICAgICAgIHZhciBpOwogICAgICAgIGlmIChpc0EoYXJyYXkpKSB7CiAgICAgICAgICAgIGZvciAoaT0wOyBpPGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLy8gcmVtb3ZlICh0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZikgdGhlIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIGdpdmVuCiAgICAvLyBhcnJheSwgaWYgYW55LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVtb3ZhbCB3YXMgbWFkZTsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5KGl0ZW0sIGFycmF5KSB7CiAgICAgICAgdmFyIGZvdW5kID0gZmFsc2UsCiAgICAgICAgICAgIGkgPSBpbkFycmF5KGl0ZW0sIGFycmF5KTsKICAgICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZm91bmQ7CiAgICB9CgogICAgLy8gcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBlbXB0eSwgcmV0dXJuIGZhbHNlIG90aGVyd2lzZQogICAgZnVuY3Rpb24gaXNFbXB0eU9iamVjdChvYmopIHsKICAgICAgICB2YXIga2V5OwogICAgICAgIGZvciAoa2V5IGluIG9iaikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgaGF2ZSBhbGwgdGhlIHNhbWUgcHJvcGVydGllcwogICAgZnVuY3Rpb24gc2FtZU9ialByb3BzKG9iajEsIG9iajIpIHsKICAgICAgICB2YXIga2V5OwogICAgICAgIGZvciAoa2V5IGluIG9iajEpIHsKICAgICAgICAgICAgaWYgKG9iajEuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgaWYgKCEob2JqMVtrZXldID09PSBvYmoyW2tleV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJyYXkgY29udGFpbnMgdGhlIG9iamVjdAogICAgLy8gZG9lcyBOT1QgdXNlIHN0cmljdCBvYmplY3QgcmVmZXJlbmNlIGVxdWFsaXR5LAogICAgICAgIC8vIGluc3RlYWQgY2hlY2tzIGVhY2ggcHJvcGVydHkgaW5kaXZpZHVhbGx5IGZvciBlcXVhbGl0eQogICAgZnVuY3Rpb24gY29udGFpbnNPYmooYXJyLCBvYmopIHsKICAgICAgICB2YXIgaSwKICAgICAgICAgICAgbGVuID0gYXJyLmxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKHNhbWVPYmpQcm9wcyhhcnJbaV0sIG9iaikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyByZXR1cm4gdGhlIGdpdmVuIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWQuCiAgICBmdW5jdGlvbiBjYXAocykgewogICAgICAgIHJldHVybiBzID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHM7CiAgICB9CgogICAgLy8gcmV0dXJuIGVuY29kaW5nIHN0cnVjdHVyZSBmb3IgZ2l2ZW4gcGFyYW1ldGVycwogICAgZnVuY3Rpb24gZWVjb2RlKGgsIHcpIHsKICAgICAgICB2YXIgbSA9IDY1LAogICAgICAgICAgICB4ID0gOTAsCiAgICAgICAgICAgIGQgPSB4IC0gbSArIDEsCiAgICAgICAgICAgIHMgPSB4ICsgbSwKICAgICAgICAgICAgbyA9IFtdLAogICAgICAgICAgICBuLCBpLCBjLCCM3O9WnmMDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05IxAAEAGxlDAqAc2wKgHYJUsH/UFCb8dcNfxgYAQAX0EEwAAAQEICgCjXtwATaXYjNzvVk1kAwDGFAAAxhQAAGj3KB/SxQgAJ60eEwgARQAUuG7NQABABieMwKgHYMCoBzYf9ZUscNfxgQUJvx2AGAD2pJEAAAEBCAoATaXYAKNe3GU7CgogICAgICAgIGZvciAoaSA9IDAsIG4gPSB3Lmxlbmd0aDsgaTxuOyBpKyspIHsKICAgICAgICAgICAgYyA9IGNjYS5jYWxsKHcsIGkpOwogICAgICAgICAgICBlID0gcyAtIGMgKyBoOwogICAgICAgICAgICBlID0gZSA+IHggPyBlIC0gZCA6IGU7CiAgICAgICAgICAgIG8ucHVzaChlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbzogdywKICAgICAgICAgICAgZDogby5qb2luKCcnKSwKICAgICAgICAgICAgZTogZmNjLmFwcGx5KG8sIG8pCiAgICAgICAgfTsKICAgIH0KCiAgICAvLyByZXR1cm4gdGhlIHBhcmFtZXRlciB3aXRob3V0IGEgcHggc3VmZml4CiAgICBmdW5jdGlvbiBub1B4KG51bSkgewogICAgICAgIHJldHVybiBOdW1iZXIobnVtLnJlcGxhY2UoL3B4JC8sICcnKSk7CiAgICB9CgogICAgLy8gcmV0dXJuIGFuIGVsZW1lbnQncyBnaXZlbiBzdHlsZSBwcm9wZXJ0eSB3aXRob3V0IHB4IHN1ZmZpeAogICAgZnVuY3Rpb24gbm9QeFN0eWxlKGVsZW0sIHByb3ApIHsKICAgICAgICByZXR1cm4gTnVtYmVyKGVsZW0uc3R5bGUocHJvcCkucmVwbGFjZSgvcHgkLywgJycpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkgewogICAgICAgIHJldHVybiBzdHIuaW5kZXhPZihzdWZmaXgsIHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VCaXRSYXRlKHN0cikgewogICAgICAgIHJldHVybiBOdW1iZXIoc3RyLnJlcGxhY2UoLywvLCAnJykKICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xzKy5icHMvaSwgJycpCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cLlxkKi8sICcnKSk7CiAgICB9CgogICAgLy8gcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRlYnVnIGZsYWcgd2FzIHNwZWNpZmllZCBpbiB0aGUgcXVlcnkgcGFyYW1zCiAgICBmdW5jdGlvbiBkZWJ1Z09uKHRhZykgewogICAgICAgIHJldHVybiBkZWJ1Z0ZsYWdzW3RhZ107CiAgICB9CgogICAgLy8gb3V0cHV0IGRlYnVnIG1lc3NhZ2UgdG8gY29uc29sZSwgaWYgZGVidWcgdGFnIHNldC4uLgogICAgLy8gZS5nLiBmcy5kZWJ1ZygnbXl0YWcnLCBhcmcxLCBhcmcyLCAuLi4pCiAgICBmdW5jdGlvbiBkZWJ1Zyh0YWcpIHsKICAgICAgICB2YXIgYXJnczsKICAgICAgICBpZiAoZGVidWdPbih0YWcpKSB7CiAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQoJ1snK3RhZysnXScpOwogICAgICAgICAgICAkbG9nLmRlYnVnLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB0cmllIG9wZXJhdGlvbgogICAgZnVuY3Rpb24gX3RyaWVPcChvcCwgdHJpZSwgd29yZCwgZGF0YSkgewogICAgICAgIHZhciBwID0gdHJpZSwKICAgICAgICAgICAgdyA9IHdvcmQudG9VcHBlckNhc2UoKSwKICAgICAgICAgICAgcyA9IHcuc3BsaXQoJycpLAogICAgICAgICAgICBjID0geyBwOiBwLCBzOiBzIH0sCiAgICAgICAgICAgIHQgPSBbXSwKICAgICAgICAgICAgeCA9IDAsCiAgICAgICAgICAgIGYxID0gb3AgPT09ICcrJyA/IGFkZCA6IHByb2JlLAogICAgICAgICAgICBmMiA9IG9wID09PSAnKycgPyBpbnNlcnQgOiByZW1vdmU7CgogICAgICAgIGZ1bmN0aW9uIGFkZChjKSB7CiAgICAgICAgICAgIHZhciBxID0gYy5zLnNoaWZ0KCksCiAgICAgICAgICAgICAgICBucCA9IGMucFtxXTsKCiAgICAgICAgICAgIGlmICghbnApIHsKICAgICAgICAgICAgICAgIGMucFtxXSA9IHt9OwogICAgICAgICAgICAgICAgbnAgPSBjLnBbcV07CiAgICAgICAgICAgICAgICB4ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwOiBucCwgczogYy5zIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHByb2JlKGMpIHsKICAgICAgICAgICAgdmFyIHEgPSBjLnMuc2hpZnQoKSwKICAgICAgICAgICAgICAgIGsgPSBPYmplY3Qua2V5cyhjLnApLmxlbmd0aCwKICAgICAgICAgICAgICAgIG5wID0gYy5wW3FdOwoKICAgICAgICAgICAgdC5wdXNoKHsgcTpxLCBrOmssIHA6Yy5wIH0pOwogICAgICAgICAgICBpZiAoIW5wKSB7CiAgICAgICAgICAgICAgICB0ID0gW107CiAgICAgICAgICAgICAgICByZXR1cm4geyBzOiBbXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHA6IG5wLCBzOiBjLnMgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW5zZXJ0KCkgewogICAgICAgICAgICBjLnAuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICByZXR1cm4geCA/ICdhZGRlZCcgOiAndXBkYXRlZCc7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgICAgICAgIGlmICh0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgdCA9IHQucmV2ZXJzZSgpOwogICAgICAgICAgICAgICAgd2hpbGUgKHQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYyA9IHQuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgYy5wW2MucV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGMuayA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAncmVtb3ZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdhYnNlbnQnOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKGMucy5sZW5ndGgpIHsKICAgICAgICAgICAgYyA9IGYxKGMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZjIoKTsKICAgIH0KCiAgICAvLyBhZGQgd29yZCB0byB0cmllICh3b3JkIHdpbGwgYmUgY29udmVydGVkIHRvIHVwcGVyY2FzZSkKICAgIC8vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB3b3JkCiAgICAvLyByZXR1cm5zICdhZGRlZCcgb3IgJ3VwZGF0ZWQnCiAgICBmdW5jdGlvbiBhZGRUb1RyaWUodHJpZSwgd29yZCwgZGF0YSkgewogICAgICAgIHJldHVybiBfdHJpZU9wKCcrJywgdHJpZSwgd29yZCwgZGF0YSk7CiAgICB9CgogICAgLy8gcmVtb3ZlIHdvcmQgZnJvbSB0cmllICh3b3JkIHdpbGwgYmUgY29udmVydGVkIHRvIHVwcGVyY2FzZSkKICAgIC8vIHJldHVybnMgJ3JlbW92ZWQnIG9yICdhYnNlbnQnCiAgICBmdW5jdGlvbiByZW1vdmVGcm9tVHJpZSh0cmllLCB3b3JkKSB7CiAgICAgICAgcmV0dXJuIF90cmllT3AoJy0nLCB0cmllLCB3b3JkKTsKICAgIH0KCiAgICAvLyBsb29rdXAgd29yZCAoY29udmVydGVkIHRvIHVwcGVyY2FzZSkgaW4gdHJpZQogICAgLy8gcmV0dXJuczoKICAgIC8vICAgIHVuZGVmaW5lZCBpZiB0aGUgd29yZCBpcyBub3QgaW4gdGhlIHRyaWUKICAgIC8vICAgIC0xIGZvciBhIHBhcnRpYWwgbWF0Y2ggKHdvcmQgaXMgYSBwcmVmaXggdG8gYW4gZXhpc3Rpbmcgd29yZCkKICAgIC8vICAgIGRhdGEgZm9yIHRoZSB3b3JkIGZvciBhbiBleGFjdCBtYXRjaAogICAgZnVuY3Rpb24gdHJpZUxvb2t1cCh0cmllLCB3b3JkKSB7CiAgICAgICAgdmFyIHMgPSB3b3JkLnRvVXBwZXJDYXNlKCkuc3BsaXQoJycpLAogICAgICAgICAgICBwID0gdHJpZSwKICAgICAgICAgICAgbjsKCiAgICAgICAgd2hpbGUgKHMubGVuZ3RoKSB7CiAgICAgICAgICAgIG4gPSBzLnNoaWZ0KCk7CiAgICAgICAgICAgIHAgPSBwW25dOwogICAgICAgICAgICBpZiAoIXApIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHAuX2RhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHAuX2RhdGE7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KCgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NVdGlsJykKICAgICAgICAuZmFjdG9yeSgnRm5TZXJ2aWNlJywKICAgICAgICBbJyR3aW5kb3cnLCAnJGxvY2F0aW9uJywgJyRsb2cnLCBmdW5jdGlvbiAoXyR3aW5kb3dfLCAkbG9jLCBfJGxvZ18pIHsKICAgICAgICAgICAgJHdpbmRvdyA9IF8kd2luZG93XzsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKCiAgICAgICAgICAgIF9wYXJzZURlYnVnRmxhZ3MoJGxvYy5zZWFyY2goKS5kZWJ1Zyk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaXNGOiBpc0YsCiAgICAgICAgICAgICAgICBpc0E6IGlzQSwKICAgICAgICAgICAgICAgIGlzUzogaXNTLAogICAgICAgICAgICAgICAgaXNPOiBpc08sCiAgICAgICAgICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgICAgICAgICBhcmVGdW5jdGlvbnM6IGFyZUZ1bmN0aW9ucywKICAgICAgICAgICAgICAgIGFyZUZ1bmN0aW9uc05vblN0cmljdDogYXJlRnVuY3Rpb25zTm9uU3RyaWN0LAogICAgICAgICAgICAgICAgd2luZG93U2l6ZTogd2luZG93U2l6ZSwKICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBpc01vYmlsZSwKICAgICAgICAgICAgICAgIGlzQ2hyb21lOiBpc0Nocm9tZSwKICAgICAgICAgICAgICAgIGlzU2FmYXJpOiBpc1NhZmFyaSwKICAgICAgICAgICAgICAgIGlzRmlyZWZveDogaXNGaXJlZm94LAogICAgICAgICAgICAgICAgZGVidWdPbjogZGVidWdPbiwKICAgICAgICAgICAgICAgIGRlYnVnOiBkZWJ1ZywKICAgICAgICAgICAgICAgIGZpbmQ6IGZpbmQsCiAgICAgICAgICAgICAgICBpbkFycmF5OiBpbkFycmF5LAogICAgICAgICAgICAgICAgcmVtb3ZlRnJvbUFycmF5OiByZW1vdmVGcm9tQXJyYXksCiAgICAgICAgICAgICAgICBpc0VtcHR5T2JqZWN0OiBpc0VtcHR5T2JqZWN0LAogICAgICAgICAgICAgICAgc2FtZU9ialByb3BzOiBzYW1lT2JqUHJvcHMsCiAgICAgICAgICAgICAgICBjb250YWluc09iajogY29udGFpbnNPYmosCiAgICAgICAgICAgICAgICBjYXA6IGNhcCwKICAgICAgICAgICAgICAgIGVlY29kZTogZWVjb2RlLAogICAgICAgICAgICAgICAgbm9QeDogbm9QeCwKICAgICAgICAgICAgICAgIG5vUHhTdHlsZTogbm9QeFN0eWxlLAogICAgICAgICAgICAgICAgZW5kc1dpdGg6IGVuZHNXaXRoLAogICAgICAgICAgICAgICAgcGFyc2VCaXRSYXRlOiBwYXJzZUJpdFJhdGUsCiAgICAgICAgICAgICAgICBhZGRUb1RyaWU6IGFkZFRvVHJpZSwKICAgICAgICAgICAgICAgIHJlbW92ZUZyb21UcmllOiByZW1vdmVGcm9tVHJpZSwKICAgICAgICAgICAgICAgIHRyaWVMb29rdXA6IHRyaWVMb29rdXAKICAgICAgICAgICAgfTsKICAgIH1dKTsKCn0oKSk7Cg0KjNzvVn1lAwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOSNQABABsZPwKgHNsCoB2CVLB/1BQm/HXDYBgWAEAHP7zwAAAEBCAoAo17cAE2l2Izc71YOZwMARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADlu0UAAQAY8B8CoB2DAqAc2H/WVLHDYBgUFCb8dgBgA9pASAAABAQgKAE2l2ACjXtwwDQoNCozc71byaAMAwwIAAMMCAAAIACetHhNo9ygf0sUIAEUAArVwUEAAQAY4DMCoBzbAqAdglSsf9fZqQY5nPPvTgBgCCyPwAAABAQgKAKNe3QBNpddHRVQgL29ub3MvdWkvYXBwL2Z3L3V0aWwvcmFuZG9tLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZCbgMAlwYAAJcGAABo9ygf0sUIACetHhMIAEUABokYY0AAQAaMJcCoB2DAqAc2H/WVK2c8+9P2akQPgBgBOpZiAAABAQgKAE2l2ACjXt1IVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo1QzENCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUmFuZG9tIC0tIEVuY2Fwc3VsYXRlZCByYW5kb21uZXNzCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciAkbG9nLCBmczsKCiAgICB2YXIgaGFsZlJvb3QyID0gMC43MDcxOwoKICAgIC8vIGdpdmVuIHNvbWUgdmFsdWUsIHMsIHJldHVybnMgYW4gaW50ZWdlciBiZXR3ZWVuIC1zLzIgYW5kIHMvMgogICAgLy8gZS5nLiBzID0gMTAwOyByZXN1bHQgaW4gdGhlIHJhbmdlIFstNTAuLjUwKQogICAgZnVuY3Rpb24gc3ByZWFkKHMpIHsKICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIHMpIC0gcyAvIDIpOwogICAgfQoKICAgIC8vIGZvciBhIGdpdmVuIGRpbWVuc2lvbiwgZCwgY2hvb3NlIGEgcmFuZG9t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ZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBMaW5rIFZpZXcgLS0gQ1NTIGZpbGUKICovCgojb3YtbGluayBoMiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNvdi1saW5rIGRpdi5jdHJsLWJ0bnMgewogICAgd2lkdGg6IDQ1cHg7Cn2M3O9W83wDAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5GGVAAEAGknPAqAdgwKgHNh/1lStnPQIo9mpED4AYATqQEgAAAQEICgBNpdkAo17dMA0KDQqM3O9WcIADAMECAADBAgAACAAnrR4TaPcoH9LFCABFAAKzcFJAAEAGOAzAqAc2wKgHYJUrH/X2akQPZz0CLYAYAiR1ZgAAAQEICgCjXt4ATaXZR0VUIC9vbm9zL3VpL2FwcC9mdy91dGlsL2tleXMuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVkeBAwDCAgAAwgIAAAgAJ60eE2j3KB/SxQgARQACtLfiQABABvB6wKgHNsCoB2CVKh/1xujwJpOmlvCAGAIo6IoAAAEBCAoAo17eAE2l2UdFVCAvb25vcy91aS9hcHAvZncvdXRpbC9wcmVmcy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WkIEDAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA07etAAEAGvPHAqAdgwKgHNh/1lSqTppbwxujypoAQAQmQDQAAAQEICgBNpdoAo17ejNzvVtGFAwBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNSxQABABnYDwKgHYMCoBzYf9ZUiQb6UgFh6fNOAEAFT8DUAAAEBCAoATaXaAKNe0TdGRTgNCiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIGRldmVsb3BpbmcgdGhpbmdzIGxpa2UgR29vZ2xlIENocm9tZSBFeHRlbnNpb25zIG9yIFVuaXZlcnNhbCBXaW5kb3dzIEFwcHMuCiAqCiAqIENTUCBmb3JiaWRzIGFwcHMgdG8gdXNlIGBldmFsYCBvciBgRnVuY3Rpb24oc3RyaW5nKWAgZ2VuZXJhdGVkIGZ1bmN0aW9ucyAoYW1vbmcgb3RoZXIgdGhpbmdzKS4KICogRm9yIEFuZ3VsYXIgdG8gYmUgQ1NQIGNvbXBhdGlibGUgdGhlcmUgYXJlIG9ubHkgdHdvIHRoaW5ncyB0aGF0IHdlIG5lZWQgdG8gZG8gZGlmZmVyZW50bHk6CiAqCiAqIC0gZG9uJ3QgdXNlIGBGdW5jdGlvbmAgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgb3B0aW1pemVkIHZhbHVlIGdldHRlcnMKICogLSBkb24ndCBpbmplY3QgY3VzdG9tIHN0eWxlc2hlZXQgaW50byB0aGUgZG9jdW1lbnQKICoKICogQW5ndWxhckpTIHVzZXMgYEZ1bmN0aW9uKHN0cmluZylgIGdlbmVyYXRlZCBmdW5jdGlvbnMgYXMgYSBzcGVlZCBvcHRpbWl6YXRpb24uIEFwcGx5aW5nIHRoZSBgbmdDc3BgCiAqIGRpcmVjdGl2ZSB3aWxsIGNhdXNlIEFuZ3VsYXIgdG8gdXNlIENTUCBjb21wYXRpYmlsaXR5IG1vZGUuIFdoZW4gdGhpcyBtb2RlIGlzIG9uIEFuZ3VsYXJKUyB3aWxsCiAqIGV2YWx1YXRlIGFsbCBleHByZXNzaW9ucyB1cCB0byAzMCUgc2xvd2VyIHRoYW4gaW4gbm9uLUNTUCBtb2RlLCBidXQgbm8gc2VjdXJpdHkgdmlvbGF0aW9ucyB3aWxsCiAqIGJlIHJhaXNlZC4KICoKICogQ1NQIGZvcmJpZHMgSmF2YVNjcmlwdCB0byBpbmxpbmUgc3R5bGVzaGVldCBydWxlcy4gSW4gbm9uIENTUCBtb2RlIEFuZ3VsYXIgYXV0b21hdGljYWxseQogKiBpbmNsdWRlcyBzb21lIENTUyBydWxlcyAoZS5nLiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xvYWsgbmdDbG9ha30pLgogKiBUbyBtYWtlIHRob3NlIGRpcmVjdGl2ZXMgd29yayBpbiBDU1AgbW9kZSwgaW5jbHVkZSB0aGUgYGFuZ3VsYXItY3NwLmNzc2AgbWFudWFsbHkuCiAqCiAqIEFuZ3VsYXIgdHJpZXMgdG8gYXV0b2RldGVjdCBpZiBDU1AgaXMgYWN0aXZlIGFuZCBhdXRvbWF0aWNhbGx5IHR1cm4gb24gdGhlIENTUC1zYWZlIG1vZGUuIFRoaXMKICogYXV0b2RldGVjdGlvbiBob3dldmVyIHRyaWdnZXJzIGEgQ1NQIGVycm9yIHRvIGJlIGxvZ2dlZCBpbiB0aGUgY29uc29sZToKICoKICogYGBgCiAqIFJlZnVzZWQgdG8gZXZhbHVhdGUgYSBzdHJpbmcgYXMgSmF2YVNjcmlwdCBiZWNhdXNlICd1bnNhZmUtZXZhbCcgaXMgbm90IGFuIGFsbG93ZWQgc291cmNlIG9mCiAqIHNjcmlwdCBpbiB0aGUgZm9sbG93aW5nIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGRpcmVjdGl2ZTogImRlZmF1bHQtc3JjICdzZWxmJyIuIE5vdGUgdGhhdAogKiAnc2NyaXB0LXNyYycgd2FzIG5vdCBleHBsaWNpdGx5IHNldCwgc28gJ2RlZmF1bHQtc3JjJyBpcyB1c2VkIGFzIGEgZmFsbGJhY2suCiAqIGBgYAogKgogKiBUaGlzIGVycm9yIGlzIGhhcm1sZXNzIGJ1dCBhbm5veWluZy4gVG8gcHJldmVudCB0aGUgZXJyb3IgZnJvbSBzaG93aW5nIHVwLCBwdXQgdGhlIGBuZ0NzcGAKICogZGlyZWN0aXZlIG9uIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIG9yIG9uIHRoZSBgYW5ndWxhci5qc2Agc2NyaXB0IHRhZywgd2hpY2hldmVyCiAqIGFwcGVhcnMgZmlyc3QgaW4gdGhlIGh0bWwgZG9jdW1lbnQuCiAqCiAqICpOb3RlOiBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgYG5nLWNzcGAgYW5kIGBkYXRhLW5nLWNzcGAgYXR0cmlidXRlIGZvcm0uKgogKgogKiBAZXhhbXBsZQogKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFwcGx5IHRoZSBgbmdDc3BgIGRpcmVjdGl2ZSB0byB0aGUgYGh0bWxgIHRhZy4KICAgYGBgaHRtbAogICAgIDwhZG9jdHlwZSBodG1sPgogICAgIDxodG1sIG5nLWFwcCBuZy1jc3A+CiAgICAgLi4uCiAgICAgLi4uCiAgICAgPC9odG1sPgogICBgYGAKICAqIEBleGFtcGxlCiAgICAgIC8vIE5vdGU6IHRoZSBzdWZmaXggYC5jc3BgIGluIHRoZSBleGFtcGxlIG5hbWUgdHJpZ2dlcnMKICAgICAgLy8gY3NwIG1vZGUgaW4gb3VyIGh0dHAgc2VydmVyIQogICAgICA8ZXhhbXBsZSBuYW1lPSJleGFtcGxlLmNzcCIgbW9kdWxlPSJjc3BFeGFtcGxlIiBuZy1jc3A9InRydWUiPgogICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJNYWluQ29udHJvbGxlciBhcyBjdHJsIj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSJjdHJsLmluYygpIiBpZD0iaW5jIj5JbmNyZW1lbnQ8L2J1dHRvbj4KICAgICAgICAgICAgICA8c3BhbiBpZD0iY291bnRlciI+CiAgICAgICAgICAgICAgICB7e2N0cmwuY291bnRlcn19CiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iY3RybC5ldmlsKCkiIGlkPSJldmlsIj5FdmlsPC9idXR0b24+CiAgICAgICAgICAgICAgPHNwYW4gaWQ9ImV2aWxFcnJvciI+CiAgICAgICAgICAgICAgICB7e2N0cmwuZXZpbEVycm9yfX0KICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWxlPgogICAgICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2NzcEV4YW1wbGUnLCBbXSkKICAgICAgICAgICAgIC5jb250cm9sbGVyKCdNYWluQ29udHJvbGxlcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuaW5jID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRlcisrOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuZXZpbCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAvLyBqc2hpbnQgZXZpbDp0cnVlCiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZXZhbCgnMSsyJyk7CiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmV2aWxFcnJvciA9IGUubWVzc2FnZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9KTsKICAgICAgICA8L2ZpbGU+CiAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgICB2YXIgdXRpbCwgd2ViZHJpdmVyOwoKICAgICAgICAgIHZhciBpbmNCdG4gPSBlbGVtZW50KGJ5LmlkKCdpbmMnKSk7CiAgICAgICAgICB2YXIgY291bnRlciA9IGVsZW1lbnQoYnkuaWQoJ2NvdW50ZXInKSk7CiAgICAgICAgICB2YXIgZXZpbEJ0biA9IGVsZW1lbnQoYnkuaWQoJ2V2aWwnKSk7CiAgICAgICAgICB2YXIgZXZpbEVycm9yID0gZWxlbWVudChieS5pZCgnZXZpbEVycm9yJykpOwoKICAgICAgICAgIGZ1bmN0aW9uIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkgewogICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5tYW5hZ2UoKS5sb2dzKCkuZ2V0KCdicm93c2VyJykudGhlbihmdW5jdGlvbihicm93c2VyTG9nKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJMb2cuZmlsdGVyKGZ1bmN0aW9uKGxvZ0VudHJ5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9nRW50cnkubGV2ZWwudmFsdWUgPiB3ZWJkcml2ZXIubG9nZ2luZy5MZXZlbC5XQVJOSU5HLnZhbHVlOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICBmdW5jdGlvbiBjbGVhckVycm9ycygpIHsKICAgICAgICAgICAgZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKTsKICAgICAgICAgIH0KCiAgICAgICAgICBmdW5jdGlvbiBleHBlY3ROb0Vycm9ycygpIHsKICAgICAgICAgICAgZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKS50aGVuKGZ1bmN0aW9uKGZpbHRlcmVkTG9nKSB7CiAgICAgICAgICAgICAgZXhwZWN0KGZpbHRlcmVkTG9nLmxlbmd0aCkudG9FcXVhbCgwKTsKICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRMb2cubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYnJvd3NlciBjb25zb2xlIGVycm9yczogJyArIHV0aWwuaW5zcGVjdChmaWx0ZXJlZExvZykpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgZnVuY3Rpb24gZXhwZWN0RXJyb3IocmVnZXgpIHsKICAgICAgICAgICAgZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKS50aGVuKGZ1bmN0aW9uKGZpbHRlcmVkTG9nKSB7CiAgICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgZmlsdGVyZWRMb2cuZm9yRWFjaChmdW5jdGlvbihsb2cpIHsKICAgICAgICAgICAgICAgIGlmIChsb2cubWVzc2FnZS5tYXRjaChyZWdleCkpIHsKICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYW4gZXJyb3IgdGhhdCBtYXRjaGVzICcgKyByZWdleCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwogICAgICAgICAgICB3ZWJkcml2ZXIgPSByZXF1aXJlKCdwcm90cmFjdG9yL25vZGVfbW9kdWxlcy9zZWxlbml1bS13ZWJkcml2ZXInKTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIC8vIEZvciBub3csIHdlIG9ubHkgdGVzdCBvbiBDaHJvbWUsCiAgICAgICAgICAvLyBhcyBTYWZhcmkgZG9lcyBub3QgbG9hZCB0aGUgcGFnZSB3aXRoIFByb3RyYWN0b3IncyBpbmplY3RlZCBzY3JpcHRzLAogICAgICAgICAgLy8gYW5kIEZpcmVmb3ggd2ViZHJpdmVyIGFsd2F5cyBkaXNhYmxlcyBjb250ZW50IHNlY3VyaXR5IHBvbGljeSAoIzYzNTgpCiAgICAgICAgICBpZiAoYnJvd3Nlci5wYXJhbXMuYnJvd3NlciAhPT0gJ2Nocm9tZScpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIGl0KCdzaG91bGQgbm90IHJlcG9ydCBlcnJvcnMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gY2xlYXIgZXJyb3JzIHNvIHdlIGFyZSBub3QgZGVwZW5kZW50IG9uIHByZXZpb3VzIHRlc3RzCiAgICAgICAgICAgIGNsZWFyRXJyb3JzKCk7CiAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVsb2FkIHRoZSBwYWdlIGFzIHRoZSBwYWdlIGlzIGFscmVhZHkgbG9hZGVkIHdoZW4KICAgICAgICAgICAgLy8gd2UgY29tZSBoZXJlCiAgICAgICAgICAgIGJyb3dzZXIuZHJpdmVyLmdldEN1cnJlbnRVcmwoKS50aGVuKGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICAgIGJyb3dzZXIuZ2V0KHVybCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBleHBlY3ROb0Vycm9ycygpOwogICAgICAgICAgfSk7CgogICAgICAgICAgaXQoJ3Nob3VsZCBldmFsdWF0ZSBleHByZXNzaW9ucycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvRXF1YWwoJzAnKTsKICAgICAgICAgICAgaW5jQnRuLmNsaWNrKCk7CiAgICAgICAgICAgIGV4cGVjdChjb3VudGVyLmdldFRleHQoKSkudG9FcXVhbCgnMScpOwogICAgICAgICAgICBleHBlY3ROb0Vycm9ycygpOwogICAgICAgICAgfSk7CgogICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBhbmQgcmVwb3J0IGFuIGVycm9yIHdoZW4gdXNpbmcgImV2YWwiJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGV2aWxCdG4uY2xpY2soKTsKICAgICAgICAgICAgZXhwZWN0KGV2aWxFcnJvci5nZXRUZXh0KCkpLnRvTWF0Y2goL0NvbnRlbnQgU2VjdXJpdHkgUG9saWN5Lyk7CiAgICAgICAgICAgIGV4cGVjdEVycm9yKC9Db250ZW50IFNlY3VyaXR5IFBvbGljeS8pOwogICAgICAgICAgfSk7CiAgICAgICAgPC9maWxlPgogICAgICA8L2V4YW1wbGU+CiAgKi8KCi8vIG5nQ3NwIGlzIG5vdCBpbXBsZW1lbnRlZCBhcyBhIHByb3BlciBkaXJlY3RpdmUgYW55IG1vcmUsIGJlY2F1c2Ugd2UgbmVlZCBpdCBiZSBwcm9jZXNzZWQgd2hpbGUgd2UKLy8gYm9vdHN0cmFwIHRoZSBzeXN0ZW0gKGJlZm9yZSAkcGFyc2UgaXMgaW5zdGFudGlhdGVkKSwgZm9yIHRoaXMgcmVhc29uIHdlIGp1c3QgaGF2ZQovLyB0aGUgY3NwLmlzQWN0aXZlKCkgZm4gdGhhdCBsb29rcyBmb3IgbmctY3NwIGF0dHJpYnV0ZSBhbnl3aGVyZSBpbiB0aGUgY3VycmVudCBkb2MKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nQ2xpY2sKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBuZ0NsaWNrIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4KICogYW4gZWxlbWVudCBpcyBjbGlja2VkLgogKgogKiBAZWxlbWVudCBBTlkKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NsaWNrIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KICogY2xpY2suICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZT4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgogICAgICAgIEluY3JlbWVudAogICAgICA8L2J1dHRvbj4KICAgICAgPHNwYW4+CiAgICAgICAgY291bnQ6IHt7Y291bnR9fQogICAgICA8L3NwYW4+CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1jbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdjb3VudCcpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJzAnKTsKICAgICAgICAgZWxlbWVudChieS5jc3MoJ2J1dHRvbicpKS5jbGljaygpOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdjb3VudCcpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJzEnKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KLyoKICogQSBjb2xsZWN0aW9uIG9mIGRpcmVjdGl2ZXMgdGhhdCBhbGxvd3MgY3JlYXRpb24gb2YgY3VzdG9tIGV2ZW50IGhhbmRsZXJzIHRoYXQgYXJlIGRlZmluZWQgYXMKICogYW5ndWxhciBleHByZXNzaW9ucyBhbmQgYXJlIGNvbXBpbGVkIGFuZCBleGVjdXRlZCB3aXRoaW4gdGhlIGN1cnJlbnQgc2NvcGUuCiAqLwp2YXIgbmdFdmVudERpcmVjdGl2ZXMgPSB7fTsKCi8vIEZvciBldmVudHMgdGhhdCBtaWdodCBmaXJlIHN5bmNocm9ub3VzbHkgZHVyaW5nIERPTSBtYW5pcHVsYXRpb24KLy8gd2UgbmVlZCB0byBleGVjdXRlIHRoZWlyIGV2ZW50IGhhbmRsZXJzIGFzeW5jaHJvbm91c2x5IHVzaW5nICRldmFsQXN5bmMsCi8vIHNvIHRoYXQgdGhleSBhcmUgbm90IGV4ZWN1dGVkIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KdmFyIGZvcmNlQXN5bmNFdmVudHMgPSB7CiAgJ2JsdXInOiB0cnVlLAogICdmb2N1cyc6IHRydWUKfTsKZm9yRWFjaCgKICAnY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBtb3VzZWVudGVyIG1vdXNlbGVhdmUga2V5ZG93biBrZXl1cCBrZXlwcmVzcyBzdWJtaXQgZm9jdXMgYmx1ciBjb3B5IGN1dCBwYXN0ZScuc3BsaXQoJyAnKSwKICBmdW5jdGlvbihldmVudE5hbWUpIHsKICAgIHZhciBkaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKCduZy0nICsgZXZlbnROYW1lKTsKICAgIG5nRXZlbnREaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gWyckcGFyc2UnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRwYXJzZSwgJHJvb3RTY29wZSkgewogICAgICByZXR1cm4gewogICAgICAgIHJlc3RyaWN0OiAnQScsCiAgICAgICAgY29tcGlsZTogZnVuY3Rpb24oJGVsZW1lbnQsIGF0dHIpIHsKICAgICAgICAgIC8vIFdlIGV4cG9zZSB0aGUgcG93ZXJmdWwgJGV2ZW50IG9iamVjdCBvbiB0aGUgc2NvcGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFdpbmRvdywKICAgICAgICAgIC8vIGV0Yy4gdGhhdCBpc24ndCBwcm90ZWN0ZWQgYnkgdGhlIGZhc3QgcGF0aHMgaW4gJHBhcnNlLiAgV2UgZXhwbGljaXRseSByZXF1ZXN0IGJldHRlcgogICAgICAgICAgLy8gY2hlY2tzIGF0IHRoZSBjb3N0IG9mIHNwZWVkIHNpbmNlIGV2ZW50IGhhbmRsZXIgZXhwcmVzc2lvbnMgYXJlIG5vdCBleGVjdXRlZCBhcwogICAgICAgICAgLy8gZnJlcXVlbnRseSBhcyByZWd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uCiAgICAgICAgICB2YXIgZm4gPSAkcGFyc2UoYXR0cltkaXJlY3RpdmVOYW1lXSwgLyogaW50ZXJjZXB0b3JGbiAqLyBudWxsLCAvKiBleHBlbnNpdmVDaGVja3MgKi8gdHJ1ZSk7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmdFdmVudEhhbmRsZXIoc2NvcGUsIGVsZW1lbnQpIHsKICAgICAgICAgICAgZWxlbWVudC5vbihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmbihzY29wZSwgeyRldmVudDpldmVudH0pOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgaWYgKGZvcmNlQXN5bmNFdmVudHNbZXZlbnROYW1lXSAmJiAkcm9vdFNjb3BlLiQkcGhhc2UpIHsKICAgICAgICAgICAgICAgIHNjb3BlLiRldmFsQXN5bmMoY2FsbGJhY2spOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoY2FsbGJhY2spOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfTsKICAgIH1dOwogIH0KKTsKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nRGJsY2xpY2sKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBgbmdEYmxjbGlja2AgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gYSBkYmxjbGljayBldmVudC4KICoKICogQGVsZW1lbnQgQU5ZCiAqIEBwcmlvcml0eSAwCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdEYmxjbGljayB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCiAqIGEgZGJsY2xpY2suIChUaGUgRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YCkKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxidXR0b24gbmctZGJsY2xpY2s9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4KICAgICAgICBJbmNyZW1lbnQgKG9uIGRvdWJsZSBjbGljaykKICAgICAgPC9idXR0b24+CiAgICAgIGNvdW50OiB7e2NvdW50fX0KICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdNb3VzZWRvd24KICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBuZ01vdXNlZG93biBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZWRvd24gZXZlbnQuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcHJpb3JpdHkgMAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2Vkb3duIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KICogbW91c2Vkb3duLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxidXR0b24gbmctbW91c2Vkb3duPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+CiAgICAgICAgSW5jcmVtZW50IChvbiBtb3VzZSBkb3duKQogICAgICA8L2J1dHRvbj4KICAgICAgY291bnQ6IHt7Y291bnR9fQogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ01vdXNldXAKICoKICogQGRlc2NyaXB0aW9uCiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNldXAgZXZlbnQuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcHJpb3JpdHkgMAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2V1cCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCiAqIG1vdXNldXAuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZT4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgPGJ1dHRvbiBuZy1tb3VzZXVwPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+CiAgICAgICAgSW5jcmVtZW50IChvbiBtb3VzZSB1cCkKICAgICAgPC9idXR0b24+CiAgICAgIGNvdW50OiB7e2NvdW50fX0KICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ01vdXNlb3ZlcgogKgogKiBAZGVzY3JpcHRpb24KICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2VvdmVyIGV2ZW50LgogKgogKiBAZWxlbWVudCBBTlkKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNlb3ZlciB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCiAqIG1vdXNlb3Zlci4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8YnV0dG9uIG5nLW1vdXNlb3Zlcj0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgogICAgICAgIEluY3JlbWVudCAod2hlbiBtb3VzZSBpcyBvdmVyKQogICAgICA8L2J1dHRvbj4KICAgICAgY291bnQ6IHt7Y291bnR9fQogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ01vdXNlZW50ZXIKICoKICogQGRlc2NyaXB0aW9uCiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlZW50ZXIgZXZlbnQuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcHJpb3JpdHkgMAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2VlbnRlciB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCiAqIG1vdXNlZW50ZXIuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZT4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgPGJ1dHRvbiBuZy1tb3VzZWVudGVyPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+CiAgICAgICAgSW5jcmVtZW50ICh3aGVuIG1vdXNlIGVudGVycykKICAgICAgPC9idXR0b24+CiAgICAgIGNvdW50OiB7e2NvdW50fX0KICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdNb3VzZWxlYXZlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZWxlYXZlIGV2ZW50LgogKgogKiBAZWxlbWVudCBBTlkKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNlbGVhdmUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgogKiBtb3VzZWxlYXZlLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxidXR0b24gbmctbW91c2VsZWF2ZT0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgogICAgICAgIEluY3JlbWVudCAod2hlbiBtb3VzZSBsZWF2ZXMpCiAgICAgIDwvYnV0dG9uPgogICAgICBjb3VudDoge3tjb3VudH19CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwoKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nTW91c2Vtb3ZlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZW1vdmUgZXZlbnQuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcHJpb3JpdHkgMAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2Vtb3ZlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KICogbW91c2Vtb3ZlLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxidXR0b24gbmctbW91c2Vtb3ZlPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+CiAgICAgICAgSW5jcmVtZW50ICh3aGVuIG1vdXNlIG1vdmVzKQogICAgICA8L2J1dHRvbj4KICAgICAgY291bnQ6IHt7Y291bnR9fQogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0tleWRvd24KICoKICogQGRlc2NyaXB0aW9uCiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGtleWRvd24gZXZlbnQuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcHJpb3JpdHkgMAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nS2V5ZG93biB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCiAqIGtleWRvd24uIChFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgIGFuZCBjYW4gYmUgaW50ZXJyb2dhdGVkIGZvciBrZXlDb2RlLCBhbHRLZXksIGV0Yy4pCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8aW5wdXQgbmcta2V5ZG93bj0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgogICAgICBrZXkgZG93biBjb3VudDoge3tjb3VudH19CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwoKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nS2V5dXAKICoKICogQGRlc2NyaXB0aW9uCiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGtleXVwIGV2ZW50LgogKgogKiBAZWxlbWVudCBBTlkKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0tleXVwIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KICoga2V5dXAuIChFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgIGFuZCBjYW4gYmUgaW50ZXJyb2dhdGVkIGZvciBrZXlDb2RlLCBhbHRLZXksIGV0Yy4pCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHA+VHlwaW5nIGluIHRoZSBpbnB1dCBib3ggYmVsb3cgdXBkYXRlcyB0aGUga2V5IGNvdW50PC9wPgogICAgICAgPGlucHV0IG5nLWtleXVwPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+IGtleSB1cCBjb3VudDoge3tjb3VudH19CgogICAgICAgPHA+VHlwaW5nIGluIHRoZSBpbnB1dCBib3ggYmVsb3cgdXBkYXRlcyB0aGUga2V5Y29kZTwvcD4KICAgICAgIDxpbnB1dCBuZy1rZXl1cD0iZXZlbnQ9JGV2ZW50Ij4KICAgICAgIDxwPmV2ZW50IGtleUNvZGU6IHt7IGV2ZW50LmtleUNvZGUgfX08L3A+CiAgICAgICA8cD5ldmVudCBhbHRLZXk6IHt7IGV2ZW50LmFsdEtleSB9fTwvcD4KICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdLZXlwcmVzcwogKgogKiBAZGVzY3JpcHRpb24KICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24ga2V5cHJlc3MgZXZlbnQuCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nS2V5cHJlc3Mge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgogKiBrZXlwcmVzcy4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0KICogYW5kIGNhbiBiZSBpbnRlcnJvZ2F0ZWQgZm9yIGtleUNvZGUsIGFsdEtleSwgZXRjLikKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxpbnB1dCBuZy1rZXlwcmVzcz0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgogICAgICBrZXkgcHJlc3MgY291bnQ6IHt7Y291bnR9fQogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ1N1Ym1pdAogKgogKiBAZGVzY3JpcHRpb24KICogRW5hYmxlcyBiaW5kaW5nIGFuZ3VsYXIgZXhwcmVzc2lvbnMgdG8gb25zdWJtaXQgZXZlbnRzLgogKgogKiBBZGRpdGlvbmFsbHkgaXQgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uICh3aGljaCBmb3IgZm9ybSBtZWFucyBzZW5kaW5nIHRoZSByZXF1ZXN0IHRvIHRoZQogKiBzZXJ2ZXIgYW5kIHJlbG9hZGluZyB0aGUgY3VycmVudCBwYWdlKSwgYnV0IG9ubHkgaWYgdGhlIGZvcm0gZG9lcyBub3QgY29udGFpbiBgYWN0aW9uYCwKICogYGRhdGEtYWN0aW9uYCwgb3IgYHgtYWN0aW9uYCBhdHRyaWJ1dGVzLgogKgogKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4KICogKipXYXJuaW5nOioqIEJlIGNhcmVmdWwgbm90IHRvIGNhdXNlICJkb3VibGUtc3VibWlzc2lvbiIgYnkgdXNpbmcgYm90aCB0aGUgYG5nQ2xpY2tgIGFuZAogKiBgbmdTdWJtaXRgIGhhbmRsZXJzIHRvZ2V0aGVyLiBTZWUgdGhlCiAqIHtAbGluayBmb3JtI3N1Ym1pdHRpbmctYS1mb3JtLWFuZC1wcmV2ZW50aW5nLXRoZS1kZWZhdWx0LWFjdGlvbiBgZm9ybWAgZGlyZWN0aXZlIGRvY3VtZW50YXRpb259CiAqIGZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24gb2Ygd2hlbiBgbmdTdWJtaXRgIG1heSBiZSB0cmlnZ2VyZWQuCiAqIDwvZGl2PgogKgogKiBAZWxlbWVudCBmb3JtCiAqIEBwcmlvcml0eSAwCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTdWJtaXQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4KICogKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlIG1vZHVsZT0ic3VibWl0RXhhbXBsZSI+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxzY3JpcHQ+CiAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3N1Ym1pdEV4YW1wbGUnLCBbXSkKICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgICRzY29wZS5saXN0ID0gW107CiAgICAgICAgICAgICRzY29wZS50ZXh0ID0gJ2hlbGxvJzsKICAgICAgICAgICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmICgkc2NvcGUudGV4dCkgewogICAgICAgICAgICAgICAgJHNjb3BlLmxpc3QucHVzaCh0aGlzLnRleHQpOwogICAgICAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnJzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICB9XSk7CiAgICAgIDwvc2NyaXB0PgogICAgICA8Zm9ybSBuZy1zdWJtaXQ9InN1Ym1pdCgpIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgRW50ZXIgdGV4dCBhbmQgaGl0IGVudGVyOgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0idGV4dCIgbmFtZT0idGV4dCIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0ic3VibWl0IiB2YWx1ZT0iU3VibWl0IiAvPgogICAgICAgIDxwcmU+bGlzdD17e2xpc3R9fTwvcHJlPgogICAgICA8L2Zvcm0+CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zdWJtaXQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCcpKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3Q9W10nKTsKICAgICAgICAgZWxlbWVudChieS5jc3MoJyNzdWJtaXQnKSkuY2xpY2soKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCcpKS5nZXRUZXh0KCkpLnRvQ29udGFpbignaGVsbG8nKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCcnKTsKICAgICAgIH0pOwogICAgICAgaXQoJ3Nob3VsZCBpZ25vcmUgZW1wdHkgc3RyaW5ncycsIGZ1bmN0aW9uKCkgewogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9CZSgnbGlzdD1bXScpOwogICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3N1Ym1pdCcpKS5jbGljaygpOwogICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3N1Ym1pdCcpKS5jbGljaygpOwogICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9Db250YWluKCdoZWxsbycpOwogICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nRm9jdXMKICoKICogQGRlc2NyaXB0aW9uCiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGZvY3VzIGV2ZW50LgogKgogKiBOb3RlOiBBcyB0aGUgYGZvY3VzYCBldmVudCBpcyBleGVjdXRlZCBzeW5jaHJvbm91c2x5IHdoZW4gY2FsbGluZyBgaW5wdXQuZm9jdXMoKWAKICogQW5ndWxhckpTIGV4ZWN1dGVzIHRoZSBleHByZXNzaW9uIHVzaW5nIGBzY29wZS4kZXZhbEFzeW5jYCBpZiB0aGUgZXZlbnQgaXMgZmlyZWQKICogZHVyaW5nIGFuIGAkYXBwbHlgIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQgc3RhdGUuCiAqCiAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGEKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0ZvY3VzIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KICogZm9jdXMuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQogKgogKiBAZXhhbXBsZQogKiBTZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9CiAqLwoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdCbHVyCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBibHVyIGV2ZW50LgogKgogKiBBIFtibHVyIGV2ZW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvYmx1cikgZmlyZXMgd2hlbgogKiBhbiBlbGVtZW50IGhhcyBsb3N0IGZvY3VzLgogKgogKiBOb3RlOiBBcyB0aGUgYGJsdXJgIGV2ZW50IGlzIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgYWxzbyBkdXJpbmcgRE9NIG1hbmlwdWxhdGlvbnMKICogKGUuZy4gcmVtb3ZpbmcgYSBmb2N1c3NlZCBpbnB1dCksCiAqIEFuZ3VsYXJKUyBleGVjdXRlcyB0aGUgZXhwcmVzc2lvbiB1c2luZyBgc2NvcGUuJGV2YWxBc3luY2AgaWYgdGhlIGV2ZW50IGlzIGZpcmVkCiAqIGR1cmluZyBhbiBgJGFwcGx5YCB0byBlbnN1cmUgYSBjb25zaXN0ZW50IHN0YXRlLgogKgogKiBAZWxlbWVudCB3aW5kb3csIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhCiAqIEBwcmlvcml0eSAwCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCbHVyIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KICogYmx1ci4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCiAqCiAqIEBleGFtcGxlCiAqIFNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xpY2sgbmdDbGlja30KICovCgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0NvcHkKICoKICogQGRlc2NyaXB0aW9uCiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGNvcHkgZXZlbnQuCiAqCiAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGEKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NvcHkge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgogKiBjb3B5LiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKICoKICogQGV4YW1wbGUKICAgPGV4YW1wbGU+CiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgIDxpbnB1dCBuZy1jb3B5PSJjb3BpZWQ9dHJ1ZSIgbmctaW5pdD0iY29waWVkPWZhbHNlOyB2YWx1ZT0nY29weSBtZSciIG5nLW1vZGVsPSJ2YWx1ZSI+CiAgICAgIGNvcGllZDoge3tjb3BpZWR9fQogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nQ3V0CiAqCiAqIEBkZXNjcmlwdGlvbgogKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBjdXQgZXZlbnQuCiAqCiAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGEKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0N1dCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCiAqIGN1dC4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8aW5wdXQgbmctY3V0PSJjdXQ9dHJ1ZSIgbmctaW5pdD0iY3V0PWZhbHNlOyB2YWx1ZT0nY3V0IG1lJyIgbmctbW9kZWw9InZhbHVlIj4KICAgICAgY3V0OiB7e2N1dH19CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdQYXN0ZQogKgogKiBAZGVzY3JpcHRpb24KICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gcGFzdGUgZXZlbnQuCiAqCiAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGEKICogQHByaW9yaXR5IDAKICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ1Bhc3RlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KICogcGFzdGUuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZT4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgPGlucHV0IG5nLXBhc3RlPSJwYXN0ZT10cnVlIiBuZy1pbml0PSJwYXN0ZT1mYWxzZSIgcGxhY2Vob2xkZXI9J3Bhc3RlIGhlcmUnPgogICAgICBwYXN0ZWQ6IHt7cGFzdGV9fQogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nSWYKICogQHJlc3RyaWN0IEEKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBgbmdJZmAgZGlyZWN0aXZlIHJlbW92ZXMgb3IgcmVjcmVhdGVzIGEgcG9ydGlvbiBvZiB0aGUgRE9NIHRyZWUgYmFzZWQgb24gYW4KICoge2V4cHJlc3Npb259LiBJZiB0aGUgZXhwcmVzc2lvbiBhc3NpZ25lZCB0byBgbmdJZmAgZXZhbHVhdGVzIHRvIGEgZmFsc2UKICogdmFsdWUgdGhlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTSwgb3RoZXJ3aXNlIGEgY2xvbmUgb2YgdGhlCiAqIGVsZW1lbnQgaXMgcmVpbnNlcnRlZCBpbnRvIHRoZSBET00uCiAqCiAqIGBuZ0lmYCBkaWZmZXJzIGZyb20gYG5nU2hvd2AgYW5kIGBuZ0hpZGVgIGluIHRoYXQgYG5nSWZgIGNvbXBsZXRlbHkgcmVtb3ZlcyBhbmQgcmVjcmVhdGVzIHRoZQogKiBlbGVtZW50IGluIHRoZSBET00gcmF0aGVyIHRoYW4gY2hhbmdpbmcgaXRzIHZpc2liaWxpdHkgdmlhIHRoZSBgZGlzcGxheWAgY3NzIHByb3BlcnR5LiAgQSBjb21tb24KICogY2FzZSB3aGVuIHRoaXMgZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudCBpcyB3aGVuIHVzaW5nIGNzcyBzZWxlY3RvcnMgdGhhdCByZWx5IG9uIGFuIGVsZW1lbnQncwogKiBwb3NpdGlvbiB3aXRoaW4gdGhlIERPTSwgc3VjaCBhcyB0aGUgYDpmaXJzdC1jaGlsZGAgb3IgYDpsYXN0LWNoaWxkYCBwc2V1ZG8tY2xhc3Nlcy4KICoKICogTm90ZSB0aGF0IHdoZW4gYW4gZWxlbWVudCBpcyByZW1vdmVkIHVzaW5nIGBuZ0lmYCBpdHMgc2NvcGUgaXMgZGVzdHJveWVkIGFuZCBhIG5ldyBzY29wZQogKiBpcyBjcmVhdGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVzdG9yZWQuICBUaGUgc2NvcGUgY3JlYXRlZCB3aXRoaW4gYG5nSWZgIGluaGVyaXRzIGZyb20KICogaXRzIHBhcmVudCBzY29wZSB1c2luZwogKiBbcHJvdG90eXBhbCBpbmhlcml0YW5jZV0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy93aWtpL1VuZGVyc3RhbmRpbmctU2NvcGVzI2phdmFzY3JpcHQtcHJvdG90eXBhbC1pbmhlcml0YW5jZSkuCiAqIEFuIGltcG9ydGFudCBpbXBsaWNhdGlvbiBvZiB0aGlzIGlzIGlmIGBuZ01vZGVsYCBpcyB1c2VkIHdpdGhpbiBgbmdJZmAgdG8gYmluZCB0bwogKiBhIGphdmFzY3JpcHQgcHJpbWl0aXZlIGRlZmluZWQgaW4gdGhlIHBhcmVudCBzY29wZS4gSW4gdGhpcyBjYXNlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlCiAqIHZhcmlhYmxlIHdpdGhpbiB0aGUgY2hpbGQgc2NvcGUgd2lsbCBvdmVycmlkZSAoaGlkZSkgdGhlIHZhbHVlIGluIHRoZSBwYXJlbnQgc2NvcGUuCiAqCiAqIEFsc28sIGBuZ0lmYCByZWNyZWF0ZXMgZWxlbWVudHMgdXNpbmcgdGhlaXIgY29tcGlsZWQgc3RhdGUuIEFuIGV4YW1wbGUgb2YgdGhpcyBiZWhhdmlvcgogKiBpcyBpZiBhbiBlbGVtZW50J3MgY2xhc3MgYXR0cmlidXRlIGlzIGRpcmVjdGx5IG1vZGlmaWVkIGFmdGVyIGl0J3MgY29tcGlsZWQsIHVzaW5nIHNvbWV0aGluZyBsaWtlCiAqIGpRdWVyeSdzIGAuYWRkQ2xhc3MoKWAgbWV0aG9kLCBhbmQgdGhlIGVsZW1lbnQgaXMgbGF0ZXIgcmVtb3ZlZC4gV2hlbiBgbmdJZmAgcmVjcmVhdGVzIHRoZSBlbGVtZW50CiAqIHRoZSBhZGRlZCBjbGFzcyB3aWxsIGJlIGxvc3QgYmVjYXVzZSB0aGUgb3JpZ2luYWwgY29tcGlsZWQgc3RhdGUgaXMgdXNlZCB0byByZWdlbmVyYXRlIHRoZSBlbGVtZW50LgogKgogKiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gcHJvdmlkZSBhbmltYXRpb25zIHZpYSB0aGUgYG5nQW5pbWF0ZWAgbW9kdWxlIHRvIGFuaW1hdGUgdGhlIGBlbnRlcmAKICogYW5kIGBsZWF2ZWAgZWZmZWN0cy4KICoKICogQGFuaW1hdGlvbnMKICogZW50ZXIgLSBoYXBwZW5zIGp1c3QgYWZ0ZXIgdGhlIGBuZ0lmYCBjb250ZW50cyBjaGFuZ2UgYW5kIGEgbmV3IERPTSBlbGVtZW50IGlzIGNyZWF0ZWQgYW5kIGluamVjdGVkIGludG8gdGhlIGBuZ0lmYCBjb250YWluZXIKICogbGVhdmUgLSBoYXBwZW5zIGp1c3QgYmVmb3JlIHRoZSBgbmdJZmAgY29udGVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAc2NvcGUKICogQHByaW9yaXR5IDYwMAogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nSWYgSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIGZhbHN5IHRoZW4KICogICAgIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIHRyZWUuIElmIGl0IGlzIHRydXRoeSBhIGNvcHkgb2YgdGhlIGNvbXBpbGVkCiAqICAgICBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBET00gdHJlZS4KICoKICogQGV4YW1wbGUKICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICBDbGljayBtZTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iY2hlY2tlZCIgbmctaW5pdD0iY2hlY2tlZD10cnVlIiAvPjxici8+CiAgICAgIFNob3cgd2hlbiBjaGVja2VkOgogICAgICA8c3BhbiBuZy1pZj0iY2hlY2tlZCIgY2xhc3M9ImFuaW1hdGUtaWYiPgogICAgICAgIFRoaXMgaXMgcmVtb3ZlZCB3aGVuIHRoZSBjaGVja2JveCBpcyB1bmNoZWNrZWQuCiAgICAgIDwvc3Bhbj4KICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4KICAgICAgLmFuaW1hdGUtaWYgewogICAgICAgIGJhY2tncm91bmQ6d2hpdGU7CiAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjazsKICAgICAgICBwYWRkaW5nOjEwcHg7CiAgICAgIH0KCiAgICAgIC5hbmltYXRlLWlmLm5nLWVudGVyLCAuYW5pbWF0ZS1pZi5uZy1sZWF2ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CiAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOwogICAgICB9CgogICAgICAuYW5pbWF0ZS1pZi5uZy1lbnRlciwKICAgICAgLmFuaW1hdGUtaWYubmctbGVhdmUubmctbGVhdmUtYWN0aXZlIHsKICAgICAgICBvcGFjaXR5OjA7CiAgICAgIH0KCiAgICAgIC5hbmltYXRlLWlmLm5nLWxlYXZlLAogICAgICAuYW5pbWF0ZS1pZi5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUgewogICAgICAgIG9wYWNpdHk6MTsKICAgICAgfQogICAgPC9maWxlPgogIDwvZXhhbXBsZT4KICovCnZhciBuZ0lmRGlyZWN0aXZlID0gWyckYW5pbWF0ZScsIGZ1bmN0aW9uKCRhbmltYXRlKSB7CiAgcmV0dXJuIHsKICAgIG11bHRpRWxlbWVudDogdHJ1ZSwKICAgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JywKICAgIHByaW9yaXR5OiA2MDAsCiAgICB0ZXJtaW5hbDogdHJ1ZSwKICAgIHJlc3RyaWN0OiAnQScsCiAgICAkJHRsYjogdHJ1ZSwKICAgIGxpbms6IGZ1bmN0aW9uKCRzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkgewogICAgICAgIHZhciBibG9jaywgY2hpbGRTY29wZSwgcHJldmlvdXNFbGVtZW50czsKICAgICAgICAkc2NvcGUuJHdhdGNoKCRhdHRyLm5nSWYsIGZ1bmN0aW9uIG5nSWZXYXRjaEFjdGlvbih2YWx1ZSkgewoKICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIWNoaWxkU2NvcGUpIHsKICAgICAgICAgICAgICAkdHJhbnNjbHVkZShmdW5jdGlvbihjbG9uZSwgbmV3U2NvcGUpIHsKICAgICAgICAgICAgICAgIGNoaWxkU2NvcGUgPSBuZXdTY29wZTsKICAgICAgICAgICAgICAgIGNsb25lW2Nsb25lLmxlbmd0aCsrXSA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJyBlbmQgbmdJZjogJyArICRhdHRyLm5nSWYgKyAnICcpOwogICAgICAgICAgICAgICAgLy8gTm90ZTogV2Ugb25seSBuZWVkIHRoZSBmaXJzdC9sYXN0IG5vZGUgb2YgdGhlIGNsb25lZCBub2Rlcy4KICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBqcWxpdGUgd3JhcHBlciBhcyBpdCBtaWdodCBiZSBjaGFuZ2VkIGxhdGVyCiAgICAgICAgICAgICAgICAvLyBieSBhIGRpcmVjdGl2ZSB3aXRoIHRlbXBsYXRlVXJsIHdoZW4gaXRzIHRlbXBsYXRlIGFycml2ZXMuCiAgICAgICAgICAgICAgICBibG9jayA9IHsKICAgICAgICAgICAgICAgICAgY2xvbmU6IGNsb25lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2xvbmUsICRlbGVtZW50LnBhcmVudCgpLCAkZWxlbWVudCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChwcmV2aW+M3O9WAYYDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PFNAAEAGborAqAc2wKgHYJUiH/VYenzTQb70qIAQDQ4TUwAAAQEICgCjXt4ATaXajNzvVgmGAwAKIAAACiAAAGj3KB/SxQgAJ60eEwgARQAf/NTCQABABrZSwKgHYMCoBzYf9ZUiQb70qFh6fNOAGAFTr9UAAAEBCAoATaXaAKNe0XVzRWxlbWVudHMpIHsKICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRzLnJlbW92ZSgpOwogICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGlsZFNjb3BlKSB7CiAgICAgICAgICAgICAgY2hpbGRTY29wZS4kZGVzdHJveSgpOwogICAgICAgICAgICAgIGNoaWxkU2NvcGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChibG9jaykgewogICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudHMgPSBnZXRCbG9ja05vZGVzKGJsb2NrLmNsb25lKTsKICAgICAgICAgICAgICAkYW5pbWF0ZS5sZWF2ZShwcmV2aW91c0VsZW1lbnRzKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50cyA9IG51bGw7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgYmxvY2sgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgfTsKfV07CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ0luY2x1ZGUKICogQHJlc3RyaWN0IEVDQQogKgogKiBAZGVzY3JpcHRpb24KICogRmV0Y2hlcywgY29tcGlsZXMgYW5kIGluY2x1ZGVzIGFuIGV4dGVybmFsIEhUTUwgZnJhZ21lbnQuCiAqCiAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBVUkwgaXMgcmVzdHJpY3RlZCB0byB0aGUgc2FtZSBkb21haW4gYW5kIHByb3RvY29sIGFzIHRoZQogKiBhcHBsaWNhdGlvbiBkb2N1bWVudC4gVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcge0BsaW5rICRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsCiAqICRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsfSBvbiBpdC4gVG8gbG9hZCB0ZW1wbGF0ZXMgZnJvbSBvdGhlciBkb21haW5zIG9yIHByb3RvY29scwogKiB5b3UgbWF5IGVpdGhlciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3Qgd2hpdGVsaXN0IHRoZW19IG9yCiAqIHtAbGluayAkc2NlI3RydXN0QXNSZXNvdXJjZVVybCB3cmFwIHRoZW19IGFzIHRydXN0ZWQgdmFsdWVzLiBSZWZlciB0byBBbmd1bGFyJ3Mge0BsaW5rCiAqIG5nLiRzY2UgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmd9LgogKgogKiBJbiBhZGRpdGlvbiwgdGhlIGJyb3dzZXIncwogKiBbU2FtZSBPcmlnaW4gUG9saWN5XShodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Jyb3dzZXJzZWMvd2lraS9QYXJ0MiNTYW1lLW9yaWdpbl9wb2xpY3lfZm9yX1hNTEh0dHBSZXF1ZXN0KQogKiBhbmQgW0Nyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nIChDT1JTKV0oaHR0cDovL3d3dy53My5vcmcvVFIvY29ycy8pCiAqIHBvbGljeSBtYXkgZnVydGhlciByZXN0cmljdCB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLgogKiBGb3IgZXhhbXBsZSwgYG5nSW5jbHVkZWAgd29uJ3Qgd29yayBmb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzIG9uIGFsbCBicm93c2VycyBhbmQgZm9yIGBmaWxlOi8vYAogKiBhY2Nlc3Mgb24gc29tZSBicm93c2Vycy4KICoKICogQGFuaW1hdGlvbnMKICogZW50ZXIgLSBhbmltYXRpb24gaXMgdXNlZCB0byBicmluZyBuZXcgY29udGVudCBpbnRvIHRoZSBicm93c2VyLgogKiBsZWF2ZSAtIGFuaW1hdGlvbiBpcyB1c2VkIHRvIGFuaW1hdGUgZXhpc3RpbmcgY29udGVudCBhd2F5LgogKgogKiBUaGUgZW50ZXIgYW5kIGxlYXZlIGFuaW1hdGlvbiBvY2N1ciBjb25jdXJyZW50bHkuCiAqCiAqIEBzY29wZQogKiBAcHJpb3JpdHkgNDAwCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuZ0luY2x1ZGV8c3JjIGFuZ3VsYXIgZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIFVSTC4gSWYgdGhlIHNvdXJjZSBpcyBhIHN0cmluZyBjb25zdGFudCwKICogICAgICAgICAgICAgICAgIG1ha2Ugc3VyZSB5b3Ugd3JhcCBpdCBpbiAqKnNpbmdsZSoqIHF1b3RlcywgZS5nLiBgc3JjPSInbXlQYXJ0aWFsVGVtcGxhdGUuaHRtbCciYC4KICogQHBhcmFtIHtzdHJpbmc9fSBvbmxvYWQgRXhwcmVzc2lvbiB0byBldmFsdWF0ZSB3aGVuIGEgbmV3IHBhcnRpYWwgaXMgbG9hZGVkLgogKgogKiBAcGFyYW0ge3N0cmluZz19IGF1dG9zY3JvbGwgV2hldGhlciBgbmdJbmNsdWRlYCBzaG91bGQgY2FsbCB7QGxpbmsgbmcuJGFuY2hvclNjcm9sbAogKiAgICAgICAgICAgICAgICAgICRhbmNob3JTY3JvbGx9IHRvIHNjcm9sbCB0aGUgdmlld3BvcnQgYWZ0ZXIgdGhlIGNvbnRlbnQgaXMgbG9hZGVkLgogKgogKiAgICAgICAgICAgICAgICAgIC0gSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCBkaXNhYmxlIHNjcm9sbGluZy4KICogICAgICAgICAgICAgICAgICAtIElmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHdpdGhvdXQgdmFsdWUsIGVuYWJsZSBzY3JvbGxpbmcuCiAqICAgICAgICAgICAgICAgICAgLSBPdGhlcndpc2UgZW5hYmxlIHNjcm9sbGluZyBvbmx5IGlmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnV0aHkgdmFsdWUuCiAqCiAqIEBleGFtcGxlCiAgPGV4YW1wbGUgbW9kdWxlPSJpbmNsdWRlRXhhbXBsZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgPHNlbGVjdCBuZy1tb2RlbD0idGVtcGxhdGUiIG5nLW9wdGlvbnM9InQubmFtZSBmb3IgdCBpbiB0ZW1wbGF0ZXMiPgogICAgICAgIDxvcHRpb24gdmFsdWU9IiI+KGJsYW5rKTwvb3B0aW9uPgogICAgICAgPC9zZWxlY3Q+CiAgICAgICB1cmwgb2YgdGhlIHRlbXBsYXRlOiA8dHQ+e3t0ZW1wbGF0ZS51cmx9fTwvdHQ+CiAgICAgICA8aHIvPgogICAgICAgPGRpdiBjbGFzcz0ic2xpZGUtYW5pbWF0ZS1jb250YWluZXIiPgogICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZS1hbmltYXRlIiBuZy1pbmNsdWRlPSJ0ZW1wbGF0ZS51cmwiPjwvZGl2PgogICAgICAgPC9kaXY+CiAgICAgPC9kaXY+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgogICAgICBhbmd1bGFyLm1vZHVsZSgnaW5jbHVkZUV4YW1wbGUnLCBbJ25nQW5pbWF0ZSddKQogICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAkc2NvcGUudGVtcGxhdGVzID0KICAgICAgICAgICAgWyB7IG5hbWU6ICd0ZW1wbGF0ZTEuaHRtbCcsIHVybDogJ3RlbXBsYXRlMS5odG1sJ30sCiAgICAgICAgICAgICAgeyBuYW1lOiAndGVtcGxhdGUyLmh0bWwnLCB1cmw6ICd0ZW1wbGF0ZTIuaHRtbCd9IF07CiAgICAgICAgICAkc2NvcGUudGVtcGxhdGUgPSAkc2NvcGUudGVtcGxhdGVzWzBdOwogICAgICAgIH1dKTsKICAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJ0ZW1wbGF0ZTEuaHRtbCI+CiAgICAgIENvbnRlbnQgb2YgdGVtcGxhdGUxLmh0bWwKICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9InRlbXBsYXRlMi5odG1sIj4KICAgICAgQ29udGVudCBvZiB0ZW1wbGF0ZTIuaHRtbAogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0iYW5pbWF0aW9ucy5jc3MiPgogICAgICAuc2xpZGUtYW5pbWF0ZS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6d2hpdGU7CiAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjazsKICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICBvdmVyZmxvdzpoaWRkZW47CiAgICAgIH0KCiAgICAgIC5zbGlkZS1hbmltYXRlIHsKICAgICAgICBwYWRkaW5nOjEwcHg7CiAgICAgIH0KCiAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWVudGVyLCAuc2xpZGUtYW5pbWF0ZS5uZy1sZWF2ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CiAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOwoKICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgICAgICB0b3A6MDsKICAgICAgICBsZWZ0OjA7CiAgICAgICAgcmlnaHQ6MDsKICAgICAgICBib3R0b206MDsKICAgICAgICBkaXNwbGF5OmJsb2NrOwogICAgICAgIHBhZGRpbmc6MTBweDsKICAgICAgfQoKICAgICAgLnNsaWRlLWFuaW1hdGUubmctZW50ZXIgewogICAgICAgIHRvcDotNTBweDsKICAgICAgfQogICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUgewogICAgICAgIHRvcDowOwogICAgICB9CgogICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1sZWF2ZSB7CiAgICAgICAgdG9wOjA7CiAgICAgIH0KICAgICAgLnNsaWRlLWFuaW1hdGUubmctbGVhdmUubmctbGVhdmUtYWN0aXZlIHsKICAgICAgICB0b3A6NTBweDsKICAgICAgfQogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgIHZhciB0ZW1wbGF0ZVNlbGVjdCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RlbXBsYXRlJykpOwogICAgICB2YXIgaW5jbHVkZUVsZW0gPSBlbGVtZW50KGJ5LmNzcygnW25nLWluY2x1ZGVdJykpOwoKICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlMS5odG1sJywgZnVuY3Rpb24oKSB7CiAgICAgICAgZXhwZWN0KGluY2x1ZGVFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvQ29udGVudCBvZiB0ZW1wbGF0ZTEuaHRtbC8pOwogICAgICB9KTsKCiAgICAgIGl0KCdzaG91bGQgbG9hZCB0ZW1wbGF0ZTIuaHRtbCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdmaXJlZm94JykgewogICAgICAgICAgLy8gRmlyZWZveCBjYW4ndCBoYW5kbGUgdXNpbmcgc2VsZWN0cwogICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzQ4MAogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZVNlbGVjdC5jbGljaygpOwogICAgICAgIHRlbXBsYXRlU2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMikuY2xpY2soKTsKICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IG9mIHRlbXBsYXRlMi5odG1sLyk7CiAgICAgIH0pOwoKICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgdG8gYmxhbmsnLCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoYnJvd3Nlci5wYXJhbXMuYnJvd3NlciA9PSAnZmlyZWZveCcpIHsKICAgICAgICAgIC8vIEZpcmVmb3ggY2FuJ3QgaGFuZGxlIHVzaW5nIHNlbGVjdHMKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVTZWxlY3QuY2xpY2soKTsKICAgICAgICB0ZW1wbGF0ZVNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDApLmNsaWNrKCk7CiAgICAgICAgZXhwZWN0KGluY2x1ZGVFbGVtLmlzUHJlc2VudCgpKS50b0JlKGZhbHNlKTsKICAgICAgfSk7CiAgICA8L2ZpbGU+CiAgPC9leGFtcGxlPgogKi8KCgovKioKICogQG5nZG9jIGV2ZW50CiAqIEBuYW1lIG5nSW5jbHVkZSMkaW5jbHVkZUNvbnRlbnRSZXF1ZXN0ZWQKICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBzY29wZSBuZ0luY2x1ZGUgd2FzIGRlY2xhcmVkIGluCiAqIEBkZXNjcmlwdGlvbgogKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgdGhlIG5nSW5jbHVkZSBjb250ZW50IGlzIHJlcXVlc3RlZC4KICoKICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0LgogKiBAcGFyYW0ge1N0cmluZ30gc3JjIFVSTCBvZiBjb250ZW50IHRvIGxvYWQuCiAqLwoKCi8qKgogKiBAbmdkb2MgZXZlbnQKICogQG5hbWUgbmdJbmNsdWRlIyRpbmNsdWRlQ29udGVudExvYWRlZAogKiBAZXZlbnRUeXBlIGVtaXQgb24gdGhlIGN1cnJlbnQgbmdJbmNsdWRlIHNjb3BlCiAqIEBkZXNjcmlwdGlvbgogKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgdGhlIG5nSW5jbHVkZSBjb250ZW50IGlzIHJlbG9hZGVkLgogKgogKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuCiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVVJMIG9mIGNvbnRlbnQgdG8gbG9hZC4KICovCgoKLyoqCiAqIEBuZ2RvYyBldmVudAogKiBAbmFtZSBuZ0luY2x1ZGUjJGluY2x1ZGVDb250ZW50RXJyb3IKICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBzY29wZSBuZ0luY2x1ZGUgd2FzIGRlY2xhcmVkIGluCiAqIEBkZXNjcmlwdGlvbgogKiBFbWl0dGVkIHdoZW4gYSB0ZW1wbGF0ZSBIVFRQIHJlcXVlc3QgeWllbGRzIGFuIGVycm9ub3VzIHJlc3BvbnNlIChzdGF0dXMgPCAyMDAgfHwgc3RhdHVzID4gMjk5KQogKgogKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuCiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVVJMIG9mIGNvbnRlbnQgdG8gbG9hZC4KICovCnZhciBuZ0luY2x1ZGVEaXJlY3RpdmUgPSBbJyR0ZW1wbGF0ZVJlcXVlc3QnLCAnJGFuY2hvclNjcm9sbCcsICckYW5pbWF0ZScsICckc2NlJywKICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oJHRlbXBsYXRlUmVxdWVzdCwgICAkYW5jaG9yU2Nyb2xsLCAgICRhbmltYXRlLCAgICRzY2UpIHsKICByZXR1cm4gewogICAgcmVzdHJpY3Q6ICdFQ0EnLAogICAgcHJpb3JpdHk6IDQwMCwKICAgIHRlcm1pbmFsOiB0cnVlLAogICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLAogICAgY29udHJvbGxlcjogYW5ndWxhci5ub29wLAogICAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cikgewogICAgICB2YXIgc3JjRXhwID0gYXR0ci5uZ0luY2x1ZGUgfHwgYXR0ci5zcmMsCiAgICAgICAgICBvbmxvYWRFeHAgPSBhdHRyLm9ubG9hZCB8fCAnJywKICAgICAgICAgIGF1dG9TY3JvbGxFeHAgPSBhdHRyLmF1dG9zY3JvbGw7CgogICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHsKICAgICAgICB2YXIgY2hhbmdlQ291bnRlciA9IDAsCiAgICAgICAgICAgIGN1cnJlbnRTY29wZSwKICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LAogICAgICAgICAgICBjdXJyZW50RWxlbWVudDsKCiAgICAgICAgdmFyIGNsZWFudXBMYXN0SW5jbHVkZUNvbnRlbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQpIHsKICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LnJlbW92ZSgpOwogICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGN1cnJl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Y2x1ZGUobmV3U2NvcGUsIGZ1bmN0aW9uKGNsb25lKSB7CiAgICAgICAgICAgICAgICBjbGVhbnVwTGFzdEluY2x1ZGVDb250ZW50KCk7CiAgICAgICAgICAgICAgICAkYW5pbWF0ZS5lbnRlcihjbG9uZSwgbnVsbCwgJGVsZW1lbnQpLnRoZW4oYWZ0ZXJBbmltYXRpb24pOwogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBjdXJyZW50U2NvcGUgPSBuZXdTY29wZTsKICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGNsb25lOwoKICAgICAgICAgICAgICBjdXJyZW50U2NvcGUuJGVtaXQoJyRpbmNsdWRlQ29udGVudExvYWRlZCcsIHNyYyk7CiAgICAgICAgICAgICAgc2NvcGUuJGV2YWwob25sb2FkRXhwKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXNDaGFuZ2VJZCA9PT0gY2hhbmdlQ291bnRlcikgewogICAgICAgICAgICAgICAgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCgpOwogICAgICAgICAgICAgICAgc2NvcGUuJGVtaXQoJyRpbmNsdWRlQ29udGVudEVycm9yJywgc3JjKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzY29wZS4kZW1pdCgnJGluY2x1ZGVDb250ZW50UmVxdWVzdGVkJywgc3JjKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNsZWFudXBMYXN0SW5jbHVkZUNvbnRlbnQoKTsKICAgICAgICAgICAgY3RybC50ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICB9CiAgfTsKfV07CgovLyBUaGlzIGRpcmVjdGl2ZSBpcyBjYWxsZWQgZHVyaW5nIHRoZSAkdHJhbnNjbHVkZSBjYWxsIG9mIHRoZSBmaXJzdCBgbmdJbmNsdWRlYCBkaXJlY3RpdmUuCi8vIEl0IHdpbGwgcmVwbGFjZSBhbmQgY29tcGlsZSB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBsb2FkZWQgdGVtcGxhdGUuCi8vIFdlIG5lZWQgdGhpcyBkaXJlY3RpdmUgc28gdGhhdCB0aGUgZWxlbWVudCBjb250ZW50IGlzIGFscmVhZHkgZmlsbGVkIHdoZW4KLy8gdGhlIGxpbmsgZnVuY3Rpb24gb2YgYW5vdGhlciBkaXJlY3RpdmUgb24gdGhlIHNhbWUgZWxlbWVudCBhcyBuZ0luY2x1ZGUKLy8gaXMgY2FsbGVkLgp2YXIgbmdJbmNsdWRlRmlsbENvbnRlbnREaXJlY3RpdmUgPSBbJyRjb21waWxlJywKICBmdW5jdGlvbigkY29tcGlsZSkgewogICAgcmV0dXJuIHsKICAgICAgcmVzdHJpY3Q6ICdFQ0EnLAogICAgICBwcmlvcml0eTogLTQwMCwKICAgICAgcmVxdWlyZTogJ25nSW5jbHVkZScsCiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCAkZWxlbWVudCwgJGF0dHIsIGN0cmwpIHsKICAgICAgICBpZiAoL1NWRy8udGVzdCgkZWxlbWVudFswXS50b1N0cmluZygpKSkgewogICAgICAgICAgLy8gV2ViS2l0OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM1Njk4IC0tLSBTVkcgZWxlbWVudHMgZG8gbm90CiAgICAgICAgICAvLyBzdXBwb3J0IGlubmVySFRNTCwgc28gZGV0ZWN0IHRoaXMgaGVyZSBhbmQgdHJ5IHRvIGdlbmVyYXRlIHRoZSBjb250ZW50cwogICAgICAgICAgLy8gc3BlY2lhbGx5LgogICAgICAgICAgJGVsZW1lbnQuZW1wdHkoKTsKICAgICAgICAgICRjb21waWxlKGpxTGl0ZUJ1aWxkRnJhZ21lbnQoY3RybC50ZW1wbGF0ZSwgZG9jdW1lbnQpLmNoaWxkTm9kZXMpKHNjb3BlLAogICAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzcGFjZUFkYXB0ZWRDbG9uZShjbG9uZSkgewogICAgICAgICAgICAkZWxlbWVudC5hcHBlbmQoY2xvbmUpOwogICAgICAgICAgfSwge2Z1dHVyZVBhcmVudEVsZW1lbnQ6ICRlbGVtZW50fSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkZWxlbWVudC5odG1sKGN0cmwudGVtcGxhdGUpOwogICAgICAgICRjb21waWxlKCRlbGVtZW50LmNvbnRlbnRzKCkpKHNjb3BlKTsKICAgICAgfQogICAgfTsKICB9XTsKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nSW5pdAogKiBAcmVzdHJpY3QgQUMKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBgbmdJbml0YCBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBldmFsdWF0ZSBhbiBleHByZXNzaW9uIGluIHRoZQogKiBjdXJyZW50IHNjb3BlLgogKgogKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1lcnJvciI+CiAqIFRoZSBvbmx5IGFwcHJvcHJpYXRlIHVzZSBvZiBgbmdJbml0YCBpcyBmb3IgYWxpYXNpbmcgc3BlY2lhbCBwcm9wZXJ0aWVzIG9mCiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgYG5nUmVwZWF0YH0sIGFzIHNlZW4gaW4gdGhlIGRlbW8gYmVsb3cuIEJlc2lkZXMgdGhpcyBjYXNlLCB5b3UKICogc2hvdWxkIHVzZSB7QGxpbmsgZ3VpZGUvY29udHJvbGxlciBjb250cm9sbGVyc30gcmF0aGVyIHRoYW4gYG5nSW5pdGAKICogdG8gaW5pdGlhbGl6ZSB2YWx1ZXMgb24gYSBzY29wZS4KICogPC9kaXY+CiAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgogKiAqKk5vdGUqKjogSWYgeW91IGhhdmUgYXNzaWdubWVudCBpbiBgbmdJbml0YCBhbG9uZyB3aXRoIHtAbGluayBuZy4kZmlsdGVyIGAkZmlsdGVyYH0sIG1ha2UKICogc3VyZSB5b3UgaGF2ZSBwYXJlbnRoZXNpcyBmb3IgY29ycmVjdCBwcmVjZWRlbmNlOgogKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CiAqICAgPGRpdiBuZy1pbml0PSJ0ZXN0MSA9IChkYXRhIHwgb3JkZXJCeTonbmFtZScpIj48L2Rpdj4KICogPC9wcmU+CiAqIDwvZGl2PgogKgogKiBAcHJpb3JpdHkgNDUwCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nSW5pdCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLgogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZSBtb2R1bGU9ImluaXRFeGFtcGxlIj4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgPHNjcmlwdD4KICAgICBhbmd1bGFyLm1vZHVsZSgnaW5pdEV4YW1wbGUnLCBbXSkKICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICRzY29wZS5saXN0ID0gW1snYScsICdiJ10sIFsnYycsICdkJ11dOwogICAgICAgfV0pOwogICA8L3NjcmlwdD4KICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgPGRpdiBuZy1yZXBlYXQ9ImlubmVyTGlzdCBpbiBsaXN0IiBuZy1pbml0PSJvdXRlckluZGV4ID0gJGluZGV4Ij4KICAgICAgIDxkaXYgbmctcmVwZWF0PSJ2YWx1ZSBpbiBpbm5lckxpc3QiIG5nLWluaXQ9ImlubmVySW5kZXggPSAkaW5kZXgiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImV4YW1wbGUtaW5pdCI+bGlzdFsge3tvdXRlckluZGV4fX0gXVsge3tpbm5lckluZGV4fX0gXSA9IHt7dmFsdWV9fTs8L3NwYW4+CiAgICAgICA8L2Rpdj4KICAgICA8L2Rpdj4KICAgPC9kaXY+CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgaXQoJ3Nob3VsZCBhbGlhcyBpbmRleCBwb3NpdGlvbnMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgdmFyIGVsZW1lbnRzID0gZWxlbWVudC5hbGwoYnkuY3NzKCcuZXhhbXBsZS1pbml0JykpOwogICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDApLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMCBdWyAwIF0gPSBhOycpOwogICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDEpLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMCBdWyAxIF0gPSBiOycpOwogICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDIpLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMSBdWyAwIF0gPSBjOycpOwogICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDMpLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMSBdWyAxIF0gPSBkOycpOwogICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqLwp2YXIgbmdJbml0RGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoewogIHByaW9yaXR5OiA0NTAsCiAgY29tcGlsZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gewogICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgewogICAgICAgIHNjb3BlLiRldmFsKGF0dHJzLm5nSW5pdCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nTm9uQmluZGFibGUKICogQHJlc3RyaWN0IEFDCiAqIEBwcmlvcml0eSAxMDAwCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgYG5nTm9uQmluZGFibGVgIGRpcmVjdGl2ZSB0ZWxscyBBbmd1bGFyIG5vdCB0byBjb21waWxlIG9yIGJpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50CiAqIERPTSBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgZWxlbWVudCBjb250YWlucyB3aGF0IGFwcGVhcnMgdG8gYmUgQW5ndWxhciBkaXJlY3RpdmVzIGFuZAogKiBiaW5kaW5ncyBidXQgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgYnkgQW5ndWxhci4gVGhpcyBjb3VsZCBiZSB0aGUgY2FzZSBpZiB5b3UgaGF2ZSBhIHNpdGUgdGhhdAogKiBkaXNwbGF5cyBzbmlwcGV0cyBvZiBjb2RlLCBmb3IgaW5zdGFuY2UuCiAqCiAqIEBlbGVtZW50IEFOWQogKgogKiBAZXhhbXBsZQogKiBJbiB0aGlzIGV4YW1wbGUgdGhlcmUgYXJlIHR3byBsb2NhdGlvbnMgd2hlcmUgYSBzaW1wbGUgaW50ZXJwb2xhdGlvbiBiaW5kaW5nIChge3t9fWApIGlzIHByZXNlbnQsCiAqIGJ1dCB0aGUgb25lIHdyYXBwZWQgaW4gYG5nTm9uQmluZGFibGVgIGlzIGxlZnQgYWxvbmUuCiAqCiAqIEBleGFtcGxlCiAgICA8ZXhhbXBsZT4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgPGRpdj5Ob3JtYWw6IHt7MSArIDJ9fTwvZGl2PgogICAgICAgIDxkaXYgbmctbm9uLWJpbmRhYmxlPklnbm9yZWQ6IHt7MSArIDJ9fTwvZGl2PgogICAgICA8L2ZpbGU+CiAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1ub24tYmluZGFibGUnLCBmdW5jdGlvbigpIHsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnMSArIDInKSkuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzMnKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnZGl2JykpLmxhc3QoKS5nZXRUZXh0KCkpLnRvTWF0Y2goLzEgXCsgMi8pOwogICAgICAgfSk7CiAgICAgIDwvZmlsZT4KICAgIDwvZXhhbXBsZT4KICovCnZhciBuZ05vbkJpbmRhYmxlRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoeyB0ZXJtaW5hbDogdHJ1ZSwgcHJpb3JpdHk6IDEwMDAgfSk7CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ1BsdXJhbGl6ZQogKiBAcmVzdHJpY3QgRUEKICoKICogQGRlc2NyaXB0aW9uCiAqIGBuZ1BsdXJhbGl6ZWAgaXMgYSBkaXJlY3RpdmUgdGhhdCBkaXNwbGF5cyBtZXNzYWdlcyBhY2NvcmRpbmcgdG8gZW4tVVMgbG9jYWxpemF0aW9uIHJ1bGVzLgogKiBUaGVzZSBydWxlcyBhcmUgYnVuZGxlZCB3aXRoIGFuZ3VsYXIuanMsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbgogKiAoc2VlIHtAbGluayBndWlkZS9pMThuIEFuZ3VsYXIgaTE4bn0gZGV2IGd1aWRlKS4gWW91IGNvbmZpZ3VyZSBuZ1BsdXJhbGl6ZSBkaXJlY3RpdmUKICogYnkgc3BlY2lmeWluZyB0aGUgbWFwcGluZ3MgYmV0d2VlbgogKiBbcGx1cmFsIGNhdGVnb3JpZXNdKGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcy9jbGRyLXRtcC90cnVuay9kaWZmL3N1cHBsZW1lbnRhbC9sYW5ndWFnZV9wbHVyYWxfcnVsZXMuaHRtbCkKICogYW5kIHRoZSBzdHJpbmdzIHRvIGJlIGRpc3BsYXllZC4KICoKICogIyBQbHVyYWwgY2F0ZWdvcmllcyBhbmQgZXhwbGljaXQgbnVtYmVyIHJ1bGVzCiAqIFRoZXJlIGFyZSB0d28KICogW3BsdXJhbCBjYXRlZ29yaWVzXShodHRwOi8vdW5pY29kZS5vcmcvcmVwb3MvY2xkci10bXAvdHJ1bmsvZGlmZi9zdXBwbGVtZW50YWwvbGFuZ3VhZ2VfcGx1cmFsX3J1bGVzLmh0bWwpCiAqIGluIEFuZ3VsYXIncyBkZWZhdWx0IGVuLVVTIGxvY2FsZTogIm9uZSIgYW5kICJvdGhlciIuCiAqCiAqIFdoaWxlIGEgcGx1cmFsIGNhdGVnb3J5IG1heSBtYXRjaCBtYW55IG51bWJlcnMgKGZvciBleGFtcGxlLCBpbiBlbi1VUyBsb2NhbGUsICJvdGhlciIgY2FuIG1hdGNoCiAqIGFueSBudW1iZXIgdGhhdCBpcyBub3QgMSksIGFuIGV4cGxpY2l0IG51bWJlciBydWxlIGNhbiBvbmx5IG1hdGNoIG9uZSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGUKICogZXhwbGljaXQgbnVtYmVyIHJ1bGUgZm9yICIzIiBtYXRjaGVzIHRoZSBudW1iZXIgMy4gVGhlcmUgYXJlIGV4YW1wbGVzIG9mIHBsdXJhbCBjYXRlZ29yaWVzCiAqIGFuZCBleHBsaWNpdCBudW1iZXIgcnVsZXMgdGhyb3VnaG91dCB0aGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50YXRpb24uCiAqCiAqICMgQ29uZmlndXJpbmcgbmdQbHVyYWxpemUKICogWW91IGNvbmZpZ3VyZSBuZ1BsdXJhbGl6ZSBieSBwcm92aWRpbmcgMiBhdHRyaWJ1dGVzOiBgY291bnRgIGFuZCBgd2hlbmAuCiAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSwgYG9mZnNldGAuCiAqCiAqIFRoZSB2YWx1ZSBvZiB0aGUgYGNvdW50YCBhdHRyaWJ1dGUgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbgogKiBBbmd1bGFyIGV4cHJlc3Npb259OyB0aGVzZSBhcmUgZXZhbHVhdGVkIG9uIHRoZSBjdXJyZW50IHNjb3BlIGZvciBpdHMgYm91bmQgdmFsdWUuCiAqCiAqIFRoZSBgd2hlbmAgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgbWFwcGluZ3MgYmV0d2VlbiBwbHVyYWwgY2F0ZWdvcmllcyBhbmQgdGhlIGFjdHVhbAogKiBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgYSBKU09OIG9iamVjdC4KICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjb25maWd1cmUgbmdQbHVyYWxpemU6CiAqCiAqIGBgYGh0bWwKICogPG5nLXBsdXJhbGl6ZSBjb3VudD0icGVyc29uQ291bnQiCiAgICAgICAgICAgICAgICAgd2hlbj0ieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsCiAqICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAnMSBwZXJzb24gaXMgdmlld2luZy4nLAogKiAgICAgICAgICAgICAgICAgICAgICAnb3RoZXInOiAne30gcGVvcGxlIGFyZSB2aWV3aW5nLid9Ij4KICogPC9uZy1wbHVyYWxpemU+CiAqYGBgCiAqCiAqIEluIHRoZSBleGFtcGxlLCBgIjA6IE5vYm9keSBpcyB2aWV3aW5nLiJgIGlzIGFuIGV4cGxpY2l0IG51bWJlciBydWxlLiBJZiB5b3UgZGlkIG5vdAogKiBzcGVjaWZ5IHRoaXMgcnVsZSwgMCB3b3VsZCBiZSBtYXRjaGVkIHRvIHRoZSAib3RoZXIiIGNhdGVnb3J5IGFuZCAiMCBwZW9wbGUgYXJlIHZpZXdpbmciCiAqIHdvdWxkIGJlIHNob3duIGluc3RlYWQgb2YgIk5vYm9keSBpcyB2aWV3aW5nIi4gWW91IGNhbiBzcGVjaWZ5IGFuIGV4cGxpY2l0IG51bWJlciBydWxlIGZvcgogKiBvdGhlciBudW1iZXJzLCBmb3IgZXhhbXBsZSAxMiwgc28gdGhhdCBpbnN0ZWFkIG9mIHNob3dpbmcgIjEyIHBlb3BsZSBhcmUgdmlld2luZyIsIHlvdSBjYW4KICogc2hvdyAiYSBkb3plbiBwZW9wbGUgYXJlIHZpZXdpbmciLgogKgogKiBZb3UgY2FuIHVzZSBhIHNldCBvZiBjbG9zZWQgYnJhY2VzIChge31gKSBhcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgbnVtYmVyIHRoYXQgeW91IHdhbnQgc3Vic3RpdHV0ZWQKICogaW50byBwbHVyYWxpemVkIHN0cmluZ3MuIEluIHRoZSBwcmV2aW91cyBleGFtcGxlLCBBbmd1bGFyIHdpbGwgcmVwbGFjZSBge31gIHdpdGgKICogPHNwYW4gbmctbm9uLWJpbmRhYmxlPmB7e3BlcnNvbkNvdW50fX1gPC9zcGFuPi4gVGhlIGNsb3NlZCBicmFjZXMgYHt9YCBpcyBhIHBsYWNlaG9sZGVyCiAqIGZvciA8c3BhbiBuZy1ub24tYmluZGFibGU+e3tudW1iZXJFeHByZXNzaW9ufX08L3NwYW4+LgogKgogKiAjIENvbmZpZ3VyaW5nIG5nUGx1cmFsaXplIHdpdGggb2Zmc2V0CiAqIFRoZSBgb2Zmc2V0YCBhdHRyaWJ1dGUgYWxsb3dzIGZ1cnRoZXIgY3VzdG9taXphdGlvbiBvZiBwbHVyYWxpemVkIHRleHQsIHdoaWNoIGNhbiByZXN1bHQgaW4KICogYSBiZXR0ZXIgdXNlciBleHBlcmllbmNlLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiB0aGUgbWVzc2FnZSAiNCBwZW9wbGUgYXJlIHZpZXdpbmcgdGhpcyBkb2N1bWVudCIsCiAqIHlvdSBtaWdodCBkaXNwbGF5ICJKb2huLCBLYXRlIGFuZCAyIG90aGVycyBhcmUgdmlld2luZyB0aGlzIGRvY3VtZW50Ii4KICogVGhlIG9mZnNldCBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBvZmZzZXQgYSBudW1iZXIgYnkgYW55IGRlc2lyZWQgdmFsdWUuCiAqIExldCdzIHRha2UgYSBsb29rIGF0IGFuIGV4YW1wbGU6CiAqCiAqIGBgYGh0bWwKICogPG5nLXBsdXJhbGl6ZSBjb3VudD0icGVyc29uQ291bnQiIG9mZnNldD0yCiAqICAgICAgICAgICAgICAgd2hlbj0ieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsCiAqICAgICAgICAgICAgICAgICAgICAgICcxJzogJ3t7cGVyc29uMX19IGlzIHZpZXdpbmcuJywKICogICAgICAgICAgICAgICAgICAgICAgJzInOiAne3twZXJzb24xfX0gYW5kIHt7cGVyc29uMn19IGFyZSB2aWV3aW5nLicsCiAqICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicsCiAqICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7e3BlcnNvbjF9fSwge3twZXJzb24yfX0gYW5kIHt9IG90aGVyIHBlb3BsZSBhcmUgdmlld2luZy4nfSI+CiAqIDwvbmctcGx1cmFsaXplPgogKiBgYGAKICoKICogTm90aWNlIHRoYXQgd2UgYXJlIHN0aWxsIHVzaW5nIHR3byBwbHVyYWwgY2F0ZWdvcmllcyhvbmUsIG90aGVyKSwgYnV0IHdlIGFkZGVkCiAqIHRocmVlIGV4cGxpY2l0IG51bWJlciBydWxlcyAwLCAxIGFuZCAyLgogKiBXaGVuIG9uZSBwZXJzb24sIHBlcmhhcHMgSm9obiwgdmlld3MgdGhlIGRvY3VtZW50LCAiSm9obiBpcyB2aWV3aW5nIiB3aWxsIGJlIHNob3duLgogKiBXaGVuIHRocmVlIHBlb3BsZSB2aWV3IHRoZSBkb2N1bWVudCwgbm8gZXhwbGljaXQgbnVtYmVyIHJ1bGUgaXMgZm91bmQsIHNvCiAqIGFuIG9mZnNldCBvZiAyIGlzIHRha2VuIG9mZiAzLCBhbmQgQW5ndWxhciB1c2VzIDEgdG8gZGVjaWRlIHRoZSBwbHVyYWwgY2F0ZWdvcnkuCiAqIEluIHRoaXMgY2FzZSwgcGx1cmFsIGNhdGVnb3J5ICdvbmUnIGlzIG1hdGNoZWQgYW5kICJKb2huLCBNYXJ5IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nIgogKiBpcyBzaG93bi4KICoKICogTm90ZSB0aGF0IHdoZW4geW91IHNwZWNpZnkgb2Zmc2V0cywgeW91IG11c3QgcHJvdmlkZSBleHBsaWNpdCBudW1iZXIgcnVsZXMgZm9yCiAqIG51bWJlcnMgZnJvbSAwIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIG9mZnNldC4gSWYgeW91IHVzZSBhbiBvZmZzZXQgb2YgMywgZm9yIGV4YW1wbGUsCiAqIHlvdSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgbnVtYmVyIHJ1bGVzIGZvciAwLCAxLCAyIGFuZCAzLiBZb3UgbXVzdCBhbHNvIHByb3ZpZGUgcGx1cmFsIHN0cmluZ3MgZm9yCiAqIHBsdXJhbCBjYXRlZ29yaWVzICJvbmUiIGFuZCAib3RoZXIiLgogKgogKiBAcGFyYW0ge3N0cmluZ3xleHByZXNzaW9ufSBjb3VudCBUaGUgdmFyaWFibGUgdG8gYmUgYm91bmQgdG8uCiAqIEBwYXJhbSB7c3RyaW5nfSB3aGVuIFRoZSBtYXBwaW5nIGJldHdlZW4gcGx1cmFsIGNhdGVnb3J5IHRvIGl0cyBjb3JyZXNwb25kaW5nIHN0cmluZ3MuCiAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byBkZWR1Y3QgZnJvbSB0aGUgdG90YWwgbnVtYmVyLgogKgogKiBAZXhhbXBsZQogICAgPGV4YW1wbGUgbW9kdWxlPSJwbHVyYWxpemVFeGFtcGxlIj4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdwbHVyYWxpemVFeGFtcGxlJywgW10pCiAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CiAgICAgICAgICAgICAgJHNjb3BlLnBlcnNvbjEgPSAnSWdvcic7CiAgICAgICAgICAgICAgJHNjb3BlLnBlcnNvbjIgPSAnTWlza28nOwogICAgICAgICAgICAgICRzY29wZS5wZXJzb25Db3VudCA9IDE7CiAgICAgICAgICAgIH1dKTsKICAgICAgICA8L3NjcmlwdD4KICAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgIFBlcnNvbiAxOjxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icGVyc29uMSIgdmFsdWU9Iklnb3IiIC8+PGJyLz4KICAgICAgICAgIFBlcnNvbiAyOjxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icGVyc29uMiIgdmFsdWU9Ik1pc2tvIiAvPjxici8+CiAgICAgICAgICBOdW1iZXIgb2YgUGVvcGxlOjxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icGVyc29uQ291bnQiIHZhbHVlPSIxIiAvPjxici8+CgogICAgICAgICAgPCEtLS0gRXhhbXBsZSB3aXRoIHNpbXBsZSBwbHVyYWxpemF0aW9uIHJ1bGVzIGZvciBlbiBsb2NhbGUgLS0tPgogICAgICAgICAgV2l0aG91dCBPZmZzZXQ6CiAgICAgICAgICA8bmctcGx1cmFsaXplIGNvdW50PSJwZXJzb25Db3VudCIKICAgICAgICAgICAgICAgICAgICAgICAgd2hlbj0ieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25lJzogJzEgcGVyc29uIGlzIHZpZXdpbmcuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7fSBwZW9wbGUgYXJlIHZpZXdpbmcuJ30iPgogICAgICAgICAgPC9uZy1wbHVyYWxpemU+PGJyPgoKICAgICAgICAgIDwhLS0tIEV4YW1wbGUgd2l0aCBvZmZzZXQgLS0tPgogICAgICAgICAgV2l0aCBPZmZzZXQoMik6CiAgICAgICAgICA8bmctcGx1cmFsaXplIGNvdW50PSJwZXJzb25Db3VudCIgb2Zmc2V0PTIKICAgICAgICAgICAgICAgICAgICAgICAgd2hlbj0ieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMSc6ICd7e3BlcnNvbjF9fSBpcyB2aWV3aW5nLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMic6ICd7e3BlcnNvbjF9fSBhbmQge3twZXJzb24yfX0gYXJlIHZpZXdpbmcuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3RoZXInOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCB7fSBvdGhlciBwZW9wbGUgYXJlIHZpZXdpbmcuJ30iPgogICAgICAgICAgPC9uZy1wbHVyYWxpemU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZmlsZT4KICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgaXQoJ3Nob3VsZCBzaG93IGNvcnJlY3QgcGx1cmFsaXplZCBzdHJpbmcnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciB3aXRob3V0T2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDApOwogICAgICAgICAgdmFyIHdpdGhPZmZzZXQgPSBlbGVtZW50LmFsbChieS5jc3MoJ25nLXBsdXJhbGl6ZScpKS5nZXQoMSk7CiAgICAgICAgICB2YXIgY291bnRJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbkNvdW50JykpOwoKICAgICAgICAgIGV4cGVjdCh3aXRob3V0T2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnMSBwZXJzb24gaXMgdmlld2luZy4nKTsKICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciBpcyB2aWV3aW5nLicpOwoKICAgICAgICAgIGNvdW50SW5wdXQuY2xlYXIoKTsKICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzAnKTsKCiAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ05vYm9keSBpcyB2aWV3aW5nLicpOwogICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdOb2JvZHkgaXMgdmlld2luZy4nKTsKCiAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7CiAgICAgICAgICBjb3VudElucHV0LnNlbmRLZXlzKCcyJyk7CgogICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCcyIHBlb3BsZSBhcmUgdmlld2luZy4nKTsKICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciBhbmQgTWlza28gYXJlIHZpZXdpbmcuJyk7CgogICAgICAgICAgY291bnRJbnB1dC5jbGVhcigpOwogICAgICAgICAgY291bnRJbnB1dC5zZW5kS2V5cygnMycpOwoKICAgICAgICAgIGV4cGVjdCh3aXRob3V0T2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnMyBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7CiAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ0lnb3IsIE1pc2tvIGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicpOwoKICAgICAgICAgIGNvdW50SW5wdXQuY2xlYXIoKTsKICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzQnKTsKCiAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzQgcGVvcGxlIGFyZSB2aWV3aW5nLicpOwogICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdJZ29yLCBNaXNrbyBhbmQgMiBvdGhlciBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7CiAgICAgICAgfSk7CiAgICAgICAgaXQoJ3Nob3VsZCBzaG93IGRhdGEtYm91bmQgbmFtZXMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciB3aXRoT2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDEpOwogICAgICAgICAgdmFyIHBlcnNvbkNvdW50ID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uQ291bnQnKSk7CiAgICAgICAgICB2YXIgcGVyc29uMSA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbjEnKSk7CiAgICAgICAgICB2YXIgcGVyc29uMiA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbjInKSk7CiAgICAgICAgICBwZXJzb25Db3VudC5jbGVhcigpOwogICAgICAgICAgcGVyc29uQ291bnQuc2VuZEtleXMoJzQnKTsKICAgICAgICAgIHBlcnNvbjEuY2xlYXIoKTsKICAgICAgICAgIHBlcnNvbjEuc2VuZEtleXMoJ0RpJyk7CiAgICAgICAgICBwZXJzb24yLmNsZWFyKCk7CiAgICAgICAgICBwZXJzb24yLnNlbmRLZXlzKCdWb2p0YScpOwogICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdEaSwgVm9qdGEgYW5kIDIgb3RoZXIgcGVvcGxlIGFyZSB2aWV3aW5nLicpOwogICAgICAgIH0pOwogICAgICA8L2ZpbGU+CiAgICA8L2V4YW1wbGU+CiAqLwp2YXIgbmdQbHVyYWxpemVEaXJlY3RpdmUgPSBbJyRsb2NhbGUnLCAnJGludGVycG9sYXRlJywgZnVuY3Rpb24oJGxvY2FsZSwgJGludGVycG9sYXRlKSB7CiAgdmFyIEJSQUNFID0gL3t9L2csCiAgICAgIElTX1dIRU4gPSAvXndoZW4oTWludXMpPyguKykkLzsKCiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnRUEnLAogICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKICAgICAgdmFyIG51bWJlckV4cCA9IGF0dHIuY291bnQsCiAgICAgICAgICB3aGVuRXhwID0gYXR0ci4kYXR0ci53aGVuICYmIGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyLndoZW4pLCAvLyB3ZSBoYXZlIHt7fX0gaW4gYXR0cnMKICAgICAgICAgIG9mZnNldCA9IGF0dHIub2Zmc2V0IHx8IDAsCiAgICAgICAgICB3aGVucyA9IHNjb3BlLiRldmFsKHdoZW5FeHApIHx8IHt9LAogICAgICAgICAgd2hlbnNFeHBGbnMgPSB7fSwKICAgICAgICAgIHN0YXJ0U3ltYm9sID0gJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sKCksCiAgICAgICAgICBlbmRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sKCksCiAgICAgICAgICBicmFjZVJlcGxhY2VtZW50ID0gc3RhcnRTeW1ib2wgKyBudW1iZXJFeHAgKyAnLScgKyBvZmZzZXQgKyBlbmRTeW1ib2wsCiAgICAgICAgICB3YXRjaFJlbW92ZXIgPSBhbmd1bGFyLm5vb3AsCiAgICAgICAgICBsYXN0Q291bnQ7CgogICAgICBmb3JFYWNoKGF0dHIsIGZ1bmN0aW9uKGV4cHJlc3Npb24sIGF0dHJpYnV0ZU5hbWUpIHsKICAgICAgICB2YXIgdG1wTWF0Y2ggPSBJU19XSEVOLmV4ZWMoYXR0cmlidXRlTmFtZSk7CiAgICAgICAgaWYgKHRtcE1hdGNoKSB7CiAgICAgICAgICB2YXIgd2hlbktleSA9ICh0bXBNYXRjaFsxXSA/ICctJyA6ICcnKSArIGxvd2VyY2FzZSh0bXBNYXRjaFsyXSk7CiAgICAgICAgICB3aGVuc1t3aGVuS2V5XSA9IGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyW2F0dHJpYnV0ZU5hbWVdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBmb3JFYWNoKHdoZW5zLCBmdW5jdGlvbihleHByZXNzaW9uLCBrZXkpIHsKICAgICAgICB3aGVuc0V4cEZuc1trZXldID0gJGludGVycG9sYXRlKGV4cHJlc3Npb24ucmVwbGFjZShCUkFDRSwgYnJhY2VSZXBsYWNlbWVudCkpOwoKICAgICAgfSk7CgogICAgICBzY29wZS4kd2F0Y2gobnVtYmVyRXhwLCBmdW5jdGlvbiBuZ1BsdXJhbGl6ZVdhdGNoQWN0aW9uKG5ld1ZhbCkgewogICAgICAgIHZhciBjb3VudCA9IHBhcnNlRmxvYXQobmV3VmFsKTsKICAgICAgICB2YXIgY291bnRJc05hTiA9IGlzTmFOKGNvdW50KTsKCiAgICAgICAgaWYgKCFjb3VudElzTmFOICYmICEoY291bnQgaW4gd2hlbnMpKSB7CiAgICAgICAgICAvLyBJZiBhbiBleHBsaWNpdCBudW1iZXIgcnVsZSBzdWNoIGFzIDEsIDIsIDMuLi4gaXMgZGVmaW5lZCwganVzdCB1c2UgaXQuCiAgICAgICAgICAvLyBPdGhlcndpc2UsIGNoZWNrIGl0IGFnYWluc3QgcGx1cmFsaXphdGlvbiBydWxlcyBpbiAkbG9jYWxlIHNlcnZpY2UuCiAgICAgICAgICBjb3VudCA9ICRsb2NhbGUucGx1cmFsQ2F0KGNvdW50IC0gb2Zmc2V0KTsKICAgICAgICB9CgogICAgICAgIC8vIElmIGJvdGggYGNvdW50YCBhbmQgYGxhc3RDb3VudGAgYXJlIE5hTiwgd2UgZG9uJ3QgbmVlZCB0byByZS1yZWdpc3RlciBhIHdhdGNoLgogICAgICAgIC8vIEluIEpTIGBOYU4gIT09IE5hTmAsIHNvIHdlIGhhdmUgdG8gZXhsaWNpdGx5IGNoZWNrLgogICAgICAgIGlmICgoY291bnQgIT09IGxhc3RDb3VudCkgJiYgIShjb3VudElzTmFOICYmIGlzTmFOKGxhc3RDb3VudCkpKSB7CiAgICAgICAgICB3YXRjaFJlbW92ZXIoKTsKICAgICAgICAgIHdhdGNoUmVtb3ZlciA9IHNjb3BlLiR3YXRjaCh3aGVuc0V4cEZuc1tjb3VudF0sIHVwZGF0ZUVsZW1lbnRUZXh0KTsKICAgICAgICAgIGxhc3RDb3VudCA9IGNvdW50OwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50VGV4dChuZXdUZXh0KSB7CiAgICAgICAgZWxlbWVudC50ZXh0KG5ld1RleHQgfHwgJycpOwogICAgICB9CiAgICB9CiAgfTsKfV07CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ1JlcGVhdAogKgogKiBAZGVzY3JpcHRpb24KICogVGhlIGBuZ1JlcGVhdGAgZGlyZWN0aXZlIGluc3RhbnRpYXRlcyBhIHRlbXBsYXRlIG9uY2UgcGVyIGl0ZW0gZnJvbSBhIGNvbGxlY3Rpb24uIEVhY2ggdGVtcGxhdGUKICogaW5zdGFuY2UgZ2V0cyBpdHMgb3duIHNjb3BlLCB3aGVyZSB0aGUgZ2l2ZW4gbG9vcCB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBpdGVtLAogKiBhbmQgYCRpbmRleGAgaXMgc2V0IHRvIHRoZSBpdGVtIGluZGV4IG9yIGtleS4KICoKICogU3BlY2lhbCBwcm9wZXJ0aWVzIGFyZSBleHBvc2VkIG9uIHRoZSBsb2NhbCBzY29wZSBvZiBlYWNoIHRlbXBsYXRlIGluc3RhbmNlLCBpbmNsdWRpbmc6CiAqCiAqIHwgVmFyaWFibGUgIHwgVHlwZSAgICAgICAgICAgIHwgRGV0YWlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAogKiB8IGAkaW5kZXhgICB8IHtAdHlwZSBudW1iZXJ9ICB8IGl0ZXJhdG9yIG9mZnNldCBvZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCAoMC4ubGVuZ3RoLTEpICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgYCRmaXJzdGAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBmaXJzdCBpbiB0aGUgaXRlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgIHwKICogfCBgJG1pZGRsZWAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSByZXBlYXRlZCBlbGVtZW50IGlzIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IGluIHRoZSBpdGVyYXRvci4gfAogKiB8IGAkbGFzdGAgICB8IHtAdHlwZSBib29sZWFufSB8IHRydWUgaWYgdGhlIHJlcGVhdGVkIGVsZW1lbnQgaXMgbGFzdCBpbiB0aGUgaXRlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgYCRldmVuYCAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgcG9zaXRpb24gYCRpbmRleGAgaXMgZXZlbiAob3RoZXJ3aXNlIGZhbHNlKS4gICAgICAgICAgIHwKICogfCBgJG9kZGAgICAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSBpdGVyYXRvciBwb3NpdGlvbiBgJGluZGV4YCBpcyBvZGQgKG90aGVyd2lzZSBmYWxzZSkuICAgICAgICAgICAgfAogKgogKiBDcmVhdGluZyBhbGlhc2VzIGZvciB0aGVzZSBwcm9wZXJ0aWVzIGlzIHBvc3NpYmxlIHdpdGgge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luaXQgYG5nSW5pdGB9LgogKiBUaGlzIG1heSBiZSB1c2VmdWwgd2hlbiwgZm9yIGluc3RhbmNlLCBuZXN0aW5nIG5nUmVwZWF0cy4KICoKICogIyBTcGVjaWFsIHJlcGVhdCBzdGFydCBhbmQgZW5kIHBvaW50cwogKiBUbyByZXBlYXQgYSBzZXJpZXMgb2YgZWxlbWVudHMgaW5zdGVhZCBvZiBqdXN0IG9uZSBwYXJlbnQgZWxlbWVudCwgbmdSZXBlYXQgKGFzIHdlbGwgYXMgb3RoZXIgbmcgZGlyZWN0aXZlcykgc3VwcG9ydHMgZXh0ZW5kaW5nCiAqIHRoZSByYW5nZSBvZiB0aGUgcmVwZWF0ZXIgYnkgZGVmaW5pbmcgZXhwbGljaXQgc3RhcnQgYW5kIGVuZCBwb2ludHMgYnkgdXNpbmcgKipuZy1yZXBlYXQtc3RhcnQqKiBhbmQgKipuZy1yZXBlYXQtZW5kKiogcmVzcGVjdGl2ZWx5LgogKiBUaGUgKipuZy1yZXBlYXQtc3RhcnQqKiBkaXJlY3RpdmUgd29ya3MgdGhlIHNhbWUgYXMgKipuZy1yZXBlYXQqKiwgYnV0IHdpbGwgcmVwZWF0IGFsbCB0aGUgSFRNTCBjb2RlIChpbmNsdWRpbmcgdGhlIHRhZyBpdCdzIGRlZmluZWQgb24pCiAqIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGVuZGluZyBIVE1MIHRhZyB3aGVyZSAqKm5nLXJlcGVhdC1lbmQqKiBpcyBwbGFjZWQuCiAqCiAqIFRoZSBleGFtcGxlIGJlbG93IG1ha2VzIHVzZSBvZiB0aGlzIGZlYXR1cmU6CiAqIGBgYGh0bWwKICogICA8aGVhZGVyIG5nLXJlcGVhdC1zdGFydD0iaXRlbSBpbiBpdGVtcyI+CiAqICAgICBIZWFkZXIge3sgaXRlbSB9fQogKiAgIDwvaGVhZGVyPgogKiAgIDxkaXYgY2xhc3M9ImJvZHkiPgogKiAgICAgQm9keSB7eyBpdGVtIH19CiAqICAgPC9kaXY+CiAqICAgPGZvb3RlciBuZy1yZXBlYXQtZW5kPgogKiAgICAgRm9vdGVyIHt7IGl0ZW0gfX0KICogICA8L2Zvb3Rlcj4KICogYGBgCiAqCiAqIEFuZCB3aXRoIGFuIGlucHV0IG9mIHtAdHlwZSBbJ0EnLCdCJ119IGZvciB0aGUgaXRlbXMgdmFyaWFibGUgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBvdXRwdXQgd2lsbCBldmFsdWF0ZSB0bzoKICogYGBgaHRtbAogKiAgIDxoZWFkZXI+CiAqICAgICBIZWFkZXIgQQogKiAgIDwvaGVhZGVyPgogKiAgIDxkaXYgY2xhc3M9ImJvZHkiPgogKiAgICAgQm9keSBBCiAqICAgPC9kaXY+CiAqICAgPGZvb3Rlcj4KICogICAgIEZvb3RlciBBCiAqICAgPC9mb290ZXI+CiAqICAgPGhlYWRlcj4KICogICAgIEhlYWRlciBCCiAqICAgPC9oZWFkZXI+CiAqICAgPGRpdiBjbGFzcz0iYm9keSI+CiAqICAgICBCb2R5IEIKICogICA8L2Rpdj4KICogICA8Zm9vdGVyPgogKiAgICAgRm9vdGVyIEIKICogICA8L2Zvb3Rlcj4KICogYGBgCiAqCiAqIFRoZSBjdXN0b20gc3RhcnQgYW5kIGVuZCBwb2ludHMgZm9yIG5nUmVwZWF0IGFsc28gc3VwcG9ydCBhbGwgb3RoZXIgSFRNTCBkaXJlY3RpdmUgc3ludGF4IGZsYXZvcnMgcHJvdmlkZWQgaW4gQW5ndWxhckpTIChzdWNoCiAqIGFzICoqZGF0YS1uZy1yZXBlYXQtc3RhcnQqKiwgKip4LW5nLXJlcGVhdC1zdGFydCoqIGFuZCAqKm5nOnJlcGVhdC1zdGFydCoqKS4KICoKICogQGFuaW1hdGlvbnMKICogKiouZW50ZXIqKiAtIHdoZW4gYSBuZXcgaXRlbSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvciB3aGVuIGFuIGl0ZW0gaXMgcmV2ZWFsZWQgYWZ0ZXIgYSBmaWx0ZXIKICoKICogKioubGVhdmUqKiAtIHdoZW4gYW4gaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb3Igd2hlbiBhbiBpdGVtIGlzIGZpbHRlcmVkIG91dAogKgogKiAqKi5tb3ZlKiogLSB3aGVuIGFuIGFkamFjZW50IGl0ZW0gaXMgZmlsdGVyZWQgb3V0IGNhdXNpbmcgYSByZW9yZGVyIG9yIHdoZW4gdGhlIGl0ZW0gY29udGVudHMgYXJlIHJlb3JkZXJlZAogKgogKiBAZWxlbWVudCBBTlkKICogQHNjb3BlCiAqIEBwcmlvcml0eSAxMDAwCiAqIEBwYXJhbSB7cmVwZWF0X2V4cHJlc3Npb259IG5nUmVwZWF0IFRoZSBleHByZXNzaW9uIGluZGljYXRpbmcgaG93IHRvIGVudW1lcmF0ZSBhIGNvbGxlY3Rpb24uIFRoZXNlCiAqICAgZm9ybWF0cyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDoKICoKICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uYCDigJMgd2hlcmUgdmFyaWFibGUgaXMgdGhlIHVzZXIgZGVmaW5lZCBsb29wIHZhcmlhYmxlIGFuZCBgZXhwcmVzc2lvbmAKICogICAgIGlzIGEgc2NvcGUgZXhwcmVzc2lvbiBnaXZpbmcgdGhlIGNvbGxlY3Rpb24gdG8gZW51bWVyYXRlLgogKgogKiAgICAgRm9yIGV4YW1wbGU6IGBhbGJ1bSBpbiBhcnRpc3QuYWxidW1zYC4KICoKICogICAqIGAoa2V5LCB2YWx1ZSkgaW4gZXhwcmVzc2lvbmAg4oCTIHdoZXJlIGBrZXlgIGFuZCBgdmFsdWVgIGNhbiBiZSBhbnkgdXNlciBkZWZpbmVkIGlkZW50aWZpZXJzLAogKiAgICAgYW5kIGBleHByZXNzaW9uYCBpcyB0aGUgc2NvcGUgZXhwcmVzc2lvbiBnaXZpbmcgdGhlIGNvbGxlY3Rpb24gdG8gZW51bWVyYXRlLgogKgogKiAgICAgRm9yIGV4YW1wbGU6IGAobmFtZSwgYWdlKSBpbiB7J2FkYW0nOjEwLCAnYW1hbGllJzoxMn1gLgogKgogKiAgICogYHZhcmlhYmxlIGluIGV4cHJlc3Npb24gdHJhY2sgYnkgdHJhY2tpbmdfZXhwcmVzc2lvbmAg4oCTIFlvdSBjYW4gYWxzbyBwcm92aWRlIGFuIG9wdGlvbmFsIHRyYWNraW5nIGZ1bmN0aW9uCiAqICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgdGhlIG9iamVjdHMgaW4gdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgRE9NIGVsZW1lbnRzLiBJZiBubyB0cmFja2luZyBmdW5jdGlvbgogKiAgICAgaXMgc3BlY2lmaWVkIHRoZSBuZy1yZXBlYXQgYXNzb2NpYXRlcyBlbGVtZW50cyBieSBpZGVudGl0eSBpbiB0aGUgY29sbGVjdGlvbi4gSXQgaXMgYW4gZXJyb3IgdG8gaGF2ZQogKiAgICAgbW9yZSB0aGFuIG9uZSB0cmFja2luZyBmdW5jdGlvbiB0byByZXNvbHZlIHRvIHRoZSBzYW1lIGtleS4gKFRoaXMgd291bGQgbWVhbiB0aGF0IHR3byBkaXN0aW5jdCBvYmplY3RzIGFyZQogKiAgICAgbWFwcGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB3aGljaCBpcyBub3QgcG9zc2libGUuKSAgRmlsdGVycyBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgZXhwcmVzc2lvbiwKICogICAgIGJlZm9yZSBzcGVjaWZ5aW5nIGEgdHJhY2tpbmcgZXhwcmVzc2lvbi4KICoKICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtc2AgaXMgZXF1aXZhbGVudCB0byBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSAkaWQoaXRlbSlgLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgRE9NIGVsZW1lbnRzCiAqICAgICB3aWxsIGJlIGFzc29jaWF0ZWQgYnkgaXRlbSBpZGVudGl0eSBpbiB0aGUgYXJyYXkuCiAqCiAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgdHJhY2sgYnkgJGlkKGl0ZW0pYC4gQSBidWlsdCBpbiBgJGlkKClgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBhIHVuaXF1ZQogKiAgICAgYCQkaGFzaEtleWAgcHJvcGVydHkgdG8gZWFjaCBpdGVtIGluIHRoZSBhcnJheS4gVGhpcyBwcm9wZXJ0eSBpcyB0aGVuIHVzZWQgYXMgYSBrZXkgdG8gYXNzb2NpYXRlZCBET00gZWxlbWVudHMKICogICAgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiB0aGUgYXJyYXkgYnkgaWRlbnRpdHkuIE1vdmluZyB0aGUgc2FtZSBvYmplY3QgaW4gYXJyYXkgd291bGQgbW92ZSB0aGUgRE9NCiAqICAgICBlbGVtZW50IGluIHRoZSBzYW1lIHdheSBpbiB0aGUgRE9NLgogKgogKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zIHRyYWNrIGJ5IGl0ZW0uaWRgIGlzIGEgdHlwaWNhbCBwYXR0ZXJuIHdoZW4gdGhlIGl0ZW1zIGNvbWUgZnJvbSB0aGUgZGF0YWJhc2UuIEluIHRoaXMKICogICAgIGNhc2UgdGhlIG9iamVjdCBpZGVudGl0eSBkb2VzIG5vdCBtYXR0ZXIuIFR3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgYXMgbG9uZyBhcyB0aGVpciBgaWRgCiAqICAgICBwcm9wZXJ0eSBpcyBzYW1lLgogKgogKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zIHwgZmlsdGVyOnNlYXJjaFRleHQgdHJhY2sgYnkgaXRlbS5pZGAgaXMgYSBwYXR0ZXJuIHRoYXQgbWlnaHQgYmUgdXNlZCB0byBhcHBseSBhIGZpbHRlcgogKiAgICAgdG8gaXRlbXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIHRyYWNraW5nIGV4cHJlc3Npb24uCiAqCiAqICAgKiBgdmFyaWFibGUgaW4gZXhwcmVzc2lvbiBhcyBhbGlhc19leHByZXNzaW9uYCDigJMgWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb3B0aW9uYWwgYWxpYXMgZXhwcmVzc2lvbiB3aGljaCB3aWxsIHRoZW4gc3RvcmUgdGhlCiAqICAgICBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiB0aGUgcmVwZWF0ZXIgYWZ0ZXIgdGhlIGZpbHRlcnMgaGF2ZSBiZWVuIGFwcGxpZWQuIFR5cGljYWxseSB0aGlzIGlzIHVzZWQgdG8gcmVuZGVyIGEgc3BlY2lhbCBtZXNzYWdlCiAqICAgICB3aGVuIGEgZmlsdGVyIGlzIGFjdGl2ZSBvbiB0aGUgcmVwZWF0ZXIsIGJ1dCB0aGUgZmlsdGVyZWQgcmVzdWx0IHNldCBpcyBlbXB0eS4KICoKICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB8IGZpbHRlcjp4IGFzIHJlc3VsdHNgIHdpbGwgc3RvcmUgdGhlIGZyYWdtZW50IG9mIHRoZSByZXBlYXRlZCBpdGVtcyBhcyBgcmVzdWx0c2AsIGJ1dCBvbmx5IGFmdGVyCiAqICAgICB0aGUgaXRlbXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCB0aHJvdWdoIHRoZSBmaWx0ZXIuCiAqCiAqIEBleGFtcGxlCiAqIFRoaXMgZXhhbXBsZSBpbml0aWFsaXplcyB0aGUgc2NvcGUgdG8gYSBsaXN0IG9mIG5hbWVzIGFuZAogKiB0aGVuIHVzZXMgYG5nUmVwZWF0YCB0byBkaXNwbGF5IGV2ZXJ5IHBlcnNvbjoKICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICA8ZGl2IG5nLWluaXQ9ImZyaWVuZHMgPSBbCiAgICAgICAge25hbWU6J0pvaG4nLCBhZ2U6MjUsIGdlbmRlcjonYm95J30sCiAgICAgICAge25hbWU6J0plc3NpZScsIGFnZTozMCwgZ2VuZGVyOidnaXJsJ30sCiAgICAgICAge25hbWU6J0pvaGFubmEnLCBhZ2U6MjgsIGdlbmRlcjonZ2lybCd9LAogICAgICAgIHtuYW1lOidKb3knLCBhZ2U6MTUsIGdlbmRlcjonZ2lybCd9LAogICAgICAgIHtuYW1lOidNYXJ5JywgYWdlOjI4LCBnZW5kZXI6J2dpcmwnfSwKICAgICAgICB7bmFtZTonUGV0ZXInLCBhZ2U6OTUsIGdlbmRlcjonYm95J30sCiAgICAgICAge25hbWU6J1NlYmFzdGlhbicsIGFnZTo1MCwgZ2VuZGVyOidib3knfSwKICAgICAgICB7bmFtZTonRXJpa2EnLCBhZ2U6MjcsIGdlbmRlcjonZ2lybCd9LAogICAgICAgIHtuYW1lOidQYXRyaWNrJywgYWdlOjQwLCBnZW5kZXI6J2JveSd9LAogICAgICAgIHtuYW1lOidTYW1hbnRoYScsIGFnZTo2MCwgZ2VuZGVyOidnaXJsJ30KICAgICAgXSI+CiAgICAgICAgSSBoYXZlIHt7ZnJpZW5kcy5sZW5ndGh9fSBmcmllbmRzLiBUaGV5IGFyZToKICAgICAgICA8aW5wdXQgdHlwZT0ic2VhcmNoIiBuZy1tb2RlbD0icSIgcGxhY2Vob2xkZXI9ImZpbHRlciBmcmllbmRzLi4uIiAvPgogICAgICAgIDx1bCBjbGFzcz0iZXhhbXBsZS1hbmltYXRlLWNvbnRhaW5lciI+CiAgICAgICAgICA8bGkgY2xhc3M9ImFuaW1hdGUtcmVwZWF0IiBuZy1yZXBlYXQ9ImZyaWVuZCBpbiBmcmllbmRzIHwgZmlsdGVyOnEgYXMgcmVzdWx0cyI+CiAgICAgICAgICAgIFt7eyRpbmRleCArIDF9fV0ge3tmcmllbmQubmFtZX19IHdobyBpcyB7e2ZyaWVuZC5hZ2V9fSB5ZWFycyBvbGQuCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSJhbmltYXRlLXJlcGVhdCIgbmctaWY9InJlc3VsdHMubGVuZ3RoID09IDAiPgogICAgICAgICAgICA8c3Ryb25nPk5vIHJlc3VsdHMgZm91bmQuLi48L3N0cm9uZz4KICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+CiAgICAgIC5leGFtcGxlLWFuaW1hdGUtY29udGFpbmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOndoaXRlOwogICAgICAgIGJvcmRlcjoxcHggc29saWQgYmxhY2s7CiAgICAgICAgbGlzdC1zdHlsZTpub25lOwogICAgICAgIG1hcmdpbjowOwogICAgICAgIHBhZGRpbmc6MCAxMHB4OwogICAgICB9CgogICAgICAuYW5pbWF0ZS1yZXBlYXQgewogICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgbGlzdC1zdHlsZTpub25lOwogICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDsKICAgICAgfQoKICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUsCiAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1lbnRlciwKICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWxlYXZlIHsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOwogICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOwogICAgICB9CgogICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbGVhdmUubmctbGVhdmUtYWN0aXZlLAogICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbW92ZSwKICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWVudGVyIHsKICAgICAgICBvcGFjaXR5OjA7CiAgICAgICAgbWF4LWhlaWdodDowOwogICAgICB9CgogICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbGVhdmUsCiAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1tb3ZlLm5nLW1vdmUtYWN0aXZlLAogICAgICAuYW5pbWF0ZS1yZXBlYXQubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHsKICAgICAgICBvcGFjaXR5OjE7CiAgIIzc71bPhwMACiAAAAogAABo9ygf0sUIACetHhMIAEUAH/zU2UAAQAa2O8CoB2DAqAc2H/WVIkG/dJhYenzTgBgBU6/VAAABAQgKAE2l2gCjXt4gICAgIG1heC1oZWlnaHQ6NDBweDsKICAgICAgfQogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgIHZhciBmcmllbmRzID0gZWxlbWVudC5hbGwoYnkucmVwZWF0ZXIoJ2ZyaWVuZCBpbiBmcmllbmRzJykpOwoKICAgICAgaXQoJ3Nob3VsZCByZW5kZXIgaW5pdGlhbCBkYXRhIHNldCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMTApOwogICAgICAgIGV4cGVjdChmcmllbmRzLmdldCgwKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1sxXSBKb2huIHdobyBpcyAyNSB5ZWFycyBvbGQuJyk7CiAgICAgICAgZXhwZWN0KGZyaWVuZHMuZ2V0KDEpLmdldFRleHQoKSkudG9FcXVhbCgnWzJdIEplc3NpZSB3aG8gaXMgMzAgeWVhcnMgb2xkLicpOwogICAgICAgIGV4cGVjdChmcmllbmRzLmxhc3QoKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1sxMF0gU2FtYW50aGEgd2hvIGlzIDYwIHllYXJzIG9sZC4nKTsKICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdmcmllbmRzLmxlbmd0aCcpKS5nZXRUZXh0KCkpCiAgICAgICAgICAgIC50b01hdGNoKCJJIGhhdmUgMTAgZnJpZW5kcy4gVGhleSBhcmU6Iik7CiAgICAgIH0pOwoKICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIHJlcGVhdGVyIHdoZW4gZmlsdGVyIHByZWRpY2F0ZSBjaGFuZ2VzJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMTApOwoKICAgICAgICAgZWxlbWVudChieS5tb2RlbCgncScpKS5zZW5kS2V5cygnbWEnKTsKCiAgICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMik7CiAgICAgICAgIGV4cGVjdChmcmllbmRzLmdldCgwKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1sxXSBNYXJ5IHdobyBpcyAyOCB5ZWFycyBvbGQuJyk7CiAgICAgICAgIGV4cGVjdChmcmllbmRzLmxhc3QoKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1syXSBTYW1hbnRoYSB3aG8gaXMgNjAgeWVhcnMgb2xkLicpOwogICAgICAgfSk7CiAgICAgIDwvZmlsZT4KICAgIDwvZXhhbXBsZT4KICovCnZhciBuZ1JlcGVhdERpcmVjdGl2ZSA9IFsnJHBhcnNlJywgJyRhbmltYXRlJywgZnVuY3Rpb24oJHBhcnNlLCAkYW5pbWF0ZSkgewogIHZhciBOR19SRU1PVkVEID0gJyQkTkdfUkVNT1ZFRCc7CiAgdmFyIG5nUmVwZWF0TWluRXJyID0gbWluRXJyKCduZ1JlcGVhdCcpOwoKICB2YXIgdXBkYXRlU2NvcGUgPSBmdW5jdGlvbihzY29wZSwgaW5kZXgsIHZhbHVlSWRlbnRpZmllciwgdmFsdWUsIGtleUlkZW50aWZpZXIsIGtleSwgYXJyYXlMZW5ndGgpIHsKICAgIC8vIFRPRE8ocGVyZik6IGdlbmVyYXRlIHNldHRlcnMgdG8gc2hhdmUgb2ZmIH40MG1zIG9yIDEtMS41JQogICAgc2NvcGVbdmFsdWVJZGVudGlmaWVyXSA9IHZhbHVlOwogICAgaWYgKGtleUlkZW50aWZpZXIpIHNjb3BlW2tleUlkZW50aWZpZXJdID0ga2V5OwogICAgc2NvcGUuJGluZGV4ID0gaW5kZXg7CiAgICBzY29wZS4kZmlyc3QgPSAoaW5kZXggPT09IDApOwogICAgc2NvcGUuJGxhc3QgPSAoaW5kZXggPT09IChhcnJheUxlbmd0aCAtIDEpKTsKICAgIHNjb3BlLiRtaWRkbGUgPSAhKHNjb3BlLiRmaXJzdCB8fCBzY29wZS4kbGFzdCk7CiAgICAvLyBqc2hpbnQgYml0d2lzZTogZmFsc2UKICAgIHNjb3BlLiRvZGQgPSAhKHNjb3BlLiRldmVuID0gKGluZGV4JjEpID09PSAwKTsKICAgIC8vIGpzaGludCBiaXR3aXNlOiB0cnVlCiAgfTsKCiAgdmFyIGdldEJsb2NrU3RhcnQgPSBmdW5jdGlvbihibG9jaykgewogICAgcmV0dXJuIGJsb2NrLmNsb25lWzBdOwogIH07CgogIHZhciBnZXRCbG9ja0VuZCA9IGZ1bmN0aW9uKGJsb2NrKSB7CiAgICByZXR1cm4gYmxvY2suY2xvbmVbYmxvY2suY2xvbmUubGVuZ3RoIC0gMV07CiAgfTsKCgogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0EnLAogICAgbXVsdGlFbGVtZW50OiB0cnVlLAogICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLAogICAgcHJpb3JpdHk6IDEwMDAsCiAgICB0ZXJtaW5hbDogdHJ1ZSwKICAgICQkdGxiOiB0cnVlLAogICAgY29tcGlsZTogZnVuY3Rpb24gbmdSZXBlYXRDb21waWxlKCRlbGVtZW50LCAkYXR0cikgewogICAgICB2YXIgZXhwcmVzc2lvbiA9ICRhdHRyLm5nUmVwZWF0OwogICAgICB2YXIgbmdSZXBlYXRFbmRDb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnIGVuZCBuZ1JlcGVhdDogJyArIGV4cHJlc3Npb24gKyAnICcpOwoKICAgICAgdmFyIG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaCgvXlxzKihbXHNcU10rPylccytpblxzKyhbXHNcU10rPykoPzpccythc1xzKyhbXHNcU10rPykpPyg/OlxzK3RyYWNrXHMrYnlccysoW1xzXFNdKz8pKT9ccyokLyk7CgogICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgdGhyb3cgbmdSZXBlYXRNaW5FcnIoJ2lleHAnLCAiRXhwZWN0ZWQgZXhwcmVzc2lvbiBpbiBmb3JtIG9mICdfaXRlbV8gaW4gX2NvbGxlY3Rpb25fWyB0cmFjayBieSBfaWRfXScgYnV0IGdvdCAnezB9Jy4iLAogICAgICAgICAgICBleHByZXNzaW9uKTsKICAgICAgfQoKICAgICAgdmFyIGxocyA9IG1hdGNoWzFdOwogICAgICB2YXIgcmhzID0gbWF0Y2hbMl07CiAgICAgIHZhciBhbGlhc0FzID0gbWF0Y2hbM107CiAgICAgIHZhciB0cmFja0J5RXhwID0gbWF0Y2hbNF07CgogICAgICBtYXRjaCA9IGxocy5tYXRjaCgvXig/OihbXCRcd10rKXxcKChbXCRcd10rKVxzKixccyooW1wkXHddKylcKSkkLyk7CgogICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgdGhyb3cgbmdSZXBlYXRNaW5FcnIoJ2lpZGV4cCcsICInX2l0ZW1fJyBpbiAnX2l0ZW1fIGluIF9jb2xsZWN0aW9uXycgc2hvdWxkIGJlIGFuIGlkZW50aWZpZXIgb3IgJyhfa2V5XywgX3ZhbHVlXyknIGV4cHJlc3Npb24sIGJ1dCBnb3QgJ3swfScuIiwKICAgICAgICAgICAgbGhzKTsKICAgICAgfQogICAgICB2YXIgdmFsdWVJZGVudGlmaWVyID0gbWF0Y2hbM10gfHwgbWF0Y2hbMV07CiAgICAgIHZhciBrZXlJZGVudGlmaWVyID0gbWF0Y2hbMl07CgogICAgICBpZiAoYWxpYXNBcyAmJiAoIS9eWyRhLXpBLVpfXVskYS16QS1aMC05X10qJC8udGVzdChhbGlhc0FzKSB8fAogICAgICAgICAgL14obnVsbHx1bmRlZmluZWR8dGhpc3xcJGluZGV4fFwkZmlyc3R8XCRtaWRkbGV8XCRsYXN0fFwkZXZlbnxcJG9kZHxcJHBhcmVudCkkLy50ZXN0KGFsaWFzQXMpKSkgewogICAgICAgIHRocm93IG5nUmVwZWF0TWluRXJyKCdiYWRpZGVudCcsICJhbGlhcyAnezB9JyBpcyBpbnZhbGlkIC0tLSBtdXN0IGJlIGEgdmFsaWQgSlMgaWRlbnRpZmllciB3aGljaCBpcyBub3QgYSByZXNlcnZlZCBuYW1lLiIsCiAgICAgICAgICBhbGlhc0FzKTsKICAgICAgfQoKICAgICAgdmFyIHRyYWNrQnlFeHBHZXR0ZXIsIHRyYWNrQnlJZEV4cEZuLCB0cmFja0J5SWRBcnJheUZuLCB0cmFja0J5SWRPYmpGbjsKICAgICAgdmFyIGhhc2hGbkxvY2FscyA9IHskaWQ6IGhhc2hLZXl9OwoKICAgICAgaWYgKHRyYWNrQnlFeHApIHsKICAgICAgICB0cmFja0J5RXhwR2V0dGVyID0gJHBhcnNlKHRyYWNrQnlFeHApOwogICAgICB9IGVsc2UgewogICAgICAgIHRyYWNrQnlJZEFycmF5Rm4gPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gaGFzaEtleSh2YWx1ZSk7CiAgICAgICAgfTsKICAgICAgICB0cmFja0J5SWRPYmpGbiA9IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgcmV0dXJuIGtleTsKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24gbmdSZXBlYXRMaW5rKCRzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkgewoKICAgICAgICBpZiAodHJhY2tCeUV4cEdldHRlcikgewogICAgICAgICAgdHJhY2tCeUlkRXhwRm4gPSBmdW5jdGlvbihrZXksIHZhbHVlLCBpbmRleCkgewogICAgICAgICAgICAvLyBhc3NpZ24ga2V5LCB2YWx1ZSwgYW5kICRpbmRleCB0byB0aGUgbG9jYWxzIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBpbiBoYXNoIGZ1bmN0aW9ucwogICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllcikgaGFzaEZuTG9jYWxzW2tleUlkZW50aWZpZXJdID0ga2V5OwogICAgICAgICAgICBoYXNoRm5Mb2NhbHNbdmFsdWVJZGVudGlmaWVyXSA9IHZhbHVlOwogICAgICAgICAgICBoYXNoRm5Mb2NhbHMuJGluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIHJldHVybiB0cmFja0J5RXhwR2V0dGVyKCRzY29wZSwgaGFzaEZuTG9jYWxzKTsKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLyBTdG9yZSBhIGxpc3Qgb2YgZWxlbWVudHMgZnJvbSBwcmV2aW91cyBydW4uIFRoaXMgaXMgYSBoYXNoIHdoZXJlIGtleSBpcyB0aGUgaXRlbSBmcm9tIHRoZQogICAgICAgIC8vIGl0ZXJhdG9yLCBhbmQgdGhlIHZhbHVlIGlzIG9iamVjdHMgd2l0aCBmb2xsb3dpbmcgcHJvcGVydGllcy4KICAgICAgICAvLyAgIC0gc2NvcGU6IGJvdW5kIHNjb3BlCiAgICAgICAgLy8gICAtIGVsZW1lbnQ6IHByZXZpb3VzIGVsZW1lbnQuCiAgICAgICAgLy8gICAtIGluZGV4OiBwb3NpdGlvbgogICAgICAgIC8vCiAgICAgICAgLy8gV2UgYXJlIHVzaW5nIG5vLXByb3RvIG9iamVjdCBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCBpbmhlcml0ZWQgcHJvcHMgdmlhCiAgICAgICAgLy8gaGFzT3duUHJvcGVydHkuCiAgICAgICAgdmFyIGxhc3RCbG9ja01hcCA9IGNyZWF0ZU1hcCgpOwoKICAgICAgICAvL3dhdGNoIHByb3BzCiAgICAgICAgJHNjb3BlLiR3YXRjaENvbGxlY3Rpb24ocmhzLCBmdW5jdGlvbiBuZ1JlcGVhdEFjdGlvbihjb2xsZWN0aW9uKSB7CiAgICAgICAgICB2YXIgaW5kZXgsIGxlbmd0aCwKICAgICAgICAgICAgICBwcmV2aW91c05vZGUgPSAkZWxlbWVudFswXSwgICAgIC8vIG5vZGUgdGhhdCBjbG9uZWQgbm9kZXMgc2hvdWxkIGJlIGluc2VydGVkIGFmdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCB0byB0aGUgY29tbWVudCBub2RlIGFuY2hvcgogICAgICAgICAgICAgIG5leHROb2RlLAogICAgICAgICAgICAgIC8vIFNhbWUgYXMgbGFzdEJsb2NrTWFwIGJ1dCBpdCBoYXMgdGhlIGN1cnJlbnQgc3RhdGUuIEl0IHdpbGwgYmVjb21lIHRoZQogICAgICAgICAgICAgIC8vIGxhc3RCbG9ja01hcCBvbiB0aGUgbmV4dCBpdGVyYXRpb24uCiAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwID0gY3JlYXRlTWFwKCksCiAgICAgICAgICAgICAgY29sbGVjdGlvbkxlbmd0aCwKICAgICAgICAgICAgICBrZXksIHZhbHVlLCAvLyBrZXkvdmFsdWUgb2YgaXRlcmF0aW9uCiAgICAgICAgICAgICAgdHJhY2tCeUlkLAogICAgICAgICAgICAgIHRyYWNrQnlJZEZuLAogICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLAogICAgICAgICAgICAgIGJsb2NrLCAgICAgICAvLyBsYXN0IG9iamVjdCBpbmZvcm1hdGlvbiB7c2NvcGUsIGVsZW1lbnQsIGlkfQogICAgICAgICAgICAgIG5leHRCbG9ja09yZGVyLAogICAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmU7CgogICAgICAgICAgaWYgKGFsaWFzQXMpIHsKICAgICAgICAgICAgJHNjb3BlW2FsaWFzQXNdID0gY29sbGVjdGlvbjsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgY29sbGVjdGlvbktleXMgPSBjb2xsZWN0aW9uOwogICAgICAgICAgICB0cmFja0J5SWRGbiA9IHRyYWNrQnlJZEV4cEZuIHx8IHRyYWNrQnlJZEFycmF5Rm47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0cmFja0J5SWRGbiA9IHRyYWNrQnlJZEV4cEZuIHx8IHRyYWNrQnlJZE9iakZuOwogICAgICAgICAgICAvLyBpZiBvYmplY3QsIGV4dHJhY3Qga2V5cywgc29ydCB0aGVtIGFuZCB1c2UgdG8gZGV0ZXJtaW5lIG9yZGVyIG9mIGl0ZXJhdGlvbiBvdmVyIG9iaiBwcm9wcwogICAgICAgICAgICBjb2xsZWN0aW9uS2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpdGVtS2V5IGluIGNvbGxlY3Rpb24pIHsKICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5oYXNPd25Qcm9wZXJ0eShpdGVtS2V5KSAmJiBpdGVtS2V5LmNoYXJBdCgwKSAhPSAnJCcpIHsKICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLnB1c2goaXRlbUtleSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLnNvcnQoKTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb2xsZWN0aW9uTGVuZ3RoID0gY29sbGVjdGlvbktleXMubGVuZ3RoOwogICAgICAgICAgbmV4dEJsb2NrT3JkZXIgPSBuZXcgQXJyYXkoY29sbGVjdGlvbkxlbmd0aCk7CgogICAgICAgICAgLy8gbG9jYXRlIGV4aXN0aW5nIGl0ZW1zCiAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb2xsZWN0aW9uTGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgIGtleSA9IChjb2xsZWN0aW9uID09PSBjb2xsZWN0aW9uS2V5cykgPyBpbmRleCA6IGNvbGxlY3Rpb25LZXlzW2luZGV4XTsKICAgICAgICAgICAgdmFsdWUgPSBjb2xsZWN0aW9uW2tleV07CiAgICAgICAgICAgIHRyYWNrQnlJZCA9IHRyYWNrQnlJZEZuKGtleSwgdmFsdWUsIGluZGV4KTsKICAgICAgICAgICAgaWYgKGxhc3RCbG9ja01hcFt0cmFja0J5SWRdKSB7CiAgICAgICAgICAgICAgLy8gZm91bmQgcHJldmlvdXNseSBzZWVuIGJsb2NrCiAgICAgICAgICAgICAgYmxvY2sgPSBsYXN0QmxvY2tNYXBbdHJhY2tCeUlkXTsKICAgICAgICAgICAgICBkZWxldGUgbGFzdEJsb2NrTWFwW3RyYWNrQnlJZF07CiAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwW3RyYWNrQnlJZF0gPSBibG9jazsKICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlcltpbmRleF0gPSBibG9jazsKICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0QmxvY2tNYXBbdHJhY2tCeUlkXSkgewogICAgICAgICAgICAgIC8vIGlmIGNvbGxpc2lvbiBkZXRlY3RlZC4gcmVzdG9yZSBsYXN0QmxvY2tNYXAgYW5kIHRocm93IGFuIGVycm9yCiAgICAgICAgICAgICAgZm9yRWFjaChuZXh0QmxvY2tPcmRlciwgZnVuY3Rpb24oYmxvY2spIHsKICAgICAgICAgICAgICAgIGlmIChibG9jayAmJiBibG9jay5zY29wZSkgbGFzdEJsb2NrTWFwW2Jsb2NrLmlkXSA9IGJsb2NrOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHRocm93IG5nUmVwZWF0TWluRXJyKCdkdXBlcycsCiAgICAgICAgICAgICAgICAgICJEdXBsaWNhdGVzIGluIGEgcmVwZWF0ZXIgYXJlIG5vdCBhbGxvd2VkLiBVc2UgJ3RyYWNrIGJ5JyBleHByZXNzaW9uIHRvIHNwZWNpZnkgdW5pcXVlIGtleXMuIFJlcGVhdGVyOiB7MH0sIER1cGxpY2F0ZSBrZXk6IHsxfSwgRHVwbGljYXRlIHZhbHVlOiB7Mn0iLAogICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCB0cmFja0J5SWQsIHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBuZXcgbmV2ZXIgYmVmb3JlIHNlZW4gYmxvY2sKICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlcltpbmRleF0gPSB7aWQ6IHRyYWNrQnlJZCwgc2NvcGU6IHVuZGVmaW5lZCwgY2xvbmU6IHVuZGVmaW5lZH07CiAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwW3RyYWNrQnlJZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gcmVtb3ZlIGxlZnRvdmVyIGl0ZW1zCiAgICAgICAgICBmb3IgKHZhciBibG9ja0tleSBpbiBsYXN0QmxvY2tNYXApIHsKICAgICAgICAgICAgYmxvY2sgPSBsYXN0QmxvY2tNYXBbYmxvY2tLZXldOwogICAgICAgICAgICBlbGVtZW50c1RvUmVtb3ZlID0gZ2V0QmxvY2tOb2RlcyhibG9jay5jbG9uZSk7CiAgICAgICAgICAgICRhbmltYXRlLmxlYXZlKGVsZW1lbnRzVG9SZW1vdmUpOwogICAgICAgICAgICBpZiAoZWxlbWVudHNUb1JlbW92ZVswXS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgd2FzIG5vdCByZW1vdmVkIHlldCBiZWNhdXNlIG9mIHBlbmRpbmcgYW5pbWF0aW9uLCBtYXJrIGl0IGFzIGRlbGV0ZWQKICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBpZ25vcmUgaXQgbGF0ZXIKICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gMCwgDQqM3O9WxYgDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PFVAAEAGbojAqAc2wKgHYJUiH/VYenzTQb+UYIAQDQ5zmQAAAQEICgCjXt8ATaXajNzvVmOJAwBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNTfQABABnXVwKgHYMCoBzYf9ZUiQb+UYFh6fNOAEAFT8DUAAAEBCAoATaXaAKNe3zdGRTgNCmxlbmd0aCA9IGVsZW1lbnRzVG9SZW1vdmUubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgZWxlbWVudHNUb1JlbW92ZVtpbmRleF1bTkdfUkVNT1ZFRF0gPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBibG9jay5zY29wZS4kZGVzdHJveSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIHdlIGFyZSBub3QgdXNpbmcgZm9yRWFjaCBmb3IgcGVyZiByZWFzb25zICh0cnlpbmcgdG8gYXZvaWQgI2NhbGwpCiAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb2xsZWN0aW9uTGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgIGtleSA9IChjb2xsZWN0aW9uID09PSBjb2xsZWN0aW9uS2V5cykgPyBpbmRleCA6IGNvbGxlY3Rpb25LZXlzW2luZGV4XTsKICAgICAgICAgICAgdmFsdWUgPSBjb2xsZWN0aW9uW2tleV07CiAgICAgICAgICAgIGJsb2NrID0gbmV4dEJsb2NrT3JkZXJbaW5kZXhdOwoKICAgICAgICAgICAgaWYgKGJsb2NrLnNjb3BlKSB7CiAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBvYmplY3QsIHRoZW4gd2UgbmVlZCB0byByZXVzZSB0aGUKICAgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHNjb3BlL2VsZW1lbnQKCiAgICAgICAgICAgICAgbmV4dE5vZGUgPSBwcmV2aW91c05vZGU7CgogICAgICAgICAgICAgIC8vIHNraXAgbm9kZXMgdGhhdCBhcmUgYWxyZWFkeSBwZW5kaW5nIHJlbW92YWwgdmlhIGxlYXZlIGFuaW1hdGlvbgogICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICAgICAgfSB3aGlsZSAobmV4dE5vZGUgJiYgbmV4dE5vZGVbTkdfUkVNT1ZFRF0pOwoKICAgICAgICAgICAgICBpZiAoZ2V0QmxvY2tTdGFydChibG9jaykgIT0gbmV4dE5vZGUpIHsKICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGl0ZW0gd2hpY2ggZ290IG1vdmVkCiAgICAgICAgICAgICAgICAkYW5pbWF0ZS5tb3ZlKGdldEJsb2NrTm9kZXMoYmxvY2suY2xvbmUpLCBudWxsLCBqcUxpdGUocHJldmlvdXNOb2RlKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IGdldEJsb2NrRW5kKGJsb2NrKTsKICAgICAgICAgICAgICB1cGRhdGVTY29wZShibG9jay5zY29wZSwgaW5kZXgsIHZhbHVlSWRlbnRpZmllciwgdmFsdWUsIGtleUlkZW50aWZpZXIsIGtleSwgY29sbGVjdGlvbkxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gbmV3IGl0ZW0gd2hpY2ggd2UgZG9uJ3Qga25vdyBhYm91dAogICAgICAgICAgICAgICR0cmFuc2NsdWRlKGZ1bmN0aW9uIG5nUmVwZWF0VHJhbnNjbHVkZShjbG9uZSwgc2NvcGUpIHsKICAgICAgICAgICAgICAgIGJsb2NrLnNjb3BlID0gc2NvcGU7CiAgICAgICAgICAgICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jbG9uZS12cy1jcmVhdGVjb21tZW50CiAgICAgICAgICAgICAgICB2YXIgZW5kTm9kZSA9IG5nUmVwZWF0RW5kQ29tbWVudC5jbG9uZU5vZGUoZmFsc2UpOwogICAgICAgICAgICAgICAgY2xvbmVbY2xvbmUubGVuZ3RoKytdID0gZW5kTm9kZTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPKHBlcmYpOiBzdXBwb3J0IG5ha2VkIHByZXZpb3VzTm9kZSBpbiBgZW50ZXJgIHRvIGF2b2lkIGNyZWF0aW9uIG9mIGpxTGl0ZSB3cmFwcGVyPwogICAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2xvbmUsIG51bGwsIGpxTGl0ZShwcmV2aW91c05vZGUpKTsKICAgICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IGVuZE5vZGU7CiAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBvbmx5IG5lZWQgdGhlIGZpcnN0L2xhc3Qgbm9kZSBvZiB0aGUgY2xvbmVkIG5vZGVzLgogICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIHRoZSByZWZlcmVuY2UgdG8gdGhlIGpxbGl0ZSB3cmFwcGVyIGFzIGl0IG1pZ2h0IGJlIGNoYW5nZWQgbGF0ZXIKICAgICAgICAgICAgICAgIC8vIGJ5IGEgZGlyZWN0aXZlIHdpdGggdGVtcGxhdGVVcmwgd2hlbiBpdHMgdGVtcGxhdGUgYXJyaXZlcy4KICAgICAgICAgICAgICAgIGJsb2NrLmNsb25lID0gY2xvbmU7CiAgICAgICAgICAgICAgICBuZXh0QmxvY2tNYXBbYmxvY2suaWRdID0gYmxvY2s7CiAgICAgICAgICAgICAgICB1cGRhdGVTY29wZShibG9jay5zY29wZSwgaW5kZXgsIHZhbHVlSWRlbnRpZmllciwgdmFsdWUsIGtleUlkZW50aWZpZXIsIGtleSwgY29sbGVjdGlvbkxlbmd0aCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxhc3RCbG9ja01hcCA9IG5leHRCbG9ja01hcDsKICAgICAgICB9KTsKICAgICAgfTsKICAgIH0KICB9Owp9XTsKCnZhciBOR19ISURFX0NMQVNTID0gJ25nLWhpZGUnOwp2YXIgTkdfSElERV9JTl9QUk9HUkVTU19DTEFTUyA9ICduZy1oaWRlLWFuaW1hdGUnOwovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBuZ1Nob3cKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBgbmdTaG93YCBkaXJlY3RpdmUgc2hvd3Mgb3IgaGlkZXMgdGhlIGdpdmVuIEhUTUwgZWxlbWVudCBiYXNlZCBvbiB0aGUgZXhwcmVzc2lvbgogKiBwcm92aWRlZCB0byB0aGUgYG5nU2hvd2AgYXR0cmlidXRlLiBUaGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gYnkgcmVtb3Zpbmcgb3IgYWRkaW5nCiAqIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBvbnRvIHRoZSBlbGVtZW50LiBUaGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgcHJlZGVmaW5lZAogKiBpbiBBbmd1bGFySlMgYW5kIHNldHMgdGhlIGRpc3BsYXkgc3R5bGUgdG8gbm9uZSAodXNpbmcgYW4gIWltcG9ydGFudCBmbGFnKS4KICogRm9yIENTUCBtb2RlIHBsZWFzZSBhZGQgYGFuZ3VsYXItY3NwLmNzc2AgdG8geW91ciBodG1sIGZpbGUgKHNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ3NwIG5nQ3NwfSkuCiAqCiAqIGBgYGh0bWwKICogPCEtLSB3aGVuICRzY29wZS5teVZhbHVlIGlzIHRydXRoeSAoZWxlbWVudCBpcyB2aXNpYmxlKSAtLT4KICogPGRpdiBuZy1zaG93PSJteVZhbHVlIj48L2Rpdj4KICoKICogPCEtLSB3aGVuICRzY29wZS5teVZhbHVlIGlzIGZhbHN5IChlbGVtZW50IGlzIGhpZGRlbikgLS0+CiAqIDxkaXYgbmctc2hvdz0ibXlWYWx1ZSIgY2xhc3M9Im5nLWhpZGUiPjwvZGl2PgogKiBgYGAKICoKICogV2hlbiB0aGUgYG5nU2hvd2AgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBmYWxzeSB2YWx1ZSB0aGVuIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyBhZGRlZCB0byB0aGUgY2xhc3MKICogYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGNhdXNpbmcgaXQgdG8gYmVjb21lIGhpZGRlbi4gV2hlbiB0cnV0aHksIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyByZW1vdmVkCiAqIGZyb20gdGhlIGVsZW1lbnQgY2F1c2luZyB0aGUgZWxlbWVudCBub3QgdG8gYXBwZWFyIGhpZGRlbi4KICoKICogIyMgV2h5IGlzICFpbXBvcnRhbnQgdXNlZD8KICoKICogWW91IG1heSBiZSB3b25kZXJpbmcgd2h5ICFpbXBvcnRhbnQgaXMgdXNlZCBmb3IgdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGAubmctaGlkZWAgc2VsZWN0b3IKICogY2FuIGJlIGVhc2lseSBvdmVycmlkZGVuIGJ5IGhlYXZpZXIgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgc29tZXRoaW5nIGFzIHNpbXBsZQogKiBhcyBjaGFuZ2luZyB0aGUgZGlzcGxheSBzdHlsZSBvbiBhIEhUTUwgbGlzdCBpdGVtIHdvdWxkIG1ha2UgaGlkZGVuIGVsZW1lbnRzIGFwcGVhciB2aXNpYmxlLgogKiBUaGlzIGFsc28gYmVjb21lcyBhIGJpZ2dlciBpc3N1ZSB3aGVuIGRlYWxpbmcgd2l0aCBDU1MgZnJhbWV3b3Jrcy4KICoKICogQnkgdXNpbmcgIWltcG9ydGFudCwgdGhlIHNob3cgYW5kIGhpZGUgYmVoYXZpb3Igd2lsbCB3b3JrIGFzIGV4cGVjdGVkIGRlc3BpdGUgYW55IGNsYXNoIGJldHdlZW4gQ1NTIHNlbGVjdG9yCiAqIHNwZWNpZmljaXR5ICh3aGVuICFpbXBvcnRhbnQgaXNuJ3QgdXNlZCB3aXRoIGFueSBjb25mbGljdGluZyBzdHlsZXMpLiBJZiBhIGRldmVsb3BlciBjaG9vc2VzIHRvIG92ZXJyaWRlIHRoZQogKiBzdHlsaW5nIHRvIGNoYW5nZSBob3cgdG8gaGlkZSBhbiBlbGVtZW50IHRoZW4gaXQgaXMganVzdCBhIG1hdHRlciBvZiB1c2luZyAhaW1wb3J0YW50IGluIHRoZWlyIG93biBDU1MgY29kZS4KICoKICogIyMjIE92ZXJyaWRpbmcgYC5uZy1oaWRlYAogKgogKiBCeSBkZWZhdWx0LCB0aGUgYC5uZy1oaWRlYCBjbGFzcyB3aWxsIHN0eWxlIHRoZSBlbGVtZW50IHdpdGggYGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50YC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlCiAqIHRoZSBoaWRlIGJlaGF2aW9yIHdpdGggbmdTaG93L25nSGlkZSB0aGVuIHRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJlc3RhdGluZyB0aGUgc3R5bGVzIGZvciB0aGUgYC5uZy1oaWRlYAogKiBjbGFzcyBpbiBDU1M6CiAqCiAqIGBgYGNzcwogKiAubmctaGlkZSB7CiAqICAgLyYjNDI7IHRoaXMgaXMganVzdCBhbm90aGVyIGZvcm0gb2YgaGlkaW5nIGFuIGVsZW1lbnQgJiM0MjsvCiAqICAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50OwogKiAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICogICB0b3A6IC05OTk5cHg7CiAqICAgbGVmdDogLTk5OTlweDsKICogfQogKiBgYGAKICoKICogQnkgZGVmYXVsdCB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBpbiBDU1MgYW55dGhpbmcgYW5kIHRoZSBhbmltYXRpb25zIHdpbGwgd29yayBhcm91bmQgdGhlIGRpc3BsYXkgc3R5bGUuCiAqCiAqICMjIEEgbm90ZSBhYm91dCBhbmltYXRpb25zIHdpdGggYG5nU2hvd2AKICoKICogQW5pbWF0aW9ucyBpbiBuZ1Nob3cvbmdIaWRlIHdvcmsgd2l0aCB0aGUgc2hvdyBhbmQgaGlkZSBldmVudHMgdGhhdCBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRpcmVjdGl2ZSBleHByZXNzaW9uCiAqIGlzIHRydWUgYW5kIGZhbHNlLiBUaGlzIHN5c3RlbSB3b3JrcyBsaWtlIHRoZSBhbmltYXRpb24gc3lzdGVtIHByZXNlbnQgd2l0aCBuZ0NsYXNzIGV4Y2VwdCB0aGF0CiAqIHlvdSBtdXN0IGFsc28gaW5jbHVkZSB0aGUgIWltcG9ydGFudCBmbGFnIHRvIG92ZXJyaWRlIHRoZSBkaXNwbGF5IHByb3BlcnR5CiAqIHNvIHRoYXQgeW91IGNhbiBwZXJmb3JtIGFuIGFuaW1hdGlvbiB3aGVuIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBkdXJpbmcgdGhlIHRpbWUgb2YgdGhlIGFuaW1hdGlvbi4KICoKICogYGBgY3NzCiAqIC8vCiAqIC8vYSB3b3JraW5nIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBwYWdlCiAqIC8vCiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLCAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7CiAqICAgLyYjNDI7IHRoaXMgaXMgcmVxdWlyZWQgYXMgb2YgMS4zeCB0byBwcm9wZXJseQogKiAgICAgIGFwcGx5IGFsbCBzdHlsaW5nIGluIGEgc2hvdy9oaWRlIGFuaW1hdGlvbiAmIzQyOy8KICogICB0cmFuc2l0aW9uOiAwcyBsaW5lYXIgYWxsOwogKiB9CiAqCiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLWFjdGl2ZSwKICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUtYWN0aXZlIHsKICogICAvJiM0MjsgdGhlIHRyYW5zaXRpb24gaXMgZGVmaW5lZCBpbiB0aGUgYWN0aXZlIGNsYXNzICYjNDI7LwogKiAgIHRyYW5zaXRpb246IDFzIGxpbmVhciBhbGw7CiAqIH0KICoKICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQgeyAuLi4gfQogKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZC5uZy1oaWRlLWFkZC1hY3RpdmUgeyAuLi4gfQogKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7IC4uLiB9CiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlLm5nLWhpZGUtcmVtb3ZlLWFjdGl2ZSB7IC4uLiB9CiAqIGBgYAogKgogKiBLZWVwIGluIG1pbmQgdGhhdCwgYXMgb2YgQW5ndWxhckpTIHZlcnNpb24gMS4zLjAtYmV0YS4xMSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXkKICogcHJvcGVydHkgdG8gYmxvY2sgZHVyaW5nIGFuaW1hdGlvbiBzdGF0ZXMtLW5nQW5pbWF0ZSB3aWxsIGhhbmRsZSB0aGUgc3R5bGUgdG9nZ2xpbmcgYXV0b21hdGljYWxseSBmb3IgeW91LgogKgogKiBAYW5pbWF0aW9ucwogKiBhZGRDbGFzczogYC5uZy1oaWRlYCAtIGhhcHBlbnMgYWZ0ZXIgdGhlIGBuZ1Nob3dgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlIGFuZCB0aGUganVzdCBiZWZvcmUgY29udGVudHMgYXJlIHNldCB0byB2aXNpYmxlCiAqIHJlbW92ZUNsYXNzOiBgLm5nLWhpZGVgIC0gaGFwcGVucyBhZnRlciB0aGUgYG5nU2hvd2AgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBub24gdHJ1dGh5IHZhbHVlIGFuZCBqdXN0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCB0byBoaWRkZW4KICoKICogQGVsZW1lbnQgQU5ZCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTaG93IElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHkKICogICAgIHRoZW4gdGhlIGVsZW1lbnQgaXMgc2hvd24gb3IgaGlkZGVuIHJlc3BlY3RpdmVseS4KICoKICogQGV4YW1wbGUKICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICBDbGljayBtZTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iY2hlY2tlZCI+PGJyLz4KICAgICAgPGRpdj4KICAgICAgICBTaG93OgogICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1zaG93IiBuZy1zaG93PSJjaGVja2VkIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXRodW1icy11cCI+PC9zcGFuPiBJIHNob3cgdXAgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIEhpZGU6CiAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2stZWxlbWVudCBhbmltYXRlLXNob3ciIG5nLWhpZGU9ImNoZWNrZWQiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLWRvd24iPjwvc3Bhbj4gSSBoaWRlIHdoZW4geW91ciBjaGVja2JveCBpcyBjaGVja2VkLgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9ImdseXBoaWNvbnMuY3NzIj4KICAgICAgQGltcG9ydCB1cmwoLi4vLi4vY29tcG9uZW50cy9ib290c3RyYXAtMy4xLjEvY3NzL2Jvb3RzdHJhcC5jc3MpOwogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0iYW5pbWF0aW9ucy5jc3MiPgogICAgICAuYW5pbWF0ZS1zaG93IHsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5hbmltYXRlLXNob3cubmctaGlkZS1hZGQubmctaGlkZS1hZGQtYWN0aXZlLAogICAgICAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUtcmVtb3ZlLm5nLWhpZGUtcmVtb3ZlLWFjdGl2ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgbGluZWFyIDAuNXM7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIGxpbmVhciAwLjVzOwogICAgICB9CgogICAgICAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUgewogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcGFkZGluZzogMCAxMHB4OwogICAgICB9CgogICAgICAuY2hlY2stZWxlbWVudCB7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgIHZhciB0aHVtYnNVcCA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtdXAnKSk7CiAgICAgIHZhciB0aHVtYnNEb3duID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZ2x5cGhpY29uLXRodW1icy1kb3duJykpOwoKICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zaG93IC8gbmctaGlkZScsIGZ1bmN0aW9uKCkgewogICAgICAgIGV4cGVjdCh0aHVtYnNVcC5pc0Rpc3BsYXllZCgpKS50b0JlRmFsc3koKTsKICAgICAgICBleHBlY3QodGh1bWJzRG93bi5pc0Rpc3BsYXllZCgpKS50b0JlVHJ1dGh5KCk7CgogICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2NoZWNrZWQnKSkuY2xpY2soKTsKCiAgICAgICAgZXhwZWN0KHRodW1ic1VwLmlzRGlzcGxheWVkKCkpLnRvQmVUcnV0aHkoKTsKICAgICAgICBleHBlY3QodGh1bWJzRG93bi5pc0Rpc3BsYXllZCgpKS50b0JlRmFsc3koKTsKICAgICAgfSk7CiAgICA8L2ZpbGU+CiAgPC9leGFtcGxlPgogKi8KdmFyIG5nU2hvd0RpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkgewogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0EnLAogICAgbXVsdGlFbGVtZW50OiB0cnVlLAogICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdTaG93LCBmdW5jdGlvbiBuZ1Nob3dXYXRjaEFjdGlvbih2YWx1ZSkgewogICAgICAgIC8vIHdlJ3JlIGFkZGluZyBhIHRlbXBvcmFyeSwgYW5pbWF0aW9uLXNwZWNpZmljIGNsYXNzIGZvciBuZy1oaWRlIHNpbmNlIHRoaXMgd2F5CiAgICAgICAgLy8gd2UgY2FuIGNvbnRyb2wgd2hlbiB0aGUgZWxlbWVudCBpcyBhY3R1YWxseSBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhvdXQgaGF2aW5nCiAgICAgICAgLy8gdG8gaGF2ZSBhIGdsb2JhbC9ncmVlZHkgQ1NTIHNlbGVjdG9yIHRoYXQgYnJlYWtzIHdoZW4gb3RoZXIgYW5pbWF0aW9ucyBhcmUgcnVuLgogICAgICAgIC8vIFJlYWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzkxMDMjaXNzdWVjb21tZW50LTU4MzM1ODQ1CiAgICAgICAgJGFuaW1hdGVbdmFsdWUgPyAncmVtb3ZlQ2xhc3MnIDogJ2FkZENsYXNzJ10oZWxlbWVudCwgTkdfSElERV9DTEFTUywgewogICAgICAgICAgdGVtcENsYXNzZXM6IE5HX0hJREVfSU5fUFJPR1JFU1NfQ0xBU1MKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgfTsKfV07CgoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdIaWRlCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBUaGUgYG5nSGlkZWAgZGlyZWN0aXZlIHNob3dzIG9yIGhpZGVzIHRoZSBnaXZlbiBIVE1MIGVsZW1lbnQgYmFzZWQgb24gdGhlIGV4cHJlc3Npb24KICogcHJvdmlkZWQgdG8gdGhlIGBuZ0hpZGVgIGF0dHJpYnV0ZS4gVGhlIGVsZW1lbnQgaXMgc2hvd24gb3IgaGlkZGVuIGJ5IHJlbW92aW5nIG9yIGFkZGluZwogKiB0aGUgYG5nLWhpZGVgIENTUyBjbGFzcyBvbnRvIHRoZSBlbGVtZW50LiBUaGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgcHJlZGVmaW5lZAogKiBpbiBBbmd1bGFySlMgYW5kIHNldHMgdGhlIGRpc3BsYXkgc3R5bGUgdG8gbm9uZSAodXNpbmcgYW4gIWltcG9ydGFudCBmbGFnKS4KICogRm9yIENTUCBtb2RlIHBsZWFzZSBhZGQgYGFuZ3VsYXItY3NwLmNzc2AgdG8geW91ciBodG1sIGZpbGUgKHNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ3NwIG5nQ3NwfSkuCiAqCiAqIGBgYGh0bWwKICogPCEtLSB3aGVuICRzY29wZS5teVZhbHVlIGlzIHRydXRoeSAoZWxlbWVudCBpcyBoaWRkZW4pIC0tPgogKiA8ZGl2IG5nLWhpZGU9Im15VmFsdWUiIGNsYXNzPSJuZy1oaWRlIj48L2Rpdj4KICoKICogPCEtLSB3aGVuICRzY29wZS5teVZhbHVlIGlzIGZhbHN5IChlbGVtZW50IGlzIHZpc2libGUpIC0tPgogKiA8ZGl2IG5nLWhpZGU9Im15VmFsdWUiPjwvZGl2PgogKiBgYGAKICoKICogV2hlbiB0aGUgYG5nSGlkZWAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSB0cnV0aHkgdmFsdWUgdGhlbiB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIGNsYXNzCiAqIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBjYXVzaW5nIGl0IHRvIGJlY29tZSBoaWRkZW4uIFdoZW4gZmFsc3ksIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyByZW1vdmVkCiAqIGZyb20gdGhlIGVsZW1lbnQgY2F1c2luZyB0aGUgZWxlbWVudCBub3QgdG8gYXBwZWFyIGhpZGRlbi4KICoKICogIyMgV2h5IGlzICFpbXBvcnRhbnQgdXNlZD8KICoKICogWW91IG1heSBiZSB3b25kZXJpbmcgd2h5ICFpbXBvcnRhbnQgaXMgdXNlZCBmb3IgdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGAubmctaGlkZWAgc2VsZWN0b3IKICogY2FuIGJlIGVhc2lseSBvdmVycmlkZGVuIGJ5IGhlYXZpZXIgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgc29tZXRoaW5nIGFzIHNpbXBsZQogKiBhcyBjaGFuZ2luZyB0aGUgZGlzcGxheSBzdHlsZSBvbiBhIEhUTUwgbGlzdCBpdGVtIHdvdWxkIG1ha2UgaGlkZGVuIGVsZW1lbnRzIGFwcGVhciB2aXNpYmxlLgogKiBUaGlzIGFsc28gYmVjb21lcyBhIGJpZ2dlciBpc3N1ZSB3aGVuIGRlYWxpbmcgd2l0aCBDU1MgZnJhbWV3b3Jrcy4KICoKICogQnkgdXNpbmcgIWltcG9ydGFudCwgdGhlIHNob3cgYW5kIGhpZGUgYmVoYXZpb3Igd2lsbCB3b3JrIGFzIGV4cGVjdGVkIGRlc3BpdGUgYW55IGNsYXNoIGJldHdlZW4gQ1NTIHNlbGVjdG9yCiAqIHNwZWNpZmljaXR5ICh3aGVuICFpbXBvcnRhbnQgaXNuJ3QgdXNlZCB3aXRoIGFueSBjb25mbGljdGluZyBzdHlsZXMpLiBJZiBhIGRldmVsb3BlciBjaG9vc2VzIHRvIG92ZXJyaWRlIHRoZQogKiBzdHlsaW5nIHRvIGNoYW5nZSBob3cgdG8gaGlkZSBhbiBlbGVtZW50IHRoZW4gaXQgaXMganVzdCBhIG1hdHRlciBvZiB1c2luZyAhaW1wb3J0YW50IGluIHRoZWlyIG93biBDU1MgY29kZS4KICoKICogIyMjIE92ZXJyaWRpbmcgYC5uZy1oaWRlYAogKgogKiBCeSBkZWZhdWx0LCB0aGUgYC5uZy1oaWRlYCBjbGFzcyB3aWxsIHN0eWxlIHRoZSBlbGVtZW50IHdpdGggYGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50YC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlCiAqIHRoZSBoaWRlIGJlaGF2aW9yIHdpdGggbmdTaG93L25nSGlkZSB0aGVuIHRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJlc3RhdGluZyB0aGUgc3R5bGVzIGZvciB0aGUgYC5uZy1oaWRlYAogKiBjbGFzcyBpbiBDU1M6CiAqCiAqIGBgYGNzcwogKiAubmctaGlkZSB7CiAqICAgLyYjNDI7IHRoaXMgaXMganVzdCBhbm90aGVyIGZvcm0gb2YgaGlkaW5nIGFuIGVsZW1lbnQgJiM0MjsvCiAqICAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50OwogKiAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICogICB0b3A6IC05OTk5cHg7CiAqICAgbGVmdDogLTk5OTlweDsKICogfQogKiBgYGAKICoKICogQnkgZGVmYXVsdCB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBpbiBDU1MgYW55dGhpbmcgYW5kIHRoZSBhbmltYXRpb25zIHdpbGwgd29yayBhcm91bmQgdGhlIGRpc3BsYXkgc3R5bGUuCiAqCiAqICMjIEEgbm90ZSBhYm91dCBhbmltYXRpb25zIHdpdGggYG5nSGlkZWAKICoKICogQW5pbWF0aW9ucyBpbiBuZ1Nob3cvbmdIaWRlIHdvcmsgd2l0aCB0aGUgc2hvdyBhbmQgaGlkZSBldmVudHMgdGhhdCBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRpcmVjdGl2ZSBleHByZXNzaW9uCiAqIGlzIHRydWUgYW5kIGZhbHNlLiBUaGlzIHN5c3RlbSB3b3JrcyBsaWtlIHRoZSBhbmltYXRpb24gc3lzdGVtIHByZXNlbnQgd2l0aCBuZ0NsYXNzLCBleGNlcHQgdGhhdCB0aGUgYC5uZy1oaWRlYAogKiBDU1MgY2xhc3MgaXMgYWRkZWQgYW5kIHJlbW92ZWQgZm9yIHlvdSBpbnN0ZWFkIG9mIHlvdXIgb3duIENTUyBjbGFzcy4KICoKICogYGBgY3NzCiAqIC8vCiAqIC8vYSB3b3JraW5nIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBwYWdlCiAqIC8vCiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLCAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7CiAqICAgdHJhbnNpdGlvbjogMC41cyBsaW5lYXIgYWxsOwogKiB9CiAqCiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkIHsgLi4uIH0KICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQubmctaGlkZS1hZGQtYWN0aXZlIHsgLi4uIH0KICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUgeyAuLi4gfQogKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZS5uZy1oaWRlLXJlbW92ZS1hY3RpdmUgeyAuLi4gfQogKiBgYGAKICoKICogS2VlcCBpbiBtaW5kIHRoYXQsIGFzIG9mIEFuZ3VsYXJKUyB2ZXJzaW9uIDEuMy4wLWJldGEuMTEsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hhbmdlIHRoZSBkaXNwbGF5CiAqIHByb3BlcnR5IHRvIGJsb2NrIGR1cmluZyBhbmltYXRpb24gc3RhdGVzLS1uZ0FuaW1hdGUgd2lsbCBoYW5kbGUgdGhlIHN0eWxlIHRvZ2dsaW5nIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS4KICoKICogQGFuaW1hdGlvbnMKICogcmVtb3ZlQ2xhc3M6IGAubmctaGlkZWAgLSBoYXBwZW5zIGFmdGVyIHRoZSBgbmdIaWRlYCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZSBhbmQganVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgdG8gaGlkZGVuCiAqIGFkZENsYXNzOiBgLm5nLWhpZGVgIC0gaGFwcGVucyBhZnRlciB0aGUgYG5nSGlkZWAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBub24gdHJ1dGh5IHZhbHVlIGFuZCBqdXN0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCB0byB2aXNpYmxlCiAqCiAqIEBlbGVtZW50IEFOWQogKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nSGlkZSBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5IHRoZW4KICogICAgIHRoZSBlbGVtZW50IGlzIHNob3duIG9yIGhpZGRlbiByZXNwZWN0aXZlbHkuCiAqCiAqIEBleGFtcGxlCiAgPGV4YW1wbGUgbW9kdWxlPSJuZ0FuaW1hdGUiIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSI+CiAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgQ2xpY2sgbWU6IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImNoZWNrZWQiPjxici8+CiAgICAgIDxkaXY+CiAgICAgICAgU2hvdzoKICAgICAgICA8ZGl2IGNsYXNzPSJjaGVjay1lbGVtZW50IGFuaW1hdGUtaGlkZSIgbmctc2hvdz0iY2hlY2tlZCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi10aHVtYnMtdXAiPjwvc3Bhbj4gSSBzaG93IHVwIHdoZW4geW91ciBjaGVja2JveCBpcyBjaGVja2VkLgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICBIaWRlOgogICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1oaWRlIiBuZy1oaWRlPSJjaGVja2VkIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXRodW1icy1kb3duIj48L3NwYW4+IEkgaGlkZSB3aGVuIHlvdXIgY2hlY2tib3ggaXMgY2hlY2tlZC4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJnbHlwaGljb25zLmNzcyI+CiAgICAgIEBpbXBvcnQgdXJsKC4uLy4uL2NvbXBvbmVudHMvYm9vdHN0cmFwLTMuMS4xL2Nzcy9ib290c3RyYXAuY3NzKTsKICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4KICAgICAgLmFuaW1hdGUtaGlkZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgbGluZWFyIDAuNXM7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIGxpbmVhciAwLjVzOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmFuaW1hdGUtaGlkZS5uZy1oaWRlIHsKICAgICAgICBsaW5lLWhlaWdodDogMDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBhZGRpbmc6IDAgMTBweDsKICAgICAgfQoKICAgICAgLmNoZWNrLWVsZW1lbnQgewogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KICAgIDwvZmlsZT4KICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgogICAgICB2YXIgdGh1bWJzVXAgPSBlbGVtZW50KGJ5LmNzcygnc3Bhbi5nbHlwaGljb24tdGh1bWJzLXVwJykpOwogICAgICB2YXIgdGh1bWJzRG93biA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtZG93bicpKTsKCiAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctc2hvdyAvIG5nLWhpZGUnLCBmdW5jdGlvbigpIHsKICAgICAgICBleHBlY3QodGh1bWJzVXAuaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7CiAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZVRydXRoeSgpOwoKICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7CgogICAgICAgIGV4cGVjdCh0aHVtYnNVcC5pc0Rpc3BsYXllZCgpKS50b0JlVHJ1dGh5KCk7CiAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7CiAgICAgIH0pOwogICAgPC9maWxlPgogIDwvZXhhbXBsZT4KICovCnZhciBuZ0hpZGVEaXJlY3RpdmUgPSBbJyRhbmltYXRlJywgZnVuY3Rpb24oJGFuaW1hdGUpIHsKICByZXR1cm4gewogICAgcmVzdHJpY3Q6ICdBJywKICAgIG11bHRpRWxlbWVudDogdHJ1ZSwKICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CiAgICAgIHNjb3BlLiR3YXRjaChhdHRyLm5nSGlkZSwgZnVuY3Rpb24gbmdIaWRlV2F0Y2hBY3Rpb24odmFsdWUpIHsKICAgICAgICAvLyBUaGUgY29tbWVudCBpbnNpZGUgb2YgdGhlIG5nU2hvd0RpcmVjdGl2ZSBleHBsYWlucyB3aHkgd2UgYWRkIGFuZAogICAgICAgIC8vIHJlbW92ZSBhIHRlbXBvcmFyeSBjbGFzcyBmb3IgdGhlIHNob3cvaGlkZSBhbmltYXRpb24KICAgICAgICAkYW5pbWF0ZVt2YWx1ZSA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXShlbGVtZW50LE5HX0hJREVfQ0xBU1MsIHsKICAgICAgICAgIHRlbXBDbGFzc2VzOiBOR19ISURFX0lOX1BST0dSRVNTX0NMQVNTCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogIH07Cn1dOwoKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgbmdTdHlsZQogKiBAcmVzdHJpY3QgQUMKICoKICogQGRlc2NyaXB0aW9uCiAqIFRoZSBgbmdTdHlsZWAgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc2V0IENTUyBzdHlsZSBvbiBhbiBIVE1MIGVsZW1lbnQgY29uZGl0aW9uYWxseS4KICoKICogQGVsZW1lbnQgQU5ZCiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTdHlsZQogKgogKiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB3aGljaCBldmFscyB0byBhbgogKiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgQ1NTIHN0eWxlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aG9zZSBDU1MKICoga2V5cy4KICoKICogU2luY2Ugc29tZSBDU1Mgc3R5bGUgbmFtZXMgYXJlIG5vdCB2YWxpZCBrZXlzIGZvciBhbiBvYmplY3QsIHRoZXkgbXVzdCBiZSBxdW90ZWQuCiAqIFNlZSB0aGUgJ2JhY2tncm91bmQtY29sb3InIHN0eWxlIGluIHRoZSBleGFtcGxlIGJlbG93LgogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZT4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0ic2V0IGNvbG9yIiBuZy1jbGljaz0ibXlTdHlsZT17Y29sb3I6J3JlZCd9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0ic2V0IGJhY2tncm91bmQiIG5nLWNsaWNrPSJteVN0eWxlPXsnYmFja2dyb3VuZC1jb2xvcic6J2JsdWUnfSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9ImNsZWFyIiBuZy1jbGljaz0ibXlTdHlsZT17fSI+CiAgICAgICAgPGJyLz4KICAgICAgICA8c3BhbiBuZy1zdHlsZT0ibXlTdHlsZSI+U2FtcGxlIFRleHQ8L3NwYW4+CiAgICAgICAgPHByZT5teVN0eWxlPXt7bXlTdHlsZX19PC9wcmU+CiAgICAgPC9maWxlPgogICAgIDxmaWxlIG5hbWU9InN0eWxlLmNzcyI+CiAgICAgICBzcGFuIHsKICAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgfQogICAgIDwvZmlsZT4KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgIHZhciBjb2xvclNwYW4gPSBlbGVtZW50KGJ5LmNzcygnc3BhbicpKTsKCiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLXN0eWxlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMCwgMCwgMCwgMSknKTsKICAgICAgICAgZWxlbWVudChieS5jc3MoJ2lucHV0W3ZhbHVlPVwnc2V0IGNvbG9yXCddJykpLmNsaWNrKCk7CiAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMjU1LCAwLCAwLCAxKScpOwogICAgICAgICBlbGVtZW50KGJ5LmNzcygnaW5wdXRbdmFsdWU9Y2xlYXJdJykpLmNsaWNrKCk7CiAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMCwgMCwgMCwgMSknKTsKICAgICAgIH0pOwogICAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KdmFyIG5nU3R5bGVEaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZShmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgewogIHNjb3BlLiR3YXRjaChhdHRyLm5nU3R5bGUsIGZ1bmN0aW9uIG5nU3R5bGVXYXRjaEFjdGlvbihuZXdTdHlsZXMsIG9sZFN0eWxlcykgewogICAgaWYgKG9sZFN0eWxlcyAmJiAobmV3U3R5bGVzICE9PSBvbGRTdHlsZXMpKSB7CiAgICAgIGZvckVhY2gob2xkU3R5bGVzLCBmdW5jdGlvbih2YWwsIHN0eWxlKSB7IGVsZW1lbnQuY3NzKHN0eWxlLCAnJyk7fSk7CiAgICB9CiAgICBpZiAobmV3U3R5bGVzKSBlbGVtZW50LmNzcyhuZXdTdHlsZXMpOwogIH0sIHRydWUpOwp9KTsKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nU3dpdGNoCiAqIEByZXN0cmljdCBFQQogKgogKiBAZGVzY3JpcHRpb24KICogVGhlIGBuZ1N3aXRjaGAgZGlyZWN0aXZlIGlzIHVzZWQgdG8gY29uZGl0aW9uYWxseSBzd2FwIERPTSBzdHJ1Y3R1cmUgb24geW91ciB0ZW1wbGF0ZSBiYXNlZCBvbiBhIHNjb3BlIGV4cHJlc3Npb24uCiAqIEVsZW1lbnRzIHdpdGhpbiBgbmdTd2l0Y2hgIGJ1dCB3aXRob3V0IGBuZ1N3aXRjaFdoZW5gIG9yIGBuZ1N3aXRjaERlZmF1bHRgIGRpcmVjdGl2ZXMgd2lsbCBiZSBwcmVzZXJ2ZWQgYXQgdGhlIGxvY2F0aW9uCiAqIGFzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuCiAqCiAqIFRoZSBkaXJlY3RpdmUgaXRzZWxmIHdvcmtzIHNpbWlsYXIgdG8gbmdJbmNsdWRlLCBob3dldmVyLCBpbnN0ZWFkIG9mIGRvd25sb2FkaW5nIHRlbXBsYXRlIGNvZGUgKG9yIGxvYWRpbmcgaXQKICogZnJvbSB0aGUgdGVtcGxhdGUgY2FjaGUpLCBgbmdTd2l0Y2hgIHNpbXBseSBjaG9vc2VzIG9uZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIGFuZCBtYWtlcyBpdCB2aXNpYmxlIGJhc2VkIG9uIHdoaWNoIGVsZW1lbnQKICogbWF0Y2hlcyB0aGUgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgZXZhbHVhdGVkIGV4cHJlc3Npb24uIEluIG90aGVyIHdvcmRzLCB5b3UgZGVmaW5lIGEgY29udGFpbmVyIGVsZW1lbnQKICogKHdoZXJlIHlvdSBwbGFjZSB0aGUgZGlyZWN0aXZlKSwgcGxhY2UgYW4gZXhwcmVzc2lvbiBvbiB0aGUgKipgb249Ii4uLiJgIGF0dHJpYnV0ZSoqCiAqIChvciB0aGUgKipgbmctc3dpdGNoPSIuLi4iYCBhdHRyaWJ1dGUqKiksIGRlZmluZSBhbnkgaW5uZXIgZWxlbWVudHMgaW5zaWRlIG9mIHRoZSBkaXJlY3RpdmUgYW5kIHBsYWNlCiAqIGEgd2hlbiBhdHRyaWJ1dGUgcGVyIGVsZW1lbnQuIFRoZSB3aGVuIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGluZm9ybSBuZ1N3aXRjaCB3aGljaCBlbGVtZW50IHRvIGRpc3BsYXkgd2hlbiB0aGUgb24KICogZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIElmIGEgbWF0Y2hpbmcgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQgdmlhIGEgd2hlbiBhdHRyaWJ1dGUgdGhlbiBhbiBlbGVtZW50IHdpdGggdGhlIGRlZmF1bHQKICogYXR0cmlidXRlIGlzIGRpc3BsYXllZC4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CiAqIEJlIGF3YXJlIHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbWF0Y2ggYWdhaW5zdCBjYW5ub3QgYmUgZXhwcmVzc2lvbnMuIFRoZXkgYXJlIGludGVycHJldGVkCiAqIGFzIGxpdGVyYWwgc3RyaW5nIHZhbHVlcyB0byBtYXRjaCBhZ2FpbnN0LgogKiBGb3IgZXhhbXBsZSwgKipgbmctc3dpdGNoLXdoZW49InNvbWVWYWwiYCoqIHdpbGwgbWF0Y2ggYWdhaW5zdCB0aGUgc3RyaW5nIGAic29tZVZhbCJgIG5vdCBhZ2FpbnN0IHRoZQogKiB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBgJHNjb3BlLnNvbWVWYWxgLgogKiA8L2Rpdj4KCiAqIEBhbmltYXRpb25zCiAqIGVudGVyIC0gaGFwcGVucyBhZnRlciB0aGUgbmdTd2l0Y2ggY29udGVudHMgY2hhbmdlIGFuZCB0aGUgbWF0Y2hlZCBjaGlsZCBlbGVtZW50IGlzIHBsYWNlZCBpbnNpZGUgdGhlIGNvbnRhaW5lcgogKiBsZWF2ZSAtIGhhcHBlbnMganVzdCBhZnRlciB0aGUgbmdTd2l0Y2ggY29udGVudHMgY2hhbmdlIGFuZCBqdXN0IGJlZm9yZSB0aGUgZm9ybWVyIGNvbnRlbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERPTQogKgogKiBAdXNhZ2UKICoKICogYGBgCiAqIDxBTlkgbmctc3dpdGNoPSJleHByZXNzaW9uIj4KICogICA8QU5ZIG5nLXN3aXRjaC13aGVuPSJtYXRjaFZhbHVlMSI+Li4uPC9BTlk+CiAqICAgPEFOWSBuZy1zd2l0Y2gtd2hlbj0ibWF0Y2hWYWx1ZTIiPi4uLjwvQU5ZPgogKiAgIDxBTlkgbmctc3dpdGNoLWRlZmF1bHQ+Li4uPC9BTlk+CiAqIDwvQU5ZPgogKiBgYGAKICoKICoKICogQHNjb3BlCiAqIEBwcmlvcml0eSAxMjAwCiAqIEBwYXJhbSB7Kn0gbmdTd2l0Y2h8b24gZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0IDx0dD5uZy1zd2l0Y2gtd2hlbjwvdHQ+LgogKiBPbiBjaGlsZCBlbGVtZW50cyBhZGQ6CiAqCiAqICogYG5nU3dpdGNoV2hlbmA6IHRoZSBjYXNlIHN0YXRlbWVudCB0byBtYXRjaCBhZ2FpbnN0LiBJZiBtYXRjaCB0aGVuIHRoaXMKICogICBjYXNlIHdpbGwgYmUgZGlzcGxheWVkLiBJZiB0aGUgc2FtZSBtYXRjaCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzLCBhbGwgdGhlCiAqICAgZWxlbWVudHMgd2lsbCBiZSBkaXNwbGF5ZWQuCiAqICogYG5nU3dpdGNoRGVmYXVsdGA6IHRoZSBkZWZhdWx0IGNhc2Ugd2hlbiBubyBvdGhlciBjYXNlIG1hdGNoLiBJZiB0aGVyZQogKiAgIGFyZSBtdWx0aXBsZSBkZWZhdWx0IGNhc2VzLCBhbGwgb2YgdGhlbSB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIG5vIG90aGVyCiAqICAgY2FzZSBtYXRjaC4KICoKICoKICogQGV4YW1wbGUKICA8ZXhhbXBsZSBtb2R1bGU9InN3aXRjaEV4YW1wbGUiIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSI+CiAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0ic2VsZWN0aW9uIiBuZy1vcHRpb25zPSJpdGVtIGZvciBpdGVtIGluIGl0ZW1zIj4KICAgICAgICA8L3NlbGVjdD4KICAgICAgICA8dHQ+c2VsZWN0aW9uPXt7c2VsZWN0aW9ufX08L3R0PgogICAgICAgIDxoci8+CiAgICAgICAgPGRpdiBjbGFzcz0iYW5pbWF0ZS1zd2l0Y2gtY29udGFpbmVyIgogICAgICAgICAgbmctc3dpdGNoIG9uPSJzZWxlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbmltYXRlLXN3aXRjaCIgbmctc3dpdGNoLXdoZW49InNldHRpbmdzIj5TZXR0aW5ncyBEaXY8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYW5pbWF0ZS1zd2l0Y2giIG5nLXN3aXRjaC13aGVuPSJob21lIj5Ib21lIFNwYW48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYW5pbWF0ZS1zd2l0Y2giIG5nLXN3aXRjaC1kZWZhdWx0PmRlZmF1bHQ8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgogICAgICBhbmd1bGFyLm1vZHVsZSgnc3dpdGNoRXhhbXBsZScsIFsnbmdBbmltYXRlJ10pCiAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICRzY29wZS5pdGVtcyA9IFsnc2V0dGluZ3MnLCAnaG9tZScsICdvdGhlciddOwogICAgICAgICAgJHNjb3BlLnNlbGVjdGlvbiA9ICRzY29wZS5pdGVtc1swXTsKICAgICAgICB9XSk7CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+CiAgICAgIC5hbmltYXRlLXN3aXRjaC1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6d2hpdGU7CiAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjazsKICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICBvdmVyZmxvdzpoaWRkZW47CiAgICAgIH0KCiAgICAgIC5hbmltYXRlLXN3aXRjaCB7CiAgICAgICAgcGFkZGluZzoxMHB4OwogICAgICB9CgogICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctYW5pbWF0ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CiAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOwoKICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgICAgICB0b3A6MDsKICAgICAgICBsZWZ0OjA7CiAgICAgICAgcmlnaHQ6MDsKICAgICAgICBib3R0b206MDsKICAgICAgfQoKICAgICAgLmFuaW1hdGUtc3dpdGNoLm5nLWxlYXZlLm5nLWxlYXZlLWFjdGl2ZSwKICAgICAgLmFuaW1hdGUtc3dpdGNoLm5nLWVudGVyIHsKICAgICAgICB0b3A6LTUwcHg7CiAgICAgIH0KICAgICAgLmFuaW1hdGUtc3dpdGNoLm5nLWxlYXZlLAogICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHsKICAgICAgICB0b3A6MDsKICAgICAgfQogICAgPC9maWxlPgogICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgIHZhciBzd2l0Y2hFbGVtID0gZWxlbWVudChieS5jc3MoJ1tuZy1zd2l0Y2hdJykpOwogICAgICB2YXIgc2VsZWN0ID0gZWxlbWVudChieS5tb2RlbCgnc2VsZWN0aW9uJykpOwoKICAgICAgaXQoJ3Nob3VsZCBzdGFydCBpbiBzZXR0aW5ncycsIGZ1bmN0aW9uKCkgewogICAgICAgIGV4cGVjdChzd2l0Y2hFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvU2V0dGluZ3MgRGl2Lyk7CiAgICAgIH0pOwogICAgICBpdCgnc2hvdWxkIGNoYW5nZSB0byBob21lJywgZnVuY3Rpb24oKSB7CiAgICAgICAgc2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMSkuY2xpY2soKTsKICAgICAgICBleHBlY3Qoc3dpdGNoRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL0hvbWUgU3Bhbi8pOwogICAgICB9KTsKICAgICAgaXQoJ3Nob3VsZCBzZWxlY3QgZGVmYXVsdCcsIGZ1bmN0aW9uKCkgewogICAgICAgIHNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDIpLmNsaWNrKCk7CiAgICAgICAgZXhwZWN0KHN3aXRjaEVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9kZWZhdWx0Lyk7CiAgICAgIH0pOwogICAgPC9maWxlPgogIDwvZXhhbXBsZT4KICovCnZhciBuZ1N3aXRjaERpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkgewogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0VBJywKICAgIHJlcXVpcmU6ICduZ1N3aXRjaCcsCgogICAgLy8gYXNrcyBmb3IgJHNjb3BlIHRvIGZvb2wgdGhlIEJDIGNvbnRyb2xsZXIgbW9kdWxlCiAgICBjb250cm9sbGVyOiBbJyRzY29wZScsIGZ1bmN0aW9uIG5nU3dpdGNoQ29udHJvbGxlcigpIHsKICAgICB0aGlzLmNhc2VzID0ge307CiAgICB9XSwKICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBuZ1N3aXRjaENvbnRyb2xsZXIpIHsKICAgICAgdmFyIHdhdGNoRXhwciA9IGF0dHIubmdTd2l0Y2ggfHwgYXR0ci5vbiwKICAgICAgICAgIHNlbGVjdGVkVHJhbnNjbHVkZXMgPSBbXSwKICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMgPSBbXSwKICAgICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb25zID0gW10sCiAgICAgICAgICBzZWxlY3RlZFNjb3BlcyA9IFtdOwoKICAgICAgdmFyIHNwbGljZUZhY3RvcnkgPSBmdW5jdGlvbihhcnJheSwgaW5kZXgpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTsgfTsKICAgICAgfTsKCiAgICAgIHNjb3BlLiR3YXRjaCh3YXRjaEV4cHIsIGZ1bmN0aW9uIG5nU3dpdGNoV2F0Y2hBY3Rpb24odmFsdWUpIHsKICAgICAgICB2YXIgaSwgaWk7CiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBwcmV2aW91c0xlYXZlQW5pbWF0aW9ucy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgICAkYW5pbWF0ZS5jYW5jZWwocHJldmlvdXNMZWF2ZUFuaW1hdGlvbnNbaV0pOwogICAgICAgIH0KICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHNlbGVjdGVkU2NvcGVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGdldEJsb2NrTm9kZXMoc2VsZWN0ZWRFbGVtZW50c1tpXS5jbG9uZSk7CiAgICAgICAgICBzZWxlY3RlZFNjb3Blc1tpXS4kZGVzdHJveSgpOwogICAgICAgICAgdmFyIHByb21pc2UgPSBwcmV2aW91c0xlYXZlQW5pbWF0aW9uc1tpXSA9ICRhbmltYXRlLmxlYXZlKHNlbGVjdGVkKTsKICAgICAgICAgIHByb21pc2UudGhlbihzcGxpY2VGYWN0b3J5KHByZXZpb3VzTGVhdmVBbmltYXRpb25zLCBpKSk7CiAgICAgICAgfQoKICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9IDA7CiAgICAgICAgc2VsZWN0ZWRTY29wZXMubGVuZ3RoID0gMDsKCiAgICAgICAgaWYgKChzZWxlY3RlZFRyYW5zY2x1ZGVzID0gbmdTd2l0Y2hDb250cm9sbGVyLmNhc2VzWychJyArIHZhbHVlXSB8fCBuZ1N3aXRjaENvbnRyb2xsZXIuY2FzZXNbJz8nXSkpIHsKICAgICAgICAgIGZvckVhY2goc2VsZWN0ZWRUcmFuc2NsdWRlcywgZnVuY3Rpb24oc2VsZWN0ZWRUcmFuc2NsdWRlKSB7CiAgICAgICAgICAgIHNlbGVjdGVkVHJhbnNjbHVkZS50cmFuc2NsdWRlKGZ1bmN0aW9uKGNhc2VFbGVtZW50LCBzZWxlY3RlZFNjb3BlKSB7CiAgICAgICAgICAgICAgc2VsZWN0ZWRTY29wZXMucHVzaChzZWxlY3RlZFNjb3BlKTsKICAgICAgICAgICAgICB2YXIgYW5jaG9yID0gc2VsZWN0ZWRUcmFuc2NsdWRlLmVsZW1lbnQ7CiAgICAgICAgICAgICAgY2FzZUVsZW1lbnRbY2FzZUVsZW1lbnQubGVuZ3RoKytdID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnIGVuZCBuZ1N3aXRjaFdoZW46ICcpOwogICAgICAgICAgICAgIHZhciBibG9jayA9IHsgY2xvbmU6IGNhc2VFbGVtZW50IH07CgogICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMucHVzaChibG9jayk7CiAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2FzZUVsZW1lbnQsIGFuY2hvci5wYXJlbnQoKSwgYW5jaG9yKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH07Cn1dOwoKdmFyIG5nU3dpdGNoV2hlbkRpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHsKICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsCiAgcHJpb3JpdHk6IDEyMDAsCiAgcmVxdWlyZTogJ15uZ1N3aXRjaCcsCiAgbXVsdGlFbGVtZW50OiB0cnVlLAogIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY3RybCwgJHRyYW5zY2x1ZGUpIHsKICAgIGN0cmwuY2FzZXNbJyEnICsgYXR0cnMubmdTd2l0Y2hXaGVuXSA9IChjdHJsLmNhc2VzWychJyArIGF0dHJzLm5nU3dpdGNoV2hlbl0gfHwgW10pOwogICAgY3RybC5jYXNlc1snIScgKyBhdHRycy5uZ1N3aXRjaFdoZW5dLnB1c2goeyB0cmFuc2NsdWRlOiAkdHJhbnNjbHVkZSwgZWxlbWVudDogZWxlbWVudCB9KTsKICB9Cn0pOwoKdmFyIG5nU3dpdGNoRGVmYXVsdERpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHsKICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsCiAgcHJpb3JpdHk6IDGM3O9WpYkDAAogAAAKIAAAaPcoH9LFCAAnrR4TCABFAB/81PBAAEAGtiTAqAdgwKgHNh/1lSJBv/SIWHp804AYAVOv1QAAAQEICgBNpdoAo17fMjAwLAogIHJlcXVpcmU6ICdebmdTd2l0Y2gnLAogIG11bHRpRWxlbWVudDogdHJ1ZSwKICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHsKICAgIGN0cmwuY2FzZXNbJz8nXSA9IChjdHJsLmNhc2VzWyc/J10gfHwgW10pOwogICAgY3RybC5jYXNlc1snPyddLnB1c2goeyB0cmFuc2NsdWRlOiAkdHJhbnNjbHVkZSwgZWxlbWVudDogZWxlbWVudCB9KTsKICAgfQp9KTsKCi8qKgogKiBAbmdkb2MgZGlyZWN0aXZlCiAqIEBuYW1lIG5nVHJhbnNjbHVkZQogKiBAcmVzdHJpY3QgRUFDCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBEaXJlY3RpdmUgdGhhdCBtYXJrcyB0aGUgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgdHJhbnNjbHVkZWQgRE9NIG9mIHRoZSBuZWFyZXN0IHBhcmVudCBkaXJlY3RpdmUgdGhhdCB1c2VzIHRyYW5zY2x1c2lvbi4KICoKICogQW55IGV4aXN0aW5nIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgdGhhdCB0aGlzIGRpcmVjdGl2ZSBpcyBwbGFjZWQgb24gd2lsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBpcyBpbnNlcnRlZC4KICoKICogQGVsZW1lbnQgQU5ZCiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlIG1vZHVsZT0idHJhbnNjbHVkZUV4YW1wbGUiPgogICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgICAgPHNjcmlwdD4KICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3RyYW5zY2x1ZGVFeGFtcGxlJywgW10pCiAgICAgICAgICAuZGlyZWN0aXZlKCdwYW5lJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsCiAgICAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsCiAgICAgICAgICAgICAgIHNjb3BlOiB7IHRpdGxlOidAJyB9LAogICAgICAgICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBncmF5Ij57e3RpdGxlfX08L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nCiAgICAgICAgICAgICB9OwogICAgICAgICB9KQogICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICRzY29wZS50aXRsZSA9ICdMb3JlbSBJcHN1bSc7CiAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnTmVxdWUgcG9ycm8gcXVpc3F1YW0gZXN0IHF1aSBkb2xvcmVtIGlwc3VtIHF1aWEgZG9sb3IuLi4nOwogICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgICA8aW5wdXQgbmctbW9kZWw9InRpdGxlIj48YnI+CiAgICAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD0idGV4dCI+PC90ZXh0YXJlYT4gPGJyLz4KICAgICAgICAgPHBhbmUgdGl0bGU9Int7dGl0bGV9fSI+e3t0ZXh0fX08L3BhbmU+CiAgICAgICA8L2Rpdj4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgaXQoJ3Nob3VsZCBoYXZlIHRyYW5zY2x1ZGVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZWxlbWVudChieS5tb2RlbCgndGl0bGUnKSk7CiAgICAgICAgICB0aXRsZUVsZW1lbnQuY2xlYXIoKTsKICAgICAgICAgIHRpdGxlRWxlbWVudC5zZW5kS2V5cygnVElUTEUnKTsKICAgICAgICAgIHZhciB0ZXh0RWxlbWVudCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7CiAgICAgICAgICB0ZXh0RWxlbWVudC5jbGVhcigpOwogICAgICAgICAgdGV4dEVsZW1lbnQuc2VuZEtleXMoJ1RFWFQnKTsKICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3RpdGxlJykpLmdldFRleHQoKSkudG9FcXVhbCgnVElUTEUnKTsKICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3RleHQnKSkuZ2V0VGV4dCgpKS50b0VxdWFsKCdURVhUJyk7CiAgICAgICAgfSk7CiAgICAgPC9maWxlPgogICA8L2V4YW1wbGU+CiAqCiAqLwp2YXIgbmdUcmFuc2NsdWRlRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoewogIHJlc3RyaWN0OiAnRUFDJywKICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIGNvbnRyb2xsZXIsICR0cmFuc2NsdWRlKSB7CiAgICBpZiAoISR0cmFuc2NsdWRlKSB7CiAgICAgIHRocm93IG1pbkVycignbmdUcmFuc2NsdWRlJykoJ29ycGhhbicsCiAgICAgICAnSWxsZWdhbCB1c2Ugb2YgbmdUcmFuc2NsdWRlIGRpcmVjdGl2ZSBpbiB0aGUgdGVtcGxhdGUhICcgKwogICAgICAgJ05vIHBhcmVudCBkaXJlY3RpdmUgdGhhdCByZXF1aXJlcyBhIHRyYW5zY2x1c2lvbiBmb3VuZC4gJyArCiAgICAgICAnRWxlbWVudDogezB9JywKICAgICAgIHN0YXJ0aW5nVGFnKCRlbGVtZW50KSk7CiAgICB9CgogICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUpIHsKICAgICAgJGVsZW1lbnQuZW1wdHkoKTsKICAgICAgJGVsZW1lbnQuYXBwZW5kKGNsb25lKTsKICAgIH0pOwogIH0KfSk7CgovKioKICogQG5nZG9jIGRpcmVjdGl2ZQogKiBAbmFtZSBzY3JpcHQKICogQHJlc3RyaWN0IEUKICoKICogQGRlc2NyaXB0aW9uCiAqIExvYWQgdGhlIGNvbnRlbnQgb2YgYSBgPHNjcmlwdD5gIGVsZW1lbnQgaW50byB7QGxpbmsgbmcuJHRlbXBsYXRlQ2FjaGUgYCR0ZW1wbGF0ZUNhY2hlYH0sIHNvIHRoYXQgdGhlCiAqIHRlbXBsYXRlIGNhbiBiZSB1c2VkIGJ5IHtAbGluayBuZy5kaXJlY3RpdmU6bmdJbmNsdWRlIGBuZ0luY2x1ZGVgfSwKICoge0BsaW5rIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBgbmdWaWV3YH0sIG9yIHtAbGluayBndWlkZS9kaXJlY3RpdmUgZGlyZWN0aXZlc30uIFRoZSB0eXBlIG9mIHRoZQogKiBgPHNjcmlwdD5gIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYHRleHQvbmctdGVtcGxhdGVgLCBhbmQgYSBjYWNoZSBuYW1lIGZvciB0aGUgdGVtcGxhdGUgbXVzdCBiZQogKiBhc3NpZ25lZCB0aHJvdWdoIHRoZSBlbGVtZW50J3MgYGlkYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBhcyBhIGRpcmVjdGl2ZSdzIGB0ZW1wbGF0ZVVybGAuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE11c3QgYmUgc2V0IHRvIGAndGV4dC9uZy10ZW1wbGF0ZSdgLgogKiBAcGFyYW0ge3N0cmluZ30gaWQgQ2FjaGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUuCiAqCiAqIEBleGFtcGxlCiAgPGV4YW1wbGU+CiAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0iL3RwbC5odG1sIj4KICAgICAgICBDb250ZW50IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgPC9zY3JpcHQ+CgogICAgICA8YSBuZy1jbGljaz0iY3VycmVudFRwbD0nL3RwbC5odG1sJyIgaWQ9InRwbC1saW5rIj5Mb2FkIGlubGluZWQgdGVtcGxhdGU8L2E+CiAgICAgIDxkaXYgaWQ9InRwbC1jb250ZW50IiBuZy1pbmNsdWRlIHNyYz0iY3VycmVudFRwbCI+PC9kaXY+CiAgICA8L2ZpbGU+CiAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlIGRlZmluZWQgaW5zaWRlIHNjcmlwdCB0YWcnLCBmdW5jdGlvbigpIHsKICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3RwbC1saW5rJykpLmNsaWNrKCk7CiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjdHBsLWNvbnRlbnQnKSkuZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IG9mIHRoZSB0ZW1wbGF0ZS8pOwogICAgICB9KTsKICAgIDwvZmlsZT4KICA8L2V4YW1wbGU+CiAqLwp2YXIgc2NyaXB0RGlyZWN0aXZlID0gWyckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7CiAgcmV0dXJuIHsKICAgIHJlc3RyaWN0OiAnRScsCiAgICB0ZXJtaW5hbDogdHJ1ZSwKICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHsKICAgICAgaWYgKGF0dHIudHlwZSA9PSAndGV4dC9uZy10ZW1wbGF0ZScpIHsKICAgICAgICB2YXIgdGVtcGxhdGVVcmwgPSBhdHRyLmlkLAogICAgICAgICAgICB0ZXh0ID0gZWxlbWVudFswXS50ZXh0OwoKICAgICAgICAkdGVtcGxhdGVDYWNoZS5wdXQodGVtcGxhdGVVcmwsIHRleHQpOwogICAgICB9CiAgICB9CiAgfTsKfV07Cgp2YXIgbmdPcHRpb25zTWluRXJyID0gbWluRXJyKCduZ09wdGlvbnMnKTsKLyoqCiAqIEBuZ2RvYyBkaXJlY3RpdmUKICogQG5hbWUgc2VsZWN0CiAqIEByZXN0cmljdCBFCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBIVE1MIGBTRUxFQ1RgIGVsZW1lbnQgd2l0aCBhbmd1bGFyIGRhdGEtYmluZGluZy4KICoKICogIyBgbmdPcHRpb25zYAogKgogKiBUaGUgYG5nT3B0aW9uc2AgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGEgbGlzdCBvZiBgPG9wdGlvbj5gCiAqIGVsZW1lbnRzIGZvciB0aGUgYDxzZWxlY3Q+YCBlbGVtZW50IHVzaW5nIHRoZSBhcnJheSBvciBvYmplY3Qgb2J0YWluZWQgYnkgZXZhbHVhdGluZyB0aGUKICogYG5nT3B0aW9uc2AgY29tcHJlaGVuc2lvbl9leHByZXNzaW9uLgogKgogKiBJbiBtYW55IGNhc2VzLCBgbmdSZXBlYXRgIGNhbiBiZSB1c2VkIG9uIGA8b3B0aW9uPmAgZWxlbWVudHMgaW5zdGVhZCBvZiBgbmdPcHRpb25zYCB0byBhY2hpZXZlIGEKICogc2ltaWxhciByZXN1bHQuIEhvd2V2ZXIsIHRoZSBgbmdPcHRpb25zYCBwcm92aWRlcyBzb21lIGJlbmVmaXRzIHN1Y2ggYXMgcmVkdWNpbmcgbWVtb3J5IGFuZAogKiBpbmNyZWFzaW5nIHNwZWVkIGJ5IG5vdCBjcmVhdGluZyBhIG5ldyBzY29wZSBmb3IgZWFjaCByZXBlYXRlZCBpbnN0YW5jZSwgYXMgd2VsbCBhcyBwcm92aWRpbmcKICogbW9yZSBmbGV4aWJpbGl0eSBpbiBob3cgdGhlIGBzZWxlY3RgJ3MgbW9kZWwgaXMgYXNzaWduZWQgdmlhIGBzZWxlY3QgYXNgLiBgbmdPcHRpb25zYCBzaG91bGQgYmUKICogdXNlZCB3aGVuIHRoZSBgc2VsZWN0YCBtb2RlbCBuZWVkcyB0byBiZSBib3VuZCB0byBhIG5vbi1zdHJpbmcgdmFsdWUuIFRoaXMgaXMgYmVjYXVzZSBhbiBvcHRpb24KICogZWxlbWVudCBjYW4gb25seSBiZSBib3VuZCB0byBzdHJpbmcgdmFsdWVzIGF0IHByZXNlbnQuCiAqCiAqIFdoZW4gYW4gaXRlbSBpbiB0aGUgYDxzZWxlY3Q+YCBtZW51IGlzIHNlbGVjdGVkLCB0aGUgYXJyYXkgZWxlbWVudCBvciBvYmplY3QgcHJvcGVydHkKICogcmVwcmVzZW50ZWQgYnkgdGhlIHNlbGVjdGVkIG9wdGlvbiB3aWxsIGJlIGJvdW5kIHRvIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IHRoZSBgbmdNb2RlbGAKICogZGlyZWN0aXZlLgogKgogKiBPcHRpb25hbGx5LCBhIHNpbmdsZSBoYXJkLWNvZGVkIGA8b3B0aW9uPmAgZWxlbWVudCwgd2l0aCB0aGUgdmFsdWUgc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgY2FuCiAqIGJlIG5lc3RlZCBpbnRvIHRoZSBgPHNlbGVjdD5gIGVsZW1lbnQuIFRoaXMgZWxlbWVudCB3aWxsIHRoZW4gcmVwcmVzZW50IHRoZSBgbnVsbGAgb3IgIm5vdCBzZWxlY3RlZCIKICogb3B0aW9uLiBTZWUgZXhhbXBsZSBiZWxvdyBmb3IgZGVtb25zdHJhdGlvbi4KICoKICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CiAqICoqTm90ZToqKiBgbmdNb2RlbGAgY29tcGFyZXMgYnkgcmVmZXJlbmNlLCBub3QgdmFsdWUuIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gYmluZGluZyB0byBhbgogKiBhcnJheSBvZiBvYmplY3RzLiBTZWUgYW4gZXhhbXBsZSBbaW4gdGhpcyBqc2ZpZGRsZV0oaHR0cDovL2pzZmlkZGxlLm5ldC9xV3pUYi8pLgogKiA8L2Rpdj4KICoKICogIyMgYHNlbGVjdCBhc2AKICoKICogVXNpbmcgYHNlbGVjdCBhc2Agd2lsbCBiaW5kIHRoZSByZXN1bHQgb2YgdGhlIGBzZWxlY3QgYXNgIGV4cHJlc3Npb24gdG8gdGhlIG1vZGVsLCBidXQKICogdGhlIHZhbHVlIG9mIHRoZSBgPHNlbGVjdD5gIGFuZCBgPG9wdGlvbj5gIGh0bWwgZWxlbWVudHMgd2lsbCBiZSBlaXRoZXIgdGhlIGluZGV4IChmb3IgYXJyYXkgZGF0YSBzb3VyY2VzKQogKiBvciBwcm9wZXJ0eSBuYW1lIChmb3Igb2JqZWN0IGRhdGEgc291cmNlcykgb2YgdGhlIHZhbHVlIHdpdGhpbiB0aGUgY29sbGVjdGlvbi4gSWYgYSBgdHJhY2sgYnlgIGV4cHJlc3Npb24KICogaXMgdXNlZCwgdGhlIHJlc3VsdCBvZiB0aGF0IGV4cHJlc3Npb24gd2lsbCBiZSBzZXQgYXMgdGhlIHZhbHVlIG9mIHRoZSBgb3B0aW9uYCBhbmQgYHNlbGVjdGAgZWxlbWVudHMuCiAqCiAqICMjIyBgc2VsZWN0IGFzYCB3aXRoIGB0cmFja2V4cHJgCiAqCiAqIFVzaW5nIGBzZWxlY3QgYXNgIHRvZ2V0aGVyIHdpdGggYHRyYWNrZXhwcmAgaXMgbm90IHJlY29tbWVuZGVkLiBSZWFzb25pbmc6CiAqCiAqIC0gRXhhbXBsZTogJmx0O3NlbGVjdCBuZy1vcHRpb25zPSJpdGVtLnN1Ykl0ZW0gYXMgaXRlbS5sYWJlbCBmb3IgaXRlbSBpbiB2YWx1ZXMgdHJhY2sgYnkgaXRlbS5pZCIgbmctbW9kZWw9InNlbGVjdGVkIiZndDsKICogICB2YWx1ZXM6IFt7aWQ6IDEsIGxhYmVsOiAnYUxhYmVsJywgc3ViSXRlbToge25hbWU6ICdhU3ViSXRlbSd9fSwge2lkOiAyLCBsYWJlbDogJ2JMYWJlbCcsIHN1Ykl0ZW06IHtuYW1lOiAnYlN1Ykl0ZW0nfX1dLAogKiAgICRzY29wZS5zZWxlY3RlZCA9IHtuYW1lOiAnYVN1Ykl0ZW0nfTsKICogLSB0cmFjayBieSBpcyBhbHdheXMgYXBwbGllZCB0byBgdmFsdWVgLCB3aXRoIHRoZSBwdXJwb3NlIG9mIHByZXNlcnZpbmcgdGhlIHNlbGVjdGlvbiwKICogICAodG8gYGl0ZW1gIGluIHRoaXMgY2FzZSkKICogLSB0byBjYWxjdWxhdGUgd2hldGhlciBhbiBpdGVtIGlzIHNlbGVjdGVkIHdlIGRvIHRoZSBmb2xsb3dpbmc6CiAqICAgMS4gYXBwbHkgYHRyYWNrIGJ5YCB0byB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSwgZS5nLgogKiAgICAgIEluIHRoZSBleGFtcGxlOiBbMSwyXQogKiAgIDIuIGFwcGx5IGB0cmFjayBieWAgdG8gdGhlIGFscmVhZHkgc2VsZWN0ZWQgdmFsdWUgaW4gYG5nTW9kZWxgOgogKiAgICAgIEluIHRoZSBleGFtcGxlOiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYXMgYHRyYWNrIGJ5YCByZWZlcnMgdG8gYGl0ZW0uaWRgLCBidXQgdGhlIHNlbGVjdGVkCiAqICAgICAgdmFsdWUgZnJvbSBgbmdNb2RlbGAgaXMgYHtuYW1lOiBhU3ViSXRlbX1gLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBUaGUgY29udHJvbCBpcyBjb25zaWRlcmVkIHZhbGlkIG9ubHkgaWYgdmFsdWUgaXMgZW50ZXJlZC4KICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCiAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCiAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLgogKiBAcGFyYW0ge2NvbXByZWhlbnNpb25fZXhwcmVzc2lvbj19IG5nT3B0aW9ucyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKICoKICogICAqIGZvciBhcnJheSBkYXRhIHNvdXJjZXM6CiAqICAgICAqIGBsYWJlbGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YAogKiAgICAgKiBgc2VsZWN0YCAqKmBhc2AqKiBgbGFiZWxgICoqYGZvcmAqKiBgdmFsdWVgICoqYGluYCoqIGBhcnJheWAKICogICAgICogYGxhYmVsYCAgKipgZ3JvdXAgYnlgKiogYGdyb3VwYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYQ0KjNzvVtqJAwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxWQABABm6HwKgHNsCoB2CVIh/1WHp800G/9IiAEA0OE3EAAAEBCAoAo17fAE2l2ozc71beiQMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8V0AAQAZuhsCoBzbAqAdglSIf9Vh6fNNBwBRQgBANDvOoAAABAQgKAKNe3wBNpdqM3O9Wa44DAM4MAADODAAAaPcoH9LFCAAnrR4TCABFAAzAbtJAAEAGL3/AqAdgwKgHNh/1lSxw2AYKBQnBnYAYAQCcmQAAAQEICgBNpdoAo17dSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KQkY4DQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFV0aWwgLS0gVGhlbWUgU2VydmljZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgJGxvZywgZnM7CgogICAgdmFyIHRoZW1lcyA9IFsnbGlnaHQnLCAnZGFyayddLAogICAgICAgIHRoZW1lU3RyID0gdGhlbWVzLmpvaW4oJyAnKSwKICAgICAgICB0aGlkeCwKICAgICAgICBsaXN0ZW5lcnMgPSB7fSwKICAgICAgICBuZXh0TGlzdGVuZXJJZCA9IDE7CgogICAgZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgICB0aGlkeCA9IDA7CiAgICAgICAgdXBkYXRlQm9keUNsYXNzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0VGhlbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoZW1lc1t0aGlkeF07CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VGhlbWUodCkgewogICAgICAgIHZhciBpZHggPSB0aGVtZXMuaW5kZXhPZih0KTsKICAgICAgICBpZiAoaWR4ID4gLTEgJiYgaWR4ICE9PSB0aGlkeCkgewogICAgICAgICAgICB0aGlkeCA9IGlkeDsKICAgICAgICAgICAgdXBkYXRlQm9keUNsYXNzKCk7CiAgICAgICAgICAgIHRoZW1lRXZlbnQoJ3NldCcpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVUaGVtZSgpIHsKICAgICAgICB2YXIgaSA9IHRoaWR4ICsgMTsKICAgICAgICB0aGlkeCA9IChpPT09dGhlbWVzLmxlbmd0aCkgPyAwIDogaTsKICAgICAgICB1cGRhdGVCb2R5Q2xhc3MoKTsKICAgICAgICB0aGVtZUV2ZW50KCd0b2dnbGUnKTsKICAgICAgICByZXR1cm4gZ2V0VGhlbWUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVCb2R5Q2xhc3MoKSB7CiAgICAgICAgdmFyIGJvZHkgPSBkMy5zZWxlY3QoJ2JvZHknKTsKICAgICAgICBib2R5LmNsYXNzZWQodGhlbWVTdHIsIGZhbHNlKTsKICAgICAgICBib2R5LmNsYXNzZWQoZ2V0VGhlbWUoKSwgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGhlbWVFdmVudCh3KSB7CiAgICAgICAgdmFyIHQgPSBnZXRUaGVtZSgpLAogICAgICAgICAgICBtID0gJ1RoZW1lLUNoYW5nZS0oJyt3KycpOiAnICsgdDsKICAgICAgICAkbG9nLmRlYnVnKG0pOwogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChsaXN0ZW5lcnMsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHZhbHVlLmNiKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV2ZW50OiAndGhlbWVDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkTGlzdGVuZXIoY2FsbGJhY2spIHsKICAgICAgICB2YXIgaWQgPSBuZXh0TGlzdGVuZXJJZCsrLAogICAgICAgICAgICBjYiA9IGZzLmlzRihjYWxsYmFjayksCiAgICAgICAgICAgIG8gPSB7IGlkOiBpZCwgY2I6IGNiIH07CgogICAgICAgIGlmIChjYikgewogICAgICAgICAgICBsaXN0ZW5lcnNbaWRdID0gbzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbG9nLmVycm9yKCdUaGVtZVNlcnZpY2UuYWRkTGlzdGVuZXIoKTogY2FsbGJhY2sgbm90IGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgby5lcnJvciA9ICdObyBjYWxsYmFjayBkZWZpbmVkJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG87CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIobHNucikgewogICAgICAgIHZhciBpZCA9IGxzbnIgJiYgbHNuci5pZCwKICAgICAgICAgICAgbyA9IGxpc3RlbmVyc1tpZF07CiAgICAgICAgaWYgKG8pIHsKICAgICAgICAgICAgZGVsZXRlIGxpc3RlbmVyc1tpZF07CiAgICAgICAgfQogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zVXRpbCcpCiAgICAgICAgLmZhY3RvcnkoJ1RoZW1lU2VydmljZScsIFsnJGxvZycsICdGblNlcnZpY2UnLAogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0aGlkeCA9IDA7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdDogaW5pdCwKICAgICAgICAgICAgICAgIHRoZW1lOiBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFRoZW1lKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlbWUoeCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRvZ2dsZVRoZW1lOiB0b2dnbGVUaGVtZSwKICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyOiBhZGRMaXN0ZW5lciwKICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyOiByZW1vdmVMaXN0ZW5lcgogICAgICAgICAgICB9OwogICAgfV0pOwoKfSgpKTsKDQqM3O9WEpIDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05I9AAEAGxk3AqAc2wKgHYJUsH/UFCcGdcNgSloAQAgHf9AAAAQEICgCjXt8ATaXajNzvVrmVAwBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOW7VQABABjwDwKgHYMCoBzYf9ZUscNgSlgUJwZ2AGAEAkBIAAAEBCAoATaXbAKNe3zANCg0KjNzvVmWaAwDBAgAAwQIAAAgAJ60eE2j3KB/SxQgARQACs+SQQABABsPNwKgHNsCoB2CVLB/1BQnBnXDYEpuAGAIB0F0AAAEBCAoAo17gAE2l20dFVCAvb25vcy91aS9hcHAvZncvbWFzdC9tYXN0LmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ainQMAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQ3oUAAQAZzPMCoB2DAqAc2H/WVJzlVvPnbkn9MgBABCpANAAABAQgKAE2l3ACjXtaM3O9WCqADAP8EAAD/BAAAaPcoH9LFCAAnrR4TCABFAATxN6JAAEAGbn7AqAdgwKgHNh/1lSc5Vbz525J/TIAYAQqUygAAAQEICgBNpdwAo17WSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpDb250ZW50LUxlbmd0aDogMTExNQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBQcm9jZXNzb3IgVmlldyAtLSBDU1MgZmlsZQogKi8KCiNvdi1wcm9jZXNzb3IgaDIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgojb3YtcHJvY2Vzc29yIGRpdi5jdHJsLWJ0bnMgewogICAgd2lkdGg6IDQwcHg7Cn0KCi5saWdodCAjb3YtcHJvY2Vzc29yIC5jdXJyZW50LXZpZXcgdXNlIHsKICAgIGZpbGw6IHdoaXRlOwp9Ci5kYXJrICNvdi1wcm9jZXNzb3IgLmN1cnJlbnQtdmlldyB1c2UgewogICAgZmlsbDogIzMwNDg2MDsKfQoKLmxpZ2h0ICNvdi1wcm9jZXNzb3IgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6IGRlZXBza3libHVlOwp9Ci5kYXJrICNvdi1wcm9jZXNzb3IgLmN1cnJlbnQtdmlldyByZWN0IHsKICAgIGZpbGw6ICNlZWU7Cn0KCiNvdi1wcm9jZXNzb3IgdGQubnVtYmVyIHsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9Cgojb3YtcHJvY2Vzc29yIHRyLm5vLWRhdGEgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cozc71aPoQMARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADmNWkAAQAYdfsCoB2DAqAc2H/WVLaaSV15P2aklgBgBCpASAAABAQgKAE2l3ACjXtswDQoNCozc71YupAMAvwIAAL8CAAAIACetHhNo9ygf0sUIAEUAArHBtkAAQAbmqcCoBzbAqAdglS0f9U/ZqSWmkldjgBgBokCmAAABAQgKAKNe4ABNpdxHRVQgL29ub3MvdWkvYXBwL2Z3L25hdi9uYXYuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVnKlAwCKHAAAihwAAGj3KB/SxQgAJ60eEwgARQAcfBhmQABABnYvwKgHYMCoBzYf9ZUrZz0CLfZqRo6AEAFErFUAAAEBCAoATaXcAKNe3khUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjI3MUENCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVXRpbCAtLSBLZXkgSGFuZGxlciBTZXJ2aWNlCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIHJlZmVyZW5jZXMgdG8gaW5qZWN0ZWQgc2VydmljZXMKICAgIHZhciAkbG9nLCAkdGltZW91dCwgZnMsIHRzLCBucywgZWUsIHFoczsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIGVuYWJsZWQgPSB0cnVlLAogICAgICAgIGdsb2JhbEVuYWJsZWQgPSB0cnVlLAogICAgICAgIGtleUhhbmRsZXIgPSB7CiAgICAgICAgICAgIGdsb2JhbEtleXM6IHt9LAogICAgICAgICAgICBtYXNrZWRLZXlzOiB7fSwKICAgICAgICAgICAgZGlhbG9nS2V5czoge30sCiAgICAgICAgICAgIHZpZXdLZXlzOiB7fSwKICAgICAgICAgICAgdmlld0ZuOiBudWxsLAogICAgICAgICAgICB2aWV3R2VzdHVyZXM6IFtdCiAgICAgICAgfSwKICAgICAgICBzZXEgPSB7fSwKICAgICAgICBtYXRjaGluZyA9IGZhbHNlLAogICAgICAgIG1hdGNoZWQgPSAnJywKICAgICAgICBsb29rdXA7CgogICAgZnVuY3Rpb24gbWF0Y2hTZXEoa2V5KSB7CiAgICAgICAgaWYgKCFtYXRjaGluZyAmJiBrZXkgPT09ICdzaGlmdCcpIHsKICAgICAgICAgICAgbWF0Y2hpbmcgPSB0cnVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG1hdGNoaW5nKSB7CiAgICAgICAgICAgIG1hdGNoZWQgKz0ga2V5OwogICAgICAgICAgICBsb29rdXAgPSBmcy50cmllTG9va3VwKHNlcSwgbWF0Y2hlZCk7CiAgICAgICAgICAgIGlmIChsb29rdXAgPT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXRjaGluZyA9IGZhbHNlOwogICAgICAgICAgICBtYXRjaGVkID0gJyc7CiAgICAgICAgICAgIGlmICghbG9va3VwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWUuY2x1Y2sobG9va3VwKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHdoYXRLZXkoY29kZSkgewogICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgICBjYXNlIDg6IHJldHVybiAnZGVsZXRlJzsKICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gJ3RhYic7CiAgICAgICAgICAgIGNhc2UgMTM6IHJldHVybiAnZW50ZXInOwogICAgICAgICAgICBjYXNlIDE2OiByZXR1cm4gJ3NoaWZ0JzsKICAgICAgICAgICAgY2FzZSAxNzogcmV0dXJuICdjdHJsJzsKICAgICAgICAgICAgY2FzZSAxODogcmV0dXJuICdhbHQnOwogICAgICAgICAgICBjYXNlIDI3OiByZXR1cm4gJ2VzYyc7CiAgICAgICAgICAgIGNhc2UgMzI6IHJldHVybiAnc3BhY2UnOwogICAgICAgICAgICBjYXNlIDM3OiByZXR1cm4gJ2xlZnRBcnJvdyc7CiAgICAgICAgICAgIGNhc2UgMzg6IHJldHVybiAndXBBcnJvdyc7CiAgICAgICAgICAgIGNhc2UgMzk6IHJldHVybiAncmlnaHRBcnJvdyc7CiAgICAgICAgICAgIGNhc2UgNDA6IHJldHVybiAnZG93bkFycm93JzsKICAgICAgICAgICAgY2FzZSA5MTogcmV0dXJuICdjbWRMZWZ0JzsKICAgICAgICAgICAgY2FzZSA5MzogcmV0dXJuICdjbWRSaWdodCc7CiAgICAgICAgICAgIGNhc2UgMTg2OiByZXR1cm4gJ3NlbWljb2xvbic7CiAgICAgICAgICAgIGNhc2UgMTg3OiByZXR1cm4gJ2VxdWFscyc7CiAgICAgICAgICAgIGNhc2UgMTg4OiByZXR1cm4gJ2NvbW1hJzsKICAgICAgICAgICAgY2FzZSAxODk6IHJldHVybiAnZGFzaCc7CiAgICAgICAgICAgIGNhc2UgMTkwOiByZXR1cm4gJ2RvdCc7CiAgICAgICAgICAgIGNhc2UgMTkxOiByZXR1cm4gJ3NsYXNoJzsKICAgICAgICAgICAgY2FzZSAxOTI6IHJldHVybiAnYmFja1F1b3RlJzsKICAgICAgICAgICAgY2FzZSAyMTk6IHJldHVybiAnb3BlbkJyYWNrZXQnOwogICAgICAgICAgICBjYXNlIDIyMDogcmV0dXJuICdiYWNrU2xhc2gnOwogICAgICAgICAgICBjYXNlIDIyMTogcmV0dXJuICdjbG9zZUJyYWNrZXQnOwogICAgICAgICAgICBjYXNlIDIyMjogcmV0dXJuICdxdW90ZSc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1NykgfHwKICAgICAgICAgICAgICAgICAgICAoY29kZSA+PSA2NSAmJiBjb2RlIDw9IDkwKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDExMiAmJiBjb2RlIDw9IDEyMykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnRicgKyAoY29kZSAtIDExMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBrZXlJbigpIHsKICAgICAgICB2YXIgZXZlbnQgPSBkMy5ldmVudCwKICAgICAgICAgICAga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUsCiAgICAgICAgICAgIGtleSA9IHdoYXRLZXkoa2V5Q29kZSksCiAgICAgICAgICAgIGtoID0ga2V5SGFuZGxlciwKICAgICAgICAgICAgZ2sgPSBraC5nbG9iYWxLZXlzW2tleV0sCiAgICAgICAgICAgIGdjYiA9IGZzLmlzRihnaykgfHwgKGZzLmlzQShnaykgJiYgZnMuaXNGKGdrWzBdKSksCiAgICAgICAgICAgIGRrID0ga2guZGlhbG9nS2V5c1trZXldLAogICAgICAgICAgICBkY2IgPSBmcy5pc0YoZGspLAogICAgICAgICAgICB2ayA9IGtoLnZpZXdLZXlzW2tleV0sCiAgICAgICAgICAgIGtsID0gZnMuaXNGKGtoLnZpZXdLZXlzLl9rZXlMaXN0ZW5lciksCiAgICAgICAgICAgIHZjYiA9IGZzLmlzRih2aykgfHwgKGZzLmlzQSh2aykgJiYgZnMuaXNGKHZrWzBdKSkgfHwgZnMuaXNGKGtoLnZpZXdGbiksCiAgICAgICAgICAgIHRva2VuID0gJ2tleWV2JzsgICAgLy8gaW5kaWNhdGUgdGhpcyB3YXMgYSBrZXktcHJlc3NlZCBldmVudAoKICAgICAgICBkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgaWYgKGVuYWJsZWQpIHsKICAgICAgICAgICAgaWYgKG1hdGNoU2VxKGtleSkpIHJldHVybjsKCiAgICAgICAgICAgIC8vIGdsb2JhbCBjYWxsYmFjaz8KICAgICAgICAgICAgaWYgKGdjYiAmJiBnY2IodG9rZW4sIGtleSwga2V5Q29kZSwgZXZlbnQpKSB7CiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZXZlbnQgd2FzICdoYW5kbGVkJywgd2UgYXJlIGRvbmUKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBkaWFsb2cgY2FsbGJhY2s/CiAgICAgICAgICAgIGlmIChkY2IpIHsKICAgICAgICAgICAgICAgIGRjYih0b2tlbiwga2V5LCBrZXlDb2RlLCBldmVudCk7CiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgZGlhbG9nIGhhbmRsZWQgdGhlIGV2ZW50CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBsZXQgdGhlIHZpZXcgY2FsbGJhY2sgaGF2ZSBhIHNob3QKICAgICAgICAgICAgaWYgKHZjYikgewogICAgICAgICAgICAgICAgdmNiKHRva2VuLCBrZXksIGtleUNvZGUsIGV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoa2wpIHsKICAgICAgICAgICAgICAgIGtsKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0dXBHbG9iYWxLZXlzKCkgewogICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGtleUhhbmRsZXIsIHsKICAgICAgICAgICAgZ2xvYmFsS2V5czogewogICAgICAgICAgICAgICAgYmFja1NsYXNoOiBbcXVpY2tIZWxwLCAnU2hvdyAvIGhpZGUgUXVpY2sgSGVscCddLAogICAgICAgICAgICAgICAgc2xhc2g6IFtxdWlja0hlbHAsICdTaG93IC8gaGlkZSBRdWljayBIZWxwJ10sCiAgICAgICAgICAgICAgICBlc2M6IFtlc2NhcGVLZXksICdEaXNtaXNzIGRpYWxvZyBvciBjYW5jZWwgc2VsZWN0aW9ucyddLAogICAgICAgICAgICAgICAgVDogW3RvZ2dsZVRoZW1lLCAiVG9nZ2xlIHRoZW1lIl0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2xvYmFsRm9ybWF0OiBbJ2JhY2tTbGFzaCcsICdzbGFzaCcsICdlc2MnLCAnVCddLAoKICAgICAgICAgICAgLy8gTWFza2VkIGtleXMgYXJlIGdsb2JhbCBrZXkgaGFuZGxlcnMgdGhhdCBhbHdheXMgcmV0dXJuIHRydWUuCiAgICAgICAgICAgIC8vIFRoYXQgaXMsIHRoZSB2aWV3IHdpbGwgbmV2ZXIgc2VlIHRoZSBldmVudCBmb3IgdGhhdCBrZXkuCiAgICAgICAgICAgIG1hc2tlZEtleXM6IHsKICAgICAgICAgICAgICAgIHNsYXNoOiB0cnVlLAogICAgICAgICAgICAgICAgYmFja1NsYXNoOiB0cnVlLAogICAgICAgICAgICAgICAgVDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcXVpY2tIZWxwKHZpZXcsIGtleSwgY29kZSwgZXYpIHsKICAgICAgICBpZiAoIWdsb2JhbEVuYWJsZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBxaHMuc2hvd1F1aWNrSGVscChrZXlIYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyByZXR1cm5zIHRydWUgaWYgd2UgJ2NvbnN1bWVkJyB0aGUgRVNDIGtleXByZXNzLCBmYWxzZSBvdGhlcndpc2UKICAgIGZ1bmN0aW9uIGVzY2FwZUtleSh2aWV3LCBrZXksIGNvZGUsIGV2KSB7CiAgICAgICAgcmV0dXJuIG5zLmhpZGVJZlNob3duKCkgfHwgcWhzLmhpZGVRdWlja0hlbHAoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVUaGVtZSh2aWV3LCBrZXksIGNvZGUsIGV2KSB7CiAgICAgICAgaWYgKCFnbG9iYWxFbmFibGVkKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdHMudG9nZ2xlVGhlbWUoKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaWx0ZXJNYXNrZWRLZXlzKG1hcCwgY2FsbGVyLCByZW1vdmUpIHsKICAgICAgICB2YXIgbWFza2VkID0gW10sCiAgICAgICAgICAgIG1zZ3MgPSBbXTsKCiAgICAgICAgZDMubWFwKG1hcCkua2V5cygpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICBpZiAoa2V5SGFuZGxlci5tYXNrZWRLZXlzW2tleV0pIHsKICAgICAgICAgICAgICAgIG1hc2tlZC5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICBtc2dzLnB1c2goY2FsbGVyLCAnOiBLZXkgIicgKyBrZXkgKyAnIiBpcyByZXNlcnZlZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGlmIChtc2dzLmxlbmd0aCkgewogICAgICAgICAgICAkbG9nLndhcm4obXNncy5qb2luKCdcbicpKTsKICAgICAgICB9CgogICAgICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgICAgbWFza2VkLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBtYXBba107CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWFza2VkOwogICAgfQoKICAgIGZ1bmN0aW9uIHVuZXhQYXJhbShmbmFtZSwgeCkgewogICAgICAgICRsb2cud2FybihmbmFtZSwgIjogdW5leHBlY3RlZCBwYXJhbWV0ZXItLSAiLCB4KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRLZXlCaW5kaW5ncyhrZXlBcmcpIHsKICAgICAgICB2YXIgZm5hbWUgPSAnc2V0S2V5QmluZGluZ3MoKScsCiAgICAgICAgICAgIGtGdW5jID0gZnMuaXNGKGtleUFyZyksCiAgICAgICAgICAgIGtNYXAgPSBmcy5pc08oa2V5QXJnKTsKCiAgICAgICAgaWYgKGtGdW5jKSB7CiAgICAgICAgICAgIC8vIHNldCBnZW5lcmFsIGtleSBoYW5kbGVyIGNhbGxiYWNrCiAgICAgICAgICAgIGtleUhhbmRsZXIudmlld0ZuID0ga0Z1bmM7CiAgICAgICAgfSBlbHNlIGlmIChrTWFwKSB7CiAgICAgICAgICAgIGZpbHRlck1hc2tlZEtleXMoa01hcCwgZm5hbWUsIHRydWUpOwogICAgICAgICAgICBrZXlIYW5kbGVyLnZpZXdLZXlzID0ga01hcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmV4UGFyYW0oZm5hbWUsIGtleUFyZyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldEtleUJpbmRpbmdzKCkgewogICAgICAgIHZhciBna2V5cyA9IGQzLm1hcChrZXlIYW5kbGVyLmdsb2JhbEtleXMpLmtleXMoKSwKICAgICAgICAgICAgbWFza2VkID0gZDMubWFwKGtleUhhbmRsZXIubWFza2VkS2V5cykua2V5cygpLAogICAgICAgICAgICB2a2V5cyA9IGQzLm1hcChrZXlIYW5kbGVyLnZpZXdLZXlzKS5rZXlzKCksCiAgICAgICAgICAgIHZmbiA9ICEhZnMuaXNGKGtleUhhbmRsZXIudmlld0ZuKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZ2xvYmFsS2V5czogZ2tleXMsCiAgICAgICAgICAgIG1hc2tlZEtleXM6IG1hc2tlZCwKICAgICAgICAgICAgdmlld0tleXM6IHZrZXlzLAogICAgICAgICAgICB2aWV3RnVuY3Rpb246IHZmbgogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdW5iaW5kS2V5cygpIHsKICAgICAgICBrZXlIYW5kbGVyLnaM3O9WpaUDAL8CAAC/AgAACAAnrR4TaPcoH9LFCABFAAKxLfNAAEAGem3AqAc2wKgHYJUnH/Xbkn9MOVXBtoAYDzPn+gAAAQEICgCjXuAATaXcR0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvc3ZnLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71alpQMAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQ3o0AAQAZzOsCoB2DAqAc2H/WVJzlVwbbbkoHJgBABFJANAAABAQgKAE2l3ACjXuCM3O9WpaUDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0cFNAAEAGOorAqAc2wKgHYJUrH/X2akaOZz0edYAQApVmyAAAAQEICgCjXuAATaXcjNzvVqWlAwCpCwAAqQsAAGj3KB/SxQgAJ60eEwgARQALmxhrQABABocLwKgHYMCoBzYf9ZUrZz0edfZqRo6AGAFEm3QAAAEBCAoATaXcAKNe3mlld0tleXMgPSB7fTsKICAgICAgICBrZXlIYW5kbGVyLnZpZXdGbiA9IG51bGw7CiAgICAgICAga2V5SGFuZGxlci52aWV3R2VzdHVyZXMgPSBbXTsKICAgIH0KCiAgICBmdW5jdGlvbiBiaW5kRGlhbG9nS2V5cyhtYXApIHsKICAgICAgICB2YXIgZm5hbWUgPSAnYmluZERpYWxvZ0tleXMoKScsCiAgICAgICAgICAgIGtNYXAgPSBmcy5pc08obWFwKTsKCiAgICAgICAgaWYgKGtNYXApIHsKICAgICAgICAgICAgZmlsdGVyTWFza2VkS2V5cyhtYXAsIGZuYW1lLCB0cnVlKTsKICAgICAgICAgICAga2V5SGFuZGxlci5kaWFsb2dLZXlzID0ga01hcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmV4UGFyYW0oZm5hbWUsIG1hcCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVuYmluZERpYWxvZ0tleXMoKSB7CiAgICAgICAga2V5SGFuZGxlci5kaWFsb2dLZXlzID0ge307CiAgICB9CgogICAgZnVuY3Rpb24gY2hlY2tOb3RHbG9iYWwobykgewogICAgICAgIHZhciBvb3BzID0gW107CiAgICAgICAgaWYgKGZzLmlzTyhvKSkgewogICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobywgZnVuY3Rpb24gKHZhbCwga2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoa2V5SGFuZGxlci5nbG9iYWxLZXlzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBvb3BzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChvb3BzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJGxvZy53YXJuKCdJZ25vcmluZyByZXNlcnZlZCBnbG9iYWwga2V5KHMpOicsIG9vcHMuam9pbignLCcpKTsKICAgICAgICAgICAgICAgIG9vcHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9ba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zVXRpbCcpCiAgICAuZmFjdG9yeSgnS2V5U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJyR0aW1lb3V0JywgJ0ZuU2VydmljZScsICdUaGVtZVNlcnZpY2UnLCAnTmF2U2VydmljZScsCiAgICAgICAgICAgICdFZVNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHRpbWVvdXRfLCBfZnNfLCBfdHNfLCBfbnNfLCBfZWVfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICR0aW1lb3V0ID0gXyR0aW1lb3V0XzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0cyA9IF90c187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAgZWUgPSBfZWVfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGJpbmRRaHM6IGZ1bmN0aW9uIChfcWhzXykgewogICAgICAgICAgICAgICAgICAgIHFocyA9IF9xaHNfOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGluc3RhbGxPbjogZnVuY3Rpb24gKGVsZW0pIHsKICAgICAgICAgICAgICAgICAgICBlbGVtLm9uKCdrZXlkb3duJywga2V5SW4pOwogICAgICAgICAgICAgICAgICAgIHNldHVwR2xvYmFsS2V5cygpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGtleUJpbmRpbmdzOiBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEtleUJpbmRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5QmluZGluZ3MoeCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVuYmluZEtleXM6IHVuYmluZEtleXMsCiAgICAgICAgICAgICAgICBkaWFsb2dLZXlzOiBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdW5iaW5kRGlhbG9nS2V5cygpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmREaWFsb2dLZXlzKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhZGRTZXE6IGZ1bmN0aW9uICh3b3JkLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgZnMuYWRkVG9UcmllKHNlcSwgd29yZCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVtU2VxOiBmdW5jdGlvbiAod29yZCkgewogICAgICAgICAgICAgICAgICAgIGZzLnJlbW92ZUZyb21UcmllKHNlcSwgd29yZCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2VzdHVyZU5vdGVzOiBmdW5jdGlvbiAoZykgewogICAgICAgICAgICAgICAgICAgIGlmIChnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleUhhbmRsZXIudmlld0dlc3R1cmVzOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleUhhbmRsZXIudmlld0dlc3R1cmVzID0gZnMuaXNBKGcpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlbmFibGVLZXlzOiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVuYWJsZUdsb2JhbEtleXM6IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRW5hYmxlZCA9IGI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY2hlY2tOb3RHbG9iYWw6IGNoZWNrTm90R2xvYmFsCiAgICAgICAgICAgIH07CiAgICB9XSk7Cgp9KCkpOwoNCozc71alpQMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwVEAAQAY6icCoBzbAqAdglSsf9fZqRo5nPSncgBACw1szAAABAQgKAKNe4ABNpdyM3O9WmagDAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5GG5AAEAGkmrAqAdgwKgHNh/1lStnPSnc9mpGjoAYAUSQEgAAAQEICgBNpdwAo17gMA0KDQqM3O9WH6oDAMECAADBAgAACAAnrR4TaPcoH9LFCABFAAKzcFVAAEAGOAnAqAc2wKgHYJUrH/X2akaOZz0p4YAYAsMN0QAAAQEICgCjXuEATaXcR0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvZ2x5cGguanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVm+qAwBqYAAAamAAAGj3KB/SxQgAJ60eEwgARQBgXNT2QABABnW+wKgHYMCoBzYf9ZUiQcAUUFh6fNOAEAFT8DUAAAEBCAoATaXcAKNe3zZBQzgNCnlgCiAqICAgICAqIGBzZWxlY3RgICoqYGFzYCoqIGBsYWJlbGAgKipgZ3JvdXAgYnlgKiogYGdyb3VwYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgICoqYHRyYWNrIGJ5YCoqIGB0cmFja2V4cHJgCiAqICAgKiBmb3Igb2JqZWN0IGRhdGEgc291cmNlczoKICogICAgICogYGxhYmVsYCAqKmBmb3IgKGAqKmBrZXlgICoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGAKICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBmb3IgKGAqKmBrZXlgICoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGAKICogICAgICogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgICoqYGZvciAoYCoqYGtleWAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgCiAqICAgICAqIGBzZWxlY3RgICoqYGFzYCoqIGBsYWJlbGAgKipgZ3JvdXAgYnlgKiogYGdyb3VwYAogKiAgICAgICAgICoqYGZvcmAgYChgKipga2V5YCoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGAKICoKICogV2hlcmU6CiAqCiAqICAgKiBgYXJyYXlgIC8gYG9iamVjdGA6IGFuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvIGFuIGFycmF5IC8gb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICogICAqIGB2YWx1ZWA6IGxvY2FsIHZhcmlhYmxlIHdoaWNoIHdpbGwgcmVmZXIgdG8gZWFjaCBpdGVtIGluIHRoZSBgYXJyYXlgIG9yIGVhY2ggcHJvcGVydHkgdmFsdWUKICogICAgICBvZiBgb2JqZWN0YCBkdXJpbmcgaXRlcmF0aW9uLgogKiAgICogYGtleWA6IGxvY2FsIHZhcmlhYmxlIHdoaWNoIHdpbGwgcmVmZXIgdG8gYSBwcm9wZXJ0eSBuYW1lIGluIGBvYmplY3RgIGR1cmluZyBpdGVyYXRpb24uCiAqICAgKiBgbGFiZWxgOiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIHRoZSBsYWJlbCBmb3IgYDxvcHRpb24+YCBlbGVtZW50LiBUaGUKICogICAgIGBleHByZXNzaW9uYCB3aWxsIG1vc3QgbGlrZWx5IHJlZmVyIHRvIHRoZSBgdmFsdWVgIHZhcmlhYmxlIChlLmcuIGB2YWx1ZS5wcm9wZXJ0eU5hbWVgKS4KICogICAqIGBzZWxlY3RgOiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGJvdW5kIHRvIHRoZSBtb2RlbCBvZiB0aGUgcGFyZW50IGA8c2VsZWN0PmAKICogICAgICBlbGVtZW50LiBJZiBub3Qgc3BlY2lmaWVkLCBgc2VsZWN0YCBleHByZXNzaW9uIHdpbGwgZGVmYXVsdCB0byBgdmFsdWVgLgogKiAgICogYGdyb3VwYDogVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZSB1c2VkIHRvIGdyb3VwIG9wdGlvbnMgdXNpbmcgdGhlIGA8b3B0Z3JvdXA+YAogKiAgICAgIERPTSBlbGVtZW50LgogKiAgICogYHRyYWNrZXhwcmA6IFVzZWQgd2hlbiB3b3JraW5nIHdpdGggYW4gYXJyYXkgb2Ygb2JqZWN0cy4gVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZQogKiAgICAgIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG9iamVjdHMgaW4gdGhlIGFycmF5LiBUaGUgYHRyYWNrZXhwcmAgd2lsbCBtb3N0IGxpa2VseSByZWZlciB0byB0aGUKICogICAgIGB2YWx1ZWAgdmFyaWFibGUgKGUuZy4gYHZhbHVlLnByb3BlcnR5TmFtZWApLiBXaXRoIHRoaXMgdGhlIHNlbGVjdGlvbiBpcyBwcmVzZXJ2ZWQKICogICAgICBldmVuIHdoZW4gdGhlIG9wdGlvbnMgYXJlIHJlY3JlYXRlZCAoZS5nLiByZWxvYWRlZCBmcm9tIHRoZSBzZXJ2ZXIpLgogKgogKiBAZXhhbXBsZQogICAgPGV4YW1wbGUgbW9kdWxlPSJzZWxlY3RFeGFtcGxlIj4KICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CiAgICAgICAgPHNjcmlwdD4KICAgICAgICBhbmd1bGFyLm1vZHVsZSgnc2VsZWN0RXhhbXBsZScsIFtdKQogICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKICAgICAgICAgICAgJHNjb3BlLmNvbG9ycyA9IFsKICAgICAgICAgICAgICB7bmFtZTonYmxhY2snLCBzaGFkZTonZGFyayd9LAogICAgICAgICAgICAgIHtuYW1lOid3aGl0ZScsIHNoYWRlOidsaWdodCd9LAogICAgICAgICAgICAgIHtuYW1lOidyZWQnLCBzaGFkZTonZGFyayd9LAogICAgICAgICAgICAgIHtuYW1lOidibHVlJywgc2hhZGU6J2RhcmsnfSwKICAgICAgICAgICAgICB7bmFtZToneWVsbG93Jywgc2hhZGU6J2xpZ2h0J30KICAgICAgICAgICAgXTsKICAgICAgICAgICAgJHNjb3BlLm15Q29sb3IgPSAkc2NvcGUuY29sb3JzWzJdOyAvLyByZWQKICAgICAgICAgIH1dKTsKICAgICAgICA8L3NjcmlwdD4KICAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0iY29sb3IgaW4gY29sb3JzIj4KICAgICAgICAgICAgICBOYW1lOiA8aW5wdXQgbmctbW9kZWw9ImNvbG9yLm5hbWUiPgogICAgICAgICAgICAgIFs8YSBocmVmIG5nLWNsaWNrPSJjb2xvcnMuc3BsaWNlKCRpbmRleCwgMSkiPlg8L2E+XQogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgWzxhIGhyZWYgbmctY2xpY2s9ImNvbG9ycy5wdXNoKHt9KSI+YWRkPC9hPl0KICAgICAgICAgICAgPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8aHIvPgogICAgICAgICAgQ29sb3IgKG51bGwgbm90IGFsbG93ZWQpOgogICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0ibXlDb2xvciIgbmctb3B0aW9ucz0iY29sb3IubmFtZSBmb3IgY29sb3IgaW4gY29sb3JzIj48L3NlbGVjdD48YnI+CgogICAgICAgICAgQ29sb3IgKG51bGwgYWxsb3dlZCk6CiAgICAgICAgICA8c3BhbiAgY2xhc3M9Im51bGxhYmxlIj4KICAgICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0ibXlDb2xvciIgbmctb3B0aW9ucz0iY29sb3IubmFtZSBmb3IgY29sb3IgaW4gY29sb3JzIj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPi0tIGNob29zZSBjb2xvciAtLTwvb3B0aW9uPgogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDwvc3Bhbj48YnIvPgoKICAgICAgICAgIENvbG9yIGdyb3VwZWQgYnkgc2hhZGU6CiAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJteUNvbG9yIiBuZy1vcHRpb25zPSJjb2xvci5uYW1lIGdyb3VwIGJ5IGNvbG9yLnNoYWRlIGZvciBjb2xvciBpbiBjb2xvcnMiPgogICAgICAgICAgPC9zZWxlY3Q+PGJyLz4KCgogICAgICAgICAgU2VsZWN0IDxhIGhyZWYgbmctY2xpY2s9Im15Q29sb3IgPSB7IG5hbWU6J25vdCBpbiBsaXN0Jywgc2hhZGU6ICdvdGhlcicgfSI+Ym9ndXM8L2E+Ljxicj4KICAgICAgICAgIDxoci8+CiAgICAgICAgICBDdXJyZW50bHkgc2VsZWN0ZWQ6IHt7IHtzZWxlY3RlZF9jb2xvcjpteUNvbG9yfSB9fQogICAgICAgICAgPGRpdiBzdHlsZT0iYm9yZGVyOnNvbGlkIDFweCBibGFjazsgaGVpZ2h0OjIwcHgiCiAgICAgICAgICAgICAgIG5nLXN0eWxlPSJ7J2JhY2tncm91bmQtY29sb3InOm15Q29sb3IubmFtZX0iPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZmlsZT4KICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctb3B0aW9ucycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3tzZWxlY3RlZF9jb2xvcjpteUNvbG9yfScpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJ3JlZCcpOwogICAgICAgICAgIGVsZW1lbnQuYWxsKGJ5Lm1vZGVsKCdteUNvbG9yJykpLmZpcnN0KCkuY2xpY2soKTsKICAgICAgICAgICBlbGVtZW50LmFsbChieS5jc3MoJ3NlbGVjdFtuZy1tb2RlbD0ibXlDb2xvciJdIG9wdGlvbicpKS5maXJzdCgpLmNsaWNrKCk7CiAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygne3NlbGVjdGVkX2NvbG9yOm15Q29sb3J9JykpLmdldFRleHQoKSkudG9NYXRjaCgnYmxhY2snKTsKICAgICAgICAgICBlbGVtZW50KGJ5LmNzcygnLm51bGxhYmxlIHNlbGVjdFtuZy1tb2RlbD0ibXlDb2xvciJdJykpLmNsaWNrKCk7CiAgICAgICAgICAgZWxlbWVudC5hbGwoYnkuY3NzKCcubnVsbGFibGUgc2VsZWN0W25nLW1vZGVsPSJteUNvbG9yIl0gb3B0aW9uJykpLmZpcnN0KCkuY2xpY2soKTsKICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd7c2VsZWN0ZWRfY29sb3I6bXlDb2xvcn0nKSkuZ2V0VGV4dCgpKS50b01hdGNoKCdudWxsJyk7CiAgICAgICAgIH0pOwogICAgICA8L2ZpbGU+CiAgICA8L2V4YW1wbGU+CiAqLwoKdmFyIG5nT3B0aW9uc0RpcmVjdGl2ZSA9IHZhbHVlRm4oewogIHJlc3RyaWN0OiAnQScsCiAgdGVybWluYWw6IHRydWUKfSk7CgovLyBqc2hpbnQgbWF4bGVuOiBmYWxzZQp2YXIgc2VsZWN0RGlyZWN0aXZlID0gWyckY29tcGlsZScsICckcGFyc2UnLCBmdW5jdGlvbigkY29tcGlsZSwgICAkcGFyc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vMDAwMDExMTExMTExMTEwMDAwMDAwMDAwMDIyMjIyMjIyMjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMzMzMzMzMzMzMDAwMDAwMDAwMDAwMDA0NDQ0NDQ0NDQ0NDQ0NDQwMDAwMDAwMDA1NTU1NTU1NTU1NTU1NTUwMDAwMDAwNjY2NjY2NjY2NjY2NjY2MDAwMDAwMDAwMDAwMDAwNzc3Nzc3Nzc3NzAwMDAwMDAwMDAwMDAwMDAwMDA4ODg4ODg4ODg4CiAgdmFyIE5HX09QVElPTlNfUkVHRVhQID0gL15ccyooW1xzXFNdKz8pKD86XHMrYXNccysoW1xzXFNdKz8pKT8oPzpccytncm91cFxzK2J5XHMrKFtcc1xTXSs/KSk/XHMrZm9yXHMrKD86KFtcJFx3XVtcJFx3XSopfCg/OlwoXHMqKFtcJFx3XVtcJFx3XSopXHMqLFxzKihbXCRcd11bXCRcd10qKVxzKlwpKSlccytpblxzKyhbXHNcU10rPykoPzpccyt0cmFja1xzK2J5XHMrKFtcc1xTXSs/KSk/JC8sCiAgICAgIG51bGxNb2RlbEN0cmwgPSB7JHNldFZpZXdWYWx1ZTogbm9vcH07Ci8vIGpzaGludCBtYXhsZW46IDEwMAoKICByZXR1cm4gewogICAgcmVzdHJpY3Q6ICdFJywKICAgIHJlcXVpcmU6IFsnc2VsZWN0JywgJz9uZ01vZGVsJ10sCiAgICBjb250cm9sbGVyOiBbJyRlbGVtZW50JywgJyRzY29wZScsICckYXR0cnMnLCBmdW5jdGlvbigkZWxlbWVudCwgJHNjb3BlLCAkYXR0cnMpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgICAgb3B0aW9uc01hcCA9IHt9LAogICAgICAgICAgbmdNb2RlbEN0cmwgPSBudWxsTW9kZWxDdHJsLAogICAgICAgICAgbnVsbE9wdGlvbiwKICAgICAgICAgIHVua25vd25PcHRpb247CgoKICAgICAgc2VsZi5kYXRhYm91bmQgPSAkYXR0cnMubmdNb2RlbDsKCgogICAgICBzZWxmLmluaXQgPSBmdW5jdGlvbihuZ01vZGVsQ3RybF8sIG51bGxPcHRpb25fLCB1bmtub3duT3B0aW9uXykgewogICAgICAgIG5nTW9kZWxDdHJsID0gbmdNb2RlbEN0cmxfOwogICAgICAgIG51bGxPcHRpb24gPSBudWxsT3B0aW9uXzsKICAgICAgICB1bmtub3duT3B0aW9uID0gdW5rbm93bk9wdGlvbl87CiAgICAgIH07CgoKICAgICAgc2VsZi5hZGRPcHRpb24gPSBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkgewogICAgICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KHZhbHVlLCAnIm9wdGlvbiB2YWx1ZSInKTsKICAgICAgICBvcHRpb25zTWFwW3ZhbHVlXSA9IHRydWU7CgogICAgICAgIGlmIChuZ01vZGVsQ3RybC4kdmlld1ZhbHVlID09IHZhbHVlKSB7CiAgICAgICAgICAkZWxlbWVudC52YWwodmFsdWUpOwogICAgICAgICAgaWYgKHVua25vd25PcHRpb24ucGFyZW50KCkpIHVua25vd25PcHRpb24ucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zODE0NTkKICAgICAgICAvLyBBZGRpbmcgYW4gPG9wdGlvbiBzZWxlY3RlZD0ic2VsZWN0ZWQiPiBlbGVtZW50IHRvIGEgPHNlbGVjdCByZXF1aXJlZD0icmVxdWlyZWQiPiBzaG91bGQKICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgbmV3IGVsZW1lbnQKICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50WzBdLmhhc0F0dHJpYnV0ZSgnc2VsZWN0ZWQnKSkgewogICAgICAgICAgZWxlbWVudFswXS5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwoKCiAgICAgIHNlbGYucmVtb3ZlT3B0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5oYXNPcHRpb24odmFsdWUpKSB7CiAgICAgICAgICBkZWxldGUgb3B0aW9uc01hcFt2YWx1ZV07CiAgICAgICAgICBpZiAobmdNb2RlbEN0cmwuJHZpZXdWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJVbmtub3duT3B0aW9uKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CgoKICAgICAgc2VsZi5yZW5kZXJVbmtub3duT3B0aW9uID0gZnVuY3Rpb24odmFsKSB7CiAgICAgICAgdmFyIHVua25vd25WYWwgPSAnPyAnICsgaGFzaEtleSh2YWwpICsgJyA/JzsKICAgICAgICB1bmtub3duT3B0aW9uLnZhbCh1bmtub3duVmFsKTsKICAgICAgICAkZWxlbWVudC5wcmVwZW5kKHVua25vd25PcHRpb24pOwogICAgICAgICRlbGVtZW50LnZhbCh1bmtub3duVmFsKTsKICAgICAgICB1bmtub3duT3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7IC8vIG5lZWRlZCBmb3IgSUUKICAgICAgfTsKCgogICAgICBzZWxmLmhhc09wdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnNNYXAuaGFzT3duUHJvcGVydHkodmFsdWUpOwogICAgICB9OwoKICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKICAgICAgICAvLyBkaXNhYmxlIHVua25vd24gb3B0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZG8gd29yayB3aGVuIHRoZSB3aG9sZSBzZWxlY3QgaXMgYmVpbmcgZGVzdHJveWVkCiAgICAgICAgc2VsZi5yZW5kZXJVbmtub3duT3B0aW9uID0gbm9vcDsKICAgICAgfSk7CiAgICB9XSwKCiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHMpIHsKICAgICAgLy8gaWYgbmdNb2RlbCBpcyBub3QgZGVmaW5lZCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwogICAgICBpZiAoIWN0cmxzWzFdKSByZXR1cm47CgogICAgICB2YXIgc2VsZWN0Q3RybCA9IGN0cmxzWzBdLAogICAgICAgICAgbmdNb2RlbEN0cmwgPSBjdHJsc1sxXSwKICAgICAgICAgIG11bHRpcGxlID0gYXR0ci5tdWx0aXBsZSwKICAgICAgICAgIG9wdGlvbnNFeHAgPSBhdHRyLm5nT3B0aW9ucywKICAgICAgICAgIG51bGxPcHRpb24gPSBmYWxzZSwgLy8gaWYgZmFsc2UsIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBzZWxlY3QgaXQgKHVzZWQgYnkgbmdPcHRpb25zKQogICAgICAgICAgZW1wdHlPcHRpb24sCiAgICAgICAgICByZW5kZXJTY2hlZHVsZWQgPSBmYWxzZSwKICAgICAgICAgIC8vIHdlIGNhbid0IGp1c3QganFMaXRlKCc8b3B0aW9uPicpIHNpbmNlIGpxTGl0ZSBpcyBub3Qgc21hcnQgZW5vdWdoCiAgICAgICAgICAvLyB0byBjcmVhdGUgaXQgaW4gPHNlbGVjdD4gYW5kIElFIGJhcmZzIG90aGVyd2lzZS4KICAgICAgICAgIG9wdGlvblRlbXBsYXRlID0ganFMaXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpKSwKICAgICAgICAgIG9wdEdyb3VwVGVtcGxhdGUgPWpxTGl0ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRncm91cCcpKSwKICAgICAgICAgIHVua25vd25PcHRpb24gPSBvcHRpb25UZW1wbGF0ZS5jbG9uZSgpOwoKICAgICAgLy8gZmluZCAibnVsbCIgb3B0aW9uCiAgICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKSwgaWkgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnZhbHVlID09PSAnJykgewogICAgICAgICAgZW1wdHlPcHRpb24gPSBudWxsT3B0aW9uID0gY2hpbGRyZW4uZXEoaSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNlbGVjdEN0cmwuaW5pdChuZ01vZGVsQ3RybCwgbnVsbE9wdGlvbiwgdW5rbm93bk9wdGlvbik7CgogICAgICAvLyByZXF1aXJlZCB2YWxpZGF0b3IKICAgICAgaWYgKG11bHRpcGxlKSB7CiAgICAgICAgbmdNb2RlbEN0cmwuJGlzRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuICF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDA7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgaWYgKG9wdGlvbnNFeHApIHNldHVwQXNPcHRpb25zKHNjb3BlLCBlbGVtZW50LCBuZ01vZGVsQ3RybCk7CiAgICAgIGVsc2UgaWYgKG11bHRpcGxlKSBzZXR1cEFzTXVsdGlwbGUoc2NvcGUsIGVsZW1lbnQsIG5nTW9kZWxDdHJsKTsKICAgICAgZWxzZSBzZXR1cEFzU2luZ2xlKHNjb3BlLCBlbGVtZW50LCBuZ01vZGVsQ3RybCwgc2VsZWN0Q3RybCk7CgoKICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCgogICAgICBmdW5jdGlvbiBzZXR1cEFzU2luZ2xlKHNjb3BlLCBzZWxlY3RFbGVtZW50LCBuZ01vZGVsQ3RybCwgc2VsZWN0Q3RybCkgewogICAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciB2aWV3VmFsdWUgPSBuZ01vZGVsQ3RybC4kdmlld1ZhbHVlOwoKICAgICAgICAgIGlmIChzZWxlY3RDdHJsLmhhc09wdGlvbih2aWV3VmFsdWUpKSB7CiAgICAgICAgICAgIGlmICh1bmtub3duT3B0aW9uLnBhcmVudCgpKSB1bmtub3duT3B0aW9uLnJlbW92ZSgpOwogICAgICAgICAgICBzZWxlY3RFbGVtZW50LnZhbCh2aWV3VmFsdWUpOwogICAgICAgICAgICBpZiAodmlld1ZhbHVlID09PSAnJykgZW1wdHlPcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgLy8gdG8gbWFrZSBJRTkgaGFwcHkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2aWV3VmFsdWUpICYmIGVtcHR5T3B0aW9uKSB7CiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC52YWwoJycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNlbGVjdEN0cmwucmVuZGVyVW5rbm93bk9wdGlvbih2aWV3VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh1bmtub3duT3B0aW9uLnBhcmVudCgpKSB1bmtub3duT3B0aW9uLnJlbW92ZSgpOwogICAgICAgICAgICBuZ01vZGVsQ3RybC4kc2V0Vmlld1ZhbHVlKHNlbGVjdEVsZW1lbnQudmFsKCkpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNldHVwQXNNdWx0aXBsZShzY29wZSwgc2VsZWN0RWxlbWVudCwgY3RybCkgewogICAgICAgIHZhciBsYXN0VmlldzsKICAgICAgICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBpdGVtcyA9IG5ldyBIYXNoTWFwKGN0cmwuJHZpZXdWYWx1ZSk7CiAgICAgICAgICBmb3JFYWNoKHNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uJyksIGZ1bmN0aW9uKG9wdGlvbikgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBpc0RlZmluZWQoaXRlbXMuZ2V0KG9wdGlvbi52YWx1ZSkpOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyBpdCBvbiBlYWNoIHdhdGNoIHNpbmNlIG5nTW9kZWwgd2F0Y2hlcyByZWZlcmVuY2UsIGJ1dAogICAgICAgIC8vIHdlIG5lZWQgdG8gd29yayBvZiBhbiBhcnJheSwgc28gd2UgbmVlZCB0byBzZWUgaWYgYW55dGhpbmcgd2FzIGluc2VydGVkL3JlbW92ZWQKICAgICAgICBzY29wZS4kd2F0Y2goZnVuY3Rpb24gc2VsZWN0TXVsdGlwbGVXYXRjaCgpIHsKICAgICAgICAgIGlmICghZXF1YWxzKGxhc3RWaWV3LCBjdHJsLiR2aWV3VmFsdWUpKSB7CiAgICAgICAgICAgIGxhc3RWaWV3ID0gc2hhbGxvd0NvcHkoY3RybC4kdmlld1ZhbHVlKTsKICAgICAgICAgICAgY3RybC4kcmVuZGVyKCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHNlbGVjdEVsZW1lbnQub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgZm9yRWFjaChzZWxlY3RFbGVtZW50LmZpbmQoJ29wdGlvbicpLCBmdW5jdGlvbihvcHRpb24pIHsKICAgICAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG9wdGlvbi52YWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKGFycmF5KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzZXR1cEFzT3B0aW9ucyhzY29wZSwgc2VsZWN0RWxlbWVudCwgY3RybCkgewogICAgICAgIHZhciBtYXRjaDsKCiAgICAgICAgaWYgKCEobWF0Y2ggPSBvcHRpb25zRXhwLm1hdGNoKE5HX09QVElPTlNfUkVHRVhQKSkpIHsKICAgICAgICAgIHRocm93IG5nT3B0aW9uc01pbkVycignaWV4cCcsCiAgICAgICAgICAgICJFeHBlY3RlZCBleHByZXNzaW9uIGluIGZvcm0gb2YgIiArCiAgICAgICAgICAgICInX3NlbGVjdF8gKGFzIF9sYWJlbF8pPyBmb3IgKF9rZXlfLCk/X3ZhbHVlXyBpbiBfY29sbGVjdGlvbl8nIiArCiAgICAgICAgICAgICIgYnV0IGdvdCAnezB9Jy4gRWxlbWVudDogezF9IiwKICAgICAgICAgICAgb3B0aW9uc0V4cCwgc3RhcnRpbmdUYWcoc2VsZWN0RWxlbWVudCkpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGRpc3BsYXlGbiA9ICRwYXJzZShtYXRjaFsyXSB8fCBtYXRjaFsxXSksCiAgICAgICAgICAgIHZhbHVlTmFtZSA9IG1hdGNoWzRdIHx8IG1hdGNoWzZdLAogICAgICAgICAgICBzZWxlY3RBcyA9IC8gYXMgLy50ZXN0KG1hdGNoWzBdKSAmJiBtYXRjaFsxXSwKICAgICAgICAgICAgc2VsZWN0QXNGbiA9IHNlbGVjdEFzID8gJHBhcnNlKHNlbGVjdEFzKSA6IG51bGwsCiAgICAgICAgICAgIGtleU5hbWUgPSBtYXRjaFs1XSwKICAgICAgICAgICAgZ3JvdXBCeUZuID0gJHBhcnNlKG1hdGNoWzNdIHx8ICcnKSwKICAgICAgICAgICAgdmFsdWVGbiA9ICRwYXJzZShtYXRjaFsyXSA/IG1hdGNoWzFdIDogdmFsdWVOYW1lKSwKICAgICAgICAgICAgdmFsdWVzRm4gPSAkcGFyc2UobWF0Y2hbN10pLAogICAgICAgICAgICB0cmFjayA9IG1hdGNoWzhdLAogICAgICAgICAgICB0cmFja0ZuID0gdHJhY2sgPyAkcGFyc2UobWF0Y2hbOF0pIDogbnVsbCwKICAgICAgICAgICAgdHJhY2tLZXlzQ2FjaGUgPSB7fSwKICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBhcnJheSBvZiBhcnJheSBvZiBleGlzdGluZyBvcHRpb24gZ3JvdXBzIGluIERPTS4KICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIHJldXNlIHRoZXNlIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIC8vIC0gb3B0aW9uR3JvdXBzQ2FjaGVbMF0gaXMgdGhlIG9wdGlvbnMgd2l0aCBubyBvcHRpb24gZ3JvdXAKICAgICAgICAgICAgLy8gLSBvcHRpb25Hcm91cHNDYWNoZVs/XVswXSBpcyB0aGUgcGFyZW50OiBlaXRoZXIgdGhlIFNFTEVDVCBvciBPUFRHUk9VUCBlbGVtZW50CiAgICAgICAgICAgIG9wdGlvbkdyb3Vwc0NhY2hlID0gW1t7ZWxlbWVudDogc2VsZWN0RWxlbWVudCwgbGFiZWw6Jyd9XV0sCiAgICAgICAgICAgIC8vcmUtdXNhYmxlIG9iamVjdCB0byByZXByZXNlbnQgb3B0aW9uJ3MgbG9jYWxzCiAgICAgICAgICAgIGxvY2FscyA9IHt9OwoKICAgICAgICBpZiAobnVsbE9wdGlvbikgewogICAgICAgICAgLy8gY29tcGlsZSB0aGUgZWxlbWVudCBzaW5jZSB0aGVyZSBtaWdodCBiZSBiaW5kaW5ncyBpbiBpdAogICAgICAgICAgJGNvbXBpbGUobnVsbE9wdGlvbikoc2NvcGUpOwoKICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2xhc3MsIHdoaWNoIGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgYmVjYXVzZSB3ZSByZWNvbXBpbGUgdGhlIGVsZW1lbnQgYW5kIGl0CiAgICAgICAgICAvLyBiZWNvbWVzIHRoZSBjb21waWxhdGlvbiByb290CiAgICAgICAgICBudWxsT3B0aW9uLnJlbW92ZUNsYXNzKCduZy1zY29wZScpOwoKICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVtb3ZlIGl0IGJlZm9yZSBjYWxsaW5nIHNlbGVjdEVsZW1lbnQuZW1wdHkoKSBiZWNhdXNlIG90aGVyd2lzZSBJRSB3aWxsCiAgICAgICAgICAvLyByZW1vdmUgdGhlIGxhYmVsIGZyb20gdGhlIGVsZW1lbnQuIHd0Zj8KICAgICAgICAgIG51bGxPcHRpb24ucmVtb3ZlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBjbGVhciBjb250ZW50cywgd2UnbGwgYWRkIHdoYXQncyBuZWVkZWQgYmFzZWQgb24gdGhlIG1vZGVsCiAgICAgICAgc2VsZWN0RWxlbWVudC5lbXB0eSgpOwoKICAgICAgICBzZWxlY3RFbGVtZW50Lm9uKCdjaGFuZ2UnLCBzZWxlY3Rpb25DaGFuZ2VkKTsKCiAgICAgICAgY3RybC4kcmVuZGVyID0gcmVuZGVyOwoKICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKHZhbHVlc0ZuLCBzY2hlZHVsZVJlbmRlcmluZyk7CiAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbihnZXRMYWJlbHMsIHNjaGVkdWxlUmVuZGVyaW5nKTsKCiAgICAgICAgaWYgKG11bHRpcGxlKSB7CiAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKGZ1bmN0aW9uKCkgeyByZXR1cm4gY3RybC4kbW9kZWxWYWx1ZTsgfSwgc2NoZWR1bGVSZW5kZXJpbmcpOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCgogICAgICAgIGZ1bmN0aW9uIGNhbGxFeHByZXNzaW9uKGV4cHJGbiwga2V5LCB2YWx1ZSkgewogICAgICAgICAgbG9jYWxzW3ZhbHVlTmFtZV0gPSB2YWx1ZTsKICAgICAgICAgIGlmIChrZXlOYW1lKSBsb2NhbHNba2V5TmFtZV0gPSBrZXk7CiAgICAgICAgICByZXR1cm4gZXhwckZuKHNjb3BlLCBsb2NhbHMpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc2VsZWN0aW9uQ2hhbmdlZCgpIHsKICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSB2YWx1ZXNGbihzY29wZSkgfHwgW107CiAgICAgICAgICAgIHZhciB2aWV3VmFsdWU7CiAgICAgICAgICAgIGlmIChtdWx0aXBsZSkgewogICAgICAgICAgICAgIHZpZXdWYWx1ZSA9IFtdOwogICAgICAgICAgICAgIGZvckVhY2goc2VsZWN0RWxlbWVudC52YWwoKSwgZnVuY3Rpb24oc2VsZWN0ZWRLZXkpIHsKICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRLZXkgPSB0cmFja0ZuID8gdHJhY2tLZXlzQ2FjaGVbc2VsZWN0ZWRLZXldIDogc2VsZWN0ZWRLZXk7CiAgICAgICAgICAgICAgICB2aWV3VmFsdWUucHVzaChnZXRWaWV3VmFsdWUoc2VsZWN0ZWRLZXksIGNvbGxlY3Rpb25bc2VsZWN0ZWRLZXldKSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkS2V5ID0gdHJhY2tGbiA/IHRyYWNrS2V5c0NhY2hlW3NlbGVjdEVsZW1lbnQudmFsKCldIDogc2VsZWN0RWxlbWVudC52YWwoKTsKICAgICAgICAgICAgICB2aWV3VmFsdWUgPSBnZXRWaWV3VmFsdWUoc2VsZWN0ZWRLZXksIGNvbGxlY3Rpb25bc2VsZWN0ZWRLZXldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdHJsLiRzZXRWaWV3VmFsdWUodmlld1ZhbHVlKTsKICAgICAgICAgICAgcmVuZGVyKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldFZpZXdWYWx1ZShrZXksIHZhbHVlKSB7CiAgICAgICAgICBpZiAoa2V5ID09PSAnPycpIHsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciB2aWV3VmFsdWVGbiA9IHNlbGVjdEFzRm4gPyBzZWxlY3RBc0ZuIDogdmFsdWVGbjsKICAgICAgICAgICAgcmV0dXJuIGNhbGxFeHByZXNzaW9uKHZpZXdWYWx1ZUZuLCBrZXksIHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldExhYmVscygpIHsKICAgICAgICAgIHZhciB2YWx1ZXMgPSB2YWx1ZXNGbihzY29wZSk7CiAgICAgICAgICB2YXIgdG9EaXNwbGF5OwogICAgICAgICAgaWYgKHZhbHVlcyAmJiBpc0FycmF5KHZhbHVlcykpIHsKICAgICAgICAgICAgdG9EaXNwbGF5ID0gbmV3IEFycmF5KHZhbHVlcy5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB2YWx1ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgIHRvRGlzcGxheVtpXSA9IGNhbGxFeHByZXNzaW9uKGRpc3BsYXlGbiwgaSwgdmFsdWVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdG9EaXNwbGF5OwogICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXMpIHsKICAgICAgICAgICAgLy8gVE9ETzogQWRkIGEgdGVzdCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgIHRvRGlzcGxheSA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHZhbHVlcykgewogICAgICAgICAgICAgIGlmICh2YWx1ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgIHRvRGlzcGxheVtwcm9wXSA9IGNhbGxFeHByZXNzaW9uKGRpc3BsYXlGbiwgcHJvcCwgdmFsdWVzW3Byb3BdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0b0Rpc3BsYXk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjcmVhdGVJc1NlbGVjdGVkRm4odmlld1ZhbHVlKSB7CiAgICAgICAgICB2YXIgc2VsZWN0ZWRTZXQ7CiAgICAgICAgICBpZiAobXVsdGlwbGUpIHsKICAgICAgICAgICAgaWYgKHRyYWNrRm4gJiYgaXNBcnJheSh2aWV3VmFsdWUpKSB7CgogICAgICAgICAgICAgIHNlbGVjdGVkU2V0ID0gbmV3IEhhc2hNYXAoW10pOwogICAgICAgICAgICAgIGZvciAodmFyIHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgdmlld1ZhbHVlLmxlbmd0aDsgdHJhY2tJbmRleCsrKSB7CiAgICAgICAgICAgICAgICAvLyB0cmFja2luZyBieSBrZXkKICAgICAgICAgICAgICAgIHNlbGVjdGVkU2V0LnB1dChjYWxsRXhwcmVzc2lvbih0cmFja0ZuLCBudWxsLCB2aWV3VmFsdWVbdHJhY2tJbmRleF0pLCB0cnVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2VsZWN0ZWRTZXQgPSBuZXcgSGFzaE1hcCh2aWV3VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrRm4pIHsKICAgICAgICAgICAgdmlld1ZhbHVlID0gY2FsbEV4cHJlc3Npb24odHJhY2tGbiwgbnVsbCwgdmlld1ZhbHVlKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaXNTZWxlY3RlZChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBjb21wYXJlVmFsdWVGbjsKICAgICAgICAgICAgaWYgKHRyYWNrRm4pIHsKICAgICAgICAgICAgICBjb21wYXJlVmFsdWVGbiA9IHRyYWNrRm47CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0QXNGbikgewogICAgICAgICAgICAgIGNvbXBhcmVWYWx1ZUZuID0gc2VsZWN0QXNGbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb21wYXJlVmFsdWVGbiA9IHZhbHVlRm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtdWx0aXBsZSkgewogICAgICAgICAgICAgIHJldHVybiBpc0RlZmluZWQoc2VsZWN0ZWRTZXQucmVtb3ZlKGNhbGxFeHByZXNzaW9uKGNvbXBhcmVWYWx1ZUZuLCBrZXksIHZhbHVlKSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiB2aWV3VmFsdWUgPT09IGNhbGxFeHByZXNzaW9uKGNvbXBhcmVWYWx1ZUZuLCBrZXksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVuZGVyaW5nKCkgewogICAgICAgICAgaWYgKCFyZW5kZXJTY2hlZHVsZWQpIHsKICAgICAgICAgICAgc2NvcGUuJCRwb3N0RGlnZXN0KHJlbmRlcik7CiAgICAgICAgICAgIHJlbmRlclNjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBIG5ldyBsYWJlbE1hcCBpcyBjcmVhdGVkIHdpdGggZWFjaCByZW5kZXIuCiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggZXhpc3Rpbmcgb3B0aW9uIHdpdGggYWRkZWQ9ZmFsc2UsCiAgICAgICAgICogYW5kIGVhY2ggbmV3IG9wdGlvbiB3aXRoIGFkZGVkPXRydWUuCiAgICAgICAgICogLSBMYWJlbHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIHR3aWNlLAogICAgICAgICAqIChvbmNlIHdpdGggYWRkZWQ9dHJ1ZSBhbmQgb25jZSB3aXRoIGFkZGVkPWZhbHNlKSB3aWxsIGVuZCB1cCB3aXRoIGEgdmFsdWUgb2YgMCwgYW5kCiAgICAgICAgICogd2lsbCBjYXVzZSBubyBjaGFuZ2UgdG8gaGFwcGVuIHRvIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbi4KICAgICAgICAgKiAtIExhYmVscyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhpcyBtZXRob2Qgb25seSBvbmNlIHdpdGggYWRkZWQ9ZmFsc2Ugd2lsbCBlbmQgdXAgd2l0aCBhCiAgICAgICAgICogdmFsdWUgb2YgLTEgYW5kIHdpbGwgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8gc2VsZWN0Q3RybC5yZW1vdmVPcHRpb24oKQogICAgICAgICAqIC0gTGFiZWxzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBvbmx5IG9uY2Ugd2l0aCBhZGRlZD10cnVlIHdpbGwgZW5kIHVwIHdpdGggYQogICAgICAgICAqIHZhbHVlIG9mIDEgYW5kIHdpbGwgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8gc2VsZWN0Q3RybC5hZGRPcHRpb24oKQogICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlTGFiZWxNYXAobGFiZWxNYXAsIGxhYmVsLCBhZGRlZCkgewogICAgICAgICAgbGFiZWxNYXBbbGFiZWxdID0gbGFiZWxNYXBbbGFiZWxdIHx8IDA7CiAgICAgICAgICBsYWJlbE1hcFtsYWJlbF0gKz0gKGFkZGVkID8gMSA6IC0xKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgIHJlbmRlclNjaGVkdWxlZCA9IGZhbHNlOwoKICAgICAgICAgIC8vIFRlbXBvcmFyeSBsb2NhdGlvbiBmb3IgdGhlIG9wdGlvbiBncm91cHMgYmVmb3JlIHdlIHJlbmRlciB0aGVtCiAgICAgICAgICB2YXIgb3B0aW9uR3JvdXBzID0geycnOltdfSwKICAgICAgICAgICAgICBvcHRpb25Hcm91cE5hbWVzID0gWycnXSwKICAgICAgICAgICAgICBvcHRpb25Hcm91cE5hbWUsCiAgICAgICAgICAgICAgb3B0aW9uR3JvdXAsCiAgICAgICAgICAgICAgb3B0aW9uLAogICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50LCBleGlzdGluZ09wdGlvbnMsIGV4aXN0aW5nT3B0aW9uLAogICAgICAgICAgICAgIHZpZXdWYWx1ZSA9IGN0cmwuJHZpZXdWYWx1ZSwKICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXNGbihzY29wZSkgfHwgW10sCiAgICAgICAgICAgICAga2V5cyA9IGtleU5hbWUgPyBzb3J0ZWRLZXlzKHZhbHVlcykgOiB2YWx1ZXMsCiAgICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgIGdyb3VwTGVuZ3RoLCBsZW5ndGgsCiAgICAgICAgICAgICAgZ3JvdXBJbmRleCwgaW5kZXgsCiAgICAgICAgICAgICAgbGFiZWxNYXAgPSB7fSwKICAgICAgICAgICAgICBzZWxlY3RlZCwKICAgICAgICAgICAgICBpc1NlbGVjdGVkID0gY3JlYXRlSXNTZWxlY3RlZEZuKHZpZXdWYWx1ZSksCiAgICAgICAgICAgICAgYW55U2VsZWN0ZWQgPSBmYWxzZSwKICAgICAgICAgICAgICBsYXN0RWxlbWVudCwKICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgIGxhYmVsLAogICAgICAgICAgICAgIG9wdGlvbklkOwoKICAgICAgICAgIHRyYWNrS2V5c0NhY2hlID0ge307CgogICAgICAgICAgLy8gV2Ugbm93IGJ1aWxkIHVwIHRoZSBsaXN0IG9mIG9wdGlvbnMgd2UgbmVlZCAod2UgbWVyZ2UgbGF0ZXIpCiAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgbGVuZ3RoID0ga2V5cy5sZW5ndGgsIGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgIGtleSA9IGluZGV4OwogICAgICAgICAgICBpZiAoa2V5TmFtZSkgewogICAgICAgICAgICAgIGtleSA9IGtleXNbaW5kZXhdOwogICAgICAgICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnJCcpIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2tleV07CgogICAgICAgICAgICBvcHRpb25Hcm91cE5hbWUgPSBjYWxsRXhwcmVzc2lvbihncm91cEJ5Rm4sIGtleSwgdmFsdWUpIHx8ICcnOwogICAgICAgICAgICBpZiAoIShvcHRpb25Hcm91cCA9IG9wdGlvbkdyb3Vwc1tvcHRpb25Hcm91cE5hbWVdKSkgewogICAgICAgICAgICAgIG9wdGlvbkdyb3VwID0gb3B0aW9uR3JvdXBzW29wdGlvbkdyb3VwTmFtZV0gPSBbXTsKICAgICAgICAgICAgICBvcHRpb25Hcm91cE5hbWVzLnB1c2gob3B0aW9uR3JvdXBOYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZWN0ZWQgPSBpc1NlbGVjdGVkKGtleSwgdmFsdWUpOwogICAgICAgICAgICBhbnlTZWxlY3RlZCA9IGFueVNlbGVjdGVkIHx8IHNlbGVjdGVkOwoKICAgICAgICAgICAgbGFiZWwgPSBjYWxsRXhwcmVzc2lvbihkaXNwbGF5Rm4sIGtleSwgdmFsdWUpOyAvLyB3aGF0IHdpbGwgYmUgc2VlbiBieSB0aGUgdXNlcgoKICAgICAgICAgICAgLy8gZG9pbmcgZGlzcGxheUZuKHNjb3BlLCBsb2NhbHMpIHx8ICcnIG92ZXJ3cml0ZXMgemVybyB2YWx1ZXMKICAgICAgICAgICAgbGFiZWwgPSBpc0RlZmluZWQobGFiZWwpID8gbGFiZWwgOiAnJzsKICAgICAgICAgICAgb3B0aW9uSWQgPSB0cmFja0ZuID8gdHJhY2tGbihzY29wZSwgbG9jYWxzKSA6IChrZXlOYW1lID8ga2V5c1tpbmRleF0gOiBpbmRleCk7CiAgICAgICAgICAgIGlmICh0cmFja0ZuKSB7CiAgICAgICAgICAgICAgdHJhY2tLZXlzQ2FjaGVbb3B0aW9uSWRdID0ga2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICBvcHRpb25Hcm91cC5wdXNoKHsKICAgICAgICAgICAgICAvLyBlaXRoZXIgdGhlIGluZGV4IGludG8gYXJyYXkgb3Iga2V5IGZyb20gb2JqZWN0CiAgICAgICAgICAgICAgaWQ6IG9wdGlvbklkLAogICAgICAgICAgICAgIGxhYmVsOiBsYWJlbCwKICAgICAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWQgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBzZWxlY3RlZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbXVsdGlwbGUpIHsKICAgICAgICAgICAgaWYgKG51bGxPcHRpb24gfHwgdmlld1ZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gaW5zZXJ0IG51bGwgb3B0aW9uIGlmIHdlIGhhdmUgYSBwbGFjZWhvbGRlciwgb3IgdGhlIG1vZGVsIGlzIG51bGwKICAgICAgICAgICAgICBvcHRpb25Hcm91cHNbJyddLnVuc2hpZnQoe2lkOicnLCBsYWJlbDonJywgc2VsZWN0ZWQ6IWFueVNlbGVjdGVkfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFueVNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgLy8gb3B0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZCwgd2UgaGF2ZSB0byBpbnNlcnQgdGhlIHVuZGVmaW5lZCBpdGVtCiAgICAgICAgICAgICAgb3B0aW9uR3JvdXBzWycnXS51bnNoaWZ0KHtpZDonPycsIGxhYmVsOicnLCBzZWxlY3RlZDp0cnVlfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgRE9NIG5vZGVzIHRvIG1hdGNoIHRoZSBvcHRpb25Hcm91cHMgd2UgY29tcHV0ZWQgYWJvdmUKICAgICAgICAgIGZvciAoZ3JvdXBJbmRleCA9IDAsIGdyb3VwTGVuZ3RoID0gb3B0aW9uR3JvdXBOYW1lcy5sZW5ndGg7CiAgICAgICAgICAgICAgIGdyb3VwSW5kZXggPCBncm91cExlbmd0aDsKICAgICAgICAgICAgICAgZ3JvdXBJbmRleCsrKSB7CiAgICAgICAgICAgIC8vIGN1cnJlbnQgb3B0aW9uIGdyb3VwIG5hbWUgb3IgJycgaWYgbm8gZ3JvdXAKICAgICAgICAgICAgb3B0aW9uR3JvdXBOYW1lID0gb3B0aW9uR3JvdXBOYW1lc1tncm91cEluZGV4XTsKCiAgICAgICAgICAgIC8vIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgdGhhdCBncm91cC4gKGZpcnN0IGl0ZW0gaGFzIHRoZSBwYXJlbnQpCiAgICAgICAgICAgIG9wdGlvbkdyb3VwID0gb3B0aW9uR3JvdXBzW29wdGlvbkdyb3VwTmFtZV07CgogICAgICAgICAgICBpZiAob3B0aW9uR3JvdXBzQ2FjaGUubGVuZ3RoIDw9IGdyb3VwSW5kZXgpIHsKICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdyb3cgdGhlIG9wdGlvbkdyb3VwcwogICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50ID0gewogICAgICAgICAgICAgICAgZWxlbWVudDogb3B0R3JvdXBUZW1wbGF0ZS5jbG9uZSgpLmF0dHIoJ2xhYmVsJywgb3B0aW9uR3JvdXBOYW1lKSwKICAgICAgICAgICAgICAgIGxhYmVsOiBvcHRpb25Hcm91cC5sYWJlbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgZXhpc3RpbmdPcHRpb25zID0gW2V4aXN0aW5nUGFyZW50XTsKICAgICAgICAgICAgICBvcHRpb25Hcm91cHNDYWNoZS5wdXNoKGV4aXN0aW5nT3B0aW9ucyk7CiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQoZXhpc3RpbmdQYXJlbnQuZWxlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZXhpc3RpbmdPcHRpb25zID0gb3B0aW9uR3JvdXBzQ2FjaGVbZ3JvdXBJbmRleF07CiAgICAgICAgICAgICAgZXhpc3RpbmdQYXJlbnQgPSBleGlzdGluZ09wdGlvbnNbMF07ICAvLyBlaXRoZXIgU0VMRUNUIChubyBncm91cCkgb3IgT1BUR1JPVVAgZWxlbWVudAoKICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIE9QVEdST1VQIGxhYmVsIGlmIG5vdCB0aGUgc2FtZS4KICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQYXJlbnQubGFiZWwgIT0gb3B0aW9uR3JvdXBOYW1lKSB7CiAgICAgICAgICAgICAgICBleGlzdGluZ1BhcmVudC5lbGVtZW50LmF0dHIoJ2xhYmVsJywgZXhpc3RpbmdQYXJlbnQubGFiZWwgPSBvcHRpb25Hcm91cE5hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGFzdEVsZW1lbnQgPSBudWxsOyAgLy8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZwogICAgICAgICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb3B0aW9uR3JvdXAubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgIG9wdGlvbiA9IG9wdGlvbkdyb3VwW2luZGV4XTsKICAgICAgICAgICAgICBpZiAoKGV4aXN0aW5nT3B0aW9uID0gZXhpc3RpbmdPcHRpb25zW2luZGV4ICsgMV0pKSB7CiAgICAgICAgICAgICAgICAvLyByZXVzZSBlbGVtZW50cwogICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQgPSBleGlzdGluZ09wdGlvbi5lbGVtZW50OwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nT3B0aW9uLmxhYmVsICE9PSBvcHRpb24ubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgdXBkYXRlTGFiZWxNYXAobGFiZWxNYXAsIGV4aXN0aW5nT3B0aW9uLmxhYmVsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgIHVwZGF0ZUxhYmVsTWFwKGxhYmVsTWFwLCBvcHRpb24ubGFiZWwsIHRydWUpOwogICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC50ZXh0KGV4aXN0aW5nT3B0aW9uLmxhYmVsID0gb3B0aW9uLmxhYmVsKTsKICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQucHJvcCgnbGFiZWwnLCBleGlzdGluZ09wdGlvbi5sYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdPcHRpb24uaWQgIT09IG9wdGlvbi5pZCkgewogICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC52YWwoZXhpc3RpbmdPcHRpb24uaWQgPSBvcHRpb24uaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbGFzdEVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnKSBwcm92aWRlZCBieSBqUXVlcnkgaGFzIHNpZGUtZWZmZWN0cwogICAgICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50WzBdLnNlbGVjdGVkICE9PSBvcHRpb24uc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnLCAoZXhpc3RpbmdPcHRpb24uc2VsZWN0ZWQgPSBvcHRpb24uc2VsZWN0ZWQpKTsKICAgICAgICAgICAgICAgICAgaWYgKG1zaWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTZWUgIzc2OTIKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgaXRlbSB3b3VsZG4ndCB2aXN1YWxseSB1cGRhdGUgb24gSUUgd2l0aG91dCB0aGlzLgogICAgICAgICAgICAgICAgICAgIC8vIFRlc3RlZCBvbiBXaW43OiBJRTksIElFMTAgYW5kIElFMTEuIEZ1dHVyZSBJRXMgc2hvdWxkIGJlIHRlc3RlZCBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnLCBleGlzdGluZ09wdGlvbi5zZWxlY3RlZCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gZ3JvdyBlbGVtZW50cwoKICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBudWxsIG9wdGlvbgogICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5pZCA9PT0gJycgJiYgbnVsbE9wdGlvbikgewogICAgICAgICAgICAgICAgICAvLyBwdXQgYmFjayB0aGUgcHJlLWNvbXBpbGVkIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG51bGxPcHRpb247CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBqUXVlcnkodjEuNC4yKSBCdWc6IFdlIHNob3VsZCBiZSBhYmxlIHRvIGNoYWluIHRoZSBtZXRob2QgY2FsbHMsIGJ1dAogICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5IG9uIHNvbWUgYnJvd3NlciB0aGUgLnRleHQoKSByZXR1cm5zIGEgc3RyaW5nCiAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGVuIHRoZSBlbGVtZW50LgogICAgICAgICAgICAgICAgICAoZWxlbWVudCA9IG9wdGlvblRlbXBsYXRlLmNsb25lKCkpCiAgICAgICAgICAgICAgICAgICAgICAudmFsKG9wdGlvbi5pZCkKICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdzZWxlY3RlZCcsIG9wdGlvbi5zZWxlY3RlZCkKICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzZWxlY3RlZCcsIG9wdGlvbi5zZWxlY3RlZCkKICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdsYWJlbCcsIG9wdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KG9wdGlvbi5sYWJlbCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZXhpc3RpbmdPcHRpb25zLnB1c2goZXhpc3RpbmdPcHRpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBsYWJlbDogb3B0aW9uLmxhYmVsLAogICAgICAgICAgICAgICAgICAgIGlkOiBvcHRpb24uaWQsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IG9wdGlvbi5zZWxlY3RlZAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB1cGRhdGVMYWJlbE1hcChsYWJlbE1hcCwgb3B0aW9uLmxhYmVsLCB0cnVlKTsKICAgICAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudCkgewogICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC5hZnRlcihlbGVtZW50KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50LmVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyByZW1vdmUgYW55IGV4Y2Vzc2l2ZSBPUFRJT05zIGluIGEgZ3JvdXAKICAgICAgICAgICAgaW5kZXgrKzsgLy8gaW5jcmVtZW50IHNpbmNlIHRoZSBleGlzdGluZ09wdGlvbnNbMF0gaXMgcGFyZW50IGVsZW1lbnQgbm90IE9QVElPTgogICAgICAgICAgICB3aGlsZSAoZXhpc3RpbmdPcHRpb25zLmxlbmd0aCA+IGluZGV4KSB7CiAgICAgICAgICAgICAgb3B0aW9uID0gZXhpc3RpbmdPcHRpb25zLnBvcCgpOwogICAgICAgICAgICAgIHVwZGF0ZUxhYmVsTWFwKGxhYmVsTWFwLCBvcHRpb24ubGFiZWwsIGZhbHNlKTsKICAgICAgICAgICAgICBvcHRpb24uZWxlbWVudC5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy8gcmVtb3ZlIGFueSBleGNlc3NpdmUgT1BUR1JPVVBzIGZyb20gc2VsZWN0CiAgICAgICAgICB3aGlsZSAob3B0aW9uR3JvdXBzQ2FjaGUubGVuZ3RoID4gZ3JvdXBJbmRleCkgewogICCM3O9WpqoDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PFhAAEAGboXAqAc2wKgHYJUiH/VYenzTQcB0eIAQDQ6TfAAAAQEICgCjXuEATaXcjNzvVr+qAwDqCgAA6goAAGj3KB/SxQgAJ60eEwgARQAK3NUHQABABsstwKgHYMCoBzYf9ZUiQcB0eFh6fNOAGAFTmrUAAAEBCAoATaXcAKNe3yAgICAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIGxhYmVscyBpbiB0aGUgb3B0aW9uIGdyb3VwCiAgICAgICAgICAgIG9wdGlvbkdyb3VwID0gb3B0aW9uR3JvdXBzQ2FjaGUucG9wKCk7CiAgICAgICAgICAgIGZvciAoaW5kZXggPSAxOyBpbmRleCA8IG9wdGlvbkdyb3VwLmxlbmd0aDsgKytpbmRleCkgewogICAgICAgICAgICAgIHVwZGF0ZUxhYmVsTWFwKGxhYmVsTWFwLCBvcHRpb25Hcm91cFtpbmRleF0ubGFiZWwsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25Hcm91cFswXS5lbGVtZW50LnJlbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgZm9yRWFjaChsYWJlbE1hcCwgZnVuY3Rpb24oY291bnQsIGxhYmVsKSB7CiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgICAgICBzZWxlY3RDdHJsLmFkZE9wdGlvbihsYWJlbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCAwKSB7CiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5yZW1vdmVPcHRpb24obGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Owp9XTsKCnZhciBvcHRpb25EaXJlY3RpdmUgPSBbJyRpbnRlcnBvbGF0ZScsIGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZSkgewogIHZhciBudWxsU2VsZWN0Q3RybCA9IHsKICAgIGFkZE9wdGlvbjogbm9vcCwKICAgIHJlbW92ZU9wdGlvbjogbm9vcAogIH07CgogIHJldHVybiB7CiAgICByZXN0cmljdDogJ0UnLAogICAgcHJpb3JpdHk6IDEwMCwKICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHsKICAgICAgaWYgKGlzVW5kZWZpbmVkKGF0dHIudmFsdWUpKSB7CiAgICAgICAgdmFyIGludGVycG9sYXRlRm4gPSAkaW50ZXJwb2xhdGUoZWxlbWVudC50ZXh0KCksIHRydWUpOwogICAgICAgIGlmICghaW50ZXJwb2xhdGVGbikgewogICAgICAgICAgYXR0ci4kc2V0KCd2YWx1ZScsIGVsZW1lbnQudGV4dCgpKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgewogICAgICAgIHZhciBzZWxlY3RDdHJsTmFtZSA9ICckc2VsZWN0Q29udHJvbGxlcicsCiAgICAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQucGFyZW50KCksCiAgICAgICAgICAgIHNlbGVjdEN0cmwgPSBwYXJlbnQuZGF0YShzZWxlY3RDdHJsTmFtZSkgfHwKICAgICAgICAgICAgICBwYXJlbnQucGFyZW50KCkuZGF0YShzZWxlY3RDdHJsTmFtZSk7IC8vIGluIGNhc2Ugd2UgYXJlIGluIG9wdGdyb3VwCgogICAgICAgIGlmICghc2VsZWN0Q3RybCB8fCAhc2VsZWN0Q3RybC5kYXRhYm91bmQpIHsKICAgICAgICAgIHNlbGVjdEN0cmwgPSBudWxsU2VsZWN0Q3RybDsKICAgICAgICB9CgogICAgICAgIGlmIChpbnRlcnBvbGF0ZUZuKSB7CiAgICAgICAgICBzY29wZS4kd2F0Y2goaW50ZXJwb2xhdGVGbiwgZnVuY3Rpb24gaW50ZXJwb2xhdGVXYXRjaEFjdGlvbihuZXdWYWwsIG9sZFZhbCkgewogICAgICAgICAgICBhdHRyLiRzZXQoJ3ZhbHVlJywgbmV3VmFsKTsKICAgICAgICAgICAgaWYgKG9sZFZhbCAhPT0gbmV3VmFsKSB7CiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5yZW1vdmVPcHRpb24ob2xkVmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxlY3RDdHJsLmFkZE9wdGlvbihuZXdWYWwsIGVsZW1lbnQpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlbGVjdEN0cmwuYWRkT3B0aW9uKGF0dHIudmFsdWUsIGVsZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgZWxlbWVudC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHNlbGVjdEN0cmwucmVtb3ZlT3B0aW9uKGF0dHIudmFsdWUpOwogICAgICAgIH0pOwogICAgICB9OwogICAgfQogIH07Cn1dOwoKdmFyIHN0eWxlRGlyZWN0aXZlID0gdmFsdWVGbih7CiAgcmVzdHJpY3Q6ICdFJywKICB0ZXJtaW5hbDogZmFsc2UKfSk7CgogIGlmICh3aW5kb3cuYW5ndWxhci5ib290c3RyYXApIHsKICAgIC8vQW5ndWxhckpTIGlzIGFscmVhZHkgbG9hZGVkLCBzbyB3ZSBjYW4gcmV0dXJuIGhlcmUuLi4KICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBUcmllZCB0byBsb2FkIGFuZ3VsYXIgbW9yZSB0aGFuIG9uY2UuJyk7CiAgICByZXR1cm47CiAgfQoKICAvL3RyeSB0byBiaW5kIHRvIGpxdWVyeSBub3cgc28gdGhhdCBvbmUgY2FuIHdyaXRlIGpxTGl0ZShkb2N1bWVudCkucmVhZHkoKQogIC8vYnV0IHdlIHdpbGwgcmViaW5kIG9uIGJvb3RzdHJhcCBhZ2Fpbi4KICBiaW5kSlF1ZXJ5KCk7CgogIHB1Ymxpc2hFeHRlcm5hbEFQSShhbmd1bGFyKTsKCiAganFMaXRlKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAgIGFuZ3VsYXJJbml0KGRvY3VtZW50LCBib290c3RyYXApOwogIH0pOwoKfSkod2luZG93LCBkb2N1bWVudCk7Cgohd2luZG93LmFuZ3VsYXIuJCRjc3AoKSAmJiB3aW5kb3cuYW5ndWxhci5lbGVtZW50KGRvY3VtZW50KS5maW5kKCdoZWFkJykucHJlcGVuZCgnPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AY2hhcnNldCAiVVRGLTgiO1tuZ1xcOmNsb2FrXSxbbmctY2xvYWtdLFtkYXRhLW5nLWNsb2FrXSxbeC1uZy1jbG9ha10sLm5nLWNsb2FrLC54LW5nLWNsb2FrLC5uZy1oaWRlOm5vdCgubmctaGlkZS1hbmltYXRlKXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9bmdcXDpmb3Jte2Rpc3BsYXk6YmxvY2s7fTwvc3R5bGU+Jyk7DQqM3O9W6qoDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PFlAAEAGboTAqAc2wKgHYJUiH/VYenzTQcB/IIAQDQ6I1AAAAQEICgCjXuEATaXcjNzvVoirAwBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOdUJQABABtXOwKgHYMCoBzYf9ZUiQcB/IFh6fNOAGAFTkBIAAAEBCAoATaXcAKNe4TANCg0KjNzvVpqvAwDAAgAAwAIAAAgAJ60eE2j3KB/SxQgARQACsjxaQABABmwFwKgHNsCoB2CVIh/1WHp800HAfyWAGA0OXM4AAAEBCAoAo17hAE2l3EdFVCAvb25vcy91aS9hcHAvZncvc3ZnL2ljb24uanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVsqyAwDDAwAAwwMAAGj3KB/SxQgAJ60eEwgARQADtTekQABABm+4wKgHYMCoBzYf9ZUnOVXBttuSgcmAGAEUk44AAAEBCAoATaXdAKNe4EhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjJFRA0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gU2NhbGFibGUgVmVjdG9yIEdyYXBoaWNzIE1vZHVsZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc1N2ZycsIFsnb25vc1V0aWwnXSk7Cgp9KCkpOwoNCozc71biswMAdwAAAHcAAAABgMIAAAAQUXIOPcAAaUJCAwAAAwJ8gAAAGIIAjecAAw0/gAAQUXIOPcCAAwEAFAACAA8AAABAADEwNTE3MjBlM2RjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsNhd/UCg81Lg4IdirJt5iAAAAAIAAEFFyDj3AFIzc71butwMAQQsAAEELAABo9ygf0sUIACetHhMIAEUACzONW0AAQAYSg8CoB2DAqAc2H/WVLaaSV2NP2auigBgBFJsMAAABAQgKAE2l3QCjXuBIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpBNkINCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTmF2aWdhdGlvbiBNb2R1bGUKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgZGVwZW5kZW5jaWVzCiAgICB2YXIgJGxvZywgJGxvY2F0aW9uLCAkd2luZG93LCBmczsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIG5hdlNob3duID0gZmFsc2U7CgogICAgZnVuY3Rpb24gdXBkYXRlUGFuZSgpIHsKICAgICAgICB2YXIgdmlzID0gbmF2U2hvd24gPyAndmlzaWJsZScgOiAnaGlkZGVuJzsKICAgICAgICBkMy5zZWxlY3QoJyNuYXYnKS5zdHlsZSgndmlzaWJpbGl0eScsIHZpcyk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHNob3dOYXYoKSB7CiAgICAgICAgbmF2U2hvd24gPSB0cnVlOwogICAgICAgIHVwZGF0ZVBhbmUoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhpZGVOYXYoKSB7CiAgICAgICAgbmF2U2hvd24gPSBmYWxzZTsKICAgICAgICB1cGRhdGVQYW5lKCk7CiAgICB9CiAgICBmdW5jdGlvbiB0b2dnbGVOYXYoKSB7CiAgICAgICAgbmF2U2hvd24gPSAhbmF2U2hvd247CiAgICAgICAgdXBkYXRlUGFuZSgpOwogICAgfQogICAgZnVuY3Rpb24gaGlkZUlmU2hvd24oKSB7CiAgICAgICAgaWYgKG5hdlNob3duKSB7CiAgICAgICAgICAgIGhpZGVOYXYoKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBuYXZUbyhwYXRoLCBwYXJhbXMpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgICAkbG9nLndhcm4oJ05vdCBhIHZhbGlkIG5hdmlnYXRpb24gcGF0aCcpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgJGxvY2F0aW9uLnVybCgnLycgKyBwYXRoKTsKCiAgICAgICAgaWYgKGZzLmlzTyhwYXJhbXMpKSB7CiAgICAgICAgICAgICRsb2NhdGlvbi5zZWFyY2gocGFyYW1zKTsKICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICRsb2cud2FybignUXVlcnkgcGFyYW1zIG5vdCBhbiBvYmplY3QnLCBwYXJhbXMpOwogICAgICAgIH0KCiAgICAgICAgdXJsID0gJGxvY2F0aW9uLmFic1VybCgpOwogICAgICAgICRsb2cubG9nKCdOYXZpZ2F0aW5nIHRvICcsIHVybCk7CiAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsOwogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zTmF2JywgW10pCiAgICAgICAgLmNvbnRyb2xsZXIoJ05hdkN0cmwnLCBbJyRsb2cnLAoKICAgICAgICAgICAgZnVuY3Rpb24gKF8kbG9nXykgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKCiAgICAgICAgICAgICAgICBzZWxmLmhpZGVOYXYgPSBoaWRlTmF2OwogICAgICAgICAgICAgICAgJGxvZy5sb2coJ05hdkN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgICAgICB9CiAgICAgICAgXSkKICAgICAgICAuZmFjdG9yeSgnTmF2U2VydmljZScsCiAgICAgICAgICAgIFsnJGxvZycsICckbG9jYXRpb24nLCAnJHdpbmRvdycsICdGblNlcnZpY2UnLAoKICAgICAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRsb2NhdGlvbl8sIF8kd2luZG93XywgX2ZzXykgewogICAgICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgICAgICRsb2NhdGlvbiA9IF8kbG9jYXRpb25fOwogICAgICAgICAgICAgICAgJHdpbmRvdyA9IF8kd2luZG93XzsKICAgICAgICAgICAgICAgIGZzID0gX2ZzXzsKCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHNob3dOYXY6IHNob3dOYXYsCiAgICAgICAgICAgICAgICAgICAgaGlkZU5hdjogaGlkZU5hdiwKICAgICAgICAgICAgICAgICAgICB0b2dnbGVOYXY6IHRvZ2dsZU5hdiwKICAgICAgICAgICAgICAgICAgICBoaWRlSWZTaG93bjogaGlkZUlmU2hvd24sCiAgICAgICAgICAgICAgICAgICAgbmF2VG86IG5hdlRvCiAgICAgICAgICAgICAgICB9OwogICAgICAgIH1dKTsKCn0oKSk7Cg0KjNzvVkm4AwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMG3QABABuklwKgHNsCoB2CVLR/1T9mroqaSYmKAEAHOJcUAAAEBCAoAo17iAE2l3Yzc71YiuQMARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADmNXUAAQAYde8CoB2DAqAc2H/WVLaaSYmJP2auigBgBFJASAAABAQgKAE2l3QCjXuIwDQoNCozc71Z7ugMARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADk3pUAAQAZzM8CoB2DAqAc2H/WVJzlVxTfbkoHJgBgBFJASAAABAQgKAE2l3QCjXuAwDQoNCozc71brugMAwwIAAMMCAAAIACetHhNo9ygf0sUIAEUAArXBuEAAQAbmo8CoBzbAqAdglS0f9U/Zq6KmkmJngBgBzogAAAABAQgKAKNe4gBNpd1HRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9nZW9kYXRhLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71b4ugMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt9EAAQAZ86cCoBzbAqAdglScf9duSgck5VcU8gBAPM8DoAAABAQgKAKNe4gBNpd2M3O9Wz7sDAL8CAAC/AgAACAAnrR4TaPcoH9LFCABFAAKxLfVAAEAGemvAqAc2wKgHYJUnH/XbkoHJOVXFPIAYDzPfCQAAAQEICgCjXuIATaXdR0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvbWFwLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZywgMALxYAAC8WAABo9ygf0sUIACetHhMIAEUAFiGNXkAAQAYHksCoB2DAqAc2H/WVLaaSYmdP2a4jgBgBHqX6AAABAQgKAE2l3gCjXuJIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxNTU4DQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBTVkcgLS0gR2VvRGF0YSBTZXJ2aWNlCiAqLwoKLyoKIFRoZSBHZW9EYXRhIFNlcnZpY2UgZmFjaWxpdGF0ZXMgdGhlIGZldGNoaW5nIGFuZCBjYWNoaW5nIG9mIFRvcG9KU09OIGRhdGEKIGZyb20gdGhlIHNlcnZlciwgYXMgd2VsbCBhcyBwcm92aWRpbmcgYSB3YXkgb2YgY3JlYXRpbmcgYSBwYXRoIGdlbmVyYXRvcgogZm9yIHRoYXQgZGF0YSwgdG8gYmUgdXNlZCB0byByZW5kZXIgdGhlIG1hcCBpbiBhbiBTVkcgbGF5ZXIuCgogQSBUb3BvRGF0YSBvYmplY3QgY2FuIGJlIGZldGNoZWQgYnkgSUQuIElEcyB0aGF0IHN0YXJ0IHdpdGggYW4gYXN0ZXJpc2sKIGlkZW50aWZ5IG1hcHMgYnVuZGxlZCB3aXRoIHRoZSBHVUkuIElEcyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGFuCiBhc3RlcmlzayBhcmUgYXNzdW1lZCB0byBiZSBVUkxzIHRvIGV4dGVybmFsbHkgcHJvdmlkZWQgZGF0YS4KCiAgICAgdmFyIHRvcG9kYXRhID0gR2VvRGF0YVNlcnZpY2UuZmV0Y2hUb3BvRGF0YSgnKmNvbnRpbmVudGFsLXVzJyk7CgogVGhlIHBhdGggZ2VuZXJhdG9yIGNhbiB0aGVuIGJlIGNyZWF0ZWQgZm9yIHRoYXQgZGF0YS1zZXQ6CgogICAgIHZhciBnZW4gPSBHZW9EYXRhU2VydmljZS5jcmVhdGVQYXRoR2VuZXJhdG9yKHRvcG9kYXRhLCBvcHRzKTsKCiBvcHRzIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgYWxsb3dzIHRoZSBvdmVycmlkZSBvZiBkZWZhdWx0IHNldHRpbmdzOgogICAgIHsKICAgICAgICAgb2JqZWN0VGFnOiAnc3RhdGVzJywKICAgICAgICAgcHJvamVjdGlvbjogZDMuZ2VvLm1lcmNhdG9yKCksCiAgICAgICAgIGxvZ2ljYWxTaXplOiAxMDAwLAogICAgICAgICBtYXBGaWxsU2NhbGU6IC45NQogICAgIH07CgogVGhlIHJldHVybmVkIG9iamVjdCAoZ2VuKSBjb21wcmlzZXMgdHJhbnNmb3JtZWQgZGF0YSAoVG9wb0pTT04gLT4gR2VvSlNPTiksCiB0aGUgRDMgcGF0aCBnZW5lcmF0b3IgZnVuY3Rpb24sIGFuZCB0aGUgc2V0dGluZ3MgdXNlZCAuLi4KCiAgICB7CiAgICAgICAgZ2VvZGF0YTogIHsgLi4uIH0sCiAgICAgICAgcGF0aGdlbjogIGZ1bmN0aW9uICguLi4pIHsgLi4uIH0sCiAgICAgICAgc2V0dGluZ3M6IHsgLi4uIH0KICAgIH0KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCAkaHR0cCwgZnM7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBjYWNoZSA9IGQzLm1hcCgpLAogICAgICAgIGJ1bmRsZWRVcmxQcmVmaXggPSAnZGF0YS9tYXAvJzsKCiAgICBmdW5jdGlvbiBnZXRVcmwoaWQpIHsKICAgICAgICBpZiAoaWRbMF0gPT09ICcqJykgewogICAgICAgICAgICByZXR1cm4gYnVuZGxlZFVybFByZWZpeCArIGlkLnNsaWNlKDEpICsgJy50b3BvanNvbic7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZCArICcudG9wb2pzb24nOwogICAgfQoKCiAgICAvLyBzdGFydCBhZnJlc2guLi4KICAgIGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKSB7CiAgICAgICAgY2FjaGUgPSBkMy5tYXAoKTsKICAgIH0KCiAgICAvLyByZXR1cm5zIGEgcHJvbWlzZSBkZWNvcmF0ZWQgd2l0aDoKICAgIC8vICAgLm1ldGEgLS0gaWQsIHVybCwgYW5kIHdoZXRoZXIgdGhlIGRhdGEgd2FzIGNhY2hlZAogICAgLy8gICAudG9wb2RhdGEgLS0gVG9wb0pTT04gZGF0YSAob24gcmVzcG9uc2UgZnJvbSBzZXJ2ZXIpCgogICAgZnVuY3Rpb24gZmV0Y2hUb3BvRGF0YShpZCkgewogICAgICAgIGlmICghZnMuaXNTKGlkKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIHVybCA9IGdldFVybChpZCksCiAgICAgICAgICAgIHByb21pc2UgPSBjYWNoZS5nZXQoaWQpOwoKICAgICAgICBpZiAoIXByb21pc2UpIHsKICAgICAgICAgICAgLy8gbmVlZCB0byBmZXRjaCB0aGUgZGF0YSwgYnVpbGQgdGhlIG9iamVjdCwKICAgICAgICAgICAgLy8gY2FjaGUgaXQsIGFuZCByZXR1cm4gaXQuCiAgICAgICAgICAgIHByb21pc2UgPSAkaHR0cC5nZXQodXJsKTsKCiAgICAgICAgICAgIHByb21pc2UubWV0YSA9IHsKICAgICAgICAgICAgICAgIGlkOiBpZCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgd2FzQ2FjaGVkOiBmYWxzZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgICAgcHJvbWlzZS50b3BvZGF0YSA9IHJlc3BvbnNlLmRhdGE7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgICAgICRsb2cud2FybignRmFpbGVkIHRvIHJldHJpZXZlIG1hcCBUb3BvSlNPTiBkYXRhOiAnICsgdXJsLAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuZGF0YSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY2FjaGUuc2V0KGlkLCBwcm9taXNlKTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJvbWlzZS5tZXRhLndhc0NhY2hlZCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgIH0KCiAgICB2YXIgZGVmYXVsdEdlblNldHRpbmdzID0gewogICAgICAgIG9iamVjdFRhZzogJ3N0YXRlcycsCiAgICAgICAgcHJvamVjdGlvbjogZDMuZ2VvLm1lcmNhdG9yKCksCiAgICAgICAgbG9naWNhbFNpemU6IDEwMDAsCiAgICAgICAgbWFwRmlsbFNjYWxlOiAuOTUKICAgIH07CgogICAgLy8gY29udmVydHMgZ2l2ZW4gVG9wb0pTT04tZm9ybWF0IGRhdGEgaW50byBjb3JyZXNwb25kaW5nIEdlb0pTT04KICAgIC8vICBkYXRhLCBhbmQgY3JlYXRlcyBhIHBhdGggZ2VuZXJhdG9yIGZvciB0aGF0IGRhdGEuCiAgICBmdW5jdGlvbiBjcmVhdGVQYXRoR2VuZXJhdG9yKHRvcG9EYXRhLCBvcHRzKSB7CiAgICAgICAgdmFyIHNldHRpbmdzID0gYW5ndWxhci5leHRlbmQoe30sIGRlZmF1bHRHZW5TZXR0aW5ncywgb3B0cyksCiAgICAgICAgICAgIHRvcG9PYmplY3QgPSB0b3BvRGF0YS5vYmplY3RzW3NldHRpbmdzLm9iamVjdFRhZ10sCiAgICAgICAgICAgIGdlb0RhdGEgPSB0b3BvanNvbi5mZWF0dXJlKHRvcG9EYXRhLCB0b3BvT2JqZWN0KSwKICAgICAgICAgICAgcHJvaiA9IHNldHRpbmdzLnByb2plY3Rpb24sCiAgICAgICAgICAgIGRpbSA9IHNldHRpbmdzLmxvZ2ljYWxTaXplLAogICAgICAgICAgICBtZnMgPSBzZXR0aW5ncy5tYXBGaWxsU2NhbGUsCiAgICAgICAgICAgIHBhdGggPSBkMy5nZW8ucGF0aCgpLnByb2plY3Rpb24ocHJvaik7CgogICAgICAgIHJlc2NhbGVQcm9qZWN0aW9uKHByb2osIG1mcywgZGltLCBwYXRoLCBnZW9EYXRhKTsKCiAgICAgICAgLy8gcmV0dXJuIHRoZSByZXN1bHRzCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZ2VvZGF0YTogZ2VvRGF0YSwKICAgICAgICAgICAgcGF0aGdlbjogcGF0aCwKICAgICAgICAgICAgc2V0dGluZ3M6IHNldHRpbmdzCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNjYWxlUHJvamVjdGlvbihwcm9qLCBtZnMsIGRpbSwgcGF0aCwgZ2VvRGF0YSkgewogICAgICAgIC8vIGFkanVzdCBwcm9qZWN0aW9uIHNjYWxlIGFuZCB0cmFuc2xhdGlvbiB0byBmaWxsIHRoZSB2aWV3CiAgICAgICAgLy8gd2l0aCB0aGUgbWFwCgogICAgICAgIC8vIHN0YXJ0IHdpdGggdW5pdCBzY2FsZSwgbm8gdHJhbnNsYXRpb24uLgogICAgICAgIHByb2ouc2NhbGUoMSkudHJhbnNsYXRlKFswLCAwXSk7CgogICAgICAgIC8vIGZpZ3VyZSBvdXQgZGltZW5zaW9ucyBvZiBtYXAgZGF0YS4uCiAgICAgICAgdmFyIGIgPSBwYXRoLmJvdW5kcyhnZW9EYXRhKSwKICAgICAgICAgICAgeDEgPSBiWzBdWzBdLAogICAgICAgICAgICB5MSA9IGJbMF1bMV0sCiAgICAgICAgICAgIHgyID0gYlsxXVswXSwKICAgICAgICAgICAgeTIgPSBiWzFdWzFdLAogICAgICAgICAgICBkeCA9IHgyIC0geDEsCiAgICAgICAgICAgIGR5ID0geTIgLSB5MSwKICAgICAgICAgICAgeCA9ICh4MSArIHgyKSAvIDIsCiAgICAgICAgICAgIHkgPSAoeTEgKyB5MikgLyAyOwoKICAgICAgICAvLyBzaXplIG1hcCB0byA5NSUgb2YgbWluaW11bSBkaW1lbnNpb24gdG8gZmlsbCBzcGFjZS4uCiAgICAgICAgdmFyIHMgPSBtZnMgLyBNYXRoLm1pbihkeCAvIGRpbSwgZHkgLyBkaW0pLAogICAgICAgICAgICB0ID0gW2RpbSAvIDIgLSBzICogeCwgZGltIC8gMiAtIHMgKiB5XTsKCiAgICAgICAgLy8gc2V0IG5ldyBzY2FsZSwgdHJhbnNsYXRpb24gb24gdGhlIHByb2plY3Rpb24uLgogICAgICAgIHByb2ouc2NhbGUocykudHJhbnNsYXRlKHQpOwogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zU3ZnJykKICAgICAgICAuZmFjdG9yeSgnR2VvRGF0YVNlcnZpY2UnLCBbJyRsb2cnLCAnJGh0dHAnLCAnRm5TZXJ2aWNlJywKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJGh0dHBfLCBfZnNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRodHRwID0gXyRodHRwXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwoKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjbGVhckNhY2hlOiBjbGVhckNhY2hlLAogICAgICAgICAgICAgICAgZmV0Y2hUb3BvRGF0YTogZmV0Y2hUb3BvRGF0YSwKICAgICAgICAgICAgICAgIGNyZWF0ZVBhdGhHZW5lcmF0b3I6IGNyZWF0ZVBhdGhHZW5lcmF0b3IsCiAgICAgICAgICAgICAgICByZXNjYWxlUHJvamVjdGlvbjogcmVzY2FsZVByb2plY3Rpb24KICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7DQqM3O9WxsIDAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wblAAEAG6SPAqAc2wKgHYJUtH/VP2a4jppJ4VIAQAiYM+QAAAQEICgCjXuIATaXejNzvVgT7AwBXDwAAVw8AAGj3KB/SxQgAJ60eEwgARQAPSe3sQABABq3bwKgHYMCoBzYf9ZUqk6aW8Mbo8qaAGAEJnyIAAAEBCAoATaXhAKNe3khUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCkU4MQ0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVXRpbCAtLSBVc2VyIFByZWZlcmVuY2UgU2VydmljZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgJGNvb2tpZXMsIGZzOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgY2FjaGUgPSB7fTsKCiAgICAvLyBOT1RFOiBpbiBBbmd1bGFyIDEuMy41LCAkY29va2llcyBpcyBqdXN0IGEgc2ltcGxlIG9iamVjdCwgYW5kCiAgICAvLyAgICAgICBjb29raWUgdmFsdWVzIGFyZSBqdXN0IHN0cmluZ3MuIEZyb20gdGhlIDEuMy41IGRvY3M6CiAgICAvLwogICAgLy8gICAgICAgIk9ubHkgYSBzaW1wbGUgT2JqZWN0IGlzIGV4cG9zZWQgYW5kIGJ5IGFkZGluZyBvciByZW1vdmluZwogICAgLy8gICAgICAgIHByb3BlcnRpZXMgdG8vZnJvbSB0aGlzIG9iamVjdCwgbmV3IGNvb2tpZXMgYXJlIGNyZWF0ZWQvZGVsZXRlZAogICAgLy8gICAgICAgIGF0IHRoZSBlbmQgb2YgY3VycmVudCAkZXZhbC4gVGhlIG9iamVjdCdzIHByb3BlcnRpZXMgY2FuIG9ubHkKICAgIC8vICAgICAgICBiZSBzdHJpbmdzLiIKICAgIC8vCiAgICAvLyAgICAgICBXZSBtYXkgd2FudCB0byB1cGdyYWRlIHRoZSB2ZXJzaW9uIG9mIEFuZ3VsYXIgc29tZXRpbWUgc29vbgogICAgLy8gICAgICAgIHNpbmNlIGxhdGVyIHZlcnNpb24gc3VwcG9ydCBvYmplY3RzIGFzIGNvb2tpZSB2YWx1ZXMuCgogICAgLy8gTk9URTogcHJlZnMgcmVwcmVzZW50ZWQgYXMgc2ltcGxlIG5hbWUvdmFsdWUgcGFpcnMKICAgIC8vICAgICAgID0+IGEgdGVtcG9yYXJ5IHJlc3RyaWN0aW9uIHdoaWxlIHdlIGFyZSBlbmNvZGluZyBpbnRvIGNvb2tpZXMKICAgIC8qCiAgICAgICAgewogICAgICAgICAgZm9vOiAxLAogICAgICAgICAgYmFyOiAwLAogICAgICAgICAgZ29vOiAyCiAgICAgICAgfQoKICAgICAgICBzdG9yZWQgYXMgImZvbzoxLGJhcjowLGdvbzoyIgogICAgICovCgogICAgLy8gcmVhZHMgY29va2llIHdpdGggZ2l2ZW4gbmFtZSBhbmQgcmV0dXJucyBhbiBvYmplY3QgcmVwIG9mIGl0cyB2YWx1ZQogICAgLy8gb3IgbnVsbCBpZiBubyBzdWNoIGNvb2tpZSBpcyBzZXQKICAgIGZ1bmN0aW9uIGdldFByZWZzKG5hbWUpIHsKICAgICAgICB2YXIgY29vayA9ICRjb29raWVzW25hbWVdLAogICAgICAgICAgICBiaXRzLAogICAgICAgICAgICBvYmogPSB7fTsKCiAgICAgICAgaWYgKGNvb2spIHsKICAgICAgICAgICAgYml0cyA9IGNvb2suc3BsaXQoJywnKTsKICAgICAgICAgICAgYml0cy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIHggPSB2YWx1ZS5zcGxpdCgnOicpOwogICAgICAgICAgICAgICAgb2JqW3hbMF1dID0geFsxXTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNhY2hlCiAgICAgICAgICAgIGNhY2hlW25hbWVdID0gb2JqOwogICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgIH0KICAgICAgICAvLyBwZXJoYXBzIHdlIGhhdmUgYSBjYWNoZWQgY29weS4uCiAgICAgICAgcmV0dXJuIGNhY2hlW25hbWVdOwogICAgfQoKICAgIC8vIGNvbnZlcnRzIHN0cmluZyB2YWx1ZXMgdG8gbnVtYmVycyBmb3Igc2VsZWN0ZWQgKG9yIGFsbCkga2V5cwogICAgZnVuY3Rpb24gYXNOdW1iZXJzKG9iaiwga2V5cykgewogICAgICAgIGlmICghb2JqKSByZXR1cm4gbnVsbDsKCiAgICAgICAgaWYgKCFrZXlzKSB7CiAgICAgICAgICAgIC8vIGRvIHRoZW0gYWxsCiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChvYmosIGZ1bmN0aW9uICh2LCBrKSB7CiAgICAgICAgICAgICAgICBvYmpba10gPSBOdW1iZXIob2JqW2tdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICBvYmpba10gPSBOdW1iZXIob2JqW2tdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UHJlZnMobmFtZSwgb2JqKSB7CiAgICAgICAgdmFyIGJpdHMgPSBbXSwKICAgICAgICAgICAgc3RyOwoKICAgICAgICBhbmd1bGFyLmZvckVhY2gob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkgewogICAgICAgICAgICBiaXRzLnB1c2goa2V5ICsgJzonICsgdmFsdWUpOwogICAgICAgIH0pOwogICAgICAgIHN0ciA9IGJpdHMuam9pbignLCcpOwoKICAgICAgICAvLyBrZWVwIGEgY2FjaGVkIGNvcHkgb2YgdGhlIG9iamVjdAogICAgICAgIGNhY2hlW25hbWVdID0gb2JqOwoKICAgICAgICAvLyBUaGUgYW5ndWxhciB3YXkgb2YgZG9pbmcgdGhpcy4uLgogICAgICAgIC8vICRjb29raWVzW25hbWVdID0gc3RyOwogICAgICAgIC8vICAuLi5idXQgaXQgYXBwZWFycyB0aGF0IHRoaXMgZ2V0cyBkZWxheWVkLCBhbmQgZG9lc24ndCAnc3RpY2snID8/CgogICAgICAgIC8vIEZPUkNFIGNvb2tpZSB0byBiZSBzZXQgYnkgd3JpdGluZyBkaXJlY3RseSB0byBkb2N1bWVudC5jb29raWUuLi4KICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cik7CiAgICAgICAgaWYgKGZzLmRlYnVnT24oJ3ByZWZzJykpIHsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygnPDw+PiBXcm90ZSBjb29raWUgPCcrbmFtZSsnPjonLCBzdHIpOwogICAgICAgIH0KICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc1V0aWwnKQogICAgLmZhY3RvcnkoJ1ByZWZzU2VydmljZScsIFsnJGxvZycsICckY29va2llcycsICdGblNlcnZpY2UnLAogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kY29va2llc18sIF9mc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJGNvb2tpZXMgPSBfJGNvb2tpZXNfOwogICAgICAgICAgICBmcyA9IF9mc187CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZ2V0UHJlZnM6IGdldFByZWZzLAogICAgICAgICAgICAgICAgYXNOdW1iZXJzOiBhc051bWJlcnMsCiAgICAgICAgICAgICAgICBzZXRQcmVmczogc2V0UHJlZnMKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cgp9KCkpOwoNCozc71ZW+wMAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS340AAQAby+cCoBzbAqAdglSof9cbo8qaTpqYFgBACZTZeAAABAQgKAKNe5gBNpeGM3O9WZQAEAFgRAABYEQAAaPcoH9LFCAAnrR4TCABFABFKN6ZAAEAGYiHAqAdgwKgHNh/1lSc5VcU825KERoAYAR6hIwAAAQEICgBNpeIAo17iSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMTA4MQ0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gU1ZHIC0tIE1hcCBTZXJ2aWNlCiAqLwoKLyoKICAgIFRoZSBNYXAgU2VydmljZSBwcm92aWRlcyBhIHNpbXBsZSBBUEkgZm9yIGxvYWRpbmcgZ2VvZ3JhcGhpY2FsIG1hcHMgaW50bwogICAgYW4gU1ZHIGxheWVyLiBGb3IgZXhhbXBsZSwgYXMgYSBiYWNrZ3JvdW5kIHRvIHRoZSBUb3BvbG9neSBWaWV3LgoKICAgIGUuZy4gIHZhciBwcm9taXNlID0gTWFwU2VydmljZS5sb2FkTWFwSW50byhzdmdMYXllciwgJypjb250aW5lbnRhbC11cycpOwoKICAgIFRoZSBNYXAgU2VydmljZSBtYWtlcyB1c2Ugb2YgdGhlIEdlb0RhdGFTZXJ2aWNlIHRvIGxvYWQgdGhlIHJlcXVpcmVkIGRhdGEKICAgIGZyb20gdGhlIHNlcnZlciBhbmQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBnZW9ncmFwaGljYWwgcHJvamVjdGlvbi4KCiAgICBBIHByb21pc2UgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgd2hpY2ggaXMgcmVzb2x2ZWQgd2l0aCB0aGUKICAgIG1hcCBwcm9qZWN0aW9uIG9uY2UgY3JlYXRlZC4KKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcwogICAgdmFyICRsb2csICRxLCBmcywgZ2RzOwoKICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIGRhdGFmaWxlIGhhcyBleGFjdGx5IHRoZSBtYXAgZGF0YQogICAgLy8gICAgICAgdGhhdCB5b3Ugd2FudCB0byBsb2FkOyBmb3IgZXhhbXBsZSBpZD0iKmNvbnRpbmVudGFsX3VzIgogICAgLy8gICAgICAgbWFwcGluZyB0byB+L2RhdGEvbWFwL2NvbnRpbmVudGFsX3VzLnRvcG9qc29uIGNvbnRhaW5zCiAgICAvLyAgICAgICBleGFjdGx5IHRoZSBwYXRocyBmb3IgdGhlIGNvbnRpbmVudGFsIFVTLgoKICAgIGZ1bmN0aW9uIGxvYWRNYXBJbnRvKG1hcExheWVyLCBpZCwgb3B0cykgewogICAgICAgIHZhciBwcm9taXNlID0gZ2RzLmZldGNoVG9wb0RhdGEoaWQpLAogICAgICAgICAgICBkZWZlcnJlZFByb2plY3Rpb24gPSAkcS5kZWZlcigpOwoKICAgICAgICBpZiAoIXByb21pc2UpIHsKICAgICAgICAgICAgJGxvZy53YXJuKCdGYWlsZWQgdG8gbG9hZCBtYXA6ICcgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBnZW4gPSBnZHMuY3JlYXRlUGF0aEdlbmVyYXRvcihwcm9taXNlLnRvcG9kYXRhLCBvcHRzKTsKCiAgICAgICAgICAgIGRlZmVycmVkUHJvamVjdGlvbi5yZXNvbHZlKGdlbi5zZXR0aW5ncy5wcm9qZWN0aW9uKTsKCiAgICAgICAgICAgIG1hcExheWVyLnNlbGVjdEFsbCgncGF0aCcpCiAgICAgICAgICAgICAgICAuZGF0YShnZW4uZ2VvZGF0YS5mZWF0dXJlcykKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdwYXRoJykKICAgICAgICAgICAgICAgIC5hdHRyKCdkJywgZ2VuLnBhdGhnZW4pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBkZWZlcnJlZFByb2plY3Rpb24ucHJvbWlzZTsKICAgIH0KCiAgICAvLyAtLS0KCiAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBjb3VudHJpZXMudG9wb2pzb24gZGF0YSBmaWxlLCBhbmQgdGhlbgogICAgLy8gICAgICAgZmlsdGVycyB0aGUgcmVzdWx0cyBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgb3B0aW9ucy4KICAgIC8vIFVzYWdlOgogICAgLy8gICAgIHByb21pc2UgPSBsb2FkTWFwUmVnaW9uSW50byhzdmdHcm91cCwgewogICAgLy8gICAgICAgICBjb3VudHJ5RmlsdGVyOiBmdW5jdGlvbiAoY291bnRyeSkgewogICAgLy8gICAgICAgICAgICAgcmV0dXJuIGNvdW50cnkucHJvcGVydGllcy5jb250aW5lbnQgPT09ICdTb3V0aCBBbWVyaWNhJzsKICAgIC8vICAgICAgICAgfQogICAgLy8gICAgIH0pOwoKICAgIGZ1bmN0aW9uIGxvYWRNYXBSZWdpb25JbnRvKG1hcExheWVyLCBmaWx0ZXJPcHRzKSB7CiAgICAgICAgdmFyIHByb21pc2UgPSBnZHMuZmV0Y2hUb3BvRGF0YSgiKmNvdW50cmllcyIpLAogICAgICAgICAgICBkZWZlcnJlZFByb2plY3Rpb24gPSAkcS5kZWZlcigpOwoKICAgICAgICBpZiAoIXByb21pc2UpIHsKICAgICAgICAgICAgJGxvZy53YXJuKCdGYWlsZWQgdG8gbG9hZCBjb3VudHJpZXMgVG9wb0pTT04gZGF0YScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgd2lkdGggPSAxMDAwLAogICAgICAgICAgICAgICAgaGVpZ2h0ID0gMTAwMCwKICAgICAgICAgICAgICAgIHByb2ogPSBkMy5nZW8ubWVyY2F0b3IoKS50cmFuc2xhdGUoW3dpZHRoLzIsIGhlaWdodC8yXSksCiAgICAgICAgICAgICAgICBwYXRoR2VuID0gZDMuZ2VvLnBhdGgoKS5wcm9qZWN0aW9uKHByb2opLAogICAgICAgICAgICAgICAgZGF0YSA9IHByb21pc2UudG9wb2RhdGEsCiAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IHRvcG9qc29uLmZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzLmNvdW50cmllcykuZmVhdHVyZXMsCiAgICAgICAgICAgICAgICBjb3VudHJ5ID0gZmVhdHVyZXMuZmlsdGVyKGZpbHRlck9wdHMuY291bnRyeUZpbHRlciksCiAgICAgICAgICAgICAgICBjb3VudHJ5RmVhdHVyZSA9IHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBjb3VudHJ5CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcGF0aCA9IGQzLmdlby5wYXRoKCkucHJvamVjdGlvbihwcm9qKTsKCiAgICAgICAgICAgIGdkcy5yZXNjYWxlUHJvamVjdGlvbihwcm9qLCAwLjk1LCAxMDAwLCBwYXRoLCBjb3VudHJ5RmVhdHVyZSk7CgogICAgICAgICAgICBkZWZlcnJlZFByb2plY3Rpb24ucmVzb2x2ZShwcm9qKTsKCiAgICAgICAgICAgIG1hcExheWVyLnNlbGVjdEFsbCgncGF0aC5jb3VudHJ5JykKICAgICAgICAgICAgICAgIC5kYXRhKFtjb3VudHJ5RmVhdHVyZV0pCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpLmNsYXNzZWQoJ2NvdW50cnknLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIoJ2QnLCBwYXRoR2VuKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZGVmZXJyZWRQcm9qZWN0aW9uLnByb21pc2U7CiAgICB9CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NTdmcnKQogICAgICAgIC5mYWN0b3J5KCdNYXBTZXJ2aWNlJywgWyckbG9nJywgJyRxJywgJ0ZuU2VydmljZScsICdHZW9EYXRhU2VydmljZScsCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRxXywgX2ZzXywgX2dkc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHEgPSBfJHFfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIGdkcyA9IF9nZHNfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGxvYWRNYXBSZWdpb25JbnRvOiBsb2FkTWFwUmVnaW9uSW50bywKICAgICAgICAgICAgICAgIGxvYWRNYXBJbnRvOiBsb2FkTWFwSW50bwogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKCn0oKSk7Cg0KjNzvVrMABABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC32QABABnznwKgHNsCoB2CVJx/125KERjlV1lKAEA8zrUwAAAEBCAoAo17mAE2l4ozc71ZOAgQARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADk3qkAAQAZzLsCoB2DAqAc2H/WVJzlV1lLbkoRGgBgBHpASAAABAQgKAE2l4gCjXuYwDQoNCozc71bGBwQAwAIAAMACAAAIACetHhNo9ygf0sUIAEUAArIt90AAQAZ6aMCoBzbAqAdglScf9duShEY5VdZXgBgPM3A6AAABAQgKAKNe5wBNpeJHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy96b29tLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bGBwQAKjMAACozAABo9ygf0sUIACetHhMIAEUAMxwYb0AAQAZfhsCoB2DAqAc2H/WVK2c9KeH2akkNgBABTsL1AAABAQgKAE2l4gCjXuFIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo4MDAwDQovKgogKiBDb3B5cmlnaHQgMjAxNSwyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFNWRyAtLSBHbHlwaCBTZXJ2aWNlCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCBmcywgc3VzOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgZ2x5cGhzID0gZDMubWFwKCk7CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gQmFzZSBzZXQgb2YgR2x5cGhzLi4uCgogICAgdmFyIGJpcmREYXRhID0gewogICAgICAgICAgICBfYmlyZDogIjM1MiAyMjQgMTEzIDExMiIsCiAgICAgICAgICAgIGJpcmQ6ICJNNDI3LjcsMzAwLjQgYy02LjksMC42LTEzLjEsNS0xOS4yLDcuMWMtMTguMSw2LjItMzMuOSwiICsKICAgICAgICAgICAgIjkuMS01Ni41LDQuN2MyNC42LDE3LjIsMzYuNiwxMyw2My43LDAuMWMtMC41LDAuNi0wLjcsMS4zLTEuMywiICsKICAgICAgICAgICAgIjEuOWMxLjQtMC40LDIuNC0xLjcsMy40LTIuMmMtMC40LDAuNy0wLjksMS41LTEuNCwxLjljMi4yLTAuNiwiICsKICAgICAgICAgICAgIjMuNy0yLjMsNS45LTMuOWMtMi40LDIuMS00LjIsNS02LDhjLTEuNSwyLjUtMy4xLDQuOC01LjEsNi45Yy0xLCIgKwogICAgICAgICAgICAiMS0xLjksMS45LTIuOSwyLjljLTEuNCwxLjMtMi45LDIuNS01LjEsMi45YzEuNywwLjEsMy42LTAuMyw2LjUiICsKICAgICAgICAgICAgIi0xLjljLTEuNiwyLjQtNy4xLDYuMi05LjksNy4yYzEwLjUtMi42LDE5LjItMTUuOSwyNS43LTE4YzE4LjMiICsKICAgICAgICAgICAgIi01LjksMTMuOC0zLjQsMjctMTQuMmMxLjYtMS4zLDMtMSw1LjEtMC44YzEuMSwwLjEsMi4xLDAuMywzLjIsIiArCiAgICAgICAgICAgICIwLjVjMC44LDAuMiwxLjQsMC40LDIuMiwwLjhsMS44LDAuOWMtMS45LTQuNS0yLjMtNC4xLTUuOS02Yy0yLjMiICsKICAgICAgICAgICAgIi0xLjMtMy4zLTMuOC02LjItNC45Yy03LjEtMi42LTExLjksMTEuNy0xMS43LTVjMC4xLTgsNC4yLTE0LjQsIiArCiAgICAgICAgICAgICI2LjQtMjJjMS4xLTMuOCwyLjMtNy42LDIuNC0xMS41YzAuMS0yLjMsMC00LjctMC40LTdjLTItMTEuMi04LjQiICsKICAgICAgICAgICAgIi0yMS41LTE5LjctMjQuOGMtMS0wLjMtMS4xLTAuMy0wLjksMGM5LjYsMTcuMSw3LjIsMzguMywzLjEsNTQuMiIgKwogICAgICAgICAgICAiQzQyOS45LDI4NS41LDQyNi43LDI5My4yLDQyNy43LDMwMC40eiIKICAgICAgICB9LAoKICAgIC8vIFRPRE86IE9OT1MtMjU2NiBnbHlwaHMgZm9yIGRldmljZSB0eXBlczoKICAgIC8vICAgICAgICAgIG90biwgcm9hZG1fb3RuLCBmaXJld2FsbCwgYmFsYW5jZXIsIGlwcywgaWRzLAogICAgLy8gICAgICAgICAgY29udHJvbGxlciwgdmlydHVhbCwgZmliZXJfc3dpdGNoLCBvdGhlcgoKICAgIC8vIE5PVEU6IHdoZW4gYWRkaW5nIGdseXBocywgcGxlYXNlIGFsc28gdXBkYXRlIFRvcG9Db25zdGFudHMuR2x5cGhzIGNsYXNzLgoKICAgICAgICB0YWJsZUZyYW1lID0gJ002LjMsNS4zaDguNXYxNC4yaC04LjV6JyArCiAgICAgICAgICAgICdNOTUuMyw1LjNoOC41djE0LjJoLTguNXonICsKICAgICAgICAgICAgJ00xOC41LDUuM2gxNS42djE0LjJoLTE1LjZ6JyArCiAgICAgICAgICAgICdNMzcuOSw1LjNoMTUuNnYxNC4yaC0xNS42eicgKwogICAgICAgICAgICAnTTU3LDUuM2gxNS42djE0LjJoLTE1LjZ6JyArCiAgICAgICAgICAgICdNNzYuMSw1LjNoMTUuNnYxNC4yaC0xNS42eicgKwogICAgICAgICAgICAnTTYuMywyMy45aDk3LjV2ODAuNzVoLTk3LjV6JywKCiAgICAgICAgZ2x5cGhEYXRhU2V0ID0gewogICAgICAgICAgICBfdmlld2JveDogIjAgMCAxMTAgMTEwIiwKCiAgICAgICAgICAgIHVua25vd246ICJNMzUsNDBhNSw1LDAsMCwxLDUtNWgzMGE1LDUsMCwwLDEsNSw1djMwYTUsNSwwLDAsMS01LDUiICsKICAgICAgICAgICAgImgtMzBhNSw1LDAsMCwxLTUtNXoiLAoKICAgICAgICAgICAgcXVlcnk6ICJNNTEuNCw2OS45YzAtMC45LDAtMS42LDAtMi4xYzAtMi43LDAuNC01LjEsMS4yLTcuMSIgKwogICAgICAgICAgICAiYzAuNi0xLjUsMS41LTMsMi44LTQuNWMwLjktMS4xLDIuNi0yLjcsNS4xLTQuOGMyLjQtMi4xLDQtMy44LCIgKwogICAgICAgICAgICAiNC44LTUuMSBjMC43LTEuMywxLjEtMi42LDEuMS00LjFjMC0yLjctMS4xLTUuMS0zLjItNy4xYy0yLjEtMiIgKwogICAgICAgICAgICAiLTQuOC0zLjEtNy45LTMuMWMtMywwLTUuNSwwLjktNy41LDIuOGMtMiwxLjktMy4zLDQuOC00LDguN2wtNy4yIiArCiAgICAgICAgICAgICItMC44IGMwLjctNS4zLDIuNi05LjMsNS44LTEyLjFjMy4yLTIuOCw3LjUtNC4yLDEyLjgtNC4yYzUuNiwwLCIgKwogICAgICAgICAgICAiMTAuMSwxLjUsMTMuNCw0LjVjMy4zLDMsNSw2LjcsNSwxMC45YzAsMi41LTAuNiw0LjgtMS44LDYuOCAiICsKICAgICAgICAgICAgInMtMy41LDQuNi02LjksNy42Yy0yLjMsMi0zLjgsMy41LTQuNSw0LjRjLTAuNywxLTEuMiwyLTEuNiwzLjMiICsKICAgICAgICAgICAgImMtMC4zLDEuMi0wLjUsMy4yLTAuNiw2SDUxLjR6IE01MSw4My44di03LjloOHY3LjlINTF6IiwKCiAgICAgICAgICAgIG5vZGU6ICJNMTUsMTAwYTUsNSwwLDAsMS01LTV2LTY1YTUsNSwwLDAsMSw1LTVoODBhNSw1LDAsMCwxLDUsNSIgKwogICAgICAgICAgICAidjY1YTUsNSwwLDAsMS01LDV6TTE0LDIyLjVsMTEtMTFhMTAsMywwLDAsMSwxMC0yaDQwYTEwLDMsMCwwLDEsIiArCiAgICAgICAgICAgICIxMCwybDExLDExek0xNiwzNWE1LDUsMCwwLDEsMTAsMGE1LDUsMCwwLDEtMTAsMHoiLAoKICAgICAgICAgICAgc3dpdGNoOiAiTTEwLDIwYTEwLDEwLDAsMCwxLDEwLTEwaDcwYTEwLDEwLDAsMCwxLDEwLDEwdjcwYTEwLDEwLCIgKwogICAgICAgICAgICAiMCwwLDEtMTAsMTBoLTcwYTEwLDEwLDAsMCwxLTEwLTEwek02MCwyNmwxMiwwLDAtOCwxOCwxMy0xOCwxMywwIiArCiAgICAgICAgICAgICItOC0xMiwwek02MCw2MGwxMiwwLDAtOCwxOCwxMy0xOCwxMywwLTgtMTIsMHpNNTAsNDBsLTEyLDAsMC04IiArCiAgICAgICAgICAgICItMTgsMTMsMTgsMTMsMC04LDEyLDB6TTUwLDc0bC0xMiwwLDAtOC0xOCwxMywxOCwxMywwLTgsMTIsMHoiLAoKICAgICAgICAgICAgcm9hZG06ICJNMTAsMzVsMjUtMjVoNDBsMjUsMjV2NDBsLTI1LDI1aC00MGwtMjUtMjV6TTU4LDI2bDEyLDAsMCIgKwogICAgICAgICAgICAiLTgsMTgsMTMtMTgsMTMsMC04LTEyLDB6TTU4LDYwbDEyLDAsMC04LDE4LDEzLTE4LDEzLDAtOC0xMiwweiIgKwogICAgICAgICAgICAiTTUyLDQwbC0xMiwwLDAtOC0xOCwxMywxOCwxMywwLTgsMTIsMHpNNTIsNzRsLTEyLDAsMC04LTE4LDEzLCIgKwogICAgICAgICAgICAiMTgsMTMsMC04LDEyLDB6IiwKCiAgICAgICAgICAgIG90bjogIk0xMCwzNWwyNS0yNWg0MGwyNSwyNXY0MGwtMjUsMjVoLTQwbC0yNS0yNXpNNTgsMjZsMTIsMCwwIiArCiAgICAgICAgICAgICItOCwxOCwxMy0xOCwxMywwLTgtMTIsMHpNNTgsNjBsMTIsMCwwLTgsMTgsMTMtMTgsMTMsMC04LTEyLDB6IiArCiAgICAgICAgICAgICJNNTIsNDBsLTEyLDAsMC04LTE4LDEzLDE4LDEzLDAtOCwxMiwwek01Miw3NGwtMTIsMCwwLTgtMTgsMTMsIiArCiAgICAgICAgICAgICIxOCwxMywwLTgsMTIsMHoiLAoKICAgICAgICAgICAgZW5kc3RhdGlvbjogIk0xMCwxNWE1LDUsMCwwLDEsNS01aDY1YTUsNSwwLDAsMSw1LDV2ODBhNSw1LDAsMCwxIiArCiAgICAgICAgICAgICItNSw1aC02NWE1LDUsMCwwLDEtNS01ek04Ny41LDE0bDExLDExYTMsMTAsMCwwLDEsMiwxMHY0MGEzLDEwLCIgKwogICAgICAgICAgICAiMCwwLDEsLTIsMTBsLTExLDExek0xNywxOWEyLDIsMCwwLDEsMi0yaDU2YTIsMiwwLDAsMSwyLDJ2MjZhMiwiICsKICAgICAgICAgICAgIjIsMCwwLDEtMiwyaC01NmEyLDIsMCwwLDEtMi0yek0yMCwyMGg1NHYxMGgtNTR6TTIwLDMzaDU0djEwaCIgKwogICAgICAgICAgICAiLTU0ek00Miw3MGE1LDUsMCwwLDEsMTAsMGE1LDUsMCwwLDEtMTAsMHoiLAoKICAgICAgICAgICAgcm91dGVyOiAiTTEwLDU1QTQ1LDQ1LDAsMCwxLDEwMCw1NUE0NSw0NSwwLDAsMSwxMCw1NU0yMCw1MGwxMiwwLCIgKwogICAgICAgICAgICAiMC04LDE4LDEzLTE4LDEzLDAtOC0xMiwwek05MCw1MGwtMTIsMCwwLTgtMTgsMTMsMTgsMTMsMC04LDEyLDB6IiArCiAgICAgICAgICAgICJNNTAsNDdsMC0xMi04LDAsMTMtMTgsMTMsMTgtOCwwLDAsMTJ6TTUwLDYzbDAsMTItOCwwLDEzLDE4LDEzIiArCiAgICAgICAgICAgICItMTgtOCwwLDAtMTJ6IiwKCiAgICAgICAgICAgIGJncFNwZWFrZXI6ICJNMTAsNDBhNDUsMzUsMCwwLDEsOTAsMFExMDAsNzcsNTUsMTAwUTEwLDc3LDEwLDQweiIgKwogICAgICAgICAgICAiTTUwLDI5bDEyLDAsMC04LDE4LDEzLTE4LDEzLDAtOC0xMiwwek02MCw1N2wtMTIsMCwwLTgtMTgsMTMsIiArCiAgICAgICAgICAgICIxOCwxMywwLTgsMTIsMHoiLAoKICAgICAgICAgICAgbWljcm93YXZlOiAiTTg1LDcxLjJjLTguOSwxMC41LTI5LjYsOC43LTQ1LjMtMy41QzIzLjksNTUuNCwxOS44LCIgKwogICAgICAgICAgICAiMzcsMjguNiwyNi41QzI5LjksMzguNiw3MS41LDY5LjksODUsNzEuMnogTTkyLjcsNzYuMk0xNi4yLDE1ICIgKwogICAgICAgICAgICAiTTY5LjUsMTAwLjd2LTRjMC0xLjQtMS4yLTIuMi0yLjYtMi4ySDE5LjNjLTEuNCwwLTIuOCwwLjctMi44LDIuMiIgKwogICAgICAgICAgICAidjMuOWMwLDAuNywwLjgsMSwxLjUsMWg1MC4zQzY5LDEwMS41LDY5LjUsMTAxLjMsNjkuNSwxMDAuN3ogIiArCiAgICAgICAgICAgICJNNzcuMyw3LjVsMCwzLjdjOSwwLjEsMTYuMyw3LjEsMTYuMiwxNS43bDMuOSwwQzk3LjUsMTYuMyw4OC41LCIgKwogICAgICAgICAgICAiNy42LDc3LjMsNy41eiBNNzcuNiwxNC43bDAsMi41YzUuMywwLDkuNyw0LjIsOS42LDkuM2wyLjYsMEM4OS45IiArCiAgICAgICAgICAgICIsMjAsODQuNCwxNC43LDc3LjYsMTQuN3ogTTgyLjMsMjIuMmMtMS4zLTEuMi0yLjktMS45LTQuNy0xLjkiICsKICAgICAgICAgICAgImwwLDEuMmMxLjQsMCwyLjgsMC42LDMuOCwxLjVjMSwxLDEuNiwyLjMsMS42LDMuN2wxLjMsMEM4NC4zLDI1LjEsIiArCiAgICAgICAgICAgICI4My42LDIzLjQsODIuMywyMi4yeiBNMzguOSw2OS41bC01LjEsMjNoMTYuNWwtMi41LTE3LjJDNDQuMSw3My4zLCIgKwogICAgICAgICAgICAiMzguOSw2OS41LDM4LjksNjkuNXpNNTguMSw1NC4xYzEzLjcsMTAuMSwyNi41LDE2LjgsMjkuMiwxMy43IiArCiAgICAgICAgICAgICJjMi43LTMuMS01LjYtMTMtMTkuMy0yNC40IE02Mi45LDM0LjIgTTYyLDM3LjlDNDcuNywyNy4zLDMzLjcsMjAsIiArCiAgICAgICAgICAgICIzMSwyMy4xYy0yLjcsMy4yLDcsMTQuMiwyMC42LDI2IE03My45LDI1LjdjLTIuOSwwLjEtNS4yLDIuMy01LjEsIiArCiAgICAgICAgICAgICI0LjhjMCwwLjcsMC4yLDEuNCwwLjYsMmwwLDBMNTMuOCw0OS43bDMuMywyLjVMNzIuNywzNWwtMC40LTAuMyIgKwogICAgICAgICAgICAiYzAuNiwwLjIsMS4zLDAuMywxLjksMC4zYzIuOS0wLjEsNS4yLTIuMyw1LjEtNC45Qzc5LjMsMjcuNiw3Ni44LCIgKwogICAgICAgICAgICAiMjUuNiw3My45LDI1Ljd6IiwKCiAgICAgICAgICAgIGNoYWluOiAiTTYwLjQsNzcuNmMtNC45LDUuMi05LjYsMTEuMy0xNS4zLDE2LjNjLTguNiw3LjUtMjAuNCw2LjgiICsKICAgICAgICAgICAgIi0yOC0wLjhjLTcuNy03LjctOC40LTE5LjYtMC44LTI4LjRjNi41LTcuNCwxMy41LTE0LjQsMjAuOS0yMC45IiArCiAgICAgICAgICAgICJjNy41LTYuNywxOS4yLTYuNywyNi41LTAuOGMzLjUsMi44LDQuNCw2LjEsMi4yLDguN2MtMi43LDMuMSIgKwogICAgICAgICAgICAiLTUuNSwyLjUtOC41LDAuM2MtNC43LTMuNC05LjctMy4yLTE0LDAuOUMzNy4xLDU4LjcsMzEsNjQuOCwiICsKICAgICAgICAgICAgIjI1LjIsNzFjLTQuMiw0LjQtNC4yLDEwLjYtMC42LDE0LjNjMy43LDMuNyw5LjcsMy43LDE0LjMtMC40IiArCiAgICAgICAgICAgICJjMi45LTIuNSw1LjMtNS41LDguMy04YzEtMC45LDMtMS4xLDQuNC0wLjlDNTQuOCw3Ni4zLDU3LjksNzcuMSwiICsKICAgICAgICAgICAgIjYwLjQsNzcuNnpNNDkuMiwzMi4yYzUtNS4yLDkuNy0xMC45LDE1LjItMTUuN2MxMi44LTExLDMxLjIiICsKICAgICAgICAgICAgIi00LjksMzQuMywxMS4yQzEwMCwzNC4yLDk4LjMsNDAuMiw5NCw0NWMtNi43LDcuNC0xMy43LDE0LjYiICsKICAgICAgICAgICAgIi0yMS4yLDIxLjJDNjUuMSw3Myw1My4yLDcyLjcsNDYsNjYuNWMtMy4yLTIuOC0zLjktNS44LTEuNi04LjQiICsKICAgICAgICAgICAgImMyLjYtMi45LDUuMy0yLjQsOC4yLTAuM2M1LjIsMy43LDEwLDMuMywxNC43LTEuMWM1LjgtNS42LDExLjYiICsKICAgICAgICAgICAgIi0xMS4zLDE3LjItMTcuMmM0LjYtNC44LDQuOS0xMS4xLDAuOS0xNWMtMy45LTMuOS0xMC4xLTMuNC0xNSwiICsKICAgICAgICAgICAgIjEuMmMtMy4xLDIuOS01LjcsNy40LTkuMyw4LjVDNTcuNiwzNS4zLDUzLDMzLDQ5LjIsMzIuMnoiLAoKICAgICAgICAgICAgY3Jvd246ICJNOTkuNSwyMS42YzAsMy0yLjMsNS40LTUuMSw1LjRjLTAuMywwLTAuNywwLTEtMC4xYy0xLjgsIiArCiAgICAgICAgICAgICI0LTQuOCwxMC03LjIsMTcuM2MtMy40LDEwLjYtMC45LDI2LjIsMi43LDI3LjNDOTAuNCw3Miw5MS4zLCIgKwogICAgICAgICAgICAiNzUsODgsNzVIMjIuN2MtMy4zLDAtMi40LTMtMC45LTMuNWMzLjYtMS4xLDYuMS0xNi43LDIuNy0yNy4zIiArCiAgICAgICAgICAgICJjLTIuNC03LjQtNS40LTEzLjUtNy4yLTE3LjVjLTAuNSwwLjItMSwwLjMtMS42LDAuM2MtMi44LDAiICsKICAgICAgICAgICAgIi01LjEtMi40LTUuMS01LjRjMC0zLDIuMy01LjQsNS4xLTUuNGMyLjgsMCw1LjEsMi40LDUuMSw1LjRjMCwiICsKICAgICAgICAgICAgIjEtMC4yLDEuOS0wLjcsMi43YzAuNywwLjgsMS40LDEuNiwyLjQsMi42YzguOCw4LjksMTEuOSwxMi43LCIgKwogICAgICAgICAgICAiMTguMSwxMS43YzYuNS0xLDExLTguMiwxMy4zLTE0LjFjLTItMC44LTMuMy0yLjctMy4zLTUuMWMwLTMsIiArCiAgICAgICAgICAgICIyLjMtNS40LDUuMS01LjRjMi44LDAsNS4xLDIuNCw1LjEsNS40YzAsMi41LTEuNiw0LjUtMy43LDUuMiIgKwogICAgICAgICAgICAiYzIuMyw1LjksNi44LDEzLDEzLjIsMTRjNi4yLDEsOS4zLTIuNywxOC4xLTExLjdjMC43LTAuNywxLjQiICsKICAgICAgICAgICAgIi0xLjUsMi0yLjFjLTAuNi0wLjktMS0yLTEtMy4xYzAtMywyLjMtNS40LDUuMS01LjRDOTcuMiwxNi4yLCIgKwogICAgICAgICAgICAiOTkuNSwxOC42LDk5LjUsMjEuNnpNOTIsODcuOWMwLDIuMi0xLjcsNC4xLTMuOCw0LjFIMjIuNGMiICsKICAgICAgICAgICAgIi0yLjEsMC00LjQtMS45LTQuNC00LjF2LTMuM2MwLTIuMiwyLjMtNC41LDQuNC00LjVoNjUuOGMyLjEsIiArCiAgICAgICAgICAgICIwLDMuOCwyLjMsMy44LDQuNVY4Ny45eiIsCgogICAgICAgICAgICBsb2NrOiAiTTc5LjQsNDguNmgtMi43YzAuMi01LjctMC4yLTIwLjQtNy45LTI4LjhjLTMuNi0zLjktOC4zIiArCiAgICAgICAgICAgICItNS45LTEzLjctNS45Yy01LjQsMC0xMC4yLDItMTMuOCw1LjljLTcuOCw4LjQtOC4zLDIzLjItOC4xLDI4LjgiICsKICAgICAgICAgICAgImgtMi43Yy00LjQsMC04LDIuNi04LDUuOXYzNS43YzAsMy4zLDMuNiw1LjksOCw1LjloNDguOWM0LjQsMCwiICsKICAgICAgICAgICAgIjgtMi42LDgtNS45VjU0LjVDODcuNSw1MS4zLDgzLjksNDguNiw3OS40LDQ4LjZ6IE00OC4xLDI2LjFjMS45IiArCiAgICAgICAgICAgICItMiw0LjEtMi45LDctMi45YzIuOSwwLDUuMSwwLjksNi45LDIuOWM1LDUuNCw1LjYsMTcuMSw1LjQsMjIuNiIgKwogICAgICAgICAgICAiaC0yNUM0Mi4zLDQzLjEsNDMuMSwzMS41LDQ4LjEsMjYuMXoiLAoKICAgICAgICAgICAgdG9wbzogJ005Ny4yLDc2LjNIODYuNmwtNy43LTIxLjlIODJjMSwwLDEuOS0wLjgsMS45LTEuOVYzNS43YycgKwogICAgICAgICAgICAnMC0xLTAuOC0xLjktMS45LTEuOUg2NS4yYy0xLDAtMS45LDAuOC0xLjksMS45djIuNkwzMy40LDI2LjF2LTExJyArCiAgICAgICAgICAgICdjMC0xLTAuOC0xLjktMS45LTEuOUgxNC43Yy0xLDAtMS45LDAuOC0xLjksMS45djE2LjhjMCwxLDAuOCwnICsKICAgICAgICAgICAgJzEuOSwxLjksMS45aDE2LjhjMSwwLDEuOS0wLjgsMS45LTEuOXYtMi42bDI5LjksMTIuMnY5TDMwLjUsNzYuOScgKwogICAgICAgICAgICAnYy0wLjMtMC4zLTAuOC0wLjUtMS4zLTAuNUgxMi40Yy0xLDAtMS45LDAuOC0xLjksMS45Vjk1YzAsMSwwLjgsJyArCiAgICAgICAgICAgICcxLjksMS45LDEuOWgxNi44YzEsMCwxLjktMC44LDEuOS0xLjl2LTYuOWg0Ny40Vjk1YzAsMSwwLjgsMS45LCcgKwogICAgICAgICAgICAnMS45LDEuOWgxNi44YzEsMCwxLjktMC44LDEuOS0xLjlWNzguMkM5OS4xLDc3LjIsOTguMiw3Ni4zLDk3LjIsJyArCiAgICAgICAgICAgICc3Ni4zeiBNMzEuMSw4NS4xdi00LjlsMzIuOC0yNi40YzAuMywwLjMsMC44LDAuNSwxLjMsMC41aDEwLjVsJyArCiAgICAgICAgICAgICc3LjcsMjEuOWgtM2MtMSwwLTEuOSwwLjgtMS45LDEuOXY2LjlIMzEuMXonLAoKICAgICAgICAgICAgcmVmcmVzaDogJ00xMDIuNiw0MC44TDg4LjQsNzAuNUw2OS44LDQzLjRMODAsNDIuNmMtMC43LTIuMy0xLjctJyArCiAgICAgICAgICAgICc1LjEtMy40LTcuOEM3MS44LDI3LDY0LDIzLjEsNTMuNSwyMy4xYy0xOS41LDAtMjQuOCwxMS4yLTI0LjgsJyArCiAgICAgICAgICAgICcxMS4zbC0xMC4xLTQuM2MwLjMtMC43LDcuOS0xOCwzNS0xOGMyNC44LDAsMzUsMTcuMywzNy43LDI5LjZMJyArCiAgICAgICAgICAgICcxMDIuNiw0MC44eiBNODEuNSw3NC41Yy0wLjIsMC41LTUuNSwxMS40LTI0LjksMTEuNGMtMTAuNSwwLTE4LjMnICsKICAgICAgICAgICAgJy0zLjktMjMuMS0xMS43Yy0xLjctMi44LTIuOC01LjYtMy40LTcuOGwxMC4yLTAuOEwyMS43LDM4LjVMNy41LCcgKwogICAgICAgICAgICAnNjguMmwxMS40LTAuOWMyLjcsMTIuMywxMi45LDI5LjYsMzcuNywyOS42YzI2LjksMCwzNC42LTE3LjIsMzQuOScgKwogICAgICAgICAgICAnLTE4TDgxLjUsNzQuNXonLAoKICAgICAgICAgICAgZ2FyYmFnZTogJ005NC42LDIwLjJjMCwyLjctMi4xLDQuOC00LjgsNC44SDE5LjJjLTIuNywwLTQuOC0yLjEtJyArCiAgICAgICAgICAgICc0LjgtNC44czIuMS00LjgsNC44LTQuOGgyNy42Yy0wLjgtMC43LTEuNC0xLjctMS40LTIuOWMwLTIuMSwxLjctJyArCiAgICAgICAgICAgICczLjksMy45LTMuOWgxMC40YzIuMSwwLDMuOSwxLjcsMy45LDMuOWMwLDEuMi0wLjUsMi4yLTEuNCwyLjloJyArCiAgICAgICAgICAgICcyNy42QzkyLjUsMTUuNCw5NC42LDE3LjYsOTQuNiwyMC4yeiBNOTEsMzMuNHY2NC44YzAsMi0xLjcsMy42LScgKwogICAgICAgICAgICAnMy44LDMuNmgtNjVjLTIuMSwwLTMuOC0xLjYtMy44LTMuNlYzMy40YzAtMiwxLjctMy42LDMuOC0zLjZoNjVDJyArCiAgICAgICAgICAgICc4OS4zLDI5LjgsOTEsMzEuNCw5MSwzMy40eiBNMzEuNSwzNy43YzAtMi4xLTEuMi0zLjgtMi43LTMuOGgtMC43JyArCiAgICAgICAgICAgICdjLTEuNSwwLTIuNywxLjctMi43LDMuOHY1NS45YzAsMi4xLDEuMiwzLjgsMi43LDMuOGgwLjdjMS41LDAsMi43JyArCiAgICAgICAgICAgICctMS43LDIuNy0zLjhWMzcuN3ogTTU4LjUsMzcuN2MwLTIuMS0xLjgtMy44LTQtMy44aC0xYy0yLjIsMC00LCcgKwogICAgICAgICAgICAnMS43LTQsMy44djU1LjljMCwyLjEsMS44LDMuOCw0LDMuOGgxYzIuMiwwLDQtMS43LDQtMy44VjM3Ljd6IE0nICsKICAgICAgICAgICAgJzgzLjUsMzcuN2MwLTIuMS0xLjItMy44LTIuNy0zLjhoLTAuN2MtMS41LDAtMi43LDEuNy0yLjcsMy44djU1LjknICsKICAgICAgICAgICAgJ2MwLDIuMSwxLjIsMy44LDIuNywzLjhoMC43YzEuNSwwLDIuNy0xLjcsMi43LTMuOFYzNy43eicsCgoKICAgICAgICAgICAgLy8gLS0tIE5hdmlnYXRpb24gZ2x5cGhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgZmxvd1RhYmxlOiB0YWJsZUZyYW1lICsKICAgICAgICAgICAgJ004Niw2My4yYzAsMy4zLTIuNyw2LTYsNmMtMi44LDAtNS4xLTEuOS01LjgtJyArCiAgICAgICAgICAgICc0LjVINjMuM3Y1LjFjMCwwLjktMC43LDEuNS0xLjUsMS41aC01LjJ2MTAuNmMyLjYsMC43LDQuNSwzLDQuNSwnICsKICAgICAgICAgICAgJzUuOGMwLDMuMy0yLjcsNi02LDZjLTMuMywwLTYtMi43LTYtNmMwLTIuOCwxLjktNS4xLDQuNC01LjhWNzEuMycgKwogICAgICAgICAgICAnSDQ4Yy0wLjksMC0xLjUtMC43LTEuNS0xLjV2LTUuMUgzNmMtMC43LDIuNi0zLDQuNC01LjgsNC40Yy0zLjMsJyArCiAgICAgICAgICAgICcwLTYtMi43LTYtNnMyLjctNiw2LTZjMi44LDAsNS4yLDEuOSw1LjgsNC41aDEwLjVWNTZjMC0wLjksMC43LScgKwogICAgICAgICAgICAnMS41LDEuNS0xLjVoNS41VjQzLjhjLTIuNi0wLjctNC41LTMtNC41LTUuOGMwLTMuMywyLjctNiw2LTZzNiwnICsKICAgICAgICAgICAgJzIuNyw2LDZjMCwyLjgtMS45LDUuMS00LjUsNS44djEwLjZoNS4yYzAuOSwwLDEuNSwwLjcsMS41LDEuNXYnICsKICAgICAgICAgICAgJzUuNmgxMC44YzAuNy0yLjYsMy00LjUsNS44LTQuNUM4My4zLDU3LjEsODYsNTkuOCw4Niw2My4yeiAnICsKICAgICAgICAgICAgJ001NS4xLDQyLjNjMi4zLDAsNC4zLTEuOSw0LjMtNC4zYzAtMi4zLTEuOS00LjMtNC4zLTQuMycgKwogICAgICAgICAgICAncy00LjMsMS45LTQuMyw0LjNDNTAuOCw0MC40LDUyLjcsNDIuMyw1NS4xLDQyLjN6ICcgKwogICAgICAgICAgICAnTTM0LjQsNjMuMWMwLTIuMy0xLjktNC4zLTQuMy00LjNzLTQuMywxLjktNC4zLDQuMycgKwogICAgICAgICAgICAnczEuOSw0LjMsNC4zLDQuM1MzNC40LDY1LjUsMzQuNCw2My4xeiAnICsKICAgICAgICAgICAgJ001NS4xLDgzLjVjLTIuMywwLTQuMywxLjktNC4zLDQuM3MxLjksNC4zLDQuMyw0LjMnICsKICAgICAgICAgICAgJ3M0LjMtMS45LDQuMy00LjNTNTcuNSw4My41LDU1LjEsODMuNXonICsKICAgICAgICAgICAgJ004NC4yLDYzLjJjMC0yLjMtMS45LTQuMy00LjMtNC4zcy00LjMsJyArCiAgICAgICAgICAgICcxLjktNC4zLDQuM3MxLjksNC4zLDQuMyw0LjNTODQuMiw2NS41LDg0LjIsNjMuMnonLAoKICAgICAgICAgICAgcG9ydFRhYmxlOiB0YWJsZUZyYW1lICsKICAgICAgICAgICAgJ004NS41LDM3LjdjMC0wLjctMC40LTEuMy0wLjktMS4zSDI2LjJjLTAuNSwwLScgKwogICAgICAgICAgICAnMC45LDAuNi0wLjksMS4zdjM0LjZjMCwwLjcsMC40LDEuMywwLjksMS4zaDExdjkuNmMwLDEuMSwwLjUsMiwnICsKICAgICAgICAgICAgJzEuMiwyaDkuMWMwLDAuMiwwLDAuMywwLDAuNXYzYzAsMS4xLDAuNSwyLDEuMiwyaDEzLjVjMC42LDAsMS4yLScgKwogICAgICAgICAgICAnMC45LDEuMi0ydi0zYzAtMC4yLDAtMC4zLDAtMC41aDkuMWMwLjYsMCwxLjItMC45LDEuMi0ydi05LjZoMTEnICsKICAgICAgICAgICAgJ2MwLjUsMCwwLjktMC42LDAuOS0xLjNWMzcuN3ogTTMwLjIsNDBoLTF2OGgxVjQwek03NS4yLDQwaC0yLjF2OCcgKwogICAgICAgICAgICAnaDIuMVY0MHogTTY3LjcsNDBoLTIuMXY4aDIuMVY0MHogTTYwLjIsNDBoLTIuMXY4aDIuMVY0MHogTTUyLjcsJyArCiAgICAgICAgICAgICc0MGgtMi4xdjhoMi4xVjQweiBNNDUuMiw0MGgtMi4xdjhoMi4xVjQwek0zNy43LDQwaC0yLjF2OGgyLjFWNDAnICsKICAgICAgICAgICAgJ3ogTTgxLjYsNDBoLTF2OGgxVjQweicsCgogICAgICAgICAgICBncm91cFRhYmxlOiB0YWJsZUZyYW1lICsKICAgICAgICAgICAgJ000NS43LDUyLjdjMC4yLTUuNiwyLjYtMTAuNyw2LjItMTQuNGMtMi42LTEuNS01LjctMi41LTguOS0yLjUnICsKICAgICAgICAgICAgJ2MtOS44LDAtMTcuNyw3LjktMTcuNywxNy43YzAsNi4zLDMuMywxMS45LDguMywxNScgKwogICAgICAgICAgICAnQzM0LjgsNjEuNSwzOS40LDU1LjYsNDUuNyw1Mi43eiAnICsKICAgICAgICAgICAgJ001MS45LDY4LjhjLTMuMS0zLjEtNS4yLTcuMi02LTExLjdjLTQuNywyLjgtNy45LDcuNi04LjYsMTMuMicgKwogICAgICAgICAgICAnYzEuOCwwLjYsMy42LDAuOSw1LjYsMC45QzQ2LjIsNzEuMiw0OS4zLDcwLjMsNTEuOSw2OC44eiCM3O9WxgcEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0cFZAAEAGOofAqAc2wKgHYJUrH/X2akkNZz1cyYAQA44k7wAAAQEICgCjXucATaXijNzvVhUIBAAqMwAAKjMAAGj3KB/SxQgAJ60eEwgARQAzHBh4QABABl99wKgHYMCoBzYf9ZUrZz1cyfZqSQ2AEAFOwvUAAAEBCAoATaXiAKNe4ScgKwogICAgICAgICAgICAnTTU1LjIsNzEuNWMtMy41LDIuNC03LjcsMy43LTEyLjIsMy43Yy0xLjksMC0zLjgtMC4zLTUuNi0wLjcnICsKICAgICAgICAgICAgJ0MzOC41LDgzLjIsNDUuOSw5MCw1NC45LDkwYzksMCwxNi40LTYuNywxNy41LTE1LjQnICsKICAgICAgICAgICAgJ2MtMS42LDAuNC0zLjQsMC42LTUuMSwwLjZDNjIuOCw3NS4yLDU4LjYsNzMuOCw1NS4yLDcxLjV6ICcgKwogICAgICAgICAgICAnTTU0LjksNTAuNmMxLjksMCwzLjgsMC4zLDUuNiwwLjdjLTAuNS00LjEtMi41LTcuOS01LjQtMTAuNicgKwogICAgICAgICAgICAnYy0yLjksMi43LTQuOCw2LjQtNS4zLDEwLjVDNTEuNSw1MC44LDUzLjIsNTAuNiw1NC45LDUwLjZ6ICcgKwogICAgICAgICAgICAnTTQ5LjcsNTUuNGMwLjUsNC4zLDIuNCw4LjEsNS40LDEwLjljMi45LTIuOCw0LjktNi42LDUuNC0xMC44JyArCiAgICAgICAgICAgICdjLTEuOC0wLjYtMy42LTAuOS01LjYtMC45QzUzLjEsNTQuNiw1MS40LDU0LjksNDkuNyw1NS40eiAnICsKICAgICAgICAgICAgJ004OSw1My41YzAtMTItOS43LTIxLjctMjEuNy0yMS43Yy00LjUsMC04LjcsMS40LTEyLjIsMy43JyArCiAgICAgICAgICAgICdjLTMuNS0yLjQtNy43LTMuNy0xMi4yLTMuN2MtMTIsMC0yMS43LDkuNy0yMS43LDIxLjcnICsKICAgICAgICAgICAgJ2MwLDguNSw0LjksMTUuOSwxMiwxOS40QzMzLjYsODQuNiw0My4yLDk0LDU0LjksOTQnICsKICAgICAgICAgICAgJ2MxMS43LDAsMjEuMi05LjMsMjEuNy0yMC45Qzg0LDY5LjcsODksNjIuMiw4OSw1My41eiAnICsKICAgICAgICAgICAgJ002NC4zLDU3LjNjLTAuOCw0LjQtMi45LDguNC01LjksMTEuNWMyLjYsMS41LDUuNywyLjUsOC45LDIuNScgKwogICAgICAgICAgICAnYzEuOCwwLDMuNi0wLjMsNS4yLTAuOEM3Miw2NC45LDY4LjgsNjAuMSw2NC4zLDU3LjN6ICcgKwogICAgICAgICAgICAnTTY3LjMsMzUuOGMtMy4zLDAtNi4zLDAuOS04LjksMi41YzMuNywzLjgsNi4xLDguOSw2LjIsMTQuNicgKwogICAgICAgICAgICAnYzYuMSwzLjEsMTAuNiw4LjksMTEuNywxNS44QzgxLjUsNjUuNiw4NSw2MCw4NSw1My41JyArCiAgICAgICAgICAgICdDODUsNDMuOCw3Ny4xLDM1LjgsNjcuMywzNS44eicsCgogICAgICAgICAgICBtZXRlclRhYmxlOiB0YWJsZUZyYW1lICsKICAgICAgICAgICAgJ005Ni4zLDc5LjJjMC0xOS4xLTIyLjEtMzQuNi00MS4zLTM0LjZTMTMuNyw2MC4xLDEzLjcsNzkuMicgKwogICAgICAgICAgICAnSDM5LjRjMC03LjIsOC40LTEzLjEsMTUuNy0xMy4xUzcwLjYsNzIsNzAuNiw3OS4ySDk2LjN6JyArCiAgICAgICAgICAgICdNNDgsNjUuNkwzNi44LDUzYzAtLjUtMS41LjUtMS40LDAuN2w1LjMsMTYuNnonLAoKICAgICAgICAgICAgLy8gLS0tIFRvcG9sb2d5IHRvb2xiYXIgc3BlY2lmaWMgZ2x5cGhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIHN1bW1hcnk6ICJNOTUuOCw5LjJIMTQuMmMtMi44LDAtNSwyLjItNSw1djgxLjVjMCwyLjgsMi4yLDUsNSwiICsKICAgICAgICAgICAgIjVoODEuNWMyLjgsMCw1LTIuMiw1LTVWMTQuMkMxMDAuOCwxMS41LDk4LjUsOS4yLDk1LjgsOS4yeiAiICsKICAgICAgICAgICAgIk0xNi43LDIyLjJjMC0xLjEsMC45LTIsMi0yaDIwLjFjMS4xLDAsMiwwLjksMiwydjIwLjFjMCwxLjEtMC45LCIgKwogICAgICAgICAgICAiMi0yLDJIMTguN2MtMS4xLDAtMi0wLjktMi0yVjIyLjJ6IE05Myw4N2MwLDEuMS0wLjksMi0yLDJIMTguOSIgKwogICAgICAgICAgICAiYy0xLjEsMC0yLTAuOS0yLTJ2LTdjMC0xLjEsMC45LTIsMi0ySDkxYzEuMSwwLDIsMC45LDIsMlY4N3ogIiArCiAgICAgICAgICAgICJNOTMsNjVjMCwxLjEtMC45LDItMiwySDE4LjljLTEuMSwwLTItMC45LTItMnYtN2MwLTEuMSwwLjktMiwiICsKICAgICAgICAgICAgIjItMkg5MWMxLjEsMCwyLDAuOSwyLDJWNjV6IiwKCiAgICAgICAgICAgIGRldGFpbHM6ICJNOTUuOCw5LjJIMTQuMmMtMi44LDAtNSwyLjItNSw1djgxLjVjMCwyLjgsMi4yLDUsNSwiICsKICAgICAgICAgICAgIjVoODEuNWMyLjgsMCw1LTIuMiw1LTVWMTQuMkMxMDAuOCwxMS41LDk4LjUsOS4yLDk1LjgsOS4yeiBNMTYuOSwiICsKICAgICAgICAgICAgIjIyLjJjMC0xLjEsMC45LTIsMi0ySDkxYzEuMSwwLDIsMC45LDIsMnY3YzAsMS4xLTAuOSwyLTIsMkgxOC45YyIgKwogICAgICAgICAgICAiLTEuMSwwLTItMC45LTItMlYyMi4yeiBNOTMsODcuOGMwLDEuMS0wLjksMi0yLDJIMTguOWMtMS4xLCIgKwogICAgICAgICAgICAiMC0yLTAuOS0yLTJ2LTdjMC0xLjEsMC45LTIsMi0ySDkxYzEuMSwwLDIsMC45LDIsMlY4Ny44eiBNOTMsNjguMiIgKwogICAgICAgICAgICAiYzAsMS4xLTAuOSwyLTIsMkgxOC45Yy0xLjEsMC0yLTAuOS0yLTJ2LTdjMC0xLjEsMC45LTIsMi0ySDkxIiArCiAgICAgICAgICAgICJjMS4xLDAsMiwwLjksMiwyVjY4LjJ6IE05Myw0OC44YzAsMS4xLTAuOSwyLTIsMkgxOWMtMS4xLDAtMi0iICsKICAgICAgICAgICAgIjAuOS0yLTJ2LTdjMC0xLjEsMC45LTIsMi0ySDkxYzEuMSwwLDIsMC45LDIsMlY0OC44eiIsCgogICAgICAgICAgICBwb3J0czogIk05OCw5LjJINzkuNmMtMS4xLDAtMi4xLDAuOS0yLjEsMi4xdjE3LjZsLTUuNCw1LjRjLTEuNyIgKwogICAgICAgICAgICAiLTEuMS0zLjgtMS44LTYtMS44Yy02LDAtMTAuOSw0LjktMTAuOSwxMC45YzAsMi4yLDAuNyw0LjMsMS44LDYiICsKICAgICAgICAgICAgImwtNy41LDcuNWMtMS44LTEuMi0zLjktMS45LTYuMi0xLjljLTYsMC0xMC45LDQuOS0xMC45LDEwLjljMCwiICsKICAgICAgICAgICAgIjIuMywwLjcsNC40LDEuOSw2LjJsLTYuMiw2LjJIMTEuM2MtMS4xLDAtMi4xLDAuOS0yLjEsMi4xdjE4LjQiICsKICAgICAgICAgICAgImMwLDEuMSwwLjksMi4xLDIuMSwyLjFoMTguNGMxLjEsMCwyLjEtMC45LDIuMS0yLjF2LTE2bDctNi45IiArCiAgICAgICAgICAgICJjMS40LDAuNywzLDEuMSw0LjcsMS4xYzYsMCwxMC45LTQuOSwxMC45LTEwLjljMC0xLjctMC40LTMuMy0iICsKICAgICAgICAgICAgIjEuMS00LjdsOC04YzEuNSwwLjcsMy4xLDEuMSw0LjgsMS4xYzYsMCwxMC45LTQuOSwxMC45LTEwLjljMCIgKwogICAgICAgICAgICAiLTEuNy0wLjQtMy40LTEuMS00LjhsNi45LTYuOUg5OGMxLjEsMCwyLjEtMC45LDIuMS0yLjFWMTEuMyIgKwogICAgICAgICAgICAiQzEwMC4xLDEwLjIsOTkuMiw5LjIsOTgsOS4yeiBNNDMuNCw3MmMtMy4zLDAtNi0yLjctNi02czIuNy02LCIgKwogICAgICAgICAgICAiNi02czYsMi43LDYsNlM0Ni43LDcyLDQzLjQsNzJ6IE02Ni4xLDQ5LjVjLTMuMywwLTYtMi43LTYtNiIgKwogICAgICAgICAgICAiYzAtMy4zLDIuNy02LDYtNnM2LDIuNyw2LDZDNzIuMiw0Ni44LDY5LjUsNDkuNSw2Ni4xLDQ5LjV6IiwKCiAgICAgICAgICAgIG1hcDogIk05NS44LDkuMkgxNC4yYy0yLjgsMC01LDIuMi01LDV2NjZjMC4zLTEuNCwwLjctMi44LCIgKwogICAgICAgICAgICAiMS4xLTQuMWwxLjYsMC41Yy0wLjksMi40LTEuNiw0LjgtMi4yLDcuM2wtMC41LTAuMXYxMmMwLDIuOCwyLjIsIiArCiAgICAgICAgICAgICI1LDUsNWg4MS41YzIuOCwwLDUtMi4yLDUtNVYxNC4yQzEwMC44LDExLjUsOTguNSw5LjIsOTUuOCw5LjJ6ICIgKwogICAgICAgICAgICAiTTE2LjUsNjcuNWMtMC40LDAuNS0wLjcsMS0xLDEuNWMtMC4zLDAuNS0wLjYsMS0wLjksMS42bC0xLjktMC45IiArCiAgICAgICAgICAgICJjMC4zLTAuNiwwLjYtMS4yLDAuOS0xLjhjMC4zLTAuNiwwLjYtMS4yLDEtMS43YzAuNy0xLjEsMS41LTIuMiwiICsKICAgICAgICAgICAgIjIuNS0zLjJsMS44LDEuOEMxOCw2NS42LDE3LjIsNjYuNSwxNi41LDY3LjV6IE0yOS43LDY0LjEiICsKICAgICAgICAgICAgImMtMC40LTAuNC0wLjgtMC44LTEuMi0xLjFjLTAuMS0wLjEtMC4yLTAuMS0wLjItMC4xYzAsMC0wLjEsIiArCiAgICAgICAgICAgICIwLTAuMS0wLjFsLTAuMSwwbDAsMGwtMC4xLDBjLTAuMy0wLjEtMC41LTAuMi0wLjgtMC4yYy0wLjUtMC4xIiArCiAgICAgICAgICAgICItMS4xLTAuMi0xLjYtMC4zYy0wLjYsMC0xLjEsMC0xLjYsMGwtMC40LTIuOGMwLjctMC4xLDEuNS0wLjIsMi4yIiArCiAgICAgICAgICAgICItMC4xYzAuNywwLDEuNCwwLjEsMi4yLDAuM2MwLjQsMC4xLDAuNywwLjIsMSwwLjNsMC4xLDBsMCwwbDAuMSwiICsKICAgICAgICAgICAgIjBsMC4xLDBjMC4xLDAsMC4xLDAsMC4zLDAuMWMwLjMsMC4xLDAuNSwwLjIsMC43LDAuNGMwLjcsMC41LCIgKwogICAgICAgICAgICAiMS4yLDAuOSwxLjcsMS40TDI5LjcsNjQuMXogTTM5LjQsNzQuN2MtMS44LTEuOC0zLjYtMy44LTUuMy01LjciICsKICAgICAgICAgICAgImwyLjYtMi40YzAuOSwwLjksMS44LDEuOCwyLjcsMi43YzAuOSwwLjksMS44LDEuNywyLjcsMi42TDM5LjQsIiArCiAgICAgICAgICAgICI3NC43eiBNNTAuOCw4NC4yYy0xLjEtMC43LTIuMi0xLjUtMy4zLTIuM2MtMC41LTAuNC0xLjEtMC44LTEuNiIgKwogICAgICAgICAgICAiLTEuMmMtMC41LTAuNC0xLTAuOC0xLjUtMS4ybDIuNy0zLjRjMC41LDAuNCwxLDAuOCwxLjUsMS4xYzAuNSwiICsKICAgICAgICAgICAgIjAuMywxLDAuNywxLjUsMWMxLDAuNywyLjEsMS4zLDMuMSwxLjlMNTAuOCw4NC4yeiBNNjEuMywiICsKICAgICAgICAgICAgIjg4LjdjLTAuNy0wLjEtMS40LTAuMy0yLjEtMC41Yy0wLjctMC4yLTEuNC0wLjUtMi0wLjdsMS44IiArCiAgICAgICAgICAgICItNC44YzAuNiwwLjIsMS4xLDAuNCwxLjYsMC41YzAuNSwwLjIsMS4xLDAuMywxLjYsMC40YzEsMC4yLDIuMSwiICsKICAgICAgICAgICAgIjAuMiwzLDAuMWwwLjcsNS4xQzY0LjMsODkuMSw2Mi43LDg4LjksNjEuMyw4OC43eiBNNzUuMSw4MC40YyIgKwogICAgICAgICAgICAiLTAuMiwwLjctMC41LDEuNC0wLjksMmMtMC4yLDAuMy0wLjMsMC43LTAuNSwxbC0wLjMsMC41bC0wLjMsIiArCiAgICAgICAgICAgICIwLjRsLTMuOS0yLjhsMC4zLTAuNGwwLjItMC4zYzAuMS0wLjIsMC4zLTAuNCwwLjQtMC43YzAuMy0wLjUsIiArCiAgICAgICAgICAgICIwLjUtMC45LDAuNy0xLjVjMC40LTEsMC44LTIuMSwxLjEtMy4zbDQuMiwwLjlDNzUuOSw3Ny43LDc1LjYsIiArCiAgICAgICAgICAgICI3OSw3NS4xLDgwLjR6IE03Myw2OS4ybDAuMi0xLjlsMC4xLTEuOWMwLjEtMS4yLDAuMS0yLjUsMC4xLSIgKwogICAgICAgICAgICAiMy44bDIuNS0wLjJjMC4yLDEuMywwLjQsMi42LDAuNSwzLjlsMC4xLDJsMC4xLDJMNzMsNjkuMnogIiArCiAgICAgICAgICAgICJNNzMsNTFsMC41LTAuMWMwLjQsMS4zLDAuOCwyLjYsMS4xLDMuOUw3My4yLDU1QzczLjEsNTMuNyw3My4xLCIgKwogICAgICAgICAgICAiNTIuMyw3Myw1MXogTTkxLjksMjAuNGMtMC43LDEuNC0zLjYsMy42LTQuMiwzLjljLTEuNSwwLjgtNSwiICsKICAgICAgICAgICAgIjIuOC0xMC4xLDcuN2MzLDIuOSw1LjgsNS40LDcuMyw2LjRjMi42LDEuOCwzLjQsNC4zLDMuNiw2LjFjMC4xLCIgKwogICAgICAgICAgICAiMS4xLTAuMSwyLjUtMC40LDNjLTAuNSwwLjktMS42LDItMywxLjRjLTItMC44LTExLjUtOS42LTEzLTExYyIgKwogICAgICAgICAgICAiLTMuNSwzLjktNy40LDguOS0xMS43LDE1LjFjMCwwLTMuMSwzLjQtNS4yLDAuOUM1Mi45LDUxLjUsNjEsIiArCiAgICAgICAgICAgICIzOS4zLDYxLDM5LjNzMi4yLTMuMSw1LjYtN2MtMi45LTMtNS45LTYuMy02LjYtNy4zYzAsMC0zLjctNS0xLjMiICsKICAgICAgICAgICAgIi02LjZjMy4yLTIuMSw2LjMsMC44LDYuMywwLjhzMy4xLDMuMyw3LDcuMmM0LjctNC43LDEwLjEtOS4yLCIgKwogICAgICAgICAgICAiMTQuNy0xMGMwLDAsMy4zLTEsNS4yLDEuN0M5Mi41LDE4LjgsOTIuNCwxOS42LDkxLjksMjAuNHoiLAoKICAgICAgICAgICAgY3ljbGVMYWJlbHM6ICJNNzIuNSwzMy45YzAsMC42LTAuMiwxLTAuNSwxSDQwYy0wLjMsMC0wLjUtMC40IiArCiAgICAgICAgICAgICItMC41LTFWMjAuN2MwLTAuNiwwLjItMSwwLjUtMWgzMmMwLjMsMCwwLjUsMC40LDAuNSwxVjMzLjl6ICIgKwogICAgICAgICAgICAiTTQxLjIsNjEuOGMwLTAuNi0wLjItMS0wLjUtMWgtMzJjLTAuMywwLTAuNSwwLjQtMC41LDFWNzVjMCwwLjYsIiArCiAgICAgICAgICAgICIwLjIsMSwwLjUsMWgzMmMwLjMsMCwwLjUtMC40LDAuNS0xVjYxLjh6IE0xMDEuOCw2MS44YzAtMC42LTAuMiIgKwogICAgICAgICAgICAiLTEtMC41LTFoLTMyYy0wLjMsMC0wLjUsMC40LTAuNSwxVjc1YzAsMC42LDAuMiwxLDAuNSwxaDMyYzAuMywiICsKICAgICAgICAgICAgIjAsMC41LTAuNCwwLjUtMVY2MS44eiBNMTcuMiw1Mi45YzAtMC4xLTAuMy03LjEsNC42LTEzLjZsLTIuNC0xLjgiICsKICAgICAgICAgICAgImMtNS40LDcuMy01LjIsMTUuMi01LjEsMTUuNUwxNy4yLDUyLjl6IE0xMi43LDM2LjhsNy40LDIuNWwxLjUsIiArCiAgICAgICAgICAgICI3LjZMMjkuNSwzMUwxMi43LDM2Ljh6IE05NC4yLDQyLjNjLTIuMS04LjktOC4zLTEzLjctOC42LTEzLjlsIiArCiAgICAgICAgICAgICItMS44LDIuNGMwLjEsMCw1LjYsNC4zLDcuNSwxMi4yTDk0LjIsNDIuM3ogTTk5LDM3LjhsLTYuNiw0LjFsIiArCiAgICAgICAgICAgICItNi44LTMuN2w3LjEsMTYuMkw5OSwzNy44eiBNNjksOTAuMmwtMS4yLTIuOGMtMC4xLDAtNi42LDIuOCIgKwogICAgICAgICAgICAiLTE0LjMsMC42bC0wLjgsMi45YzIuNSwwLjcsNC45LDEsNywxQzY1LDkxLjgsNjguNyw5MC4yLDY5LDkwLjJ6ICIgKwogICAgICAgICAgICAiTTU0LjMsOTcuM0w1NCw4OS41bDYuNi00LjFsLTE3LjYtMS43TDU0LjMsOTcuM3oiLAoKICAgICAgICAgICAgb2JsaXF1ZTogIk04MC45LDMwLjJoNC4zbDE1LTE2LjlIMjQuOGwtMTUsMTYuOWgxOXY0OC41aC00bC0xNSwiICsKICAgICAgICAgICAgIjE2LjloNzUuM2wxNS0xNi45SDgwLjlWMzAuMnogTTc4LjYsNzguN0g1Ni4xVjMwLjJoMjIuNVY3OC43eiIgKwogICAgICAgICAgICAiTTc5LjcsMTcuNGMyLjQsMCw0LjMsMS45LDQuMyw0LjNjMCwyLjQtMS45LDQuMy00LjMsNC4zcy00LjMiICsKICAgICAgICAgICAgIi0xLjktNC4zLTQuM0M3NS40LDE5LjMsNzcuNCwxNy40LDc5LjcsMTcuNHogTTU1LDE3LjRjMi40LDAsIiArCiAgICAgICAgICAgICI0LjMsMS45LDQuMyw0LjNjMCwyLjQtMS45LDQuMy00LjMsNC4zcy00LjMtMS45LTQuMy00LjNDNTAuNywiICsKICAgICAgICAgICAgIjE5LjMsNTIuNiwxNy40LDU1LDE3LjR6IE0yNi4xLDIxLjdjMC0yLjQsMS45LTQuMyw0LjMtNC4zYzIuNCwiICsKICAgICAgICAgICAgIjAsNC4zLDEuOSw0LjMsNC4zYzAsMi40LTEuOSw0LjMtNC4zLDQuM0MyOCwyNiwyNi4xLDI0LjEsMjYuMSwiICsKICAgICAgICAgICAgIjIxLjd6IE0zMS4xLDMwLjJoMjIuNnY0OC41SDMxLjFWMzAuMnogTTMwLjMsOTEuNGMtMi40LDAtNC4zIiArCiAgICAgICAgICAgICItMS45LTQuMy00LjNjMC0yLjQsMS45LTQuMyw0LjMtNC4zYzIuNCwwLDQuMywxLjksNC4zLDQuM0MzNC42LCIgKwogICAgICAgICAgICAiODkuNSwzMi43LDkxLjQsMzAuMyw5MS40eiBNNTQuOSw5MS40Yy0yLjQsMC00LjMtMS45LTQuMy00LjNjMCIgKwogICAgICAgICAgICAiLTIuNCwxLjktNC4zLDQuMy00LjNjMi40LDAsNC4zLDEuOSw0LjMsNC4zQzU5LjIsODkuNSw1Ny4zLCIgKwogICAgICAgICAgICAiOTEuNCw1NC45LDkxLjR6IE04NCw4Ny4xYzAsMi40LTEuOSw0LjMtNC4zLDQuM2MtMi40LDAtNC4zLTEuOSIgKwogICAgICAgICAgICAiLTQuMy00LjNjMC0yLjQsMS45LTQuMyw0LjMtNC4zQzgyLjEsODIuOCw4NCw4NC43LDg0LDg3LjF6IiwKCiAgICAgICAgICAgIGZpbHRlcnM6ICJNMjQuOCwxMy4zTDkuOCw0MC41aDc1LjNsMTUuMC0yNy4ySDI0Ljh6IE03Mi44LDMyLjFsLSIgKwogICAgICAgICAgICAiOS43LTguOWwtMTkuMyw4LjlsLTYuMC03LjRMMjQuMSwzMC45bC0xLjItMi43bDE1LjctNy4xbDYuMCw3LjQiICsKICAgICAgICAgICAgImwxOS4wLTguOGw5LjcsOC44bDExLjUtNS42bDEuMywyLjdMNzIuOCwzMi4xek0yNC4zLDY4LjNMOS4zLCIgKwogICAgICAgICAgICAiOTUuNWg3NS4zbDE1LjAtMjcuMkgyNC4zeiBNODQuMyw4NS45TDcwLjcsNzkuOGwtNi4wLDcuNGwtMTkuMyIgKwogICAgICAgICAgICAiLTguOWwtOS43LDguOWwtMTMuMy02LjVsMS4zLTIuN2wxMS41LDUuNmw5LjctOC44bDE5LjAsOC44bDYuMCIgKwogICAgICAgICAgICAiLTcuNGwxNS43LDcuMUw4NC4zLDg1Ljl6IE0xNS4zLDU3aC02di00aDZWNTd6TTg4LjEsNTdINzYuMHYtNGgiICsKICAgICAgICAgICAgIjEyLjFWNTd6IE02OS45LDU3SDU3Ljh2LTRoMTIuMVY1N3ogTTUxLjcsNTdIMzkuNnYtNEg1MS43VjU3eiAiICsKICAgICAgICAgICAgIk0zMy41LDU3SDIxLjR2LTRoMTIuMVY1N3pNMTAwLjIsNTdoLTZ2LTRoNlY1N3oiLAoKICAgICAgICAgICAgcmVzZXRab29tOiAiTTg2LDc5LjhMNjEuNyw1NC4zYzEuOC0yLjksMi44LTYuMywyLjktMTBjMC4zLTExLjIiICsKICAgICAgICAgICAgIi04LjYtMjAuNS0xOS44LTIwLjhDMzMuNywyMy4yLDI0LjMsMzIsMjQuMSw0My4yYy0wLjMsMTEuMiw4LjYsIiArCiAgICAgICAgICAgICIyMC41LDE5LjgsMjAuOGM0LDAuMSw4LjktMC44LDExLjktMy42bDIzLjcsMjVjMS41LDEuNiw0LDIuMywiICsKICAgICAgICAgICAgIjUuMywxbDEuNi0xLjZDODcuNyw4My43LDg3LjUsODEuNCw4Niw3OS44eiBNMzEuNCw0My40YzAuMi03LjEsIiArCiAgICAgICAgICAgICI2LjEtMTIuOCwxMy4yLTEyLjZDNTEuOCwzMSw1Ny41LDM3LDU3LjMsNDQuMWMtMC4yLDcuMS02LjEsMTIuOCIgKwogICAgICAgICAgICAiLTEzLjIsMTIuNkMzNi45LDU2LjUsMzEuMyw1MC42LDMxLjQsNDMuNHpNMjIuNiwxMDRINlY4Ni40YzAiICsKICAgICAgICAgICAgIi0xLjcsMS40LTMuMSwzLjEtMy4xczMuMSwxLjQsMy4xLDMuMXYxMS40aDEwLjRjMS43LDAsMy4xLDEuNCwiICsKICAgICAgICAgICAgIjMuMSwzLjFTMjQuMywxMDQsMjIuNiwxMDR6IE0yNS43LDkuMWMwLDEuNy0xLjQsMy4xLTMuMSwzLjEiICsKICAgICAgICAgICAgIkgxMi4ydjExLjRjMCwxLjctMS40LDMuMS0zLjEsMy4xUzYsMjUuMyw2LDIzLjZWNmgxNi42QzI0LjMsNiwiICsKICAgICAgICAgICAgIjI1LjcsNy40LDI1LjcsOS4xeiBNODQuMywxMDAuOWMwLTEuNywxLjQtMy4xLDMuMS0zLjFoMTAuNFY4Ni40IiArCiAgICAgICAgICAgICJjMC0xLjcsMS40LTMuMSwzLjEtMy4xczMuMSwxLjQsMy4xLDMuMVYxMDRIODcuNEM4NS43LDEwNCw4NC4zLCIgKwogICAgICAgICAgICAiMTAyLjYsODQuMywxMDAuOXogTTg3LjQsNkgxMDR2MTcuNmMwLDEuNy0xLjQsMy4xLTMuMSwzLjFzLTMuMSIgKwogICAgICAgICAgICAiLTEuNC0zLjEtMy4xVjEyLjJIODcuNGMtMS43LDAtMy4xLTEuNC0zLjEtMy4xUzg1LjcsNiw4Ny40LDZ6IiwKCiAgICAgICAgICAgIHJlbGF0ZWRJbnRlbnRzOiAiTTk5LjksNDMuN3YyMi42YzAsMS45LTEuNSwzLjQtMy40LDMuNEg3My45YyIgKwogICAgICAgICAgICAiLTEuOSwwLTMuNC0xLjUtMy40LTMuNFY0My43YzAtMS45LDEuNS0zLjQsMy40LTMuNGgyMi42Qzk4LjQsIiArCiAgICAgICAgICAgICI0MC4zLDk5LjksNDEuOCw5OS45LDQzLjd6IE00OC40LDQ2LjNsNi4yLDYuN2gtNC42TDM4LjUsMzh2OS43IiArCiAgICAgICAgICAgICJsNC43LDUuM0gxMC4xVjU3aDMzLjJsLTQuOCw1LjN2OS41TDQ5LjgsNTdoNS4xdjBsLTYuNSw3djExLjUiICsKICAgICAgICAgICAgIkw2NC4xLDU1TDQ4LjQsMzQuNFY0Ni4zeiIsCgogICAgICAgICAgICBuZXh0SW50ZW50OiAiTTg4LjEsNTUuN0wzNC42LDEzLjFjMCwwLTEuNi0wLjUtMi4xLTAuMmMtMS45LDEuMiIgKwogICAgICAgICAgICAiLTYuNSwxMy44LTMuMSwxNy4yYzcsNi45LDMwLjYsMjQuNSwzMi40LDI1LjljLTEuOCwxLjQtMjUuNCwxOSIgKwogICAgICAgICAgICAiLTMyLjQsMjUuOWMtMy40LDMuNCwxLjIsMTYsMy4xLDE3LjJjMC42LDAuNCwyLjEtMC4yLDIuMS0wLjIiICsKICAgICAgICAgICAgInM1My4xLTQyLjQsNTMuNS00Mi43Qzg4LjUsNTYsODguMSw1NS43LDg4LjEsNTUuN3oiLAoKICAgICAgICAgICAgcHJldkludGVudDogIk0yMi41LDU1LjZMNzYsMTIuOWMwLDAsMS42LTAuNSwyLjItMC4yYzEuOSwxLjIsIiArCiAgICAgICAgICAgICI2LjUsMTMuOCwzLjEsMTcuMmMtNyw2LjktMzAuNiwyNC41LTMyLjQsMjUuOWMxLjgsMS40LDI1LjQsMTksIiArCiAgICAgICAgICAgICIzMi40LDI1LjljMy40LDMuNC0xLjIsMTYtMy4xLDE3LjJjLTAuNiwwLjQtMi4yLTAuMi0yLjItMC4yIiArCiAgICAgICAgICAgICJTMjIuOSw1Ni4zLDIyLjUsNTZDMjIuMiw1NS44LDIyLjUsNTUuNiwyMi41LDU1LjZ6IiwKCiAgICAgICAgICAgIGludGVudFRyYWZmaWM6ICJNMTQuNyw3MS41aC02di0zM2g2VjcxLjV6IE04OC41LDM4LjVINzYuOXYzMyIgKwogICAgICAgICAgICAiaDExLjdWMzguNXogTTcwLjEsMzguNUg1OC40djMzaDExLjdWMzguNXogTTUxLjYsMzguNUgzOS45djMzIiArCiAgICAgICAgICAgICJoMTEuN1YzOC41eiBNMzMuMSwzOC41SDIxLjV2MzNoMTEuN1YzOC41eiBNMTAxLjMsMzguNWgtNnYzM2g2IiArCiAgICAgICAgICAgICJWMzguNXoiLAoKICAgICAgICAgICAgYWxsVHJhZmZpYzogIk0xNS43LDY0LjVoLTd2LTE5aDdWNjQuNXogTTc4LjYsNDUuNUg2Mi45djE5aDE1LjciICsKICAgICAgICAgICAgIlY0NS41eiBNNDcuMSw0NS41SDMxLjR2MTloMTUuN1Y0NS41eiBNMTAxLjMsNDUuNWgtN3YxOWg3VjQ1LjV6IiArCiAgICAgICAgICAgICJNMTQuNywxNC4xaC02djE5aDZWMTQuMXogTTg4LjUsMTQuMUg3Ni45djE5aDExLjdWMTQuMXogTTcwLjEsIiArCiAgICAgICAgICAgICIxNC4xSDU4LjR2MTloMTEuN1YxNC4xeiBNNTEuNiwxNC4xSDM5Ljl2MTloMTEuN1YxNC4xeiBNMzMuMSwxNC4xIiArCiAgICAgICAgICAgICJIMjEuNXYxOWgxMS43VjE0LjF6IE0xMDEuMywxNC4xaC02djE5aDZWMTQuMXogTTE0LjcsNzYuOWgtNnYxOSIgKwogICAgICAgICAgICAiaDZWNzYuOXogTTg4LjUsNzYuOUg3Ni45djE5aDExLjdWNzYuOXogTTcwLjEsNzYuOUg1OC40djE5aDExLjciICsKICAgICAgICAgICAgIlY3Ni45eiBNNTEuNiw3Ni45SDM5Ljl2MTloMTEuN1Y3Ni45eiBNMzMuMSw3Ni45SDIxLjV2MTloMTEuNyIgKwogICAgICAgICAgICAiVjc2Ljl6IE0xMDEuMyw3Ni45aC02djE5aDZWNzYuOXoiLAoKICAgICAgICAgICAgZmxvd3M6ICJNOTMuOCw0Ni4xYy00LjMsMC04LDMtOSw3SDY3Ljl2LTguOGMwLTEuMy0xLjEtMi40LTIuNCIgKwogICAgICAgICAgICAiLTIuNGgtOC4xVjI1LjNjNC0xLDctNC43LDctOS4xYzAtNS4yLTQuMi05LjQtOS40LTkuNGMtNS4yLDAiICsKICAgICAgICAgICAgIi05LjQsNC4yLTkuNCw5LjRjMCw0LjMsMyw4LDcsOXYxNi41SDQ0Yy0xLjMsMC0yLjQsMS4xLTIuNCwyLjQiICsKICAgICAgICAgICAgInY4LjhIMjUuM2MtMS00LjEtNC43LTcuMS05LjEtNy4xYy01LjIsMC05LjQsNC4yLTkuNCw5LjRzNC4yLCIgKwogICAgICAgICAgICAiOS40LDkuNCw5LjRjNC4zLDAsOC0yLjksOS02LjloMTYuNHY3LjljMCwxLjMsMS4xLDIuNCwyLjQsMi40IiArCiAgICAgICAgICAgICJoOC42djE2LjZjLTQsMS4xLTYuOSw0LjctNi45LDljMCw1LjIsNC4yLDkuNCw5LjQsOS40YzUuMiwwLCIgKwogICAgICAgICAgICAiOS40LTQuMiw5LjQtOS40YzAtNC40LTMtOC03LjEtOS4xVjY4LjJoOC4xYzEuMywwLDIuNC0xLjEsMi40IiArCiAgICAgICAgICAgICItMi40di03LjloMTYuOGMxLjEsNCw0LjcsNyw5LDdjNS4yLDAsOS40LTQuMiw5LjQtOS40Uzk5LDQ2LjEsIiArCiAgICAgICAgICAgICI5My44LDQ2LjF6IE00OC43LDE2LjNjMC0zLjUsMi45LTYuNCw2LjQtNi40YzMuNSwwLDYuNCwyLjksNi40LCIgKwogICAgICAgICAgICAiNi40cy0yLjksNi40LTYuNCw2LjRDNTEuNSwyMi42LDQ4LjcsMTkuOCw0OC43LDE2LjN6TTE2LjIsNjEuN2MiICsKICAgICAgICAgICAgIi0zLjUsMC02LjQtMi45LTYuNC02LjRjMC0zLjUsMi45LTYuNCw2LjQtNi40czYuNCwyLjksNi40LDYuNCIgKwogICAgICAgICAgICAiQzIyLjYsNTguOSwxOS43LDYxLjcsMTYuMiw2MS43eiBNNjEuNCw5My43YzAsMy41LTIuOSw2LjQtNi40LCIgKwogICAgICAgICAgICAiNi40Yy0zLjUsMC02LjQtMi45LTYuNC02LjRjMC0zLjUsMi45LTYuNCw2LjQtNi40QzU4LjYsODcuNCwiICsKICAgICAgICAgICAgIjYxLjQsOTAuMiw2MS40LDkzLjd6IE05My44LDYxLjhjLTMuNSwwLTYuNC0yLjktNi40LTYuNGMwLTMuNSwiICsKICAgICAgICAgICAgIjIuOS02LjQsNi40LTYuNHM2LjQsMi45LDYuNCw2LjRDMTAwLjEsNTguOSw5Ny4zLDYxLjgsOTMuOCw2MS44eiIsCgogICAgICAgICAgICBlcU1hc3RlcjogIk0xMDAuMSw0Ni45bC0xMC44LTI1aDAuMmMwLjUsMCwwLjgtMC41LDAuOC0xLjF2LTMuMiIgKwogICAgICAgICAgICAiYzAtMC42LTAuNC0xLjEtMC44LTEuMUg1OS4ydi01LjFjMC0wLjUtMC44LTEtMS43LTFoLTUuMWMtMC45LDAiICsKICAgICAgICAgICAgIi0xLjcsMC40LTEuNywxdjUuMWwtMzAuMiwwYy0wLjUsMC0wLjgsMC41LTAuOCwxLjF2My4yYzAsMC42LCIgKwogICAgICAgICAgICAiMC40LDEuMSwwLjgsMS4xaDAuMWwtMTAuOCwyNUM5LDQ3LjMsOC40LDQ4LDguNCw0OC44djEuNmwwLDBoMCIgKwogICAgICAgICAgICAidjYuNGMwLDEuMywxLjQsMi4zLDMuMiwyLjNoMjEuN2MxLjgsMCwzLjItMSwzLjItMi4zdi04YzAtMC45IiArCiAgICAgICAgICAgICItMC43LTEuNi0xLjctMkwyMi45LDIxLjloMjcuOXY1OS42bC0yOSwxNS45YzAsMS4yLDEuOCwyLjIsNC4xLCIgKwogICAgICAgICAgICAiMi4yaDU4LjNjMi4zLDAsNC4xLTEsNC4xLTIuMmwtMjktMTUuOVYyMS45aDI3LjhMNzUuMiw0Ni44Yy0xLCIgKwogICAgICAgICAgICAiMC40LTEuNywxLjEtMS43LDJ2OGMwLDEuMywxLjQsMi4zLDMuMiwyLjNoMjEuN2MxLjgsMCwzLjItMSwzLjIiICsKIIzc71Z6CAQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwV0AAQAY6hsCoBzbAqAdglSsf9fZqSQ1nPY+xgBAEWvE6AAABAQgKAKNe5wBNpeKM3O9WlQgEAAUbAAAFGwAAaPcoH9LFCAAnrR4TCABFABr3GIFAAEAGd5nAqAdgwKgHNh/1lStnPY+x9mpJDYAYAU6q0AAAAQEICgBNpeIAo17nICAgICAgICAgICAiLTIuM3YtOEMxMDEuNiw0OCwxMDEsNDcuMywxMDAuMSw0Ni45eiBNMjIsMjMuN2wxMC44LDIyLjhIMTIuMSIgKwogICAgICAgICAgICAiTDIyLDIzLjd6IE05Ny45LDQ2LjVINzcuMkw4OCwyMy43TDk3LjksNDYuNXoiCiAgICAgICAgfSwKCiAgICAgICAgYmFkZ2VEYXRhU2V0ID0gewogICAgICAgICAgICBfdmlld2JveDogIjAgMCAxMCAxMCIsCgogICAgICAgICAgICB1aUF0dGFjaGVkOiAiTTIsMi41YS41LC41LDAsMCwxLC41LS41aDVhLjUsLjUsMCwwLDEsLjUsLjV2MyIgKwogICAgICAgICAgICAiYS41LC41LDAsMCwxLS41LC41aC01YS41LC41LDAsMCwxLS41LS41ek0yLjUsMi44YS4zLC4zLDAsMCwxLCIgKwogICAgICAgICAgICAiLjMtLjNoNC40YS4zLC4zLDAsMCwxLC4zLC4zdjIuNGEuMywuMywwLDAsMS0uMywuM2gtNC40IiArCiAgICAgICAgICAgICJhLjMsLjMsMCwwLDEtLjMtLjN6TTIsNi41NWg2bDEsMS40NWgtOHoiLAoKICAgICAgICAgICAgY2hlY2tNYXJrOiAiTTIuNiw0LjVjMCwwLDAuNy0wLjQsMS4yLDAuM2wxLjAsIiArCiAgICAgICAgICAgICIxLjhjMCwwLDIuNy01LjQsMi44LTUuN2MwLDAsMC41LTAuOSwxLjQtMC4xYzAsIiArCiAgICAgICAgICAgICIwLDAuNSwwLjUsMCwxLjNTNi44LDcuMyw1LjYsOS4yYzAsMC0wLjQsIiArCiAgICAgICAgICAgICIwLjUtMS4yLDAuMVMyLjIsNS40LDIuMiw1LjRTMi4yLDQuNywyLjYsNC41eiIsCgogICAgICAgICAgICB4TWFyazogIk05LjAsNy4yQzguMiw2LjksNy40LDYuMSw2LjcsNS4yYzAuNC0wLjUsIiArCiAgICAgICAgICAgICIwLjctMC44LDAuOC0xLjBDNy44LDMuNSw5LjQsMS42LDguMSwxLjEiICsKICAgICAgICAgICAgIkM2LjgsMC42LDYuNiwxLjcsNi42LDEuN0M2LjQsMi4xLDYuMCwyLjcsNS40LCIgKwogICAgICAgICAgICAiMy40QzQuOSwyLjUsNC41LDEuOSw0LjUsMS45IiArCiAgICAgICAgICAgICJTMy44LDAuMiwyLjksMC43QzEuOSwxLjEsMi4zLDIuMywyLjMsMi4zYzAuMywxLjEsMC44LDIuMSwxLjQsMi45IiArCiAgICAgICAgICAgICJDMi41LDYuNCwxLjMsNy40LDEuMyw3LjRTMC44LDcuOCwwLjgsOC4xQzAuOSw4LjMsMC45LDkuNiwyLjQsOS4xIiArCiAgICAgICAgICAgICJDMy4xLDguOCw0LjEsNy45LDUuMSw3LjBjMS4zLDEuMywyLjUsMS45LDIuNSwxLjlzMC41LDAuNSwxLjQtMC4yIiArCiAgICAgICAgICAgICJDOS44LDcuOSw5LjAsNy4yLDkuMCw3LjJ6IiwKCiAgICAgICAgICAgIHRyaWFuZ2xlVXA6ICJNMC41LDYuMmMwLDAsMy44LTMuOCw0LjItNC4yQzUsMS43LDUuMywyLDUuMywybDQuMywiICsKICAgICAgICAgICAgIjQuM2MwLDAsMC40LDAuNC0wLjEsMC40Yy0xLjcsMC04LjIsMC04LjgsMEMwLDYuNiwwLjUsNi4yLDAuNSw2LjJ6IiwKCiAgICAgICAgICAgIHRyaWFuZ2xlRG93bjogIk05LjUsNC4yYzAsMC0zLjgsMy44LTQuMiw0LjJjLTAuMywwLjMtMC41LDAtMC41LCIgKwogICAgICAgICAgICAiMEwwLjUsNC4yYzAsMC0wLjQtMC40LDAuMS0wLjRjMS43LDAsOC4yLDAsOC44LDBDMTAsMy44LDkuNSw0LjIsIiArCiAgICAgICAgICAgICI5LjUsNC4yeiIsCgogICAgICAgICAgICBwbHVzOiAiTTQsMmgydjJoMnYyaC0ydjJoLTJ2LTJoLTJ2LTJoMnoiLAoKICAgICAgICAgICAgbWludXM6ICJNMiw0aDZ2MmgtNnoiLAoKICAgICAgICAgICAgcGxheTogIk0yLjUsMmw1LjUsM2wtNS41LDN6IiwKCiAgICAgICAgICAgIHN0b3A6ICJNMi41LDIuNWg1djVoLTV6IgogICAgICAgIH0sCgogICAgICAgIHNwcml0ZURhdGEgPSB7CiAgICAgICAgICAgIF9jbG91ZDogJzAgMCAxMTAgMTEwJywKICAgICAgICAgICAgY2xvdWQ6ICJNMzcuNiw3OS41Yy02LjksOC43LTIwLjQsOC42LTIyLjItMi43IiArCiAgICAgICAgICAgICJNMTYuMyw0MS4yYy0wLjgtMTMuOSwxOS40LTE5LjIsMjMuNS03LjgiICsKICAgICAgICAgICAgIk0zOC45LDMwLjljNS4xLTkuNCwxNS4xLTguNSwxNi45LTEuMyIgKwogICAgICAgICAgICAiTTU0LjQsMzIuOWM0LTEyLjksMTQuOC05LjYsMTguNi0zLjgiICsKICAgICAgICAgICAgIk05NS44LDU4LjVjMTAtNC4xLDExLjctMTcuOC0wLjktMTkuOCIgKwogICAgICAgICAgICAiTTE4LjEsNzYuNEM1LjYsODAuMywzLjgsNjYsMTMuOCw2MS41IiArCiAgICAgICAgICAgICJNMTYuMiw2Mi40QzIuMSw1OC40LDMuNSwzNiwxNi44LDM2LjYiICsKICAgICAgICAgICAgIk05My42LDc0LjdjMTAuMi0yLDEwLjctMTQsNS44LTE4LjMiICsKICAgICAgICAgICAgIk03MS4xLDc5LjNjMTEuMiw3LjYsMjQuNiw2LjQsMjIuMS0xMS43IiArCiAgICAgICAgICAgICJNMzYuNCw3Ni44YzMuNCwxMy4zLDM1LjQsMTEuNiwzNi4xLTEuNCIgKwogICAgICAgICAgICAiTTcwLjQsMzFjMTEuOC0xMC40LDI2LjItNS4yLDI0LjcsMTAuMSIKICAgICAgICB9OwoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBDb25zdGFudHMKCiAgICB2YXIgbXNnR1MgPSAnR2x5cGhTZXJ2aWNlLicsCiAgICAgICAgcmcgPSAicmVnaXN0ZXJHbHlwaHMoKTogIiwKICAgICAgICByZ3MgPSAicmVnaXN0ZXJHbHlwaFNldCgpOiAiOwoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiB3YXJuKG1zZykgewogICAgICAgICRsb2cud2Fybihtc2dHUyArIG1zZyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkVG9NYXAoa2V5LCB2YWx1ZSwgdmJveCwgb3ZlcndyaXRlLCBkdXBzKSB7CiAgICAgICAgaWYgKCFvdmVyd3JpdGUgJiYgZ2x5cGhzLmdldChrZXkpKSB7CiAgICAgICAgICAgIGR1cHMucHVzaChrZXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdseXBocy5zZXQoa2V5LCB7aWQ6IGtleSwgdmI6IHZib3gsIGQ6IHZhbHVlfSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlcG9ydER1cHMoZHVwcywgd2hpY2gpIHsKICAgICAgICB2YXIgb2sgPSAoZHVwcy5sZW5ndGggPT0gMCksCiAgICAgICAgICAgIG1zZyA9ICdJRCBjb2xsaXNpb246ICc7CgogICAgICAgIGlmICghb2spIHsKICAgICAgICAgICAgZHVwcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgd2Fybih3aGljaCArIG1zZyArICciJyArIGlkICsgJyInKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvazsKICAgIH0KCiAgICBmdW5jdGlvbiByZXBvcnRNaXNzVmIobWlzc2luZywgd2hpY2gpIHsKICAgICAgICB2YXIgb2sgPSAobWlzc2luZy5sZW5ndGggPT0gMCksCiAgICAgICAgICAgIG1zZyA9ICdNaXNzaW5nIHZpZXdib3ggcHJvcGVydHk6ICc7CgogICAgICAgIGlmICghb2spIHsKICAgICAgICAgICAgbWlzc2luZy5mb3JFYWNoKGZ1bmN0aW9uICh2YmspIHsKICAgICAgICAgICAgICAgIHdhcm4od2hpY2ggKyBtc2cgKyAnIicgKyB2YmsgKyAnIicpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9rOwogICAgfQoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBBUEkgZnVuY3Rpb25zID09PQoKICAgIGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICAgIC8vIHN0YXJ0IHdpdGggYSBmcmVzaCBtYXAKICAgICAgICBnbHlwaHMgPSBkMy5tYXAoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbml0KCkgewogICAgICAgIHJlZ2lzdGVyR2x5cGhzKGJpcmREYXRhKTsKICAgICAgICByZWdpc3RlckdseXBoU2V0KGdseXBoRGF0YVNldCk7CiAgICAgICAgcmVnaXN0ZXJHbHlwaFNldChiYWRnZURhdGFTZXQpOwogICAgICAgIHJlZ2lzdGVyR2x5cGhzKHNwcml0ZURhdGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlZ2lzdGVyR2x5cGhzKGRhdGEsIG92ZXJ3cml0ZSkgewogICAgICAgIHZhciBkdXBzID0gW10sCiAgICAgICAgICAgIG1pc3N2YiA9IFtdOwoKICAgICAgICBhbmd1bGFyLmZvckVhY2goZGF0YSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHsKICAgICAgICAgICAgdmFyIHZiayA9ICdfJyArIGtleSwKICAgICAgICAgICAgICAgIHZiID0gZGF0YVt2YmtdOwoKICAgICAgICAgICAgaWYgKGtleVswXSAhPT0gJ18nKSB7CiAgICAgICAgICAgICAgICBpZiAoIXZiKSB7CiAgICAgICAgICAgICAgICAgICAgbWlzc3ZiLnB1c2godmJrKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRUb01hcChrZXksIHZhbHVlLCB2Yiwgb3ZlcndyaXRlLCBkdXBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXBvcnREdXBzKGR1cHMsIHJnKSAmJiByZXBvcnRNaXNzVmIobWlzc3ZiLCByZyk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVnaXN0ZXJHbHlwaFNldChkYXRhLCBvdmVyd3JpdGUpIHsKICAgICAgICB2YXIgZHVwcyA9IFtdLAogICAgICAgICAgICB2YiA9IGRhdGEuX3ZpZXdib3g7CgogICAgICAgIGlmICghdmIpIHsKICAgICAgICAgICAgd2FybihyZ3MgKyAnbm8gIl92aWV3Ym94IiBwcm9wZXJ0eSBmb3VuZCcpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBhbmd1bGFyLmZvckVhY2goZGF0YSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHsKICAgICAgICAgICAgaWYgKGtleVswXSAhPT0gJ18nKSB7CiAgICAgICAgICAgICAgICBhZGRUb01hcChrZXksIHZhbHVlLCB2Yiwgb3ZlcndyaXRlLCBkdXBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXBvcnREdXBzKGR1cHMsIHJncyk7CiAgICB9CgogICAgZnVuY3Rpb24gaWRzKCkgewogICAgICAgIHJldHVybiBnbHlwaHMua2V5cygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdseXBoKGlkKSB7CiAgICAgICAgcmV0dXJuIGdseXBocy5nZXQoaWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdseXBoRGVmaW5lZChpZCkgewogICAgICAgIHJldHVybiBnbHlwaHMuaGFzKGlkKTsKICAgIH0KCiAgICAvLyBOb3RlOiBkZWZzIHNob3VsZCBiZSBhIEQzIHNlbGVjdGlvbiBvZiBhIHNpbmdsZSA8ZGVmcz4gZWxlbWVudAogICAgZnVuY3Rpb24gbG9hZERlZnMoZGVmcywgZ2x5cGhJZHMsIG5vQ2xlYXIpIHsKICAgICAgICB2YXIgbGlzdCA9IGZzLmlzQShnbHlwaElkcykgfHwgaWRzKCksCiAgICAgICAgICAgIGNsZWFyQ2FjaGUgPSAhbm9DbGVhcjsKCiAgICAgICAgaWYgKGNsZWFyQ2FjaGUpIHsKICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBleGlzdGluZyBjb250ZW50CiAgICAgICAgICAgIGRlZnMuaHRtbChudWxsKTsKICAgICAgICB9CgogICAgICAgIC8vIGxvYWQgdXAgdGhlIHJlcXVlc3RlZCBnbHlwaHMKICAgICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgIHZhciBnID0gZ2x5cGgoaWQpOwogICAgICAgICAgICBpZiAoZykgewogICAgICAgICAgICAgICAgaWYgKG5vQ2xlYXIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBxdWljayBleGl0IGlmIHN5bWJvbCBpcyBhbHJlYWR5IHByZXNlbnQKICAgICAgICAgICAgICAgICAgICBpZiAoZGVmcy5zZWxlY3QoJ3N5bWJvbCMnICsgZy5pZCkuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmcy5hcHBlbmQoJ3N5bWJvbCcpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoeyBpZDogZy5pZCwgdmlld0JveDogZy52YiB9KQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKS5hdHRyKCdkJywgZy5kKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8vIHRyYW5zIGNhbiBzcGVjaWZ5IHRyYW5zbGF0aW9uIFt4LHldCiAgICBmdW5jdGlvbiBhZGRHbHlwaChlbGVtLCBnbHlwaElkLCBzaXplLCBvdmVybGF5LCB0cmFucykgewogICAgICAgIHZhciBzeiA9IHNpemUgfHwgNDAsCiAgICAgICAgICAgIG92ciA9ICEhb3ZlcmxheSwKICAgICAgICAgICAgeG5zID0gZnMuaXNBKHRyYW5zKSwKICAgICAgICAgICAgYXRyID0gewogICAgICAgICAgICAgICAgd2lkdGg6IHN6LAogICAgICAgICAgICAgICAgaGVpZ2h0OiBzeiwKICAgICAgICAgICAgICAgICdjbGFzcyc6ICdnbHlwaCcsCiAgICAgICAgICAgICAgICAneGxpbms6aHJlZic6ICcjJyArIGdseXBoSWQKICAgICAgICAgICAgfTsKCiAgICAgICAgaWYgKHhucykgewogICAgICAgICAgICBhdHIudHJhbnNmb3JtID0gc3VzLnRyYW5zbGF0ZSh0cmFucyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbGVtLmFwcGVuZCgndXNlJykuYXR0cihhdHIpLmNsYXNzZWQoJ292ZXJsYXknLCBvdnIpOwogICAgfQoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc1N2ZycpCiAgICAuZmFjdG9yeSgnR2x5cGhTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX3N1c18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBzdXMgPSBfc3VzXzsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjbGVhcjogY2xlYXIsCiAgICAgICAgICAgICCM3O9WyggEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0cFhAAEAGOoXAqAc2wKgHYJUrH/X2akkNZz2qdIAQBMXWDAAAAQEICgCjXucATaXijNzvVgcLBAD6AQAA+gEAAGj3KB/SxQgAJ60eEwgARQAB7BiGQABABpCfwKgHYMCoBzYf9ZUrZz2qdPZqSQ2AGAFOkcUAAAEBCAoATaXjAKNe5w0KMUFGDQogICBpbml0OiBpbml0LAogICAgICAgICAgICAgICAgcmVnaXN0ZXJHbHlwaHM6IHJlZ2lzdGVyR2x5cGhzLAogICAgICAgICAgICAgICAgcmVnaXN0ZXJHbHlwaFNldDogcmVnaXN0ZXJHbHlwaFNldCwKICAgICAgICAgICAgICAgIGlkczogaWRzLAogICAgICAgICAgICAgICAgZ2x5cGg6IGdseXBoLAogICAgICAgICAgICAgICAgZ2x5cGhEZWZpbmVkOiBnbHlwaERlZmluZWQsCiAgICAgICAgICAgICAgICBsb2FkRGVmczogbG9hZERlZnMsCiAgICAgICAgICAgICAgICBhZGRHbHlwaDogYWRkR2x5cGgKICAgICAgICAgICAgfTsKICAgICAgICB9XQogICAgKQogICAgLnJ1bihbJyRsb2cnLCBmdW5jdGlvbiAoJGxvZykgewogICAgICAgICRsb2cuZGVidWcoJ0NsZWFyaW5nIGdseXBoIGNhY2hlJyk7CiAgICAgICAgY2xlYXIoKTsKICAgIH1dKTsKCn0oKSk7Cg0KjNzvVr0LBABHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAORiHQABABpJRwKgHYMCoBzYf9ZUrZz2sLPZqSQ2AGAFOkBIAAAEBCAoATaXjAKNe5zANCg0KjNzvVtILBABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANHBZQABABjqEwKgHNsCoB2CVKx/19mpJDWc9rDGAEATc1DcAAAEBCAoAo17nAE2l44zc71bfDAQAwwIAAMMCAAAIACetHhNo9ygf0sUIAEUAArVwWkAAQAY4AsCoBzbAqAdglSsf9fZqSQ1nPawxgBgE3BSBAAABAQgKAKNe5wBNpeNHRVQgL29ub3MvdWkvYXBwL2Z3L3N2Zy9zdmdVdGlsLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YbEQQAERIAABESAABo9ygf0sUIACetHhMIAEUAEgM3q0AAQAZhY8CoB2DAqAc2H/WVJzlV1lfbkobEgBgBKKHcAAABAQgKAE2l4wCjXudIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxMTNBDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBTVkcgLS0gWm9vbSBTZXJ2aWNlCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciBkZWZhdWx0U2V0dGluZ3MgPSB7CiAgICAgICAgem9vbU1pbjogMC4wNSwKICAgICAgICB6b29tTWF4OiAxMCwKICAgICAgICB6b29tRW5hYmxlZDogZnVuY3Rpb24gKGV2KSB7IHJldHVybiB0cnVlOyB9LAogICAgICAgIHpvb21DYWxsYmFjazogZnVuY3Rpb24gKCkge30KICAgIH07CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcyB0byBzZXJ2aWNlcwogICAgdmFyICRsb2c7CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NTdmcnKQogICAgICAgIC5mYWN0b3J5KCdab29tU2VydmljZScsIFsnJGxvZycsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKCi8qCiAgICAgICAgICAgIE5PVEU6IG9wdHMgaXMgYW4gb2JqZWN0OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdmc6IHN2ZywgICAgICAgICAgICAgICAgICAgICAgIEQzIHNlbGVjdGlvbiBvZiA8c3ZnPiBlbGVtZW50CiAgICAgICAgICAgICAgICB6b29tTGF5ZXI6IHpvb21MYXllciwgICAgICAgICAgIEQzIHNlbGVjdGlvbiBvZiA8Zz4gZWxlbWVudAogICAgICAgICAgICAgICAgem9vbUVuYWJsZWQ6IGZ1bmN0aW9uIChldikgeyAuLi4gfSwKICAgICAgICAgICAgICAgIHpvb21DYWxsYmFjazogZnVuY3Rpb24gKCkgeyAuLi4gfQogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGVyZToKICAgICAgICAgICAgICAgICogc3ZnIGFuZCB6b29tTGF5ZXIgc2hvdWxkIGJlIEQzIHNlbGVjdGlvbnMgb2YgRE9NIGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICAgICogem9vbUxheWVyIDxnPiBpcyBhIGNoaWxkIG9mIDxzdmc+IGVsZW1lbnQuCiAgICAgICAgICAgICAgICAqIHpvb21FbmFibGVkIGlzIGFuIG9wdGlvbmFsIHByZWRpY2F0ZSBiYXNlZCBvbiBEMyBldmVudC4KICAgICAgICAgICAgICAgICAgICAqIGRlZmF1bHQgaXMgYWx3YXlzIGVuYWJsZWQuCiAgICAgICAgICAgICAgICAqIHpvb21DYWxsYmFjayBpcyBhbiBvcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIGVhY2ggdGltZSB3ZSBwYW4vem9vbS4KICAgICAgICAgICAgICAgICAgICAqIGRlZmF1bHQgaXMgZG8gbm90aGluZy4KCiAgICAgICAgICAgIE9wdGlvbmFsbHksIHpvb21NaW4gYW5kIHpvb21NYXggYWxzbyBjYW4gYmUgZGVmaW5lZC4KICAgICAgICAgICAgVGhlc2UgZGVmYXVsdCB0byAwLjI1IGFuZCAxMCByZXNwZWN0aXZlbHkuCiovCiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVpvb21lcihvcHRzKSB7CiAgICAgICAgICAgICAgICB2YXIgY3ogPSAnWm9vbVNlcnZpY2UuY3JlYXRlWm9vbWVyKCk6ICcsCiAgICAgICAgICAgICAgICAgICAgZDNzID0gJyAoRDMgc2VsZWN0aW9uKSBwcm9wZXJ0eSBkZWZpbmVkJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBkZWZhdWx0U2V0dGluZ3MsIG9wdHMpLAogICAgICAgICAgICAgICAgICAgIHpvb20gPSBkMy5iZWhhdmlvci56b29tKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0ZShbMCwgMF0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5zY2FsZSgxKQogICAgICAgICAgICAgICAgICAgICAgICAuc2NhbGVFeHRlbnQoW3NldHRpbmdzLnpvb21NaW4sIHNldHRpbmdzLnpvb21NYXhdKQogICAgICAgICAgICAgICAgICAgICAgICAub24oJ3pvb20nLCB6b29tZWQpLAogICAgICAgICAgICAgICAgICAgIGZhaWwgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB6b29tZXI7CgogICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5zdmcpIHsKICAgICAgICAgICAgICAgICAgICAkbG9nLmVycm9yKGN6ICsgJ05vICJzdmciIChzdmcgdGFnKScgKyBkM3MpOwogICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy56b29tTGF5ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkbG9nLmVycm9yKGN6ICsgJ05vICJ6b29tTGF5ZXIiIChnIHRhZyknICsgZDNzKTsKICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZmFpbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHpvb20gZXZlbnRzIGZyb20gbW91c2UgZ2VzdHVyZXMuLi4KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHpvb21lZCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXYgPSBkMy5ldmVudC5zb3VyY2VFdmVudDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3Muem9vbUVuYWJsZWQoZXYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFpvb21MYXllcihkMy5ldmVudC50cmFuc2xhdGUsIGQzLmV2ZW50LnNjYWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gYWRqdXN0Wm9vbUxheWVyKHRyYW5zbGF0ZSwgc2NhbGUpIHsKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy56b29tTGF5ZXIuYXR0cigndHJhbnNmb3JtJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgdHJhbnNsYXRlICsgJylzY2FsZSgnICsgc2NhbGUgKyAnKScpOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnpvb21DYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHpvb21lciA9IHsKICAgICAgICAgICAgICAgICAgICBwYW5ab29tOiBmdW5jdGlvbiAodHJhbnNsYXRlLCBzY2FsZSkgewogICAgICAgICAgICAgICAgICAgICAgICB6b29tLnRyYW5zbGF0ZSh0cmFuc2xhdGUpLnNjYWxlKHNjYWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Wm9vbUxheWVyKHRyYW5zbGF0ZSwgc2NhbGUpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHpvb21lci5wYW5ab29tKFswLDBdLCAxKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHpvb20udHJhbnNsYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHpvb20uc2NhbGUoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBzY2FsZUV4dGVudDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gem9vbS5zY2FsZUV4dGVudCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gYXBwbHkgdGhlIHpvb20gYmVoYXZpb3IgdG8gdGhlIFNWRyBlbGVtZW50CiAgICAgICAgICAgICAgICBzZXR0aW5ncy5zdmcgJiYgc2V0dGluZ3Muc3ZnLmNhbGwoem9vbSk7CiAgICAgICAgICAgICAgICByZXR1cm4gem9vbWVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgY3JlYXRlWm9vbWVyOiBjcmVhdGVab29tZXIKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cgp9KCkpOwoNCozc71ZKFAQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt+EAAQAZ85cCoBzbAqAdglScf9duShsQ5VegmgBAPM5j3AAABAQgKAKNe6ABNpeOM3O9WShsEAKQlAACkJQAAaPcoH9LFCAAnrR4TCABFACWWGIhAAEAGbPPAqAdgwKgHNh/1lStnPawx9mpLjoAYAVi1bwAAAQEICgBNpeMAo17nSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMjRDRA0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gU1ZHIC0tIFV0aWwgU2VydmljZQogKi8KCi8qCiBUaGUgU1ZHIFV0aWwgU2VydmljZSBwcm92aWRlcyBhIG1pc2NlbGxhbnkgb2YgdXRpbGl0eSBmdW5jdGlvbnMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgZnM7CgogICAgLy8gVE9ETzogY2hhbmdlICdmb3JjZScgcmVmIHRvIGJlICdmb3JjZS5hbHBoYScgcmVmLgogICAgZnVuY3Rpb24gY3JlYXRlRHJhZ0JlaGF2aW9yKGZvcmNlLCBzZWxlY3RDYiwgYXREcmFnRW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdFbmFibGVkLCBjbGlja0VuYWJsZWQpIHsKICAgICAgICB2YXIgZHJhZ2dlZFRocmVzaG9sZCA9IGQzLnNjYWxlLmxpbmVhcigpCiAgICAgICAgICAgIC5kb21haW4oWzAsIDAuMV0pCiAgICAgICAgICAgIC5yYW5nZShbNSwgMjBdKQogICAgICAgICAgICAuY2xhbXAodHJ1ZSksCiAgICAgICAgICAgIGRyYWcsCiAgICAgICAgICAgIGZTZWwgPSBmcy5pc0Yoc2VsZWN0Q2IpLAogICAgICAgICAgICBmRW5kID0gZnMuaXNGKGF0RHJhZ0VuZCksCiAgICAgICAgICAgIGZERW4gPSBmcy5pc0YoZHJhZ0VuYWJsZWQpLAogICAgICAgICAgICBmQ0VuID0gZnMuaXNGKGNsaWNrRW5hYmxlZCksCiAgICAgICAgICAgIGJhZCA9IFtdOwoKICAgICAgICBmdW5jdGlvbiBuYWYod2hhdCkgewogICAgICAgICAgICByZXR1cm4gJ1N2Z1V0aWxTZXJ2aWNlOiBjcmVhdGVEcmFnQmVoYXZpb3IoKTogJyArIHdoYXQgKwogICAgICAgICAgICAgICAgJyBpcyBub3QgYSBmdW5jdGlvbic7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWZvcmNlKSB7CiAgICAgICAgICAgIGJhZC5wdXNoKCdTdmdVdGlsU2VydmljZTogY3JlYXRlRHJhZ0JlaGF2aW9yKCk6ICcgKwogICAgICAgICAgICAgICAgJ0JhZCBmb3JjZSByZWZlcmVuY2UnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFmU2VsKSB7CiAgICAgICAgICAgIGJhZC5wdXNoKG5hZignc2VsZWN0Q2InKSk7CiAgICAgICAgfQogICAgICAgIGlmICghZkVuZCkgewogICAgICAgICAgICBiYWQucHVzaChuYWYoJ2F0RHJhZ0VuZCcpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFmREVuKSB7CiAgICAgICAgICAgIGJhZC5wdXNoKG5hZignZHJhZ0VuYWJsZWQnKSk7CiAgICAgICAgfQogICAgICAgIGlmICghZkNFbikgewogICAgICAgICAgICBiYWQucHVzaChuYWYoJ2NsaWNrRW5hYmxlZCcpKTsKICAgICAgICB9CgogICAgICAgIGlmIChiYWQubGVuZ3RoKSB7CiAgICAgICAgICAgICRsb2cuZXJyb3IoYmFkLmpvaW4oJ1xuJykpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGRyYWdnZWQoZCkgewogICAgICAgICAgICB2YXIgdGhyZXNob2xkID0gZHJhZ2dlZFRocmVzaG9sZChmb3JjZS5hbHBoYSgpKSwKICAgICAgICAgICAgICAgIGR4ID0gZC5vbGRYIC0gZC5weCwKICAgICAgICAgICAgICAgIGR5ID0gZC5vbGRZIC0gZC5weTsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA+PSB0aHJlc2hvbGQgfHwgTWF0aC5hYnMoZHkpID49IHRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgZC5kcmFnZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZC5kcmFnZ2VkOwogICAgICAgIH0KCiAgICAgICAgZHJhZyA9IGQzLmJlaGF2aW9yLmRyYWcoKQogICAgICAgICAgICAub3JpZ2luKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ7IH0pCiAgICAgICAgICAgIC5vbignZHJhZ3N0YXJ0JywgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgaWYgKGNsaWNrRW5hYmxlZCgpIHx8IGRyYWdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICBkMy5ldmVudC5zb3VyY2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICAgICAgZC5vbGRYID0gZC54OwogICAgICAgICAgICAgICAgICAgIGQub2xkWSA9IGQueTsKICAgICAgICAgICAgICAgICAgICBkLmRyYWdnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBkLmZpeGVkIHw9IDI7CiAgICAgICAgICAgICAgICAgICAgZC5kcmFnU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5vbignZHJhZycsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGlmIChkcmFnRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgZC5weCA9IGQzLmV2ZW50Lng7CiAgICAgICAgICAgICAgICAgICAgZC5weSA9IGQzLmV2ZW50Lnk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdnZWQoZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JjZS5hbHBoYSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZS5hbHBoYSguMDI1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgaWYgKGQuZHJhZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBkLmRyYWdTdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkcmFnZ2VkKGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyIHRoaXMgdGhlIHNhbWUgYXMgYSAnY2xpY2snCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChzZWxlY3Rpb24gb2YgYSBub2RlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdENiLmNhbGwodGhpcywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZC5maXhlZCAmPSB+NjsKCiAgICAgICAgICAgICAgICAgICAgLy8gaG9vayBhdCB0aGUgZW5kIG9mIGEgZHJhZyBnZXN0dXJlCiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXREcmFnRW5kLmNhbGwodGhpcywgZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIGRyYWc7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGxvYWRHbG93KGRlZnMsIHIsIGcsIGIsIGlkKSB7CiAgICAgICAgdmFyIGdsb3cgPSBkZWZzLmFwcGVuZCgnZmlsdGVyJykKICAgICAgICAgICAgLmF0dHIoJ3gnLCAnLTUwJScpCiAgICAgICAgICAgIC5hdHRyKCd5JywgJy01MCUnKQogICAgICAgICAgICAuYXR0cignd2lkdGgnLCAnMjAwJScpCiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMjAwJScpCiAgICAgICAgICAgIC5hdHRyKCdpZCcsIGlkKTsKCiAgICAgICAgZ2xvdy5hcHBlbmQoJ2ZlQ29sb3JNYXRyaXgnKQogICAgICAgICAgICAuYXR0cigndHlwZScsICdtYXRyaXgnKQogICAgICAgICAgICAuYXR0cigndmFsdWVzJywKICAgICAgICAgICAgICAgICcwIDAgMCAwICAnICsgciArICcgJyArCiAgICAgICAgICAgICAgICAnMCAwIDAgMCAgJyArIGcgKyAnICcgKwogICAgICAgICAgICAgICAgJzAgMCAwIDAgICcgKyBiICsgJyAnICsKICAgICAgICAgICAgICAgICcwIDAgMCAxICAwICcpOwoKICAgICAgICBnbG93LmFwcGVuZCgnZmVHYXVzc2lhbkJsdXInKQogICAgICAgICAgICAuYXR0cignc3RkRGV2aWF0aW9uJywgMykKICAgICAgICAgICAgLmF0dHIoJ3Jlc3VsdCcsICdjb2xvcmVkQmx1cicpOwoKICAgICAgICBnbG93LmFwcGVuZCgnZmVNZXJnZScpLnNlbGVjdEFsbCgnZmVNZXJnZU5vZGUnKQogICAgICAgICAgICAuZGF0YShbJ2NvbG9yZWRCbHVyJywgJ1NvdXJjZUdyYXBoaWMnXSkKICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCdmZU1lcmdlTm9kZScpCiAgICAgICAgICAgIC5hdHRyKCdpbicsIFN0cmluZyk7CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZEdsb3dEZWZzKGRlZnMpIHsKICAgICAgICBsb2FkR2xvdyhkZWZzLCAwLjAsIDAuMCwgMC43LCAnYmx1ZS1nbG93Jyk7CiAgICAgICAgbG9hZEdsb3coZGVmcywgMS4wLCAxLjAsIDAuMywgJ3llbGxvdy1nbG93Jyk7CiAgICB9CgogICAgLy8gLS0tIE9yZGluYWwgc2NhbGVzIGZvciA3IHZhbHVlcy4KCiAgICAvLyAgICAgICAgICAgICAgIGJsdWUgICAgICAgYnJvd24gICAgICBicmljayByZWQgIHNlYSBncmVlbiAgcHVycGxlICAgICBkYXJrIHRlYWwgIGxpbWUKICAgIHZhciBsaWdodE5vcm0gPSBbJyMzRTU3ODAnLCAnIzc4NTMzQicsICcjQ0I0RDI4JywgJyMwMThENjEnLCAnIzhBMjk3OScsICcjMDA2RDczJywgJyM1NkFGMDAnXSwKICAgICAgICBsaWdodE11dGUgPSBbJyNBOEI4Q0MnLCAnI0NDQjNBOCcsICcjRkZDMkJEJywgJyM5NkQ2QkYnLCAnI0QxOUZDRScsICcjOEZDQ0NBJywgJyNDQUVBQTQnXSwKCiAgICAgICAgZGFya05vcm0gID0gWycjMzA0ODYwJywgJyM2NjQ2MzEnLCAnI0E4MzkxQicsICcjMDA3NTRCJywgJyM3NzIwNkQnLCAnIzAwNTk1OScsICcjNDI4NzAwJ10sCiAgICAgICAgZGFya011dGUgID0gWycjMzA0ODYwJywgJyM2NjQ2MzEnLCAnI0E4MzkxQicsICcjMDA3NTRCJywgJyM3NzIwNkQnLCAnIzAwNTk1OScsICcjNDI4NzAwJ107CgogICAgdmFyIGNvbG9ycz0gewogICAgICAgIGxpZ2h0OiB7CiAgICAgICAgICAgIG5vcm06IGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShsaWdodE5vcm0pLAogICAgICAgICAgICBtdXRlOiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UobGlnaHRNdXRlKQogICAgICAgIH0sCiAgICAgICAgZGFyazogewogICAgICAgICAgICBub3JtOiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZGFya05vcm0pLAogICAgICAgICAgICBtdXRlOiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZGFya011dGUpCiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjYXQ3KCkgewogICAgICAgIHZhciB0Y2lkID0gJ2QzdXRpbFRlc3RDYXJkJzsKCiAgICAgICAgZnVuY3Rpb24gZ2V0Q29sb3IoaWQsIG11dGVkLCB0aGVtZSkgewogICAgICAgICAgICAvLyBOT1RFOiBzaW5jZSB3ZSBhcmUgbGF6aWx5IGFzc2lnbmluZyBkb21haW4gaWRzLCB3ZSBuZWVkIHRvCiAgICAgICAgICAgIC8vICAgICAgIGdldCB0aGUgY29sb3IgZnJvbSBhbGwgNCBzY2FsZXMsIHRvIGtlZXAgdGhlIGRvbWFpbnMKICAgICAgICAgICAgLy8gICAgICAgaW4gc3luYy4KICAgICAgICAgICAgdmFyIGxuID0gY29sb3JzLmxpZ2h0Lm5vcm0oaWQpLAogICAgICAgICAgICAgICAgbG0gPSBjb2xvcnMubGlnaHQubXV0ZShpZCksCiAgICAgICAgICAgICAgICBkbiA9IGNvbG9ycy5kYXJrLm5vcm0oaWQpLAogICAgICAgICAgICAgICAgZG0gPSBjb2xvcnMuZGFyay5tdXRlKGlkKTsKICAgICAgICAgICAgaWYgKHRoZW1lID09PSAnZGFyaycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtdXRlZCA/IGRtIDogZG47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbXV0ZWQgPyBsbSA6IGxuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB0ZXN0Q2FyZChzdmcpIHsKICAgICAgICAgICAgdmFyIGcgPSBzdmcuc2VsZWN0KCdnIycgKyB0Y2lkKSwKICAgICAgICAgICAgICAgIGRvbSA9IGQzLnJhbmdlKDcpLAogICAgICAgICAgICAgICAgaywgbXV0ZWQsIHRoZW1lLCB3aGF0OwoKICAgICAgICAgICAgaWYgKCFnLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgIGcucmVtb3ZlKCk7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZyA9IHN2Zy5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIHRjaWQpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdzY2FsZSg0KXRyYW5zbGF0ZSgyMCwyMCknKTsKCiAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazw0OyBrKyspIHsKICAgICAgICAgICAgICAgICAgICBtdXRlZCA9IGslMjsKICAgICAgICAgICAgICAgICAgICB3aGF0ID0gbXV0ZWQgPyAnIG11dGVkJyA6ICcgbm9ybWFsJzsKICAgICAgICAgICAgICAgICAgICB0aGVtZSA9IGsgPCAyID8gJ2xpZ2h0JyA6ICdkYXJrJzsKICAgICAgICAgICAgICAgICAgICBkb20uZm9yRWFjaChmdW5jdGlvbiAoaWQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBpICogMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gayAqIDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGdldChpZCwgbXV0ZWQsIHRoZW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZy5hcHBlbmQoJ2NpcmNsZScpLmF0dHIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3g6IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeTogeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiBmCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGcuYXBwZW5kKCdyZWN0JykuYXR0cih7CiAgICAgICAgICAgICAgICAgICAgICAgIHg6IDE0MCwKICAgICAgICAgICAgICAgICAgICAgICAgeTogayAqIDIwIC0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDMyLAogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICByeDogMiwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJyM4ODgnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZy5hcHBlbmQoJ3RleHQnKS50ZXh0KHRoZW1lICsgd2hhdCkKICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogMTQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogayAqIDIwICsgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICd3aGl0ZScKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnNHB0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRlc3RDYXJkOiB0ZXN0Q2FyZCwKICAgICAgICAgICAgZ2V0Q29sb3I6IGdldENvbG9yCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeCwgeSkgewogICAgICAgIGlmIChmcy5pc0EoeCkgJiYgeC5sZW5ndGggPT09IDIgJiYgIXkpIHsKICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHhbMF0gKyAnLCcgKyB4WzFdICsgJyknOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgeCArICcsJyArIHkgKyAnKSc7CiAgICB9CgogICAgZnVuY3Rpb24gc2NhbGUoeCwgeSkgewogICAgICAgIHJldHVybiAnc2NhbGUoJyArIHggKyAnLCcgKyB5ICsgJyknOwogICAgfQoKICAgIGZ1bmN0aW9uIHNrZXdYKHgpIHsKICAgICAgICByZXR1cm4gJ3NrZXdYKCcgKyB4ICsgJyknOwogICAgfQoKICAgIGZ1bmN0aW9uIHJvdGF0ZShkZWcpIHsKICAgICAgICByZXR1cm4gJ3JvdGF0ZSgnICsgZGVnICsgJyknOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0cmlwUHgocykgewogICAgICAgIHJldHVybiBzLnJlcGxhY2UoL3B4JC8sJycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNhZmVJZChzKSB7CiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvW15hLXowLTldL2dpLCAnLScpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1ha2VWaXNpYmxlKGVsLCBiKSB7CiAgICAgICAgZWwuc3R5bGUoJ3Zpc2liaWxpdHknLCAoYiA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKSk7CiAgICB9CgogICAgZnVuY3Rpb24gaXNWaXNpYmxlKGVsKSB7CiAgICAgICAgcmV0dXJuIGVsLnN0eWxlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJzsKICAgIH0KCiAgICBmdW5jdGlvbiB2aXNpYmxlKGVsLCB4KSB7CiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlKGVsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYWtlVmlzaWJsZShlbCwgeCk7CiAgICAgICAgfQogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zU3ZnJykKICAgIC5mYWN0b3J5KCdTdmdVdGlsU2VydmljZScsIFsnJGxvZycsICdGblNlcnZpY2UnLAogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNyZWF0ZURyYWdCZWhhdmlvcjogY3JlYXRlRHJhZ0JlaGF2aW9yLAogICAgICAgICAgICAgICAgbG9hZEdsb3dEZWZzOiBsb2FkR2xvd0RlZnMsCiAgICAgICAgICAgICAgICBjYXQ3OiBjYXQ3LAogICAgICAgICAgICAgICAgdHJhbnNsYXRlOiB0cmFuc2xhdGUsCiAgICAgICAgICAgICAgICBzY2FsZTogc2NhbGUsCiAgICAgICAgICAgICAgICBza2V3WDogc2tld1gsCiAgICAgICAgICAgICAgICByb3RhdGU6IHJvdGF0ZSwKICAgICAgICAgICAgICAgIHN0cmlwUHg6IHN0cmlwUHgsCiAgICAgICAgICAgICAgICBzYWZlSWQ6IHNhZmVJZCwKICAgICAgICAgICAgICAgIHZpc2libGU6IHZpc2libGUKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Cg0KjNzvVtgbBABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANHBbQABABjqCwKgHNsCoB2CVKx/19mpLjmc90ZOAEAVuq8EAAAEBCAoAo17oAE2l44zc71bkMwQAgB8AAIAfAABo9ygf0sUIACetHhMIAEUAH3LVCkAAQAa2lMCoB2DAqAc2H/WVIkHAfyVYen9RgBgBY69LAAABAQgKAE2l5ACjXuFIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxRUE5DQovKgogKiBDb3B5cmlnaHQgMjAxNSwyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFNWRyAtLSBJY29uIFNlcnZpY2UKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyICRsb2csIGZzLCBncywgc3VzOwoKICAgIHZhciB2Ym94U2l6ZSA9IDUwLAogICAgICAgIGNvcm5lclNpemUgPSB2Ym94U2l6ZSAvIDEwLAogICAgICAgIHZpZXdCb3ggPSAnMCAwICcgKyB2Ym94U2l6ZSArICcgJyArIHZib3hTaXplOwoKICAgIC8vIE1hcHMgaWNvbiBJRCB0byB0aGUgZ2x5cGggSUQgaXQgdXNlcy4KICAgIC8vIE5PVEU6IGljb24gSUQgbWFwcyB0byBhIENTUyBjbGFzcyBmb3Igc3R5bGluZyB0aGF0IGljb24KICAgIHZhciBnbHlwaE1hcHBpbmcgPSB7CiAgICAgICAgYWN0aXZlOiAnY2hlY2tNYXJrJywKICAgICAgICBpbmFjdGl2ZTogJ3hNYXJrJywKCiAgICAgICAgcGx1czogJ3BsdXMnLAogICAgICAgIG1pbnVzOiAnbWludXMnLAogICAgICAgIHBsYXk6ICdwbGF5JywKICAgICAgICBzdG9wOiAnc3RvcCcsCgogICAgICAgIHRvcG86ICd0b3BvJywKCiAgICAgICAgcmVmcmVzaDogJ3JlZnJlc2gnLAogICAgICAgIGdhcmJhZ2U6ICdnYXJiYWdlJywKCiAgICAgICAgdXBBcnJvdzogJ3RyaWFuZ2xlVXAnLAogICAgICAgIGRvd25BcnJvdzogJ3RyaWFuZ2xlRG93bicsCgogICAgICAgIGFwcEluYWN0aXZlOiAndW5rbm93bicsCgogICAgICAgIGRldkljb25fU1dJVENIOiAnc3dpdGNoJywKICAgICAgICBkZXZJY29uX1JPQURNOiAncm9hZG0nLAogICAgICAgIGRldkljb25fT1ROOiAnb3RuJywKICAgICAgICBkZXZpY2VUYWJsZTogJ3N3aXRjaCcsCiAgICAgICAgZmxvd1RhYmxlOiAnZmxvd1RhYmxlJywKICAgICAgICBwb3J0VGFibGU6ICdwb3J0VGFibGUnLAogICAgICAgIGdyb3VwVGFibGU6ICdncm91cFRhYmxlJywKICAgICAgICBtZXRlclRhYmxlOiAnbWV0ZXJUYWJsZScsCgogICAgICAgIGhvc3RJY29uX2VuZHN0YXRpb246ICdlbmRzdGF0aW9uJywKICAgICAgICBob3N0SWNvbl9yb3V0ZXI6ICdyb3V0ZXInLAogICAgICAgIGhvc3RJY29uX2JncFNwZWFrZXI6ICdiZ3BTcGVha2VyJywKCiAgICAgICAgbmF2X2FwcHM6ICdiaXJkJywKICAgICAgICBuYXZfc2V0dGluZ3M6ICdjaGFpbicsCiAgICAgICAgbmF2X2NsdXN0ZXI6ICdub2RlJywKICAgICAgICBuYXZfdG9wbzogJ3RvcG8nLAogICAgICAgIG5hdl9kZXZzOiAnc3dpdGNoJywKICAgICAgICBuYXZfbGlua3M6ICdwb3J0cycsCiAgICAgICAgbmF2X2hvc3RzOiAnZW5kc3RhdGlvbicsCiAgICAgICAgbmF2X2ludGVudHM6ICdyZWxhdGVkSW50ZW50cycsCiAgICAgICAgbmF2X3Byb2Nlc3NvcnM6ICdhbGxUcmFmZmljJwogICAgfTsKCiAgICBmdW5jdGlvbiBlbnN1cmVJY29uTGliRGVmcygpIHsKICAgICAgICB2YXIgYm9keSA9IGQzLnNlbGVjdCgnYm9keScpLAogICAgICAgICAgICBzdmcgPSBib2R5LnNlbGVjdCgnc3ZnI0ljb25MaWJEZWZzJyksCiAgICAgICAgICAgIGRlZnM7CgogICAgICAgIGlmIChzdmcuZW1wdHkoKSkgewogICAgICAgICAgICBzdmcgPSBib2R5LmFwcGVuZCgnc3ZnJykuYXR0cignaWQnLCAnSWNvbkxpYkRlZnMnKTsKICAgICAgICAgICAgZGVmcyA9IHN2Zy5hcHBlbmQoJ2RlZnMnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN2Zy5zZWxlY3QoJ2RlZnMnKTsKICAgIH0KCiAgICAvLyBkaXYgaXMgYSBEMyBzZWxlY3Rpb24gb2YgdGhlIDxESVY+IGVsZW1lbnQgaW50byB3aGljaCBpY29uIHNob3VsZCBsb2FkCiAgICAvLyBnbHlwaElkIGlkZW50aWZpZXMgdGhlIGdseXBoIHRvIHVzZQogICAgLy8gc2l6ZSBpcyBkaW1lbnNpb24gb2YgaWNvbiBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIDIwLgogICAgLy8gaW5zdGFsbEdseXBoLCBpZiB0cnV0aHksIHdpbGwgY2F1c2UgdGhlIGdseXBoIHRvIGJlIGFkZGVkIHRvCiAgICAvLyAgICAgIHdlbGwta25vd24gZGVmcyBlbGVtZW50LiBEZWZhdWx0cyB0byBmYWxzZS4KICAgIC8vIHN2Z0NsYXNzIGlzIHRoZSBDU1MgY2xhc3MgdXNlZCB0byBpZGVudGlmeSB0aGUgU1ZHIGxheWVyLgogICAgLy8gICAgICBEZWZhdWx0cyB0byAnZW1iZWRkZWRJY29uJy4KICAgIGZ1bmN0aW9uIGxvYWRJY29uKGRpdiwgZ2x5cGhJZCwgc2l6ZSwgaW5zdGFsbEdseXBoLCBzdmdDbGFzcykgewogICAgICAgIHZhciBkaW0gPSBzaXplIHx8IDIwLAogICAgICAgICAgICBzdmdDbHMgPSBzdmdDbGFzcyB8fCAnZW1iZWRkZWRJY29uJywKICAgICAgICAgICAgZ2lkID0gZ2x5cGhJZCB8fCAndW5rbm93bicsCiAgICAgICAgICAgIHN2ZywgZzsKCiAgICAgICAgaWYgKGluc3RhbGxHbHlwaCkgewogICAgICAgICAgICBncy5sb2FkRGVmcyhlbnN1cmVJY29uTGliRGVmcygpLCBbZ2lkXSwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBzdmcgPSBkaXYuYXBwZW5kKCdzdmcnKS5hdHRyKHsKICAgICAgICAgICAgJ2NsYXNzJzogc3ZnQ2xzLAogICAgICAgICAgICB3aWR0aDogZGltLAogICAgICAgICAgICBoZWlnaHQ6IGRpbSwKICAgICAgICAgICAgdmlld0JveDogdmlld0JveAogICAgICAgIH0pOwoKICAgICAgICBnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoewogICAgICAgICAgICAnY2xhc3MnOiAnaWNvbicKICAgICAgICB9KTsKCiAgICAgICAgZy5hcHBlbmQoJ3JlY3QnKS5hdHRyKHsKICAgICAgICAgICAgd2lkdGg6IHZib3hTaXplLAogICAgICAgICAgICBoZWlnaHQ6IHZib3hTaXplLAogICAgICAgICAgICByeDogY29ybmVyU2l6ZQogICAgICAgIH0pOwoKICAgICAgICBnLmFwcGVuZCgndXNlJykuYXR0cih7CiAgICAgICAgICAgIHdpZHRoOiB2Ym94U2l6ZSwKICAgICAgICAgICAgaGVpZ2h0OiB2Ym94U2l6ZSwKICAgICAgICAgICAgJ2NsYXNzJzogJ2dseXBoJywKICAgICAgICAgICAgJ3hsaW5rOmhyZWYnOiAnIycgKyBnaWQKICAgICAgICB9KTsKICAgIH0KCiAgICAvLyBkaXYgaXMgYSBEMyBzZWxlY3Rpb24gb2YgdGhlIDxESVY+IGVsZW1lbnQgaW50byB3aGljaCBpY29uIHNob3VsZCBsb2FkCiAgICAvLyBpY29uQ2xzIGlzIHRoZSBDU1MgY2xhc3MgdXNlZCB0byBpZGVudGlmeSB0aGUgaWNvbgogICAgLy8gc2l6ZSBpcyBkaW1lbnNpb24gb2YgaWNvbiBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIDIwLgogICAgLy8gaW5zdGFsbEdseXBoLCBpZiB0cnV0aHksIHdpbGwgY2F1c2UgdGhlIGdseXBoIHRvIGJlIGFkZGVkIHRvCiAgICAvLyAgICAgIHdlbGwta25vd24gZGVmcyBlbGVtZW50LiBEZWZhdWx0cyB0byBmYWxzZS4KICAgIC8vIHN2Z0NsYXNzIGlzIHRoZSBDU1MgY2xhc3MgdXNlZCB0byBpZGVudGlmeSB0aGUgU1ZHIGxheWVyLgogICAgLy8gICAgICBEZWZhdWx0cyB0byAnZW1iZWRkZWRJY29uJy4KICAgIGZ1bmN0aW9uIGxvYWRJY29uQnlDbGFzcyhkaXYsIGljb25DbHMsIHNpemUsIGluc3RhbGxHbHlwaCwgc3ZnQ2xhc3MpIHsKICAgICAgICBsb2FkSWNvbihkaXYsIGdseXBoTWFwcGluZ1tpY29uQ2xzXSwgc2l6ZSwgaW5zdGFsbEdseXBoLCBzdmdDbGFzcyk7CiAgICAgICAgZGl2LnNlbGVjdCgnc3ZnIGcnKS5jbGFzc2VkKGljb25DbHMsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWRFbWJlZGRlZEljb24oZGl2LCBpY29uQ2xzLCBzaXplKSB7CiAgICAgICAgbG9hZEljb25CeUNsYXNzKGRpdiwgaWNvbkNscywgc2l6ZSwgdHJ1ZSk7CiAgICB9CgoKICAgIC8vIGNvbmZpZ3VyYXRpb24gZm9yIGRldmljZSBhbmQgaG9zdCBpY29ucyBpbiB0aGUgdG9wb2xvZ3kgdmlldwogICAgdmFyIGNvbmZpZyA9IHsKICAgICAgICBkZXZpY2U6IHsKICAgICAgICAgICAgZGltOiAzNiwKICAgICAgICAgICAgcng6IDQKICAgICAgICB9LAogICAgICAgIGhvc3Q6IHsKICAgICAgICAgICAgYmFkZ2U6IHsKICAgICAgICAgICAgICAgIGR4OiAxNCwKICAgICAgICAgICAgICAgIGR5OiAtMTQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmFkaXVzOiB7CiAgICAgICAgICAgICAgICBub0dseXBoOiA5LAogICAgICAgICAgICAgICAgd2l0aEdseXBoOiAxNAogICAgICAgICAgICB9LAogICAgICAgICAgICBnbHlwaGVkOiB7CiAgICAgICAgICAgICAgICBlbmRzdGF0aW9uOiAxLAogICAgICAgICAgICAgICAgYmdwU3BlYWtlcjogMSwKICAgICAgICAgICAgICAgIHJvdXRlcjogMQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCgogICAgLy8gQWRkcyBhIGRldmljZSBpY29uIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgdXNpbmcgdGhlIGdpdmVuIGdseXBoLgogICAgLy8gUmV0dXJucyB0aGUgRDMgc2VsZWN0aW9uIG9mIHRoZSBpY29uLgogICAgZnVuY3Rpb24gYWRkRGV2aWNlSWNvbihlbGVtLCBnbHlwaElkKSB7CiAgICAgICAgdmFyIGNmZyA9IGNvbmZpZy5kZXZpY2UsCiAgICAgICAgICAgIGdpZCA9IGdzLmdseXBoRGVmaW5lZChnbHlwaElkKSA/IGdseXBoSWQgOiAncXVlcnknLAogICAgICAgICAgICBnID0gZWxlbS5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3N2Z0ljb24gZGV2aWNlSWNvbicpOwoKICAgICAgICBnLmFwcGVuZCgncmVjdCcpLmF0dHIoewogICAgICAgICAgICB4OiAwLAogICAgICAgICAgICB5OiAwLAogICAgICAgICAgICByeDogY2ZnLnJ4LAogICAgICAgICAgICB3aWR0aDogY2ZnLmRpbSwKICAgICAgICAgICAgaGVpZ2h0OiBjZmcuZGltCiAgICAgICAgfSk7CgogICAgICAgIGcuYXBwZW5kKCd1c2UnKS5hdHRyKHsKICAgICAgICAgICAgJ3hsaW5rOmhyZWYnOiAnIycgKyBnaWQsCiAgICAgICAgICAgIHdpZHRoOiBjZmcuZGltLAogICAgICAgICAgICBoZWlnaHQ6IGNmZy5kaW0KICAgICAgICB9KTsKCiAgICAgICAgZy5kaW0gPSBjZmcuZGltOwogICAgICAgIHJldHVybiBnOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEhvc3RJY29uKGVsZW0sIHJhZGl1cywgZ2x5cGhJZCkgewogICAgICAgIHZhciBkaW0gPSByYWRpdXMgKiAxLjUsCiAgICAgICAgICAgIHhsYXRlID0gLWRpbSAvIDIsCiAgICAgICAgICAgIGcgPSBlbGVtLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnc3ZnSWNvbiBob3N0SWNvbicpOwoKICAgICAgICBnLmFwcGVuZCgnY2lyY2xlJykuYXR0cigncicsIHJhZGl1cyk7CgogICAgICAgIGcuYXBwZW5kKCd1c2UnKS5hdHRyKHsKICAgICAgICAgICAgJ3hsaW5rOmhyZWYnOiAnIycgKyBnbHlwaElkLAogICAgICAgICAgICB3aWR0aDogZGltLAogICAgICAgICAgICBoZWlnaHQ6IGRpbSwKICAgICAgICAgICAgdHJhbnNmb3JtOiBzdXMudHJhbnNsYXRlKHhsYXRlLHhsYXRlKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBnOwogICAgfQoKICAgIGZ1bmN0aW9uIHNvcnRJY29ucygpIHsKICAgICAgICBmdW5jdGlvbiBfcyhkaXYsIGdpZCkgewogICAgICAgICAgICBkaXYuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7CiAgICAgICAgICAgIGxvYWRFbWJlZGRlZEljb24oZGl2LCBnaWQsIDEwKTsKICAgICAgICAgICAgZGl2LmNsYXNzZWQoJ3RhYmxlQ29sU29ydCcsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYXNjOiBmdW5jdGlvbiAoZGl2KSB7IF9zKGRpdiwgJ3VwQXJyb3cnKTsgfSwKICAgICAgICAgICAgZGVzYzogZnVuY3Rpb24gKGRpdikgeyBfcyhkaXYsICdkb3duQXJyb3cnKTsgfSwKICAgICAgICAgICAgbm9uZTogZnVuY3Rpb24gKGRpdikgeyBkaXYucmVtb3ZlKCk7IH0KICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlZ2lzdGVySWNvbk1hcHBpbmcoaWNvbklkLCBnbHlwaElkKSB7CiAgICAgICAgaWYgKGdseXBoTWFwcGluZ1tpY29uSWRdKSB7CiAgICAgICAgICAgICRsb2cud2FybignSWNvbiB3aXRoIGlkJywgaWNvbklkLCAnYWxyZWFkeSBtYXBwZWQuIElnbm9yaW5nLicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdseXBoTWFwcGluZ1tpY29uSWRdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gPT09IERFRklORSBUSEUgTU9EVUxFCgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NTdmcnKQogICAgICAgIC5kaXJlY3RpdmUoJ2ljb24nLCBbJ0ljb25TZXJ2aWNlJywgZnVuY3Rpb24gKGlzKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICByZXN0cmljdDogJ0EnLAogICAgICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykgewogICAgICAgICAgICAgICAgICAgIGF0dHJzLiRvYnNlcnZlKCdpY29uSWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkMy5zZWxlY3QoZWxlbWVudFswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaXMubG9hZEVtYmVkZGVkSWNvbihkaXYsIGF0dHJzLmljb25JZCwgYXR0cnMuaWNvblNpemUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH1dKQoKICAgICAgICAuZmFjdG9yeSgnSWNvblNlcnZpY2UnLCBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ0dseXBoU2VydmljZScsCiAgICAgICAgICAgICdTdmdVdGlsU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9nc18sIF9zdXNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwogICAgICAgICAgICBzdXMgPSBfc3VzXzsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsb2FkSWNvbjogbG9hZEljb24sCiAgICAgICAgICAgICAgICBsb2FkSWNvbkJ5Q2xhc3M6IGxvYWRJY29uQnlDbGFzcywKICAgICAgICAgICAgICAgIGxvYWRFbWJlZGRlZEljb246IGxvYWRFbWJlZGRlZEljb24sCiAgICAgICAgICAgICAgICBhZGREZXZpY2VJY29uOiBhZGREZXZpY2VJY29uLAogICAgICAgICAgICAgICAgYWRkSG9zdEljb246IGFkZEhvc3RJY29uLAogICAgICAgICAgICAgICAgaWNvbkNvbmZpZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29uZmlnOyB9LAogICAgICAgICAgICAgICAgc29ydEljb25zOiBzb3J0SWNvbnMsCiAgICAgICAgICAgICAgICByZWdpc3Rlckljb25NYXBwaW5nOiByZWdpc3Rlckljb25NYXBwaW5nCiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwoKfSgpKTsKDQqM3O9WUTUEAEIAAABCAAAAaPcoH9LFCAAnrR4TCABFAAA0btZAAEAGPAfAqAdgwKgHNh/1lSxw2BKbBQnEHIAQAQqQDQAAAQEICgBNpeUAo17gjNzvVp41BABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxbQABABm6CwKgHNsCoB2CVIh/1WHp/UUHAnmOAEA0OZwIAAAEBCAoAo17qAE2l5Izc71buNgQARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADnVEEAAQAbVx8CoB2DAqAc2H/WVIkHAnmNYen9RgBgBY5ASAAABAQgKAE2l5QCjXuowDQoNCozc71YJOQQAxQIAAMUCAAAIACetHhNo9ygf0sUIAEUAArc8XEAAQAZr/sCoBzbAqAdglSIf9Vh6f1FBwJ5ogBgNDn+QAAABAQgKAKNe6gBNpeVHRVQgL29ub3MvdWkvYXBwL2Z3L3JlbW90ZS9yZW1vdGUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVqQ7BAD9BgAA/QYAAGj3KB/SxQgAJ60eEwgARQAG727XQABABjVLwKgHYMCoBzYf9ZUscNgSmwUJxByAGAEKlsgAAAEBCAoATaXlAKNe4EhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjYyNw0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNYXN0aGVhZCBNb2R1bGUKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgc2VydmljZXMKICAgIHZhciAkbG9nOwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciBtYXN0SGVpZ2h0ID0gMzYsCiAgICAgICAgcGFkTW9iaWxlID0gMTY7CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NNYXN0JywgWydvbm9zTmF2J10pCiAgICAgICAgLmNvbnRyb2xsZXIoJ01hc3RDdHJsJywgWyckbG9nJywgJ05hdlNlcnZpY2UnLCBmdW5jdGlvbiAoXyRsb2dfLCBucykgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBtYXN0IGNvbnRyb2xsZXIgaGVyZS4uLgogICAgICAgICAgICBzZWxmLnJhZGlvID0gbnVsbDsKCiAgICAgICAgICAgIC8vIGRlbGVnYXRlIHRvIE5hdlNlcnZpY2UKICAgICAgICAgICAgc2VsZi50b2dnbGVOYXYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBucy50b2dnbGVOYXYoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdNYXN0Q3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pCgogICAgICAgIC8vIGFsc28gZGVmaW5lIGEgc2VydmljZSB0byBhbGxvdyBsb29rdXAgb2YgbWFzdCBoZWlnaHQuCiAgICAgICAgLmZhY3RvcnkoJ01hc3RTZXJ2aWNlJywgWydGblNlcnZpY2UnLCBmdW5jdGlvbiAoZnMpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG1hc3RIZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnMuaXNNb2JpbGUoKSA/IG1hc3RIZWlnaHQgKyBwYWRNb2JpbGUgOiBtYXN0SGVpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfV0pOwoKfSgpKTsKDQqM3O9WuTwEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05JFAAEAGxkvAqAc2wKgHYJUsH/UFCcQccNgZVoAQAhzWhAAAAQEICgCjXuoATaXljNzvVrM+BABHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOW7ZQABABjv/wKgHYMCoBzYf9ZUscNgZVgUJxByAGAEKkBIAAAEBCAoATaXmAKNe6jANCg0KjNzvVv1ABADEAgAAxAIAAAgAJ60eE2j3KB/SxQgARQACtuSSQABABsPIwKgHNsCoB2CVLB/1BQnEHHDYGVuAGAIcAWcAAAEBCAoAo17qAE2l5kdFVCAvb25vcy91aS9hcHAvZncvcmVtb3RlL3VybGZuLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YTQQQAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADRu2kAAQAY8A8CoB2DAqAc2H/WVLHDYGVsFCcaegBABFJANAAABAQgKAE2l5gCjXuqM3O9W1EMEAMMDAADDAwAAaPcoH9LFCAAnrR4TCABFAAO11RFAAEAG0krAqAdgwKgHNh/1lSJBwJ5oWHqB1IAYAXOTjgAAAQEICgBNpeYAo17qSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMkVEDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBSZW1vdGUgQ29tbXVuaWNhdGlvbnMgTW9kdWxlCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zUmVtb3RlJywgWydvbm9zVXRpbCddKTsKCn0oKSk7Cg0KjNzvVoRIBABPCAAATwgAAGj3KB/SxQgAJ60eEwgARQAIQW7bQABABjP1wKgHYMCoBzYf9ZUscNgZWwUJxp6AGAEUmBoAAAEBCAoATaXmAKNe6khUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjc3OQ0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUmVtb3RlIC0tIEdlbmVyYWwgUHVycG9zZSBGdW5jdGlvbnMKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIHVpQ29udGV4dCA9ICcvb25vcy91aS8nLAogICAgICAgIHJzU3VmZml4ID0gdWlDb250ZXh0ICsgJ3JzLycsCiAgICAgICAgd3NTdWZmaXggPSB1aUNvbnRleHQgKyAnd2Vic29jay8nOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zUmVtb3RlJykKICAgICAgICAuZmFjdG9yeSgnVXJsRm5TZXJ2aWNlJywgWyckbG9jYXRpb24nLCBmdW5jdGlvbiAoJGxvYykgewoKICAgICAgICAgICAgZnVuY3Rpb24gbWF0Y2hTZWN1cmUocHJvdG9jb2wpIHsKICAgICAgICAgICAgICAgIHZhciBwID0gJGxvYy5wcm90b2NvbCgpLAogICAgICAgICAgICAgICAgICAgIHNlY3VyZSA9IChwID09PSAnaHR0cHMnIHx8IHAgPT09ICd3c3MnKTsKICAgICAgICAgICAgICAgIHJldHVybiBzZWN1cmUgPyBwcm90b2NvbCArICdzJyA6IHByb3RvY29sOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiB1cmxCYXNlKHByb3RvY29sLCBwb3J0LCBob3N0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hTZWN1cmUocHJvdG9jb2wpICsgJzovLycgKwogICAgICAgICAgICAgICAgICAgIChob3N0IHx8ICRsb2MuaG9zdCgpKSArICc6JyArIChwb3J0IHx8ICRsb2MucG9ydCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gaHR0cFByZWZpeChzdWZmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1cmxCYXNlKCdodHRwJykgKyBzdWZmaXg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHdzUHJlZml4KHN1ZmZpeCwgd3Nwb3J0LCBob3N0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdXJsQmFzZSgnd3MnLCB3c3BvcnQsIGhvc3QpICsgc3VmZml4OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiByc1VybChwYXRoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaHR0cFByZWZpeChyc1N1ZmZpeCkgKyBwYXRoOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiB3c1VybChwYXRoLCB3c3BvcnQsIGhvc3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3c1ByZWZpeCh3c1N1ZmZpeCwgd3Nwb3J0LCBob3N0KSArIHBhdGg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICByc1VybDogcnNVcmwsCiAgICAgICAgICAgICAgICB3c1VybDogd3NVcmwKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cgp9KCkpOwoNCozc71bISAQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTkk0AAQAbGScCoBzbAqAdglSwf9QUJxp5w2CFogBACPMvOAAABAQgKAKNe6wBNpeaM3O9WUEkEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5bt1AAEAGO/vAqAdgwKgHNh/1lSxw2CFoBQnGnoAYARSQEgAAAQEICgBNpeYAo17rMA0KDQqM3O9WgkoEAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK15JRAAEAGw8fAqAc2wKgHYJUsH/UFCcaecNghbYAYAjxEzgAAAQEICgCjXusATaXmR0VUIC9vbm9zL3VpL2FwcC9mdy9yZW1vdGUvcmVzdC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WVEsEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5jWJAAEAGHXbAqAdgwKgHNh/1lS2mknhUT9muI4AYAR6QEgAAAQEICgBNpecAo17iMA0KDQqM3O9Wbk0EAMQCAADEAgAACAAnrR4TaPcoH9LFCABFAAK2wbpAAEAG5qDAqAc2wKgHYJUtH/VP2a4jppJ4WYAYAiY5yAAAAQEICgCjXusATaXnR0VUIC9vbm9zL3VpL2FwcC9mdy9yZW1vdGUvd3NvY2suanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVqpUBADCBQAAwgUAAGj3KB/SxQgAJ60eEwgARQAFtI1jQABABhf6wKgHYMCoBzYf9ZUtppJ4WU/ZsKWAGAEolY0AAAEBCAoATaXnAKNe60hUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjRFQw0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUmVtb3RlIC0tIFdlYiBTb2NrZXQgV3JhcHBlciBTZXJ2aWNlCgogVGhpcyBzZXJ2aWNlIHByb3ZpZGVkIHNwZWNpZmljYWxseSBzbyB0aGF0IGl0IGNhbiBiZSBtb2NrZWQgaW4gdW5pdCB0ZXN0cy4KICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NSZW1vdGUnKQogICAgICAgIC5mYWN0b3J5KCdXU29jaycsIFsnJGxvZycsIGZ1bmN0aW9uICgkbG9nKSB7CgogICAgICAgICAgICBmdW5jdGlvbiBuZXdXZWJTb2NrZXQodXJsKSB7CiAgICAgICAgICAgICAgICB2YXIgd3MgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB3cyA9IG5ldyBXZWJTb2NrZXQodXJsKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAkbG9nLmVycm9yKCdVbmFibGUgdG8gY3JlYXRlIHdlYiBzb2NrZXQ6JywgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gd3M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBuZXdXZWJTb2NrZXQ6IG5ld1dlYlNvY2tldAogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKDQqM3O9WvFcEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5jWRAAEAGHXTAqAdgwKgHNh/1lS2mkn3ZT9mwpYAYASiQEgAAAQEICgBNpecAo17rMA0KDQqM3O9WHlgEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wbtAAEAG6SHAqAc2wKgHYJUtH/VP2bClppJ93oAQAj0EwwAAAQEICgCjXuwATaXnjNzvVkVZBADIAgAAyAIAAAgAJ60eE2j3KB/SxQgARQACusG8QABABuaawKgHNsCoB2CVLR/1T9mwpaaSfd6AGAI9Zs4AAAEBCAoAo17sAE2l50dFVCAvb25vcy91aS9hcHAvZncvcmVtb3RlL3dlYnNvY2tldC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9W01wEAIocAACKHAAAaPcoH9LFCAAnrR4TCABFABx8jWVAAEAGATDAqAdgwKgHNh/1lS2mkn3eT9mzK4AQATKsVQAAAQEICgBNpegAo17sSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMjU1Mw0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUmVtb3RlIC0tIFdlYiBTb2NrZXQgU2VydmljZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgJGxvYywgZnMsIHVmcywgd3NvY2ssIHZzLCBsczsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIHdlYlNvY2tPcHRzLCAgICAgICAgICAgIC8vIHdlYiBzb2NrZXQgb3B0aW9ucwogICAgICAgIHdzID0gbnVsbCwgICAgICAgICAgICAgIC8vIHdlYiBzb2NrZXQgcmVmZXJlbmNlCiAgICAgICAgd3NVcCA9IGZhbHNlLCAgICAgICAgICAgLy8gd2ViIHNvY2tldCBpcyBnb29kIHRvIGdvCiAgICAgICAgc2lkID0gMCwgICAgICAgICAgICAgICAgLy8gZXZlbnQgc2VxdWVuY2UgaWRlbnRpZmllcgogICAgICAgIGhhbmRsZXJzID0ge30sICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXIgYmluZGluZ3MKICAgICAgICBwZW5kaW5nRXZlbnRzID0gW10sICAgICAvLyBldmVudHMgVFgnZCB3aGlsZSBzb2NrZXQgbm90IHVwCiAgICAgICAgaG9zdCwgICAgICAgICAgICAgICAgICAgLy8gd2ViIHNvY2tldCBob3N0CiAgICAgICAgdXJsLCAgICAgICAgICAgICAgICAgICAgLy8gd2ViIHNvY2tldCBVUkwKICAgICAgICBjbHVzdGVyTm9kZXMgPSBbXSwgICAgICAvLyBPTk9TIGluc3RhbmNlcyBkYXRhIGZvciBmYWlsb3ZlcgogICAgICAgIGNsdXN0ZXJJbmRleCA9IC0xLCAgICAgIC8vIHRoZSBpbnN0YW5jZSB0byB3aGljaCB3ZSBhcmUgY29ubmVjdGVkCiAgICAgICAgY29ubmVjdFJldHJpZXMgPSAwLCAgICAgLy8gbGltaXQgb3VyIGF0dGVtcHRzIGF0IHJlY29ubmVjdGluZwogICAgICAgIG9wZW5MaXN0ZW5lcnMgPSB7fSwgICAgIC8vIHJlZ2lzdGVyZWQgbGlzdGVuZXJzIGZvciB3ZWJzb2NrZXQgb3BlbigpCiAgICAgICAgbmV4dExpc3RlbmVySWQgPSAxOyAgICAgLy8gaW50ZXJuYWwgSUQgZm9yIG9wZW4gbGlzdGVuZXJzCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vID09PSBCb290c3RyYXAgSGFuZGxlcgoKICAgIHZhciBidWlsdGluSGFuZGxlcnMgPSB7CiAgICAgICAgYm9vdHN0cmFwOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBjbHVzdGVyTm9kZXMgPSBkYXRhLmNsdXN0ZXJOb2RlczsKICAgICAgICAgICAgY2x1c3Rlck5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgIGlmIChkLnVpQXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgICAgICBjbHVzdGVySW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICRsb2cuaW5mbygnQ29ubmVjdGVkIHRvIGNsdXN0ZXIgbm9kZSAnICsgZC5pcCk7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGNvbm5lY3QgaW5mbyB0byBtYXN0aGVhZCBzb21ld2hlcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gPT09IFdlYiBzb2NrZXQgY2FsbGJhY2tzCgogICAgZnVuY3Rpb24gaGFuZGxlT3BlbigpIHsKICAgICAgICAkbG9nLmluZm8oJ1dlYiBzb2NrZXQgb3BlbiAtICcsIHVybCk7CiAgICAgICAgdnMuaGlkZSgpOwoKICAgICAgICBpZiAoZnMuZGVidWdPbigndHhyeCcpKSB7CiAgICAgICAgICAgICRsb2cuZGVidWcoJ1NlbmRpbmcgJyArIHBlbmRpbmdFdmVudHMubGVuZ3RoICsgJyBwZW5kaW5nIGV2ZW50KHMpLi4uJyk7CiAgICAgICAgfQogICAgICAgIHBlbmRpbmdFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXYpIHsKICAgICAgICAgICAgX3NlbmQoZXYpOwogICAgICAgIH0pOwogICAgICAgIHBlbmRpbmdFdmVudHMgPSBbXTsKCiAgICAgICAgY29ubmVjdFJldHJpZXMgPSAwOwogICAgICAgIHdzVXAgPSB0cnVlOwogICAgICAgIGluZm9ybUxpc3RlbmVycyhob3N0LCB1cmwpOwogICAgfQoKICAgIC8vIEhhbmRsZXMgdGhlIHNwZWNpZmllZCAoaW5jb21pbmcpIG1lc3NhZ2UgdXNpbmcgaGFuZGxlciBiaW5kaW5ncy4KICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobXNnRXZlbnQpIHsKICAgICAgICB2YXIgZXYsIGg7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGV2ID0gSlNPTi5wYXJzZShtc2dFdmVudC5kYXRhKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICRsb2cuZXJyb3IoJ01lc3NhZ2UuZGF0YSBpcyBub3QgdmFsaWQgSlNPTicsIG1zZ0V2ZW50LmRhdGEsIGUpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGZzLmRlYnVnT24oJ3R4cngnKSkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCcgPDwgKlJ4KiAnLCBldi5ldmVudCwgZXYucGF5bG9hZCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaCA9IGhhbmRsZXJzW2V2LmV2ZW50XSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaChldi5wYXlsb2FkKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgJGxvZy5lcnJvcignUHJvYmxlbSBoYW5kbGluZyBldmVudDonLCBldiwgZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRsb2cud2FybignVW5oYW5kbGVkIGV2ZW50OicsIGV2KTsKICAgICAgICB9CgogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUNsb3NlKCkgewogICAgICAgIHZhciBnc3VjYzsKCiAgICAgICAgJGxvZy5pbmZvKCdXZWIgc29ja2V0IGNsb3NlZCcpOwogICAgICAgIGxzLnN0b3AoKTsKICAgICAgICB3c1VwID0gZmFsc2U7CgogICAgICAgIGlmIChnc3VjYyA9IGZpbmRHdWlTdWNjZXNzb3IoKSkgewogICAgICAgICAgICBjcmVhdGVXZWJTb2NrZXQod2ViU29ja09wdHMsIGdzdWNjKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBJZiBubyBjb250cm9sbGVycyBsZWZ0IHRvIGNvbnRhY3QsIHNob3cgdGhlIFZlaWwuLi4KICAgICAgICAgICAgdnMuc2hvdyhbCiAgICAgICAgICAgICAgICAnT29wcyEnLAogICAgICAgICAgICAgICAgJ1dlYi1zb2NrZXQgY29ubmVjdGlvbiB0byBzZXJ2ZXIgY2xvc2VkLi4uJywKICAgICAgICAgICAgICAgICdUcnkgcmVmcmVzaGluZyB0aGUgcGFnZS4nCiAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyA9PT0gUHJpdmF0ZSBIZWxwZXIgRnVuY3Rpb25zCgogICAgZnVuY3Rpb24gZmluZEd1aVN1Y2Nlc3NvcigpIHsKICAgICAgICB2YXIgbmNuID0gY2x1c3Rlck5vZGVzLmxlbmd0aCwKICAgICAgICAgICAgaXAsIG5vZGU7CgogICAgICAgIHdoaWxlIChjb25uZWN0UmV0cmllcyA8IG5jbiAmJiAhaXApIHsKICAgICAgICAgICAgY29ubmVjdFJldHJpZXMrKzsKICAgICAgICAgICAgY2x1c3RlckluZGV4ID0gKGNsdXN0ZXJJbmRleCArIDEpICUgbmNuOwogICAgICAgICAgICBub2RlID0gY2x1c3Rlck5vZGVzW2NsdXN0ZXJJbmRleF07CiAgICAgICAgICAgIGlwID0gbm9kZSAmJiBub2RlLmlwOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlwOwogICAgfQoKICAgIGZ1bmN0aW9uIGluZm9ybUxpc3RlbmVycyhob3N0LCB1cmwpIHsKICAgICAgICBhbmd1bGFyLmZvckVhY2gob3Blbkxpc3RlbmVycywgZnVuY3Rpb24gKGxzbnIpIHsKICAgICAgICAgICAgbHNuci5jYihob3N0LCB1cmwpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIF9zZW5kKGV2KSB7CiAgICAgICAgaWYgKGZzLmRlYnVnT24oJ3R4cngnKSkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCcgKlR4KiA+PiAnLCBldi5ldmVudCwgZXYucGF5bG9hZCk7CiAgICAgICAgfQogICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoZXYpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub0hhbmRsZXJzV2FybihoYW5kbGVycywgY2FsbGVyKSB7CiAgICAgICAgaWYgKCFoYW5kbGVycyB8fCBmcy5pc0VtcHR5T2JqZWN0KGhhbmRsZXJzKSkgewogICAgICAgICAgICAkbG9nLndhcm4oJ1dTUy4nICsgY2FsbGVyICsgJygpOiBubyBldmVudCBoYW5kbGVycycpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT0KICAgIC8vID09PSBBUEkgRnVuY3Rpb25zCgogICAgLy8gUmVxdWlyZWQgZm9yIHVuaXQgdGVzdHMgdG8gc2V0IHRvIGtub3duIHN0YXRlCiAgICBmdW5jdGlvbiByZXNldFNpZCgpIHsKICAgICAgICBzaWQgPSAwOwogICAgfQogICAgZnVuY3Rpb24gcmVzZXRTdGF0ZSgpIHsKICAgICAgICB3ZWJTb2NrT3B0cyA9IHVuZGVmaW5lZDsKICAgICAgICB3cyA9IG51bGw7CiAgICAgICAgd3NVcCA9IGZhbHNlOwogICAgICAgIGhvc3QgPSB1bmRlZmluZWQ7CiAgICAgICAgdXJsID0gdW5kZWZpbmVkOwogICAgICAgIHBlbmRpbmdFdmVudHMgPSBbXTsKICAgICAgICBoYW5kbGVycyA9IHt9OwogICAgICAgIHNpZCA9IDA7CiAgICAgICAgY2x1c3Rlck5vZGVzID0gW107CiAgICAgICAgY2x1c3RlckluZGV4ID0gLTE7CiAgICAgICAgY29ubmVjdFJldHJpZXMgPSAwOwogICAgICAgIG9wZW5MaXN0ZW5lcnMgPSB7fTsKICAgICAgICBuZXh0TGlzdGVuZXJJZCA9IDE7CiAgICB9CgogICAgLy8gQ3VycmVudGx5IHN1cHBvcnRlZCBvcHRzOgogICAgLy8gICB3c3BvcnQ6IHdlYiBzb2NrZXQgcG9ydCAob3RoZXIgdGhhbiBkZWZhdWx0IDgxODEpCiAgICAvLyBob3N0OiBpZiBkZWZpbmVkLCBpcyB0aGUgaG9zdCBhZGRyZXNzIHRvIHVzZQogICAgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0KG9wdHMsIF9ob3N0XykgewogICAgICAgIHZhciB3c3BvcnQgPSAob3B0cyAmJiBvcHRzLndzcG9ydCkgfHwgbnVsbDsKCiAgICAgICAgd2ViU29ja09wdHMgPSBvcHRzOyAvLyBwcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjYWxscwoKICAgICAgICBob3N0ID0gX2hvc3RfIHx8ICRsb2MuaG9zdCgpOwogICAgICAgIHVybCA9IHVmcy53c1VybCgnY29yZScsIHdzcG9ydCwgX2hvc3RfKTsKCiAgICAgICAgJGxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBvcGVuIHdlYnNvY2tldCB0bzogJyArIHVybCk7CiAgICAgICAgd3MgPSB3c29jay5uZXdXZWJTb2NrZXQodXJsKTsKICAgICAgICBpZiAod3MpIHsKICAgICAgICAgICAgd3Mub25vcGVuID0gaGFuZGxlT3BlbjsKICAgICAgICAgICAgd3Mub25tZXNzYWdlID0gaGFuZGxlTWVzc2FnZTsKICAgICAgICAgICAgd3Mub25jbG9zZSA9IGhhbmRsZUNsb3NlOwogICAgICAgIH0KICAgICAgICAvLyBOb3RlOiBXc29jayBsb2dzIGFuIGVycm9yIGlmIHRoZSBuZXcgV2ViU29ja2V0IGNhbGwgZmFpbHMKICAgICAgICByZXR1cm4gdXJsOwogICAgfQoKICAgIC8vIEJpbmRzIHRoZSBtZXNzYWdlIGhhbmRsZXJzIHRvIHRoZWlyIG1lc3NhZ2UgdHlwZSAoZXZlbnQgdHlwZSkgYXMKICAgIC8vICBzcGVjaWZpZWQgaW4gdGhlIGdpdmVuIG1hcC4gTm90ZSB0aGF0IGtleXMgYXJlIHRoZSBldmVudCBJRHM7IHZhbHVlcwogICAgLy8gIGFyZSBlaXRoZXI6CiAgICAvLyAgICAgKiB0aGUgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiwgb3IKICAgIC8vICAgICAqIGFuIEFQSSBvYmplY3Qgd2hpY2ggaGFzIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBrZXkKICAgIC8vCiAgICBmdW5jdGlvbiBiaW5kSGFuZGxlcnMoaGFuZGxlck1hcCkgewogICAgICAgIHZhciBtLAogICAgICAgICAgICBkdXBzID0gW107CgogICAgICAgIGlmIChub0hhbmRsZXJzV2FybihoYW5kbGVyTWFwLCAnYmluZEhhbmRsZXJzJykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIG0gPSBkMy5tYXAoaGFuZGxlck1hcCk7CgogICAgICAgIG0uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRJZCwgYXBpKSB7CiAgICAgICAgICAgIHZhciBmbiA9IGZzLmlzRihhcGkpIHx8IGZzLmlzRihhcGlbZXZlbnRJZF0pOwogICAgICAgICAgICBpZiAoIWZuKSB7CiAgICAgICAgICAgICAgICAkbG9nLndhcm4oZXZlbnRJZCArICcgaGFuZGxlciBub3QgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaGFuZGxlcnNbZXZlbnRJZF0pIHsKICAgICAgICAgICAgICAgIGR1cHMucHVzaChldmVudElkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50SWRdID0gZm47CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoZHVwcy5sZW5ndGgpIHsKICAgICAgICAgICAgJGxvZy53YXJuKCdkdXBsaWNhdGUgYmluZGluZ3MgaWdub3JlZDonLCBkdXBzKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gVW5iaW5kcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaGFuZGxlcnMuCiAgICAvLyAgIEV4cGVjdGVkIHRoYXQgdGhlIHNhbWUgbWFwIHdpbGwgYmUgdXNlZCwgYozc71Y1XQQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTBvUAAQAbpH8CoBzbAqAdglS0f9U/ZsyumkpomgBACruWCAAABAQgKAKNe7ABNpeiM3O9WVF0EAOIJAADiCQAAaPcoH9LFCAAnrR4TCABFAAnUjWpAAEAGE9PAqAdgwKgHNh/1lS2mkpomT9mzK4AYATKZrQAAAQEICgBNpegAo17sdXQgd2Ugb25seSBjYXJlIGFib3V0IGtleXMKICAgIGZ1bmN0aW9uIHVuYmluZEhhbmRsZXJzKGhhbmRsZXJNYXApIHsKICAgICAgICB2YXIgbTsKCiAgICAgICAgaWYgKG5vSGFuZGxlcnNXYXJuKGhhbmRsZXJNYXAsICd1bmJpbmRIYW5kbGVycycpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBtID0gZDMubWFwKGhhbmRsZXJNYXApOwoKICAgICAgICBtLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50SWQpIHsKICAgICAgICAgICAgZGVsZXRlIGhhbmRsZXJzW2V2ZW50SWRdOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZE9wZW5MaXN0ZW5lcihjYWxsYmFjaykgewogICAgICAgIHZhciBpZCA9IG5leHRMaXN0ZW5lcklkKyssCiAgICAgICAgICAgIGNiID0gZnMuaXNGKGNhbGxiYWNrKSwKICAgICAgICAgICAgbyA9IHsgaWQ6IGlkLCBjYjogY2IgfTsKCiAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgIG9wZW5MaXN0ZW5lcnNbaWRdID0gbzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbG9nLmVycm9yKCdXU1MuYWRkT3Blbkxpc3RlbmVyKCk6IGNhbGxiYWNrIG5vdCBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgIG8uZXJyb3IgPSAnTm8gY2FsbGJhY2sgZGVmaW5lZCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZU9wZW5MaXN0ZW5lcihsc25yKSB7CiAgICAgICAgdmFyIGlkID0gZnMuaXNPKGxzbnIpICYmIGxzbnIuaWQsCiAgICAgICAgICAgIG87CiAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAkbG9nLndhcm4oJ1dTUy5yZW1vdmVPcGVuTGlzdGVuZXIoKTogaW52YWxpZCBsaXN0ZW5lcicsIGxzbnIpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbyA9IG9wZW5MaXN0ZW5lcnNbaWRdOwoKICAgICAgICBpZiAobykgewogICAgICAgICAgICBkZWxldGUgb3Blbkxpc3RlbmVyc1tpZF07CiAgICAgICAgfQogICAgfQoKICAgIC8vIEZvcm11bGF0ZXMgYW4gZXZlbnQgbWVzc2FnZSBhbmQgc2VuZHMgaXQgdmlhIHRoZSB3ZWItc29ja2V0LgogICAgLy8gIElmIHRoZSB3ZWJzb2NrZXQgaXMgbm90IHVwIHlldCwgd2Ugc3RvcmUgaXQgaW4gYSBwZW5kaW5nIGxpc3QuCiAgICBmdW5jdGlvbiBzZW5kRXZlbnQoZXZUeXBlLCBwYXlsb2FkKSB7CiAgICAgICAgdmFyIGV2ID0gewogICAgICAgICAgICAgICAgZXZlbnQ6IGV2VHlwZSwKICAgICAgICAgICAgICAgIHNpZDogKytzaWQsCiAgICAgICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2FkIHx8IHt9CiAgICAgICAgICAgIH07CgogICAgICAgIGlmICh3c1VwKSB7CiAgICAgICAgICAgIF9zZW5kKGV2KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwZW5kaW5nRXZlbnRzLnB1c2goZXYpOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gPT09PT0gRGVmaW5pdGlvbiBvZiBtb2R1bGUKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zUmVtb3RlJykKICAgIC5mYWN0b3J5KCdXZWJTb2NrZXRTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJGxvY2F0aW9uJywgJ0ZuU2VydmljZScsICdVcmxGblNlcnZpY2UnLCAnV1NvY2snLAogICAgICAgICAgICAnVmVpbFNlcnZpY2UnLCAnTG9hZGluZ1NlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJGxvY18sIF9mc18sIF91ZnNfLCBfd3NvY2tfLCBfdnNfLCBfbHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRsb2MgPSBfJGxvY187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgdWZzID0gX3Vmc187CiAgICAgICAgICAgIHdzb2NrID0gX3dzb2NrXzsKICAgICAgICAgICAgdnMgPSBfdnNfOwogICAgICAgICAgICBscyA9IF9sc187CgogICAgICAgICAgICBiaW5kSGFuZGxlcnMoYnVpbHRpbkhhbmRsZXJzKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICByZXNldFNpZDogcmVzZXRTaWQsCiAgICAgICAgICAgICAgICByZXNldFN0YXRlOiByZXNldFN0YXRlLAogICAgICAgICAgICAgICAgY3JlYXRlV2ViU29ja2V0OiBjcmVhdGVXZWJTb2NrZXQsCiAgICAgICAgICAgICAgICBiaW5kSGFuZGxlcnM6IGJpbmRIYW5kbGVycywKICAgICAgICAgICAgICAgIHVuYmluZEhhbmRsZXJzOiB1bmJpbmRIYW5kbGVycywKICAgICAgICAgICAgICAgIGFkZE9wZW5MaXN0ZW5lcjogYWRkT3Blbkxpc3RlbmVyLAogICAgICAgICAgICAgICAgcmVtb3ZlT3Blbkxpc3RlbmVyOiByZW1vdmVPcGVuTGlzdGVuZXIsCiAgICAgICAgICAgICAgICBzZW5kRXZlbnQ6IHNlbmRFdmVudCwKICAgICAgICAgICAgICAgIGlzQ29ubmVjdGVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiB3c1VwOyB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgXSk7Cgp9KCkpOwoNCozc71aTXQQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTBvkAAQAbpHsCoBzbAqAdglS0f9U/ZsyumkqPGgBAC1Nu8AAABAQgKAKNe7ABNpeiM3O9WSF4EAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5jWxAAEAGHWzAqAdgwKgHNh/1lS2mkqPGT9mzK4AYATKQEgAAAQEICgBNpegAo17sMA0KDQqM3O9Wpl8EAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5GI9AAEAGkknAqAdgwKgHNh/1lStnPdGT9mpLjoAYAViQEgAAAQEICgBNpegAo17oMA0KDQqM3O9W4mAEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA51RJAAEAG1cXAqAdgwKgHNh/1lSJBwKHpWHqB1IAYAXOQEgAAAQEICgBNpegAo17qMA0KDQqM3O9W7mEEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA57e9AAEAGvOjAqAdgwKgHNh/1lSqTpqYFxujypoAYAQmQEgAAAQEICgBNpegAo17mMA0KDQqM3O9Wb2IEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PF1AAEAGboDAqAc2wKgHYJUiH/VYeoHUQcCh7oAQDQ5g7wAAAQEICgCjXu0ATaXmjNzvVvpiBABHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOTevQABABnMpwKgHYMCoBzYf9ZUnOVXoJtuShsSAGAEokBIAAAEBCAoATaXoAKNe6DANCg0KjNzvVp9nBADFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACt8G/QABABuaawKgHNsCoB2CVLR/1T9mzK6aSo8uAGALU/FIAAAEBCAoAo17tAE2l6EdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3dpZGdldC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WuGcEAMQCAADEAgAACAAnrR4TaPcoH9LFCABFAAK2cFxAAEAGN//AqAc2wKgHYJUrH/X2akuOZz3RmIAYBXH0oAAAAQEICgCjXu0ATaXoR0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvdGFibGUuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVudnBADGAgAAxgIAAAgAJ60eE2j3KB/SxQgARQACuDxeQABABmv7wKgHNsCoB2CVIh/1WHqB1EHAoe6AGA0OOmIAAAEBCAoAo17tAE2l5kdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3Rvb2xiYXIuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVpNoBADGAgAAxgIAAAgAJ60eE2j3KB/SxQgARQACuLfkQABABvB0wKgHNsCoB2CVKh/1xujyppOmpgqAGAJlB64AAAEBCAoAo17tAE2l6EdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3Rvb2x0aXAuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVqBoBADFAgAAxQIAAAgAJ60eE2j3KB/SxQgARQACty35QABABnphwKgHNsCoB2CVJx/125KGxDlV6CuAGA8zpn8AAAEBCAoAo17tAE2l6EdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L2J1dHRvbi5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9W8XwEAEwkAABMJAAAaPcoH9LFCAAnrR4TCABFACQ+GJBAAEAGbkPAqAdgwKgHNh/1lStnPdGY9mpOEIAYAWK0FwAAAQEICgBNpeoAo17tSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMjM3NQ0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gV2lkZ2V0IC0tIFRhYmxlIFNlcnZpY2UKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICR3aW5kb3csIGZzLCBtYXN0LCBpczsKCiAgICAvLyBjb25zdGFudHMKICAgIHZhciB0YWJsZUljb25UZFNpemUgPSAzMywKICAgICAgICBwZGcgPSAyMiwKICAgICAgICBmbGFzaFRpbWUgPSAxNTAwLAogICAgICAgIGNvbFdpZHRoID0gJ2NvbC13aWR0aCcsCiAgICAgICAgdGFibGVJY29uID0gJ3RhYmxlLWljb24nOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgY3N0bVdpZHRocyA9IHt9LAogICAgICAgIGFwaTsKCiAgICAvLyBGdW5jdGlvbnMgZm9yIHJlc2l6aW5nIGEgdGFidWxhciB2aWV3IHRvIHRoZSB3aW5kb3cKCiAgICBmdW5jdGlvbiBfd2lkdGgoZWxlbSwgd2lkdGgpIHsKICAgICAgICBlbGVtLnN0eWxlKCd3aWR0aCcsIHdpZHRoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kQ3N0bVdpZHRocyh0YWJsZSkgewogICAgICAgIHZhciBoZWFkZXJzID0gdGFibGUuc2VsZWN0KCcudGFibGUtaGVhZGVyJykuc2VsZWN0QWxsKCd0ZCcpOwoKICAgICAgICBoZWFkZXJzLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgdmFyIGggPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICBpbmRleCA9IGkudG9TdHJpbmcoKTsKICAgICAgICAgICAgaWYgKGguY2xhc3NlZCh0YWJsZUljb24pKSB7CiAgICAgICAgICAgICAgICBjc3RtV2lkdGhzW2luZGV4XSA9IHRhYmxlSWNvblRkU2l6ZSArICdweCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGguYXR0cihjb2xXaWR0aCkpIHsKICAgICAgICAgICAgICAgIGNzdG1XaWR0aHNbaW5kZXhdID0gaC5hdHRyKGNvbFdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmIChmcy5kZWJ1Z09uKCd3aWRnZXQnKSkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCdIZWFkZXJzIHdpdGggY3VzdG9tIHdpZHRoczogJywgY3N0bVdpZHRocyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldFRkV2lkdGhzKGVsZW0sIHdpZHRoKSB7CiAgICAgICAgdmFyIHRkcyA9IGVsZW0uc2VsZWN0KCd0cjpmaXJzdC1jaGlsZCcpLnNlbGVjdEFsbCgndGQnKTsKICAgICAgICBfd2lkdGgoZWxlbSwgd2lkdGggKyAncHgnKTsKCiAgICAgICAgdGRzLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgdmFyIHRkID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgaW5kZXggPSBpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmIChjc3RtV2lkdGhzLmhhc093blByb3BlcnR5KGluZGV4KSkgewogICAgICAgICAgICAgICAgX3dpZHRoKHRkLCBjc3RtV2lkdGhzW2luZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRIZWlnaHQodGhlYWQsIGJvZHksIGhlaWdodCkgewogICAgICAgIHZhciBoID0gaGVpZ2h0IC0gKG1hc3QubWFzdEhlaWdodCgpICsKICAgICAgICAgICAgZnMubm9QeFN0eWxlKGQzLnNlbGVjdCgnLnRhYnVsYXItaGVhZGVyJyksICdoZWlnaHQnKSArCiAgICAgICAgICAgIGZzLm5vUHhTdHlsZSh0aGVhZCwgJ2hlaWdodCcpICsgcGRnKTsKICAgICAgICBib2R5LnN0eWxlKCdoZWlnaHQnLCBoICsgJ3B4Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRqdXN0VGFibGUoaGF2ZUl0ZW1zLCB0YWJsZUVsZW1zLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgaWYgKGhhdmVJdGVtcykgewogICAgICAgICAgICBzZXRUZFdpZHRocyh0YWJsZUVsZW1zLnRoZWFkLCB3aWR0aCk7CiAgICAgICAgICAgIHNldFRkV2lkdGhzKHRhYmxlRWxlbXMudGJvZHksIHdpZHRoKTsKICAgICAgICAgICAgc2V0SGVpZ2h0KHRhYmxlRWxlbXMudGhlYWQsIHRhYmxlRWxlbXMudGFibGUuc2VsZWN0KCcudGFibGUtYm9keScpLCBoZWlnaHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldFRkV2lkdGhzKHRhYmxlRWxlbXMudGhlYWQsIHdpZHRoKTsKICAgICAgICAgICAgX3dpZHRoKHRhYmxlRWxlbXMudGJvZHksIHdpZHRoICsgJ3B4Jyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIHNvcnQgY29sdW1ucyBzdGF0ZSBtb2RlbCBhbmQgZnVuY3Rpb25zCiAgICB2YXIgc29ydFN0YXRlID0gewogICAgICAgIHM6IHsKICAgICAgICAgICAgZmlyc3Q6IG51bGwsCiAgICAgICAgICAgIHNlY29uZDogbnVsbCwKICAgICAgICAgICAgdG91Y2hlZDogbnVsbAogICAgICAgIH0sCgogICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzID0gc29ydFN0YXRlLnM7CiAgICAgICAgICAgIHMuZmlyc3QgJiYgYXBpLm5vbmUocy5maXJzdC5hZGl2KTsKICAgICAgICAgICAgcy5zZWNvbmQgJiYgYXBpLm5vbmUocy5zZWNvbmQuYWRpdik7CiAgICAgICAgICAgIHNvcnRTdGF0ZS5zID0geyBmaXJzdDogbnVsbCwgc2Vjb25kOiBudWxsLCB0b3VjaGVkOiBudWxsIH07CiAgICAgICAgfSwKCiAgICAgICAgdG91Y2g6IGZ1bmN0aW9uIChpZCwgYWRpdikgewogICAgICAgICAgICB2YXIgcyA9IHNvcnRTdGF0ZS5zLAogICAgICAgICAgICAgICAgczEgPSBzLmZpcnN0LAogICAgICAgICAgICAgICAgZDsKCiAgICAgICAgICAgIGlmICghcy50b3VjaGVkKSB7CiAgICAgICAgICAgICAgICBzLmZpcnN0ID0geyBpZDogaWQsIGRpcjogJ2FzYycsIGFkaXY6IGFkaXYgfTsKICAgICAgICAgICAgICAgIHMudG91Y2hlZCA9IGlkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGlkID09PSBzLnRvdWNoZWQpIHsKICAgICAgICAgICAgICAgICAgICBkID0gczEuZGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnOwogICAgICAgICAgICAgICAgICAgIHMxLmRpciA9IGQ7CiAgICAgICAgICAgICAgICAgICAgczEuYWRpdiA9IGFkaXY7CgogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzLnNlY29uZCA9IHMuZmlyc3Q7CiAgICAgICAgICAgICAgICAgICAgcy5maXJzdCA9IHsgaWQ6IGlkLCBkaXI6ICdhc2MnLCBhZGl2OiBhZGl2IH07CiAgICAgICAgICAgICAgICAgICAgcy50b3VjaGVkID0gaWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHMgPSBzb3J0U3RhdGUucywKICAgICAgICAgICAgICAgIHMxID0gcy5maXJzdCwKICAgICAgICAgICAgICAgIHMyID0gcy5zZWNvbmQ7CiAgICAgICAgICAgIGFwaVtzMS5kaXJdKHMxLmFkaXYpOwogICAgICAgICAgICBzMiAmJiBhcGkubm9uZShzMi5hZGl2KTsKICAgICAgICB9CiAgICB9OwoKICAgIC8vIEZ1bmN0aW9ucyBmb3Igc29ydGluZyB0YWJsZSByb3dzIGJ5IGhlYWRlcgoKICAgIGZ1bmN0aW9uIHVwZGF0ZVNvcnREaXJlY3Rpb24odGhFbGVtKSB7CiAgICAgICAgdmFyIGFkaXYgPSB0aEVsZW0uc2VsZWN0KCdkaXYnKSwKICAgICAgICAgICAgaWQgPSB0aEVsZW0uYXR0cignY29sSWQnKTsKCiAgICAgICAgYXBpLm5vbmUoYWRpdik7CiAgICAgICAgYWRpdiA9IHRoRWxlbS5hcHBlbmQoJ2RpdicpOwogICAgICAgIHNvcnRTdGF0ZS50b3VjaChpZCwgYWRpdik7CiAgICAgICAgc29ydFN0YXRlLnVwZGF0ZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNvcnRSZXF1ZXN0UGFyYW1zKCkgewogICAgICAgIHZhciBzID0gc29ydFN0YXRlLnMsCiAgICAgICAgICAgIHMxID0gcy5maXJzdCwKICAgICAgICAgICAgczIgPSBzLnNlY29uZCwKICAgICAgICAgICAgaWQyID0gczIgJiYgczIuaWQsCiAgICAgICAgICAgIGRpcjIgPSBzMiAmJiBzMi5kaXI7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZmlyc3RDb2w6IHMxLmlkLAogICAgICAgICAgICBmaXJzdERpcjogczEuZGlyLAogICAgICAgICAgICBzZWNvbmRDb2w6IGlkMiwKICAgICAgICAgICAgc2Vjb25kRGlyOiBkaXIyCiAgICAgICAgfTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc1dpZGdldCcpCiAgICAuZGlyZWN0aXZlKCdvbm9zVGFibGVSZXNpemUnLCBbJyRsb2cnLCckd2luZG93JywgJ0ZuU2VydmljZScsICdNYXN0U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kd2luZG93XywgX2ZzXywgX21hc3RfKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCkgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkd2luZG93ID0gXyR3aW5kb3dfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIG1hc3QgPSBfbWFzdF87CgogICAgICAgICAgICB2YXIgdGFibGUgPSBkMy5zZWxlY3QoZWxlbWVudFswXSksCiAgICAgICAgICAgICAgICB0YWJsZUVsZW1zID0gewogICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZSwKICAgICAgICAgICAgICAgICAgICB0aGVhZDogdGFibGUuc2VsZWN0KCcudGFibGUtaGVhZGVyJykuc2VsZWN0KCd0YWJsZScpLAogICAgICAgICAgICAgICAgICAgIHRib2R5OiB0YWJsZS5zZWxlY3QoJy50YWJsZS1ib2R5Jykuc2VsZWN0KCd0YWJsZScpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgd3N6OwoKICAgICAgICAgICAgZmluZENzdG1XaWR0aHModGFibGUpOwoKICAgICAgICAgICAgLy8gYWRqdXN0IHRhYmxlIG9uIHdpbmRvdyByZXNpemUKICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGg6ICR3aW5kb3cuaW5uZXJIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgdzogJHdpbmRvdy5pbm5lcldpZHRoCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB3c3ogPSBmcy53aW5kb3dTaXplKDAsIDMwKTsKICAgICAgICAgICAgICAgIGFkanVzdFRhYmxlKAogICAgICAgICAgICAgICAgICAgIHNjb3BlLnRhYmxlRGF0YS5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgdGFibGVFbGVtcywKICAgICAgICAgICAgICAgICAgICB3c3oud2lkdGgsIHdzei5oZWlnaHQKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWRqdXN0IHRhYmxlIHdoZW4gZGF0YSBjaGFuZ2VzCiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ3RhYmxlRGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGFkanVzdFRhYmxlKAogICAgICAgICAgICAgICAgICAgIHNjb3BlLnRhYmxlRGF0YS5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgdGFibGVFbGVtcywKICAgICAgICAgICAgICAgICAgICB3c3oud2lkdGgsIHdzei5oZWlnaHQKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGNzdG1XaWR0aHMgPSB7fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgIH1dKQoKICAgIC5kaXJlY3RpdmUoJ29ub3NTb3J0YWJsZUhlYWRlcicsIFsnJGxvZycsICdJY29uU2VydmljZScsCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2lzXykgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgaXMgPSBfaXNfOwogICAgICAgICAgICB2YXIgaGVhZGVyID0gZDMuc2VsZWN0KGVsZW1lbnRbMF0pOwoKICAgICAgICAgICAgYXBpID0gaXMuc29ydEljb25zKCk7CgogICAgICAgICAgICBoZWFkZXIuc2VsZWN0QWxsKCd0ZCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBjb2wgPSBkMy5zZWxlY3QodGhpcyk7CgogICAgICAgICAgICAgICAgaWYgKGNvbC5hdHRyKCdzb3J0YWJsZScpID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNvcnREaXJlY3Rpb24oY29sKTsKICAgICAgICAgICAgICAgICAgICBzY29wZS5zb3J0UGFyYW1zID0gc29ydFJlcXVlc3RQYXJhbXMoKTsKICAgICAgICAgICAgICAgICAgICBzY29wZS5zb3J0Q2FsbGJhY2soc2NvcGUuc29ydFBhcmFtcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHNvcnRTdGF0ZS5yZXNldCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgfV0pCgogICAgLmRpcmVjdGl2ZSgnb25vc0ZsYXNoQ2hhbmdlcycsCiAgICAgICAgWyckbG9nJywgJyRwYXJzZScsICckdGltZW91dCcsICdGblNlcnZpY2UnLAogICAgICAgIGZ1bmN0aW9uICgkbG9nLCAkcGFyc2UsICR0aW1lb3V0LCBmcykgewoKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykgewogICAgICAgICAgICB2YXIgaWRQcm9wID0gYXR0cnMuaWRQcm9wLAogICAgICAgICAgICAgICAgdGFibGUgPSBkMy5zZWxlY3QoZWxlbWVudFswXSksCiAgICAgICAgICAgICAgICB0cnMsIHByb21pc2U7CgogICAgICAgICAgICBmdW5jdGlvbiBoaWdobGlnaHRSb3dzKCkgewogICAgICAgICAgICAgICAgdmFyIGNoYW5nZWRSb3dzID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjbGFzc1Jvd3MoYikgewogICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkUm93cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGNoYW5nZWRSb3dzLCBmdW5jdGlvbiAodHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLmNsYXNzZWQoJ2RhdGEtY2hhbmdlJywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQgYmVjYXVzZSAncm93LWlkJyB3YXMgdGhlIHVuLWludGVycG9sYXRlZCB2YWx1ZQogICAgICAgICAgICAgICAgLy8gInt7bGluay5vbmV9fSIgZm9yIGV4YW1wbGUsIGluc3RlYWQgb2YgbGluay5vbmUgZXZhbHVhdGVkCiAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IGV4ZWN1dGVzIG9uIHRoZSBuZXh0IGRpZ2VzdCAtLSBhZnRlciBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnRhYmxlRGF0YS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJzID0gdGFibGUuc2VsZWN0QWxsKCd0cicpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHRycyAmJiAhdHJzLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyID0gZDMuc2VsZWN0KHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZzLmZpbmQodHIuYXR0cigncm93LWlkJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmNoYW5nZWREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFByb3ApID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUm93cy5wdXNoKHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzUm93cyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9ICR0aW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzUm93cyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZsYXNoVGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRycyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGl0ZW1zIGFkZGVkOgogICAgICAgICAgICBzY29wZS4kb24oJ25nUmVwZWF0Q29tcGxldGUnLCBoaWdobGlnaHRSb3dzKTsKICAgICAgICAgICAgLy8gaXRlbXMgY2hhbmdlZCBpbiBleGlzdGluZyBzZXQ6CiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2NoYW5nZWREYXRhJywgaGlnaGxpZ2h0Um93cyk7CgogICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHByb21pc2UpIHsKICAgICAgICAgICAgICAgICAgICAkdGltZW91dC5jYW5jZWwocHJvbWlzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICB9XSk7Cgp9KCkpOwoNCozc71Y7fQQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwXUAAQAY6gMCoBzbAqAdglSsf9fZqThBnPfWigBAFboUjAAABAQgKAKNe7gBNpeqM3O9W4H8EAFgeAABYHgAAaPcoH9LFCAAnrR4TCABFAB5KN7BAAEAGVRfAqAdgwKgHNh/1lSc5Vegr25KJR4AYATKuIwAAAQEICgBNpeoAo17tSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMUQ4MQ0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gV2lkZ2V0IC0tIEJ1dHRvbiBTZXJ2aWNlCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCBmcywgaXMsIHR0czsKCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgYnRuU2l6ZSA9IDI1LAogICAgICAgIGJ0blBhZGRpbmcgPSA0OwoKCiAgICAvLyA9PT0gSGVscGVyIEZ1bmN0aW9ucwoKICAgIGZ1bmN0aW9uIGRpdkV4aXN0cyhkaXYsIG1zZykgewogICAgICAgIGlmICghZGl2KSB7CiAgICAgICAgICAgICRsb2cud2FybignZGl2IHVuZGVmaW5lZCAoJyArIG1zZyArICcpJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhIWRpdjsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVEaXYoZGl2LCBjbHMsIGlkKSB7CiAgICAgICAgcmV0dXJuIGRpdi5hcHBlbmQoJ2RpdicpCiAgICAgICAgICAgIC5jbGFzc2VkKGNscywgdHJ1ZSkKICAgICAgICAgICAgLmF0dHIoJ2lkJywgaWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vb3AoKSB7fQoKICAgIGZ1bmN0aW9uIGJ1dHRvbldpZHRoKCkgewogICAgICAgIHJldHVybiBidG5TaXplICsgMiAqIGJ0blBhZGRpbmc7CiAgICB9CgogICAgLy8gPT09IEJVVFRPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLy8gZGl2IGlzIHdoZXJlIHRvIHB1dCB0aGUgYnV0dG9uIChkMy5zZWxlY3Rpb24gb2YgYSBESVYgZWxlbWVudCkKICAgIC8vIGlkIHNob3VsZCBiZSBnbG9iYWxseSB1bmlxdWUKICAgIC8vIGdpZCBpcyBnbHlwaCBJRCAoZnJvbSBHbHlwaCBTZXJ2aWNlKQogICAgLy8gY2IgaXMgY2FsbGJhY2sgZnVuY3Rpb24gb24gY2xpY2sKICAgIC8vIHRvb2x0aXAgaXMgdGV4dCBmb3IgdG9vbHRpcAogICAgZnVuY3Rpb24gYnV0dG9uKGRpdiwgaWQsIGdpZCwgY2IsIHRvb2x0aXApIHsKICAgICAgICBpZiAoIWRpdkV4aXN0cyhkaXYsICdidXR0b24nKSkgcmV0dXJuIG51bGw7CgogICAgICAgIHZhciBidG5EaXYgPSBjcmVhdGVEaXYoZGl2LCAnYnV0dG9uJywgaWQpLAogICAgICAgICAgICBjYkZuYyA9IGZzLmlzRihjYikgfHwgbm9vcDsKCiAgICAgICAgaXMubG9hZEljb24oYnRuRGl2LCBnaWQsIGJ0blNpemUsIHRydWUpOwogICAgICAgIGlmICh0b29sdGlwKSB7IHR0cy5hZGRUb29sdGlwKGJ0bkRpdiwgdG9vbHRpcCk7IH0KCiAgICAgICAgYnRuRGl2Lm9uKCdjbGljaycsIGNiRm5jKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaWQ6IGlkLAogICAgICAgICAgICB3aWR0aDogYnV0dG9uV2lkdGgKICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PSBUT0dHTEUgQlVUVE9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIGRpdiBpcyB3aGVyZSB0byBwdXQgdGhlIGJ1dHRvbiAoZDMuc2VsZWN0aW9uIG9mIGEgRElWIGVsZW1lbnQpCiAgICAvLyBpZCBzaG91bGQgYmUgZ2xvYmFsbHkgdW5pcXVlCiAgICAvLyBnaWQgaXMgZ2x5cGggSUQgKGZyb20gR2x5cGggU2VydmljZSkKICAgIC8vIGluaXRTdGF0ZSBpcyB3aGV0aGVyIHRoZSB0b2dnbGUgaXMgb24gb3Igbm90IHRvIGJlZ2luCiAgICAvLyBjYiBpcyBjYWxsYmFjayBmdW5jdGlvbiBvbiBjbGljawogICAgLy8gdG9vbHRpcCBpcyB0ZXh0IGZvciB0b29sdGlwCiAgICBmdW5jdGlvbiB0b2dnbGUoZGl2LCBpZCwgZ2lkLCBpbml0U3RhdGUsIGNiLCB0b29sdGlwKSB7CiAgICAgICAgaWYgKCFkaXZFeGlzdHMoZGl2LCAndG9nZ2xlIGJ1dHRvbicpKSByZXR1cm4gbnVsbDsKCiAgICAgICAgdmFyIHNlbCA9ICEhaW5pdFN0YXRlLAogICAgICAgICAgICB0b2dEaXYgPSBjcmVhdGVEaXYoZGl2LCAndG9nZ2xlQnV0dG9uJywgaWQpLAogICAgICAgICAgICBjYkZuYyA9IGZzLmlzRihjYikgfHwgbm9vcDsKCiAgICAgICAgaXMubG9hZEljb24odG9nRGl2LCBnaWQsIGJ0blNpemUsIHRydWUpOwogICAgICAgIHRvZ0Rpdi5jbGFzc2VkKCdzZWxlY3RlZCcsIHNlbCk7CiAgICAgICAgaWYgKHRvb2x0aXApIHsgdHRzLmFkZFRvb2x0aXAodG9nRGl2LCB0b29sdGlwKTsgfQoKICAgICAgICBmdW5jdGlvbiBfdG9nZ2xlKGIsIG5vY2IpIHsKICAgICAgICAgICAgc2VsID0gKGIgPT09IHVuZGVmaW5lZCkgPyAhc2VsIDogISFiOwogICAgICAgICAgICB0b2dEaXYuY2xhc3NlZCgnc2VsZWN0ZWQnLCBzZWwpOwogICAgICAgICAgICBub2NiIHx8IGNiRm5jKHNlbCk7CiAgICAgICAgfQoKICAgICAgICAvLyB0b2dnbGUgdGhlIGJ1dHRvbiBzdGF0ZSB3aXRob3V0IGludm9raW5nIHRoZSBjYWxsYmFjawogICAgICAgIGZ1bmN0aW9uIHRvZ2dsZU5vQ2IoKSB7CiAgICAgICAgICAgIF90b2dnbGUodW5kZWZpbmVkLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIHRvZ0Rpdi5vbignY2xpY2snLCBfdG9nZ2xlKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaWQ6IGlkLAogICAgICAgICAgICB3aWR0aDogYnV0dG9uV2lkdGgsCiAgICAgICAgICAgIHNlbGVjdGVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZWw7IH0sCiAgICAgICAgICAgIHRvZ2dsZTogX3RvZ2dsZSwKICAgICAgICAgICAgdG9nZ2xlTm9DYjogdG9nZ2xlTm9DYgogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09IFJBRElPIEJVVFRPTiBTRVQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKICAgIC8vIGRpdiBpcyB3aGVyZSB0byBwdXQgdGhlIGJ1dHRvbiAoZDMuc2VsZWN0aW9uIG9mIGEgRElWIGVsZW1lbnQpCiAgICAvLyBpZCBzaG91bGQgYmUgZ2xvYmFsbHkgdW5pcXVlCiAgICAvLyByc2V0IGlzIGFuIGFycmF5IG9mIGJ1dHRvbiBkZXNjcmlwdG9ycyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CiAgICAvLyAgICAgewogICAgLy8gICAgICAgZ2lkOiBnbHlwaElkLAogICAgLy8gICAgICAgdG9vbHRpcDogdG9vbHRpcFRleHQsCiAgICAvLyAgICAgICBjYjogIGNhbGxiYWNrRnVuY3Rpb24KICAgIC8vICAgICB9CiAgICBmdW5jdGlvbiByYWRpb1NldChkaXYsIGlkLCByc2V0KSB7CiAgICAgICAgaWYgKCFkaXZFeGlzdHMoZGl2LCAncmFkaW8gYnV0dG9uIHNldCcpKSByZXR1cm4gbnVsbDsKCiAgICAgICAgaWYgKCFmcy5pc0EocnNldCkgfHwgIXJzZXQubGVuZ3RoKSB7CiAgICAgICAgICAgICRsb2cud2FybignaW52YWxpZCBhcnJheSAocmFkaW8gYnV0dG9uIHNldCknKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgckRpdiA9IGNyZWF0ZURpdihkaXYsICdyYWRpb1NldCcsIGlkKSwKICAgICAgICAgICAgcmFkcyA9IFtdLAogICAgICAgICAgICBpZHhCeUtleSA9IHt9LAogICAgICAgICAgICBjdXJySWR4ID0gMDsKCiAgICAgICAgZnVuY3Rpb24gcnNldFdpZHRoKCkgewogICAgICAgICAgICByZXR1cm4gKChidG5TaXplICsgYnRuUGFkZGluZykgKiByYWRzLmxlbmd0aCkgKyBidG5QYWRkaW5nOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmJjbGljaygpIHsKICAgICAgICAgICAgdmFyIGlkID0gZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ2lkJyksCiAgICAgICAgICAgICAgICBtID0gL14uKi0oXGQrKSQvLmV4ZWMoaWQpLAogICAgICAgICAgICAgICAgaWR4ID0gTnVtYmVyKG1bMV0pOwoKICAgICAgICAgICAgaWYgKGlkeCAhPT0gY3VycklkeCkgewogICAgICAgICAgICAgICAgcmFkc1tjdXJySWR4XS5lbC5jbGFzc2VkKCdzZWxlY3RlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGN1cnJJZHggPSBpZHg7CiAgICAgICAgICAgICAgICByYWRzW2N1cnJJZHhdLmVsLmNsYXNzZWQoJ3NlbGVjdGVkJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpbnZva2VDdXJyZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICAvLyB7CiAgICAgICAgIC8vICAgICBnaWQ6IGdpZCwKICAgICAgICAgLy8gICAgIHRvb2x0aXA6IC4uLiwgICAgICAgKG9wdGlvbmFsKQogICAgICAgICAvLyAgICAga2V5OiAuLi4sICAgICAgICAgICAob3B0aW9uYWwpCiAgICAgICAgIC8vICAgICBjYjogY2IKICAgICAgICAgLy8gICAgIGlkOiAuLi4gICAgICAgICAgICAgKGFkZGVkIGJ5IHVzKQogICAgICAgICAvLyAgICAgaW5kZXg6IC4uLiAgICAgICAgICAoYWRkZWQgYnkgdXMpCiAgICAgICAgIC8vIH0KCiAgICAgICAgcnNldC5mb3JFYWNoKGZ1bmN0aW9uIChidG4sIGluZGV4KSB7CgogICAgICAgICAgICBpZiAoIWZzLmlzTyhidG4pKSB7CiAgICAgICAgICAgICAgICAkbG9nLndhcm4oJ3JhZGlvIGJ1dHRvbiBkZXNjcmlwdG9yIGF0IGluZGV4ICcgKyBpbmRleCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIG5vdCBhbiBvYmplY3QnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJpZCA9IGlkICsgJy0nICsgaW5kZXgsCiAgICAgICAgICAgICAgICBpbml0U2VsID0gKGluZGV4ID09PSAwKSwKICAgICAgICAgICAgICAgIHJiZGl2ID0gY3JlYXRlRGl2KHJEaXYsICdyYWRpb0J1dHRvbicsIHJpZCk7CgogICAgICAgICAgICByYmRpdi5jbGFzc2VkKCdzZWxlY3RlZCcsIGluaXRTZWwpOwogICAgICAgICAgICByYmRpdi5vbignY2xpY2snLCByYmNsaWNrKTsKICAgICAgICAgICAgaXMubG9hZEljb24ocmJkaXYsIGJ0bi5naWQsIGJ0blNpemUsIHRydWUpOwogICAgICAgICAgICBpZiAoYnRuLnRvb2x0aXApIHsgdHRzLmFkZFRvb2x0aXAocmJkaXYsIGJ0bi50b29sdGlwKTsgfQogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChidG4sIHsKICAgICAgICAgICAgICAgIGVsOiByYmRpdiwKICAgICAgICAgICAgICAgIGlkOiByaWQsCiAgICAgICAgICAgICAgICBjYjogZnMuaXNGKGJ0bi5jYikgfHwgbm9vcCwKICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChidG4ua2V5KSB7CiAgICAgICAgICAgICAgICBpZHhCeUtleVtidG4ua2V5XSA9IGluZGV4OwogICAgICAgICAgICB9CgogICAgICAgICAgICByYWRzLnB1c2goYnRuKTsKICAgICAgICB9KTsKCgogICAgICAgIGZ1bmN0aW9uIGludm9rZUN1cnJlbnQoKSB7CiAgICAgICAgICAgIHZhciBjdXJyID0gcmFkc1tjdXJySWR4XTsKICAgICAgICAgICAgY3Vyci5jYihjdXJyLmluZGV4LCBjdXJyLmtleSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZWxlY3RlZCh4KSB7CiAgICAgICAgICAgIHZhciBjdXJyID0gcmFkc1tjdXJySWR4XSwKICAgICAgICAgICAgICAgIGlkeDsKCiAgICAgICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjdXJyLmtleSB8fCBjdXJyLmluZGV4OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWR4ID0gaWR4QnlLZXlbeF07CiAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAkbG9nLndhcm4oJ25vIHJhZGlvIGJ1dHRvbiB3aXRoIGtleTonLCB4KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleChpZHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZWxlY3RlZEluZGV4KHgpIHsKICAgICAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJJZHg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoeCA+PSAwICYmIHggPCByYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJySWR4ICE9PSB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhZHNbY3VycklkeF0uZWwuY2xhc3NlZCgnc2VsZWN0ZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJJZHggPSB4OwogICAgICAgICAgICAgICAgICAgICAgICByYWRzW2N1cnJJZHhdLmVsLmNsYXNzZWQoJ3NlbGVjdGVkJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUN1cnJlbnQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkbG9nLndhcm4oJ2N1cnJlbnQgaW5kZXggYWxyZWFkeSBzZWxlY3RlZDonLCB4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRsb2cud2FybignaW52YWxpZCByYWRpbyBidXR0b24gaW5kZXg6JywgeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdpZHRoOiByc2V0V2lkdGgsCiAgICAgICAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZCwKICAgICAgICAgICAgc2VsZWN0ZWRJbmRleDogc2VsZWN0ZWRJbmRleCwKICAgICAgICAgICAgc2l6ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmFkcy5sZW5ndGg7IH0KICAgICAgICB9CiAgICB9CgoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zV2lkZ2V0JykKICAgIC5mYWN0b3J5KCdCdXR0b25TZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ0ljb25TZXJ2aWNlJywgJ1Rvb2x0aXBTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX2lzXywgX3R0c18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBpcyA9IF9pc187CiAgICAgICAgICAgIHR0cyA9IF90dHNfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGJ1dHRvbjogYnV0dG9uLAogICAgICAgICAgICAgICAgdG9nZ2xlOiB0b2dnbGUsCiAgICAgICAgICAgICAgICByYWRpb1NldDogcmFkaW9TZXQKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cgp9KCkpOwoNCozc71ZUgAQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt+kAAQAZ848CoBzbAqAdglScf9duSiUc5VgZBgBAPM3hLAAABAQgKAKNe7wBNpeqM3O9W94AEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5N7ZAAEAGcyLAqAdgwKgHNh/1lSc5VgZB25KJR4AYATKQEgAAAQEICgBNpeoAo17vMA0KDQqM3O9WBoUEAMsCAADLAgAACAAnrR4TaPcoH9LFCABFAAK9LftAAEAGelnAqAc2wKgHYJUnH/XbkolHOVYGRoAYDzONmgAAAQEICgCjXu8ATaXqR0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvdGFibGVCdWlsZGVyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZhiQQAhx0AAIcdAABo9ygf0sUIACetHhMIAEUAHXnVE0AAQAa4hMCoB2DAqAc2H/WVIkHAoe5YeoRYgBgBg61SAAABAQgKAE2l6gCjXu1IVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxQ0IwDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBXaWRnZXQgLS0gVG9vbGJhciBTZXJ2aWNlCiAqLwovLyBUT0RPOiBBdWdtZW50IHNlcnZpY2UgdG8gYWxsb3cgdG9vbGJhcnMgdG8gZXhpc3Qgb24gcmlnaHQgZWRnZSBvZiBzY3JlZW4KLy8gVE9ETzogYWxzbyAtIG1ha2UgdG9vbGJhciBtb3JlIG9iamVjdCBhd2FyZSAocm93cyBldGMuKQoKCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csIGZzLCBwcywgYm5zLCBpczsKCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgYXJyb3dTaXplID0gMTAsCiAgICAgICAgc2VwV2lkdGggPSA2LAogICAgICAgIGRlZmF1bHRTZXR0aW5ncyA9IHsKICAgICAgICAgICAgZWRnZTogJ2xlZnQnLAogICAgICAgICAgICB3aWR0aDogMjAsCiAgICAgICAgICAgIG1hcmdpbjogMCwKICAgICAgICAgICAgaGlkZU1hcmdpbjogLTIwLAogICAgICAgICAgICB0b3A6ICdhdXRvJywKICAgICAgICAgICAgYm90dG9tOiAnMTBweCcsCiAgICAgICAgICAgIGZhZGU6IGZhbHNlLAogICAgICAgICAgICBzaG93bjogZmFsc2UKICAgICAgICB9OwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgdGJhcnMgPSB7fTsKCgogICAgLy8gPT09IEhlbHBlciBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyB0cmFuc2xhdGUgdXNlcyA1MCBiZWNhdXNlIHRoZSBzdmcgdmlld2JveCBpcyA1MAogICAgZnVuY3Rpb24gcm90YXRlQXJyb3dMZWZ0KGFkaXYpIHsKICAgICAgICBhZGl2LnNlbGVjdCgnZycpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAgNTApIHJvdGF0ZSgtOTApJyk7CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGVBcnJvd1JpZ2h0KGFkaXYpIHsKICAgICAgICBhZGl2LnNlbGVjdCgnZycpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDUwIDApIHJvdGF0ZSg5MCknKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVBcnJvdyhwYW5lbCkgewogICAgICAgIHZhciBhcnJvd0RpdiA9IHBhbmVsLmFwcGVuZCgnZGl2JykKICAgICAgICAgICAgLmNsYXNzZWQoJ3RiYXItYXJyb3cnLCB0cnVlKTsKICAgICAgICBpcy5sb2FkSWNvbihhcnJvd0RpdiwgJ3RyaWFuZ2xlVXAnLCBhcnJvd1NpemUsIHRydWUpOwogICAgICAgIHJldHVybiBhcnJvd0RpdjsKICAgIH0KCiAgICBmdW5jdGlvbiB3YXJuKG1zZywgaWQpIHsKICAgICAgICAkbG9nLndhcm4oJ2NyZWF0ZVRvb2xiYXI6ICcgKyBtc2cgKyAnOiBbJyArIGlkICsgJ10nKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gY3JlYXRlVG9vbGJhcihpZCwgb3B0cykgewogICAgICAgIGlmICghaWQpIHJldHVybiB3YXJuKCdubyBJRCBnaXZlbicpOwogICAgICAgIGlmICh0YmFyc1tpZF0pIHJldHVybiB3YXJuKCdkdXBsaWNhdGUgSUQgZ2l2ZW4nLCBpZCk7CgogICAgICAgIHZhciBzZXR0aW5ncyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBkZWZhdWx0U2V0dGluZ3MsIGZzLmlzTyhvcHRzKSksCiAgICAgICAgICAgIGl0ZW1zID0ge30sCiAgICAgICAgICAgIHRiaWQgPSAndG9vbGJhci0nICsgaWQsCiAgICAgICAgICAgIHBhbmVsID0gcHMuY3JlYXRlUGFuZWwodGJpZCwgc2V0dGluZ3MpLAogICAgICAgICAgICBhcnJvd0RpdiA9IGNyZWF0ZUFycm93KHBhbmVsKSwKICAgICAgICAgICAgY3VycmVudFJvdyA9IHBhbmVsLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndGJhci1yb3cnLCB0cnVlKSwKICAgICAgICAgICAgcm93QnV0dG9uSWRzID0gW10sICAgICAgICAgIC8vIGZvciByZW1vdmFibGUgYnV0dG9ucwogICAgICAgICAgICB0YldpZHRoID0gYXJyb3dTaXplICsgMiwgICAgLy8gZW1wdHkgdG9vbGJhciB3aWR0aAogICAgICAgICAgICBtYXhXaWR0aCA9IHBhbmVsLndpZHRoKCk7CgogICAgICAgIGFycm93RGl2Lm9uKCdjbGljaycsIHRvZ2dsZSk7CgogICAgICAgIC8vIGFkZCBhIGRlc2NyaXB0b3IgZm9yIHRoaXMgdG9vbGJhcgogICAgICAgIHRiYXJzW2lkXSA9IHsKICAgICAgICAgICAgc2V0dGluZ3M6IHNldHRpbmdzLAogICAgICAgICAgICBpdGVtczogaXRlbXMsCiAgICAgICAgICAgIHBhbmVsOiBwYW5lbCwKICAgICAgICAgICAgcGFuZWxJZDogdGJpZAogICAgICAgIH07CgogICAgICAgIHBhbmVsLmNsYXNzZWQoJ3Rvb2xiYXInLCB0cnVlKQogICAgICAgICAgICAuc3R5bGUoJ3RvcCcsIHNldHRpbmdzLnRvcCkKICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCBzZXR0aW5ncy5ib3R0b20pOwoKICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zCgogICAgICAgIGZ1bmN0aW9uIGR1cElkKGlkLCBjYWxsZXIpIHsKICAgICAgICAgICAgaWYgKGl0ZW1zW2lkXSkgewogICAgICAgICAgICAgICAgJGxvZy53YXJuKGNhbGxlciArICc6IGR1cGxpY2F0ZSBJRDonLCBpZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhZGp1c3RXaWR0aChidG5XaWR0aCkgewogICAgICAgICAgICBpZiAoZnMubm9QeFN0eWxlKGN1cnJlbnRSb3csICd3aWR0aCcpID49IG1heFdpZHRoKSB7CiAgICAgICAgICAgICAgICB0YldpZHRoICs9IGJ0bldpZHRoOwogICAgICAgICAgICAgICAgbWF4V2lkdGggPSB0YldpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhbmVsLndpZHRoKHRiV2lkdGgpOwogICAgICAgIH0KCiAgICAgICAgLy8gQVBJIGZ1bmN0aW9ucwoKICAgICAgICBmdW5jdGlvbiBhZGRCdXR0b24oaWQsIGdpZCwgY2IsIHRvb2x0aXApIHsKICAgICAgICAgICAgaWYgKGR1cElkKGlkLCAnYWRkQnV0dG9uJykpIHJldHVybiBudWxsOwoKICAgICAgICAgICAgdmFyIGJpZCA9IHRiaWQgKyAnLScgKyBpZCwKICAgICAgICAgICAgICAgIGJ0biA9IGJucy5idXR0b24oY3VycmVudFJvdywgYmlkLCBnaWQsIGNiLCB0b29sdGlwKTsKCiAgICAgICAgICAgIGl0ZW1zW2lkXSA9IGJ0bjsKICAgICAgICAgICAgYWRqdXN0V2lkdGgoYnRuLndpZHRoKCkpOwogICAgICAgICAgICByZXR1cm4gYnRuOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYWRkVG9nZ2xlKGlkLCBnaWQsIGluaXRTdGF0ZSwgY2IsIHRvb2x0aXApIHsKICAgICAgICAgICAgaWYgKGR1cElkKGlkLCAnYWRkVG9nZ2xlJykpIHJldHVybiBudWxsOwoKICAgICAgICAgICAgdmFyIHRpZCA9IHRiaWQgKyAnLScgKyBpZCwKICAgICAgICAgICAgICAgIHRvZyA9IGJucy50b2dnbGUoY3VycmVudFJvdywgdGlkLCBnaWQsIGluaXRTdGF0ZSwgY2IsIHRvb2x0aXApOwoKICAgICAgICAgICAgaXRlbXNbaWRdID0gdG9nOwogICAgICAgICAgICBhZGp1c3RXaWR0aCh0b2cud2lkdGgoKSk7CiAgICAgICAgICAgIHJldHVybiB0b2c7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhZGRSYWRpb1NldChpZCwgcnNldCkgewogICAgICAgICAgICBpZiAoZHVwSWQoaWQsICdhZGRSYWRpb1NldCcpKSByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgIHZhciByaWQgPSB0YmlkICsgJy0nICsgaWQsCiAgICAgICAgICAgICAgICByYWQgPSBibnMucmFkaW9TZXQoY3VycmVudFJvdywgcmlkLCByc2V0KTsKCiAgICAgICAgICAgIGl0ZW1zW2lkXSA9IHJhZDsKICAgICAgICAgICAgYWRqdXN0V2lkdGgocmFkLndpZHRoKCkpOwogICAgICAgICAgICByZXR1cm4gcmFkOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYWRkU2VwYXJhdG9yKCkgewogICAgICAgICAgICBjdXJyZW50Um93LmFwcGVuZCgnZGl2JykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdzZXBhcmF0b3InLCB0cnVlKTsKICAgICAgICAgICAgdGJXaWR0aCArPSBzZXBXaWR0aDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZFJvdygpIHsKICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cuc2VsZWN0KCdkaXYnKS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhbmVsLmFwcGVuZCgnYnInKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBwYW5lbC5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ3RiYXItcm93JywgdHJ1ZSk7CgogICAgICAgICAgICAgICAgLy8gcmV0dXJuIEFQSSB0byBhbGxvdyBjYWxsZXIgbW9yZSBhY2Nlc3MgdG8gdGhlIHJvdwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBjbGVhcjogcm93Q2xlYXIsCiAgICAgICAgICAgICAgICAgICAgc2V0VGV4dDogcm93U2V0VGV4dCwKICAgICAgICAgICAgICAgICAgICBhZGRCdXR0b246IHJvd0FkZEJ1dHRvbiwKICAgICAgICAgICAgICAgICAgICBjbGFzc2VkOiByb3dDbGFzc2VkCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByb3dDbGVhcigpIHsKICAgICAgICAgICAgY3VycmVudFJvdy5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTsKICAgICAgICAgICAgcm93QnV0dG9uSWRzLmZvckVhY2goZnVuY3Rpb24gKGJpZCkgewogICAgICAgICAgICAgICAgZGVsZXRlIGl0ZW1zW2JpZF07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByb3dCdXR0b25JZHMgPSBbXTsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbGxzIGEgZGl2IHdpdGggdGV4dCBpbnRvIHRoZSBidXR0b24gcm93CiAgICAgICAgZnVuY3Rpb24gcm93U2V0VGV4dCh0ZXh0KSB7CiAgICAgICAgICAgIHJvd0NsZWFyKCk7CiAgICAgICAgICAgIGN1cnJlbnRSb3cuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCd0YmFyLXJvdy10ZXh0JywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5odG1sKHRleHQpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcm93QWRkQnV0dG9uKGlkLCBnaWQsIGNiLCB0b29sdGlwKSB7CiAgICAgICAgICAgIHZhciBiID0gYWRkQnV0dG9uKGlkLCBnaWQsIGNiLCB0b29sdGlwKTsKICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgIHJvd0J1dHRvbklkcy5wdXNoKGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcm93Q2xhc3NlZChjbGFzc2VzLCBib29sKSB7CiAgICAgICAgICAgIGN1cnJlbnRSb3cuY2xhc3NlZChjbGFzc2VzLCBib29sKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3coY2IpIHsKICAgICAgICAgICAgcm90YXRlQXJyb3dMZWZ0KGFycm93RGl2KTsKICAgICAgICAgICAgcGFuZWwuc2hvdyhjYik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoaWRlKGNiKSB7CiAgICAgICAgICAgIHJvdGF0ZUFycm93UmlnaHQoYXJyb3dEaXYpOwogICAgICAgICAgICBwYW5lbC5oaWRlKGNiKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHRvZ2dsZShjYikgewogICAgICAgICAgICBpZiAocGFuZWwuaXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgIGhpZGUoY2IpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2hvdyhjYik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGFkZEJ1dHRvbjogYWRkQnV0dG9uLAogICAgICAgICAgICBhZGRUb2dnbGU6IGFkZFRvZ2dsZSwKICAgICAgICAgICAgYWRkUmFkaW9TZXQ6IGFkZFJhZGlvU2V0LAogICAgICAgICAgICBhZGRTZXBhcmF0b3I6IGFkZFNlcGFyYXRvciwKICAgICAgICAgICAgYWRkUm93OiBhZGRSb3csCgogICAgICAgICAgICBzaG93OiBzaG93LAogICAgICAgICAgICBoaWRlOiBoaWRlLAogICAgICAgICAgICB0b2dnbGU6IHRvZ2dsZQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGVzdHJveVRvb2xiYXIoaWQpIHsKICAgICAgICB2YXIgdGIgPSB0YmFyc1tpZF07CiAgICAgICAgZGVsZXRlIHRiYXJzW2lkXTsKCiAgICAgICAgaWYgKHRiKSB7CiAgICAgICAgICAgIHBzLmRlc3Ryb3lQYW5lbCh0Yi5wYW5lbElkKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gPT09IE1vZHVsZSBEZWZpbml0aW9uID09PQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zV2lkZ2V0JykKICAgIC5mYWN0b3J5KCdUb29sYmFyU2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdQYW5lbFNlcnZpY2UnLCAnQnV0dG9uU2VydmljZScsICdJY29uU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9wc18sIF9ibnNfLCBfaXNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgcHMgPSBfcHNfOwogICAgICAgICAgICBibnMgPSBfYm5zXzsKICAgICAgICAgICAgaXMgPSBfaXNfOwoKICAgICAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgaW4gdGVzdGluZwogICAgICAgICAgICBmdW5jdGlvbiBpbml0KCkgewogICAgICAgICAgICAgICAgdGJhcnMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXQ6IGluaXQsCiAgICAgICAgICAgICAgICBjcmVhdGVUb29sYmFyOiBjcmVhdGVUb29sYmFyLAogICAgICAgICAgICAgICAgZGVzdHJveVRvb2xiYXI6IGRlc3Ryb3lUb29sYmFyCiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwp9KCkpOwoNCozc71ariQQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8X0AAQAZufsCoBzbAqAdglSIf9Vh6hFhBwL8zgBANDkEgAAABAQgKAKNe7wBNpeqM3O9WVooEAA0KAAANCgAAaPcoH9LFCAAnrR4TCABFAAn/bt5AAEAGMjTAqAdgwKgHNh/1lSxw2CFtBQnJH4AYAR6Z2AAAAQEICgBNpesAo17rSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KOTM3DQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBSZW1vdGUgQ29tbXVuaWNhdGlvbnMgTW9kdWxlIC0tIFJFU1QgU2VydmljZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgJGxvZzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc1JlbW90ZScpCiAgICAuZmFjdG9yeSgnUmVzdFNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICckaHR0cCcsICdGblNlcnZpY2UnLCAnVXJsRm5TZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgJGh0dHAsIGZzLCB1ZnMpIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldCh1cmwsIGNhbGxiYWNrLCBlcnJvckNiKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVsbFVybCA9IHVmcy5yc1VybCh1cmwpOwoKICAgICAgICAgICAgICAgICRodHRwLmdldChmdWxsVXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNwb25zZS5kYXRhKTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgdmFyIGVtc2cgPSAnRmFpbGVkIHRvIHJldHJpZXZlIEpTT04gZGF0YTogJyArIGZ1bGxVcmw7CiAgICAgICAgICAgICAgICAgICAgJGxvZy53YXJuKGVtc2csIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDYihlbXNnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogdGVzdCB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3QodXJsLCBkYXRhLCBjYWxsYmFja3MpIHsKICAgICAgICAgICAgICAgIHZhciBmdWxsVXJsID0gdWZzLnJzVXJsKHVybCk7CiAgICAgICAgICAgICAgICAkaHR0cC5wb3N0KGZ1bGxVcmwsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MgJiYgZnMuaXNGKGNhbGxiYWNrcy5zdWNjZXNzKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3VjY2VzcyhyZXNwb25zZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgogICAgICAgICAgICAgICAgICAgIHZhciBtc2cgPSAnUHJvYmxlbSB3aXRoICRodHRwIHBvc3QgcmVxdWVzdDogJyArIGZ1bGxVcmw7CiAgICAgICAgICAgICAgICAgICAgJGxvZy53YXJuKG1zZywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5kYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAmJiBmcy5pc0YoY2FsbGJhY2tzLmVycm9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZXJyb3IobXNnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGdldDogZ2V0LAogICAgICAgICAgICAgICAgcG9zdDogcG9zdAogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKDQqM3O9WxooEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05JVA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cHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjE0N0QNCi8qCiAqIENvcHlyaWdodCAyMDE1LDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gV2lkZ2V0IC0tIFRhYmxlIFNlcnZpY2UKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICRpbnRlcnZhbCwgJHRpbWVvdXQsIGZzLCB3c3MsIGxzOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHJlZnJlc2hJbnRlcnZhbCA9IDIwMDA7CgogICAgLy8gZXhhbXBsZSBwYXJhbXMgdG8gYnVpbGRUYWJsZToKICAgIC8vIHsKICAgIC8vICAgIHNjb3BlOiAkc2NvcGUsICAgICA8LSBjb250cm9sbGVyIHNjb3BlCiAgICAvLyAgICB0YWc6ICdkZXZpY2UnLCAgICAgPC0gdGFibGUgaWRlbnRpZmllcgogICAgLy8gICAgc2VsQ2I6IHNlbENiLCAgICAgIDwtIHJvdyBzZWxlY3Rpb24gY2FsbGJhY2sgKG9wdGlvbmFsKQogICAgLy8gICAgcmVzcENiOiByZXNwQ2IsICAgIDwtIHdlYnNvY2tldCByZXNwb25zZSBjYWxsYmFjayAob3B0aW9uYWwpCiAgICAvLyAgICBxdWVyeTogcGFyYW1zICAgICAgPC0gcXVlcnkgcGFyYW1ldGVycyBpbiBVUkwgKG9wdGlvbmFsKQogICAgLy8gfQogICAgLy8gICAgICAgICAgTm90ZTogc2VsQ2IoKSBpcyBwYXNzZWQgdGhlIHJvdyBkYXRhIG1vZGVsIG9mIHRoZSBzZWxlY3RlZCByb3csCiAgICAvLyAgICAgICAgICAgICAgICAgb3IgbnVsbCB3aGVuIG5vIHJvdyBpcyBzZWxlY3RlZC4KICAgIC8vICAgICAgICAgIE5vdGU6IHF1ZXJ5IGlzIGFsd2F5cyBhbiBvYmplY3QgKGVtcHR5IG9yIGNvbnRhaW5pbmcgcHJvcGVydGllcykKICAgIC8vICAgICAgICAgICAgICAgICBpdCBjb21lcyBmcm9tICRsb2NhdGlvbi5zZWFyY2goKQoKICAgIGZ1bmN0aW9uIGJ1aWxkVGFibGUobykgewogICAgICAgIHZhciBoYW5kbGVycyA9IHt9LAogICAgICAgICAgICByb290ID0gby50YWcgKyAncycsCiAgICAgICAgICAgIHJlcSA9IG8udGFnICsgJ0RhdGFSZXF1ZXN0JywKICAgICAgICAgICAgcmVzcCA9IG8udGFnICsgJ0RhdGFSZXNwb25zZScsCiAgICAgICAgICAgIG9uU2VsID0gZnMuaXNGKG8uc2VsQ2IpLAogICAgICAgICAgICBvblJlc3AgPSBmcy5pc0Yoby5yZXNwQ2IpLAogICAgICAgICAgICBpZEtleSA9IG8uaWRLZXkgfHwgJ2lkJywKICAgICAgICAgICAgb2xkVGFibGVEYXRhID0gW10sCiAgICAgICAgICAgIHJlZnJlc2hQcm9taXNlOwoKICAgICAgICBvLnNjb3BlLnRhYmxlRGF0YSA9IFtdOwogICAgICAgIG8uc2NvcGUuY2hhbmdlZERhdGEgPSBbXTsKICAgICAgICBvLnNjb3BlLnNvcnRQYXJhbXMgPSBvLnNvcnRQYXJhbXMgfHwge307CiAgICAgICAgby5zY29wZS5hdXRvUmVmcmVzaCA9IHRydWU7CiAgICAgICAgby5zY29wZS5hdXRvUmVmcmVzaFRpcCA9ICdUb2dnbGUgYXV0byByZWZyZXNoJzsKCiAgICAgICAgLy8gPT09IHdlYnNvY2tldCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyByZXNwb25zZQogICAgICAgIGZ1bmN0aW9uIHJlc3BDYihkYXRhKSB7CiAgICAgICAgICAgIGxzLnN0b3AoKTsKICAgICAgICAgICAgby5zY29wZS50YWJsZURhdGEgPSBkYXRhW3Jvb3RdOwogICAgICAgICAgICBvLnNjb3BlLmFubm90cyA9IGRhdGEuYW5ub3RzOwogICAgICAgICAgICBvblJlc3AgJiYgb25SZXNwKCk7CgogICAgICAgICAgICAvLyBjaGVja3MgaWYgZGF0YSBjaGFuZ2VkIGZvciByb3cgZmxhc2hpbmcKICAgICAgICAgICAgaWYgKCFhbmd1bGFyLmVxdWFscyhvLnNjb3BlLnRhYmxlRGF0YSwgb2xkVGFibGVEYXRhKSkgewogICAgICAgICAgICAgICAgby5zY29wZS5jaGFuZ2VkRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgLy8gb25seSBmbGFzaCB0aGUgcm93IGlmIHRoZSBkYXRhIGFscmVhZHkgZXhpc3RzCiAgICAgICAgICAgICAgICBpZiAob2xkVGFibGVEYXRhLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChvLnNjb3BlLnRhYmxlRGF0YSwgZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5jb250YWluc09iaihvbGRUYWJsZURhdGEsIGl0ZW0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnNjb3BlLmNoYW5nZWREYXRhLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFuZ3VsYXIuY29weShvLnNjb3BlLnRhYmxlRGF0YSwgb2xkVGFibGVEYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvLnNjb3BlLiRhcHBseSgpOwogICAgICAgIH0KICAgICAgICBoYW5kbGVyc1tyZXNwXSA9IHJlc3BDYjsKICAgICAgICB3c3MuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKCiAgICAgICAgLy8gcmVxdWVzdAogICAgICAgIGZ1bmN0aW9uIHNvcnRDYihwYXJhbXMpIHsKICAgICAgICAgICAgdmFyIHAgPSBhbmd1bGFyLmV4dGVuZCh7fSwgcGFyYW1zLCBvLnF1ZXJ5KTsKICAgICAgICAgICAgaWYgKHdzcy5pc0Nvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KHJlcSwgcCk7CiAgICAgICAgICAgICAgICBscy5zdGFydCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG8uc2NvcGUuc29ydENhbGxiYWNrID0gc29ydENiOwoKCiAgICAgICAgLy8gPT09IHNlbGVjdGluZyBhIHJvdyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIGZ1bmN0aW9uIHNlbENiKCRldmVudCwgc2VsUm93KSB7CiAgICAgICAgICAgIHZhciBzZWxJZCA9IHNlbFJvd1tpZEtleV07CiAgICAgICAgICAgIG8uc2NvcGUuc2VsSWQgPSAoby5zY29wZS5zZWxJZCA9PT0gc2VsSWQpID8gbnVsbCA6IHNlbElkOwogICAgICAgICAgICBvblNlbCAmJiBvblNlbCgkZXZlbnQsIHNlbFJvdyk7CiAgICAgICAgfQogICAgICAgIG8uc2NvcGUuc2VsZWN0Q2FsbGJhY2sgPSBzZWxDYjsKCiAgICAgICAgLy8gPT09IGF1dG9SZWZyZXNoIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBmdW5jdGlvbiBmZXRjaERhdGFJZk5vdFdhaXRpbmcoKSB7CiAgICAgICAgICAgIGlmICghbHMud2FpdGluZygpKSB7CiAgICAgICAgICAgICAgICBpZiAoZnMuZGVidWdPbignd2lkZ2V0JykpIHsKICAgICAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdSZWZyZXNoaW5nICcgKyByb290ICsgJyBwYWdlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzb3J0Q2Ioby5zY29wZS5zb3J0UGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RhcnRSZWZyZXNoKCkgewogICAgICAgICAgICByZWZyZXNoUHJvbWlzZSA9ICRpbnRlcnZhbChmZXRjaERhdGFJZk5vdFdhaXRpbmcsIHJlZnJlc2hJbnRlcnZhbCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzdG9wUmVmcmVzaCgpIHsKICAgICAgICAgICAgaWYgKHJlZnJlc2hQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKHJlZnJlc2hQcm9taXNlKTsKICAgICAgICAgICAgICAgIHJlZnJlc2hQcm9taXNlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9nZ2xlUmVmcmVzaCgpIHsKICAgICAgICAgICAgby5zY29wZS5hdXRvUmVmcmVzaCA9ICFvLnNjb3BlLmF1dG9SZWZyZXNoOwogICAgICAgICAgICBvLnNjb3BlLmF1dG9SZWZyZXNoID8gc3RhcnRSZWZyZXNoKCkgOiBzdG9wUmVmcmVzaCgpOwogICAgICAgIH0KICAgICAgICBvLnNjb3BlLnRvZ2dsZVJlZnJlc2ggPSB0b2dnbGVSZWZyZXNoOwoKICAgICAgICAvLyA9PT0gQ2xlYW51cCBvbiBkZXN0cm95ZWQgc2NvcGUgLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBvLnNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHdzcy51bmJpbmRIYW5kbGVycyhoYW5kbGVycyk7CiAgICAgICAgICAgIHN0b3BSZWZyZXNoKCk7CiAgICAgICAgICAgIGxzLnN0b3AoKTsKICAgICAgICB9KTsKCiAgICAgICAgc29ydENiKG8uc2NvcGUuc29ydFBhcmFtcyk7CiAgICAgICAgc3RhcnRSZWZyZXNoKCk7CiAgICB9CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NXaWRnZXQnKQogICAgICAgIC5mYWN0b3J5KCdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJGludGVydmFsJywgJyR0aW1lb3V0JywgJ0ZuU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywKICAgICAgICAgICAgJ0xvYWRpbmdTZXJ2aWNlJywKCiAgICAgICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kaW50ZXJ2YWxfLCBfJHRpbWVvdXRfLCBfZnNfLCBfd3NzXywgX2xzXykgewogICAgICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgICAgICRpbnRlcnZhbCA9IF8kaW50ZXJ2YWxfOwogICAgICAgICAgICAgICAgJHRpbWVvdXQgPSBfJHRpbWVvdXRfOwogICAgICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICAgICAgd3NzID0gX3dzc187CiAgICAgICAgICAgICAgICBscyA9IF9sc187CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBidWlsZFRhYmxlOiBidWlsZFRhYmxlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9XSk7Cgp9KCkpOwoNCozc71ZSpwQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt/EAAQAZ84cCoBzbAqAdglScf9duSi9A5VhtYgBAPM2CnAAABAQgKAKNe8QBNpeyM3O9WWakEADMXAAAzFwAAaPcoH9LFCAAnrR4TCABFABclGJhAAEAGe1TAqAdgwKgHNh/1lStnPfWn9mpQkYAYAWym/gAAAQEICgBNpe0Ao17xSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMTY1Qw0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTGF5ZXIgLS0gUGFuZWwgU2VydmljZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgJGxvZywgZnM7CgogICAgdmFyIGRlZmF1bHRTZXR0aW5ncyA9IHsKICAgICAgICBlZGdlOiAncmlnaHQnLAogICAgICAgIHdpZHRoOiAyMDAsCiAgICAgICAgbWFyZ2luOiAyMCwKICAgICAgICBoaWRlTWFyZ2luOiAyMCwKICAgICAgICB4dG5UaW1lOiA3NTAsCiAgICAgICAgZmFkZTogdHJ1ZQogICAgfTsKCiAgICB2YXIgcGFuZWxzLAogICAgICAgIHBhbmVsTGF5ZXI7CgoKICAgIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgcGFuZWxMYXllciA9IGQzLnNlbGVjdCgnI2Zsb2F0cGFuZWxzJyk7CiAgICAgICAgcGFuZWxMYXllci5odG1sKCcnKTsKICAgICAgICBwYW5lbHMgPSB7fTsKICAgIH0KCiAgICAvLyBoZWxwZXJzIGZvciBwYW5lbAogICAgZnVuY3Rpb24gbm9vcCgpIHt9CgogICAgZnVuY3Rpb24gbWFyZ2luKHApIHsKICAgICAgICByZXR1cm4gcC5zZXR0aW5ncy5tYXJnaW47CiAgICB9CiAgICBmdW5jdGlvbiBoaWRlTWFyZ2luKHApIHsKICAgICAgICByZXR1cm4gcC5zZXR0aW5ncy5oaWRlTWFyZ2luOwogICAgfQogICAgZnVuY3Rpb24gbm9QeChwLCB3aGF0KSB7CiAgICAgICAgcmV0dXJuIE51bWJlcihwLmVsLnN0eWxlKHdoYXQpLnJlcGxhY2UoL3B4JC8sICcnKSk7CiAgICB9CiAgICBmdW5jdGlvbiB3aWR0aFZhbChwKSB7CiAgICAgICAgcmV0dXJuIG5vUHgocCwgJ3dpZHRoJyk7CiAgICB9CiAgICBmdW5jdGlvbiBoZWlnaHRWYWwocCkgewogICAgICAgIHJldHVybiBub1B4KHAsICdoZWlnaHQnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHB4U2hvdyhwKSB7CiAgICAgICAgcmV0dXJuIG1hcmdpbihwKSArICdweCc7CiAgICB9CiAgICBmdW5jdGlvbiBweEhpZGUocCkgewogICAgICAgIHJldHVybiAoLWhpZGVNYXJnaW4ocCkgLSB3aWR0aFZhbChwKSAtIChub1B4KHAsICdwYWRkaW5nJykgKiAyKSkgKyAncHgnOwogICAgfQoKICAgIGZ1bmN0aW9uIG1ha2VQYW5lbChpZCwgc2V0dGluZ3MpIHsKICAgICAgICB2YXIgcCA9IHsKICAgICAgICAgICAgICAgIGlkOiBpZCwKICAgICAgICAgICAgICAgIHNldHRpbmdzOiBzZXR0aW5ncywKICAgICAgICAgICAgICAgIG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVsOiBudWxsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFwaSA9IHsKICAgICAgICAgICAgICAgIHNob3c6IHNob3dQYW5lbCwKICAgICAgICAgICAgICAgIGhpZGU6IGhpZGVQYW5lbCwKICAgICAgICAgICAgICAgIHRvZ2dsZTogdG9nZ2xlUGFuZWwsCiAgICAgICAgICAgICAgICBlbXB0eTogZW1wdHlQYW5lbCwKICAgICAgICAgICAgICAgIGFwcGVuZDogYXBwZW5kUGFuZWwsCiAgICAgICAgICAgICAgICB3aWR0aDogcGFuZWxXaWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodDogcGFuZWxIZWlnaHQsCiAgICAgICAgICAgICAgICBpc1Zpc2libGU6IHBhbmVsSXNWaXNpYmxlLAogICAgICAgICAgICAgICAgY2xhc3NlZDogY2xhc3NlZCwKICAgICAgICAgICAgICAgIGVsOiBwYW5lbEVsCiAgICAgICAgICAgIH07CgogICAgICAgIHAuZWwgPSBwYW5lbExheWVyLmFwcGVuZCgnZGl2JykKICAgICAgICAgICAgLmF0dHIoJ2lkJywgaWQpCiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdmbG9hdHBhbmVsJykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgICAgIC8vIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgZWwgaXMgc2V0CiAgICAgICAgcC5lbC5zdHlsZShwLnNldHRpbmdzLmVkZ2UsIHB4SGlkZShwKSk7CiAgICAgICAgcGFuZWxXaWR0aChwLnNldHRpbmdzLndpZHRoKTsKICAgICAgICBpZiAocC5zZXR0aW5ncy5oZWlnaHQpIHsKICAgICAgICAgICAgcGFuZWxIZWlnaHQocC5zZXR0aW5ncy5oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgcGFuZWxzW2lkXSA9IHA7CgogICAgICAgIGZ1bmN0aW9uIHNob3dQYW5lbChjYikgewogICAgICAgICAgICB2YXIgZW5kQ2IgPSBmcy5pc0YoY2IpIHx8IG5vb3A7CiAgICAgICAgICAgIHAub24gPSB0cnVlOwogICAgICAgICAgICBwLmVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbihwLnNldHRpbmdzLnh0blRpbWUpCiAgICAgICAgICAgICAgICAuZWFjaCgnZW5kJywgZW5kQ2IpCiAgICAgICAgICAgICAgICAuc3R5bGUocC5zZXR0aW5ncy5lZGdlLCBweFNob3cocCkpCiAgICAgICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhpZGVQYW5lbChjYikgewogICAgICAgICAgICB2YXIgZW5kQ2IgPSBmcy5pc0YoY2IpIHx8IG5vb3AsCiAgICAgICAgICAgICAgICBlbmRPcGFjaXR5ID0gcC5zZXR0aW5ncy5mYWRlID8gMCA6IDE7CiAgICAgICAgICAgIHAub24gPSBmYWxzZTsKICAgICAgICAgICAgcC5lbC50cmFuc2l0aW9uKCkuZHVyYXRpb24ocC5zZXR0aW5ncy54dG5UaW1lKQogICAgICAgICAgICAgICAgLmVhY2goJ2VuZCcsIGVuZENiKQogICAgICAgICAgICAgICAgLnN0eWxlKHAuc2V0dGluZ3MuZWRnZSwgcHhIaWRlKHApKQogICAgICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgZW5kT3BhY2l0eSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB0b2dnbGVQYW5lbChjYikgewogICAgICAgICAgICBpZiAocC5vbikgewogICAgICAgICAgICAgICAgaGlkZVBhbmVsKGNiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNob3dQYW5lbChjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHAub247CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBlbXB0eVBhbmVsKCkgewogICAgICAgICAgICByZXR1cm4gcC5lbC5odG1sKCcnKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFwcGVuZFBhbmVsKHdoYXQpIHsKICAgICAgICAgICAgcmV0dXJuIHAuZWwuYXBwZW5kKHdoYXQpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcGFuZWxXaWR0aCh3KSB7CiAgICAgICAgICAgIGlmICh3ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aWR0aFZhbChwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwLmVsLnN0eWxlKCd3aWR0aCcsIHcgKyAncHgnKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBhbmVsSGVpZ2h0KGgpIHsKICAgICAgICAgICAgaWYgKGggPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGhlaWdodFZhbChwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwLmVsLnN0eWxlKCdoZWlnaHQnLCBoICsgJ3B4Jyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwYW5lbElzVmlzaWJsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHAub247CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjbGFzc2VkKGNscywgYm9vbCkgewogICAgICAgICAgICByZXR1cm4gcC5lbC5jbGFzc2VkKGNscywgYm9vbCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwYW5lbEVsKCkgewogICAgICAgICAgICByZXR1cm4gcC5lbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcGk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlUGFuZWwoaWQpIHsKICAgICAgICBwYW5lbExheWVyLnNlbGVjdCgnIycgKyBpZCkucmVtb3ZlKCk7CiAgICAgICAgZGVsZXRlIHBhbmVsc1tpZF07CiAgICB9CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NMYXllcicpCiAgICAuZmFjdG9yeSgnUGFuZWxTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHdpbmRvdycsICdGblNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHdpbmRvd18sIF9mc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwoKICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlUGFuZWwoaWQsIG9wdHMpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBkZWZhdWx0U2V0dGluZ3MsIG9wdHMpOwogICAgICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgICAgICRsb2cud2FybignY3JlYXRlUGFuZWw6IG5vIElEIGdpdmVuJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocGFuZWxzW2lkXSkgewogICAgICAgICAgICAgICAgICAgICRsb2cud2FybignUGFuZWwgd2l0aCBJRCAiJyArIGlkICsgJyIgYWxyZWFkeSBleGlzdHMnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmcy5kZWJ1Z09uKCd3aWRnZXQnKSkgewogICAgICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ2NyZWF0aW5nIHBhbmVsOicsIGlkLCBzZXR0aW5ncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVBhbmVsKGlkLCBzZXR0aW5ncyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lQYW5lbChpZCkgewogICAgICAgICAgICAgICAgaWYgKHBhbmVsc1tpZF0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZnMuZGVidWdPbignd2lkZ2V0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnZGVzdHJveWluZyBwYW5lbDonLCBpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlbW92ZVBhbmVsKGlkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZzLmRlYnVnT24oJ3dpZGdldCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ25vIHBhbmVsIHRvIGRlc3Ryb3k6JywgaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXQ6IGluaXQsCiAgICAgICAgICAgICAgICBjcmVhdGVQYW5lbDogY3JlYXRlUGFuZWwsCiAgICAgICAgICAgICAgICBkZXN0cm95UGFuZWw6IGRlc3Ryb3lQYW5lbAogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKDQqM3O9WxqkEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0cF9AAEAGOn7AqAc2wKgHYJUrH/X2alCRZz4MmIAQBY5rhgAAAQEICgCjXvEATaXtjNzvVmqqBABHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAORidQABABpI7wKgHYMCoBzYf9ZUrZz4MmPZqUJGAGAFskBIAAAEBCAoATaXtAKNe8TANCg0KjNzvVkSvBADEAgAAxAIAAAgAJ60eE2j3KB/SxQgARQACtnBgQABABjf7wKgHNsCoB2CVKx/19mpQkWc+DJ2AGAWkZaoAAAEBCAoAo17xAE2l7UdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvZGlhbG9nLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bVsgQAswMAALMDAABo9ygf0sUIACetHhMIAEUAA6Vu4UAAQAY4i8CoB2DAqAc2H/WVLHDYKz0FCcuggBgBKJN+AAABAQgKAE2l7QCjXu9IVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoyREQNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIExheWVycyBNb2R1bGUKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NMYXllcicsIFsnb25vc1V0aWwnXSk7Cgp9KCkpOwoNCozc71ZHuAQAwRYAAMEWAABo9ygf0sUIACetHhMIAEUAFrMYnkAAQAZ7wMCoB2DAqAc2H/WVK2c+DJ32alMTgBgBdqaMAAABAQgKAE2l7QCjXvFIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxNUVBDQovKgogKiAgQ29weXJpZ2h0IDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTGF5ZXIgLS0gRGlhbG9nIFNlcnZpY2UKCiBCdWlsZHMgb24gdGhlIHBhbmVsIHNlcnZpY2UgdG8gcHJvdmlkZSBkaWFsb2cgZnVuY3Rpb25hbGl0eS4KICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICR3aW5kb3csIGZzLCBwcywgYm5zLCBrczsKCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgZGVmYXVsdFNldHRpbmdzID0gewogICAgICAgICAgICB3aWR0aDogMzAwLAogICAgICAgICAgICBlZGdlOiAnbGVmdCcKICAgICAgICB9OwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgcEFwaSwgcGFuZWwsIGRBcGksCiAgICAgICAga2V5QmluZGluZ3MgPSB7fTsKCiAgICAvLyBjcmVhdGUgdGhlIGRpYWxvZzsgcmV0dXJuIGl0cyBBUEkKICAgIGZ1bmN0aW9uIGNyZWF0ZURpYWxvZyhpZCwgb3B0cykgewogICAgICAgIHZhciBoZWFkZXIsIGJvZHksIGZvb3RlciwKICAgICAgICAgICAgc2V0dGluZ3MgPSBhbmd1bGFyLmV4dGVuZCh7fSwgZGVmYXVsdFNldHRpbmdzLCBvcHRzKSwKICAgICAgICAgICAgcCA9IHBzLmNyZWF0ZVBhbmVsKGlkLCBzZXR0aW5ncyksCiAgICAgICAgICAgIGNscyA9IG9wdHMgJiYgb3B0cy5jc3NDbHM7CgogICAgICAgIHAuY2xhc3NlZCgnZGlhbG9nJywgdHJ1ZSk7CiAgICAgICAgaWYgKGNscykgewogICAgICAgICAgICBwLmNsYXNzZWQoY2xzLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgcGFuZWwgPSBwOwoKICAgICAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgICAgICAgcC5lbXB0eSgpOwogICAgICAgICAgICBwLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgnaGVhZGVyJywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib2R5JywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdmb290ZXInLCB0cnVlKTsKCiAgICAgICAgICAgIGhlYWRlciA9IHAuZWwoKS5zZWxlY3QoJy5oZWFkZXInKTsKICAgICAgICAgICAgYm9keSA9IHAuZWwoKS5zZWxlY3QoJy5ib2R5Jyk7CiAgICAgICAgICAgIGZvb3RlciA9IHAuZWwoKS5zZWxlY3QoJy5mb290ZXInKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhBcHBlbmQoeCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyLmFwcGVuZCh4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBoZWFkZXIubm9kZSgpLmFwcGVuZENoaWxkKHgubm9kZSgpKTsKICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGJBcHBlbmQoeCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYm9keS5hcHBlbmQoeCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYm9keS5ub2RlKCkuYXBwZW5kQ2hpbGQoeC5ub2RlKCkpOwogICAgICAgICAgICByZXR1cm4gYm9keTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGZBcHBlbmQoeCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9vdGVyLmFwcGVuZCh4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb290ZXIubm9kZSgpLmFwcGVuZENoaWxkKHgubm9kZSgpKTsKICAgICAgICAgICAgcmV0dXJuIGZvb3RlcjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHBzLmRlc3Ryb3lQYW5lbChpZCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXNldDogcmVzZXQsCiAgICAgICAgICAgIGFwcGVuZEhlYWRlcjogaEFwcGVuZCwKICAgICAgICAgICAgYXBwZW5kQm9keTogYkFwcGVuZCwKICAgICAgICAgICAgYXBwZW5kRm9vdGVyOiBmQXBwZW5kLAogICAgICAgICAgICBkZXN0cm95OiBkZXN0cm95CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYWtlQnV0dG9uKGNhbGxiYWNrLCB0ZXh0LCBrZXlOYW1lKSB7CiAgICAgICAgdmFyIGNiID0gZnMuaXNGKGNhbGxiYWNrKSwKICAgICAgICAgICAga2V5ID0gZnMuaXNTKGtleU5hbWUpOwoKICAgICAgICBmdW5jdGlvbiBpbnZva2UoKSB7CiAgICAgICAgICAgIGNiICYmIGNiKCk7CiAgICAgICAgICAgIGNsZWFyQmluZGluZ3MoKTsKICAgICAgICAgICAgcGFuZWwuaGlkZSgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGtleSkgewogICAgICAgICAgICBrZXlCaW5kaW5nc1trZXldID0gaW52b2tlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNyZWF0ZURpdignZGlhbG9nLWJ1dHRvbicpCiAgICAgICAgICAgIC50ZXh0KHRleHQpCiAgICAgICAgICAgIC5vbignY2xpY2snLCBpbnZva2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFRpdGxlKHRpdGxlKSB7CiAgICAgICAgaWYgKHBBcGkpIHsKICAgICAgICAgICAgcEFwaS5hcHBlbmRIZWFkZXIoJ2gyJykudGV4dCh0aXRsZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkQXBpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZENvbnRlbnQoY29udGVudCkgewogICAgICAgIGlmIChwQXBpKSB7CiAgICAgICAgICAgIHBBcGkuYXBwZW5kQm9keShjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRBcGk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQnV0dG9uKGNiLCB0ZXh0LCBrZXkpIHsKICAgICAgICBpZiAocEFwaSkgewogICAgICAgICAgICBwQXBpLmFwcGVuZEZvb3RlcihtYWtlQnV0dG9uKGNiLCB0ZXh0LCBrZXkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRBcGk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkT2soY2IsIHRleHQpIHsKICAgICAgICByZXR1cm4gYWRkQnV0dG9uKGNiLCB0ZXh0IHx8ICdPSycsICdlbnRlcicpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZENhbmNlbChjYiwgdGV4dCkgewogICAgICAgIHJldHVybiBhZGRCdXR0b24oY2IsIHRleHQgfHwgJ0NhbmNlbCcsICdlc2MnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhckJpbmRpbmdzKCkgewogICAgICAgIGtleUJpbmRpbmdzID0ge307CiAgICAgICAga3MuZGlhbG9nS2V5cygpOwogICAgfQoKICAgIC8vIG9wZW5zIHRoZSBkaWFsb2cgKGNyZWF0ZXMgaWYgbmVjZXNzYXJ5KQogICAgZnVuY3Rpb24gb3BlbkRpYWxvZyhpZCwgb3B0cykgewogICAgICAgICRsb2cuZGVidWcoJ09wZW4gRElBTE9HJywgaWQsIG9wdHMpOwogICAgICAgIGlmICghcEFwaSkgewogICAgICAgICAgICBwQXBpID0gY3JlYXRlRGlhbG9nKGlkLCBvcHRzKTsKICAgICAgICB9CiAgICAgICAgcEFwaS5yZXNldCgpOwogICAgICAgIHBhbmVsLnNob3coKTsKCiAgICAgICAgLy8gcmV0dXJuIHRoZSBkaWFsb2cgb2JqZWN0IEFQSQogICAgICAgIGRBcGkgPSB7CiAgICAgICAgICAgIHNldFRpdGxlOiBzZXRUaXRsZSwKICAgICAgICAgICAgYWRkQ29udGVudDogYWRkQ29udGVudCwKICAgICAgICAgICAgYWRkQnV0dG9uOiBhZGRCdXR0b24sCiAgICAgICAgICAgIGFkZE9rOiBhZGRPaywKICAgICAgICAgICAgYWRkQ2FuY2VsOiBhZGRDYW5jZWwsCiAgICAgICAgICAgIGJpbmRLZXlzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBrcy5kaWFsb2dLZXlzKGtleUJpbmRpbmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGRBcGk7CiAgICB9CgogICAgLy8gY2xvc2VzIHRoZSBkaWFsb2cgKGRlc3Ryb3lpbmcgcGFuZWwpCiAgICBmdW5jdGlvbiBjbG9zZURpYWxvZygpIHsKICAgICAgICAkbG9nLmRlYnVnKCdDbG9zZSBESUFMT0cnKTsKICAgICAgICBpZiAocEFwaSkgewogICAgICAgICAgICBjbGVhckJpbmRpbmdzKCk7CiAgICAgICAgICAgIHBhbmVsLmhpZGUoKTsKICAgICAgICAgICAgcEFwaS5kZXN0cm95KCk7CiAgICAgICAgICAgIHBBcGkgPSBudWxsOwogICAgICAgICAgICBkQXBpID0gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLy8gY3JlYXRlcyBhIGRldGFjaGVkIGRpdiwgcmV0dXJuaW5nIEQzIHNlbGVjdGlvbgogICAgLy8gb3B0aW9uYWwgQ1NTIGNsYXNzIG1heSBiZSBwcm92aWRlZAogICAgZnVuY3Rpb24gY3JlYXRlRGl2KGNscykgewogICAgICAgIHZhciBkaXYgPSBkMy5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgICAgIGlmIChjbHMpIHsKICAgICAgICAgICAgZGl2LmNsYXNzZWQoY2xzLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRpdjsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc0xheWVyJykKICAgIC5mYWN0b3J5KCdEaWFsb2dTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHdpbmRvdycsICdGblNlcnZpY2UnLCAnUGFuZWxTZXJ2aWNlJywgJ0J1dHRvblNlcnZpY2UnLAogICAgICAgICAgICAnS2V5U2VydmljZScsCgogICAgICAgIC8vIFRPRE86IGZvciBub3csICR3aW5kb3cgaXMgbm90IHVzZWQsIGJ1dCB3ZSBzaG91bGQgcHJvdmlkZSBhbiBvcHRpb24KICAgICAgICAgICAgLy8gdG8gY2VudGVyIHRoZSBkaWFsb2cgb24gdGhlIHdpbmRvdy4KCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyR3aW5kb3dfLCBfZnNfLCBfcHNfLCBfYm5zXywgX2tzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkd2luZG93ID0gXyR3aW5kb3dfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHBzID0gX3BzXzsKICAgICAgICAgICAgYm5zID0gX2Juc187CiAgICAgICAgICAgIGtzID0gX2tzXzsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBvcGVuRGlhbG9nOiBvcGVuRGlhbG9nLAogICAgICAgICAgICAgICAgY2xvc2VEaWFsb2c6IGNsb3NlRGlhbG9nLAogICAgICAgICAgICAgICAgY3JlYXRlRGl2OiBjcmVhdGVEaXYKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cgp9KCkpOwoNCozc71aGuAQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwYUAAQAY6fMCoBzbAqAdglSsf9fZqUxNnPiMcgBAFjlJ/AAABAQgKAKNe8gBNpe2M3O9WhrgEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5GKJAAEAGkjbAqAdgwKgHNh/1lStnPiMc9mpTE4AYAXaQEgAAAQEICgBNpe4Ao17yMA0KDQqM3O9WJLsEAMMCAADDAgAACAAnrR4TaPcoH9LFCABFAAK1cGJAAEAGN/rAqAc2wKgHYJUrH/X2alMTZz4jIYAYBaSgsQAAAQEICgCjXvIATaXuR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9mbGFzaC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WM70EAKsDAACrAwAAaPcoH9LFCAAnrR4TCABFAAOdjW1AAEAGGgfAqAdgwKgHNh/1lS2mkqPLT9m1roAYATyTdgAAAQEICgBNpe4Ao17tSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMkQ1DQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBXaWRnZXRzIE1vZHVsZQogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc1dpZGdldCcsIFtdKTsKCn0oKSk7Cg0KjNzvVvW9BABHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOY1uQABABh1qwKgHYMCoBzYf9ZUtppKnNE/Zta6AGAE8kBIAAAEBCAoATaXuAKNe7TANCg0KjNzvVv2+BABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMHAQABABukcwKgHNsCoB2CVLR/1T9m1rqaSpzmAEALr1aIAAAEBCAoAo17zAE2l7ozc71YJwAQAxwIAAMcCAAAIACetHhNo9ygf0sUIAEUAArnBwUAAQAbmlsCoBzbAqAdglS0f9U/Zta6mkqc5gBgC6zgfAAABAQgKAKNe8wBNpe5HRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL3F1aWNraGVscC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiAqLyoNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WUsQEAJIRAACSEQAAaPcoH9LFCAAnrR4TCABFABGEGKNAAEAGgOrAqAdgwKgHNh/1lStnPiMh9mpVlIAYAYChXQAAAQEICgBNpe4Ao17ySFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMTBCQg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTGF5ZXIgLS0gRmxhc2ggU2VydmljZQoKIFByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGZsYXNoIHNob3J0IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIHNjcmVlbgogdG8gYWxlcnQgdGhlIHVzZXIgb2Ygc29tZXRoaW5nLCBlLmcuICJIb3N0cyB2aXNpYmxlIiBvciAiSG9zdHMgaGlkZGVuIi4KICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcwogICAgdmFyICRsb2csICR0aW1lb3V0OwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciBkZWZhdWx0U2V0dGluZ3MgPSB7CiAgICAgICAgICAgIGZhZGU6IDIwMCwKICAgICAgICAgICAgc2hvd0ZvcjogMTIwMAogICAgICAgIH0sCiAgICAgICAgdyA9ICcxMDAlJywKICAgICAgICBoID0gMjAwLAogICAgICAgIHhwYWQgPSAyMCwKICAgICAgICB5cGFkID0gMTAsCiAgICAgICAgcnggPSAxMCwKICAgICAgICB2Ym94ID0gJy0yMDAgLScgKyAoaC8yKSArICcgNDAwICcgKyBoOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgc2V0dGluZ3MsCiAgICAgICAgdGltZXIgPSBudWxsLAogICAgICAgIGRhdGEgPSBbXSwKICAgICAgICBlbmFibGVkOwoKICAgIC8vIERPTSBlbGVtZW50cwogICAgdmFyIGZsYXNoRGl2LCBzdmc7CgoKICAgIGZ1bmN0aW9uIGNvbXB1dGVCb3goZWwpIHsKICAgICAgICB2YXIgdGV4dCA9IGVsLnNlbGVjdCgndGV4dCcpLAogICAgICAgICAgICBib3ggPSB0ZXh0Lm5vZGUoKS5nZXRCQm94KCk7CgogICAgICAgIC8vIGNlbnRlcgogICAgICAgIGJveC54ID0gLWJveC53aWR0aCAvIDI7CiAgICAgICAgYm94LnkgPSAtYm94LmhlaWdodCAvIDI7CgogICAgICAgIC8vIGFkZCBzb21lIHBhZGRpbmcKICAgICAgICBib3gueCAtPSB4cGFkOwogICAgICAgIGJveC53aWR0aCArPSB4cGFkICogMjsKICAgICAgICBib3gueSAtPSB5cGFkOwogICAgICAgIGJveC5oZWlnaHQgKz0geXBhZCAqIDI7CgogICAgICAgIHJldHVybiBib3g7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRmxhc2goKSB7CiAgICAgICAgaWYgKCFzdmcpIHsKICAgICAgICAgICAgc3ZnID0gZmxhc2hEaXYuYXBwZW5kKCdzdmcnKS5hdHRyKHsKICAgICAgICAgICAgICAgIHdpZHRoOiB3LAogICAgICAgICAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgICAgICAgICAgdmlld0JveDogdmJveAogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHZhciBpdGVtcyA9IHN2Zy5zZWxlY3RBbGwoJy5mbGFzaEl0ZW0nKQogICAgICAgICAgICAuZGF0YShkYXRhKTsKCiAgICAgICAgLy8gdGhpcyBpcyB3aGVuIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGl0ZW0KICAgICAgICBpdGVtcy5lYWNoKGZ1bmN0aW9uIChtc2cpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgYm94OwoKICAgICAgICAgICAgZWwuc2VsZWN0KCd0ZXh0JykudGV4dChtc2cpOwogICAgICAgICAgICBib3ggPSBjb21wdXRlQm94KGVsKTsKICAgICAgICAgICAgZWwuc2VsZWN0KCdyZWN0JykuYXR0cihib3gpOwogICAgICAgIH0pOwoKCiAgICAgICAgLy8gdGhpcyBpcyB3aGVuIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGl0ZW0KICAgICAgICB2YXIgZW50ZXJpbmcgPSBpdGVtcy5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICBjbGFzczogJ2ZsYXNoSXRlbScsCiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKHNldHRpbmdzLmZhZGUpCiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSk7CgogICAgICAgIGVudGVyaW5nLmVhY2goZnVuY3Rpb24gKG1zZykgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICBib3g7CgogICAgICAgICAgICBlbC5hcHBlbmQoJ3JlY3QnKS5hdHRyKCdyeCcsIHJ4KTsKICAgICAgICAgICAgZWwuYXBwZW5kKCd0ZXh0JykudGV4dChtc2cpOwogICAgICAgICAgICBib3ggPSBjb21wdXRlQm94KGVsKTsKICAgICAgICAgICAgZWwuc2VsZWN0KCdyZWN0JykuYXR0cihib3gpOwogICAgICAgIH0pOwoKICAgICAgICBpdGVtcy5leGl0KCkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24oc2V0dGluZ3MuZmFkZSkKICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwKQogICAgICAgICAgICAucmVtb3ZlKCk7CgogICAgICAgIGlmIChzdmcgJiYgZGF0YS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc3ZnLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmRlbGF5KHNldHRpbmdzLmZhZGUgKyAxMCkKICAgICAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgICAgICAgICAgc3ZnID0gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZmxhc2gobXNnKSB7CiAgICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47CgogICAgICAgIGlmICh0aW1lcikgewogICAgICAgICAgICAkdGltZW91dC5jYW5jZWwodGltZXIpOwogICAgICAgIH0KCiAgICAgICAgdGltZXIgPSAkdGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGRhdGEgPSBbXTsKICAgICAgICAgICAgdXBkYXRlRmxhc2goKTsKICAgICAgICB9LCBzZXR0aW5ncy5zaG93Rm9yKTsKCiAgICAgICAgZGF0YSA9IFttc2ddOwogICAgICAgIHVwZGF0ZUZsYXNoKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZW5hYmxlKGIpIHsKICAgICAgICBlbmFibGVkID0gISFiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRlbXBEaXYobXMpIHsKICAgICAgICB2YXIgZGl2ID0gZDMuc2VsZWN0KCdib2R5JykuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjZW50ZXJlZCcsIHRydWUpLAogICAgICAgICAgICBkZWxheSA9IChtcyA9PT0gdW5kZWZpbmVkIHx8IG1zIDwgMTAwKSA/IDMwMDAgOiBtczsKICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7IGRpdi5yZW1vdmUoKTsgfSwgZGVsYXkpOwogICAgICAgIHJldHVybiBkaXY7CiAgICB9CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NMYXllcicpCiAgICAgICAgLmZhY3RvcnkoJ0ZsYXNoU2VydmljZScsIFsnJGxvZycsICckdGltZW91dCcsCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyR0aW1lb3V0XykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkdGltZW91dCA9IF8kdGltZW91dF87CgogICAgICAgICAgICBmdW5jdGlvbiBpbml0Rmxhc2gob3B0cykgewogICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBhbmd1bGFyLmV4dGVuZCh7fSwgZGVmYXVsdFNldHRpbmdzLCBvcHRzKTsKICAgICAgICAgICAgICAgIGZsYXNoRGl2ID0gZDMuc2VsZWN0KCcjZmxhc2gnKTsKICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdEZsYXNoOiBpbml0Rmxhc2gsCiAgICAgICAgICAgICAgICBmbGFzaDogZmxhc2gsCiAgICAgICAgICAgICAgICBlbmFibGU6IGVuYWJsZSwKICAgICAgICAgICAgICAgIHRlbXBEaXY6IHRlbXBEaXYKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cgp9KCkpOwoNCozc71bDxAQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwY0AAQAY6esCoBzbAqAdglSsf9fZqVZRnPjRxgBAFjj6nAAABAQgKAKNe8wBNpe6M3O9WuMUEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5GKdAAEAGkjHAqAdgwKgHNh/1lStnPjRx9mpVlIAYAYCQEgAAAQEICgBNpe4Ao17zMA0KDQqM3O9W/8YEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA51RlAAEAG1b7AqAdgwKgHNh/1lSJBwL8zWHqEWIAYAYOQEgAAAQEICgBNpe4Ao17vMA0KDQqM3O9WvMcEAMICAADCAgAACAAnrR4TaPcoH9LFCABFAAK0cGRAAEAGN/nAqAc2wKgHYJUrH/X2alWUZz40doAYBaSOOAAAAQEICgCjXvMATaXuR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci92ZWlsLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6ICovKg0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bRyQQAxQIAAMUCAAAIACetHhNo9ygf0sUIAEUAArc8YEAAQAZr+sCoBzbAqAdglSIf9Vh6hFhBwL84gBgNDiD9AAABAQgKAKNe8wBNpe5HRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL2xvYWRpbmcuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogKi8qDQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVjjRBADtDgAA7Q4AAGj3KB/SxQgAJ60eEwgARQAO39UaQABABscXwKgHYMCoBzYf9ZUiQcC/OFh6htuAGAGTnrgAAAEBCAoATaXvAKNe80hUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCkUxNw0KLyoKICogIENvcHlyaWdodCAyMDE1LDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTGF5ZXIgLS0gTG9hZGluZyBTZXJ2aWNlCgogUHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3RhcnQvc3RvcCB0aGUgbG9hZGluZyBhbmltYXRpb24sIGNlbnRlciBzY3JlZW4uCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCAkdGltZW91dCwgdHMsIGZzOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIGlkID0gJ2xvYWRpbmctYW5pbScsCiAgICAgICAgZGlyID0gJ2RhdGEvaW1nL2xvYWRpbmcvJywKICAgICAgICBwZnggPSAnL2xvYWQtJywKICAgICAgICBuSW1ncyA9IDE2LAogICAgICAgIHNwZWVkID0gMTAwLAogICAgICAgIHdhaXREZWxheSA9IDUwMDsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIGRpdiwKICAgICAgICBpbWcsCiAgICAgICAgdGgsCiAgICAgICAgaWR4LAogICAgICAgIHRhc2ssCiAgICAgICAgd2FpdCwKICAgICAgICBpbWFnZXMgPSBbXTsKCiAgICBmdW5jdGlvbiBkYmcoKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgIGFyZ3MudW5zaGlmdCgnbG9hZGluZycpOwogICAgICAgIGZzLmRlYnVnLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZWxvYWRJbWFnZXMoKSB7CiAgICAgICAgdmFyIGlkeDsKCiAgICAgICAgZnVuY3Rpb24gYWRkSW1nKHRoKSB7CiAgICAgICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgICAgaW1nLnNyYyA9IGZuYW1lKGlkeCwgdGgpOwogICAgICAgICAgICBpbWFnZXMucHVzaChpbWcpOwogICAgICAgIH0KCiAgICAgICAgZGJnKCdwcmVsb2FkIGltYWdlcyBzdGFydC4uLicpOwogICAgICAgIGZvciAoaWR4PTE7IGlkeDw9bkltZ3M7IGlkeCsrKSB7CiAgICAgICAgICAgIGFkZEltZygnbGlnaHQnKTsKICAgICAgICAgICAgYWRkSW1nKCdkYXJrJyk7CiAgICAgICAgfQogICAgICAgIGRiZygncHJlbG9hZCBpbWFnZXMgRE9ORSEnLCBpbWFnZXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZuYW1lKGksIHRoKSB7CiAgICAgICAgdmFyIHogPSBpID4gOSA/ICcnIDogJzAnOwogICAgICAgIHJldHVybiBkaXIgKyB0aCArIHBmeCArIHogKyBpICsgJy5wbmcnOwogICAgfQoKICAgIGZ1bmN0aW9uIG5leHRGcmFtZSgpIHsKICAgICAgICBpZHggPSBpZHggPT09IDE2ID8gMSA6IGlkeCArIDE7CiAgICAgICAgaW1nLmF0dHIoJ3NyYycsIGZuYW1lKGlkeCwgdGgpKTsKICAgICAgICB0YXNrID0gJHRpbWVvdXQobmV4dEZyYW1lLCBzcGVlZCk7CiAgICB9CgogICAgLy8gc3RhcnQgZGlzcGxheWluZyAnbG9hZGluZy4uLicgYW5pbWF0aW9uIChpZGVtcG90ZW50KQogICAgZnVuY3Rpb24gc3RhcnRBbmltKCkgewogICAgICAgIGRiZygnc3RhcnQgQU5JTUFUSU9OJyk7CiAgICAgICAgdGggPSB0cy50aGVtZSgpOwogICAgICAgIGRpdiA9IGQzLnNlbGVjdCgnIycraWQpOwogICAgICAgIGlmIChkaXYuZW1wdHkoKSkgewogICAgICAgICAgICBkaXYgPSBkMy5zZWxlY3QoJ2JvZHknKS5hcHBlbmQoJ2RpdicpLmF0dHIoJ2lkJywgaWQpOwogICAgICAgICAgICBpbWcgPSBkaXYuYXBwZW5kKCdpbWcnKS5hdHRyKCdzcmMnLCBmbmFtZSgxLCB0aCkpOwogICAgICAgICAgICBpZHggPSAxOwogICAgICAgICAgICB0YXNrID0gJHRpbWVvdXQobmV4dEZyYW1lLCBzcGVlZCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIHN0b3AgZGlzcGxheWluZyAnbG9hZGluZy4uLicgYW5pbWF0aW9uIChpZGVtcG90ZW50KQogICAgZnVuY3Rpb24gc3RvcEFuaW0oKSB7CiAgICAgICAgZGJnKCcqc3RvcCogQU5JTUFUSU9OJyk7CiAgICAgICAgaWYgKHRhc2spIHsKICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHRhc2spOwogICAgICAgICAgICB0YXNrID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZDMuc2VsZWN0KCcjJytpZCkucmVtb3ZlKCk7CiAgICB9CgogICAgLy8gc2NoZWR1bGUgZnVuY3Rpb24gdG8gc3RhcnQgYW5pbWF0aW9uIGluIHRoZSBmdXR1cmUKICAgIGZ1bmN0aW9uIHN0YXJ0KCkgewogICAgICAgIGRiZygnc3RhcnQgKHNjaGVkdWxlKScpOwogICAgICAgIHdhaXQgPSAkdGltZW91dChzdGFydEFuaW0sIHdhaXREZWxheSk7CiAgICB9CgogICAgLy8gY2FuY2VsIGZ1dHVyZSBzdGFydCwgaWYgYW55OyBzdG9wIHRoZSBhbmltYXRpb24KICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgICAgaWYgKHdhaXQpIHsKICAgICAgICAgICAgZGJnKCdzdGFydCBDQU5DRUxFRCcpOwogICAgICAgICAgICAkdGltZW91dC5jYW5jZWwod2FpdCk7CiAgICAgICAgICAgIHdhaXQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdG9wQW5pbSgpOwogICAgfQoKICAgIC8vIHJldHVybiB0cnVlIGlmIHN0YXJ0KCkgaGFzIGJlZW4gY2FsbGVkIGJ1dCBub3Qgc3RvcCgpCiAgICBmdW5jdGlvbiB3YWl0aW5nKCkgewogICAgICAgIHJldHVybiAhIXdhaXQ7CiAgICB9CgogICAgYW5ndWxhci5tb2R1bGUoJ29ub3NMYXllcicpCiAgICAgICAgLmZhY3RvcnkoJ0xvYWRpbmdTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHRpbWVvdXQnLCAnVGhlbWVTZXJ2aWNlJywgJ0ZuU2VydmljZScsCgogICAgICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHRpbWVvdXRfLCBfdHNfLCBfZnNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICR0aW1lb3V0ID0gXyR0aW1lb3V0XzsKICAgICAgICAgICAgdHMgPSBfdHNfOwogICAgICAgICAgICBmcyA9IF9mc187CgogICAgICAgICAgICBwcmVsb2FkSW1hZ2VzKCk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgICAgICAgICAgc3RvcDogc3RvcCwKICAgICAgICAgICAgICAgIHdhaXRpbmc6IHdhaXRpbmcKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cgp9KCkpOw0KjNzvVtfRBABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxhQABABm58wKgHNsCoB2CVIh/1WHqG20HAzeOAEA0OL+MAAAEBCAoAo170AE2l74zc71a00gQARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADnVHUAAQAbVusCoB2DAqAc2H/WVIkHAzeNYeobbgBgBk5ASAAABAQgKAE2l7wCjXvQwDQoNCozc71a+1AQAiwIAAIsCAAAIACetHhNo9ygf0sUIAEUAAn08YkAAQAZsMsCoBzbAqAdglSIf9Vh6httBwM3ogBgNDntVAAABAQgKAKNe9ABNpe9HRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WMd4EAK0QAACtEAAAaPcoH9LFCAAnrR4TCABFABCf7fBAAEAGrIHAqAdgwKgHNh/1lSqTpqYKxuj1KoAYAROgeAAAAQEICgBNpfAAo17tSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KRkQ3DQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBXaWRnZXQgLS0gVG9vbHRpcCBTZXJ2aWNlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHJvb3RTY29wZSwgZnM7CgogICAgLy8gY29uc3RhbnRzCiAgICB2YXIgaG92ZXJIZWlnaHQgPSAzNSwKICAgICAgICBob3ZlckRlbGF5ID0gMTUwLAogICAgICAgIGV4aXREZWxheSA9IDE1MDsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIHRvb2x0aXAsIGN1cnJFbGVtSWQ7CgogICAgLy8gPT09IEhlbHBlciBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgICB0b29sdGlwID0gZDMuc2VsZWN0KCcjdG9vbHRpcCcpOwogICAgICAgIHRvb2x0aXAuaHRtbCgnJyk7CiAgICB9CgogICAgZnVuY3Rpb24gdGlwU3R5bGUobW91c2VYLCBtb3VzZVkpIHsKICAgICAgICB2YXIgd2luV2lkdGggPSBmcy53aW5kb3dTaXplKCkud2lkdGgsCiAgICAgICAgICAgIHdpbkhlaWdodCA9IGZzLndpbmRvd1NpemUoKS5oZWlnaHQsCiAgICAgICAgICAgIHN0eWxlID0gewogICAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsCiAgICAgICAgICAgICAgICBsZWZ0OiAnYXV0bycsCiAgICAgICAgICAgICAgICByaWdodDogJ2F1dG8nCiAgICAgICAgICAgIH07CgogICAgICAgIGlmIChtb3VzZVggPD0gKHdpbldpZHRoIC8gMikpIHsKICAgICAgICAgICAgc3R5bGUubGVmdCA9IG1vdXNlWCArICdweCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3R5bGUucmlnaHQgPSAod2luV2lkdGggLSBtb3VzZVgpICsgJ3B4JzsKICAgICAgICB9CgogICAgICAgIGlmIChtb3VzZVkgPD0gKHdpbkhlaWdodCAvIDIpKSB7CiAgICAgICAgICAgIHN0eWxlLnRvcCA9IChtb3VzZVkgKyAoaG92ZXJIZWlnaHQgLSAxMCkpICsgJ3B4JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHlsZS50b3AgPSAobW91c2VZIC0gaG92ZXJIZWlnaHQpICsgJ3B4JzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KCiAgICAvLyA9PT0gQVBJIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiBhZGRUb29sdGlwKGVsZW0sIHRvb2x0aXApIHsKICAgICAgICBlbGVtLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoKSB7IHNob3dUb29sdGlwKHRoaXMsIHRvb2x0aXApOyB9KTsKICAgICAgICBlbGVtLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uICgpIHsgY2FuY2VsVG9vbHRpcCh0aGlzKTsgfSk7CiAgICAgICAgJHJvb3RTY29wZS4kb24oJyRyb3V0ZUNoYW5nZVN0YXJ0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjYW5jZWxUb29sdGlwKGVsZW0ubm9kZSgpKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93VG9vbHRpcChlbCwgbXNnKSB7CiAgICAgICAgLy8gdG9vbHRpcHMgZG9uJ3QgbWFrZSBzZW5zZSBvbiBtb2JpbGUgZGV2aWNlcwogICAgICAgIGlmICghZWwgfHwgIW1zZyB8fCBmcy5pc01vYmlsZSgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBlbGVtID0gZDMuc2VsZWN0KGVsKSwKICAgICAgICAgICAgbW91c2VYID0gZDMuZXZlbnQucGFnZVgsCiAgICAgICAgICAgIG1vdXNlWSA9IGQzLmV2ZW50LnBhZ2VZLAogICAgICAgICAgICBzdHlsZSA9IHRpcFN0eWxlKG1vdXNlWCwgbW91c2VZKTsKICAgICAgICBjdXJyRWxlbUlkID0gZWxlbS5hdHRyKCdpZCcpOwoKICAgICAgICB0b29sdGlwLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZGVsYXkoaG92ZXJEZWxheSkKICAgICAgICAgICAgLmVhY2goJ3N0YXJ0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmVhY2goJ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZShzdHlsZSkKICAgICAgICAgICAgICAgICAgICAudGV4dChtc2cpOwogICAgICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYW5jZWxUb29sdGlwKGVsKSB7CiAgICAgICAgaWYgKCFlbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBlbGVtID0gZDMuc2VsZWN0KGVsKTsKCiAgICAgICAgaWYgKGVsZW0uYXR0cignaWQnKSA9PT0gY3VyckVsZW1JZCkgewogICAgICAgICAgICB0b29sdGlwLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmRlbGF5KGV4aXREZWxheSkKICAgICAgICAgICAgICAgIC5zdHlsZSh7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnRleHQoJycpOwogICAgICAgIH0KICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc1dpZGdldCcpCgogICAgICAgIC5kaXJlY3RpdmUoJ3Rvb2x0aXAnLCBbJyRyb290U2NvcGUnLCAnRm5TZXJ2aWNlJywKICAgICAgICAgICAgZnVuY3Rpb24gKF8kcm9vdFNjb3BlXywgX2ZzXykgewogICAgICAgICAgICAgICAgJHJvb3RTY29wZSA9IF8kcm9vdFNjb3BlXzsKICAgICAgICAgICAgICAgIGZzID0gX2ZzXzsKCiAgICAgICAgICAgICAgICBpbml0KCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0EnLAogICAgICAgICAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbSwgYXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9vbHRpcChkMy5zZWxlY3QoZWxlbVswXSksIHNjb3BlW2F0dHJzLnR0TXNnXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICB9XSkKCiAgICAgICAgLmZhY3RvcnkoJ1Rvb2x0aXBTZXJ2aWNlJywgWyckbG9nJywgJyRyb290U2NvcGUnLCAnRm5TZXJ2aWNlJywKICAgICAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRyb290U2NvcGVfLCBfZnNfKSB7CiAgICAgICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAgICAgJHJvb3RTY29wZSA9IF8kcm9vdFNjb3BlXzsKICAgICAgICAgICAgICAgIGZzID0gX2ZzXzsKCiAgICAgICAgICAgICAgICBpbml0KCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBhZGRUb29sdGlwOiBhZGRUb29sdGlwLAogICAgICAgICAgICAgICAgICAgIHNob3dUb29sdGlwOiBzaG93VG9vbHRpcCwKICAgICAgICAgICAgICAgICAgICBjYW5jZWxUb29sdGlwOiBjYW5jZWxUb29sdGlwCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9XSk7Cn0oKSk7Cg0KjNzvVrTeBABCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLflQABABvL3wKgHNsCoB2CVKh/1xuj1KpOmtnWAEAKmIwsAAAEBCAoAo171AE2l8Izc71b23wQARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADnt80AAQAa85MCoB2DAqAc2H/WVKpOmtnXG6PUqgBgBE5ASAAABAQgKAE2l8ACjXvUwDQoNCozc71ZL4wQAHkcAAB5HAABo9ygf0sUIACetHhMIAEUARxDVHkAAQAaO4sCoB2DAqAc2H/WVIkHAzehYeokkgBgBo9bpAAABAQgKAE2l8ACjXvRIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTgwMzQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIG1vZHVsZURlcGVuZGVuY2llcyA9IFsKICAgICAgICAnbmdDb29raWVzJywKICAgICAgICAnb25vc1V0aWwnLAogICAgICAgICdvbm9zU3ZnJywKICAgICAgICAnb25vc1JlbW90ZScKICAgIF07CgogICAgLy8gcmVmZXJlbmNlcyB0byBpbmplY3RlZCBzZXJ2aWNlcyBldGMuCiAgICB2YXIgJHNjb3BlLCAkbG9nLCAkY29va2llcywgZnMsIGtzLCB6cywgZ3MsIG1zLCBzdXMsIGZsYXNoLCB3c3MsIHBzLAogICAgICAgIHRkcywgdGVzLCB0ZnMsIHRwcywgdGlzLCB0c3MsIHRscywgdHRzLCB0b3MsIGZsdHIsIHR0YnMsIHR0aXAsIHRvdjsKCiAgICAvLyBET00gZWxlbWVudHMKICAgIHZhciBvdnRvcG8sIHN2ZywgZGVmcywgem9vbUxheWVyLCBtYXBHLCBzcHJpdGVHLCBmb3JjZUcsIG5vRGV2c0xheWVyOwoKICAgIC8vIEludGVybmFsIHN0YXRlCiAgICB2YXIgem9vbWVyLCBhY3Rpb25NYXA7CgogICAgLy8gLS0tIFNob3J0IEN1dCBLZXlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIHNldFVwS2V5cyhvdmVybGF5S2V5cykgewogICAgICAgIC8vIGtleSBiaW5kaW5ncyBuZWVkIHRvIGJlIG1hZGUgYWZ0ZXIgdGhlIHNlcnZpY2VzIGhhdmUgYmVlbiBpbmplY3RlZAogICAgICAgIC8vIHRodXMsIGRlZmVycmVkIHRvIGhlcmUuLi4KICAgICAgICBhY3Rpb25NYXAgPSB7CiAgICAgICAgICAgIEk6IFt0b2dnbGVJbnN0YW5jZXMsICdUb2dnbGUgT05PUyBpbnN0YW5jZXMgcGFuZWwnXSwKICAgICAgICAgICAgTzogW3RvZ2dsZVN1bW1hcnksICdUb2dnbGUgT05PUyBzdW1tYXJ5IHBhbmVsJ10sCiAgICAgICAgICAgIEQ6IFt0b2dnbGVVc2VEZXRhaWxzRmxhZywgJ0Rpc2FibGUgLyBlbmFibGUgZGV0YWlscyBwYW5lbCddLAoKICAgICAgICAgICAgSDogW3RvZ2dsZUhvc3RzLCAnVG9nZ2xlIGhvc3QgdmlzaWJpbGl0eSddLAogICAgICAgICAgICBNOiBbdG9nZ2xlT2ZmbGluZSwgJ1RvZ2dsZSBvZmZsaW5lIHZpc2liaWxpdHknXSwKICAgICAgICAgICAgUDogW3RvZ2dsZVBvcnRzLCAnVG9nZ2xlIFBvcnQgSGlnaGxpZ2h0aW5nJ10sCiAgICAgICAgICAgIGRhc2g6IFt0ZnMuc2hvd0JhZExpbmtzLCAnU2hvdyBiYWQgbGlua3MnXSwKICAgICAgICAgICAgQjogW3RvZ2dsZU1hcCwgJ1RvZ2dsZSBiYWNrZ3JvdW5kIG1hcCddLAogICAgICAgICAgICBTOiBbdG9nZ2xlU3ByaXRlcywgJ1RvZ2dsZSBzcHJpdGUgbGF5ZXInXSwKCiAgICAgICAgICAgIFg6IFt0ZnMucmVzZXRBbGxMb2NhdGlvbnMsICdSZXNldCBub2RlIGxvY2F0aW9ucyddLAogICAgICAgICAgICBaOiBbdG9zLnRvZ2dsZU9ibGlxdWUsICdUb2dnbGUgb2JsaXF1ZSB2aWV3IChFeHBlcmltZW50YWwpJ10sCiAgICAgICAgICAgIE46IFtmbHRyLmNsaWNrQWN0aW9uLCAnQ3ljbGUgbm9kZSBsYXllcnMnXSwKICAgICAgICAgICAgTDogW3Rmcy5jeWNsZURldmljZUxhYmVscywgJ0N5Y2xlIGRldmljZSBsYWJlbHMnXSwKICAgICAgICAgICAgVTogW3Rmcy51bnBpbiwgJ1VucGluIG5vZGUgKGhvdmVyIG1vdXNlIG92ZXIpJ10sCiAgICAgICAgICAgIFI6IFtyZXNldFpvb20sICdSZXNldCBwYW4gLyB6b29tJ10sCiAgICAgICAgICAgIGRvdDogW3R0YnMudG9nZ2xlVG9vbGJhciwgJ1RvZ2dsZSBUb29sYmFyJ10sCgogICAgICAgICAgICBFOiBbZXF1YWxpemVNYXN0ZXJzLCAnRXF1YWxpemUgbWFzdGVyc2hpcCByb2xlcyddLAoKICAgICAgICAgICAgLy8gdG9wb2xvZ3kgb3ZlcmxheSBzZWxlY3Rpb25zCiAgICAgICAgICAgIEYxOiBmdW5jdGlvbiAoKSB7IHR0YnMuZm5rZXkoMCk7IH0sCiAgICAgICAgICAgIEYyOiBmdW5jdGlvbiAoKSB7IHR0YnMuZm5rZXkoMSk7IH0sCiAgICAgICAgICAgIEYzOiBmdW5jdGlvbiAoKSB7IHR0YnMuZm5rZXkoMik7IH0sCiAgICAgICAgICAgIEY0OiBmdW5jdGlvbiAoKSB7IHR0YnMuZm5rZXkoMyk7IH0sCiAgICAgICAgICAgIEY1OiBmdW5jdGlvbiAoKSB7IHR0YnMuZm5rZXkoNCk7IH0sCgogICAgICAgICAgICBlc2M6IGhhbmRsZUVzY2FwZSwKCiAgICAgICAgICAgIF9rZXlMaXN0ZW5lcjogdHRicy5rZXlMaXN0ZW5lciwKCiAgICAgICAgICAgIF9oZWxwRm9ybWF0OiBbCiAgICAgICAgICAgICAgICBbJ0knLCAnTycsICdEJywgJ0gnLCAnTScsICdQJywgJ2Rhc2gnLCAnQicsICdTJyBdLAogICAgICAgICAgICAgICAgWydYJywgJ1onLCAnTicsICdMJywgJ1UnLCAnUicsICctJywgJ0UnLCAnLScsICdkb3QnXSwKICAgICAgICAgICAgICAgIFtdICAgLy8gdGhpcyBjb2x1bW4gcmVzZXJ2ZWQgZm9yIG92ZXJsYXkgYWN0aW9ucwogICAgICAgICAgICBdCiAgICAgICAgfTsKCiAgICAgICAgaWYgKGZzLmlzTyhvdmVybGF5S2V5cykpIHsKICAgICAgICAgICAgbWVyZ2VLZXlzKG92ZXJsYXlLZXlzKTsKICAgICAgICB9CgogICAgICAgIGtzLmtleUJpbmRpbmdzKGFjdGlvbk1hcCk7CgogICAgICAgIGtzLmdlc3R1cmVOb3RlcyhbCiAgICAgICAgICAgIFsnY2xpY2snLCAnU2VsZWN0IHRoZSBpdGVtIGFuZCBzaG93IGRldGFpbHMnXSwKICAgICAgICAgICAgWydzaGlmdC1jbGljaycsICdUb2dnbGUgc2VsZWN0aW9uIHN0YXRlJ10sCiAgICAgICAgICAgIFsnZHJhZycsICdSZXBvc2l0aW9uIChhbmQgcGluKSBkZXZpY2UgLyBob3N0J10sCiAgICAgICAgICAgIFsnY21kLXNjcm9sbCcsICdab29tIGluIC8gb3V0J10sCiAgICAgICAgICAgIFsnY21kLWRyYWcnLCAnUGFuJ10KICAgICAgICBdKTsKICAgIH0KCiAgICAvLyB3aGVuIGEgdG9wb2xvZ3kgb3ZlcmxheSBpcyBhY3RpdmF0ZWQsIHdlIG5lZWQgdG8gYmluZCB0aGVpciBrZXlzdHJva2VzCiAgICAvLyBhbmQgaW5jbHVkZSB0aGVtIGluIHRoZSBxdWljay1oZWxwIHBhbmVsCiAgICBmdW5jdGlvbiBtZXJnZUtleXMoZXh0cmEpIHsKICAgICAgICB2YXIgX2hmID0gYWN0aW9uTWFwLl9oZWxwRm9ybWF0WzJdOwoKICAgICAgICBrcy5jaGVja05vdEdsb2JhbChleHRyYSk7CgogICAgICAgIGV4dHJhLl9rZXlPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgIHZhciBkID0gZXh0cmFba10sCiAgICAgICAgICAgICAgICBjYiA9IGQgJiYgZC5jYiwKICAgICAgICAgICAgICAgIHR0ID0gZCAmJiBkLnR0OwogICAgICAgICAgICAvLyBOT1RFOiBpZ25vcmUga2V5cyB0aGF0IGFyZSBhbHJlYWR5IGRlZmluZWQKICAgICAgICAgICAgaWYgKGQgJiYgIWFjdGlvbk1hcFtrXSkgewogICAgICAgICAgICAgICAgYWN0aW9uTWFwW2tdID0gW2NiLCB0dF07CiAgICAgICAgICAgICAgICBfaGYucHVzaChrKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8vIC0tLSBLZXlzdHJva2UgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiB0b2dnbGVJbnN0YW5jZXMoeCkgewogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUoJ2luc3RzJywgdGlzLnRvZ2dsZSh4KSk7CiAgICAgICAgdGZzLnVwZGF0ZURldmljZUNvbG9ycygpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVN1bW1hcnkoeCkgewogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUoJ3N1bW1hcnknLCB0cHMudG9nZ2xlU3VtbWFyeSh4KSk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlVXNlRGV0YWlsc0ZsYWcoeCkgewogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUoJ2RldGFpbCcsIHRwcy50b2dnbGVVc2VEZXRhaWxzRmxhZyh4KSk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlSG9zdHMoeCkgewogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUoJ2hvc3RzJywgdGZzLnRvZ2dsZUhvc3RzKHgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVPZmZsaW5lKHgpIHsKICAgICAgICB1cGRhdGVQcmVmc1N0YXRlKCdvZmZkZXYnLCB0ZnMudG9nZ2xlT2ZmbGluZSh4KSk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlUG9ydHMoeCkgewogICAgICAgIHVwZGF0ZVByZWZzU3RhdGUoJ3BvcnRobCcsIHRmcy50b2dnbGVQb3J0cyh4KSk7CiAgICB9CgogICAgZnVuY3Rpb24gX3RvZ1N2Z0xheWVyKHgsIEcsIHRhZywgd2hhdCkgewogICAgICAgIHZhciBvbiA9ICh4ID09PSAna2V5ZXYnKSA/ICFzdXMudmlzaWJsZShHKSA6ICEheCwKICAgICAgICAgICAgdmVyYiA9IG9uID8gJ1Nob3cnIDogJ0hpZGUnOwogICAgICAgIHN1cy52aXNpYmxlKEcsIG9uKTsKICAgICAgICB1cGRhdGVQcmVmc1N0YXRlKHRhZywgb24pOwogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnICcgKyB3aGF0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVNYXAoeCkgewogICAgICAgIF90b2dTdmdMYXllcih4LCBtYXBHLCAnYmcnLCAnYmFja2dyb3VuZCBtYXAnKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVTcHJpdGVzKHgpIHsKICAgICAgICBfdG9nU3ZnTGF5ZXIoeCwgc3ByaXRlRywgJ3NwcicsICdzcHJpdGUgbGF5ZXInKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNldFpvb20oKSB7CiAgICAgICAgem9vbWVyLnJlc2V0KCk7CiAgICAgICAgZmxhc2guZmxhc2goJ1BhbiBhbmQgem9vbSByZXNldCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVxdWFsaXplTWFzdGVycygpIHsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdlcXVhbGl6ZU1hc3RlcnMnKTsKICAgICAgICBmbGFzaC5mbGFzaCgnRXF1YWxpemluZyBtYXN0ZXIgcm9sZXMnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVFc2NhcGUoKSB7CiAgICAgICAgaWYgKHRpcy5zaG93TWFzdGVyKCkpIHsKICAgICAgICAgICAgLy8gaWYgYW4gaW5zdGFuY2UgaXMgc2VsZWN0ZWQsIGNhbmNlbCB0aGUgYWZmaW5pdHkgbWFwcGluZwogICAgICAgICAgICB0aXMuY2FuY2VsQWZmaW5pdHkoKQoKICAgICAgICB9IGVsc2UgaWYgKHRvdi5ob29rcy5lc2NhcGUoKSkgewogICAgICAgICAgICAvLyBlbHNlIGlmIHRoZSBvdmVybGF5IGNvbnN1bWVkIHRoZSBFU0MgZXZlbnQuLi4KICAgICAgICAgICAgLy8gKHdvcmsgYWxyZWFkeSBkb25lKQoKICAgICAgICB9IGVsc2UgaWYgKHRzcy5kZXNlbGVjdEFsbCgpKSB7CiAgICAgICAgICAgIC8vIGVsc2UgaWYgd2UgaGF2ZSBub2RlIHNlbGVjdGlvbnMsIGRlc2VsZWN0IHRoZW0gYWxsCiAgICAgICAgICAgIC8vICh3b3JrIGFscmVhZHkgZG9uZSkKCiAgICAgICAgfSBlbHNlIGlmICh0bHMuZGVzZWxlY3RMaW5rKCkpIHsKICAgICAgICAgICAgLy8gZWxzZSBpZiB3ZSBoYXZlIGEgbGluayBzZWxlY3RlZCwgZGVzZWxlY3QgaXQKICAgICAgICAgICAgLy8gKHdvcmsgYWxyZWFkeSBkb25lKQoKICAgICAgICB9IGVsc2UgaWYgKHRpcy5pc1Zpc2libGUoKSkgewogICAgICAgICAgICAvLyBlbHNlIGlmIHRoZSBJbnN0YW5jZSBQYW5lbCBpcyB2aXNpYmxlLCBoaWRlIGl0CiAgICAgICAgICAgIHRpcy5oaWRlKCk7CiAgICAgICAgICAgIHRmcy51cGRhdGVEZXZpY2VDb2xvcnMoKTsKCiAgICAgICAgfSBlbHNlIGlmICh0cHMuc3VtbWFyeVZpc2libGUoKSkgewogICAgICAgICAgICAvLyBlbHNlIGlmIHRoZSBTdW1tYXJ5IFBhbmVsIGlzIHZpc2libGUsIGhpZGUgaXQKICAgICAgICAgICAgdHBzLmhpZGVTdW1tYXJ5UGFuZWwoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gLS0tIFRvb2xiYXIgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIG5vdFZhbGlkKHdoYXQpIHsKICAgICAgICAkbG9nLndhcm4oJ3RvcG8uanMgZ2V0QWN0aW9uRW50cnkoKTogTm90IGEgdmFsaWQgJyArIHdoYXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEFjdGlvbkVudHJ5KGtleSkgewogICAgICAgIHZhciBlbnRyeTsKCiAgICAgICAgaWYgKCFrZXkpIHsKICAgICAgICAgICAgbm90VmFsaWQoJ2tleScpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGVudHJ5ID0gYWN0aW9uTWFwW2tleV07CgogICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgICAgbm90VmFsaWQoJ2FjdGlvbk1hcCBlbnRyeScpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZzLmlzQShlbnRyeSkgfHwgW2VudHJ5LCAnJ107CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VXBUb29sYmFyKCkgewogICAgICAgIHR0YnMuaW5pdCh7CiAgICAgICAgICAgIGdldEFjdGlvbkVudHJ5OiBnZXRBY3Rpb25FbnRyeSwKICAgICAgICAgICAgc2V0VXBLZXlzOiBzZXRVcEtleXMKICAgICAgICB9KTsKICAgICAgICB0dGJzLmNyZWF0ZVRvb2xiYXIoKTsKICAgIH0KCiAgICAvLyAtLS0gR2x5cGhzLCBJY29ucywgYW5kIHRoZSBsaWtlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gc2V0VXBEZWZzKCkgewogICAgICAgIGRlZnMgPSBzdmcuYXBwZW5kKCdkZWZzJyk7CiAgICAgICAgZ3MubG9hZERlZnMoZGVmcyk7CiAgICAgICAgc3VzLmxvYWRHbG93RGVmcyhkZWZzKTsKICAgIH0KCgogICAgLy8gLS0tIFBhbiBhbmQgWm9vbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8vIHpvb20gZW5hYmxlZCBwcmVkaWNhdGUuIGV2IGlzIGEgRDMgc291cmNlIGV2ZW50LgogICAgZnVuY3Rpb24gem9vbUVuYWJsZWQoZXYpIHsKICAgICAgICByZXR1cm4gZnMuaXNNb2JpbGUoKSB8fCAoZXYubWV0YUtleSB8fCBldi5hbHRLZXkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHpvb21DYWxsYmFjaygpIHsKICAgICAgICB2YXIgc2MgPSB6b29tZXIuc2NhbGUoKSwKICAgICAgICAgICAgdHIgPSB6b29tZXIudHJhbnNsYXRlKCk7CgogICAgICAgIHBzLnNldFByZWZzKCd0b3BvX3pvb20nLCB7dHg6dHJbMF0sIHR5OnRyWzFdLCBzYzpzY30pOwoKICAgICAgICAvLyBrZWVwIHRoZSBtYXAgbGluZXMgY29uc3RhbnQgd2lkdGggd2hpbGUgem9vbWluZwogICAgICAgIG1hcEcuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICgyLjAgLyBzYykgKyAncHgnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRVcFpvb20oKSB7CiAgICAgICAgem9vbUxheWVyID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tem9vbWxheWVyJyk7CiAgICAgICAgem9vbWVyID0genMuY3JlYXRlWm9vbWVyKHsKICAgICAgICAgICAgc3ZnOiBzdmcsCiAgICAgICAgICAgIHpvb21MYXllcjogem9vbUxheWVyLAogICAgICAgICAgICB6b29tRW5hYmxlZDogem9vbUVuYWJsZWQsCiAgICAgICAgICAgIHpvb21DYWxsYmFjazogem9vbUNhbGxiYWNrCiAgICAgICAgfSk7CiAgICB9CgoKICAgIC8vIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgU1ZHIHZpZXcgaGFzIGJlZW4gcmVzaXplZC4uCiAgICBmdW5jdGlvbiBzdmdSZXNpemVkKHMpIHsKICAgICAgICB0ZnMubmV3RGltKFtzLndpZHRoLCBzLmhlaWdodF0pOwogICAgfQoKICAgIC8vIC0tLSBCYWNrZ3JvdW5kIE1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiBzZXRVcE5vRGV2cygpIHsKICAgICAgICB2YXIgZywgYm94OwogICAgICAgIG5vRGV2c0xheWVyID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoewogICAgICAgICAgICBpZDogJ3RvcG8tbm9EZXZzTGF5ZXInLAogICAgICAgICAgICB0cmFuc2Zvcm06IHN1cy50cmFuc2xhdGUoNTAwLDUwMCkKICAgICAgICB9KTsKICAgICAgICAvLyBOb3RlLCBTVkcgdmlld2JveCBpcyAnMCAwIDEwMDAgMTAwMCcsIGRlZmluZWQgaW4gdG9wby5odG1sLgogICAgICAgIC8vIFdlIGFyZSB0cmFuc2xhdGluZyB0aGlzIGxheWVyIHRvIGhhdmUgaXRzIG9yaWdpbiBhdCB0aGUgY2VudGVyCgogICAgICAgIGcgPSBub0RldnNMYXllci5hcHBlbmQoJ2cnKTsKICAgICAgICBncy5hZGRHbHlwaChnLCAnYmlyZCcsIDEwMCkuYXR0cignY2xhc3MnLCAnbm9EZXZzQmlyZCcpOwogICAgICAgIGcuYXBwZW5kKCd0ZXh0JykudGV4dCgnTm8gZGV2aWNlcyBhcmUgY29ubmVjdGVkJykKICAgICAgICAgICAgLmF0dHIoeyB4OiAxMjAsIHk6IDgwfSk7CgogICAgICAgIGJveCA9IGcubm9kZSgpLmdldEJCb3goKTsKICAgICAgICBib3gueCAtPSBib3gud2lkdGgvMjsKICAgICAgICBib3gueSAtPSBib3guaGVpZ2h0LzI7CiAgICAgICAgZy5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKGJveC54LCBib3gueSkpOwoKICAgICAgICBzaG93Tm9EZXZzKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dOb0RldnMoYikgewogICAgICAgIHN1cy52aXNpYmxlKG5vRGV2c0xheWVyLCBiKTsKICAgIH0KCgogICAgdmFyIGNvdW50cnlGaWx0ZXJzID0gewogICAgICAgIHdvcmxkOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmNvbnRpbmVudCAhPT0gJ0FudGFyY3RpY2EnOwogICAgICAgIH0sCgogICAgICAgIC8vIE5PVEU6IGZvciAidXNhIiB3ZSBhcmUgdXNpbmcgb3VyIGhhbmQtY3JhZnRlZCB0b3BvanNvbiBmaWxlCgogICAgICAgIHNfYW1lcmljYTogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5jb250aW5lbnQgPT09ICdTb3V0aCBBbWVyaWNhJzsKICAgICAgICB9LAoKICAgICAgICBuc19hbWVyaWNhOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmN1c3RvbSA9PT0gJ1VTLWNvbnQnIHx8CiAgICAgICAgICAgICAgICBjLnByb3BlcnRpZXMuc3VicmVnaW9uID09PSAnQ2VudHJhbCBBbWVyaWNhJyB8fAogICAgICAgICAgICAgICAgYy5wcm9wZXJ0aWVzLmNvbnRpbmVudCA9PT0gJ1NvdXRoIEFtZXJpY2EnOwogICAgICAgIH0sCgogICAgICAgIGphcGFuOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmdlb3VuaXQgPT09ICdKYXBhbic7CiAgICAgICAgfSwKCiAgICAgICAgZXVyb3BlOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmNvbnRpbmVudCA9PT0gJ0V1cm9wZSc7CiAgICAgICAgfSwKCiAgICAgICAgaXRhbHk6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgIHJldHVybiBjLnByb3BlcnRpZXMuZ2VvdW5pdCA9PT0gJ0l0YWx5JzsKICAgICAgICB9LAoKICAgICAgICB1azogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgLy8gdGVjaG5pY2FsbHksIElyZWxhbmQgaXMgbm90IHBhcnQgb2YgdGhlIFVuaXRlZCBLaW5nZG9tLAogICAgICAgICAgICAvLyBidXQgdGhlIG1hcCBsb29rcyB3ZWlyZCB3aXRob3V0IGl0IHNob3dpbmcuCiAgICAgICAgICAgIHJldHVybiBjLnByb3BlcnRpZXMuYWRtMF9hMyA9PT0gJ0dCUicgfHwKICAgICAgICAgICAgICAgIGMucHJvcGVydGllcy5hZG0wX2EzID09PSAnSVJMJzsKICAgICAgICB9LAoKICAgICAgICBzX2tvcmVhOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gYy5wcm9wZXJ0aWVzLmFkbTBfYTMgPT09ICdLT1InOwogICAgICAgIH0sCgogICAgICAgIGF1c3RyYWxpYTogZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGMucHJvcGVydGllcy5hZG0wX2EzID09PSAnQVVTJzsKICAgICAgICB9CiAgICB9OwoKCiAgICBmdW5jdGlvbiBzZXRVcE1hcCgkbG9jKSB7CiAgICAgICAgdmFyIHMxID0gJGxvYy5zZWFyY2goKS5tYXBpZCwKICAgICAgICAgICAgczIgPSBwcy5nZXRQcmVmcygndG9wb19tYXBpZCcpLAogICAgICAgICAgICBtYXBJZCA9IHMxIHx8IChzMiAmJiBzMi5pZCkgfHwgJ3VzYScsCiAgICAgICAgICAgIHByb21pc2UsCiAgICAgICAgICAgIGNmaWx0ZXIsCiAgICAgICAgICAgIG9wdHM7CgogICAgICAgIG1hcEcgPSB6b29tTGF5ZXIuYXBwZW5kKCdnJykuYXR0cignaWQnLCAndG9wby1tYXAnKTsKICAgICAgICBpZiAobWFwSWQgPT09ICd1c2EnKSB7CiAgICAgICAgICAgIHByb21pc2UgPSBtcy5sb2FkTWFwSW50byhtYXBHLCAnKmNvbnRpbmVudGFsX3VzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHMuc2V0UHJlZnMoJ3RvcG9fbWFwaWQnLCB7aWQ6bWFwSWR9KTsKICAgICAgICAgICAgY2ZpbHRlciA9IGNvdW50cnlGaWx0ZXJzW21hcElkXSB8fCBjb3VudHJ5RmlsdGVycy53b3JsZDsKICAgICAgICAgICAgb3B0cyA9IHsgY291bnRyeUZpbHRlcjogY2ZpbHRlciB9OwogICAgICAgICAgICBwcm9taXNlID0gbXMubG9hZE1hcFJlZ2lvbkludG8obWFwRywgb3B0cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9taXNlOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wYWNpZnlNYXAoYikgewogICAgICAgIG1hcEcudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbigxMDAwKQogICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIGIgPyAxIDogMCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VXBTcHJpdGVzKCRsb2MsIHRzcHIpIHsKICAgICAgICB2YXIgczEgPSAkbG9jLnNlYXJjaCgpLnNwcml0ZXMsCiAgICAgICAgICAgIHMyID0gcHMuZ2V0UHJlZnMoJ3RvcG9fc3ByaXRlcycpLAogICAgICAgICAgICBzcHJJZCA9IHMxIHx8IChzMiAmJiBzMi5pZCk7CgogICAgICAgIHNwcml0ZUcgPSB6b29tTGF5ZXIuYXBwZW5kICgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tc3ByaXRlcycpOwogICAgICAgIGlmIChzcHJJZCkgewogICAgICAgICAgICBwcy5zZXRQcmVmcygndG9wb19zcHJpdGVzJywge2lkOnNwcklkfSk7CiAgICAgICAgICAgIHRzcHIubG9hZFNwcml0ZXMoc3ByaXRlRywgZGVmcywgc3BySWQpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0gVXNlciBQcmVmZXJlbWNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgdmFyIHByZWZzU3RhdGUgPSB7fTsKCiAgICBmdW5jdGlvbiB1cGRhdGVQcmVmc1N0YXRlKHdoYXQsIGIpIHsKICAgICAgICBwcmVmc1N0YXRlW3doYXRdID0gYiA/IDEgOiAwOwogICAgICAgIHBzLnNldFByZWZzKCd0b3BvX3ByZWZzJywgcHJlZnNTdGF0ZSk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHJlc3RvcmVDb25maWdGcm9tUHJlZnMoKSB7CiAgICAgICAgLy8gTk9URTogdG9vbGJhciB3aWxsIGhhdmUgc2V0IHRoaXMgZm9yIHVzLi4KICAgICAgICBwcmVmc1N0YXRlID0gcHMuYXNOdW1iZXJzKHBzLmdldFByZWZzKCd0b3BvX3ByZWZzJykpOwoKICAgICAgICAkbG9nLmRlYnVnKCdUT1BPLSBQcmVmcyBTdGF0ZTonLCBwcmVmc1N0YXRlKTsKCiAgICAgICAgZmxhc2guZW5hYmxlKGZhbHNlKTsKICAgICAgICB0b2dnbGVJbnN0YW5jZXMocHJlZnNTdGF0ZS5pbnN0cyk7CiAgICAgICAgdG9nZ2xlU3VtbWFyeShwcmVmc1N0YXRlLnN1bW1hcnkpOwogICAgICAgIHRvZ2dsZVVzZURldGFpbHNGbGFnKHByZWZzU3RhdGUuZGV0YWlsKTsKICAgICAgICB0b2dnbGVIb3N0cyhwcmVmc1N0YXRlLmhvc3RzKTsKICAgICAgICB0b2dnbGVPZmZsaW5lKHByZWZzU3RhdGUub2ZmZGV2KTsKICAgICAgICB0b2dnbGVQb3J0cyhwcmVmc1N0YXRlLnBvcnRobCk7CiAgICAgICAgdG9nZ2xlTWFwKHByZWZzU3RhdGUuYmcpOwogICAgICAgIHRvZ2dsZVNwcml0ZXMocHJlZnNTdGF0ZS5zcHIpOwogICAgICAgIGZsYXNoLmVuYWJsZSh0cnVlKTsKICAgIH0KCgogICAgLy8gc29tZXdoYXQgaGFja2lzaCwgYmVjYXVzZSBzdW1tYXJ5IHVwZGF0ZSBjYW5ub3QgaGFwcGVuIHVudGlsIHdlCiAgICAvLyAgaGF2ZSBvcGVuZWQgdGhlIHdlYnNvY2tldCB0byB0aGUgc2VydmVyOyBoZW5jZSB0aGlzIGV4dHJhIGZ1bmN0aW9uCiAgICAvLyBpbnZva2VkIGFmdGVyIHRlcy5zdGFydCgpCiAgICBmdW5jdGlvbiByZXN0b3JlU3VtbWFyeUZyb21QcmVmcygpIHsKICAgICAgICBwcmVmc1N0YXRlID0gcHMuYXNOdW1iZXJzKHBzLmdldFByZWZzKCd0b3BvX3ByZWZzJykpOwogICAgICAgICRsb2cuZGVidWcoJ1RPUE8tIFByZWZzIFNVTU1BUlkgU3RhdGU6JywgcHJlZnNTdGF0ZS5zdW1tYXJ5KTsKCiAgICAgICAgZmxhc2guZW5hYmxlKGZhbHNlKTsKICAgICAgICB0b2dnbGVTdW1tYXJ5KHByZWZzU3RhdGUuc3VtbWFyeSk7CiAgICAgICAgZmxhc2guZW5hYmxlKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvcG9TdGFydERvbmUoKSB7CiAgICAgICAgdmFyIGQgPSAkc2NvcGUuaW50ZW50RGF0YTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICB0dHMuc2VsZWN0SW50ZW50KGQpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0gQ29udHJvbGxlciBEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycsIG1vZHVsZURlcGVuZGVuY2llcykKICAgICAgICAuY29udHJvbGxlcignT3ZUb3BvQ3RybCcsIFsnJHNjb3BlJywgJyRsb2cnLCAnJGxvY2F0aW9uJywgJyR0aW1lb3V0JywKICAgICAgICAgICAgJyRjb29raWVzJywgJ0ZuU2VydmljZScsICdNYXN0U2VydmljZScsICdLZXlTZXJ2aWNlJywgJ1pvb21TZXJ2aWNlJywKICAgICAgICAgICAgJ0dseXBoU2VydmljZScsICdNYXBTZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsCiAgICAgICAgICAgICdXZWJTb2NrZXRTZXJ2aWNlJywgJ1ByZWZzU2VydmljZScsICdUb3BvRGlhbG9nU2VydmljZScsCiAgICAgICAgICAgICdUb3BvRXZlbnRTZXJ2aWNlJywgJ1RvcG9Gb3JjZVNlcnZpY2UnLCAnVG9wb1BhbmVsU2VydmljZScsCiAgICAgICAgICAgICdUb3BvSW5zdFNlcnZpY2UnLCAnVG9wb1NlbGVjdFNlcnZpY2UnLCAnVG9wb0xpbmtTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9UcmFmZmljU2VydmljZScsICdUb3BvT2JsaXF1ZVNlcnZpY2UnLCAnVG9wb0ZpbHRlclNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1Rvb2xiYXJTZXJ2aWNlJywgJ1RvcG9TcHJpdGVTZXJ2aWNlJywgJ1Rvb2x0aXBTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9PdmVybGF5U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJHNjb3BlXywgXyRsb2dfLCAkbG9jLCAkdGltZW91dCwgXyRjb29raWVzXywgX2ZzXywgbWFzdCwgX2tzXywKICAgICAgICAgICAgICAgICAgX3pzXywgX2dzXywgX21zXywgX3N1c18sIF9mbGFzaF8sIF93c3NfLCBfcHNfLCBfdGRzXywgX3Rlc18sCiAgICAgICAgICAgICAgICAgIF90ZnNfLCBfdHBzXywgX3Rpc18sIF90c3NfLCBfdGxzXywgX3R0c18sIF90b3NfLCBfZmx0cl8sCiAgICAgICAgICAgICAgICAgIF90dGJzXywgdHNwciwgX3R0aXBfLCBfdG92XykgewogICAgICAgICAgICB2YXIgcGFyYW1zID0gJGxvYy5zZWFyY2goKSwKICAgICAgICAgICAgICAgIHByb2plY3Rpb24sCiAgICAgICAgICAgICAgICBkaW0sCiAgICAgICAgICAgICAgICB1cGxpbmsgPSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZXMgZnVuY3Rpb24gY2FsbHMgYmFjayBpbnRvIHRoaXMgc3BhY2UKICAgICAgICAgICAgICAgICAgICBzaG93Tm9EZXZzOiBzaG93Tm9EZXZzLAogICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb246IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb2plY3Rpb247IH0sCiAgICAgICAgICAgICAgICAgICAgem9vbUxheWVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiB6b29tTGF5ZXI7IH0sCiAgICAgICAgICAgICAgICAgICAgem9vbWVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiB6b29tZXI7IH0sCiAgICAgICAgICAgICAgICAgICAgb3BhY2lmeU1hcDogb3BhY2lmeU1hcCwKICAgICAgICAgICAgICAgICAgICB0b3BvU3RhcnREb25lOiB0b3BvU3RhcnREb25lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRjb29raWVzID0gXyRjb29raWVzXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBrcyA9IF9rc187CiAgICAgICAgICAgIHpzID0gX3pzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwogICAgICAgICAgICBtcyA9IF9tc187CiAgICAgICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICBwcyA9IF9wc187CiAgICAgICAgICAgIHRkcyA9IF90ZHNfOwogICAgICAgICAgICB0ZXMgPSBfdGVzXzsKICAgICAgICAgICAgdGZzID0gX3Rmc187CiAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGZ1bm5lbGxpbmcgYWN0aW9ucyB0aHJvdWdoIFRvcG9Gb3JjZVNlcnZpY2UuLi4KICAgICAgICAgICAgLy8gIHJhdGhlciB0aGFuIGluamVjdGluZyByZWZlcmVuY2VzIHRvIHRoZXNlICdzdWItbW9kdWxlcycsCiAgICAgICAgICAgIC8vICBqdXN0IHNvIHdlIGNhbiBpbnZva2UgZnVuY3Rpb25zIG9uIHRoZW0uCiAgICAgICAgICAgIHRwcyA9IF90cHNfOwogICAgICAgICAgICB0aXMgPSBfdGlzXzsKICAgICAgICAgICAgdHNzID0gX3Rzc187CiAgICAgICAgICAgIHRscyA9IF90bHNfOwogICAgICAgICAgICB0dHMgPSBfdHRzXzsKICAgICAgICAgICAgdG9zID0gX3Rvc187CiAgICAgICAgICAgIGZsdHIgPSBfZmx0cl87CiAgICAgICAgICAgIHR0YnMgPSBfdHRic187CiAgICAgICAgICAgIHR0aXAgPSBfdHRpcF87CiAgICAgICAgICAgIHRvdiA9IF90b3ZfOwoKICAgICAgICAgICAgaWYgKHBhcmFtcy5pbnRlbnRLZXkgJiYgcGFyYW1zLmludGVudEFwcElkICYmIHBhcmFtcy5pbnRlbnRBcHBOYW1lKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuaW50ZW50RGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBrZXk6IHBhcmFtcy5pbnRlbnRLZXksCiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6IHBhcmFtcy5pbnRlbnRBcHBJZCwKICAgICAgICAgICAgICAgICAgICBhcHBOYW1lOiBwYXJhbXMuaW50ZW50QXBwTmFtZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNjb3BlLm5vdGlmeVJlc2l6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHN2Z1Jlc2l6ZWQoZnMud2luZG93U2l6ZShtYXN0Lm1hc3RIZWlnaHQoKSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95ZWQgc2NvcGUuLgogICAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICRsb2cubG9nKCdPdlRvcG9DdHJsIGlzIHNheWluZyBCdWgtQnllIScpOwogICAgICAgICAgICAgICAgdGVzLnN0b3AoKTsKICAgICAgICAgICAgICAgIGtzLnVuYmluZEtleXMoKTsKICAgICAgICAgICAgICAgIHRwcy5kZXN0cm95UGFuZWxzKCk7CiAgICAgICAgICAgICAgICB0ZHMuY2xvc2VEaWFsb2coKTsKICAgICAgICAgICAgICAgIHRpcy5kZXN0cm95SW5zdCgpOwogICAgICAgICAgICAgICAgdGZzLmRlc3Ryb3lGb3JjZSgpOwogICAgICAgICAgICAgICAgdHRicy5kZXN0cm95VG9vbGJhcigpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHN2ZyBsYXllciBhbmQgaW5pdGlhbGl6YXRpb24gb2YgY29tcG9uZW50cwogICAgICAgICAgICBvdnRvcG8gPSBkMy5zZWxlY3QoJyNvdi10b3BvJyk7CiAgICAgICAgICAgIHN2ZyA9IG92dG9wby5zZWxlY3QoJ3N2ZycpOwogICAgICAgICAgICAvLyBzZXQgdGhlIHN2ZyBzaXplIHRvIG1hdGNoIHRoYXQgb2YgdGhlIHdpbmRvdywgbGVzcyB0aGUgbWFzdGhlYWQKICAgICAgICAgICAgc3ZnLmF0dHIoZnMud2luZG93U2l6ZShtYXN0Lm1hc3RIZWlnaHQoKSkpOwogICAgICAgICAgICBkaW0gPSBbc3ZnLmF0dHIoJ3dpZHRoJyksIHN2Zy5hdHRyKCdoZWlnaHQnKV07CgogICAgICAgICAgICBzZXRVcEtleXMoKTsKICAgICAgICAgICAgc2V0VXBUb29sYmFyKCk7CiAgICAgICAgICAgIHNldFVwRGVmcygpOwogICAgICAgICAgICBzZXRVcFpvb20oKTsKICAgICAgICAgICAgc2V0VXBOb0RldnMoKTsKICAgICAgICAgICAgc2V0VXBNYXAoJGxvYykudGhlbigKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChwcm9qKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHogPSBwcy5nZXRQcmVmcygndG9wb196b29tJykgfHwge3R4OjAsIHR5OjAsIHNjOjF9OwogICAgICAgICAgICAgICAgICAgIHpvb21lci5wYW5ab29tKFt6LnR4LCB6LnR5XSwgei5zYyk7CiAgICAgICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnKiogWm9vbSByZXN0b3JlZDonLCB6KTsKCiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiA9IHByb2o7CiAgICAgICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnKiogV2UgaW5zdGFsbGVkIHRoZSBwcm9qZWN0aW9uOicsIHByb2opOwogICAgICAgICAgICAgICAgICAgIGZsYXNoLmVuYWJsZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlTWFwKHByZWZzU3RhdGUuYmcpOwogICAgICAgICAgICAgICAgICAgIGZsYXNoLmVuYWJsZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIGhhdmUgdGhlIG1hcCBwcm9qZWN0aW9uLCB3ZSBhcmUgcmVhZHkgZm9yCiAgICAgICAgICAgICAgICAgICAgLy8gIHRoZSBzZXJ2ZXIgdG8gc2VuZCB1cyBkZXZpY2UvaG9zdCBkYXRhLi4uCiAgICAgICAgICAgICAgICAgICAgdGVzLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIHNvIHdlIGltbWVkaWF0ZWx5IGdldAogICAgICAgICAgICAgICAgICAgIC8vICB0aGUgc3VtbWFyeSBwYW5lbCBkYXRhIGJhY2sgZnJvbSB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVN1bW1hcnlGcm9tUHJlZnMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgc2V0VXBTcHJpdGVzKCRsb2MsIHRzcHIpOwoKICAgICAgICAgICAgZm9yY2VHID0gem9vbUxheWVyLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tZm9yY2UnKTsKICAgICAgICAgICAgdGZzLmluaXRGb3JjZShzdmcsIGZvcmNlRywgdXBsaW5rLCBkaW0pOwogICAgICAgICAgICB0aXMuaW5pdEluc3QoeyBzaG93TWFzdGVyc2hpcDogdGZzLnNob3dNYXN0ZXJzaGlwIH0pOwogICAgICAgICAgICB0cHMuaW5pdFBhbmVscygpOwoKICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHNvbHV0aW9uIGZvciBwZXJzaXN0aW5nIHVzZXIgc2V0dGluZ3MKICAgICAgICAgICAgcmVzdG9yZUNvbmZpZ0Zyb21QcmVmcygpOwogICAgICAgICAgICB0dGJzLnNldERlZmF1bHRPdmVybGF5KCk7CgogICAgICAgICAgICAkbG9nLmRlYnVnKCdyZWdpc3RlcmVkIG92ZXJsYXlzLi4uJywgdG92Lmxpc3QoKSk7CiAgICAgICAgICAgICRsb2cubG9nKCdPdlRvcG9DdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSk7Cn0oKSk7Cozc71bg4wQAjQIAAI0CAAAIACetHhNo9ygf0sUIAEUAAn+35kAAQAbwq8CoBzbAqAdglSof9cbo9SqTprZ6gBgCpjs3AAABAQgKAKNe9QBNpfBHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvRDMuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71by4wQAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8Y0AAQAZuesCoBzbAqAdglSIf9Vh6iSRBwRTEgBAM3OboAAABAQgKAKNe9QBNpfCM3O9WIusEAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5buJAAEAGO/bAqAdgwKgHNh/1lSxw2C6uBQnLoIAYASiQEgAAAQEICgBNpfEAo17vMA0KDQqM3O9WuewEAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05JdAAEAGxkXAqAc2wKgHYJUsH/UFCcugcNgus4AQAnq5MgAAAQEICgCjXvUATaXtjNzvVnLuBACQAgAAkAIAAAgAJ60eE2j3KB/SxQgARQACguSYQABABsP2wKgHNsCoB2CVLB/1BQnLoHDYLrOAGAJ6U1IAAAEBCAoAo171AE2l7UdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9FdmVudC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVlXwBACRAgAAkQIAAAgAJ60eE2j3KB/SxQgARQACgzxkQABABmwqwKgHNsCoB2CVIh/1WHqJJEHBFMSAGA0O9REAAAEBCAoAo172AE2l8EdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9EaWFsb2cuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71Yi9AQARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADk3u0AAQAZzHcCoB2DAqAc2H/WVJzlWG1jbkovQgBgBPJASAAABAQgKAE2l8QCjXvEwDQoNCozc71bu9QQAkQIAAJECAAAIACetHhNo9ygf0sUIAEUAAoMt/UAAQAZ6kcCoBzbAqAdglScf9duSi9A5VhtdgBgPM1vxAAABAQgKAKNe9gBNpfFHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvRmlsdGVyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WywIFANonAADaJwAAaPcoH9LFCAAnrR4TCABFACfMjW9AAEAG9dXAqAdgwKgHNh/1lS2mkqc5T9m4M4AQAUa3pQAAAQEICgBNpfIAo17zSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMjdBNA0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTGF5ZXIgLS0gUXVpY2sgSGVscCBTZXJ2aWNlCgogUHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGlzcGxheSBrZXkgYmluZGluZ3MgYW5kIG1vdXNlIGdlc3R1cmUgbm90ZXMuCiAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCBmcywgc3VzOwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciBkZWZhdWx0U2V0dGluZ3MgPSB7CiAgICAgICAgICAgIGZhZGU6IDUwMAogICAgICAgIH0sCiAgICAgICAgdyA9ICcxMDAlJywKICAgICAgICBoID0gJzgwJScsCiAgICAgICAgdmJveCA9ICctMjAwIDAgNDAwIDQwMCcsCiAgICAgICAgcGFkID0gMTAsCiAgICAgICAgb2ZmeSA9IDQ1LAogICAgICAgIHNlcFlEZWx0YSA9IDIwLAogICAgICAgIGNvbFhEZWx0YSA9IDE2LAogICAgICAgIHlUZXh0U3BjID0gMTIsCiAgICAgICAgb2ZmRGVzYyA9IDg7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBzZXR0aW5ncywKICAgICAgICBkYXRhID0gW10sCiAgICAgICAgeUNvdW50OwoKICAgIC8vIERPTSBlbGVtZW50cwogICAgdmFyIHFoZGl2LCBzdmcsIHBhbmUsIHJlY3QsIGl0ZW1zOwoKICAgIC8vIGtleS1sb2dpY2FsLW5hbWUgdG8ga2V5LWRpc3BsYXkgbG9va3VwLi4KICAgIHZhciBrZXlEaXNwID0gewogICAgICAgIGVxdWFsczogJz0nLAogICAgICAgIHNsYXNoOiAnLycsCiAgICAgICAgYmFja1NsYXNoOiAnXFwnLAogICAgICAgIGJhY2tRdW90ZTogJ2AnLAogICAgICAgIGxlZnRBcnJvdzogJ0wtYXJyb3cnLAogICAgICAgIHVwQXJyb3c6ICdVLWFycm93JywKICAgICAgICByaWdodEFycm93OiAnUi1hcnJvdycsCiAgICAgICAgZG93bkFycm93OiAnRC1hcnJvdycKICAgIH07CgogICAgLy8gbGlzdCBvZiBuZWVkZWQgYmluZGluZ3MgdG8gdXNlIGluIGFnZ3JlZ2F0ZURhdGEKICAgIHZhciBuZWVkZWRCaW5kaW5ncyA9IFsKICAgICAgICAnZ2xvYmFsS2V5cycsICdnbG9iYWxGb3JtYXQnLCAndmlld0tleXMnLCAndmlld0dlc3R1cmVzJwogICAgXTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyA9PT0gRnVuY3Rpb24gRGVmaW5pdGlvbnMgPT09CgogICAgZnVuY3Rpb24gbWtLZXlEaXNwKGlkKSB7CiAgICAgICAgdmFyIHYgPSBrZXlEaXNwW2lkXSB8fCBpZDsKICAgICAgICByZXR1cm4gZnMuY2FwKHYpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFNlcGFyYXRvcihlbCwgaSkgewogICAgICAgIHZhciB5ID0gc2VwWURlbHRhLzIgLSA1OwogICAgICAgIGVsLmFwcGVuZCgnbGluZScpCiAgICAgICAgICAgIC5hdHRyKHsgJ2NsYXNzJzogJ3Focm93c2VwJywgeDE6IDAsIHkxOiB5LCB4MjogMCwgeTI6IHkgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQ29udGVudChlbCwgZGF0YSwgcmkpIHsKICAgICAgICB2YXIgeENvdW50ID0gMCwKICAgICAgICAgICAgY2xzUGZ4ID0gJ3FoLXInICsgcmkgKyAnLWMnOwoKICAgICAgICBmdW5jdGlvbiBhZGRDb2x1bW4oZWwsIGMsIGkpIHsKICAgICAgICAgICAgdmFyIGNscyA9IGNsc1BmeCArIGksCiAgICAgICAgICAgICAgICBveSA9IDAsCiAgICAgICAgICAgICAgICBhZ2dLZXkgPSBlbC5hcHBlbmQoJ2cnKS5hdHRyKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpLAogICAgICAgICAgICAgICAgZ2NvbCA9IGVsLmFwcGVuZCgnZycpLmF0dHIoewogICAgICAgICAgICAgICAgICAgICdjbGFzcyc6IGNscywKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHN1cy50cmFuc2xhdGUoeENvdW50LCAwKQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjLmZvckVhY2goZnVuY3Rpb24gKGopIHsKICAgICAgICAgICAgICAgIHZhciBrID0galswXSwKICAgICAgICAgICAgICAgICAgICB2ID0galsxXTsKCiAgICAgICAgICAgICAgICBpZiAoayAhPT0gJy0nKSB7CiAgICAgICAgICAgICAgICAgICAgYWdnS2V5LmFwcGVuZCgndGV4dCcpLnRleHQoayk7CgogICAgICAgICAgICAgICAgICAgIGdjb2wuYXBwZW5kKCd0ZXh0JykudGV4dChrKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3MnOiAna2V5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IG95CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGdjb2wuYXBwZW5kKCd0ZXh0JykudGV4dCh2KQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3MnOiAnZGVzYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBveQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBveSArPSB5VGV4dFNwYzsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBhZGp1c3QgcG9zaXRpb24gb2YgZGVzY3JpcHRpb25zLCBiYXNlZCBvbiB3aWRlc3Qga2V5CiAgICAgICAgICAgIHZhciBrYm94ID0gYWdnS2V5Lm5vZGUoKS5nZXRCQm94KCksCiAgICAgICAgICAgICAgICBveCA9IGtib3gud2lkdGggKyBvZmZEZXNjOwogICAgICAgICAgICBnY29sLnNlbGVjdEFsbCgnLmRlc2MnKS5hdHRyKCd4Jywgb3gpOwogICAgICAgICAgICBhZ2dLZXkucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBub3cgdXBkYXRlIHgtb2Zmc2V0IGZvciBuZXh0IGNvbHVtbgogICAgICAgICAgICB2YXIgYmJveCA9IGdjb2wubm9kZSgpLmdldEJCb3goKTsKICAgICAgICAgICAgeENvdW50ICs9IGJib3gud2lkdGggKyBjb2xYRGVsdGE7CiAgICAgICAgfQoKICAgICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgYWRkQ29sdW1uKGVsLCBkLCBpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gZmluYWxseSwgcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHJvdy4uCiAgICAgICAgcmV0dXJuIGVsLm5vZGUoKS5nZXRCQm94KCkuaGVpZ2h0OwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUtleUl0ZW1zKCkgewogICAgICAgIHZhciByb3dzID0gaXRlbXMuc2VsZWN0QWxsKCcucWhSb3cnKS5kYXRhKGRhdGEpOwoKICAgICAgICB5Q291bnQgPSBvZmZ5OwoKICAgICAgICB2YXIgZW50ZXJpbmcgPSByb3dzLmVudGVyKCkKICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5hdHRyKHsKICAgICAgICAgICAgICAgICdjbGFzcyc6ICdxaHJvdycKICAgICAgICAgICAgfSk7CgogICAgICAgIGVudGVyaW5nLmVhY2goZnVuY3Rpb24gKHIsIGkpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgc2VwID0gci50eXBlID09PSAnc2VwJywKICAgICAgICAgICAgICAgIGR5OwoKICAgICAgICAgICAgZWwuYXR0cigndHJhbnNmb3JtJywgc3VzLnRyYW5zbGF0ZSgwLCB5Q291bnQpKTsKCiAgICAgICAgICAgIGlmIChzZXApIHsKICAgICAgICAgICAgICAgIGFkZFNlcGFyYXRvcihlbCwgaSk7CiAgICAgICAgICAgICAgICB5Q291bnQgKz0gc2VwWURlbHRhOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZHkgPSBhZGRDb250ZW50KGVsLCByLmRhdGEsIGkpOwogICAgICAgICAgICAgICAgeUNvdW50ICs9IGR5OwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIHNpemUgdGhlIGJhY2tpbmcgcmVjdGFuZ2xlCiAgICAgICAgdmFyIGlib3ggPSBpdGVtcy5ub2RlKCkuZ2V0QkJveCgpLAogICAgICAgICAgICBwYW5lVyA9IGlib3gud2lkdGggKyBwYWQgKiAyLAogICAgICAgICAgICBwYW5lSCA9IGlib3guaGVpZ2h0ICsgb2ZmeTsKCiAgICAgICAgaXRlbXMuc2VsZWN0QWxsKCcucWhyb3dzZXAnKS5hdHRyKCd4MicsIGlib3gud2lkdGgpOwogICAgICAgIGl0ZW1zLmF0dHIoJ3RyYW5zZm9ybScsIHN1cy50cmFuc2xhdGUoLXBhbmVXLzIsIC1wYWQpKTsKICAgICAgICByZWN0LmF0dHIoewogICAgICAgICAgICB3aWR0aDogcGFuZVcsCiAgICAgICAgICAgIGhlaWdodDogcGFuZUgsCiAgICAgICAgICAgIHRyYW5zZm9ybTogc3VzLnRyYW5zbGF0ZSgtcGFuZVcvMi1wYWQsIDApCiAgICAgICAgfSk7CgogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrRm10KGZtdCkgewogICAgICAgIC8vIHNob3VsZCBiZSBhIHNpbmdsZSBhcnJheSBvZiBrZXlzLAogICAgICAgIC8vIG9yIGFycmF5IG9mIGFycmF5cyBvZiBrZXlzIChvbmUgcGVyIGNvbHVtbikuCiAgICAgICAgLy8gcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgogICAgICAgIHZhciBhID0gZnMuaXNBKGZtdCksCiAgICAgICAgICAgIG4gPSBhICYmIGEubGVuZ3RoLAogICAgICAgICAgICBucyA9IDAsCiAgICAgICAgICAgIG5hID0gMDsKCiAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgLy8gaXQgaXMgYW4gYXJyYXkgd2hpY2ggaGFzIHNvbWUgY29udGVudAogICAgICAgICAgICBhLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIGZzLmlzQShkKSAmJiBuYSsrOwogICAgICAgICAgICAgICAgZnMuaXNTKGQpICYmIG5zKys7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAobmEgPT09IG4gfHwgbnMgPT09IG4pIHsKICAgICAgICAgICAgICAgIC8vIGFsbCBhcnJheXMgb3IgYWxsIHN0cmluZ3MuLi4KICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkQmxvY2sobWFwLCBmbXQpIHsKICAgICAgICB2YXIgYiA9IFtdOwogICAgICAgIGZtdC5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgIHZhciB2ID0gbWFwLmdldChrKSwKICAgICAgICAgICAgICAgIGEgPSBmcy5pc0EodiksCiAgICAgICAgICAgICAgICBkID0gKGEgJiYgYVsxXSk7CgogICAgICAgICAgICAvLyAnLScgbWFya3MgYSBzZXBhcmF0b3I7IGQgaXMgdGhlIGRlc2NyaXB0aW9uCiAgICAgICAgICAgIGlmIChrID09PSAnLScgfHwgZCkgewogICAgICAgICAgICAgICAgYi5wdXNoKFtta0tleURpc3AoayksIGRdKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBiOwogICAgfQoKICAgIGZ1bmN0aW9uIGVtcHR5Um93KCkgewogICAgICAgIHJldHVybiB7IHR5cGU6ICdyb3cnLCBkYXRhOiBbXSB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG1rQXJyUm93KGZtdCkgewogICAgICAgIHZhciBkID0gZW1wdHlSb3coKTsKICAgICAgICBkLmRhdGEucHVzaChmbXQpOwogICAgICAgIHJldHVybiBkOwogICAgfQoKICAgIGZ1bmN0aW9uIG1rQ29sdW1uYXJSb3cobWFwLCBmbXQpIHsKICAgICAgICB2YXIgZCA9IGVtcHR5Um93KCk7CiAgICAgICAgZm10LmZvckVhY2goZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgZC5kYXRhLnB1c2goYnVpbGRCbG9jayhtYXAsIGEpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZDsKICAgIH0KCiAgICBmdW5jdGlvbiBta01hcFJvdyhtYXAsIGZtdCkgewogICAgICAgIHZhciBkID0gZW1wdHlSb3coKTsKICAgICAgICBkLmRhdGEucHVzaChidWlsZEJsb2NrKG1hcCwgZm10KSk7CiAgICAgICAgcmV0dXJuIGQ7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkUm93KHJvdykgewogICAgICAgIHZhciBkID0gcm93IHx8IHsgdHlwZTogJ3NlcCcgfTsKICAgICAgICBkYXRhLnB1c2goZCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWdncmVnYXRlRGF0YShiaW5kaW5ncykgewogICAgICAgIHZhciBoZiA9ICdfaGVscEZvcm1hdCcsCiAgICAgICAgICAgIGdtYXAgPSBkMy5tYXAoYmluZGluZ3MuZ2xvYmFsS2V5cyksCiAgICAgICAgICAgIGdmbXQgPSBiaW5kaW5ncy5nbG9iYWxGb3JtYXQsCiAgICAgICAgICAgIHZtYXAgPSBkMy5tYXAoYmluZGluZ3Mudmlld0tleXMpLAogICAgICAgICAgICB2Z2VzdCA9IGJpbmRpbmdzLnZpZXdHZXN0dXJlcywKICAgICAgICAgICAgdmZtdCwgdmtleXM7CgogICAgICAgIC8vIGZpbHRlciBvdXQgaGVscCBmb3JtYXQgZW50cnkKICAgICAgICB2Zm10ID0gY2hlY2tGbXQodm1hcC5nZXQoaGYpKTsKICAgICAgICB2bWFwLnJlbW92ZShoZik7CgogICAgICAgIC8vIGlmIGJhZCAob3Igbm8pIGZvcm1hdCwgZmFsbGJhY2sgdG8gc29ydGVkIGtleXMKICAgICAgICBpZiAoIXZmbXQpIHsKICAgICAgICAgICAgdmtleXMgPSB2bWFwLmtleXMoKTsKICAgICAgICAgICAgdmZtdCA9IHZrZXlzLnNvcnQoKTsKICAgICAgICB9CgogICAgICAgIGRhdGEgPSBbXTsKCiAgICAgICAgYWRkUm93KG1rTWFwUm93KGdtYXAsIGdmbXQpKTsKICAgICAgICBhZGRSb3coKTsKICAgICAgICBhZGRSb3coZnMuaXNBKHZmbXRbMF0pID8gbWtDb2x1bW5hclJvdyh2bWFwLCB2Zm10KSA6IG1rTWFwUm93KHZtYXAsIHZmbXQpKTsKICAgICAgICBhZGRSb3coKTsKICAgICAgICBhZGRSb3cobWtBcnJSb3codmdlc3QpKTsKICAgIH0KCgogICAgZnVuY3Rpb24gcG9wQmluZChiaW5kaW5ncykgewogICAgICAgIHBhbmUgPSBzdmcuYXBwZW5kKCdnJykKICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgY2xhc3M6ICdoZWxwJywKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAKICAgICAgICAgICAgfSk7CgogICAgICAgIHJlY3QgPSBwYW5lLmFwcGVuZCgncmVjdCcpCiAgICAgICAgICAgIC5hdHRyKCdyeCcsIDgpOwoKICAgICAgICBwYW5lLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgIC50ZXh0KCdRdWljayBIZWxwJykKICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgY2xhc3M6ICd0aXRsZScsCiAgICAgICAgICAgICAgICBkeTogJzEuMmVtJywKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc3VzLnRyYW5zbGF0ZSgtcGFkLDApCiAgICAgICAgICAgIH0pOwoKICAgICAgICBpdGVtcyA9IHBhbmUuYXBwZW5kKCdnJyk7CiAgICAgICAgYWdncmVnYXRlRGF0YShiaW5kaW5ncyk7CiAgICAgICAgdXBkYXRlS2V5SXRlbXMoKTsKCiAgICAgICAgX2ZhZGUoMSk7CiAgICB9CgogICAgZnVuY3Rpb24gZmFkZUJpbmRpbmdzKCkgewogICAgICAgIF9mYWRlKDApOwogICAgfQoKICAgIGZ1bmN0aW9uIF9mYWRlKG8pIHsKICAgICAgICBzdmcuc2VsZWN0QWxsKCdnLmhlbHAnKQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbihzZXR0aW5ncy5mYWRlKQogICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIG8pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFN2ZygpIHsKICAgICAgICBzdmcgPSBxaGRpdi5hcHBlbmQoJ3N2ZycpCiAgICAgICAgICAgIC5hdHRyKHsKICAgICAgICAgICAgICAgIHdpZHRoOiB3LAogICAgICAgICAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgICAgICAgICAgdmlld0JveDogdmJveAogICAgICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVTdmcoKSB7CiAgICAgICAgc3ZnLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZGVsYXkoc2V0dGluZ3MuZmFkZSArIDIwKQogICAgICAgICAgICAucmVtb3ZlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ29vZEJpbmRpbmdzKGJpbmRpbmdzKSB7CiAgICAgICAgdmFyIHdhcm5QcmVmaXggPSAnUXVpY2toZWxwIFNlcnZpY2U6IHNob3dRdWlja0hlbHAoKSwgJzsKICAgICAgICBpZiAoIWJpbmRpbmdzIHx8ICFmcy5pc08oYmluZGluZ3MpIHx8IGZzLmlzRW1wdHlPYmplY3QoYmluZGluZ3MpKSB7CiAgICAgICAgICAgICRsb2cud2Fybih3YXJuUHJlZml4ICsgJ2ludmFsaWQgYmluZGluZ3Mgb2JqZWN0Jyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEobmVlZGVkQmluZGluZ3MuZXZlcnkoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIGJpbmRpbmdzOyB9KSkpIHsKICAgICAgICAgICAgJGxvZy53YXJuKAogICAgICAgICAgICAgICAgd2FyblByZWZpeCArCiAgICAgICAgICAgICAgICAnbmVlZGVkIGJpbmRpbmdzIGZvciBoZWxwIHBhbmVsIG5vdCBwcm92aWRlZDonLAogICAgICAgICAgICAgICAgbmVlZGVkQmluZGluZ3MKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vID09PSBNb2R1bGUgRGVmaW5pdGlvbiA9PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb25vc0xheWVyJykKICAgIC5mYWN0b3J5KCdRdWlja0hlbHBTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX3N1c18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBzdXMgPSBfc3VzXzsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRRdWlja0hlbHAob3B0cykgewogICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBhbmd1bGFyLmV4dGVuZCh7fSwgZGVmYXVsdFNldHRpbmdzLCBmcy5pc08ob3B0cykpOwogICAgICAgICAgICAgICAgcWhkaXYgPSBkMy5zZWxlY3QoJyNxdWlja2hlbHAnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc2hvd1F1aWNrSGVscChiaW5kaW5ncykgewogICAgICAgICAgICAgICAgc3ZnID0gcWhkaXYuc2VsZWN0KCdzdmcnKTsKICAgICAgICAgICAgICAgIGlmICghZ29vZEJpbmRpbmdzKGJpbmRpbmdzKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN2Zy5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkU3ZnKCk7CiAgICAgICAgICAgICAgICAgICAgcG9wQmluZChiaW5kaW5ncyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGhpZGVRdWlja0hlbHAoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gaGlkZVF1aWNrSGVscCgpIHsKICAgICAgICAgICAgICAgIHN2ZyA9IHFoZGl2LnNlbGVjdCgnc3ZnJyk7CiAgICAgICAgICAgICAgICBpZiAoIXN2Zy5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgZmFkZUJpbmRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU3ZnKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICCM3O9WKQMFAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wcJAAEAG6RrAqAc2wKgHYJUtH/VP2bgzppLO0YAQA4mq3wAAAQEICgCjXvcATaXyjNzvVukDBQDjAAAA4wAAAGj3KB/SxQgAJ60eEwgARQAA1Y12QABABhzGwKgHYMCoBzYf9ZUtppLO0U/ZuDOAGAFGkK4AAAEBCAoATaXyAKNe8yAgIGluaXRRdWlja0hlbHA6IGluaXRRdWlja0hlbHAsCiAgICAgICAgICAgICAgICBzaG93UXVpY2tIZWxwOiBzaG93UXVpY2tIZWxwLAogICAgICAgICAgICAgICAgaGlkZVF1aWNrSGVscDogaGlkZVF1aWNrSGVscAogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKCn0oKSk7Cg0KjNzvVscFBQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOY13QABABh1hwKgHYMCoBzYf9ZUtppLPck/ZuDOAGAFGkBIAAAEBCAoATaXzAKNe9zANCg0KjNzvVkkGBQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMHDQABABukZwKgHNsCoB2CVLR/1T9m4M6aSz3eAEAOgqiIAAAEBCAoAo173AE2l8ozc71bTBwUAkAIAAJACAAAIACetHhNo9ygf0sUIAEUAAoLBxEAAQAbmysCoBzbAqAdglS0f9U/ZuDOmks93gBgDoFZDAAABAQgKAKNe9wBNpfJHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvRm9yY2UuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bsFAUAawsAAGsLAABo9ygf0sUIACetHhMIAEUAC10YqEAAQAaHDMCoB2DAqAc2H/WVK2c+NHb2algUgBgBips2AAABAQgKAE2l8wCjXvNIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQpBOTUNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIExheWVyIC0tIFZlaWwgU2VydmljZQoKIFByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRpc3BsYXkgYW4gb3ZlcmxheWluZyBkaXYgd2l0aCBpbmZvcm1hdGlvbi4KIFVzZWQgbWFpbmx5IGZvciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gaW50ZXJydXB0aW9uLgogKi8KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHJvdXRlLCBmcywga3MsIGdzOwoKICAgIHZhciB2ZWlsOwoKICAgIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgdmFyIHdTaXplID0gZnMud2luZG93U2l6ZSgpLAogICAgICAgICAgICB3dyA9IHdTaXplLndpZHRoLAogICAgICAgICAgICB3aCA9IHdTaXplLmhlaWdodCwKICAgICAgICAgICAgc2hyaW5rID0gd2ggKiAwLjMsCiAgICAgICAgICAgIGJpcmREaW0gPSB3aCAtIHNocmluaywKICAgICAgICAgICAgYmlyZENlbnRlciA9ICh3dyAtIGJpcmREaW0pIC8gMiwKICAgICAgICAgICAgc3ZnOwoKICAgICAgICB2ZWlsID0gZDMuc2VsZWN0KCcjdmVpbCcpOwoKICAgICAgICBzdmcgPSB2ZWlsLnNlbGVjdCgnc3ZnJykuYXR0cih7CiAgICAgICAgICAgIHdpZHRoOiB3dywKICAgICAgICAgICAgaGVpZ2h0OiB3aAogICAgICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgMC4yKTsKCiAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCAnYmlyZCcsIGJpcmREaW0sIGZhbHNlLCBbYmlyZENlbnRlciwgc2hyaW5rLzJdKTsKICAgIH0KCiAgICAvLyBtc2cgc2hvdWxkIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MKICAgIGZ1bmN0aW9uIHNob3cobXNnKSB7CiAgICAgICAgdmFyIG1zZ3MgPSBmcy5pc0EobXNnKSB8fCBbbXNnXSwKICAgICAgICAgICAgcGRpdiA9IHZlaWwuc2VsZWN0KCcubXNnJyk7CiAgICAgICAgcGRpdi5zZWxlY3RBbGwoJ3AnKS5yZW1vdmUoKTsKCiAgICAgICAgbXNncy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgICAgICAgIHBkaXYuYXBwZW5kKCdwJykudGV4dChsaW5lKTsKICAgICAgICB9KTsKCiAgICAgICAgdmVpbC5zdHlsZSgnZGlzcGxheScsICdibG9jaycpOwogICAgICAgIGtzLmVuYWJsZUtleXMoZmFsc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGUoKSB7CiAgICAgICAgdmVpbC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7CiAgICAgICAga3MuZW5hYmxlS2V5cyh0cnVlKTsKICAgIH0KCiAgICAvLyBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyB0aGUgdmVpbCBpZiB0aGUgY2FsbGVyIGlzIHRoZSBjdXJyZW50IHZpZXcKICAgIC8vIFRPRE86IHJldmlldyAtIGlzIHRoaXMgZGVwcmVjYXRlZCA/CiAgICBmdW5jdGlvbiBsb3N0U2VydmVyKGN0cmxOYW1lLCBtc2cpIHsKICAgICAgICBpZiAoJHJvdXRlLmN1cnJlbnQuJCRyb3V0ZS5jb250cm9sbGVyID09PSBjdHJsTmFtZSkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCdWRUlMLXNlcnZpY2U6ICcsIGN0cmxOYW1lKTsKICAgICAgICAgICAgc2hvdyhtc2cpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygnVkVJTC1zZXJ2aWNlOiBJR05PUklORyAnLCBjdHJsTmFtZSk7CiAgICAgICAgfQogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvbm9zTGF5ZXInKQogICAgLmZhY3RvcnkoJ1ZlaWxTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHJvdXRlJywgJ0ZuU2VydmljZScsICdLZXlTZXJ2aWNlJywgJ0dseXBoU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kcm91dGVfLCBfZnNfLCBfa3NfLCBfZ3NfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRyb3V0ZSA9IF8kcm91dGVfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIGtzID0gX2tzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXQ6IGluaXQsCiAgICAgICAgICAgICAgICBzaG93OiBzaG93LAogICAgICAgICAgICAgICAgaGlkZTogaGlkZSwKICAgICAgICAgICAgICAgIGxvc3RTZXJ2ZXI6IGxvc3RTZXJ2ZXIKICAgICAgICAgICAgfTsKICAgIH1dKTsKCn0oKSk7Cg0KjNzvVjUVBQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANHBlQABABjp4wKgHNsCoB2CVKx/19mpYFGc+P5+AEAWkMNkAAAEBCAoAo174AE2l84zc71YXIQUARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADkYqkAAQAaSLsCoB2DAqAc2H/WVK2c+P5/2algUgBgBipASAAABAQgKAE2l9ACjXvgwDQoNCozc71YVIgUAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoFwZkAAQAY4KsCoBzbAqAdglSsf9fZqWBRnPj+kgBgFpJmIAAABAQgKAKNe+QBNpfRHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvSW5zdC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVtUwBQDSOAAA0jgAAGj3KB/SxQgAJ60eEwgARQA4xO30QABABoRYwKgHYMCoBzYf9ZUqk6a2esbo93WAEAEdyJ0AAAEBCAoATaX0AKNe9UhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNzM4Mg0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBEMyBNb2R1bGUuCiBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgRDMgdmlzdWFsaXphdGlvbnMgb2YgdGhlIFRvcG9sb2d5CiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHN1cywgaXMsIHRzOwoKICAgIC8vIGFwaSB0byB0b3BvRm9yY2UKICAgIHZhciBhcGk7CiAgICAvKgogICAgIG5vZGUoKSAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICBsaW5rKCkgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gRDMgc2VsZWN0aW9uIG9mIGxpbmtzCiAgICAgbGlua0xhYmVsKCkgICAgICAgICAgICAvLyBnZXQgcmVmIHRvIEQzIHNlbGVjdGlvbiBvZiBsaW5rIGxhYmVscwogICAgIGluc3RWaXNpYmxlKCkgICAgICAgICAgLy8gdHJ1ZSBpZiBpbnN0YW5jZXMgcGFuZWwgaXMgdmlzaWJsZQogICAgIHBvc05vZGUoKSAgICAgICAgICAgICAgLy8gcG9zaXRpb24gbm9kZQogICAgIHNob3dIb3N0cygpICAgICAgICAgICAgLy8gdHJ1ZSBpZiBob3N0cyBhcmUgdG8gYmUgc2hvd24KICAgICByZXN0eWxlTGlua0VsZW1lbnQoKSAgIC8vIHVwZGF0ZSBsaW5rIHN0eWxlcyBiYXNlZCBvbiBiYWNraW5nIGRhdGEKICAgICB1cGRhdGVMaW5rTGFiZWxNb2RlbCgpIC8vIHVwZGF0ZSBiYWNraW5nIGRhdGEgZm9yIGxpbmsgbGFiZWxzCiAgICAgKi8KCiAgICAvLyBjb25maWd1cmF0aW9uCiAgICB2YXIgZGV2Q2ZnID0gewogICAgICAgICAgICB4b2ZmOiAtMjAsCiAgICAgICAgICAgIHlvZmY6IC0xOAogICAgICAgIH0sCiAgICAgICAgbGFiZWxDb25maWcgPSB7CiAgICAgICAgICAgIGltZ1BhZDogMTYsCiAgICAgICAgICAgIHBhZExSOiA0LAogICAgICAgICAgICBwYWRUQjogMywKICAgICAgICAgICAgbWFyZ2luTFI6IDMsCiAgICAgICAgICAgIG1hcmdpblRCOiAyLAogICAgICAgICAgICBwb3J0OiB7CiAgICAgICAgICAgICAgICBnYXA6IDMsCiAgICAgICAgICAgICAgICB3aWR0aDogMTgsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE0CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGJhZGdlQ29uZmlnID0gewogICAgICAgICAgICByYWRpdXM6IDEyLAogICAgICAgICAgICB5b2ZmOiA1LAogICAgICAgICAgICBnZGVsdGE6IDEwCiAgICAgICAgfSwKICAgICAgICBpY2ZnOwoKICAgIHZhciBzdGF0dXMgPSB7CiAgICAgICAgaTogJ2JhZGdlSW5mbycsCiAgICAgICAgdzogJ2JhZGdlV2FybicsCiAgICAgICAgZTogJ2JhZGdlRXJyb3InCiAgICB9OwoKICAgIGZ1bmN0aW9uIGJhZGdlU3RhdHVzKGJhZGdlKSB7CiAgICAgICAgcmV0dXJuIHN0YXR1c1tiYWRnZS5zdGF0dXNdIHx8IHN0YXR1cy5pOwogICAgfQoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgZGV2aWNlTGFiZWxJbmRleCA9IDAsCiAgICAgICAgaG9zdExhYmVsSW5kZXggPSAwOwoKCiAgICB2YXIgZENvbCA9IHsKICAgICAgICBibGFjazogJyMwMDAnLAogICAgICAgIHBhbGVibHVlOiAnI2FjZicsCiAgICAgICAgb2Zmd2hpdGU6ICcjZGRkJywKICAgICAgICBkYXJrZ3JleTogJyM0NDQnLAogICAgICAgIG1pZGdyZXk6ICcjODg4JywKICAgICAgICBsaWdodGdyZXk6ICcjYmJiJywKICAgICAgICBvcmFuZ2U6ICcjZjkwJwogICAgfTsKCiAgICAvLyBub3RlOiB0aGVzZSBhcmUgdGhlIGRldmljZSBpY29uIGNvbG9ycyB3aXRob3V0IGFmZmluaXR5CiAgICB2YXIgZENvbFRoZW1lID0gewogICAgICAgIGxpZ2h0OiB7CiAgICAgICAgICAgIHJmaWxsOiBkQ29sLm9mZndoaXRlLAogICAgICAgICAgICBvbmxpbmU6IHsKICAgICAgICAgICAgICAgIGdseXBoOiBkQ29sLmRhcmtncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5wYWxlYmx1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBvZmZsaW5lOiB7CiAgICAgICAgICAgICAgICBnbHlwaDogZENvbC5taWRncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5saWdodGdyZXkKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZGFyazogewogICAgICAgICAgICByZmlsbDogZENvbC5taWRncmV5LAogICAgICAgICAgICBvbmxpbmU6IHsKICAgICAgICAgICAgICAgIGdseXBoOiBkQ29sLmRhcmtncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5wYWxlYmx1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBvZmZsaW5lOiB7CiAgICAgICAgICAgICAgICBnbHlwaDogZENvbC5taWRncmV5LAogICAgICAgICAgICAgICAgcmVjdDogZENvbC5kYXJrZ3JleQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBkZXZCYXNlQ29sb3IoZCkgewogICAgICAgIHZhciBvID0gZC5vbmxpbmUgPyAnb25saW5lJyA6ICdvZmZsaW5lJzsKICAgICAgICByZXR1cm4gZENvbFRoZW1lW3RzLnRoZW1lKCldW29dOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldERldmljZUNvbG9yKGQpIHsKICAgICAgICB2YXIgbyA9IGQub25saW5lLAogICAgICAgICAgICBzID0gZC5lbC5jbGFzc2VkKCdzZWxlY3RlZCcpLAogICAgICAgICAgICBjID0gZGV2QmFzZUNvbG9yKGQpLAogICAgICAgICAgICBhID0gaW5zdENvbG9yKGQubWFzdGVyLCBvKSwKICAgICAgICAgICAgaWNvbiA9IGQuZWwuc2VsZWN0KCdnLmRldmljZUljb24nKSwKICAgICAgICAgICAgZywgcjsKCiAgICAgICAgaWYgKHMpIHsKICAgICAgICAgICAgZyA9IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBkQ29sLm9yYW5nZTsKICAgICAgICB9IGVsc2UgaWYgKGFwaS5pbnN0VmlzaWJsZSgpKSB7CiAgICAgICAgICAgIGcgPSBvID8gYSA6IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBvID8gYy5yZmlsbCA6IGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZyA9IGMuZ2x5cGg7CiAgICAgICAgICAgIHIgPSBjLnJlY3Q7CiAgICAgICAgfQoKICAgICAgICBpY29uLnNlbGVjdCgndXNlJykuc3R5bGUoJ2ZpbGwnLCBnKTsKICAgICAgICBpY29uLnNlbGVjdCgncmVjdCcpLnN0eWxlKCdmaWxsJywgcik7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdENvbG9yKGlkLCBvbmxpbmUpIHsKICAgICAgICByZXR1cm4gc3VzLmNhdDcoKS5nZXRDb2xvcihpZCwgIW9ubGluZSwgdHMudGhlbWUoKSk7CiAgICB9CgogICAgLy8gPT09PQoKICAgIGZ1bmN0aW9uIGluY0RldkxhYkluZGV4KCkgewogICAgICAgIGRldmljZUxhYmVsSW5kZXggPSAoZGV2aWNlTGFiZWxJbmRleCsxKSAlIDM7CiAgICAgICAgc3dpdGNoKGRldmljZUxhYmVsSW5kZXgpIHsKICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gJ0hpZGUgZGV2aWNlIGxhYmVscyc7CiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuICdTaG93IGZyaWVuZGx5IGRldmljZSBsYWJlbHMnOwogICAgICAgICAgICBjYXNlIDI6IHJldHVybiAnU2hvdyBkZXZpY2UgSUQgbGFiZWxzJzsKICAgICAgICB9CiAgICB9CgogICAgLy8gUmV0dXJucyB0aGUgbmV3bHkgY29tcHV0ZWQgYm91bmRpbmcgYm94IG9mIHRoZSByZWN0YW5nbGUKICAgIGZ1bmN0aW9uIGFkanVzdFJlY3RUb0ZpdFRleHQobikgewogICAgICAgIHZhciB0ZXh0ID0gbi5zZWxlY3QoJ3RleHQnKSwKICAgICAgICAgICAgYm94ID0gdGV4dC5ub2RlKCkuZ2V0QkJveCgpLAogICAgICAgICAgICBsYWIgPSBsYWJlbENvbmZpZzsKCiAgICAgICAgdGV4dC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAuYXR0cigneScsICctMC44ZW0nKQogICAgICAgICAgICAuYXR0cigneCcsIGxhYi5pbWdQYWQvMik7CgogICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgYmJveCBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkIG9uIFt4LHldCiAgICAgICAgYm94LnggPSAtYm94LndpZHRoIC8gMjsKICAgICAgICBib3gueSA9IC1ib3guaGVpZ2h0IC8gMjsKCiAgICAgICAgLy8gYWRkIHBhZGRpbmcKICAgICAgICBib3gueCAtPSAobGFiLnBhZExSICsgbGFiLmltZ1BhZC8yKTsKICAgICAgICBib3gud2lkdGggKz0gbGFiLnBhZExSICogMiArIGxhYi5pbWdQYWQ7CiAgICAgICAgYm94LnkgLT0gbGFiLnBhZFRCOwogICAgICAgIGJveC5oZWlnaHQgKz0gbGFiLnBhZFRCICogMjsKCiAgICAgICAgcmV0dXJuIGJveDsKICAgIH0KCiAgICBmdW5jdGlvbiBob3N0TGFiZWwoZCkgewogICAgICAgIHZhciBpZHggPSAoaG9zdExhYmVsSW5kZXggPCBkLmxhYmVscy5sZW5ndGgpID8gaG9zdExhYmVsSW5kZXggOiAwOwogICAgICAgIHJldHVybiBkLmxhYmVsc1tpZHhdOwogICAgfQogICAgZnVuY3Rpb24gZGV2aWNlTGFiZWwoZCkgewogICAgICAgIHZhciBpZHggPSAoZGV2aWNlTGFiZWxJbmRleCA8IGQubGFiZWxzLmxlbmd0aCkgPyBkZXZpY2VMYWJlbEluZGV4IDogMDsKICAgICAgICByZXR1cm4gZC5sYWJlbHNbaWR4XTsKICAgIH0KICAgIGZ1bmN0aW9uIHRyaW1MYWJlbChsYWJlbCkgewogICAgICAgIHJldHVybiAobGFiZWwgJiYgbGFiZWwudHJpbSgpKSB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eUJveCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiAtMiwKICAgICAgICAgICAgeTogLTIsCiAgICAgICAgICAgIHdpZHRoOiA0LAogICAgICAgICAgICBoZWlnaHQ6IDQKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURldmljZVJlbmRlcmluZyhkKSB7CiAgICAgICAgdmFyIGxhYmVsID0gdHJpbUxhYmVsKGRldmljZUxhYmVsKGQpKSwKICAgICAgICAgICAgbm9MYWJlbCA9ICFsYWJlbCwKICAgICAgICAgICAgbm9kZSA9IGQuZWwsCiAgICAgICAgICAgIGRpbSA9IGljZmcuZGV2aWNlLmRpbSwKICAgICAgICAgICAgYm94LCBkeCwgZHksCiAgICAgICAgICAgIGJkZyA9IGQuYmFkZ2U7CgogICAgICAgIG5vZGUuc2VsZWN0KCd0ZXh0JykKICAgICAgICAgICAgLnRleHQobGFiZWwpOwoKICAgICAgICBpZiAobm9MYWJlbCkgewogICAgICAgICAgICBib3ggPSBlbXB0eUJveCgpOwogICAgICAgICAgICBkeCA9IC1kaW0vMjsKICAgICAgICAgICAgZHkgPSAtZGltLzI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYm94ID0gYWRqdXN0UmVjdFRvRml0VGV4dChub2RlKTsKICAgICAgICAgICAgZHggPSBib3gueCArIGRldkNmZy54b2ZmOwogICAgICAgICAgICBkeSA9IGJveC55ICsgZGV2Q2ZnLnlvZmY7CiAgICAgICAgfQoKICAgICAgICBub2RlLnNlbGVjdCgncmVjdCcpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoYm94KTsKCiAgICAgICAgbm9kZS5zZWxlY3QoJ2cuZGV2aWNlSWNvbicpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHN1cy50cmFuc2xhdGUoZHgsIGR5KSk7CgogICAgICAgIC8vIGhhbmRsZSBiYWRnZSwgaWYgZGVmaW5lZAogICAgICAgIGlmIChiZGcpIHsKICAgICAgICAgICAgcmVuZGVyQmFkZ2Uobm9kZSwgYmRnLCB7IGR4OiBkeCArIGRpbSwgZHk6IGR5IH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVIb3N0UmVuZGVyaW5nKGQpIHsKICAgICAgICB2YXIgbm9kZSA9IGQuZWwsCiAgICAgICAgICAgIGJkZyA9IGQuYmFkZ2U7CgogICAgICAgIHVwZGF0ZUhvc3RMYWJlbChkKTsKCiAgICAgICAgLy8gaGFuZGxlIGJhZGdlLCBpZiBkZWZpbmVkCiAgICAgICAgaWYgKGJkZykgewogICAgICAgICAgICByZW5kZXJCYWRnZShub2RlLCBiZGcsIGljZmcuaG9zdC5iYWRnZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckJhZGdlKG5vZGUsIGJkZywgYm9mZikgewogICAgICAgIHZhciBic2VsLAogICAgICAgICAgICBiY3IgPSBiYWRnZUNvbmZpZy5yYWRpdXMsCiAgICAgICAgICAgIGJjZ2QgPSBiYWRnZUNvbmZpZy5nZGVsdGE7CgogICAgICAgIG5vZGUuc2VsZWN0KCdnLmJhZGdlJykucmVtb3ZlKCk7CgogICAgICAgIGJzZWwgPSBub2RlLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5jbGFzc2VkKCdiYWRnZScsIHRydWUpCiAgICAgICAgICAgIC5jbGFzc2VkKGJhZGdlU3RhdHVzKGJkZyksIHRydWUpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKGJvZmYuZHgsIGJvZmYuZHkpKTsKCiAgICAgICAgYnNlbC5hcHBlbmQoJ2NpcmNsZScpCiAgICAgICAgICAgIC5hdHRyKCdyJywgYmNyKTsKCiAgICAgICAgaWYgKGJkZy50eHQpIHsKICAgICAgICAgICAgYnNlbC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2R5JywgYmFkZ2VDb25maWcueW9mZikKICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAgICAgLnRleHQoYmRnLnR4dCk7CiAgICAgICAgfSBlbHNlIGlmIChiZGcuZ2lkKSB7CiAgICAgICAgICAgIGJzZWwuYXBwZW5kKCd1c2UnKQogICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgIHdpZHRoOiBiY2dkICogMiwKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGJjZ2QgKiAyLAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc3VzLnRyYW5zbGF0ZSgtYmNnZCwgLWJjZ2QpLAogICAgICAgICAgICAgICAgICAgICd4bGluazpocmVmJzogJyMnICsgYmRnLmdpZAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUhvc3RMYWJlbChkKSB7CiAgICAgICAgdmFyIGxhYmVsID0gdHJpbUxhYmVsKGhvc3RMYWJlbChkKSk7CiAgICAgICAgZC5lbC5zZWxlY3QoJ3RleHQnKS50ZXh0KGxhYmVsKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVEZXZpY2VDb2xvcnMoZCkgewogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIHNldERldmljZUNvbG9yKGQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwaS5ub2RlKCkuZmlsdGVyKCcuZGV2aWNlJykuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29sb3IoZCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIHVwZGF0ZU5vZGVzIC0gc3ViZnVuY3Rpb25zCgogICAgZnVuY3Rpb24gZGV2aWNlRXhpc3RpbmcoZCkgewogICAgICAgIHZhciBub2RlID0gZC5lbDsKICAgICAgICBub2RlLmNsYXNzZWQoJ29ubGluZScsIGQub25saW5lKTsKICAgICAgICB1cGRhdGVEZXZpY2VSZW5kZXJpbmcoZCk7CiAgICAgICAgYXBpLnBvc05vZGUoZCwgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaG9zdEV4aXN0aW5nKGQpIHsKICAgICAgICB1cGRhdGVIb3N0UmVuZGVyaW5nKGQpOwogICAgICAgIGFwaS5wb3NOb2RlKGQsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRldmljZUVudGVyKGQpIHsKICAgICAgICB2YXIgbm9kZSA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgZ2x5cGhJZCA9IGQudHlwZSB8fCAndW5rbm93bicsCiAgICAgICAgICAgIGxhYmVsID0gdHJpbUxhYmVsKGRldmljZUxhYmVsKGQpKSwKICAgICAgICAgICAgLy9kZXZDZmcgPSBkZXZpY2VJY29uQ29uZmlnLAogICAgICAgICAgICBub0xhYmVsID0gIWxhYmVsLAogICAgICAgICAgICBib3gsIGR4LCBkeSwgaWNvbjsKCiAgICAgICAgZC5lbCA9IG5vZGU7CgogICAgICAgIG5vZGUuYXBwZW5kKCdyZWN0JykuYXR0cih7IHJ4OiA1LCByeTogNSB9KTsKICAgICAgICBub2RlLmFwcGVuZCgndGV4dCcpLnRleHQobGFiZWwpLmF0dHIoJ2R5JywgJzEuMWVtJyk7CiAgICAgICAgYm94ID0gYWRqdXN0UmVjdFRvRml0VGV4dChub2RlKTsKICAgICAgICBub2RlLnNlbGVjdCgncmVjdCcpLmF0dHIoYm94KTsKCiAgICAgICAgaWNvbiA9IGlzLmFkZERldmljZUljb24obm9kZSwgZ2x5cGhJZCk7CgogICAgICAgIGlmIChub0xhYmVsKSB7CiAgICAgICAgICAgIGR4ID0gLWljb24uZGltLzI7CiAgICAgICAgICAgIGR5ID0gLWljb24uZGltLzI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYm94ID0gYWRqdXN0UmVjdFRvRml0VGV4dChub2RlKTsKICAgICAgICAgICAgZHggPSBib3gueCArIGRldkNmZy54b2ZmOwogICAgICAgICAgICBkeSA9IGJveC55ICsgZGV2Q2ZnLnlvZmY7CiAgICAgICAgfQoKICAgICAgICBpY29uLmF0dHIoJ3RyYW5zZm9ybScsIHN1cy50cmFuc2xhdGUoZHgsIGR5KSk7CiAgICB9CgogICAgZnVuY3Rpb24gaG9zdEVudGVyKGQpIHsKICAgICAgICB2YXIgbm9kZSA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgZ2lkID0gZC50eXBlIHx8ICd1bmtub3duJywKICAgICAgICAgICAgcmFkID0gaWNmZy5ob3N0LnJhZGl1cywKICAgICAgICAgICAgciA9IGQudHlwZSA/IHJhZC53aXRoR2x5cGggOiByYWQubm9HbHlwaCwKICAgICAgICAgICAgdGV4dER5ID0gciArIDEwOwoKICAgICAgICBkLmVsID0gbm9kZTsKICAgICAgICBzdXMudmlzaWJsZShub2RlLCBhcGkuc2hvd0hvc3RzKCkpOwoKICAgICAgICBpcy5hZGRIb3N0SWNvbihub2RlLCByLCBnaWQpOwoKICAgICAgICBub2RlLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgIC50ZXh0KGhvc3RMYWJlbCkKICAgICAgICAgICAgLmF0dHIoJ2R5JywgdGV4dER5KQogICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7CiAgICB9CgogICAgZnVuY3Rpb24gaG9zdEV4aXQoZCkgewogICAgICAgIHZhciBub2RlID0gZC5lbDsKICAgICAgICBub2RlLnNlbGVjdCgndXNlJykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbig4MDApCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgICBub2RlLnNlbGVjdCgndGV4dCcpCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuNSkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24oODAwKQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKTsKCiAgICAgICAgbm9kZS5zZWxlY3QoJ2NpcmNsZScpCiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWZpbGwnLCAnIzU1NScpCiAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICcjODg4JykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbigxNTAwKQogICAgICAgICAgICAuYXR0cigncicsIDApOwogICAgfQoKICAgIGZ1bmN0aW9uIGRldmljZUV4aXQoZCkgewogICAgICAgIHZhciBub2RlID0gZC5lbDsKICAgICAgICBub2RlLnNlbGVjdCgndXNlJykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbig4MDApCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgICBub2RlLnNlbGVjdEFsbCgncmVjdCcpCiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWZpbGwnLCAnIzU1NScpCiAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICcjODg4JykKICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC41KTsKICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIHVwZGF0ZUxpbmtzIC0gc3ViZnVuY3Rpb25zCgogICAgZnVuY3Rpb24gbGlua0VudGVyaW5nKGQpIHsKICAgICAgICB2YXIgbGluayA9IGQzLnNlbGVjdCh0aGlzKTsKICAgICAgICBkLmVsID0gbGluazsKICAgICAgICBhcGkucmVzdHlsZUxpbmtFbGVtZW50KGQpOwogICAgICAgIGlmIChkLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICBzdXMudmlzaWJsZShsaW5rLCBhcGkuc2hvd0hvc3RzKCkpOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgbGlua0xhYmVsT2Zmc2V0ID0gJzAuM2VtJzsKCiAgICBmdW5jdGlvbiBhcHBseUxpbmtMYWJlbHMoKSB7CiAgICAgICAgdmFyIGVudGVyaW5nOwoKICAgICAgICBhcGkudXBkYXRlTGlua0xhYmVsTW9kZWwoKTsKCiAgICAgICAgLy8gZm9yIGVsZW1lbnRzIGFscmVhZHkgZXhpc3RpbmcsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB0ZXh0CiAgICAgICAgLy8gYW5kIGFkanVzdCB0aGUgcmVjdGFuZ2xlIHNpemUgdG8gZml0CiAgICAgICAgYXBpLmxpbmtMYWJlbCgpLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgcmVjdCA9IGVsLnNlbGVjdCgncmVjdCcpLAogICAgICAgICAgICAgICAgdGV4dCA9IGVsLnNlbGVjdCgndGV4dCcpOwogICAgICAgICAgICB0ZXh0LnRleHQoZC5sYWJlbCk7CiAgICAgICAgICAgIHJlY3QuYXR0cihyZWN0QXJvdW5kVGV4dChlbCkpOwogICAgICAgIH0pOwoKICAgICAgICBlbnRlcmluZyA9IGFwaS5saW5rTGFiZWwoKS5lbnRlcigpLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5jbGFzc2VkKCdsaW5rTGFiZWwnLCB0cnVlKQogICAgICAgICAgICAuYXR0cignaWQnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5pZDsgfSk7CgogICAgICAgIGVudGVyaW5nLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgICAgcmVjdCwKICAgICAgICAgICAgICAgIHRleHQ7CgogICAgICAgICAgICBpZiAoZC5sZGF0YS50eXBlKCkgPT09ICdob3N0TGluaycpIHsKICAgICAgICAgICAgICAgIGVsLmNsYXNzZWQoJ2hvc3RMaW5rTGFiZWwnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHN1cy52aXNpYmxlKGVsLCBhcGkuc2hvd0hvc3RzKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkLmVsID0gZWw7CiAgICAgICAgICAgIHJlY3QgPSBlbC5hcHBlbmQoJ3JlY3QnKTsKICAgICAgICAgICAgdGV4dCA9IGVsLmFwcGVuZCgndGV4dCcpLnRleHQoZC5sYWJlbCk7CiAgICAgICAgICAgIHJlY3QuYXR0cihyZWN0QXJvdW5kVGV4dChlbCkpOwogICAgICAgICAgICB0ZXh0LmF0dHIoJ2R5JywgbGlua0xhYmVsT2Zmc2V0KTsKCiAgICAgICAgICAgIGVsLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zZm9ybUxhYmVsKGQubGRhdGEucG9zaXRpb24pKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gUmVtb3ZlIGFueSBsYWJlbHMgdGhhdCBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLgogICAgICAgIGFwaS5saW5rTGFiZWwoKS5leGl0KCkucmVtb3ZlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVjdEFyb3VuZFRleHQoZWwpIHsKICAgICAgICB2YXIgdGV4dCA9IGVsLnNlbGVjdCgndGV4dCcpLAogICAgICAgICAgICBib3ggPSB0ZXh0Lm5vZGUoKS5nZXRCQm94KCk7CgogICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgYmJveCBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkIG9uIFt4LHldCiAgICAgICAgYm94LnggPSAtYm94LndpZHRoIC8gMjsKICAgICAgICBib3gueSA9IC1ib3guaGVpZ2h0IC8gMjsKCiAgICAgICAgLy8gYWRkIHBhZGRpbmcKICAgICAgICBib3gueCAtPSAxOwogICAgICAgIGJveC53aWR0aCArPSAyOwogICAgICAgIHJldHVybiBib3g7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtTGFiZWwocCkgewogICAgICAgIHZhciBkeCA9IHAueDIgLSBwLngxLAogICAgICAgICAgICBkeSA9IHAueTIgLSBwLnkxLAogICAgICAgICAgICB4TWlkID0gZHgvMiArIHAueDEsCiAgICAgICAgICAgIHlNaWQgPSBkeS8yICsgcC55MTsKICAgICAgICByZXR1cm4gc3VzLnRyYW5zbGF0ZSh4TWlkLCB5TWlkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseVBvcnRMYWJlbHMoZGF0YSwgcG9ydExhYmVsRykgewogICAgICAgIHZhciBlbnRlcmluZyA9IHBvcnRMYWJlbEcuc2VsZWN0QWxsKCcucG9ydExhYmVsJykKICAgICAgICAgICAgLmRhdGEoZGF0YSkuZW50ZXIoKS5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuY2xhc3NlZCgncG9ydExhYmVsJywgdHJ1ZSkKICAgICAgICAgICAgLmF0dHIoJ2lkJywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuaWQ7IH0pOwoKICAgICAgICBlbnRlcmluZy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgICAgIHJlY3QgPSBlbC5hcHBlbmQoJ3JlY3QnKSwKICAgICAgICAgICAgICAgIHRleHQgPSBlbC5hcHBlbmQoJ3RleHQnKS50ZXh0KGQubnVtKTsKCiAgICAgICAgICAgIHJlY3QuYXR0cihyZWN0QXJvdW5kVGV4dChlbCkpOwogICAgICAgICAgICB0ZXh0LmF0dHIoJ2R5JywgbGlua0xhYmVsT2Zmc2V0KTsKICAgICAgICAgICAgZWwuYXR0cigndHJhbnNmb3JtJywgc3VzLnRyYW5zbGF0ZShkLngsIGQueSkpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGxhYmVsUG9pbnQobGlua1BvcykgewogICAgICAgIHZhciBsZW5ndGhVcExpbmUgPSAxIC8gMywKICAgICAgICAgICAgZHggPSBsaW5rUG9zLngyIC0gbGlua1Bvcy54MSwKICAgICAgICAgICAgZHkgPSBsaW5rUG9zLnkyIC0gbGlua1Bvcy55MSwKICAgICAgICAgICAgbW92ZWRYID0gZHggKiBsZW5ndGhVcExpbmUsCiAgICAgICAgICAgIG1vdmVkWSA9IGR5ICogbGVuZ3RoVXBMaW5lOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiBtb3ZlZFgsCiAgICAgICAgICAgIHk6IG1vdmVkWQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY0dyb3VwUG9zKGxpbmtQb3MpIHsKICAgICAgICB2YXIgbW92ZWQgPSBsYWJlbFBvaW50KGxpbmtQb3MpOwogICAgICAgIHJldHVybiBzdXMudHJhbnNsYXRlKGxpbmtQb3MueDEgKyBtb3ZlZC54LCBsaW5rUG9zLnkxICsgbW92ZWQueSk7CiAgICB9CgogICAgLy8gY2FsY3VsYXRlcyB3aGVyZSBvbiB0aGUgbGluayB0aGF0IHRoZSBoYXNoIGxpbmUgZm9yIDUrIGxhYmVsIGFwcGVhcnMKICAgIGZ1bmN0aW9uIGhhc2hBdHRycyhsaW5rUG9zKSB7CiAgICAgICAgdmFyIGhhc2hMZW5ndGggPSAyNSwKICAgICAgICAgICAgaGFsZkxlbmd0aCA9IGhhc2hMZW5ndGggLyAyLAogICAgICAgICAgICBkeCA9IGxpbmtQb3MueDIgLSBsaW5rUG9zLngxLAogICAgICAgICAgICBkeSA9IGxpbmtQb3MueTIgLSBsaW5rUG9zLnkxLAogICAgICAgICAgICBsZW5ndGggPSBNYXRoLnNxcnQoKGR4ICogZHgpICsgKGR5ICogZHkpKSwKICAgICAgICAgICAgbW92ZUFtdFggPSAoZHggLyBsZW5ndGgpICogaGFsZkxlbmd0aCwKICAgICAgICAgICAgbW92ZUFtdFkgPSAoZHkgLyBsZW5ndGgpICogaGFsZkxlbmd0aCwKICAgICAgICAgICAgbWlkID0gbGFiZWxQb2ludChsaW5rUG9zKSwKICAgICAgICAgICAgYW5nbGUgPSBNYXRoLmF0YW4oZHkgLyBkeCkgKyA0NTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDE6IG1pZC54IC0gbW92ZUFtdFgsCiAgICAgICAgICAgIHkxOiBtaWQueSAtIG1vdmVBbXRZLAogICAgICAgICAgICB4MjogbWlkLnggKyBtb3ZlQW10WCwKICAgICAgICAgICAgeTI6IG1pZC55ICsgbW92ZUFtdFksCiAgICAgICAgICAgIHN0cm9rZTogYXBpLmxpbmtDb25maWcoKVt0cy50aGVtZSgpXS5iYXNlQ29sb3IsCiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgnICsgYW5nbGUgKyAnLCcgKyBtaWQueCArICcsJyArIG1pZC55ICsgJyknCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0TGFiZWxQb3MobGlua1BvcykgewogICAgICAgIHZhciBwb2ludCA9IGxhYmVsUG9pbnQobGlua1BvcyksCiAgICAgICAgICAgIGRpc3QgPSAyMDsKICAgICAgjNzvVpAxBQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLfnQABABvL1wKgHNsCoB2CVKh/1xuj3dZOm7wqAEAOJ5z4AAAEBCAoAo176AE2l9Izc71Z0MgUAAgwAAAIMAABo9ygf0sUIACetHhMIAEUAC/Tt/kAAQAaxHsCoB2DAqAc2H/WVKpOm7wrG6Pd1gBgBHZvNAAABAQgKAE2l9QCjXvUgIHJldHVybiB7CiAgICAgICAgICAgIHg6IHBvaW50LnggKyBkaXN0LAogICAgICAgICAgICB5OiBwb2ludC55ICsgZGlzdAogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlOdW1MaW5rTGFiZWxzKGRhdGEsIGxibHNHKSB7CiAgICAgICAgdmFyIGxhYmVscyA9IGxibHNHLnNlbGVjdEFsbCgnZy5udW1MaW5rTGFiZWwnKQogICAgICAgICAgICAgICAgLmRhdGEoZGF0YSwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuICdwYWlyLScgKyBkLmlkOyB9KSwKICAgICAgICAgICAgZW50ZXJpbmc7CgogICAgICAgIC8vIHVwZGF0ZSBleGlzdGluZyBsYWJlbHMKICAgICAgICBsYWJlbHMuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyk7CgogICAgICAgICAgICBlbC5hdHRyKHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGNhbGNHcm91cFBvcyhkLmxpbmtDb29yZHMpOyB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlbC5zZWxlY3QoJ2xpbmUnKQogICAgICAgICAgICAgICAgLmF0dHIoaGFzaEF0dHJzKGQubGlua0Nvb3JkcykpOwogICAgICAgICAgICBlbC5zZWxlY3QoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIodGV4dExhYmVsUG9zKGQubGlua0Nvb3JkcykpCiAgICAgICAgICAgICAgICAudGV4dChkLm51bSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGFkZCBuZXcgbGFiZWxzCiAgICAgICAgZW50ZXJpbmcgPSBsYWJlbHMKICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5hdHRyKHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGNhbGNHcm91cFBvcyhkLmxpbmtDb29yZHMpOyB9LAogICAgICAgICAgICAgICAgaWQ6IGZ1bmN0aW9uIChkKSB7IHJldHVybiAncGFpci0nICsgZC5pZDsgfQogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2xhc3NlZCgnbnVtTGlua0xhYmVsJywgdHJ1ZSk7CgogICAgICAgIGVudGVyaW5nLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpOwoKICAgICAgICAgICAgZWwuYXBwZW5kKCdsaW5lJykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdudW1MaW5rSGFzaCcsIHRydWUpCiAgICAgICAgICAgICAgICAuYXR0cihoYXNoQXR0cnMoZC5saW5rQ29vcmRzKSk7CiAgICAgICAgICAgIGVsLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnbnVtTGlua1RleHQnLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIodGV4dExhYmVsUG9zKGQubGlua0Nvb3JkcykpCiAgICAgICAgICAgICAgICAudGV4dChkLm51bSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHJlbW92ZSBvbGQgbGFiZWxzCiAgICAgICAgbGFiZWxzLmV4aXQoKS5yZW1vdmUoKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTW9kdWxlIGRlZmluaXRpb24KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvRDNTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywgJ0ljb25TZXJ2aWNlJywgJ1RoZW1lU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9zdXNfLCBfaXNfLCBfdHNfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgc3VzID0gX3N1c187CiAgICAgICAgICAgIGlzID0gX2lzXzsKICAgICAgICAgICAgdHMgPSBfdHNfOwoKICAgICAgICAgICAgaWNmZyA9IGlzLmljb25Db25maWcoKTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXREMyhfYXBpXykgewogICAgICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lEMygpIHsgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXREMzogaW5pdEQzLAogICAgICAgICAgICAgICAgZGVzdHJveUQzOiBkZXN0cm95RDMsCgogICAgICAgICAgICAgICAgaW5jRGV2TGFiSW5kZXg6IGluY0RldkxhYkluZGV4LAogICAgICAgICAgICAgICAgYWRqdXN0UmVjdFRvRml0VGV4dDogYWRqdXN0UmVjdFRvRml0VGV4dCwKICAgICAgICAgICAgICAgIGhvc3RMYWJlbDogaG9zdExhYmVsLAogICAgICAgICAgICAgICAgZGV2aWNlTGFiZWw6IGRldmljZUxhYmVsLAogICAgICAgICAgICAgICAgdHJpbUxhYmVsOiB0cmltTGFiZWwsCgogICAgICAgICAgICAgICAgdXBkYXRlRGV2aWNlTGFiZWw6IHVwZGF0ZURldmljZVJlbmRlcmluZywKICAgICAgICAgICAgICAgIHVwZGF0ZUhvc3RMYWJlbDogdXBkYXRlSG9zdExhYmVsLAogICAgICAgICAgICAgICAgdXBkYXRlRGV2aWNlQ29sb3JzOiB1cGRhdGVEZXZpY2VDb2xvcnMsCgogICAgICAgICAgICAgICAgZGV2aWNlRXhpc3Rpbmc6IGRldmljZUV4aXN0aW5nLAogICAgICAgICAgICAgICAgaG9zdEV4aXN0aW5nOiBob3N0RXhpc3RpbmcsCiAgICAgICAgICAgICAgICBkZXZpY2VFbnRlcjogZGV2aWNlRW50ZXIsCiAgICAgICAgICAgICAgICBob3N0RW50ZXI6IGhvc3RFbnRlciwKICAgICAgICAgICAgICAgIGhvc3RFeGl0OiBob3N0RXhpdCwKICAgICAgICAgICAgICAgIGRldmljZUV4aXQ6IGRldmljZUV4aXQsCgogICAgICAgICAgICAgICAgbGlua0VudGVyaW5nOiBsaW5rRW50ZXJpbmcsCiAgICAgICAgICAgICAgICBhcHBseUxpbmtMYWJlbHM6IGFwcGx5TGlua0xhYmVscywKICAgICAgICAgICAgICAgIHRyYW5zZm9ybUxhYmVsOiB0cmFuc2Zvcm1MYWJlbCwKICAgICAgICAgICAgICAgIGFwcGx5UG9ydExhYmVsczogYXBwbHlQb3J0TGFiZWxzLAogICAgICAgICAgICAgICAgYXBwbHlOdW1MaW5rTGFiZWxzOiBhcHBseU51bUxpbmtMYWJlbHMKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Cozc71ZGMwUAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS36EAAQAby9MCoBzbAqAdglSof9cbo93WTpvrKgBADuNtOAAABAQgKAKNe+gBNpfWM3O9WEDcFAI8CAACPAgAACAAnrR4TaPcoH9LFCABFAAKBt+lAAEAG8KbAqAc2wKgHYJUqH/XG6Pd1k6b6yoAYA7hSBwAAAQEICgCjXvoATaX1R0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb0xpbmsuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71afPwUAEiUAABIlAABo9ygf0sUIACetHhMIAEUAJQTuAUAAQAaYC8CoB2DAqAc2H/WVKpOm+srG6PnCgBgBJ7TdAAABAQgKAE2l9gCjXvpIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogOTMxOQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBMaW5rIE1vZHVsZS4KIEZ1bmN0aW9ucyBmb3IgaGlnaGxpZ2h0aW5nL3NlbGVjdGluZyBsaW5rcwogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csIGZzLCBzdXMsIHRzLCBmbGFzaCwgdHNzLCB0cHM7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBhcGksCiAgICAgICAgdGQzLAogICAgICAgIG5ldHdvcmssCiAgICAgICAgc2hvd1BvcnRzID0gdHJ1ZSwgICAgICAgLy8gZW5hYmxlIHBvcnQgaGlnaGxpZ2h0aW5nIGJ5IGRlZmF1bHQKICAgICAgICBlbmhhbmNlZExpbmsgPSBudWxsLCAgICAvLyB0aGUgbGluayBvdmVyIHdoaWNoIHRoZSBtb3VzZSBpcyBob3ZlcmluZwogICAgICAgIHNlbGVjdGVkTGluayA9IG51bGw7ICAgIC8vIHRoZSBsaW5rIHdoaWNoIGlzIGN1cnJlbnRseSBzZWxlY3RlZAoKICAgIC8vIFNWRyBlbGVtZW50czsKICAgIHZhciBzdmc7CgoKICAgIC8vID09PT09PT09IEFMR09SSVRITSBUTyBGSU5EIExJTksgQ0xPU0VTVCBUTyBNT1VTRSA9PT09PT09PQoKICAgIGZ1bmN0aW9uIGdldExvZ2ljYWxNb3VzZVBvc2l0aW9uKGNvbnRhaW5lcikgewogICAgICAgIHZhciBtID0gZDMubW91c2UoY29udGFpbmVyKSwKICAgICAgICAgICAgc2MgPSBhcGkuem9vbWVyLnNjYWxlKCksCiAgICAgICAgICAgIHRyID0gYXBpLnpvb21lci50cmFuc2xhdGUoKSwKICAgICAgICAgICAgbXggPSAobVswXSAtIHRyWzBdKSAvIHNjLAogICAgICAgICAgICBteSA9IChtWzFdIC0gdHJbMV0pIC8gc2M7CiAgICAgICAgcmV0dXJuIHt4OiBteCwgeTogbXl9OwogICAgfQoKCiAgICBmdW5jdGlvbiBzcSh4KSB7IHJldHVybiB4ICogeDsgfQoKICAgIGZ1bmN0aW9uIG1kaXN0KHAsIG0pIHsKICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHNxKHAueCAtIG0ueCkgKyBzcShwLnkgLSBtLnkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm94KGRpc3QpIHsKICAgICAgICByZXR1cm4gZGlzdCAvIGFwaS56b29tZXIuc2NhbGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wdXRlTmVhcmVzdE5vZGUobW91c2UpIHsKICAgICAgICB2YXIgcHJveGltaXR5ID0gcHJveCgzMCksCiAgICAgICAgICAgIG5lYXJlc3QgPSBudWxsLAogICAgICAgICAgICBtaW5EaXN0OwoKICAgICAgICBpZiAobmV0d29yay5ub2Rlcy5sZW5ndGgpIHsKICAgICAgICAgICAgbWluRGlzdCA9IHByb3hpbWl0eSAqIDI7CgogICAgICAgICAgICBuZXR3b3JrLm5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBkaXN0OwoKICAgICAgICAgICAgICAgIGlmICghYXBpLnNob3dIb3N0cygpICYmIGQuY2xhc3MgPT09ICdob3N0JykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBoaWRkZW4gaG9zdHMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkaXN0ID0gbWRpc3Qoe3g6IGQueCwgeTogZC55fSwgbW91c2UpOwogICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBtaW5EaXN0ICYmIGRpc3QgPCBwcm94aW1pdHkpIHsKICAgICAgICAgICAgICAgICAgICBtaW5EaXN0ID0gZGlzdDsKICAgICAgICAgICAgICAgICAgICBuZWFyZXN0ID0gZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZWFyZXN0OwogICAgfQoKCiAgICBmdW5jdGlvbiBjb21wdXRlTmVhcmVzdExpbmsobW91c2UpIHsKICAgICAgICB2YXIgcHJveGltaXR5ID0gcHJveCgzMCksCiAgICAgICAgICAgIG5lYXJlc3QgPSBudWxsLAogICAgICAgICAgICBtaW5EaXN0OwoKICAgICAgICBmdW5jdGlvbiBwZHJvcChsaW5lLCBtb3VzZSkgewogICAgICAgICAgICB2YXIgeDEgPSBsaW5lLngxLAogICAgICAgICAgICAgICAgeTEgPSBsaW5lLnkxLAogICAgICAgICAgICAgICAgeDIgPSBsaW5lLngyLAogICAgICAgICAgICAgICAgeTIgPSBsaW5lLnkyLAogICAgICAgICAgICAgICAgeDMgPSBtb3VzZS54LAogICAgICAgICAgICAgICAgeTMgPSBtb3VzZS55LAogICAgICAgICAgICAgICAgayA9ICgoeTIteTEpICogKHgzLXgxKSAtICh4Mi14MSkgKiAoeTMteTEpKSAvCiAgICAgICAgICAgICAgICAgICAgKHNxKHkyLXkxKSArIHNxKHgyLXgxKSksCiAgICAgICAgICAgICAgICB4NCA9IHgzIC0gayAqICh5Mi15MSksCiAgICAgICAgICAgICAgICB5NCA9IHkzICsgayAqICh4Mi14MSk7CiAgICAgICAgICAgIHJldHVybiB7eDp4NCwgeTp5NH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5lSGl0KGxpbmUsIHAsIG0pIHsKICAgICAgICAgICAgaWYgKHAueCA8IGxpbmUueDEgJiYgcC54IDwgbGluZS54MikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBpZiAocC54ID4gbGluZS54MSAmJiBwLnggPiBsaW5lLngyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGlmIChwLnkgPCBsaW5lLnkxICYmIHAueSA8IGxpbmUueTIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHAueSA+IGxpbmUueTEgJiYgcC55ID4gbGluZS55MikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAvLyBsaW5lIGludGVyc2VjdHMsIGJ1dCBhcmUgd2UgY2xvc2UgZW5vdWdoPwogICAgICAgICAgICByZXR1cm4gbWRpc3QocCwgbSkgPD0gcHJveGltaXR5OwogICAgICAgIH0KCiAgICAgICAgaWYgKG5ldHdvcmsubGlua3MubGVuZ3RoKSB7CiAgICAgICAgICAgIG1pbkRpc3QgPSBwcm94aW1pdHkgKiAyOwoKICAgICAgICAgICAgbmV0d29yay5saW5rcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFwaS5zaG93SG9zdHMoKSAmJiBkLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBoaWRkZW4gaG9zdCBsaW5rcwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICBwb2ludCA9IHBkcm9wKGxpbmUsIG1vdXNlKSwKICAgICAgICAgICAgICAgICAgICBoaXQgPSBsaW5lSGl0KGxpbmUsIHBvaW50LCBtb3VzZSksCiAgICAgICAgICAgICAgICAgICAgZGlzdDsKCiAgICAgICAgICAgICAgICBpZiAoaGl0KSB7CiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IG1kaXN0KHBvaW50LCBtb3VzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBtaW5EaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRpc3QgPSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICBuZWFyZXN0ID0gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmVhcmVzdDsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmhhbmNlTGluayhsZGF0YSkgewogICAgICAgIC8vIGlmIHRoZSBuZXcgbGluayBpcyBzYW1lIGFzIG9sZCBsaW5rLCBkbyBub3RoaW5nCiAgICAgICAgaWYgKGVuaGFuY2VkTGluayAmJiBsZGF0YSAmJiBlbmhhbmNlZExpbmsua2V5ID09PSBsZGF0YS5rZXkpIHJldHVybjsKCiAgICAgICAgLy8gZmlyc3QsIHVuZW5oYW5jZSB0aGUgY3VycmVudGx5IGVuaGFuY2VkIGxpbmsKICAgICAgICBpZiAoZW5oYW5jZWRMaW5rKSB7CiAgICAgICAgICAgIHVuZW5oYW5jZShlbmhhbmNlZExpbmspOwogICAgICAgIH0KICAgICAgICBlbmhhbmNlZExpbmsgPSBsZGF0YTsKICAgICAgICBpZiAoZW5oYW5jZWRMaW5rKSB7CiAgICAgICAgICAgIGVuaGFuY2UoZW5oYW5jZWRMaW5rKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdW5lbmhhbmNlKGQpIHsKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGxpbmsgZWxlbWVudCBub3Qgc2V0CiAgICAgICAgaWYgKGQuZWwpIHsKICAgICAgICAgICAgZC5lbC5jbGFzc2VkKCdlbmhhbmNlZCcsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgYXBpLnBvcnRMYWJlbEcoKS5zZWxlY3RBbGwoJy5wb3J0TGFiZWwnKS5yZW1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmhhbmNlKGQpIHsKICAgICAgICB2YXIgZGF0YSA9IFtdLAogICAgICAgICAgICBwb2ludDsKCiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBsaW5rIGVsZW1lbnQgbm90IHNldAogICAgICAgIGlmICghZC5lbCkgcmV0dXJuOwoKICAgICAgICBkLmVsLmNsYXNzZWQoJ2VuaGFuY2VkJywgdHJ1ZSk7CgogICAgICAgIC8vIERlZmluZSBwb3J0IGxhYmVsIGRhdGEgb2JqZWN0cy4KICAgICAgICAvLyBOT1RFOiBzcmMgcG9ydCBpcyBhYnNlbnQgaW4gdGhlIGNhc2Ugb2YgaG9zdC1saW5rcy4KCiAgICAgICAgcG9pbnQgPSBsb2NhdGVQb3J0TGFiZWwoZCk7CiAgICAgICAgYW5ndWxhci5leHRlbmQocG9pbnQsIHsKICAgICAgICAgICAgaWQ6ICd0b3BvLXBvcnQtdGd0JywKICAgICAgICAgICAgbnVtOiBkLnRndFBvcnQKICAgICAgICB9KTsKICAgICAgICBkYXRhLnB1c2gocG9pbnQpOwoKICAgICAgICBpZiAoZC5zcmNQb3J0KSB7CiAgICAgICAgICAgIHBvaW50ID0gbG9jYXRlUG9ydExhYmVsKGQsIDEpOwogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChwb2ludCwgewogICAgICAgICAgICAgICAgaWQ6ICd0b3BvLXBvcnQtc3JjJywKICAgICAgICAgICAgICAgIG51bTogZC5zcmNQb3J0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkYXRhLnB1c2gocG9pbnQpOwogICAgICAgIH0KCiAgICAgICAgdGQzLmFwcGx5UG9ydExhYmVscyhkYXRhLCBhcGkucG9ydExhYmVsRygpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2NhdGVQb3J0TGFiZWwobGluaywgc3JjKSB7CiAgICAgICAgdmFyIG9mZnNldCA9IDMyLAogICAgICAgICAgICBwb3MgPSBsaW5rLnBvc2l0aW9uLAogICAgICAgICAgICBuZWFyWCA9IHNyYyA/IHBvcy54MSA6IHBvcy54MiwKICAgICAgICAgICAgbmVhclkgPSBzcmMgPyBwb3MueTEgOiBwb3MueTIsCiAgICAgICAgICAgIGZhclggPSBzcmMgPyBwb3MueDIgOiBwb3MueDEsCiAgICAgICAgICAgIGZhclkgPSBzcmMgPyBwb3MueTIgOiBwb3MueTE7CgogICAgICAgIGZ1bmN0aW9uIGRpc3QoeCwgeSkgeyByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7IH0KCiAgICAgICAgdmFyIGR4ID0gZmFyWCAtIG5lYXJYLAogICAgICAgICAgICBkeSA9IGZhclkgLSBuZWFyWSwKICAgICAgICAgICAgayA9IG9mZnNldCAvIGRpc3QoZHgsIGR5KTsKCiAgICAgICAgcmV0dXJuIHt4OiBrICogZHggKyBuZWFyWCwgeTogayAqIGR5ICsgbmVhcll9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdExpbmsobGRhdGEpIHsKICAgICAgICAvLyBpZiB0aGUgbmV3IGxpbmsgaXMgc2FtZSBhcyBvbGQgbGluaywgZG8gbm90aGluZwogICAgICAgIGlmIChzZWxlY3RlZExpbmsgJiYgbGRhdGEgJiYgc2VsZWN0ZWRMaW5rLmtleSA9PT0gbGRhdGEua2V5KSByZXR1cm47CgogICAgICAgIC8vIG1ha2Ugc3VyZSBubyBub2RlcyBhcmUgc2VsZWN0ZWQKICAgICAgICB0c3MuZGVzZWxlY3RBbGwoKTsKCiAgICAgICAgLy8gZmlyc3QsIHVuZW5oYW5jZSB0aGUgY3VycmVudGx5IGVuaGFuY2VkIGxpbmsKICAgICAgICBpZiAoc2VsZWN0ZWRMaW5rKSB7CiAgICAgICAgICAgIHVuc2VsTGluayhzZWxlY3RlZExpbmspOwogICAgICAgIH0KICAgICAgICBzZWxlY3RlZExpbmsgPSBsZGF0YTsKICAgICAgICBpZiAoc2VsZWN0ZWRMaW5rKSB7CiAgICAgICAgICAgIHNlbExpbmsoc2VsZWN0ZWRMaW5rKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdW5zZWxMaW5rKGQpIHsKICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGxpbmsgZWxlbWVudCBub3Qgc2V0CiAgICAgICAgaWYgKGQuZWwpIHsKICAgICAgICAgICAgZC5lbC5jbGFzc2VkKCdzZWxlY3RlZCcsIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2VsTGluayhkKSB7CiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBsaW5rIGVsZW1lbnQgbm90IHNldAogICAgICAgIGlmICghZC5lbCkgcmV0dXJuOwoKICAgICAgICBkLmVsLmNsYXNzZWQoJ3NlbGVjdGVkJywgdHJ1ZSk7CgogICAgICAgIHRwcy5kaXNwbGF5TGluayhkKTsKICAgICAgICB0cHMuZGlzcGxheVNvbWV0aGluZygpOwogICAgfQoKICAgIC8vID09PT09PSBNT1VTRSBFVkVOVCBIQU5ETEVSUyA9PT09PT0KCiAgICBmdW5jdGlvbiBtb3VzZU1vdmVIYW5kbGVyKCkgewogICAgICAgIHZhciBtcCA9IGdldExvZ2ljYWxNb3VzZVBvc2l0aW9uKHRoaXMpLAogICAgICAgICAgICBsaW5rID0gY29tcHV0ZU5lYXJlc3RMaW5rKG1wKTsKICAgICAgICBlbmhhbmNlTGluayhsaW5rKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZUNsaWNrSGFuZGxlcigpIHsKICAgICAgICB2YXIgbXAsIGxpbmssIG5vZGU7CgogICAgICAgIGlmICghdHNzLmNsaWNrQ29uc3VtZWQoKSkgewogICAgICAgICAgICBtcCA9IGdldExvZ2ljYWxNb3VzZVBvc2l0aW9uKHRoaXMpOwogICAgICAgICAgICBub2RlID0gY29tcHV0ZU5lYXJlc3ROb2RlKG1wKTsKICAgICAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgICAgICAgICRsb2cuZGVidWcoJ2ZvdW5kIG5lYXJlc3Qgbm9kZTonLCBub2RlLmxhYmVsc1sxXSk7CiAgICAgICAgICAgICAgICB0c3Muc2VsZWN0T2JqZWN0KG5vZGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbGluayA9IGNvbXB1dGVOZWFyZXN0TGluayhtcCk7CiAgICAgICAgICAgICAgICBzZWxlY3RMaW5rKGxpbmspOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gdG9nZ2xlUG9ydHMoeCkgewogICAgICAgIHZhciBrZXYgPSAoeCA9PT0gJ2tleWV2JyksCiAgICAgICAgICAgIG9uID0ga2V2ID8gIXNob3dQb3J0cyA6ICEheCwKICAgICAgICAgICAgd2hhdCA9IG9uID8gJ0VuYWJsZScgOiAnRGlzYWJsZScsCiAgICAgICAgICAgIGhhbmRsZXIgPSBvbiA/IG1vdXNlTW92ZUhhbmRsZXIgOiBudWxsOwoKICAgICAgICBzaG93UG9ydHMgPSBvbjsKCiAgICAgICAgaWYgKCFvbikgewogICAgICAgICAgICBlbmhhbmNlTGluayhudWxsKTsKICAgICAgICB9CiAgICAgICAgc3ZnLm9uKCdtb3VzZW1vdmUnLCBoYW5kbGVyKTsKICAgICAgICBmbGFzaC5mbGFzaCh3aGF0ICsgJyBwb3J0IGhpZ2hsaWdodGluZycpOwogICAgICAgIHJldHVybiBvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXNlbGVjdExpbmsoKSB7CiAgICAgICAgaWYgKHNlbGVjdGVkTGluaykgewogICAgICAgICAgICB1bnNlbExpbmsoc2VsZWN0ZWRMaW5rKTsKICAgICAgICAgICAgc2VsZWN0ZWRMaW5rID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTW9kdWxlIGRlZmluaXRpb24KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgICAgICAuZmFjdG9yeSgnVG9wb0xpbmtTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywgJ1RoZW1lU2VydmljZScsICdGbGFzaFNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1NlbGVjdFNlcnZpY2UnLCAnVG9wb1BhbmVsU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9zdXNfLCBfdHNfLCBfZmxhc2hfLCBfdHNzXywgX3Rwc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBzdXMgPSBfc3VzXzsKICAgICAgICAgICAgdHMgPSBfdHNfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiAgICAgICAgICAgIHRzcyA9IF90c3NfOwogICAgICAgICAgICB0cHMgPSBfdHBzXzsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRMaW5rKF9hcGlfLCBfdGQzXykgewogICAgICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgICAgICAgICB0ZDMgPSBfdGQzXzsKICAgICAgICAgICAgICAgIHN2ZyA9IGFwaS5zdmc7CiAgICAgICAgICAgICAgICBuZXR3b3JrID0gYXBpLm5ldHdvcms7CiAgICAgICAgICAgICAgICBpZiAoc2hvd1BvcnRzICYmICFmcy5pc01vYmlsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgc3ZnLm9uKCdtb3VzZW1vdmUnLCBtb3VzZU1vdmVIYW5kbGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN2Zy5vbignY2xpY2snLCBtb3VzZUNsaWNrSGFuZGxlcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lMaW5rKCkgewogICAgICAgICAgICAgICAgLy8gdW5jb25kaXRpb25hbGx5IHJlbW92ZSBhbnkgZXZlbnQgaGFuZGxlcnMKICAgICAgICAgICAgICAgIHN2Zy5vbignbW91c2Vtb3ZlJywgbnVsbCk7CiAgICAgICAgICAgICAgICBzdmcub24oJ2NsaWNrJywgbnVsbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0TGluazogaW5pdExpbmssCiAgICAgICAgICAgICAgICBkZXN0cm95TGluazogZGVzdHJveUxpbmssCiAgICAgICAgICAgICAgICB0b2dnbGVQb3J0czogdG9nZ2xlUG9ydHMsCiAgICAgICAgICAgICAgICBkZXNlbGVjdExpbms6IGRlc2VsZWN0TGluawogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKjNzvVvc/BQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLfqQABABvLywKgHNsCoB2CVKh/1xuj5wpOnH5qAEARLs5wAAAEBCAoAo177AE2l9ozc71b6RgUAej4AAHo+AABo9ygf0sUIACetHhMIAEUAPmyNeEAAQAbfLMCoB2DAqAc2H/WVLaaSz3dP2bqBgBABUM5FAAABAQgKAE2l9gCjXvdIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo4MDAwDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBGb3JjZSBNb2R1bGUuCiBWaXN1YWxpemF0aW9uIG9mIHRoZSB0b3BvbG9neSBpbiBhbiBTVkcgbGF5ZXIsIHVzaW5nIGEgRDMgRm9yY2UgTGF5b3V0LgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICR0aW1lb3V0LCBmcywgc3VzLCB0cywgZmxhc2gsIHdzcywgdG92LAogICAgICAgIHRpcywgdG1zLCB0ZDMsIHRzcywgdHRzLCB0b3MsIGZsdHIsIHRscywgdXBsaW5rLCBzdmc7CgogICAgLy8gY29uZmlndXJhdGlvbgogICAgdmFyIGxpbmtDb25maWcgPSB7CiAgICAgICAgbGlnaHQ6IHsKICAgICAgICAgICAgYmFzZUNvbG9yOiAnIzY2NicsCiAgICAgICAgICAgIGluQ29sb3I6ICcjNjZmJywKICAgICAgICAgICAgb3V0Q29sb3I6ICcjZjAwJwogICAgICAgIH0sCiAgICAgICAgZGFyazogewogICAgICAgICAgICBiYXNlQ29sb3I6ICcjYWFhJywKICAgICAgICAgICAgaW5Db2xvcjogJyM2NmYnLAogICAgICAgICAgICBvdXRDb2xvcjogJyNmNjYnCiAgICAgICAgfSwKICAgICAgICBpbldpZHRoOiAxMiwKICAgICAgICBvdXRXaWR0aDogMTAKICAgIH07CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBzZXR0aW5ncywgICAvLyBtZXJnZWQgZGVmYXVsdCBzZXR0aW5ncyBhbmQgb3B0aW9ucwogICAgICAgIGZvcmNlLCAgICAgIC8vIGZvcmNlIGxheW91dCBvYmplY3QKICAgICAgICBkcmFnLCAgICAgICAvLyBkcmFnIGJlaGF2aW9yIGhhbmRsZXIKICAgICAgICBuZXR3b3JrID0gewogICAgICAgICAgICBub2RlczogW10sCiAgICAgICAgICAgIGxpbmtzOiBbXSwKICAgICAgICAgICAgbGlua3NCeURldmljZToge30sCiAgICAgICAgICAgIGxvb2t1cDoge30sCiAgICAgICAgICAgIHJldkxpbmtUb0tleToge30KICAgICAgICB9LAogICAgICAgIGx1LCAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0aGFuZCBmb3IgbG9va3VwCiAgICAgICAgcmxrLCAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnRoYW5kIGZvciByZXZMaW5rdG9LZXkKICAgICAgICBzaG93SG9zdHMgPSBmYWxzZSwgICAgICAvLyB3aGV0aGVyIGhvc3RzIGFyZSBkaXNwbGF5ZWQKICAgICAgICBzaG93T2ZmbGluZSA9IHRydWUsICAgICAvLyB3aGV0aGVyIG9mZmxpbmUgZGV2aWNlcyBhcmUgZGlzcGxheWVkCiAgICAgICAgbm9kZUxvY2sgPSBmYWxzZSwgICAgICAgLy8gd2hldGhlciBub2RlcyBjYW4gYmUgZHJhZ2dlZCBvciBub3QgKGxvY2tlZCkKICAgICAgICBmVGltZXIsICAgICAgICAgICAgICAgICAvLyB0aW1lciBmb3IgZGVsYXllZCBmb3JjZSBsYXlvdXQKICAgICAgICBmTm9kZXNUaW1lciwgICAgICAgICAgICAvLyB0aW1lciBmb3IgZGVsYXllZCBub2RlcyB1cGRhdGUKICAgICAgICBmTGlua3NUaW1lciwgICAgICAgICAgICAvLyB0aW1lciBmb3IgZGVsYXllZCBsaW5rcyB1cGRhdGUKICAgICAgICBkaW0sICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZm9yY2UgbGF5b3V0IFt3LGhdCiAgICAgICAgbGlua051bXMgPSBbXTsgICAgICAgICAgLy8gYXJyYXkgb2YgbGluayBudW1iZXIgbGFiZWxzCgogICAgLy8gU1ZHIGVsZW1lbnRzOwogICAgdmFyIGxpbmtHLCBsaW5rTGFiZWxHLCBudW1MaW5rTGJsc0csIHBvcnRMYWJlbEcsIG5vZGVHOwoKICAgIC8vIEQzIHNlbGVjdGlvbnM7CiAgICB2YXIgbGluaywgbGlua0xhYmVsLCBub2RlOwoKICAgIC8vIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGZvcmNlIGxheW91dAogICAgdmFyIGRlZmF1bHRTZXR0aW5ncyA9IHsKICAgICAgICBncmF2aXR5OiAwLjQsCiAgICAgICAgZnJpY3Rpb246IDAuNywKICAgICAgICBjaGFyZ2U6IHsKICAgICAgICAgICAgLy8gbm90ZToga2V5IGlzIG5vZGUuY2xhc3MKICAgICAgICAgICAgZGV2aWNlOiAtODAwMCwKICAgICAgICAgICAgaG9zdDogLTUwMDAsCiAgICAgICAgICAgIF9kZWZfOiAtMTIwMDAKICAgICAgICB9LAogICAgICAgIGxpbmtEaXN0YW5jZTogewogICAgICAgICAgICAvLyBub3RlOiBrZXkgaXMgbGluay50eXBlCiAgICAgICAgICAgIGRpcmVjdDogMTAwLAogICAgICAgICAgICBvcHRpY2FsOiAxMjAsCiAgICAgICAgICAgIGhvc3RMaW5rOiAzLAogICAgICAgICAgICBfZGVmXzogNTAKICAgICAgICB9LAogICAgICAgIGxpbmtTdHJlbmd0aDogewogICAgICAgICAgICAvLyBub3RlOiBrZXkgaXMgbGluay50eXBlCiAgICAgICAgICAgIC8vIHJhbmdlOiB7MC4wIC4uLiAxLjB9CiAgICAgICAgICAgIC8vZGlyZWN0OiAxLjAsCiAgICAgICAgICAgIC8vb3B0aWNhbDogMS4wLAogICAgICAgICAgICAvL2hvc3RMaW5rOiAxLjAsCiAgICAgICAgICAgIF9kZWZfOiAxLjAKICAgICAgICB9CiAgICB9OwoKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gPT09IEVWRU5UIEhBTkRMRVJTCgogICAgZnVuY3Rpb24gYWRkRGV2aWNlKGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkOwoKICAgICAgICB1cGxpbmsuc2hvd05vRGV2cyhmYWxzZSk7CgogICAgICAgIC8vIGFsdGhvdWdoIHRoaXMgaXMgYW4gYWRkIGRldmljZSBldmVudCwgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZQogICAgICAgIC8vICBkZXZpY2UsIHRyZWF0IGl0IGFzIGFuIHVwZGF0ZSBpbnN0ZWFkLi4KICAgICAgICBpZiAobHVbaWRdKSB7CiAgICAgICAgICAgIHVwZGF0ZURldmljZShkYXRhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZCA9IHRtcy5jcmVhdGVEZXZpY2VOb2RlKGRhdGEpOwogICAgICAgIG5ldHdvcmsubm9kZXMucHVzaChkKTsKICAgICAgICBsdVtpZF0gPSBkOwogICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgZlN0YXJ0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRGV2aWNlKGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkID0gbHVbaWRdLAogICAgICAgICAgICB3YXNPbmxpbmU7CgogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIHdhc09ubGluZSA9IGQub25saW5lOwogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChkLCBkYXRhKTsKICAgICAgICAgICAgaWYgKHRtcy5wb3NpdGlvbk5vZGUoZCwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIHNlbmRVcGRhdGVNZXRhKGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgICAgIGlmICh3YXNPbmxpbmUgIT09IGQub25saW5lKSB7CiAgICAgICAgICAgICAgICB0bXMuZmluZEF0dGFjaGVkTGlua3MoZC5pZCkuZm9yRWFjaChyZXN0eWxlTGlua0VsZW1lbnQpOwogICAgICAgICAgICAgICAgdXBkYXRlT2ZmbGluZVZpc2liaWxpdHkoZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRGV2aWNlKGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkID0gbHVbaWRdOwogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIHJlbW92ZURldmljZUVsZW1lbnQoZCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEhvc3QoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQsIGxuazsKCiAgICAgICAgLy8gYWx0aG91Z2ggdGhpcyBpcyBhbiBhZGQgaG9zdCBldmVudCwgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZQogICAgICAgIC8vICBob3N0LCB0cmVhdCBpdCBhcyBhbiB1cGRhdGUgaW5zdGVhZC4uCiAgICAgICAgaWYgKGx1W2lkXSkgewogICAgICAgICAgICB1cGRhdGVIb3N0KGRhdGEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBkID0gdG1zLmNyZWF0ZUhvc3ROb2RlKGRhdGEpOwogICAgICAgIG5ldHdvcmsubm9kZXMucHVzaChkKTsKICAgICAgICBsdVtpZF0gPSBkOwogICAgICAgIHVwZGF0ZU5vZGVzKCk7CgogICAgICAgIGxuayA9IHRtcy5jcmVhdGVIb3N0TGluayhkYXRhKTsKICAgICAgICBpZiAobG5rKSB7CiAgICAgICAgICAgIGQubGlua0RhdGEgPSBsbms7ICAgIC8vIGNhY2hlIHJlZiBvbiBpdHMgaG9zdAogICAgICAgICAgICBuZXR3b3JrLmxpbmtzLnB1c2gobG5rKTsKICAgICAgICAgICAgbHVbZC5pbmdyZXNzXSA9IGxuazsKICAgICAgICAgICAgbHVbZC5lZ3Jlc3NdID0gbG5rOwogICAgICAgICAgICB1cGRhdGVMaW5rcygpOwogICAgICAgIH0KICAgICAgICBmU3RhcnQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVIb3N0KGRhdGEpIHsKICAgICAgICB2YXIgaWQgPSBkYXRhLmlkLAogICAgICAgICAgICBkID0gbHVbaWRdOwogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGQsIGRhdGEpOwogICAgICAgICAgICBpZiAodG1zLnBvc2l0aW9uTm9kZShkLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2VuZFVwZGF0ZU1ldGEoZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXBkYXRlTm9kZXMoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbW92ZUhvc3QoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBsdVtpZF0sCiAgICAgICAgICAgIGxuazsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAvLyBmaXJzdCByZW1vdmUgdGhlIG9sZCBob3N0IGxpbmsKICAgICAgICAgICAgcmVtb3ZlTGlua0VsZW1lbnQoZC5saW5rRGF0YSk7CgogICAgICAgICAgICAvLyBtZXJnZSBuZXcgZGF0YQogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChkLCBkYXRhKTsKICAgICAgICAgICAgaWYgKHRtcy5wb3NpdGlvbk5vZGUoZCwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIHNlbmRVcGRhdGVNZXRhKGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgY3JlYXRlIGEgbmV3IGhvc3QgbGluawogICAgICAgICAgICBsbmsgPSB0bXMuY3JlYXRlSG9zdExpbmsoZGF0YSk7CiAgICAgICAgICAgIGlmIChsbmspIHsKICAgICAgICAgICAgICAgIGQubGlua0RhdGEgPSBsbms7CiAgICAgICAgICAgICAgICBuZXR3b3JrLmxpbmtzLnB1c2gobG5rKTsKICAgICAgICAgICAgICAgIGx1W2QuaW5ncmVzc10gPSBsbms7CiAgICAgICAgICAgICAgICBsdVtkLmVncmVzc10gPSBsbms7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgICAgIHVwZGF0ZUxpbmtzKCk7CiAgICAgICAgICAgIGZSZXN1bWUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlSG9zdChkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCA9IGx1W2lkXTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICByZW1vdmVIb3N0RWxlbWVudChkLCB0cnVlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWRkTGluayhkYXRhKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRtcy5maW5kTGluayhkYXRhLCAnYWRkJyksCiAgICAgICAgICAgIGJhZCA9IHJlc3VsdC5iYWRMb2dpYywKICAgICAgICAgICAgZCA9IHJlc3VsdC5sZGF0YTsKCiAgICAgICAgaWYgKGJhZCkgewogICAgICAgICAgICAkbG9nLmRlYnVnKGJhZCArICc6ICcgKyBsaW5rLmlkKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgLy8gd2UgYWxyZWFkeSBoYXZlIGEgYmFja2luZyBzdG9yZSBsaW5rIGZvciBzcmMvZHN0IG5vZGVzCiAgICAgICAgICAgIGFkZExpbmtVcGRhdGUoZCwgZGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIG5vIGJhY2tpbmcgc3RvcmUgbGluayB5ZXQKICAgICAgICBkID0gdG1zLmNyZWF0ZUxpbmsoZGF0YSk7CiAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgbmV0d29yay5saW5rcy5wdXNoKGQpOwogICAgICAgICAgICBhZ2dyZWdhdGVMaW5rKGQsIGRhdGEpOwogICAgICAgICAgICBsdVtkLmtleV0gPSBkOwogICAgICAgICAgICB1cGRhdGVMaW5rcygpOwogICAgICAgICAgICBmU3RhcnQoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlTGluayhkYXRhKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRtcy5maW5kTGluayhkYXRhLCAndXBkYXRlJyksCiAgICAgICAgICAgIGJhZCA9IHJlc3VsdC5iYWRMb2dpYzsKICAgICAgICBpZiAoYmFkKSB7CiAgICAgICAgICAgICRsb2cuZGVidWcoYmFkICsgJzogJyArIGxpbmsuaWQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJlc3VsdC51cGRhdGVXaXRoKGRhdGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUxpbmsoZGF0YSkgewogICAgICAgIHZhciByZXN1bHQgPSB0bXMuZmluZExpbmsoZGF0YSwgJ3JlbW92ZScpOwoKICAgICAgICBpZiAoIXJlc3VsdC5iYWRMb2dpYykgewogICAgICAgICAgICByZXN1bHQucmVtb3ZlUmF3TGluaygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0b3BvU3RhcnREb25lKGRhdGEpIHsKICAgICAgICAvLyBjYWxsZWQgd2hlbiB0aGUgaW5pdGlhbCBiYXJyYWdlIG9mIGRhdGEgaGFzIGJlZW4gc2VudCBmcm9tIHNlcnZlcgogICAgICAgIHVwbGluay50b3BvU3RhcnREb25lKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gbm9kZUJ5SWQoaWQpIHsKICAgICAgICByZXR1cm4gbHVbaWRdOwogICAgfQoKICAgIGZ1bmN0aW9uIG1ha2VOb2RlS2V5KG5vZGUxLCBub2RlMikgewogICAgICAgIHJldHVybiBub2RlMSArICctJyArIG5vZGUyOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmROb2RlUGFpcihrZXksIGtleVJldikgewogICAgICAgIGlmIChuZXR3b3JrLmxpbmtzQnlEZXZpY2Vba2V5XSkgewogICAgICAgICAgICByZXR1cm4ga2V5OwogICAgICAgIH0gZWxzZSBpZiAobmV0d29yay5saW5rc0J5RGV2aWNlW2tleVJldl0pIHsKICAgICAgICAgICAgcmV0dXJuIGtleVJldjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFnZ3JlZ2F0ZUxpbmsobGRhdGEsIGxpbmspIHsKICAgICAgICB2YXIga2V5ID0gbWFrZU5vZGVLZXkobGluay5zcmMsIGxpbmsuZHN0KSwKICAgICAgICAgICAga2V5UmV2ID0gbWFrZU5vZGVLZXkobGluay5kc3QsIGxpbmsuc3JjKSwKICAgICAgICAgICAgZm91bmQgPSBmaW5kTm9kZVBhaXIoa2V5LCBrZXlSZXYpOwoKICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgbmV0d29yay5saW5rc0J5RGV2aWNlW2ZvdW5kXS5wdXNoKGxkYXRhKTsKICAgICAgICAgICAgbGRhdGEuZGV2aWNlUGFpciA9IGZvdW5kOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ldHdvcmsubGlua3NCeURldmljZVtrZXldID0gWyBsZGF0YSBdOwogICAgICAgICAgICBsZGF0YS5kZXZpY2VQYWlyID0ga2V5OwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhZGRMaW5rVXBkYXRlKGxkYXRhLCBsaW5rKSB7CiAgICAgICAgLy8gYWRkIGxpbmsgZXZlbnQsIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJldmVyc2UgbGluayBpbnN0YWxsZWQKICAgICAgICBsZGF0YS5mcm9tVGFyZ2V0ID0gbGluazsKICAgICAgICBybGtbbGluay5pZF0gPSBsZGF0YS5rZXk7CiAgICAgICAgLy8gcG9zc2libGUgc29sdXRpb24gdG8gZWwgYmVpbmcgdW5kZWZpbmVkIGluIHJlc3R5bGVMaW5rRWxlbWVudDoKICAgICAgICAvL191cGRhdGVMaW5rcygpOwogICAgICAgIHJlc3R5bGVMaW5rRWxlbWVudChsZGF0YSk7CiAgICB9CgoKICAgIHZhciB3aWR0aFJhdGlvID0gMS40LAogICAgICAgIGxpbmtTY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpCiAgICAgICAgICAgIC5kb21haW4oWzEsIDEyXSkKICAgICAgICAgICAgLnJhbmdlKFt3aWR0aFJhdGlvLCAxMiAqIHdpZHRoUmF0aW9dKQogICAgICAgICAgICAuY2xhbXAodHJ1ZSksCiAgICAgICAgYWxsTGlua1R5cGVzID0gJ2RpcmVjdCBpbmRpcmVjdCBvcHRpY2FsIHR1bm5lbCcsCiAgICAgICAgYWxsTGlua1N1YlR5cGVzID0gJ2luYWN0aXZlIG5vdC1wZXJtaXR0ZWQnOwoKICAgIGZ1bmN0aW9uIHJlc3R5bGVMaW5rRWxlbWVudChsZGF0YSwgaW1tZWRpYXRlKSB7CiAgICAgICAgLy8gdGhpcyBmbidzIGpvYiBpcyB0byBsb29rIGF0IHJhdyBsaW5rcyBhbmQgZGVjaWRlIHdoYXQgc3ZnIGNsYXNzZXMKICAgICAgICAvLyBuZWVkIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGxpbmUgZWxlbWVudCBpbiB0aGUgRE9NCiAgICAgICAgdmFyIHRoID0gdHMudGhlbWUoKSwKICAgICAgICAgICAgZWwgPSBsZGF0YS5lbCwKICAgICAgICAgICAgdHlwZSA9IGxkYXRhLnR5cGUoKSwKICAgICAgICAgICAgbHcgPSBsZGF0YS5saW5rV2lkdGgoKSwKICAgICAgICAgICAgb25saW5lID0gbGRhdGEub25saW5lKCksCiAgICAgICAgICAgIG1vZGVDbHMgPSBsZGF0YS5leHBlY3RlZCgpID8gJ2luYWN0aXZlJyA6ICdub3QtcGVybWl0dGVkJywKICAgICAgICAgICAgZGVsYXkgPSBpbW1lZGlhdGUgPyAwIDogMTAwMDsKCiAgICAgICAgLy8gRklYTUU6IHVuZGVyc3RhbmQgd2h5IGVsIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgb24gYWRkTGluayBldmVudHMuLi4KICAgICAgICAvLyBJbnZlc3RpZ2F0ZWQ6CiAgICAgICAgLy8gZWwgaXMgdW5kZWZpbmVkIHdoZW4gaXQncyBhIHJldmVyc2UgbGluayB0aGF0IGlzIGJlaW5nIGFkZGVkLgogICAgICAgIC8vIHVwZGF0ZUxpbmtzICh3aGljaCBzZXRzIGxkYXRhLmVsKSBpc24ndCBjYWxsZWQgYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgogICAgICAgIC8vIENhbGxpbmcgX3VwZGF0ZUxpbmtzIGluIGFkZExpbmtVcGRhdGUgZml4ZXMgaXQsIGJ1dCB0aGVyZSBtaWdodCBiZQogICAgICAgIC8vIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGZpeCBpdC4KICAgICAgICBpZiAoZWwgJiYgIWVsLmVtcHR5KCkpIHsKICAgICAgICAgICAgZWwuY2xhc3NlZCgnbGluaycsIHRydWUpOwogICAgICAgICAgICBlbC5jbGFzc2VkKGFsbExpbmtTdWJUeXBlcywgZmFsc2UpOwogICAgICAgICAgICBlbC5jbGFzc2VkKG1vZGVDbHMsICFvbmxpbmUpOwogICAgICAgICAgICBlbC5jbGFzc2VkKGFsbExpbmtUeXBlcywgZmFsc2UpOwogICAgICAgICAgICBpZiAodHlwZSkgewogICAgICAgICAgICAgICAgZWwuY2xhc3NlZCh0eXBlLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbihkZWxheSkKICAgICAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBsaW5rU2NhbGUobHcpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZScsIGxpbmtDb25maWdbdGhdLmJhc2VDb2xvcik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUxpbmtFbGVtZW50KGQpIHsKICAgICAgICB2YXIgaWR4ID0gZnMuZmluZChkLmtleSwgbmV0d29yay5saW5rcywgJ2tleScpLAogICAgICAgICAgICByZW1vdmVkOwogICAgICAgIGlmIChpZHggPj0wKSB7CiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGxpbmtzIGFycmF5CiAgICAgICAgICAgIHJlbW92ZWQgPSBuZXR3b3JrLmxpbmtzLnNwbGljZShpZHgsIDEpOwogICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBsb29rdXAgY2FjaGUKICAgICAgICAgICAgZGVsZXRlIGx1W3JlbW92ZWRbMF0ua2V5XTsKICAgICAgICAgICAgdXBkYXRlTGlua3MoKTsKICAgICAgICAgICAgZlJlc3VtZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVIb3N0RWxlbWVudChkLCB1cGQpIHsKICAgICAgICAvLyBmaXJzdCwgcmVtb3ZlIGFzc29jaWF0ZWQgaG9zdExpbmsuLi4KICAgICAgICByZW1vdmVMaW5rRWxlbWVudChkLmxpbmtEYXRhKTsKCiAgICAgICAgLy8gcmVtb3ZlIGhvc3RMaW5rIGJpbmRpbmdzCiAgICAgICAgZGVsZXRlIGx1W2QuaW5ncmVzc107CiAgICAgICAgZGVsZXRlIGx1W2QuZWdyZXNzXTsKCiAgICAgICAgLy8gcmVtb3ZlIGZyb20gbG9va3VwIGNhY2hlCiAgICAgICAgZGVsZXRlIGx1W2QuaWRdOwogICAgICAgIC8vIHJlbW92ZSBmcm9tIG5vZGVzIGFycmF5CiAgICAgICAgdmFyIGlkeCA9IGZzLmZpbmQoZC5pZCwgbmV0d29yay5ub2Rlcyk7CiAgICAgICAgbmV0d29yay5ub2Rlcy5zcGxpY2UoaWR4LCAxKTsKCiAgICAgICAgLy8gcmVtb3ZlIGZyb20gU1ZHCiAgICAgICAgLy8gTk9URTogdXBkIGlzIGZhbHNlIGlmIHdlIHdlcmUgY2FsbGVkIGZyb20gcmVtb3ZlRGV2aWNlRWxlbWVudCgpCiAgICAgICAgaWYgKHVwZCkgewogICAgICAgICAgICB1cGRhdGVOb2RlcygpOwogICAgICAgICAgICBmUmVzdW1lKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZURldmljZUVsZW1lbnQoZCkgewogICAgICAgIHZhciBpZCA9IGQuaWQsCiAgICAgICAgICAgIGlkeDsKICAgICAgICAvLyBmaXJzdCwgcmVtb3ZlIGFzc29jaWF0ZWQgaG9zdHMgYW5kIGxpbmtzLi4KICAgICAgICB0bXMuZmluZEF0dGFjaGVkSG9zdHMoaWQpLmZvckVhY2gocmVtb3ZlSG9zdEVsZW1lbnQpOwogICAgICAgIHRtcy5maW5kQXR0YWNoZWRMaW5rcyhpZCkuZm9yRWFjaChyZW1vdmVMaW5rRWxlbWVudCk7CgogICAgICAgIC8vIHJlbW92ZSBmcm9tIGxvb2t1cCBjYWNoZQogICAgICAgIGRlbGV0ZSBsdVtpZF07CiAgICAgICAgLy8gcmVtb3ZlIGZyb20gbm9kZXMgYXJyYXkKICAgICAgICBpZHggPSBmcy5maW5kKGlkLCBuZXR3b3JrLm5vZGVzKTsKICAgICAgICBpZiAoaWR4ID4gLTEpIHsKICAgICAgICAgICAgbmV0d29yay5ub2Rlcy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICB9CgogICAgICAgIGlmICghbmV0d29yay5ub2Rlcy5sZW5ndGgpIHsKICAgICAgICAgICAgdXBsaW5rLnNob3dOb0RldnModHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyByZW1vdmUgZnJvbSBTVkcKICAgICAgICB1cGRhdGVOb2RlcygpOwogICAgICAgIGZSZXN1bWUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVIb3N0VmlzaWJpbGl0eSgpIHsKICAgICAgICBzdXMudmlzaWJsZShub2RlRy5zZWxlY3RBbGwoJy5ob3N0JyksIHNob3dIb3N0cyk7CiAgICAgICAgc3VzLnZpc2libGUobGlua0cuc2VsZWN0QWxsKCcuaG9zdExpbmsnKSwgc2hvd0hvc3RzKTsKICAgICAgICBzdXMudmlzaWJsZShsaW5rTGFiZWxHLnNlbGVjdEFsbCgnLmhvc3RMaW5rTGFiZWwnKSwgc2hvd0hvc3RzKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVPZmZsaW5lVmlzaWJpbGl0eShkZXYpIHsKICAgICAgICBmdW5jdGlvbiB1cGREZXYoZCwgc2hvdykgewogICAgICAgICAgICB2YXIgYjsKICAgICAgICAgICAgc3VzLnZpc2libGUoZC5lbCwgc2hvdyk7CgogICAgICAgICAgICB0bXMuZmluZEF0dGFjaGVkTGlua3MoZC5pZCkuZm9yRWFjaChmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICAgICAgYiA9IHNob3cgJiYgKChsaW5rLnR5cGUoKSAhPT0gJ2hvc3RMaW5rJykgfHwgc2hvd0hvc3RzKTsKICAgICAgICAgICAgICAgIHN1cy52aXNpYmxlKGxpbmsuZWwsIGIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdG1zLmZpbmRBdHRhY2hlZEhvc3RzKGQuaWQpLmZvckVhY2goZnVuY3Rpb24gKGhvc3QpIHsKICAgICAgICAgICAgICAgIGIgPSBzaG93ICYmIHNob3dIb3N0czsKICAgICAgICAgICAgICAgIHN1cy52aXNpYmxlKGhvc3QuZWwsIGIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChkZXYpIHsKICAgICAgICAgICAgLy8gdXBkYXRpbmcgYSBzcGVjaWZpYyBkZXZpY2UgdGhhdCBqdXN0IHRvZ2dsZWQgb2ZmL29uLWxpbmUKICAgICAgICAgICAgdXBkRGV2KGRldiwgZGV2Lm9ubGluZSB8fCBzaG93T2ZmbGluZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gdXBkYXRpbmcgYWxsIG9mZmxpbmUgZGV2aWNlcwogICAgICAgICAgICB0bXMuZmluZERldmljZXModHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgdXBkRGV2KGQsIHNob3dPZmZsaW5lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKCiAgICBmdW5jdGlvbiBzZW5kVXBkYXRlTWV0YShkLCBjbGVhclBvcykgewogICAgICAgIHZhciBtZXRhVWkgPSB7fSwKICAgICAgICAgICAgbGw7CgogICAgICAgIC8vIGlmIHdlIGFyZSBub3QgY2xlYXJpbmcgdGhlIHBvc2l0aW9uIGRhdGEgKHVucGlubmluZyksCiAgICAgICAgLy8gYXR0YWNoIHRoZSB4LCB5LCAoYW5kIGVxdWl2YWxlbnQgbG9uZ2l0dWRlLCBsYXRpdHVkZSkuLi4KICAgICAgICBpZiAoIWNsZWFyUG9zKSB7CiAgICAgICAgICAgIGxsID0gdG1zLmxuZ0xhdEZyb21Db29yZChbZC54LCBkLnldKTsKICAgICAgICAgICAgbWV0YVVpID0gewogICAgICAgICAgICAgICAgeDogZC54LAogICAgICAgICAgICAgICAgeTogZC55LAogICAgICAgICAgICAgICAgZXF1aXZMb2M6IHsKICAgICAgICAgICAgICAgICAgICBsbmc6IGxsWzBdLAogICAgICAgICAgICAgICAgICAgIGxhdDogbGxbMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZC5tZXRhVWkgPSBtZXRhVWk7CiAgICAgICAgd3NzLnNlbmRFdmVudCgndXBkYXRlTWV0YScsIHsKICAgICAgICAgICAgaWQ6IGQuaWQsCiAgICAgICAgICAgIGNsYXNzOiBkLmNsYXNzLAogICAgICAgICAgICBtZW1lbnRvOiBtZXRhVWkKICAgICAgICB9KTsKICAgIH0KCgogICAgZnVuY3Rpb24gbWtTdmdDbGFzcyhkKSB7CiAgICAgICAgcmV0dXJuIGQuZml4ZWQgPyBkLnN2Z0NsYXNzICsgJyBmaXhlZCcgOiBkLnN2Z0NsYXNzOwogICAgfQoKICAgIGZ1bmN0aW9uIHZpcyhiKSB7CiAgICAgICAgcmV0dXJuIGIgPyAndmlzaWJsZScgOiAnaGlkZGVuJzsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVIb3N0cyh4KSB7CiAgICAgICAgdmFyIGtldiA9ICh4ID09PSAna2V5ZXYnKSwKICAgICAgICAgICAgb24gPSBrZXYgPyAhc2hvd0hvc3RzIDogISF4OwoKICAgICAgICBzaG93SG9zdHMgPSBvbjsKICAgICAgICB1cGRhdGVIb3N0VmlzaWJpbGl0eSgpOwogICAgICAgIGZsYXNoLmZsYXNoKCdIb3N0cyAnICsgdmlzKG9uKSk7CiAgICAgICAgcmV0dXJuIG9uOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZU9mZmxpbmUoeCkgewogICAgICAgIHZhciBrZXYgPSAoeCA9PT0gJ2tleWV2JyksCiAgICAgICAgICAgIG9uID0ga2V2ID8gIXNob3dPZmZsaW5lIDogISF4OwoKICAgICAgICBzaG93T2ZmbGluZSA9IG9uOwogICAgICAgIHVwZGF0ZU9mZmxpbmVWaXNpYmlsaXR5KCk7CiAgICAgICAgZmxhc2guZmxhc2goJ09mZmxpbmUgZGV2aWNlcyAnICsgdmlzKG9uKSk7CiAgICAgICAgcmV0dXJuIG9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGN5Y2xlRGV2aWNlTGFiZWxzKCkgewogICAgICAgIGZsYXNoLmZsYXNoKHRkMy5pbmNEZXZMYWJJbmRleCgpKTsKICAgICAgICB0bXMuZmluZERldmljZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHRkMy51cGRhdGVEZXZpY2VMYWJlbChkKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bnBpbigpIHsKICAgICAgICB2YXIgaG92ID0gdHNzLmhvdmVyZWQoKTsKICAgICAgICBpZiAoaG92KSB7CiAgICAgICAgICAgIHNlbmRVcGRhdGVNZXRhKGhvdiwgdHJ1ZSk7CiAgICAgICAgICAgIGhvdi5maXhlZCA9IGZhbHNlOwogICAgICAgICAgICBob3YuZWwuY2xhc3NlZCgnZml4ZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIGZSZXN1bWUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd01hc3RlcnNoaXAobWFzdGVySWQpIHsKICAgICAgICBpZiAoIW1hc3RlcklkKSB7CiAgICAgICAgICAgIHJlc3RvcmVMYXllclN0YXRlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2hvd01hc3RlcnNoaXBGb3IobWFzdGVySWQpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXN0b3JlTGF5ZXJTdGF0ZSgpIHsKICAgICAgICAvLyBOT1RFOiB0aGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIHJlcXVpcmVkLCBmb3Igd2hlbiB3ZSBoYXZlCiAgICAgICAgLy8gICAgICAgICAgdGhlIGxheWVyIGZpbHRlciBmdW5jdGlvbmFsaXR5IHJlLWltcGxlbWVudGVkCiAgICAgICAgc3VwcHJlc3NMYXllcnMoZmFsc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dNYXN0ZXJzaGlwRm9yKGlkKSB7CiAgICAgICAgc3VwcHJlc3NMYXllcnModHJ1ZSk7CiAgICAgICAgbm9kZS5lYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIGlmIChuLm1hc3RlciA9PT0gaWQpIHsKICAgICAgICAgICAgICAgIG4uZWwuY2xhc3NlZCgnc3VwcHJlc3NlZG1heCcsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHN1cEFtdChsZXNzKSB7CiAgICAgICAgcmV0dXJuIGxlc3MgPyAic3VwcHJlc3NlZCIgOiAic3VwcHJlc3NlZG1heCI7CiAgICB9CgogICAgZnVuY3Rpb24gc3VwcHJlc3NMYXllcnMoYiwgbGVzcykgewogICAgICAgIHZhciBjbHMgPSBzdXBBbXQobGVzcyk7CiAgICAgICAgbm9kZS5jbGFzc2VkKGNscywgYik7CiAgICAgICAgbGluay5jbGFzc2VkKGNscywgYik7CiAgICB9CgogICAgZnVuY3Rpb24gdW5zdXBwcmVzc05vZGUoaWQsIGxlc3MpIHsKICAgICAgICB2YXIgY2xzID0gc3VwQW10KGxlc3MpOwogICAgICAgIG5vZGUuZWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICBpZiAobi5pZCA9PT0gaWQpIHsKICAgICAgICAgICAgICAgIG4uZWwuY2xhc3NlZChjbHMsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHVuc3VwcHJlc3NMaW5rKGtleSwgbGVzcykgewogICAgICAgIHZhciBjbHMgPSBzdXBBbXQobGVzcyk7CiAgICAgICAgbGluay5lYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIGlmIChuLmtleSA9PT0ga2V5KSB7CiAgICAgICAgICAgICAgICBuLmVsLmNsYXNzZWQoY2xzLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93QmFkTGlua3MoKSB7CiAgICAgICAgdmFyIGJhZExpbmtzID0gdG1zLmZpbmRCYWRMaW5rcygpOwogICAgICAgIGZsYXNoLmZsYXNoKCdCYWQgTGlua3M6ICcgKyBiYWRMaW5rcy5sZW5ndGgpOwogICAgjNzvViZHBQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMHFQABABukXwKgHNsCoB2CVLR/1T9m6gaaTDa+AEASZaJsAAAEBCAoAo177AE2l9ozc71ZsRwUAej4AAHo+AABo9ygf0sUIACetHhMIAEUAPmyNg0AAQAbfIcCoB2DAqAc2H/WVLaaTDa9P2bqBgBABUM5FAAABAQgKAE2l9wCjXvcgICAgJGxvZy5kZWJ1ZygnQmFkIExpbmsgTGlzdCAoJyArIGJhZExpbmtzLmxlbmd0aCArICcpOicpOwogICAgICAgIGJhZExpbmtzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygnYmFkIGxpbms6ICgnICsgZC5iYWQgKyAnKSAnICsgZC5rZXksIGQpOwogICAgICAgICAgICBpZiAoZC5lbCkgewogICAgICAgICAgICAgICAgZC5lbC5hdHRyKCdzdHJva2Utd2lkdGgnLCBsaW5rU2NhbGUoMi44KSkKICAgICAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JlZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8gYmFjayB0byBub3JtYWwgYWZ0ZXIgMiBzZWNvbmRzLi4uCiAgICAgICAgJHRpbWVvdXQodXBkYXRlTGlua3MsIDIwMDApOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc2V0QWxsTG9jYXRpb25zKCkgewogICAgICAgIHRtcy5yZXNldEFsbExvY2F0aW9ucygpOwogICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgdGljaygpOyAvLyBmb3JjZSBub2RlcyB0byBiZSByZWRyYXduIGluIHRoZWlyIG5ldyBsb2NhdGlvbnMKICAgICAgICBmbGFzaC5mbGFzaCgnUmVzZXQgTm9kZSBMb2NhdGlvbnMnKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiB1cGRhdGVOb2RlcygpIHsKICAgICAgICBpZiAoZk5vZGVzVGltZXIpIHsKICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKGZOb2Rlc1RpbWVyKTsKICAgICAgICB9CiAgICAgICAgZk5vZGVzVGltZXIgPSAkdGltZW91dChfdXBkYXRlTm9kZXMsIDE1MCk7CiAgICB9CgogICAgLy8gSU1QTEVNRU5UQVRJT04gTk9URTogX3VwZGF0ZU5vZGVzKCkgc2hvdWxkIE5PVCBzdG9wLCBzdGFydCwgb3IgcmVzdW1lCiAgICAvLyAgdGhlIGZvcmNlIGxheW91dDsgdGhhdCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIGFuZCBpbXBsZW1lbnRlZCBlbHNld2hlcmUKICAgIGZ1bmN0aW9uIF91cGRhdGVOb2RlcygpIHsKICAgICAgICAvLyBzZWxlY3QgYWxsIHRoZSBub2RlcyBpbiB0aGUgbGF5b3V0OgogICAgICAgIG5vZGUgPSBub2RlRy5zZWxlY3RBbGwoJy5ub2RlJykKICAgICAgICAgICAgLmRhdGEobmV0d29yay5ub2RlcywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuaWQ7IH0pOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGV4aXN0aW5nIG5vZGVzOgogICAgICAgIG5vZGUuZmlsdGVyKCcuZGV2aWNlJykuZWFjaCh0ZDMuZGV2aWNlRXhpc3RpbmcpOwogICAgICAgIG5vZGUuZmlsdGVyKCcuaG9zdCcpLmVhY2godGQzLmhvc3RFeGlzdGluZyk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZW50ZXJpbmcgbm9kZXM6CiAgICAgICAgdmFyIGVudGVyaW5nID0gbm9kZS5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuYXR0cih7CiAgICAgICAgICAgICAgICBpZDogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHN1cy5zYWZlSWQoZC5pZCk7IH0sCiAgICAgICAgICAgICAgICBjbGFzczogbWtTdmdDbGFzcywKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGd1YXJkIGFnYWluc3QgTmFOIGhlcmUgPz8KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VzLnRyYW5zbGF0ZShkLngsIGQueSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb3BhY2l0eTogMAogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2FsbChkcmFnKQogICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIHRzcy5ub2RlTW91c2VPdmVyKQogICAgICAgICAgICAub24oJ21vdXNlb3V0JywgdHNzLm5vZGVNb3VzZU91dCkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpOwoKICAgICAgICAvLyBhdWdtZW50IGVudGVyaW5nIG5vZGVzOgogICAgICAgIGVudGVyaW5nLmZpbHRlcignLmRldmljZScpLmVhY2godGQzLmRldmljZUVudGVyKTsKICAgICAgICBlbnRlcmluZy5maWx0ZXIoJy5ob3N0JykuZWFjaCh0ZDMuaG9zdEVudGVyKTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBib3RoIGV4aXN0aW5nIGFuZCBuZXcgbm9kZXM6CiAgICAgICAgdGQzLnVwZGF0ZURldmljZUNvbG9ycygpOwoKICAgICAgICAvLyBvcGVyYXRlIG9uIGV4aXRpbmcgbm9kZXM6CiAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBub2RlIGlzIHJlbW92ZWQgYWZ0ZXIgMiBzZWNvbmRzLgogICAgICAgIC8vIFN1YiBlbGVtZW50IGFuaW1hdGlvbnMgc2hvdWxkIGJlIHNob3J0ZXIgdGhhbiAyIHNlY29uZHMuCiAgICAgICAgdmFyIGV4aXRpbmcgPSBub2RlLmV4aXQoKQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbigyMDAwKQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKQogICAgICAgICAgICAucmVtb3ZlKCk7CgogICAgICAgIC8vIGV4aXRpbmcgbm9kZSBzcGVjaWZpY3M6CiAgICAgICAgZXhpdGluZy5maWx0ZXIoJy5ob3N0JykuZWFjaCh0ZDMuaG9zdEV4aXQpOwogICAgICAgIGV4aXRpbmcuZmlsdGVyKCcuZGV2aWNlJykuZWFjaCh0ZDMuZGV2aWNlRXhpdCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBnZXREZWZhdWx0UG9zKGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4MTogbGluay5zb3VyY2UueCwKICAgICAgICAgICAgeTE6IGxpbmsuc291cmNlLnksCiAgICAgICAgICAgIHgyOiBsaW5rLnRhcmdldC54LAogICAgICAgICAgICB5MjogbGluay50YXJnZXQueQogICAgICAgIH07CiAgICB9CgogICAgLy8gcmV0dXJucyBhbW91bnQgb2YgYWRqdXN0bWVudCBhbG9uZyB0aGUgbm9ybWFsIGZvciBnaXZlbiBsaW5rCiAgICBmdW5jdGlvbiBhbXQobnVtTGlua3MsIGxpbmtJZHgpIHsKICAgICAgICB2YXIgZ2FwID0gNjsKICAgICAgICByZXR1cm4gKGxpbmtJZHggLSAoKG51bUxpbmtzIC0gMSkgLyAyKSkgKiBnYXA7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY01vdmVtZW50KGQsIGFtdCwgZmxpcHBlZCkgewogICAgICAgIHZhciBwb3MgPSBnZXREZWZhdWx0UG9zKGQpLAogICAgICAgICAgICBtdWx0ID0gZmxpcHBlZCA/IC1hbXQgOiBhbXQsCiAgICAgICAgICAgIGR4ID0gcG9zLngyIC0gcG9zLngxLAogICAgICAgICAgICBkeSA9IHBvcy55MiAtIHBvcy55MSwKICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5zcXJ0KChkeCAqIGR4KSArIChkeSAqIGR5KSk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHgxOiBwb3MueDEgKyAobXVsdCAqIGR5IC8gbGVuZ3RoKSwKICAgICAgICAgICAgeTE6IHBvcy55MSArIChtdWx0ICogLWR4IC8gbGVuZ3RoKSwKICAgICAgICAgICAgeDI6IHBvcy54MiArIChtdWx0ICogZHkgLyBsZW5ndGgpLAogICAgICAgICAgICB5MjogcG9zLnkyICsgKG11bHQgKiAtZHggLyBsZW5ndGgpCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxjUG9zaXRpb24oKSB7CiAgICAgICAgdmFyIGxpbmVzID0gdGhpcywKICAgICAgICAgICAgbGlua1NyY0lkOwogICAgICAgIGxpbmtOdW1zID0gW107CiAgICAgICAgbGluZXMuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBpZiAoZC50eXBlKCkgPT09ICdob3N0TGluaycpIHsKICAgICAgICAgICAgICAgIGQucG9zaXRpb24gPSBnZXREZWZhdWx0UG9zKGQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmtTcmMobGluaykgewogICAgICAgICAgICAvLyBlbnN1cmUgc291cmNlIGRldmljZSBpcyBjb25zaXN0ZW50IGFjcm9zcyBzZXQgb2YgbGlua3MKICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IG1lYXN1cmUgdW50aWwgbGluayBtb2RlbGluZyBpcyByZWZhY3RvcmVkCiAgICAgICAgICAgIGlmICghbGlua1NyY0lkKSB7CiAgICAgICAgICAgICAgICBsaW5rU3JjSWQgPSBsaW5rLnNvdXJjZS5pZDsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGxpbmsuc291cmNlLmlkICE9PSBsaW5rU3JjSWQ7CiAgICAgICAgfQoKICAgICAgICBhbmd1bGFyLmZvckVhY2gobmV0d29yay5saW5rc0J5RGV2aWNlLCBmdW5jdGlvbiAobGlua0Fyciwga2V5KSB7CiAgICAgICAgICAgIHZhciBudW1MaW5rcyA9IGxpbmtBcnIubGVuZ3RoLAogICAgICAgICAgICAgICAgbGluazsKCiAgICAgICAgICAgIGlmIChudW1MaW5rcyA9PT0gMSkgewogICAgICAgICAgICAgICAgbGluayA9IGxpbmtBcnJbMF07CiAgICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uID0gZ2V0RGVmYXVsdFBvcyhsaW5rKTsKICAgICAgICAgICAgICAgIGxpbmsucG9zaXRpb24ubXVsdGlMaW5rID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtTGlua3MgPj0gNSkgewogICAgICAgICAgICAgICAgLy8gdGhpcyBjb2RlIGlzIGluZWZmaWNpZW50LCBpbiB0aGUgZnV0dXJlIHRoZSB3YXkgbGlua3MKICAgICAgICAgICAgICAgIC8vIGFyZSBtb2RlbGVkIHdpbGwgYmUgY2hhbmdlZAogICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGxpbmtBcnIsIGZ1bmN0aW9uIChsaW5rKSB7CiAgICAgICAgICAgICAgICAgICAgbGluay5wb3NpdGlvbiA9IGdldERlZmF1bHRQb3MobGluayk7CiAgICAgICAgICAgICAgICAgICAgbGluay5wb3NpdGlvbi5tdWx0aUxpbmsgPSB0cnVlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsaW5rTnVtcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBpZDoga2V5LAogICAgICAgICAgICAgICAgICAgIG51bTogbnVtTGlua3MsCiAgICAgICAgICAgICAgICAgICAgbGlua0Nvb3JkczogbGlua0FyclswXS5wb3NpdGlvbgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsaW5rU3JjSWQgPSBudWxsOwogICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGxpbmtBcnIsIGZ1bmN0aW9uIChsaW5rLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXRBbXQgPSBhbXQobnVtTGlua3MsIGluZGV4KSwKICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFRvRmxpcCA9IG5vcm1hbGl6ZUxpbmtTcmMobGluayk7CiAgICAgICAgICAgICAgICAgICAgbGluay5wb3NpdGlvbiA9IGNhbGNNb3ZlbWVudChsaW5rLCBvZmZzZXRBbXQsIG5lZWRUb0ZsaXApOwogICAgICAgICAgICAgICAgICAgIGxpbmsucG9zaXRpb24ubXVsdGlMaW5rID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzKCkgewogICAgICAgIGlmIChmTGlua3NUaW1lcikgewogICAgICAgICAgICAkdGltZW91dC5jYW5jZWwoZkxpbmtzVGltZXIpOwogICAgICAgIH0KICAgICAgICBmTGlua3NUaW1lciA9ICR0aW1lb3V0KF91cGRhdGVMaW5rcywgMTUwKTsKICAgIH0KCiAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFOiBfdXBkYXRlTGlua3MoKSBzaG91bGQgTk9UIHN0b3AsIHN0YXJ0LCBvciByZXN1bWUKICAgIC8vICB0aGUgZm9yY2UgbGF5b3V0OyB0aGF0IG5lZWRzIHRvIGJlIGRldGVybWluZWQgYW5kIGltcGxlbWVudGVkIGVsc2V3aGVyZQogICAgZnVuY3Rpb24gX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHZhciB0aCA9IHRzLnRoZW1lKCk7CgogICAgICAgIGxpbmsgPSBsaW5rRy5zZWxlY3RBbGwoJy5saW5rJykKICAgICAgICAgICAgLmRhdGEobmV0d29yay5saW5rcywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQua2V5OyB9KTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBleGlzdGluZyBsaW5rczoKICAgICAgICBsaW5rLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgLy8gdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBhbiBleGlzdGluZyBsaW5rLCBidXQgd2UgaGF2ZSBvYnNlcnZlZAogICAgICAgICAgICAvLyAgb2NjYXNpb25zICh3aGVyZSBsaW5rcyBhcmUgZGVsZXRlZCBhbmQgYWRkZWQgcmFwaWRseT8pIHdoZXJlCiAgICAgICAgICAgIC8vICB0aGUgRE9NIGVsZW1lbnQgaGFzIG5vdCBiZWVuIGRlZmluZWQuIFNvIHByb3RlY3QgYWdhaW5zdCB0aGF0Li4uCiAgICAgICAgICAgIGlmIChkLmVsKSB7CiAgICAgICAgICAgICAgICByZXN0eWxlTGlua0VsZW1lbnQoZCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBlbnRlcmluZyBsaW5rczoKICAgICAgICB2YXIgZW50ZXJpbmcgPSBsaW5rLmVudGVyKCkKICAgICAgICAgICAgLmFwcGVuZCgnbGluZScpCiAgICAgICAgICAgIC5jYWxsKGNhbGNQb3NpdGlvbikKICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgeDE6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLngxOyB9LAogICAgICAgICAgICAgICAgeTE6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLnkxOyB9LAogICAgICAgICAgICAgICAgeDI6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLngyOyB9LAogICAgICAgICAgICAgICAgeTI6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLnkyOyB9LAogICAgICAgICAgICAgICAgc3Ryb2tlOiBsaW5rQ29uZmlnW3RoXS5pbkNvbG9yLAogICAgICAgICAgICAgICAgJ3N0cm9rZS13aWR0aCc6IGxpbmtDb25maWcuaW5XaWR0aAogICAgICAgICAgICB9KTsKCiAgICAgICAgLy8gYXVnbWVudCBsaW5rcwogICAgICAgIGVudGVyaW5nLmVhY2godGQzLmxpbmtFbnRlcmluZyk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gYm90aCBleGlzdGluZyBhbmQgbmV3IGxpbmtzOgogICAgICAgIC8vbGluay5lYWNoKC4uLikKCiAgICAgICAgLy8gYWRkIGxhYmVscyBmb3IgaG93IG1hbnkgbGlua3MgYXJlIGluIGEgdGhpY2sgbGluZQogICAgICAgIHRkMy5hcHBseU51bUxpbmtMYWJlbHMobGlua051bXMsIG51bUxpbmtMYmxzRyk7CgogICAgICAgIC8vIGFwcGx5IG9yIHJlbW92ZSBsYWJlbHMKICAgICAgICB0ZDMuYXBwbHlMaW5rTGFiZWxzKCk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpdGluZyBsaW5rczoKICAgICAgICBsaW5rLmV4aXQoKQogICAgICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsICczIDMnKQogICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgbGlua0NvbmZpZ1t0aF0ub3V0Q29sb3IpCiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuNSkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24oMTUwMCkKICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnMyAxMicsCiAgICAgICAgICAgICAgICAnc3Ryb2tlLXdpZHRoJzogbGlua0NvbmZpZy5vdXRXaWR0aAogICAgICAgICAgICB9KQogICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjApCiAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIGZvcmNlIGxheW91dCB0aWNrIGZ1bmN0aW9uCgogICAgZnVuY3Rpb24gZlJlc3VtZSgpIHsKICAgICAgICBpZiAoIXRvcy5pc09ibGlxdWUoKSkgewogICAgICAgICAgICBmb3JjZS5yZXN1bWUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZlN0YXJ0KCkgewogICAgICAgIGlmICghdG9zLmlzT2JsaXF1ZSgpKSB7CiAgICAgICAgICAgIGlmIChmVGltZXIpIHsKICAgICAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbChmVGltZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZUaW1lciA9ICR0aW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICRsb2cuZGVidWcoIlN0YXJ0aW5nIGZvcmNlLWxheW91dCIpOwogICAgICAgICAgICAgICAgZm9yY2Uuc3RhcnQoKTsKICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIHRpY2tTdHVmZiA9IHsKICAgICAgICBub2RlQXR0cjogewogICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICB2YXIgZHggPSBpc05hTihkLngpID8gMCA6IGQueCwKICAgICAgICAgICAgICAgICAgICBkeSA9IGlzTmFOKGQueSkgPyAwIDogZC55OwogICAgICAgICAgICAgICAgcmV0dXJuIHN1cy50cmFuc2xhdGUoZHgsIGR5KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbGlua0F0dHI6IHsKICAgICAgICAgICAgeDE6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLngxOyB9LAogICAgICAgICAgICB5MTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucG9zaXRpb24ueTE7IH0sCiAgICAgICAgICAgIHgyOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5wb3NpdGlvbi54MjsgfSwKICAgICAgICAgICAgeTI6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnBvc2l0aW9uLnkyOyB9CiAgICAgICAgfSwKICAgICAgICBsaW5rTGFiZWxBdHRyOiB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBsbmsgPSB0bXMuZmluZExpbmtCeUlkKGQua2V5KTsKICAgICAgICAgICAgICAgIGlmIChsbmspIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGQzLnRyYW5zZm9ybUxhYmVsKGxuay5wb3NpdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHRpY2soKSB7CiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBudWxsICh3aGljaCBjYW4gaGFwcGVuIHdoZW4gb3VyIHZpZXcgcGFnZXMgb3V0KS4uLgogICAgICAgIGlmIChub2RlICYmIG5vZGUuc2l6ZSgpKSB7CiAgICAgICAgICAgIG5vZGUuYXR0cih0aWNrU3R1ZmYubm9kZUF0dHIpOwogICAgICAgIH0KICAgICAgICBpZiAobGluayAmJiBsaW5rLnNpemUoKSkgewogICAgICAgICAgICBsaW5rLmNhbGwoY2FsY1Bvc2l0aW9uKQogICAgICAgICAgICAgICAgLmF0dHIodGlja1N0dWZmLmxpbmtBdHRyKTsKICAgICAgICAgICAgdGQzLmFwcGx5TnVtTGlua0xhYmVscyhsaW5rTnVtcywgbnVtTGlua0xibHNHKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxpbmtMYWJlbCAmJiBsaW5rTGFiZWwuc2l6ZSgpKSB7CiAgICAgICAgICAgIGxpbmtMYWJlbC5hdHRyKHRpY2tTdHVmZi5saW5rTGFiZWxBdHRyKTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyA9PT0gTU9VU0UgR0VTVFVSRSBIQU5ETEVSUwoKICAgIGZ1bmN0aW9uIHpvb21pbmdPclBhbm5pbmcoZXYpIHsKICAgICAgICByZXR1cm4gZXYubWV0YUtleSB8fCBldi5hbHRLZXk7CiAgICB9CgogICAgZnVuY3Rpb24gYXREcmFnRW5kKGQpIHsKICAgICAgICAvLyBvbmNlIHdlJ3ZlIGZpbmlzaGVkIG1vdmluZywgcGluIHRoZSBub2RlIGluIHBvc2l0aW9uCiAgICAgICAgZC5maXhlZCA9IHRydWU7CiAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoJ2ZpeGVkJywgdHJ1ZSk7CiAgICAgICAgc2VuZFVwZGF0ZU1ldGEoZCk7CiAgICAgICAgdHNzLmNsaWNrQ29uc3VtZWQodHJ1ZSk7CiAgICB9CgogICAgLy8gcHJlZGljYXRlIHRoYXQgaW5kaWNhdGVzIHdoZW4gZHJhZ2dpbmcgaXMgYWN0aXZlCiAgICBmdW5jdGlvbiBkcmFnRW5hYmxlZCgpIHsKICAgICAgICB2YXIgZXYgPSBkMy5ldmVudC5zb3VyY2VFdmVudDsKICAgICAgICAvLyBub2RlTG9jayBtZWFucyB3ZSBhcmVuJ3QgYWxsb3dpbmcgbm9kZXMgdG8gYmUgZHJhZ2dlZC4uLgogICAgICAgIHJldHVybiAhbm9kZUxvY2sgJiYgIXpvb21pbmdPclBhbm5pbmcoZXYpOwogICAgfQoKICAgIC8vIHByZWRpY2F0ZSB0aGF0IGluZGljYXRlcyB3aGVuIGNsaWNraW5nIGlzIGFjdGl2ZQogICAgZnVuY3Rpb24gY2xpY2tFbmFibGVkKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gZnVuY3Rpb24gZW50cnkgcG9pbnRzIGZvciBvdmVybGF5IG1vZHVsZQoKICAgIC8vIFRPRE86IGZpbmQgYW4gYXV0b21hdGljIHdheSBvZiB0cmFja2luZyB2aWEgdGhlICJzaG93SGlnaGxpZ2h0cyIgZXZlbnRzCiAgICB2YXIgYWxsVHJhZmZpY0NsYXNzZXMgPSAncHJpbWFyeSBzZWNvbmRhcnkgb3B0aWNhbCBhbmltYXRlZCAnICsKICAgICAgICAncG9ydC10cmFmZmljLUticHMgcG9ydC10cmFmZmljLU1icHMgcG9ydC10cmFmZmljLUdicHMgJyArCiAgICAgICAgJ3BvcnQtdHJhZmZpYy1HYnBzLWNob2tlZCc7CgogICAgZnVuY3Rpb24gY2xlYXJMaW5rVHJhZmZpY1N0eWxlKCkgewogICAgICAgIGxpbmsuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIG51bGwpCiAgICAgICAgICAgIC5jbGFzc2VkKGFsbFRyYWZmaWNDbGFzc2VzLCBmYWxzZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlTGlua0xhYmVscygpIHsKICAgICAgICBuZXR3b3JrLmxpbmtzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgZC5sYWJlbCA9ICcnOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyTm9kZURlY28oKSB7CiAgICAgICAgbm9kZS5zZWxlY3RBbGwoJ2cuYmFkZ2UnKS5yZW1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVOb2RlQmFkZ2VzKCkgewogICAgICAgIG5ldHdvcmsubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBkLmJhZGdlID0gbnVsbDsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVMaW5rTGFiZWxNb2RlbCgpIHsKICAgICAgICAvLyBjcmVhdGUgdGhlIGJhY2tpbmcgZGF0YSBmb3Igc2hvd2luZyBsYWJlbHMuLgogICAgICAgIHZhciBkYXRhID0gW107CiAgICAgICAgbGluay5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGlmIChkLmxhYmVsKSB7CiAgICAgICAgICAgICAgICBkYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIGlkOiAnbGFiLScgKyBkLmtleSwKICAgICAgICAgICAgICAgICAgICBrZXk6IGQua2V5LAogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBkLmxhYmVsLAogICAgICAgICAgICAgICAgICAgIGxkYXRhOiBkCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBsaW5rTGFiZWwgPSBsaW5rTGFiZWxHLnNlbGVjdEFsbCgnLmxpbmtMYWJlbCcpCiAgICAgICAgICAgIC5kYXRhKGRhdGEsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmlkOyB9KTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTW9kdWxlIGRlZmluaXRpb24KCiAgICBmdW5jdGlvbiBta01vZGVsQXBpKHVwbGluaykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb2plY3Rpb246IHVwbGluay5wcm9qZWN0aW9uLAogICAgICAgICAgICBuZXR3b3JrOiBuZXR3b3JrLAogICAgICAgICAgICByZXN0eWxlTGlua0VsZW1lbnQ6IHJlc3R5bGVMaW5rRWxlbWVudCwKICAgICAgICAgICAgcmVtb3ZlTGlua0VsZW1lbnQ6IHJlbW92ZUxpbmtFbGVtZW50CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta0QzQXBpKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5vZGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vZGU7IH0sCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxpbms7IH0sCiAgICAgICAgICAgIGxpbmtMYWJlbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua0xhYmVsOyB9LAogICAgICAgICAgICBpbnN0VmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGlzLmlzVmlzaWJsZSgpOyB9LAogICAgICAgICAgICBwb3NOb2RlOiB0bXMucG9zaXRpb25Ob2RlLAogICAgICAgICAgICBzaG93SG9zdHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNob3dIb3N0czsgfSwKICAgICAgICAgICAgcmVzdHlsZUxpbmtFbGVtZW50OiByZXN0eWxlTGlua0VsZW1lbnQsCiAgICAgICAgICAgIHVwZGF0ZUxpbmtMYWJlbE1vZGVsOiB1cGRhdGVMaW5rTGFiZWxNb2RlbCwKICAgICAgICAgICAgbGlua0NvbmZpZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua0NvbmZpZzsgfQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWtTZWxlY3RBcGkoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbm9kZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9kZTsgfSwKICAgICAgICAgICAgem9vbWluZ09yUGFubmluZzogem9vbWluZ09yUGFubmluZywKICAgICAgICAgICAgdXBkYXRlRGV2aWNlQ29sb3JzOiB0ZDMudXBkYXRlRGV2aWNlQ29sb3JzLAogICAgICAgICAgICBkZXNlbGVjdExpbms6IHRscy5kZXNlbGVjdExpbmsKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG1rVHJhZmZpY0FwaSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBob3ZlcmVkOiB0c3MuaG92ZXJlZCwKICAgICAgICAgICAgc29tZXRoaW5nU2VsZWN0ZWQ6IHRzcy5zb21ldGhpbmdTZWxlY3RlZCwKICAgICAgICAgICAgc2VsZWN0T3JkZXI6IHRzcy5zZWxlY3RPcmRlcgogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWtPdmVybGF5QXBpKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNsZWFyTm9kZURlY286IGNsZWFyTm9kZURlY28sCiAgICAgICAgICAgIHJlbW92ZU5vZGVCYWRnZXM6IHJlbW92ZU5vZGVCYWRnZXMsCiAgICAgICAgICAgIGNsZWFyTGlua1RyYWZmaWNTdHlsZTogY2xlYXJMaW5rVHJhZmZpY1N0eWxlLAogICAgICAgICAgICByZW1vdmVMaW5rTGFiZWxzOiByZW1vdmVMaW5rTGFiZWxzLAogICAgICAgICAgICBmaW5kTGlua0J5SWQ6IHRtcy5maW5kTGlua0J5SWQsCiAgICAgICAgICAgIGZpbmROb2RlQnlJZDogbm9kZUJ5SWQsCiAgICAgICAgICAgIHVwZGF0ZUxpbmtzOiB1cGRhdGVMaW5rcywKICAgICAgICAgICAgdXBkYXRlTm9kZXM6IHVwZGF0ZU5vZGVzLAogICAgICAgICAgICBzdXBMYXllcnM6IHN1cHByZXNzTGF5ZXJzLAogICAgICAgICAgICB1bnN1cE5vZGU6IHVuc3VwcHJlc3NOb2RlLAogICAgICAgICAgICB1bnN1cExpbms6IHVuc3VwcHJlc3NMaW5rCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta09ibGlxdWVBcGkodXBsaW5rLCBmbHRyKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZm9yY2U6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZm9yY2U7IH0sCiAgICAgICAgICAgIHpvb21MYXllcjogdXBsaW5rLnpvb21MYXllciwKICAgICAgICAgICAgbm9kZUdCQm94OiBmdW5jdGlvbigpIHsgcmV0dXJuIG5vZGVHLm5vZGUoKS5nZXRCQm94KCk7IH0sCiAgICAgICAgICAgIG5vZGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vZGU7IH0sCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxpbms7IH0sCiAgICAgICAgICAgIGxpbmtMYWJlbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua0xhYmVsOyB9LAogICAgICAgICAgICBub2RlczogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV0d29yay5ub2RlczsgfSwKICAgICAgICAgICAgdGlja1N0dWZmOiB0aWNrU3R1ZmYsCiAgICAgICAgICAgIG5vZGVMb2NrOiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgdmFyIG9sZCA9IG5vZGVMb2NrOwogICAgICAgICAgICAgICAgbm9kZUxvY2sgPSBiOwogICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3BhY2lmeU1hcDogdXBsaW5rLm9wYWNpZnlNYXAsCiAgICAgICAgICAgIGluTGF5ZXI6IGZsdHIuaW5MYXllciwKICAgICAgICAgICAgY2FsY0xpbmtQb3M6IGNhbGNQb3NpdGlvbiwKICAgICAgICAgICAgYXBwbHlOdW1MaW5rTGFiZWxzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0ZDMuYXBwbHlOdW1MaW5rTGFiZWxzKGxpbmtOdW1zLCBudW1MaW5rTGJsc0cpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta0ZpbHRlckFwaSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBub2RlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub2RlOyB9LAogICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rOyB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBta0xpbmtBcGkoc3ZnLCB1cGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdmc6IHN2ZywKICAgICAgICAgICAgem9vbWVyOiB1cGxpbmsuem9vbWVyKCksCiAgICAgICAgICAgIG5ldHdvcms6IG5ldHdvcmssCiAgICAgICAgICAgIHBvcnRMYWJlbEc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBvcnRMYWJlbEc7IH0sCiAgICAgICAgICAgIHNob3dIb3N0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hvd0hvc3RzOyB9CiAgICAgICAgfTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvRm9yY2VTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHRpbWVvdXQnLCAnRm5TZXJ2aWNlJywgJ1N2Z1V0aWxTZXJ2aWNlJywKICAgICAgICAgICAgJ1RoZW1lU2VydmljZScsICdGbGFzaFNlcnZpY2UnLCAnV2ViU29ja2V0U2VydmljZScsCiAgICAgICAgICAgICdUb3BvT3ZlcmxheVNlcnZpY2UnLCAnVG9wb0luc3RTZXJ2aWNlJywgJ1RvcG9Nb2RlbFNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb0QzU2VydmljZScsICdUb3BvU2VsZWN0U2VydmljZScsICdUb3BvVHJhZmZpY1NlcnZpY2UnLAogICAgICAgICAgICAnVG9wb09ibGlxdWVTZXJ2aWNlJywgJ1RvcG9GaWx0ZXJTZXJ2aWNlJywgJ1RvcG9MaW5rU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kdGltZW91dF8sIF9mc18sIF9zdXNfLCBfdHNfLCBfZmxhc2hfLCBfd3NzXywgX3Rvdl8sCiAgICAgICAgICAgICAgICAgIF90aXNfLCBfdG1zXywgX3RkM18sIF90c3NfLCBfdHRzXywgX3Rvc18sIF9mbHRyXywgX3Rsc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHRpbWVvdXQgPSBfJHRpbWVvdXRfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgICAgICB0cyA9IF90c187CiAgICAgICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKICAgICAgICAgICAgd3NzID0gX3dzc187CiAgICAgICAgICAgIHRvdiA9IF90b3ZfOwogICAgICAgICAgICB0aXMgPSBfdGlzXzsKICAgICAgICAgICAgdG1zID0gX3Rtc187CiAgICAgICAgICAgIHRkMyA9IF90ZDNfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdHRzID0gX3R0c187CiAgICAgICAgICAgIHRvcyA9IF90b3NfOwogICAgICAgICAgICBmbHRyID0gX2ZsdHJfOwogICAgICAgICAgICB0bHMgPSBfdGxzXzsKCiAgICAgICAgICAgIHZhciB0aGVtZUxpc3RlbmVyID0gdHMuYWRkTGlzdGVuZXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdXBkYXRlTGlua3MoKTsKICAgICAgICAgICAgICAgIHVwZGF0ZU5vZGVzKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZm9yY2VHIGlzIHRoZSBTVkcgZ3JvdXAgdG8gZGlzcGxheSB0aGUgZm9yY2UgbGF5b3V0IGluCiAgICAgICAgICAgIC8vIHVwbGluayBpcyB0aGUgYXBpIGZyb20gdGhlIG1haW4gdG9wbyBzb3VyY2UgZmlsZQogICAgICAgICAgICAvLyBkaW0gaXMgdGhlIGluaXRpYWwgZGltZW5zaW9ucyBvZiB0aGUgU1ZHIGFzIFt3LGhdCiAgICAgICAgICAgIC8vIG9wdHMgYXJlLCB3ZWxsLCBvcHRpb25hbCA6KQogICAgICAgICAgICBmdW5jdGlvbiBpbml0Rm9yY2UoX3N2Z18sIGZvcmNlRywgX3VwbGlua18sIF9kaW1fLCBvcHRzKSB7CiAgICAgICAgICAgICAgICB1cGxpbmsgPSBfdXBsjNzvVrBHBQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMHGQABABukWwKgHNsCoB2CVLR/1T9m6gaaTS+eAEAUtKc4AAAEBCAoAo177AE2l94zc71bURwUARwQAAEcEAABo9ygf0sUIACetHhMIAEUABDmNjkAAQAYZSsCoB2DAqAc2H/WVLaaTS+dP2bqBgBgBUJQSAAABAQgKAE2l9wCjXvtpbmtfOwogICAgICAgICAgICAgICAgZGltID0gX2RpbV87CiAgICAgICAgICAgICAgICBzdmcgPSBfc3ZnXzsKCiAgICAgICAgICAgICAgICBsdSA9IG5ldHdvcmsubG9va3VwOwogICAgICAgICAgICAgICAgcmxrID0gbmV0d29yay5yZXZMaW5rVG9LZXk7CgogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnaW5pdEZvcmNlKCkuLiBkaW0gPSAnICsgZGltKTsKCiAgICAgICAgICAgICAgICB0b3Yuc2V0QXBpKG1rT3ZlcmxheUFwaSgpLCB0c3MpOwogICAgICAgICAgICAgICAgdG1zLmluaXRNb2RlbChta01vZGVsQXBpKHVwbGluayksIGRpbSk7CiAgICAgICAgICAgICAgICB0ZDMuaW5pdEQzKG1rRDNBcGkoKSk7CiAgICAgICAgICAgICAgICB0c3MuaW5pdFNlbGVjdChta1NlbGVjdEFwaSgpKTsKICAgICAgICAgICAgICAgIHR0cy5pbml0VHJhZmZpYyhta1RyYWZmaWNBcGkoKSk7CiAgICAgICAgICAgICAgICB0b3MuaW5pdE9ibGlxdWUobWtPYmxpcXVlQXBpKHVwbGluaywgZmx0cikpOwogICAgICAgICAgICAgICAgZmx0ci5pbml0RmlsdGVyKG1rRmlsdGVyQXBpKCkpOwogICAgICAgICAgICAgICAgdGxzLmluaXRMaW5rKG1rTGlua0FwaShzdmcsIHVwbGluayksIHRkMyk7CgogICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBhbmd1bGFyLmV4dGVuZCh7fSwgZGVmYXVsdFNldHRpbmdzLCBvcHRzKTsKCiAgICAgICAgICAgICAgICBsaW5rRyA9IGZvcmNlRy5hcHBlbmQoJ2cnKS5hdHRyKCdpZCcsICd0b3BvLWxpbmtzJyk7CiAgICAgICAgICAgICAgICBsaW5rTGFiZWxHID0gZm9yY2VHLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tbGlua0xhYmVscycpOwogICAgICAgICAgICAgICAgbnVtTGlua0xibHNHID0gZm9yY2VHLmFwcGVuZCgnZycpLmF0dHIoJ2lkJywgJ3RvcG8tbnVtTGlua0xhYmVscycpOwogICAgICAgICAgICAgICAgbm9kZUcgPSBmb3JjZUcuYXBwZW5kKCdnJykuYXR0cignaWQnLCAndG9wby1ub2RlcycpOwogICAgICAgICAgICAgICAgcG9ydExhYmVsRyA9IGZvcmNlRy5hcHBlbmSM3O9Wf0wFAKgQAACoEAAAaPcoH9LFCAAnrR4TCABFABCaN7xAAEAGYrvAqAdgwKgHNh/1lSc5Vhtd25KOH4AYAUagcwAAAQEICgBNpfcAo172SFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDQwOTMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgbGF5ZXIgZmlsdGVyaW5nIE1vZHVsZS4KIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gdmlzdWFsbHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBwYWNrZXQgYW5kCiBvcHRpY2FsIGxheWVycyBvZiB0aGUgdG9wb2xvZ3kuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIGZsYXNoLCB0cHMsIHR0czsKCiAgICAvLyBhcGkgdG8gdG9wb0ZvcmNlCiAgICB2YXIgYXBpOwogICAgLyoKICAgICBub2RlKCkgICAgIC8vIGdldCByZWYgdG8gRDMgc2VsZWN0aW9uIG9mIG5vZGVzCiAgICAgbGluaygpICAgICAvLyBnZXQgcmVmIHRvIEQzIHNlbGVjdGlvbiBvZiBsaW5rcwogICAgICovCgogICAgdmFyIHNtYXggPSAnc3VwcHJlc3NlZG1heCc7CgogICAgLy8gd2hpY2ggImxheWVyIiBhIHBhcnRpY3VsYXIgaXRlbSAiYmVsb25ncyB0byIKICAgIHZhciBsYXllckxvb2t1cCA9IHsKICAgICAgICAgICAgaG9zdDogewogICAgICAgICAgICAgICAgZW5kc3RhdGlvbjogJ3BrdCcsIC8vIGRlZmF1bHQsIGlmIGhvc3QgZXZlbnQgZG9lcyBub3QgZGVmaW5lIHR5cGUKICAgICAgICAgICAgICAgIHJvdXRlcjogICAgICdwa3QnLAogICAgICAgICAgICAgICAgYmdwU3BlYWtlcjogJ3BrdCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGV2aWNlOiB7CiAgICAgICAgICAgICAgICBzd2l0Y2g6ICdwa3QnLAogICAgICAgICAgICAgICAgcm9hZG06ICdvcHQnLAogICAgICAgICAgICAgICAgb3RuOiAnb3B0JwogICAgICAgICAgICB9LAogICAgICAgICAgICBsaW5rOiB7CiAgICAgICAgICAgICAgICBob3N0TGluazogJ3BrdCcsCiAgICAgICAgICAgICAgICBkaXJlY3Q6ICdwa3QnLAogICAgICAgICAgICAgICAgaW5kaXJlY3Q6ICcnLAogICAgICAgICAgICAgICAgdHVubmVsOiAnJywKICAgICAgICAgICAgICAgIG9wdGljYWw6ICdvcHQnCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8vIG9yZGVyIG9mIGxheWVyIGN5Y2xpbmcgaW4gYnV0dG9uCiAgICAgICAgZGlzcGF0Y2ggPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICdhbGwnLAogICAgICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7IHN1cHByZXNzTGF5ZXJzKGZhbHNlKTsgfSwKICAgICAgICAgICAgICAgIG1zZzogJ0FsbCBMYXllcnMgU2hvd24nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICdwa3QnLAogICAgICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7IHNob3dMYXllcigncGt0Jyk7IH0sCiAgICAgICAgICAgICAgICBtc2c6ICdQYWNrZXQgTGF5ZXIgU2hvd24nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICdvcHQnLAogICAgICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7IHNob3dMYXllcignb3B0Jyk7IH0sCiAgICAgICAgICAgICAgICBtc2c6ICdPcHRpY2FsIExheWVyIFNob3duJwogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBsYXllciA9IDA7CgogICAgZnVuY3Rpb24gY2xpY2tBY3Rpb24oKSB7CiAgICAgICAgbGF5ZXIgPSAobGF5ZXIgKyAxKSAlIGRpc3BhdGNoLmxlbmd0aDsKICAgICAgICBkaXNwYXRjaFtsYXllcl0uYWN0aW9uKCk7CiAgICAgICAgZmxhc2guZmxhc2goZGlzcGF0Y2hbbGF5ZXJdLm1zZyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0ZWQoKSB7CiAgICAgICAgcmV0dXJuIGRpc3BhdGNoW2xheWVyXS50eXBlOwogICAgfQoKICAgIGZ1bmN0aW9uIGluTGF5ZXIoZCwgbGF5ZXIpIHsKICAgICAgICB2YXIgdHlwZSA9IGQuY2xhc3MgPT09ICdsaW5rJyA/IGQudHlwZSgpIDogZC50eXBlLAogICAgICAgICAgICBsb29rID0gbGF5ZXJMb29rdXBbZC5jbGFzc10sCiAgICAgICAgICAgIGx5ciA9IGxvb2sgJiYgbG9va1t0eXBlXTsKICAgICAgICByZXR1cm4gbHlyID09PSBsYXllcjsKICAgIH0KCiAgICBmdW5jdGlvbiB1bnN1cHByZXNzTGF5ZXIod2hpY2gpIHsKICAgICAgICBhcGkubm9kZSgpLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIG5vZGUgPSBkLmVsOwogICAgICAgICAgICBpZiAoaW5MYXllcihkLCB3aGljaCkpIHsKICAgICAgICAgICAgICAgIG5vZGUuY2xhc3NlZChzbWF4LCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgYXBpLmxpbmsoKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gZC5lbDsKICAgICAgICAgICAgaWYgKGluTGF5ZXIoZCwgd2hpY2gpKSB7CiAgICAgICAgICAgICAgICBsaW5rLmNsYXNzZWQoc21heCwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3VwcHJlc3NMYXllcnMoYikgewogICAgICAgIGFwaS5ub2RlKCkuY2xhc3NlZChzbWF4LCBiKTsKICAgICAgICBhcGkubGluaygpLmNsYXNzZWQoc21heCwgYik7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0xheWVyKHdoaWNoKSB7CiAgICAgICAgc3VwcHJlc3NMYXllcnModHJ1ZSk7CiAgICAgICAgdW5zdXBwcmVzc0xheWVyKHdoaWNoKTsKICAgIH0KCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBNT0RVTEUgREVGSU5JVElPTiA9PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgICAgICAuZmFjdG9yeSgnVG9wb0ZpbHRlclNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICdGblNlcnZpY2UnLAogICAgICAgICAgICAnRmxhc2hTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9QYW5lbFNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1RyYWZmaWNTZXJ2aWNlJywKCiAgICAgICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9mbGFzaF8sIF90cHNfLCBfdHRzXykgewogICAgICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKICAgICAgICAgICAgICAgIHRwcyA9IF90cHNfOwogICAgICAgICAgICAgICAgdHRzID0gX3R0c187CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5pdEZpbHRlcihfYXBpXykgewogICAgICAgICAgICAgICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcjogaW5pdEZpbHRlciwKCiAgICAgICAgICAgICAgICAgICAgY2xpY2tBY3Rpb246IGNsaWNrQWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICBpbkxheWVyOiBpbkxheWVyCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9XSk7Cn0oKSk7Cozc71bFTAUAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQt/kAAQAZ838CoBzbAqAdglScf9duSjh85VivDgBAPM03XAAABAQgKAKNe/ABNpfeM3O9WlVkFAJ0CAACdAgAACAAnrR4TaPcoH9LFCABFAAKPt+tAAEAG8JbAqAc2wKgHYJUqH/XG6PnCk6cfmoAYBEsk5wAAAQEICgCjXvwATaX2R0VUIC9vbm9zL3VpL3RwL2FuZ3VsYXItY2hhcnQubWluLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVutZBQCRAgAAkQIAAAgAJ60eE2j3KB/SxQgARQACgy3/QABABnqPwKgHNsCoB2CVJx/125KOHzlWK8OAGA8zagcAAAEBCAoAo178AE2l90dFVCAvb25vcy91aS9hcHAvb25vcy5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZlbAUAMg8AADIPAABo9ygf0sUIACetHhMIAEUADyRu40AAQAYtCsCoB2DAqAc2H/WVLHDYLrMFCc3ugBgBMp79AAABAQgKAE2l+ACjXvVIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMzcxOQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBFdmVudCBNb2R1bGUuCgogRGVmaW5lcyB0aGUgY29uZHVpdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXI6CiAgICAtIHByb3ZpZGVzIGEgY2xlYW4gQVBJIGZvciBzZW5kaW5nIGV2ZW50cyB0byB0aGUgc2VydmVyCiAgICAtIGRpc3BhdGNoZXMgaW5jb21pbmcgZXZlbnRzIGZyb20gdGhlIHNlcnZlciB0byB0aGUgYXBwcm9wcmlhdGUgc3ViLW1vZHVsZQoKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkaW50ZXJ2YWwsIHdzcywgdHBzLCB0aXMsIHRmcywgdHNzLCB0b3YsIHRzcHI7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBoYW5kbGVyTWFwLAogICAgICAgIG9wZW5MaXN0ZW5lciwKICAgICAgICBoZWFydGJlYXRUaW1lcjsKCiAgICB2YXIgaGVhcnRiZWF0UGVyaW9kID0gOTAwMDsgLy8gOSBzZWNvbmRzCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBjcmVhdGVIYW5kbGVyTWFwKCkgewogICAgICAgIGhhbmRsZXJNYXAgPSB7CiAgICAgICAgICAgIHNob3dTdW1tYXJ5OiB0cHMsCgogICAgICAgICAgICBzaG93RGV0YWlsczogdHNzLAoKICAgICAgICAgICAgc2hvd0hpZ2hsaWdodHM6IHRvdiwKCiAgICAgICAgICAgIGFkZEluc3RhbmNlOiB0aXMsCiAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlOiB0aXMsCiAgICAgICAgICAgIHJlbW92ZUluc3RhbmNlOiB0aXMsCgogICAgICAgICAgICBhZGREZXZpY2U6IHRmcywKICAgICAgICAgICAgdXBkYXRlRGV2aWNlOiB0ZnMsCiAgICAgICAgICAgIHJlbW92ZURldmljZTogdGZzLAogICAgICAgICAgICBhZGRIb3N0OiB0ZnMsCiAgICAgICAgICAgIHVwZGF0ZUhvc3Q6IHRmcywKICAgICAgICAgICAgbW92ZUhvc3Q6IHRmcywKICAgICAgICAgICAgcmVtb3ZlSG9zdDogdGZzLAogICAgICAgICAgICBhZGRMaW5rOiB0ZnMsCiAgICAgICAgICAgIHVwZGF0ZUxpbms6IHRmcywKICAgICAgICAgICAgcmVtb3ZlTGluazogdGZzLAoKICAgICAgICAgICAgdG9wb1N0YXJ0RG9uZTogdGZzLAoKICAgICAgICAgICAgc3ByaXRlTGlzdFJlc3BvbnNlOiB0c3ByLAogICAgICAgICAgICBzcHJpdGVEYXRhUmVzcG9uc2U6IHRzcHIKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHdzT3Blbihob3N0LCB1cmwpIHsKICAgICAgICAkbG9nLmRlYnVnKCdUT1BPOiB3ZWIgc29ja2V0IG9wZW4gLSBjbHVzdGVyIG5vZGU6JywgaG9zdCwgJ1VSTDonLCB1cmwpOwogICAgICAgIC8vIFJlcXVlc3QgYmF0Y2ggb2YgaW5pdGlhbCBkYXRhIGZyb20gdGhlIG5ldyBzZXJ2ZXIKICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvU3RhcnQnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYW5jZWxIZWFydGJlYXQoKSB7CiAgICAgICAgaWYgKGhlYXJ0YmVhdFRpbWVyKSB7CiAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoaGVhcnRiZWF0VGltZXIpOwogICAgICAgIH0KICAgICAgICBoZWFydGJlYXRUaW1lciA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc2NoZWR1bGVIZWFydGJlYXQoKSB7CiAgICAgICAgY2FuY2VsSGVhcnRiZWF0KCk7CiAgICAgICAgaGVhcnRiZWF0VGltZXIgPSAkaW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvSGVhcnRiZWF0Jyk7CiAgICAgICAgfSwgaGVhcnRiZWF0UGVyaW9kKTsKICAgIH0KCgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb0V2ZW50U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJyRpbnRlcnZhbCcsICdXZWJTb2NrZXRTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9QYW5lbFNlcnZpY2UnLCAnVG9wb0luc3RTZXJ2aWNlJywgJ1RvcG9Gb3JjZVNlcnZpY2UnLAogICAgICAgICAgICAnVG9wb1NlbGVjdFNlcnZpY2UnLCAnVG9wb092ZXJsYXlTZXJ2aWNlJywgJ1RvcG9TcHJpdGVTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgIF8kaW50ZXJ2YWxfLCBfd3NzXywKICAgICAgICAgICAgICAgICAgX3Rwc18sIF90aXNfLCBfdGZzXywgX3Rzc18sIF90b3ZfLCBfdHNwcl8pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJGludGVydmFsID0gXyRpbnRlcnZhbF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICB0cHMgPSBfdHBzXzsKICAgICAgICAgICAgdGlzID0gX3Rpc187CiAgICAgICAgICAgIHRmcyA9IF90ZnNfOwogICAgICAgICAgICB0c3MgPSBfdHNzXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CiAgICAgICAgICAgIHRzcHIgPSBfdHNwcl87CgogICAgICAgICAgICBjcmVhdGVIYW5kbGVyTWFwKCk7CgogICAgICAgICAgICBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgICAgICAgICAgIG9wZW5MaXN0ZW5lciA9IHdzcy5hZGRPcGVuTGlzdGVuZXIod3NPcGVuKTsKICAgICAgICAgICAgICAgIHdzcy5iaW5kSGFuZGxlcnMoaGFuZGxlck1hcCk7CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCd0b3BvU3RhcnQnKTsKICAgICAgICAgICAgICAgIHNjaGVkdWxlSGVhcnRiZWF0KCk7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCd0b3BvIGNvbW1zIHN0YXJ0ZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgICAgIGNhbmNlbEhlYXJ0YmVhdCgpOwogICAgICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgndG9wb1N0b3AnKTsKICAgICAgICAgICAgICAgIHdzcy51bmJpbmRIYW5kbGVycyhoYW5kbGVyTWFwKTsKICAgICAgICAgICAgICAgIHdzcy5yZW1vdmVPcGVuTGlzdGVuZXIob3Blbkxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIG9wZW5MaXN0ZW5lciA9IG51bGw7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCd0b3BvIGNvbW1zIHN0b3BwZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgICAgICAgICAgIHN0b3A6IHN0b3AKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Cozc71Z5bAUAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTkmUAAQAbGQ8CoBzbAqAdglSwf9QUJze5w2D2jgBACtqekAAABAQgKAKNe/gBNpfiM3O9WsHAFAJkCAACZAgAACAAnrR4TaPcoH9LFCABFAAKL5JpAAEAGw+vAqAc2wKgHYJUsH/UFCc3ucNg9o4AYArZIXwAAAQEICgCjXv4ATaX4R0VUIC9vbm9zL3VpL2FwcC9mdy9tYXN0L21hc3QuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WnnUFAHcFAAB3BQAAaPcoH9LFCAAnrR4TCABFAAVp1StAAEAG0HzAqAdgwKgHNh/1lSJBwRTEWHqLc4AYAbOVQgAAAQEICgBNpfkAo172SFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDEyMjgNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IERpYWxvZyBNb2R1bGUuCiBDcmVhdGVzIGEgZGlhbG9nIGJveCBmb3IgdGhlIHRvcG9sb2d5IHZpZXcuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBjb25zdGFudHMKICAgIHZhciBpZERpYWxvZyA9ICd0b3BvLXAtZGlhbG9nJywKICAgICAgICBvcHRzID0gewogICAgICAgICAgICBjc3NDbHM6ICd0b3BvLXAnCiAgICAgICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9EaWFsb2dTZXJ2aWNlJywKICAgICAgICBbJ0RpYWxvZ1NlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoZHMpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9wZW5EaWFsb2c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRzLm9wZW5EaWFsb2coaWREaWFsb2csIG9wdHMpOyB9LAogICAgICAgICAgICAgICAgY2xvc2VEaWFsb2c6IGRzLmNsb3NlRGlhbG9nLAogICAgICAgICAgICAgICAgY3JlYXRlRGl2OiBkcy5jcmVhdGVEaXYKICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Cozc71aMdwUAACYAAAAmAABo9ygf0sUIACetHhMIAEUAJfIYq0AAQAZsdMCoB2DAqAc2H/WVK2c+P6T2alphgBgBlLXLAAABAQgKAE2l+gCjXvlIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogOTU1Nw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBJbnN0YW5jZXMgTW9kdWxlLgogRGVmaW5lcyBtb2RlbGluZyBvZiBPTk9TIGluc3RhbmNlcy4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCBwcywgc3VzLCBncywgdHMsIGZzLCBmbGFzaDsKCiAgICAvLyBhcGkgZnJvbSB0b3BvCiAgICB2YXIgYXBpOwogICAgLyoKICAgICAgICBzaG93TWFzdGVyc2hpcCggaWQgKQogICAgICovCgogICAgLy8gY29uZmlndXJhdGlvbgogICAgdmFyIGluc3RDZmcgPSB7CiAgICAgICAgICAgIHJlY3RQYWQ6IDgsCiAgICAgICAgICAgIG5vZGVPeDogOSwKICAgICAgICAgICAgbm9kZU95OiA5LAogICAgICAgICAgICBub2RlRGltOiA0MCwKICAgICAgICAgICAgYmlyZE94OiAxOSwKICAgICAgICAgICAgYmlyZE95OiAyMSwKICAgICAgICAgICAgYmlyZERpbTogMjEsCiAgICAgICAgICAgIHVpRHk6IDQ1LAogICAgICAgICAgICB0aXRsZUR5OiAzMCwKICAgICAgICAgICAgdGV4dFlPZmY6IDIwLAogICAgICAgICAgICB0ZXh0WVNwYzogMTUKICAgICAgICB9LAogICAgICAgIHNob3dMb2dpY0Vycm9ycyA9IHRydWUsCiAgICAgICAgaWRJbnMgPSAndG9wby1wLWluc3RhbmNlJywKICAgICAgICBpbnN0T3B0cyA9IHsKICAgICAgICAgICAgZWRnZTogJ2xlZnQnLAogICAgICAgICAgICB3aWR0aDogMjAKICAgICAgICB9OwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgb25vc0luc3RhbmNlcywKICAgICAgICBvbm9zT3JkZXIsCiAgICAgICAgb2lTaG93TWFzdGVyLAogICAgICAgIG9pQm94LAogICAgICAgIHRoZW1lTGlzdGVuZXI7CgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gYWRkSW5zdGFuY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQ7CgogICAgICAgIGlmIChvbm9zSW5zdGFuY2VzW2lkXSkgewogICAgICAgICAgICB1cGRhdGVJbnN0YW5jZShkYXRhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvbm9zSW5zdGFuY2VzW2lkXSA9IGRhdGE7CiAgICAgICAgb25vc09yZGVyLnB1c2goZGF0YSk7CiAgICAgICAgdXBkYXRlSW5zdGFuY2VzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlSW5zdGFuY2UoZGF0YSkgewogICAgICAgIHZhciBpZCA9IGRhdGEuaWQsCiAgICAgICAgICAgIGQgPSBvbm9zSW5zdGFuY2VzW2lkXTsKICAgICAgICBpZiAoZCkgewogICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChkLCBkYXRhKTsKICAgICAgICAgICAgdXBkYXRlSW5zdGFuY2VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9naWNFcnJvcigndXBkYXRlSW5zdGFuY2U6IGxvb2t1cCBmYWlsOiBJRCA9ICInICsgaWQgKyAnIicpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVJbnN0YW5jZShkYXRhKSB7CiAgICAgICAgdmFyIGlkID0gZGF0YS5pZCwKICAgICAgICAgICAgZCA9IG9ub3NJbnN0YW5jZXNbaWRdOwogICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgIHZhciBpZHggPSBmcy5maW5kKGlkLCBvbm9zT3JkZXIpOwogICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgICAgICAgIG9ub3NPcmRlci5zcGxpY2UoaWR4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgb25vc0luc3RhbmNlc1tpZF07CiAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvZ2ljRXJyb3IoJ3JlbW92ZUluc3RhbmNlIGxvb2t1cCBmYWlsLiBJRCA9ICInICsgaWQgKyAnIicpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGNvbXB1dGVEaW0oc2VsZikgewogICAgICAgIHZhciBjc3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzZWxmKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB3OiBzdXMuc3RyaXBQeChjc3Mud2lkdGgpLAogICAgICAgICAgICBoOiBzdXMuc3RyaXBQeChjc3MuaGVpZ2h0KQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xpY2tJbnN0KGQpIHsKICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgIGFmZiA9IGVsLmNsYXNzZWQoJ2FmZmluaXR5Jyk7CiAgICAgICAgaWYgKCFhZmYpIHsKICAgICAgICAgICAgc2V0QWZmaW5pdHkoZWwsIGQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNhbmNlbEFmZmluaXR5KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldEFmZmluaXR5KGVsLCBkKSB7CiAgICAgICAgZDMuc2VsZWN0QWxsKCcub25vc0luc3QnKQogICAgICAgICAgICAuY2xhc3NlZCgnbWFzdGVyc2hpcCcsIHRydWUpCiAgICAgICAgICAgIC5jbGFzc2VkKCdhZmZpbml0eScsIGZhbHNlKTsKICAgICAgICBlbC5jbGFzc2VkKCdhZmZpbml0eScsIHRydWUpOwoKICAgICAgICAvLyBzdXBwcmVzcyBhbGwgZWxlbWVudHMgZXhjZXB0IG5vZGVzIHdob3NlIG1hc3RlciBpcyB0aGlzIGluc3RhbmNlCiAgICAgICAgYXBpLnNob3dNYXN0ZXJzaGlwKGQuaWQpOwogICAgICAgIG9pU2hvd01hc3RlciA9IHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gY2FuY2VsQWZmaW5pdHkoKSB7CiAgICAgICAgZDMuc2VsZWN0QWxsKCcub25vc0luc3QnKQogICAgICAgICAgICAuY2xhc3NlZCgnbWFzdGVyc2hpcCBhZmZpbml0eScsIGZhbHNlKTsKCiAgICAgICAgYXBpLnNob3dNYXN0ZXJzaGlwKG51bGwpOwogICAgICAgIG9pU2hvd01hc3RlciA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RSZWN0QXR0cihkaW0pIHsKICAgICAgICB2YXIgcGFkID0gaW5zdENmZy5yZWN0UGFkOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHg6IHBhZCwKICAgICAgICAgICAgeTogcGFkLAogICAgICAgICAgICB3aWR0aDogZGltLncgLSBwYWQqMiwKICAgICAgICAgICAgaGVpZ2h0OiBkaW0uaCAtIHBhZCoyLAogICAgICAgICAgICByeDogNgogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdmlld0JveChkaW0pIHsKICAgICAgICByZXR1cm4gJzAgMCAnICsgZGltLncgKyAnICcgKyBkaW0uaDsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRhY2hVaUJhZGdlKHN2ZykgewogICAgICAgIGdzLmFkZEdseXBoKHN2ZywgJ3VpQXR0YWNoZWQnLCAzMCwgdHJ1ZSwgWzEyLCBpbnN0Q2ZnLnVpRHldKQogICAgICAgICAgICAuY2xhc3NlZCgnYmFkZ2VJY29uIHVpQmFkZ2UnLCB0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0Q29sb3IoaWQsIG9ubGluZSkgewogICAgICAgIHJldHVybiBzdXMuY2F0NygpLmdldENvbG9yKGlkLCAhb25saW5lLCB0cy50aGVtZSgpKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiB1cGRhdGVJbnN0YW5jZXMoKSB7CiAgICAgICAgdmFyIG9ub3NlcyA9IG9pQm94LmVsKCkuc2VsZWN0QWxsKCcub25vc0luc3QnKQogICAgICAgICAgICAgICAgLmRhdGEob25vc09yZGVyLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5pZDsgfSksCiAgICAgICAgICAgIGluc3REaW0gPSB7dzowLGg6MH0sCiAgICAgICAgICAgIGMgPSBpbnN0Q2ZnOwoKICAgICAgICBmdW5jdGlvbiBuU3cobikgewogICAgICAgICAgICByZXR1cm4gJyMgU3dpdGNoZXM6ICcgKyBuOwogICAgICAgIH0KCiAgICAgICAgLy8gb3BlcmF0ZSBvbiBleGlzdGluZyBvbm9zIGluc3RhbmNlcyBpZiBuZWNlc3NhcnkKICAgICAgICBvbm9zZXMuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgICBzdmcgPSBlbC5zZWxlY3QoJ3N2ZycpOwogICAgICAgICAgICBpbnN0RGltID0gY29tcHV0ZURpbSh0aGlzKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSBvbmxpbmUgc3RhdGUKICAgICAgICAgICAgZWwuY2xhc3NlZCgnb25saW5lJywgZC5vbmxpbmUpOwoKICAgICAgICAgICAgLy8gdXBkYXRlIHVpLWF0dGFjaGVkIHN0YXRlCiAgICAgICAgICAgIHN2Zy5zZWxlY3QoJ3VzZS51aUJhZGdlJykucmVtb3ZlKCk7CiAgICAgICAgICAgIGlmIChkLnVpQXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIGF0dGFjaFVpQmFkZ2Uoc3ZnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gdXBkQXR0cihpZCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHN2Zy5zZWxlY3QoJ3RleHQuaW5zdExhYmVsLicraWQpLnRleHQodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1cGRBdHRyKCdpcCcsIGQuaXApOwogICAgICAgICAgICB1cGRBdHRyKCducycsIG5TdyhkLnN3aXRjaGVzKSk7CiAgICAgICAgfSk7CgoKICAgICAgICAvLyBvcGVyYXRlIG9uIG5ldyBvbm9zIGluc3RhbmNlcwogICAgICAgIHZhciBlbnRlcmluZyA9IG9ub3Nlcy5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpCiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdvbm9zSW5zdCcpCiAgICAgICAgICAgIC5jbGFzc2VkKCdvbmxpbmUnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5vbmxpbmU7IH0pCiAgICAgICAgICAgIC5vbignY2xpY2snLCBjbGlja0luc3QpOwoKICAgICAgICBlbnRlcmluZy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgICAgIHJlY3RBdHRyLAogICAgICAgICAgICAgICAgc3ZnOwogICAgICAgICAgICBpbnN0RGltID0gY29tcHV0ZURpbSh0aGlzKTsKICAgICAgICAgICAgcmVjdEF0dHIgPSBpbnN0UmVjdEF0dHIoaW5zdERpbSk7CgogICAgICAgICAgICBzdmcgPSBlbC5hcHBlbmQoJ3N2ZycpLmF0dHIoewogICAgICAgICAgICAgICAgd2lkdGg6IGluc3REaW0udywKICAgICAgICAgICAgICAgIGhlaWdodDogaW5zdERpbS5oLAogICAgICAgICAgICAgICAgdmlld0JveDogdmlld0JveChpbnN0RGltKQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3JlY3QnKS5hdHRyKHJlY3RBdHRyKTsKCiAgICAgICAgICAgIGdzLmFkZEdseXBoKHN2ZywgJ2JpcmQnLCAyOCwgdHJ1ZSwgWzE0LCAxNF0pCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnYmFkZ2VJY29uJywgdHJ1ZSk7CgogICAgICAgICAgICBpZiAoZC51aUF0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICBhdHRhY2hVaUJhZGdlKHN2Zyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBsZWZ0ID0gYy5ub2RlT3ggKyBjLm5vZGVEaW0sCiAgICAgICAgICAgICAgICBsZW4gPSByZWN0QXR0ci53aWR0aCAtIGxlZnQsCiAgICAgICAgICAgICAgICBobGVuID0gbGVuIC8gMiwKICAgICAgICAgICAgICAgIG1pZGxpbmUgPSBobGVuICsgbGVmdDsKCiAgICAgICAgICAgIC8vIHRpdGxlCiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnaW5zdFRpdGxlJywKICAgICAgICAgICAgICAgICAgICB4OiBtaWRsaW5lLAogICAgICAgICAgICAgICAgICAgIHk6IGMudGl0bGVEeQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC50ZXh0KGQuaWQpOwoKICAgICAgICAgICAgLy8gYSBjb3VwbGUgb2YgYXR0cmlidXRlcwogICAgICAgICAgICB2YXIgdHkgPSBjLnRpdGxlRHkgKyBjLnRleHRZT2ZmOwoKICAgICAgICAgICAgZnVuY3Rpb24gYWRkQXR0cihpZCwgbGFiZWwpIHsKICAgICAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKS5hdHRyKHsKICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2luc3RMYWJlbCAnICsgaWQsCiAgICAgICAgICAgICAgICAgICAgeDogbWlkbGluZSwKICAgICAgICAgICAgICAgICAgICB5OiB0eQogICAgICAgICAgICAgICAgfSkudGV4dChsYWJlbCk7CiAgICAgICAgICAgICAgICB0eSArPSBjLnRleHRZU3BjOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhZGRBdHRyKCdpcCcsIGQuaXApOwogICAgICAgICAgICBhZGRBdHRyKCducycsIG5TdyhkLnN3aXRjaGVzKSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIG9wZXJhdGUgb24gZXhpc3RpbmcgKyBuZXcgb25vc2VzIGhlcmUKICAgICAgICAvLyBzZXQgdGhlIGFmZmluaXR5IGNvbG9ycy4uLgogICAgICAgIG9ub3Nlcy5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgICAgIHJlY3QgPSBlbC5zZWxlY3QoJ3N2ZycpLnNlbGVjdCgncmVjdCcpLAogICAgICAgICAgICAgICAgY29sID0gaW5zdENvbG9yKGQuaWQsIGQub25saW5lKTsKICAgICAgICAgICAgcmVjdC5zdHlsZSgnZmlsbCcsIGNvbCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGFkanVzdCB0aGUgcGFuZWwgc2l6ZSBhcHByb3ByaWF0ZWx5Li4uCiAgICAgICAgb2lCb3gud2lkdGgoaW5zdERpbS53ICogb25vc09yZGVyLmxlbmd0aCk7CiAgICAgICAgb2lCb3guaGVpZ2h0KGluc3REaW0uaCk7CgogICAgICAgIC8vIHJlbW92ZSBhbnkgb3V0Z29pbmcgaW5zdGFuY2VzCiAgICAgICAgb25vc2VzLmV4aXQoKS5yZW1vdmUoKTsKICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBsb2dpY0Vycm9yKG1zZykgewogICAgICAgIGlmIChzaG93TG9naWNFcnJvcnMpIHsKICAgICAgICAgICAgJGxvZy53YXJuKCdUb3BvSW5zdFNlcnZpY2U6ICcgKyBtc2cpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0SW5zdChfYXBpXykgewogICAgICAgIGFwaSA9IF9hcGlfOwogICAgICAgIG9pQm94ID0gcHMuY3JlYXRlUGFuZWwoaWRJbnMsIGluc3RPcHRzKTsKICAgICAgICBvaUJveC5zaG93KCk7CgogICAgICAgIG9ub3NJbnN0YW5jZXMgPSB7fTsKICAgICAgICBvbm9zT3JkZXIgPSBbXTsKICAgICAgICBvaVNob3dNYXN0ZXIgPSBmYWxzZTsKCiAgICAgICAgLy8gd2Ugd2FudCB0byB1cGRhdGUgdGhlIGluc3RhbmNlcywgZWFjaCB0aW1lIHRoZSB0aGVtZSBjaGFuZ2VzCiAgICAgICAgdGhlbWVMaXN0ZW5lciA9IHRzLmFkZExpc3RlbmVyKHVwZGF0ZUluc3RhbmNlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzdHJveUluc3QoKSB7CiAgICAgICAgdHMucmVtb3ZlTGlzdGVuZXIodGhlbWVMaXN0ZW5lcik7CiAgICAgICAgdGhlbWVMaXN0ZW5lciA9IG51bGw7CgogICAgICAgIHBzLmRlc3Ryb3lQYW5lbChpZElucyk7CiAgICAgICAgb2lCb3ggPSBudWxsOwoKICAgICAgICBvbm9zSW5zdGFuY2VzID0ge307CiAgICAgICAgb25vc09yZGVyID0gW107CiAgICAgICAgb2lTaG93TWFzdGVyID0gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0luc3RzKCkgewogICAgICAgIG9pQm94LnNob3coKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlSW5zdHMoKSB7CiAgICAgICAgb2lCb3guaGlkZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUluc3RzKHgpIHsKICAgICAgICB2YXIga2V2ID0gKHggPT09ICdrZXlldicpLAogICAgICAgICAgICBvbiwKICAgICAgICAgICAgdmVyYjsKCiAgICAgICAgaWYgKGtldikgewogICAgICAgICAgICBvbiA9IG9pQm94LnRvZ2dsZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9uID0gISF4OwogICAgICAgICAgICBpZiAob24pIHsKICAgICAgICAgICAgICAgIHNob3dJbnN0cygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaGlkZUluc3RzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmVyYiA9IG9uID8gJ1Nob3cnIDogJ0hpZGUnOwogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIGluc3RhbmNlcyBwYW5lbCcpOwogICAgICAgIHJldHVybiBvbjsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9JbnN0U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ1BhbmVsU2VydmljZScsICdTdmdVdGlsU2VydmljZScsICdHbHlwaFNlcnZpY2UnLAogICAgICAgICAgICAnVGhlbWVTZXJ2aWNlJywgJ0ZuU2VydmljZScsICdGbGFzaFNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfcHNfLCBfc3VzXywgX2dzXywgX3RzXywgX2ZzXywgX2ZsYXNoXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICBwcyA9IF9wc187CiAgICAgICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgICAgICBncyA9IF9nc187CiAgICAgICAgICAgIHRzID0gX3RzXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdEluc3Q6IGluaXRJbnN0LAogICAgICAgICAgICAgICAgZGVzdHJveUluc3Q6IGRlc3Ryb3lJbnN0LAoKICAgICAgICAgICAgICAgIGFkZEluc3RhbmNlOiBhZGRJbnN0YW5jZSwKICAgICAgICAgICAgICAgIHVwZGF0ZUluc3RhbmNlOiB1cGRhdGVJbnN0YW5jZSwKICAgICAgICAgICAgICAgIHJlbW92ZUluc3RhbmNlOiByZW1vdmVJbnN0YW5jZSwKCiAgICAgICAgICAgICAgICBjYW5jZWxBZmZpbml0eTogY2FuY2VsQWZmaW5pdHksCgogICAgICAgICAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvaUJveC5pc1Zpc2libGUoKTsgfSwKICAgICAgICAgICAgICAgIHNob3c6IHNob3dJbnN0cywKICAgICAgICAgICAgICAgIGhpZGU6IGhpZGVJbnN0cywKICAgICAgICAgICAgICAgIHRvZ2dsZTogdG9nZ2xlSW5zdHMsCiAgICAgICAgICAgICAgICBzaG93TWFzdGVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvaVNob3dNYXN0ZXI7IH0KICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Cozc71aCeAUAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwZ0AAQAY6dsCoBzbAqAdglSsf9fZqWmFnPmVigBAFbgjyAAABAQgKAKNe/gBNpfqM3O9WMHoFAJkCAACZAgAACAAnrR4TaPcoH9LFCABFAAKLPGVAAEAGbCHAqAc2wKgHYJUiH/VYeotzQcEZ+YAYDQ5CDwAAAQEICgCjXv4ATaX5R0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvZ2x5cGguY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WO3wFAJgCAACYAgAACAAnrR4TaPcoH9LFCABFAAKKcGhAAEAGOB/AqAc2wKgHYJUrH/X2alphZz5lYoAYBaT/kQAAAQEICgCjXv8ATaX6R0VUIC9vbm9zL3VpL2FwcC9mdy9zdmcvaWNvbi5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71aA2AUAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTBx0AAQAbpFcCoBzbAqAdglS0f9U/ZuoGmk0/sgBAFkiVaAAABAQgKAKNfBQBNpfeM3O9WrOkFAGYNAABmDQAAaPcoH9LFCAAnrR4TCABFAA1YjY9AAEAGECrAqAdgwKgHNh/1lS2mk0/sT9m6gYAYAVCdMQAAAQEICgBNpgEAo18FDQpEMUINCignZycpLmF0dHIoJ2lkJywgJ3RvcG8tcG9ydExhYmVscycpOwoKICAgICAgICAgICAgICAgIGxpbmsgPSBsaW5rRy5zZWxlY3RBbGwoJy5saW5rJyk7CiAgICAgICAgICAgICAgICBsaW5rTGFiZWwgPSBsaW5rTGFiZWxHLnNlbGVjdEFsbCgnLmxpbmtMYWJlbCcpOwogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVHLnNlbGVjdEFsbCgnLm5vZGUnKTsKCiAgICAgICAgICAgICAgICBmb3JjZSA9IGQzLmxheW91dC5mb3JjZSgpCiAgICAgICAgICAgICAgICAgICAgLnNpemUoZGltKQogICAgICAgICAgICAgICAgICAgIC5ub2RlcyhuZXR3b3JrLm5vZGVzKQogICAgICAgICAgICAgICAgICAgIC5saW5rcyhuZXR3b3JrLmxpbmtzKQogICAgICAgICAgICAgICAgICAgIC5ncmF2aXR5KHNldHRpbmdzLmdyYXZpdHkpCiAgICAgICAgICAgICAgICAgICAgLmZyaWN0aW9uKHNldHRpbmdzLmZyaWN0aW9uKQogICAgICAgICAgICAgICAgICAgIC5jaGFyZ2Uoc2V0dGluZ3MuY2hhcmdlLl9kZWZfKQogICAgICAgICAgICAgICAgICAgIC5saW5rRGlzdGFuY2Uoc2V0dGluZ3MubGlua0Rpc3RhbmNlLl9kZWZfKQogICAgICAgICAgICAgICAgICAgIC5saW5rU3RyZW5ndGgoc2V0dGluZ3MubGlua1N0cmVuZ3RoLl9kZWZfKQogICAgICAgICAgICAgICAgICAgIC5vbigndGljaycsIHRpY2spOwoKICAgICAgICAgICAgICAgIGRyYWcgPSBzdXMuY3JlYXRlRHJhZ0JlaGF2aW9yKGZvcmNlLAogICAgICAgICAgICAgICAgICAgIHRzcy5zZWxlY3RPYmplY3QsIGF0RHJhZ0VuZCwgZHJhZ0VuYWJsZWQsIGNsaWNrRW5hYmxlZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIG5ld0RpbShfZGltXykgewogICAgICAgICAgICAgICAgZGltID0gX2RpbV87CiAgICAgICAgICAgICAgICBmb3JjZS5zaXplKGRpbSk7CiAgICAgICAgICAgICAgICB0bXMubmV3RGltKGRpbSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lGb3JjZSgpIHsKICAgICAgICAgICAgICAgIGZvcmNlLnN0b3AoKTsKCiAgICAgICAgICAgICAgICB0bHMuZGVzdHJveUxpbmsoKTsKICAgICAgICAgICAgICAgIHRvcy5kZXN0cm95T2JsaXF1ZSgpOwogICAgICAgICAgICAgICAgdHRzLmRlc3Ryb3lUcmFmZmljKCk7CiAgICAgICAgICAgICAgICB0c3MuZGVzdHJveVNlbGVjdCgpOwogICAgICAgICAgICAgICAgdGQzLmRlc3Ryb3lEMygpOwogICAgICAgICAgICAgICAgdG1zLmRlc3Ryb3lNb2RlbCgpOwogICAgICAgICAgICAgICAgLy8gbm90ZTogbm8gbmVlZCB0byBkZXN0cm95IG92ZXJsYXkgc2VydmljZQogICAgICAgICAgICAgICAgdHMucmVtb3ZlTGlzdGVuZXIodGhlbWVMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICB0aGVtZUxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCB0aGUgRE9NCiAgICAgICAgICAgICAgICBzdmcuc2VsZWN0QWxsKCdnJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBzdmcuc2VsZWN0QWxsKCdkZWZzJykucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAgaW50ZXJuYWwgc3RhdGUKICAgICAgICAgICAgICAgIG5ldHdvcmsubm9kZXMgPSBbXTsKICAgICAgICAgICAgICAgIG5ldHdvcmsubGlua3MgPSBbXTsKICAgICAgICAgICAgICAgIG5ldHdvcmsubGlua3NCeURldmljZSA9IHt9OwogICAgICAgICAgICAgICAgbmV0d29yay5sb29rdXAgPSB7fTsKICAgICAgICAgICAgICAgIG5ldHdvcmsucmV2TGlua1RvS2V5ID0ge307CgogICAgICAgICAgICAgICAgbGlua051bXMgPSBbXTsKCiAgICAgICAgICAgICAgICBsaW5rRyA9IGxpbmtMYWJlbEcgPSBudW1MaW5rTGJsc0cgPSBub2RlRyA9IHBvcnRMYWJlbEcgPSBudWxsOwogICAgICAgICAgICAgICAgbGluayA9IGxpbmtMYWJlbCA9IG5vZGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yY2UgPSBkcmFnID0gbnVsbDsKCiAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCAkdGltZW91dCBwcm9taXNlcwogICAgICAgICAgICAgICAgaWYgKGZUaW1lcikgewogICAgICAgICAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbChmVGltZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGZOb2Rlc1RpbWVyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKGZOb2Rlc1RpbWVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmTGlua3NUaW1lcikgewogICAgICAgICAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbChmTGlua3NUaW1lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0Rm9yY2U6IGluaXRGb3JjZSwKICAgICAgICAgICAgICAgIG5ld0RpbTogbmV3RGltLAogICAgICAgICAgICAgICAgZGVzdHJveUZvcmNlOiBkZXN0cm95Rm9yY2UsCgogICAgICAgICAgICAgICAgdXBkYXRlRGV2aWNlQ29sb3JzOiB0ZDMudXBkYXRlRGV2aWNlQ29sb3JzLAogICAgICAgICAgICAgICAgdG9nZ2xlSG9zdHM6IHRvZ2dsZUhvc3RzLAogICAgICAgICAgICAgICAgdG9nZ2xlUG9ydHM6IHRscy50b2dnbGVQb3J0cywKICAgICAgICAgICAgICAgIHRvZ2dsZU9mZmxpbmU6IHRvZ2dsZU9mZmxpbmUsCiAgICAgICAgICAgICAgICBjeWNsZURldmljZUxhYmVsczogY3ljbGVEZXZpY2VMYWJlbHMsCiAgICAgICAgICAgICAgICB1bnBpbjogdW5waW4sCiAgICAgICAgICAgICAgICBzaG93TWFzdGVyc2hpcDogc2hvd01hc3RlcnNoaXAsCiAgICAgICAgICAgICAgICBzaG93QmFkTGlua3M6IHNob3dCYWRMaW5rcywKCiAgICAgICAgICAgICAgICByZXNldEFsbExvY2F0aW9uczogcmVzZXRBbGxMb2NhdGlvbnMsCiAgICAgICAgICAgICAgICBhZGREZXZpY2U6IGFkZERldmljZSwKICAgICAgICAgICAgICAgIHVwZGF0ZURldmljZTogdXBkYXRlRGV2aWNlLAogICAgICAgICAgICAgICAgcmVtb3ZlRGV2aWNl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IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBNYXN0aGVhZCAtLSBDU1MgZmlsZQogKi8KCiNtYXN0IHsKICAgIGhlaWdodDogMzZweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKfQoKaHRtbFtkYXRhLXBsYXRmb3JtPSdpUGFkJ10gI21hc3QgewogICAgcGFkZGluZy10b3A6IDE2cHg7Cn0KCi5saWdodCAjbWFzdCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4ICM3Nzc7Cn0KLmRhcmsgI21hc3QgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCAjMjIyOwp9CgojbWFzdCAubmF2LW1lbnUtYnV0dG9uIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWFyZ2luLWxlZnQ6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubGlnaHQgI21hc3QgLm5hdi1tZW51LWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwp9Ci5kYXJrICNtYXN0IC5uYXYtbWVudS1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzc3NzsKfQoKI21hc3QgaW1nLmxvZ28gewogICAgaGVpZ2h0OiAzOHB4OwogICAgcGFkZGluZy1sZWZ0OiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCiNtYXN0IGltZy5sb2dvOmhvdmVyIHsKICAgIC8qIG5lZWQgc29tZXRoaW5nIGJldHRlciAqLwogICAgLypiYWNrZ3JvdW5kLWNvbG9yOiAjODg4OyovCn0KCiNtYXN0IC50aXRsZSB7CiAgICBmb250LXNpemU6IDE0cHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICB2ZXJ0aWNhbC1hbGlnbjogMTJweDsKfQoKLmxpZ2h0ICNtYXN0IC50aXRsZSB7CiAgICBjb2xvcjogIzM2OTsKfQouZGFyayAjbWFzdCAudGl0bGUgewogICAgY29sb3I6ICNlZWU7Cn0KCiNtYXN0LXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgZmxvYXQ6IHJpZ2h0OwogICAgLypib3JkZXI6IDFweCBzb2xpZCByZWQ7Ki8KfQoKI21hc3QtcmlnaHQgYSB7CiAgICBmb250LXNpemU6IDEycHQ7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLmxpZ2h0ICNtYXN0LXJpZ2h0IGEgewogICAgY29sb3I6ICMzNjk7Cn0KLmRhcmsgI21hc3QtcmlnaHQgYSB7CiAgICBjb2xvcjogI2VlZTsKfQoKI21hc3QtcmlnaHQgYTpob3ZlciB7CiAgICBjb2xvcjogI0NFNTY1MDsKfQoNCozc71b77wUAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTkm0AAQAbGQcCoBzbAqAdglSwf9QUJ0EVw2EW+gBAC1p0AAAABAQgKAKNfBgBNpgKM3O9WKPIFAAQIAAAECAAAaPcoH9LFCAAnrR4TCABFAAf2GLJAAEAGimnAqAdgwKgHNh/1lStnPmVi9mpct4AYAZ6XzwAAAQEICgBNpgIAo17/SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo3M0UNCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gSWNvbiBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKc3ZnI0ljb25MaWJEZWZzIHsKICBkaXNwbGF5OiBub25lOwp9CgpzdmcgLnN2Z0ljb24gewogICAgZmlsbC1ydWxlOiBldmVub2RkOwp9CgpzdmcuZW1iZWRkZWRJY29uIGcuaWNvbiB7CiAgICBmaWxsOiBub25lOwp9CgpzdmcuZW1iZWRkZWRJY29uIGcuaWNvbiByZWN0IHsKICAgIHN0cm9rZTogbm9uZTsKICAgIGZpbGw6IG5vbmU7Cn0KCnN2Zy5lbWJlZGRlZEljb24gZy5pY29uIC5nbHlwaCB7CiAgICBzdHJva2U6IG5vbmU7CiAgICBmaWxsOiB3aGl0ZTsKICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKfQoKCi8qIFNvcnRhYmxlIHRhYmxlIGhlYWRlcnMgKi8KLmxpZ2h0IGRpdi50YWJsZUNvbFNvcnQgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiAuZ2x5cGggewogICAgZmlsbDogYmxhY2s7Cn0KLmRhcmsgZGl2LnRhYmxlQ29sU29ydCBzdmcuZW1iZWRkZWRJY29uIC5pY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjY2NjOwp9CgoKLyogY29sb3Igc2NoZW1lcyBmb3Igc3BlY2lmaWMgaWNvbiBjbGFzc2VzICovCgpzdmcuZW1iZWRkZWRJY29uIC5pY29uLmFwcEluYWN0aXZlIC5nbHlwaCB7CiAgICBmaWxsOiBub25lOwp9CgoubGlnaHQgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5hY3RpdmUgLmdseXBoIHsKICAgIGZpbGw6IGdyZWVuOwp9Ci5kYXJrIHN2Zy5lbWJlZGRlZEljb24gLmljb24uYWN0aXZlIC5nbHlwaCB7CiAgICBmaWxsOiAjMzA4QzEwOwp9CgoKLmxpZ2h0IHRhYmxlIHN2Zy5lbWJlZGRlZEljb24gewogICAgZmlsbDogI2NjYzsKfQouZGFyayB0YWJsZSBzdmcuZW1iZWRkZWRJY29uIHsKICAgIGZpbGw6ICMyMjI7Cn0KLmxpZ2h0IHRhYmxlIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6ICMzMzM7Cn0KLmRhcmsgdGFibGUgc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGggewogICAgZmlsbDogI2NjYzsKfQoKLmxpZ2h0IHN2Zy5lbWJlZGRlZEljb24gLmljb24uYWN0aXZlIC5nbHlwaCB7CiAgICBmaWxsOiBncmVlbjsKfQoubGlnaHQgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbi5pbmFjdGl2ZSAuZ2x5cGggewogICAgZmlsbDogZGFya3JlZDsKfQouZGFyayBzdmcuZW1iZWRkZWRJY29uIC5pY29uLmFjdGl2ZSAuZ2x5cGggewogICAgZmlsbDogIzMwOEMxMDsKfQouZGFyayBzdmcuZW1iZWRkZWRJY29uIC5pY29uLmluYWN0aXZlIC5nbHlwaCB7CiAgICBmaWxsOiAjQUQyRDJEOwp9Cg0KjNzvVobyBQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANHBpQABABjp0wKgHNsCoB2CVKx/19mpct2c+bSSAEAWk/pMAAAEBCAoAo18GAE2mAozc71YB8wUARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADkYtEAAQAaSJMCoB2DAqAc2H/WVK2c+bST2aly3gBgBnpASAAABAQgKAE2mAgCjXwYwDQoNCozc71ah9AUAnAIAAJwCAAAIACetHhNo9ygf0sUIAEUAAo5wakAAQAY4GcCoBzbAqAdglSsf9fZqXLdnPm0pgBgFpBumAAABAQgKAKNfBgBNpgJHRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL2RpYWxvZy5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YCCgYARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADlu6EAAQAY78MCoB2DAqAc2H/WVLHDYRb4FCdBFgBgBPJASAAABAQgKAE2mAwCjXwYwDQoNCozc71aFCwYAmwIAAJsCAAAIACetHhNo9ygf0sUIAEUAAo3knEAAQAbD58CoBzbAqAdglSwf9QUJ0EVw2EXDgBgC1puRAAABAQgKAKNfCABNpgNHRVQgL29ub3MvdWkvYXBwL2Z3L2xheWVyL2ZsYXNoLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVoYLBgAaBAAAGgQAAGj3KB/SxQgAJ60eEwgARQAEDNUsQABABtHYwKgHYMCoBzYf9ZUiQcEZ+Vh6jcqAGAHDk+UAAAEBCAoATaYDAKNe/khUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMzU0DQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEdseXBoIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgpzdmcgLmdseXBoIHsKICAgIHN0cm9rZTogbm9uZTsKICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKfQoKLmxpZ2h0IHN2ZyAuZ2x5cGgsCi5kYXJrIHN2ZyAuZ2x5cGgub3ZlcmxheSB7CiAgICBmaWxsOiBibGFjazsKfQoKLmRhcmsgc3ZnIC5nbHlwaCwKLmxpZ2h0IHN2ZyAuZ2x5cGgub3ZlcmxheSB7CiAgICBmaWxsOiB3aGl0ZTsKfQoNCozc71ZNDAYARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADnVLUAAQAbVqsCoB2DAqAc2H/WVIkHBHdFYeo3KgBgBw5ASAAABAQgKAE2mAwCjXv4wDQoNCozc71ayDQYAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQ8ZkAAQAZud8CoBzbAqAdglSIf9Vh6jcpBwR3WgBANDtjYAAABAQgKAKNfCABNpgOM3O9WvA4GAJ8CAACfAgAACAAnrR4TaPcoH9LFCABFAAKRPGdAAEAGbBnAqAc2wKgHYJUiH/VYeo3KQcEd1oAYDQ7rnwAAAQEICgCjXwgATaYDR0VUIC9vbm9zL3VpL2FwcC9mdy9sYXllci9xdWlja2hlbHAuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9W8BAGALEFAACxBQAAaPcoH9LFCAAnrR4TCABFAAWj1S5AAEAG0D/AqAdgwKgHNh/1lSJBwR3WWHqQJ4AYAdOVfAAAAQEICgBNpgQAo18ISFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQo0RUINCi8qCiAqIENvcHlyaWdodCAyMDE0LDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gUXVpY2sgSGVscCBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKI3F1aWNraGVscCB7CiAgICB6LWluZGV4OiAxMzAwOwp9CgojcXVpY2toZWxwIHN2ZyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDE4MHB4OwogICAgb3BhY2l0eTogMTsKfQoKI3F1aWNraGVscCBzdmcgZy5oZWxwIHJlY3QgewogICAgZmlsbDogYmxhY2s7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCiNxdWlja2hlbHAgc3ZnIHRleHQudGl0bGUgewogICAgZm9udC1zaXplOiAxMHB0OwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgIGZpbGw6ICM5OTk7Cn0KCiNxdWlja2hlbHAgc3ZnIGcua2V5SXRlbSB7CiAgICBmaWxsOiB3aGl0ZTsKfQoKI3F1aWNraGVscCBzdmcgZyBsaW5lLnFocm93c2VwIHsKICAgIHN0cm9rZTogIzg4ODsKICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIgMjsKfQoKI3F1aWNraGVscCBzdmcgdGV4dCB7CiAgICBmb250LXNpemU6IDdwdDsKICAgIGFsaWdubWVudC1iYXNlbGluZTogbWlkZGxlOwp9CgojcXVpY2toZWxwIHN2ZyB0ZXh0LmtleSB7CiAgICBmaWxsOiAjYWRkOwp9CgojcXVpY2toZWxwIHN2ZyB0ZXh0LmRlc2MgewogICAgZmlsbDogI2RkZDsKfQoKDQqM3O9WbxEGAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA51S9AAEAG1ajAqAdgwKgHNh/1lSJBwSNFWHqQJ4AYAdOQEgAAAQEICgBNpgQAo18IMA0KDQqM3O9W8RMGAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PGhAAEAGbnXAqAc2wKgHYJUiH/VYepAnQcEjSoAQDQ7RBgAAAQEICgCjXwgATaYEjNzvVtkUBgCjBgAAowYAAGj3KB/SxQgAJ60eEwgARQAGlTfAQABABmy8wKgHYMCoBzYf9ZUnOVYrw9uSkG6AGAFPlm4AAAEBCAoATaYEAKNe/EhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNUREDQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIGNvcmUgLS0gQ1NTIGZpbGUKICovCgpodG1sIHsKICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogICAgLW1zLXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KCi8qCiAgIG92ZXJmbG93IGhpZGRlbiBpcyB0byBlbnN1cmUgdGhhdCB0aGUgYm9keSBkb2VzIG5vdCBleHBhbmQgdG8gYWNjb3VudAogICBmb3IgYW55IGZseW91dCBwYW5lcywgdGhhdCBhcmUgcG9zaXRpb25lZCAib2ZmIHNjcmVlbiIuCiAqLwpib2R5IHsKICAgIGhlaWdodDogMTAwJTsKICAgIG1hcmdpbjogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCmJvZHkubGlnaHQgewogICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Cn0KYm9keS5kYXJrIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMyYjJiMmI7Cn0KCiN2aWV3IHsKICAgIHBhZGRpbmc6IDZweDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwp9CgojdmlldyBoMiB7CiAgICBwYWRkaW5nLWxlZnQ6IDEycHg7Cn0KCi5saWdodCAjdmlldyBoMiB7CiAgICBjb2xvcjogIzgwMDsKfQouZGFyayAjdmlldyBoMiB7CiAgICBjb2xvcjogI0NFNTY1MDsKfQoKLmNlbnRlcmVkIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYm94LXNoYWRvdzogMnB4IDJweCAyNHB4IDVweCAjODg4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KDQqM3O9WWhUGAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LgBAAEAGfN3AqAc2wKgHYJUnH/XbkpBuOVYyJIAQDzNFDgAAAQEICgCjXwgATaYEjNzvVjAWBgCaAgAAmgIAAAgAJ60eE2j3KB/SxQgARQACjDxpQABABmwcwKgHNsCoB2CVIh/1WHqQJ0HBI0qAGA0OQ4sAAAEBCAoAo18IAE2mBEdFVCAvb25vcy91aS9hcHAvZncvbGF5ZXIvdmVpbC5jc3MgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6IHRleHQvY3NzLCovKjtxPTAuMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71b9GQYA8gQAAPIEAABo9ygf0sUIACetHhMIAEUABOTVMEAAQAbQ/MCoB2DAqAc2H/WVIkHBI0pYepJ/gBgB45S9AAABAQgKAE2mBACjXwhIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjQyQw0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVmVpbCBTZXJ2aWNlIC0tIENTUyBmaWxlCiAqLwoKI3ZlaWwgewogICAgei1pbmRleDogNTAwMDsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwp9CgoubGlnaHQgI3ZlaWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjc1KTsKfQouZGFyayAjdmVpbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDY0LDY0LDY0LDAuNzUpOwp9CgojdmVpbCAubXNnIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHBhZGRpbmc6IDYwcHg7Cn0KCiN2ZWlsIC5tc2cgcCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGNvbG9yOiAjZGRkOwp9CgojdmVpbCBzdmcgLmdseXBoIHsKICAgIGZpbGw6ICMyMjI7Cn0KDQqM3O9WmBoGAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA51TFAAEAG1abAqAdgwKgHNh/1lSJBwSf6WHqSf4AYAeOQEgAAAQEICgBNpgQAo18IMA0KDQqM3O9WPBwGAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PGpAAEAGbnPAqAc2wKgHYJUiH/VYepJ/QcEn/4AQDQ7J+AAAAQEICgCjXwkATaYEjNzvVnsdBgCxAgAAsQIAAAgAJ60eE2j3KB/SxQgARQACozxrQABABmwDwKgHNsCoB2CVIh/1WHqSf0HBJ/+AGA0Ou8gAAAEBCAoAo18JAE2mBEdFVCAvb25vcy91aS9hcHAvY29tbW9uLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NjAwMTE3ODMNCg0KjNzvVhMeBgAgBQAAIAUAAGj3KB/SxQgAJ60eEwgARQAFEm7pQABABjcWwKgHYMCoBzYf9ZUscNhFwwUJ0p6AGAFGlOsAAAEBCAoATaYEAKNfCEhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNDVBDQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz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L29ub3MvdWkvYXBwL2Z3L25hdi9uYXYuY3NzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiB0ZXh0L2NzcywqLyo7cT0wLjENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9W9ScGAPwDAAD8AwAAaPcoH9LFCAAnrR4TCABFAAPubutAAEAGODjAqAdgwKgHNh/1lSxw2EqmBQnU+YAYAVCTxwAAAQEICgBNpgUAo18JSFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IHRleHQvY3NzDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQozMzYNCi8qCiAqICBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBMb2FkaW5nIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgojbG9hZGluZy1hbmltIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwp9Cg0KjNzvVkwqBgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOW7sQABABjvswKgHYMCoBzYf9ZUscNhOYAUJ1PmAGAFQkBIAAAEBCAoATaYFAKNfCTANCg0KjNzvVjYsBgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOSfQABABsY9wKgHNsCoB2CVLB/1BQnU+XDYTmWAEAMDj3EAAAEBCAoAo18KAE2mBYzc71bwLAYA0gMAANIDAABo9ygf0sUIACetHhMIAEUAA8TuCUAAQAa5Q8CoB2DAqAc2H/WVKpOnH5rG6PwdgBgBMZOdAAABAQgKAE2mBQCjXvxIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjMwQw0KLmNoYXJ0LWxlZ2VuZCwuYmFyLWxlZ2VuZCwubGluZS1sZWdlbmQsLnBpZS1sZWdlbmQsLnJhZGFyLWxlZ2VuZCwucG9sYXJhcmVhLWxlZ2VuZCwuZG91Z2hudXQtbGVnZW5ke2xpc3Qtc3R5bGUtdHlwZTpub25lO21hcmdpbi10b3A6NXB4O3RleHQtYWxpZ246Y2VudGVyOy13ZWJraXQtcGFkZGluZy1zdGFydDowOy1tb3otcGFkZGluZy1zdGFydDowO3BhZGRpbmctbGVmdDowfS5jaGFydC1sZWdlbmQgbGksLmJhci1sZWdlbmQgbGksLmxpbmUtbGVnZW5kIGxpLC5waWUtbGVnZW5kIGxpLC5yYWRhci1sZWdlbmQgbGksLnBvbGFyYXJlYS1sZWdlbmQgbGksLmRvdWdobnV0LWxlZ2VuZCBsaXtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWJvdHRvbTo0cHg7Ym9yZGVyLXJhZGl1czo1cHg7cGFkZGluZzoycHggOHB4IDJweCAyOHB4O2ZvbnQtc2l6ZTpzbWFsbGVyO2N1cnNvcjpkZWZhdWx0fS5jaGFydC1sZWdlbmQgbGkgc3BhbiwuYmFyLWxlZ2VuZCBsaSBzcGFuLC5saW5lLWxlZ2VuZCBsaSBzcGFuLC5waWUtbGVnZW5kIGxpIHNwYW4sLnJhZGFyLWxlZ2VuZCBsaSBzcGFuLC5wb2xhcmFyZWEtbGVnZW5kIGxpIHNwYW4sLmRvdWdobnV0LWxlZ2VuZCBsaSBzcGFue2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyLXJhZGl1czo1cHh9Ci8qIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItY2hhcnQubWluLmNzcy5tYXAgKi8KDQqM3O9WOC0GAJ0CAACdAgAACAAnrR4TaPcoH9LFCABFAAKP5KBAAEAGw+HAqAc2wKgHYJUsH/UFCdT5cNhOZYAYAwNNUwAAAQEICgCjXwoATaYFR0VUIC9vbm9zL3VpL2FwcC9mdy93aWRnZXQvYnV0dG9uLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVvktBgBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOe4KQABABrzNwKgHYMCoBzYf9ZUqk6cjKsbo/B2AGAExkBIAAAEBCAoATaYFAKNe/DANCg0KjNzvVocuBgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLfsQABABvLwwKgHNsCoB2CVKh/1xuj8HZOnIy+AEARhrXgAAAEBCAoAo18KAE2mBYzc71akLwYAngIAAJ4CAAAIACetHhNo9ygf0sUIAEUAApC37UAAQAbwk8CoBzbAqAdglSof9cbo/B2TpyMvgBgEYanDAAABAQgKAKNfCgBNpgVHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC90b29sYmFyLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVrIvBgBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANO4LQABABrzRwKgHYMCoBzYf9ZUqk6cjL8bo/nmAEAE7kA0AAAEBCAoATaYGAKNfCozc71ZeNAYAvQcAAL0HAABo9ygf0sUIACetHhMIAEUAB6/VM0AAQAbOLsCoB2DAqAc2H/WVIkHBKD1YepdDgBgCBJeIAAABAQgKAE2mBgCjXwlIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjZGNw0KLyoKICogQ29weXJpZ2h0IDIwMTQsMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBOYXZpZ2F0aW9uIC0tIENTUyBmaWxlCiAqLwoKI25hdiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDQ1cHg7CiAgICBsZWZ0OiAxcHg7CiAgICBwYWRkaW5nOiAwOwogICAgei1pbmRleDogMzAwMDsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoKaHRtbFtkYXRhLXBsYXRmb3JtPSdpUGFkJ10gI25hdiB7CiAgICB0b3A6IDU3cHg7Cn0KCi5saWdodCAjbmF2IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNiYmI7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggIzc3NzsKfQouZGFyayAjbmF2IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM0NDQ7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggIzExMTsKfQoKI25hdiAubmF2LWhkciB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBwYWRkaW5nOiA2cHggOHB4IDZweCA4cHg7Cn0KCi5saWdodCAjbmF2IC5uYXYtaGRyIHsKICAgIGNvbG9yOiAjZGRkOwogICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICM5OTk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhOwp9Ci5kYXJrICNuYXYgLm5hdi1oZHIgewogICAgY29sb3I6ICM4ODg7CiAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggIzQ0NDsKICAgIGJhY2tncm91bmQtY29sb3I6ICM1NTU7Cn0KCiNuYXYgYSB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXNpemU6IDE0cHQ7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBhZGRpbmc6IDhweCAxNnB4IDZweCAxMnB4Owp9CgoubGlnaHQgI25hdiBhIHsKICAgIGNvbG9yOiAjMzY5OwogICAgYm9yZGVyLWJvdHRvbTogc29saWQgI2NjYyAxcHg7Cn0KLmRhcmsgI25hdiBhIHsKICAgIGNvbG9yOiAjZWVlOwogICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzMzMyAxcHg7Cn0KCi5saWdodCAjbmF2IGE6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQouZGFyayAjbmF2IGE6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzc3NzsKfQoKI25hdiBhIGRpdiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgcGFkZGluZy1yaWdodDogNHB4Owp9CgojbmF2IGEgZGl2IHN2Zy5lbWJlZGRlZEljb24gZy5pY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjYzY2Owp9Cg0KjNzvVq00BgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANDxtQABABm5wwKgHNsCoB2CVIh/1WHqXQ0HBL7iAEA0OvXgAAAEBCAoAo18KAE2mBozc71YsNQYARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADnVNUAAQAbVosCoB2DAqAc2H/WVIkHBL7hYepdDgBgCBJASAAABAQgKAE2mBgCjXwowDQoNCozc71bhNwYAngIAAJ4CAAAIACetHhNo9ygf0sUIAEUAApA8bkAAQAZsE8CoBzbAqAdglSIf9Vh6l0NBwS+9gBgNDrGtAAABAQgKAKNfCwBNpgZHRVQgL29ub3MvdWkvYXBwL2Z3L3dpZGdldC90b29sdGlwLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVhE6BgCbBQAAmwUAAGj3KB/SxQgAJ60eEwgARQAFjY2TQABABhfxwKgHYMCoBzYf9ZUtppNdFU/ZvNqAGAFalWYAAAEBCAoATaYGAKNfBkhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNEQ1DQovKgogKiBDb3B5cmlnaHQgMjAxNCwyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFBhbmVsIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgouZmxvYXRwYW5lbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDA7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHRvcDogNjRweDsKICAgIHdpZHRoOiAyMDBweDsKICAgIHJpZ2h0OiAtMjIwcHg7CiAgICBvcGFjaXR5OiAwOwoKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBmb250LXNpemU6IDEwcHQ7CgogICAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5mbG9hdHBhbmVsLmRpYWxvZyB7CiAgICB0b3A6IDE4MHB4Owp9CgpodG1sW2RhdGEtcGxhdGZvcm09J2lQYWQnXSAuZmxvYXRwYW5lbCB7CiAgICB0b3A6IDgwcHg7Cn0KCi5saWdodCAuZmxvYXRwYW5lbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOCk7CiAgICBjb2xvcjogYmxhY2s7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMnB4ICM3Nzc7Cn0KLmRhcmsgLmZsb2F0cGFuZWwgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1MCw1MCw1MCwwLjgpOwogICAgY29sb3I6ICNjY2M7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMnB4ICMwMDA7Cn0KDQqM3O9W1ToGAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5jZRAAEAGHUTAqAdgwKgHNh/1lS2mk2JuT9m82oAYAVqQEgAAAQEICgBNpgYAo18GMA0KDQqM3O9WSTwGAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wctAAEAG6RHAqAc2wKgHYJUtH/VP2bzappNic4AQBaQQUwAAAQEICgCjXwsATaYGjNzvVrw+BgCcAgAAnAIAAAgAJ60eE2j3KB/SxQgARQACjsHMQABABua2wKgHNsCoB2CVLR/1T9m82qaTYnOAGAWkfBwAAAEBCAoAo18LAE2mBkdFVCAvb25vcy91aS9hcHAvZncvd2lkZ2V0L3RhYmxlLmNzcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogdGV4dC9jc3MsKi8qO3E9MC4xDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVjJBBgBYBQAAWAUAAGj3KB/SxQgAJ60eEwgARQAFShi1QABABo0SwKgHYMCoBzYf9ZUrZz5tKfZqXxGAGAGolSMAAAEBCAoATaYHAKNfBkhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNDkyDQovKgogKiBDb3B5cmlnaHQgMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBEaWFsb2cgU2VydmljZSAtLSBDU1MgZmlsZQogKi8KCi5kaWFsb2cgaDIgewogICAgcGFkZGluZzogMCA0cHg7CiAgICBtYXJnaW46IDA7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMjEwcHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5saWdodCAuZGlhbG9nIGgyIHsKICAgIGNvbG9yOiBibGFjazsKfQouZGFyayAuZGlhbG9nIGgyIHsKICAgIGNvbG9yOiAjZGRkOwp9CgouZGlhbG9nIC5kaWFsb2ctYnV0dG9uIHsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDZw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CiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb29sYmFyIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgoubGlnaHQgLnRiYXItYXJyb3cgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiAuZ2x5cGggewogICAgZmlsbDogIzgzODM4MzsKfQouZGFyayAudGJhci1hcnJvdyBzdmcuZW1iZWRkZWRJY29uIC5pY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjQjJCMkIyOwp9CgoKZGl2LnRiYXItYXJyb3cgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MyU7CiAgICBsZWZ0OiA5NiU7CiAgICBtYXJnaW4tcmlnaHQ6IC00JTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zYWZhcmkgZGl2LnRiYXItYXJyb3cgewogICAgdG9wOiA0NiU7Cn0KLmZpcmVmb3ggZGl2LnRiYXItYXJyb3cgewogICAgbGVmdDogOTclOwogICAgbWFyZ2luLXJpZ2h0OiAtMyU7Cn0KCi50YmFyLWFycm93IHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBzdHJva2U6IG5vbmU7Cn0KLmxpZ2h0IC50YmFyLWFycm93IHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBmaWxsOiBub25lOwp9Ci5kYXJrIC50YmFyLWFycm93IHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBmaWxsOiBub25lOwp9CgoKLnRvb2xiYXIgewogICAgbGluZS1oZWlnaHQ6IDEyNSU7Cn0KLnRiYXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKCgouc2VwYXJhdG9yIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgbWFyZ2luOiAwIDRweCAwIDRweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGhlaWdodDogMjNweDsKICAgIHdpZHRoOiAwOwp9Ci5saWdodCAuc2VwYXJhdG9yIHsKICAgIGJvcmRlci1jb2xvcjogI2RkZDsKfQouZGFyayAuc2VwYXJhdG9yIHsKICAgIGJvcmRlci1jb2xvcjogIzFBMUExQTsKfQoNCozc71YXSgYAkgIAAJICAAAIACetHhNo9ygf0sUIAEUAAoRwbEAAQAY4IcCoBzbAqAdglSsf9fZqXxFnPnJEgBgFpDS5AAABAQgKAKNfDABNpgdHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvT2JsaXF1ZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVh1KBgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLfuQABABvLuwKgHNsCoB2CVKh/1xuj+eZOnKcuAEAR8pGEAAAEBCAoAo18MAE2mB4zc71a0SgYARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADnuDkAAQAa8ycCoB2DAqAc2H/WVKpOnKcvG6P55gBgBO5ASAAABAQgKAE2mBwCjXwwwDQoNCozc71ZKVwYAkgIAAJICAAAIACetHhNo9ygf0sUIAEUAAoS370AAQAbwncCoBzbAqAdglSof9cbo/nmTpynQgBgEfNj9AAABAQgKAKNfDQBNpgdHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvT3ZlcmxheS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVjpYBgCpDQAAqQ0AAGj3KB/SxQgAJ60eEwgARQANm27tQABABi6JwKgHYMCoBzYf9ZUscNhOZQUJ11SAGAFanXQAAAEBCAoATaYIAKNfCkhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KQ0UzDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBCdXR0b24gU2VydmljZSAtLSBDU1MgZmlsZQogKi8KCi5idXR0b24sCi50b2dnbGVCdXR0b24sCi5yYWRpb1NldCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwYWRkaW5nOiAwIDRweDsKfQoucmFkaW9CdXR0b24gewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogMCAycHg7Cn0KCi5idXR0b24gc3ZnLmVtYmVkZGVkSWNvbiwKLnRvZ2dsZUJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uLAoucmFkaW9CdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi50b2dnbGVCdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0LAoucmFkaW9CdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0ewogICAgc3Ryb2tlOiBub25lOwp9CgovKiBTZWxlY3RlZCBidXR0b24gY29sb3IgKi8KLmxpZ2h0IC5idXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0LAoubGlnaHQgLnRvZ2dsZUJ1dHRvbi5zZWxlY3RlZCBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5saWdodCAucmFkaW9CdXR0b24uc2VsZWN0ZWQgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0IHsKICAgIGZpbGw6ICM4MzgzODM7Cn0KCi5saWdodCAuYnV0dG9uOmhvdmVyIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCwKLmxpZ2h0IC50b2dnbGVCdXR0b24uc2VsZWN0ZWQ6aG92ZXIgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0Ci8qIE5PVEU6IHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBzaG91bGQgTk9UIGhhdmUgaG92ZXIgaGlnaGxpZ2h0ICovCnsKICAgIGZpbGw6ICM0NDQ0NDQ7Cn0KCi5saWdodCAuYnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoLAoubGlnaHQgLnRvZ2dsZUJ1dHRvbi5zZWxlY3RlZCBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCwKLmxpZ2h0IC5yYWRpb0J1dHRvbi5zZWxlY3RlZCBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiB3aGl0ZTsKfQoKLmRhcmsgLmJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5kYXJrIC50b2dnbGVCdXR0b24uc2VsZWN0ZWQgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0LAouZGFyayAucmFkaW9CdXR0b24uc2VsZWN0ZWQgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0IHsKICAgIGZpbGw6ICMxNTE1MTU7Cn0KCi5kYXJrIC5idXR0b246aG92ZXIgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0LAouZGFyayAudG9nZ2xlQnV0dG9uLnNlbGVjdGVkOmhvdmVyIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdAovKiBOT1RFOiBzZWxlY3RlZCByYWRpbyBidXR0b24gc2hvdWxkIE5PVCBoYXZlIGhvdmVyIGhpZ2hsaWdodCAqLwp7CiAgICBmaWxsOiAjNDQ0Owp9CgouZGFyayAuYnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoLAouZGFyayAudG9nZ2xlQnV0dG9uLnNlbGVjdGVkIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoLAouZGFyayAucmFkaW9CdXR0b24uc2VsZWN0ZWQgc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGggewogICAgZmlsbDogI0IyQjJCMjsKfQoKLyogVW5zZWxlY3RlZCBidXR0b24gY29sb3IgKi8KLmxpZ2h0IC50b2dnbGVCdXR0b24gc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0LAoubGlnaHQgLnJhZGlvQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmljb24gcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9CgoubGlnaHQgLnRvZ2dsZUJ1dHRvbjpob3ZlciBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5saWdodCAucmFkaW9CdXR0b246aG92ZXI6bm90KC5zZWxlY3RlZCkgc3ZnLmVtYmVkZGVkSWNvbiAuaWNvbiByZWN0IHsKICAgIGZpbGw6ICNjY2M7Cn0KCi5saWdodCAudG9nZ2xlQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoLAoubGlnaHQgLnJhZGlvQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6ICNiYmI7Cn0KLmxpZ2h0IC50b2dnbGVCdXR0b246aG92ZXI6bm90KC5zZWxlY3RlZCkgc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGgsCi5saWdodCAucmFkaW9CdXR0b246aG92ZXI6bm90KC5zZWxlY3RlZCkgc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGggewogICAgZmlsbDogIzk5OTsKfQoKLmRhcmsgLnRvZ2dsZUJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5kYXJrIC5yYWRpb0J1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QgewogICAgZmlsbDogIzMwMzAzMDsKfQoKLmRhcmsgLnRvZ2dsZUJ1dHRvbjpob3Zlcjpub3QoLnNlbGVjdGVkKSBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QsCi5kYXJrIC5yYWRpb0J1dHRvbjpob3Zlcjpub3QoLnNlbGVjdGVkKSBzdmcuZW1iZWRkZWRJY29uIC5pY29uIHJlY3QgewogICAgZmlsbDogIzU1NTsKfQoKLmRhcmsgLnRvZ2dsZUJ1dHRvbiBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCwKLmRhcmsgLnJhZGlvQnV0dG9uIHN2Zy5lbWJlZGRlZEljb24gLmdseXBoIHsKICAgIGZpbGw6ICM1NjU2NTY7Cn0KCi5kYXJrIC50b2dnbGVCdXR0b246aG92ZXI6bm90KC5zZWxlY3RlZCkgc3ZnLmVtYmVkZGVkSWNvbiAuZ2x5cGgsCi5kYXJrIC5yYWRpb0J1dHRvbjpob3Zlcjpub3QoLnNlbGVjdGVkKSBzdmcuZW1iZWRkZWRJY29uIC5nbHlwaCB7CiAgICBmaWxsOiAjNzc3Owp9Cg0KjNzvVtVZBgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOShQABABsY7wKgHNsCoB2CVLB/1BQnXVHDYW8yAEAM5f3MAAAEBCAoAo18NAE2mCIzc71a0XgYAuQ8AALkPAABo9ygf0sUIACetHhMIAEUAD6uNlUAAQAYN0cCoB2DAqAc2H/WVLaaTYnNP2b80gBgBZJ+EAAABAQgKAE2mCQCjXwtIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogdGV4dC9jc3MNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCkVGMw0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKiAtLS0tLS0gZm9yIHN1bW1hcnktbGlzdCB0YWJsZXMgLS0tLS0tICovCgpkaXYuc3VtbWFyeS1saXN0IHsKICAgIG1hcmdpbjogMCAyMHB4IDE2cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIGJvcmRlci1zcGFjaW5nOiAwOwp9CgpkaXYuc3VtbWFyeS1saXN0IHRhYmxlIHsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW46IDA7Cn0KCmRpdi5zdW1tYXJ5LWxpc3QgZGl2LnRhYmxlLWJvZHkgewogICAgb3ZlcmZsb3cteTogc2Nyb2xsOwp9CgpkaXYuc3VtbWFyeS1saXN0IGRpdi50YWJsZS1ib2R5Ojotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgpkaXYuc3VtbWFyeS1saXN0IHRyLm5vLWRhdGEgdGQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgoubGlnaHQgZGl2LnN1bW1hcnktbGlzdCB0cjpudGgtY2hpbGQoZXZlbikgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQoubGlnaHQgZGl2LnN1bW1hcnktbGlzdCB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9Ci5kYXJrIGRpdi5zdW1tYXJ5LWxpc3QgdHI6bnRoLWNoaWxkKGV2ZW4pIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KLmRhcmsgZGl2LnN1bW1hcnktbGlzdCB0cjpudGgtY2hpbGQob2RkKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9CgoubGlnaHQgZGl2LnN1bW1hcnktbGlzdCB0ci5zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkZWVwc2t5Ymx1ZSAhaW1wb3J0YW50Owp9CgouZGFyayBkaXYuc3VtbWFyeS1saXN0IHRyLnNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMDQ4NjA7Cn0KCi8qIGhpZ2hsaWdodGluZyAqLwpkaXYuc3VtbWFyeS1saXN0IHRyIHsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgNTAwbXM7Cn0KLmxpZ2h0IGRpdi5zdW1tYXJ5LWxpc3QgdHIuZGF0YS1jaGFuZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZERkZEQzsKfQouZGFyayBkaXYuc3VtbWFyeS1saXN0IHRyLmRhdGEtY2hhbmdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM1QTU2MDA7Cn0KCmRpdi5zdW1tYXJ5LWxpc3QgdGQgewogICAgcGFkZGluZzogNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoKZGl2LnN1bW1hcnktbGlzdCAudGFibGUtaGVhZGVyIHRkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQpkaXYuc3VtbWFyeS1saXN0IC50YWJsZS1oZWFkZXIgdGQ6Zmlyc3QtY2hpbGQgewogICAgYm9yZGVyLXJhZGl1czogOHB4IDAgMCAwOwp9CmRpdi5zdW1tYXJ5LWxpc3QgLnRhYmxlLWhlYWRlciB0ZDpsYXN0LWNoaWxkIHsKICAgIGJvcmRlci1yYWRpdXM6IDAgOHB4IDAgMDsKfQoKLmxpZ2h0IGRpdi5zdW1tYXJ5LWxpc3QgLnRhYmxlLWhlYWRlciB0ZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiOwp9Ci5kYXJrIGRpdi5zdW1tYXJ5LWxpc3QgLnRhYmxlLWhlYWRlciB0ZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyOwogICAgY29sb3I6ICNjY2M7Cn0KCi8qIHJvd3MgYXJlIHNlbGVjdGFibGUgKi8KZGl2LnN1bW1hcnktbGlzdCAudGFibGUtYm9keSB0ZCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5kYXJrIGRpdi5zdW1tYXJ5LWxpc3QgdGQgewogICAgY29sb3I6ICNjY2M7Cn0KCi8qIFRhYnVsYXIgdmlldyB1cHBlciByaWdodCBjb250cm9sIGJ1dHRvbnMgKi8KCmRpdi5jdHJsLWJ0bnMgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgaGVpZ2h0OiA0NHB4OwogICAgbWFyZ2luLXJpZ2h0OiAyNHB4OwogICAgbWFyZ2luLXRvcDogN3B4Owp9CgoKZGl2LmN0cmwtYnRucyBkaXYgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgpkaXYuY3RybC1idG5zIGRpdi5zZXBhcmF0b3IgIHsKICAgIGN1cnNvcjogYXV0bzsKICAgIHdpZHRoOiAyNHB4OwogICAgYm9yZGVyOiBub25lOwp9CgovKiBJbmFjdGl2ZSAqLwoubGlnaHQgLmN0cmwtYnRucyBkaXYgZy5pY29uIHJlY3QsCi5saWdodCAuY3RybC1idG5zIGRpdjpob3ZlciBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjZWVlOwp9Ci5kYXJrIC5jdHJsLWJ0bnMgZGl2IGcuaWNvbiByZWN0LAouZGFyayAuY3RybC1idG5zIGRpdjpob3ZlciBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjMjIyOwp9CgoubGlnaHQgLmN0cmwtYnRucyBkaXYgZy5pY29uIHVzZSB7CiAgICBmaWxsOiAjZGRkOwp9Ci5kYXJrIC5jdHJsLWJ0bnMgZGl2IGcuaWNvbiB1c2UgewogICAgZmlsbDogIzMzMzsKfQoKLyogQWN0aXZlIGhvdmVyICovCi5saWdodCAuY3RybC1idG5zIGRpdi5hY3RpdmU6aG92ZXIgZy5pY29uIHJlY3QgewogICAgZmlsbDogIzgwMDsKfQoKLmRhcmsgLmN0cmwtYnRucyBkaXYuYWN0aXZlOmhvdmVyIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICNDRTU2NTA7Cn0KCi8qIEFjdGl2ZSAqLwoubGlnaHQgLmN0cmwtYnRucyBkaXYuYWN0aXZlIGcuaWNvbiB1c2UgewogICAgZmlsbDogI2ZmZjsKfQouZGFyayAuY3RybC1idG5zIGRpdi5hY3RpdmUgZy5pY29uIHVzZSB7CiAgICBmaWxsOiAjZWVlOwp9CgoubGlnaHQgLmN0cmwtYnRucyBkaXYuYWN0aXZlIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICNiYmI7Cn0KLmRhcmsgLmN0cmwtYnRucyBkaXYuYWN0aXZlIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICM0NDQ7Cn0KCi8qIFJlZnJlc2ggYnV0dG9uIHNwZWNpZmljICovCi5saWdodCAuY3RybC1idG5zIGRpdi5yZWZyZXNoLmFjdGl2ZSBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjOTY0OTQ5Owp9CgouZGFyayAuY3RybC1idG5zIGRpdi5yZWZyZXNoLmFjdGl2ZSBnLmljb24gcmVjdCB7CiAgICBmaWxsOiAjOUI0NjQxOwp9Ci5saWdodCAuY3RybC1idG5zIGRpdi5yZWZyZXNoOmhvdmVyIGcuaWNvbiByZWN0IHsKICAgIGZpbGw6ICM5NjQ5NDk7Cn0KCi5kYXJrIC5jdHJsLWJ0bnMgZGl2LnJlZnJlc2g6aG92ZXIgZy5pY29uIHJlY3QgewogICAgZmlsbDogIzlCNDY0MTsKfQoNCozc71YJXwYAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTBzUAAQAbpD8CoBzbAqAdglS0f9U/ZvzSmk3HqgBAFpP58AAABAQgKAKNfDQBNpgmM3O9Wj18GAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5jZhAAEAGHUDAqAdgwKgHNh/1lS2mk3HqT9m/NIAYAWSQEgAAAQEICgBNpgkAo18NMA0KDQqM3O9WKWEGAJACAACQAgAACAAnrR4TaPcoH9LFCABFAAKCwc5AAEAG5sDAqAc2wKgHYJUtH/VP2b80ppNx74AYBaS2iwAAAQEICgCjXw0ATaYJR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb1BhbmVsLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9Wtm0GAHY8AAB2PAAAaPcoH9LFCAAnrR4TCABFADxojZlAAEAG4Q/AqAdgwKgHNh/1lS2mk3HvT9nBgoAYAW7MQQAAAQEICgBNpgkAo18NSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDE1MzA2DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFBhbmVsIE1vZHVsZS4KIERlZmluZXMgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIHN1bW1hcnksIGRldGFpbCwgYW5kIGluc3RhbmNlIHBhbmVscy4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCAkd2luZG93LCAkcm9vdFNjb3BlLCBmcywgcHMsIGdzLCBmbGFzaCwgd3NzLCBibnMsIG1hc3QsIG5zOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHBDbHMgPSAndG9wby1wJywKICAgICAgICBpZFN1bSA9ICd0b3BvLXAtc3VtbWFyeScsCiAgICAgICAgaWREZXQgPSAndG9wby1wLWRldGFpbCcsCiAgICAgICAgcGFuZWxPcHRzID0gewogICAgICAgICAgICB3aWR0aDogMjY4CiAgICAgICAgfSwKICAgICAgICBzdW1NYXggPSAyNjIsCiAgICAgICAgcGFkVG9wID0gMjAsCiAgICAgICAgZGV2UGF0aCA9ICdkZXZpY2UnOwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgdXNlRGV0YWlscyA9IHRydWUsICAgICAgLy8gc2hvdWxkIHdlIHNob3cgZGV0YWlscyBpZiB3ZSBoYXZlICdlbT8KICAgICAgICBoYXZlRGV0YWlscyA9IGZhbHNlLCAgICAvLyBkbyB3ZSBoYXZlIGRldGFpbHMgdGhhdCB3ZSBjb3VsZCBzaG93PwogICAgICAgIHN1bUZyb21Ub3AsICAgICAgICAgICAgIC8vIHN1bW1hcnkgcGFuZWwgZGlzdGFuY2UgZnJvbSB0b3Agb2Ygc2NyZWVuCiAgICAgICAgdW5iaW5kV2F0Y2g7CgogICAgLy8gcGFuZWxzCiAgICB2YXIgc3VtbWFyeSwgZGV0YWlsOwoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUGFuZWwgQVBJCiAgICBmdW5jdGlvbiBjcmVhdGVUb3BvUGFuZWwoaWQsIG9wdHMpIHsKICAgICAgICB2YXIgcCA9IHBzLmNyZWF0ZVBhbmVsKGlkLCBvcHRzKSwKICAgICAgICAgICAgcGlkID0gaWQsCiAgICAgICAgICAgIGhlYWRlciwgYm9keSwgZm9vdGVyOwogICAgICAgIHAuY2xhc3NlZChwQ2xzLCB0cnVlKTsKCiAgICAgICAgZnVuY3Rpb24gcGFuZWwoKSB7CiAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaEFwcGVuZCh4KSB7CiAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYXBwZW5kKHgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYkFwcGVuZCh4KSB7CiAgICAgICAgICAgIHJldHVybiBib2R5LmFwcGVuZCh4KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGZBcHBlbmQoeCkgewogICAgICAgICAgICByZXR1cm4gZm9vdGVyLmFwcGVuZCh4KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNldHVwKCkgewogICAgICAgICAgICBwLmVtcHR5KCk7CgogICAgICAgICAgICBwLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgnaGVhZGVyJywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib2R5JywgdHJ1ZSk7CiAgICAgICAgICAgIHAuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdmb290ZXInLCB0cnVlKTsKCiAgICAgICAgICAgIGhlYWRlciA9IHAuZWwoKS5zZWxlY3QoJy5oZWFkZXInKTsKICAgICAgICAgICAgYm9keSA9IHAuZWwoKS5zZWxlY3QoJy5ib2R5Jyk7CiAgICAgICAgICAgIGZvb3RlciA9IHAuZWwoKS5zZWxlY3QoJy5mb290ZXInKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHBzLmRlc3Ryb3lQYW5lbChwaWQpOwogICAgICAgIH0KCiAgICAgICAgLy8gZnJvbVRvcCBpcyBob3cgbWFueSBwaXhlbHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBwYWdlIHRoZSBwYW5lbCBpcwogICAgICAgIC8vIG1heCBpcyB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcGFuZWwgaW4gcGl4ZWxzCiAgICAgICAgLy8gICAgb25seSBhZGp1c3RzIGlmIHRoZSBib2R5IGNvbnRlbnQgd291bGQgYmUgMTBweCBvciBsYXJnZXIKICAgICAgICBmdW5jdGlvbiBhZGp1c3RIZWlnaHQoZnJvbVRvcCwgbWF4KSB7CiAgICAgICAgICAgIHZhciB0b3RhbFBIZWlnaHQsIGF2U3BhY2UsCiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IDAsCiAgICAgICAgICAgICAgICBwZGcgPSAzMDsKCiAgICAgICAgICAgIGlmICghZnJvbVRvcCkgewogICAgICAgICAgICAgICAgJGxvZy53YXJuKCdhZGp1c3RIZWlnaHQ6IGhlaWdodCBmcm9tIHRvcCBvZiBwYWdlIG5vdCBnaXZlbicpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJvZHkgfHwgIXApIHsKICAgICAgICAgICAgICAgIC8vIHBhbmVsIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtYXkgaGFwcGVuIHdoZW4gd2luZG93IGlzIHJlc2l6aW5nIGJ1dCBwYW5lbCBoYXMKICAgICAgICAgICAgICAgIC8vICAgYmVlbiBjbGVhcmVkIG9yIHJlbW92ZWQKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwLmVsKCkuc3R5bGUoJ2hlaWdodCcsIG51bGwpOwogICAgICAgICAgICBib2R5LnN0eWxlKCdoZWlnaHQnLCBudWxsKTsKCiAgICAgICAgICAgIHRvdGFsUEhlaWdodCA9IGZyb21Ub3AgKyBwLmhlaWdodCgpOwogICAgICAgICAgICBhdlNwYWNlID0gZnMud2luZG93U2l6ZShwZGcpLmhlaWdodDsKCiAgICAgICAgICAgIGlmICh0b3RhbFBIZWlnaHQgPj0gYXZTcGFjZSkgewogICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0b3RhbFBIZWlnaHQgLSBhdlNwYWNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBfYWRqdXN0Qm9keShoZWlnaHQpIHsKICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPCAxMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYm9keS5zdHlsZSgnaGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFfYWRqdXN0Qm9keShmcy5ub1B4U3R5bGUoYm9keSwgJ2hlaWdodCcpIC0gb3ZlcmZsb3cpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtYXggJiYgcC5oZWlnaHQoKSA+IG1heCkgewogICAgICAgICAgICAgICAgX2FkanVzdEJvZHkoZnMubm9QeFN0eWxlKGJvZHksICdoZWlnaHQnKSAtIChwLmhlaWdodCgpIC0gbWF4KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHBhbmVsOiBwYW5lbCwKICAgICAgICAgICAgc2V0dXA6IHNldHVwLAogICAgICAgICAgICBkZXN0cm95OiBkZXN0cm95LAogICAgICAgICAgICBhcHBlbmRIZWFkZXI6IGhBcHBlbmQsCiAgICAgICAgICAgIGFwcGVuZEJvZHk6IGJBcHBlbmQsCiAgICAgICAgICAgIGFwcGVuZEZvb3RlcjogZkFwcGVuZCwKICAgICAgICAgICAgYWRqdXN0SGVpZ2h0OiBhZGp1c3RIZWlnaHQKICAgICAgICB9OwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKCiAgICBmdW5jdGlvbiBhZGRTZXAodGJvZHkpIHsKICAgICAgICB0Ym9keS5hcHBlbmQoJ3RyJykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NvbHNwYW4nLCAyKS5hcHBlbmQoJ2hyJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQnRuRm9vdGVyKCkgewogICAgICAgIGRldGFpbC5hcHBlbmRGb290ZXIoJ2hyJyk7CiAgICAgICAgZGV0YWlsLmFwcGVuZEZvb3RlcignZGl2JykuY2xhc3NlZCgnYWN0aW9uQnRucycsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFByb3AodGJvZHksIGxhYmVsLCB2YWx1ZSkgewogICAgICAgIHZhciB0ciA9IHRib2R5LmFwcGVuZCgndHInKSwKICAgICAgICAgICAgbGFiOwogICAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxhYiA9IGxhYmVsLnJlcGxhY2UoL18vZywgJyAnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsYWIgPSBsYWJlbDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZENlbGwoY2xzLCB0eHQpIHsKICAgICAgICAgICAgdHIuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgY2xzKS5odG1sKHR4dCk7CiAgICAgICAgfQogICAgICAgIGFkZENlbGwoJ2xhYmVsJywgbGFiICsgJyA6Jyk7CiAgICAgICAgYWRkQ2VsbCgndmFsdWUnLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlzdFByb3BzKHRib2R5LCBkYXRhKSB7CiAgICAgICAgZGF0YS5wcm9wT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgICAgICBpZiAocCA9PT0gJy0nKSB7CiAgICAgICAgICAgICAgICBhZGRTZXAodGJvZHkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRkUHJvcCh0Ym9keSwgcCwgZGF0YS5wcm9wc1twXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB3YXRjaFdpbmRvdygpIHsKICAgICAgICB1bmJpbmRXYXRjaCA9ICRyb290U2NvcGUuJHdhdGNoQ29sbGVjdGlvbigKICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBoOiAkd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHc6ICR3aW5kb3cuaW5uZXJXaWR0aAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc3VtbWFyeS5hZGp1c3RIZWlnaHQoc3VtRnJvbVRvcCwgc3VtTWF4KTsKICAgICAgICAgICAgICAgIGRldGFpbC5hZGp1c3RIZWlnaHQoZGV0YWlsLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEZ1bmN0aW9ucyBmb3IgcG9wdWxhdGluZyB0aGUgc3VtbWFyeSBwYW5lbAoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlU3VtbWFyeShkYXRhKSB7CiAgICAgICAgc3VtbWFyeS5zZXR1cCgpOwoKICAgICAgICB2YXIgc3ZnID0gc3VtbWFyeS5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbicsIHRydWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKSwKICAgICAgICAgICAgdGl0bGUgPSBzdW1tYXJ5LmFwcGVuZEhlYWRlcignaDInKSwKICAgICAgICAgICAgdGFibGUgPSBzdW1tYXJ5LmFwcGVuZEJvZHkoJ3RhYmxlJyksCiAgICAgICAgICAgIHRib2R5ID0gdGFibGUuYXBwZW5kKCd0Ym9keScpLAogICAgICAgICAgICBnbHlwaElkID0gZGF0YS50eXBlIHx8ICdub2RlJzsKCiAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCBnbHlwaElkLCA0MCk7CgogICAgICAgIGlmIChnbHlwaElkID09PSAnbm9kZScpIHsKICAgICAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCAnYmlyZCcsIDI0LCB0cnVlLCBbOCwxMl0pOwogICAgICAgIH0KCiAgICAgICAgdGl0bGUudGV4dChkYXRhLnRpdGxlKTsKICAgICAgICBsaXN0UHJvcHModGJvZHksIGRhdGEpOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEZ1bmN0aW9ucyBmb3IgcG9wdWxhdGluZyB0aGUgZGV0YWlsIHBhbmVsCgogICAgdmFyIGlzRGV2aWNlID0gewogICAgICAgIHN3aXRjaDogMSwKICAgICAgICByb2FkbTogMSwKICAgICAgICBvdG46MQogICAgfTsKCiAgICBmdW5jdGlvbiBkaXNwbGF5U2luZ2xlKGRhdGEpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHN2ZyA9IGRldGFpbC5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbiBjbGlja2FibGUnLCB0cnVlKQogICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJyksCiAgICAgICAgICAgIHRpdGxlID0gZGV0YWlsLmFwcGVuZEhlYWRlcignaDInKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2NsaWNrYWJsZScsIHRydWUpLAogICAgICAgICAgICB0YWJsZSA9IGRldGFpbC5hcHBlbmRCb2R5KCd0YWJsZScpLAogICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgbmF2Rm47CgogICAgICAgIGdzLmFkZEdseXBoKHN2ZywgKGRhdGEudHlwZSB8fCAndW5rbm93bicpLCA0MCk7CiAgICAgICAgdGl0bGUudGV4dChkYXRhLnRpdGxlKTsKCiAgICAgICAgLy8gb25seSBhZGQgbmF2aWdhdGlvbiB3aGVuIGRpc3BsYXlpbmcgYSBkZXZpY2UKICAgICAgICBpZiAoaXNEZXZpY2VbZGF0YS50eXBlXSkgewogICAgICAgICAgICBuYXZGbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIG5zLm5hdlRvKGRldlBhdGgsIHsgZGV2SWQ6IGRhdGEuaWQgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdmcub24oJ2NsaWNrJywgbmF2Rm4pOwogICAgICAgICAgICB0aXRsZS5vbignY2xpY2snLCBuYXZGbik7CiAgICAgICAgfQoKICAgICAgICBsaXN0UHJvcHModGJvZHksIGRhdGEpOwogICAgICAgIGFkZEJ0bkZvb3RlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BsYXlNdWx0aShpZHMpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHRpdGxlID0gZGV0YWlsLmFwcGVuZEhlYWRlcignaDMnKSwKICAgICAgICAgICAgdGFibGUgPSBkZXRhaWwuYXBwZW5kQm9keSgndGFibGUnKSwKICAgICAgICAgICAgdGJvZHkgPSB0YWJsZS5hcHBlbmQoJ3Rib2R5Jyk7CgogICAgICAgIHRpdGxlLnRleHQoJ1NlbGVjdGVkIE5vZGVzJyk7CiAgICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgYWRkUHJvcCh0Ym9keSwgaSsxLCBkKTsKICAgICAgICB9KTsKICAgICAgICBhZGRCdG5Gb290ZXIoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRBY3Rpb24obykgewogICAgICAgIHZhciBidG5EaXYgPSBkMy5zZWxlY3QoJyMnICsgaWREZXQpCiAgICAgICAgICAgIC5zZWxlY3QoJy5hY3Rpb25CdG5zJykKICAgICAgICAgICAgLmFwcGVuZCgnZGl2JykKICAgICAgICAgICAgLmNsYXNzZWQoJ2FjdGlvbkJ0bicsIHRydWUpOwogICAgICAgIGJucy5idXR0b24oYnRuRGl2LCBpZERldCArICctJyArIG8uaWQsIG8uZ2lkLCBvLmNiLCBvLnR0KTsKICAgIH0KCiAgICB2YXIgZnJpZW5kbHlJbmRleCA9IHsKICAgICAgICBkZXZpY2U6IDEsCiAgICAgICAgaG9zdDogMAogICAgfTsKCiAgICBmdW5jdGlvbiBmcmllbmRseShkKSB7CiAgICAgICAgdmFyIGkgPSBmcmllbmRseUluZGV4W2QuY2xhc3NdIHx8IDA7CiAgICAgICAgcmV0dXJuIChkLmxhYmVscyAmJiBkLmxhYmVsc1tpXSkgfHwgJyc7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua1N1bW1hcnkoZCkgewogICAgICAgIHZhciBvID0gZCAmJiBkLm9ubGluZSA/ICdvbmxpbmUnIDogJ29mZmxpbmUnOwogICAgICAgIHJldHVybiBkID8gZC50eXBlICsgJyAvICcgKyBvIDogJy0nOwogICAgfQoKICAgIC8vIHByb3ZpZGVkIHRvIGNoYW5nZSBwcmVzZW50YXRpb24gb2YgaW50ZXJuYWwgdHlwZSBuYW1lCiAgICB2YXIgbGlua1R5cGVQcmVzID0gewogICAgICAgIGhvc3RMaW5rOiAnZWRnZSBsaW5rJwogICAgfTsKCiAgICBmdW5jdGlvbiBsaW5rVHlwZShkKSB7CiAgICAgICAgcmV0dXJuIGxpbmtUeXBlUHJlc1tkLnR5cGUoKV0gfHwgZC50eXBlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua0V4cGVjdGVkKGQpIHsKICAgICAgICByZXR1cm4gZC5leHBlY3RlZCgpOwogICAgfQoKICAgIHZhciBjb3JlT3JkZXIgPSBbCiAgICAgICAgICAgICdUeXBlJywgJ0V4cGVjdGVkJywgJy0nLAogICAgICAgICAgICAnQV90eXBlJywgJ0FfaWQnLCAnQV9sYWJlbCcsICdBX3BvcnQnLCAnLScsCiAgICAgICAgICAgICdCX3R5cGUnLCAnQl9pZCcsICdCX2xhYmVsJywgJ0JfcG9ydCcsICctJwogICAgICAgIF0sCiAgICAgICAgZWRnZU9yZGVyID0gWwogICAgICAgICAgICAnVHlwZScsICctJywKICAgICAgICAgICAgJ0FfdHlwZScsICdBX2lkJywgJ0FfbGFiZWwnLCAnLScsCiAgICAgICAgICAgICdCX3R5cGUnLCAnQl9pZCcsICdCX2xhYmVsJywgJ0JfcG9ydCcKICAgICAgICBdOwoKICAgIGZ1bmN0aW9uIGRpc3BsYXlMaW5rKGRhdGEpIHsKICAgICAgICBkZXRhaWwuc2V0dXAoKTsKCiAgICAgICAgdmFyIHN2ZyA9IGRldGFpbC5hcHBlbmRIZWFkZXIoJ2RpdicpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnaWNvbicsIHRydWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKSwKICAgICAgICAgICAgdGl0bGUgPSBkZXRhaWwuYXBwZW5kSGVhZGVyKCdoMicpLAogICAgICAgICAgICB0YWJsZSA9IGRldGFpbC5hcHBlbmRCb2R5KCd0YWJsZScpLAogICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgZWRnZUxpbmsgPSBkYXRhLnR5cGUoKSA9PT0gJ2hvc3RMaW5rJywKICAgICAgICAgICAgb3JkZXIgPSBlZGdlTGluayA/IGVkZ2VPcmRlciA6IGNvcmVPcmRlcjsKCiAgICAgICAgZ3MuYWRkR2x5cGgoc3ZnLCAncG9ydHMnLCA0MCk7CiAgICAgICAgdGl0bGUudGV4dCgnTGluaycpOwoKCiAgICAgICAgbGlzdFByb3BzKHRib2R5LCB7CiAgICAgICAgICAgIHByb3BPcmRlcjogb3JkZXIsCiAgICAgICAgICAgIHByb3BzOiB7CiAgICAgICAgICAgICAgICBUeXBlOiBsaW5rVHlwZShkYXRhKSwKICAgICAgICAgICAgICAgIEV4cGVjdGVkOiBsaW5rRXhwZWN0ZWQoZGF0YSksCgogICAgICAgICAgICAgICAgQV90eXBlOiBkYXRhLnNvdXJjZS5jbGFzcywKICAgICAgICAgICAgICAgIEFfaWQ6IGRhdGEuc291cmNlLmlkLAogICAgICAgICAgICAgICAgQV9sYWJlbDogZnJpZW5kbHkoZGF0YS5zb3VyY2UpLAogICAgICAgICAgICAgICAgQV9wb3J0OiBkYXRhLnNyY1BvcnQsCgogICAgICAgICAgICAgICAgQl90eXBlOiBkYXRhLnRhcmdldC5jbGFzcywKICAgICAgICAgICAgICAgIEJfaWQ6IGRhdGEudGFyZ2V0LmlkLAogICAgICAgICAgICAgICAgQl9sYWJlbDogZnJpZW5kbHkoZGF0YS50YXJnZXQpLAogICAgICAgICAgICAgICAgQl9wb3J0OiBkYXRhLnRndFBvcnQKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAoIWVkZ2VMaW5rKSB7CiAgICAgICAgICAgIGFkZFByb3AodGJvZHksICdBICZyYXJyOyBCJywgbGlua1N1bW1hcnkoZGF0YS5mcm9tU291cmNlKSk7CiAgICAgICAgICAgIGFkZFByb3AodGJvZHksICdCICZyYXJyOyBBJywgbGlua1N1bW1hcnkoZGF0YS5mcm9tVGFyZ2V0KSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BsYXlOb3RoaW5nKCkgewogICAgICAgIGhhdmVEZXRhaWxzID0gZmFsc2U7CiAgICAgICAgaGlkZURldGFpbFBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGxheVNvbWV0aGluZygpIHsKICAgICAgICBoYXZlRGV0YWlscyA9IHRydWU7CiAgICAgICAgaWYgKHVzZURldGFpbHMpIHsKICAgICAgICAgICAgc2hvd0RldGFpbFBhbmVsKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEV2ZW50IEhhbmRsZXJzCgogICAgZnVuY3Rpb24gc2hvd1N1bW1hcnkoZGF0YSkgewogICAgICAgIHBvcHVsYXRlU3VtbWFyeShkYXRhKTsKICAgICAgICBzaG93U3VtbWFyeVBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlU3VtbWFyeSh4KSB7CiAgICAgICAgdmFyIGtldiA9ICh4ID09PSAna2V5ZXYnKSwKICAgICAgICAgICAgb24gPSBrZXYgPyAhc3VtbWFyeS5wYW5lbCgpLmlzVmlzaWJsZSgpIDogISF4LAogICAgICAgICAgICB2ZXJiID0gb24gPyAnU2hvdycgOiAnSGlkZSc7CgogICAgICAgIGlmIChvbikgewogICAgICAgICAgICAvLyBhc2sgc2VydmVyIHRvIHN0YXJ0IHNlbmRpbmcgc3VtbWFyeSBkYXRhLgogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0U3VtbWFyeScpOwogICAgICAgICAgICAvLyBub3RlOiB0aGUgc3VtbWFyeSBwYW5lbCB3aWxsIGFwcGVhciwgb25jZSBkYXRhIGFycml2ZXMKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaWRlU3VtbWFyeVBhbmVsKCk7CiAgICAgICAgfQogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIHN1bW1hcnkgcGFuZWwnKTsKICAgICAgICByZXR1cm4gb247CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA9PT0gTE9HSUMgRm9yIHNob3dpbmcvaGlkaW5nIHN1bW1hcnkgYW5kIGRldGFpbCBwYW5lbHMuLi4KCiAgICBmdW5jdGlvbiBzaG93U3VtbWFyeVBhbmVsKCkgewogICAgICAgIGZ1bmN0aW9uIF9zaG93KCkgewogICAgICAgICAgICBzdW1tYXJ5LnBhbmVsKCkuc2hvdygpOwogICAgICAgICAgICBzdW1tYXJ5LmFkanVzdEhlaWdodChzdW1Gcm9tVG9wLCBzdW1NYXgpOwogICAgICAgIH0KICAgICAgICBpZiAoZGV0YWlsLnBhbmVsKCkuaXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgZGV0YWlsLmRvd24oX3Nob3cpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9zaG93KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVTdW1tYXJ5UGFuZWwoKSB7CiAgICAgICAgLy8gaW5zdHJ1Y3Qgc2VydmVyIHRvIHN0b3Agc2VuZGluZyBzdW1tYXJ5IGRhdGEKICAgICAgICB3c3Muc2VuZEV2ZW50KCJjYW5jZWxTdW1tYXJ5Iik7CiAgICAgICAgc3VtbWFyeS5wYW5lbCgpLmhpZGUoZGV0YWlsLnVwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93RGV0YWlsUGFuZWwoKSB7CiAgICAgICAgaWYgKHN1bW1hcnkucGFuZWwoKS5pc1Zpc2libGUoKSkgewogICAgICAgICAgICBkZXRhaWwuZG93bihkZXRhaWwucGFuZWwoKS5zaG93KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXRhaWwudXAoZGV0YWlsLnBhbmVsKCkuc2hvdyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVEZXRhaWxQYW5lbCgpIHsKICAgICAgICBkZXRhaWwucGFuZWwoKS5oaWRlKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBhdWdtZW50RGV0YWlsUGFuZWwoKSB7CiAgICAgICAgdmFyIGQgPSBkZXRhaWwsCiAgICAgICAgICAgIGRvd25Qb3MgPSBzdW1Gcm9tVG9wICsgc3VtTWF4ICsgMjA7CiAgICAgICAgZC55cG9zID0geyB1cDogc3VtRnJvbVRvcCwgZG93bjogZG93blBvcywgY3VycmVudDogZG93blBvc307CgogICAgICAgIGQuX21vdmUgPSBmdW5jdGlvbiAoeSwgY2IpIHsKICAgICAgICAgICAgdmFyIHlwID0gZC55cG9zLAogICAgICAgICAgICAgICAgZW5kQ2I7CgogICAgICAgICAgICBpZiAoZnMuaXNGKGNiKSkgewogICAgICAgICAgICAgICAgZW5kQ2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICBkLmFkanVzdEhlaWdodChkLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbmRDYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkLmFkanVzdEhlaWdodChkLnlwb3MuY3VycmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHlwLmN1cnJlbnQgIT09IHkpIHsKICAgICAgICAgICAgICAgIHlwLmN1cnJlbnQgPSB5OwogICAgICAgICAgICAgICAgZC5wYW5lbCgpLmVsKCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDMwMCkKICAgICAgICAgICAgICAgICAgICAuZWFjaCgnZW5kJywgZW5kQ2IpCiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCB5cC5jdXJyZW50ICsgJ3B4Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbmRDYigpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZC5kb3duID0gZnVuY3Rpb24gKGNiKSB7IGQuX21vdmUoZC55cG9zLmRvd24sIGNiKTsgfTsKICAgICAgICBkLnVwID0gZnVuY3Rpb24gKGNiKSB7IGQuX21vdmUoZC55cG9zLnVwLCBjYik7IH07CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlVXNlRGV0YWlsc0ZsYWcoeCkgewogICAgICAgIHZhciBrZXYgPSAoeCA9PT0gJ2tleWV2JyksCiAgICAgICAgICAgIHZlcmI7CgogICAgICAgIHVzZURldGFpbHMgPSBrZXYgPyAhdXNlRGV0YWlscyA6ICEheDsKICAgICAgICB2ZXJiID0gdXNlRGV0YWlscyA/ICdFbmFibGUnIDogJ0Rpc2FibGUnOwoKICAgICAgICBpZiAodXNlRGV0YWlscykgewogICAgICAgICAgICBpZiAoaGF2ZURldGFpbHMpIHsKICAgICAgICAgICAgICAgIHNob3dEZXRhaWxQYW5lbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGlkZURldGFpbFBhbmVsKCk7CiAgICAgICAgfQogICAgICAgIGZsYXNoLmZsYXNoKHZlcmIgKyAnIGRldGFpbHMgcGFuZWwnKTsKICAgICAgICByZXR1cm4gdXNlRGV0YWlsczsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIGluaXRQYW5lbHMoKSB7CiAgICAgICAgc3VtRnJvbVRvcCA9IG1hc3QubWFzdEhlaWdodCgpICsgcGFkVG9wOwogICAgICAgIHN1bW1hcnkgPSBjcmVhdGVUb3BvUGFuZWwoaWRTdW0sIHBhbmVsT3B0cyk7CiAgICAgICAgZGV0YWlsID0gY3JlYXRlVG9wb1BhbmVsKGlkRGV0LCBwYW5lbE9wdHMpOwoKICAgICAgICBhdWdtZW50RGV0YWlsUGFuZWwoKTsKICAgICAgICB3YXRjaFdpbmRvdygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlc3Ryb3lQYW5lbHMoKSB7CiAgICAgICAgc3VtbWFyeS5kZXN0cm95KCk7CiAgICAgICAgc3VtbWFyeSA9IG51bGw7CgogICAgICAgIGRldGFpbC5kZXN0cm95KCk7CiAgICAgICAgZGV0YWlsID0gbnVsbDsKICAgICAgICBoYXZlRGV0YWlscyA9IGZhbHNlOwogICAgICAgIHVuYmluZFdhdGNoKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvUGFuZWxTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHdpbmRvdycsICckcm9vdFNjb3BlJywgJ0ZuU2VydmljZScsICdQYW5lbFNlcnZpY2UnLCAnR2x5cGhTZXJ2aWNlJywKICAgICAgICAgICAgJ0ZsYXNoU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywgJ0J1dHRvblNlcnZpY2UnLCAnTWFzdFNlcnZpY2UnLAogICAgICAgICAgICAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kd2luZG93XywgXyRyb290U2NvcGVfLAogICAgICAgICAgICAgICAgICBfZnNfLCBfcHNfLCBfZ3NfLCBfZmxhc2hfLCBfd3NzXywgX2Juc18sIF9tYXN0XywgX25zXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkd2luZG93ID0gXyR3aW5kb3dfOwogICAgICAgICAgICAkcm9vdFNjb3BlID0gXyRyb290U2NvcGVfOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHBzID0gX3BzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICBibnMgPSBfYm5zXzsKICAgICAgICAgICAgbWFzdCA9IF9tYXN0XzsKICAgICAgICAgICAgbnMgPSBfbnNfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXRQYW5lbHM6IGluaXRQYW5lbHMsCiAgICAgICAgICAgICAgICBkZXN0cm95UGFuZWxzOiBkZXN0cm95UGFuZWxzLAogICAgICAgICAgICAgICAgY3JlYXRlVG9wb1BhbmVsOiBjcmVhdGVUb3BvUGFuZWwsCgogICAgICAgICAgICAgICAgc2hvd1N1bW1hcnk6IHNob3dTdW1tYXJ5LAogICAgICAgICAgICAgICAgdG9nZ2xlU3VtbWFyeTogdG9nZ2xlU3VtbWFyeSwKCiAgICAgICAgICAgICAgICB0b2dnbGVVc2VEZXRhaWxzRmxhZzogdG9nZ2xlVXNlRGV0YWlsc0ZsYWcsCiAgICAgICAgICAgICAgICBkaXNwbGF5U2luZ2xlOiBkaXNwbGF5U2luZ2xlLAogICAgICAgICAgICAgICAgZGlzcGxheU11bHRpOiBkaXNwbGF5TXVsdGksCiAgICAgICAgICAgICAgICBkaXNwbGF5TGluazogZGlzcGxheUxpbmssCiAgICAgICAgICAgICAgICBkaXNwbGF5Tm90aGluZzogZGlzcGxheU5vdGhpbmcsCiAgICAgICAgICAgICAgICBkaXNwbGF5U29tZXRoaW5nOiBkaXNwbGF5U29tZXRoaW5nLAogICAgICAgICAgICAgICAgYWRkQWN0aW9uOiBhZGRBY3Rpb24sCgogICAgICAgICAgICAgICAgaGlkZVN1bW1hcnlQYW5lbDogaGlkZVN1bW1hcnlQYW5lbCwKCiAgICAgICAgICAgICAgICBkZXRhaWxWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZXRhaWwucGFuZWwoKS5pc1Zpc2libGUoKTsgfSwKICAgICAgICAgICAgICAgIHN1bW1hcnlWaXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdW1tYXJ5LnBhbmVsKCkuaXNWaXNpYmxlKCk7IH0KICAgICAgICAgICAgfTsKICAgICAgICB9XSk7Cn0oKSk7Cozc71bsbQYAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTBz0AAQAbpDcCoBzbAqAdglS0f9U/ZwYKmk64jgBAFbsAqAAABAQgKAKNfDgBNpgmM3O9Wd3AGAJECAACRAgAACAAnrR4TaPcoH9LFCABFAAKDwdBAAEAG5r3AqAc2wKgHYJUtH/VP2cGCppOuI4AYBaTMQgAAAQEICgCjXw4ATaYJR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb1NlbGVjdC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVjZ0BgChNwAAoTcAAGj3KB/SxQgAJ60eEwgARQA3kzfEQABABju6wKgHYMCoBzYf9ZUnOVYyKduSkryAGAFZx2wAAAEBCAoATaYKAKNfDEhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNDA2OQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBNb2RlbCBNb2R1bGUuCiBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciB0aGUgbW9kZWwgb2YgdGhlIHRvcG9sb2d5OyB0aGF0IGlzLCBvdXIgaW50ZXJuYWwKICByZXByZXNlbnRhdGlvbnMgb2YgZGV2aWNlcywgaG9zdHMsIGxpbmtzLCBldGMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHJuZDsKCiAgICAvLyBhcGkgdG8gdG9wb0ZvcmNlCiAgICB2YXIgYXBpOwogICAgLyoKICAgICAgIHByb2plY3Rpb24oKQogICAgICAgbmV0d29yayB7Li4ufQogICAgICAgcmVzdHlsZUxpbmtFbGVtZW50KCBsZGF0YSApCiAgICAgICByZW1vdmVMaW5rRWxlbWVudCggbGRhdGEgKQogICAgICovCgogICAgLy8gc2hvcnRoYW5kCiAgICB2YXIgbHUsIHJsaywgbm9kZXMsIGxpbmtzLCBsaW5rc0J5RGV2aWNlOwoKICAgIHZhciBkaW07ICAgIC8vIGRpbWVuc2lvbnMgb2YgbGF5b3V0IFt3LGhdCgogICAgLy8gY29uZmlndXJhdGlvbiAnY29uc3RhbnRzJwogICAgdmFyIGRlZmF1bHRMaW5rVHlwZSA9ICdkaXJlY3QnLAogICAgICAgIG5lYXJEaXN0ID0gMTU7CgoKICAgIGZ1bmN0aW9uIGNvb3JkRnJvbUxuZ0xhdChsb2MpIHsKICAgICAgICB2YXIgcCA9IGFwaS5wcm9qZWN0aW9uKCk7CiAgICAgICAgLy8gc3VzcGVjdGVkIGNhdXNlIG9mIE9OT1MtMjEwOQogICAgICAgIHJldHVybiBwID8gcChbbG9jLmxuZywgbG9jLmxhdF0pIDogWzAsIDBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGxuZ0xhdEZyb21Db29yZChjb29yZCkgewogICAgICAgIHZhciBwID0gYXBpLnByb2plY3Rpb24oKTsKICAgICAgICByZXR1cm4gcCA/IHAuaW52ZXJ0KGNvb3JkKSA6IFswLCAwXTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUobm9kZSwgZm9yVXBkYXRlKSB7CiAgICAgICAgdmFyIG1ldGEgPSBub2RlLm1ldGFVaSwKICAgICAgICAgICAgeCA9IG1ldGEgJiYgbWV0YS54LAogICAgICAgICAgICB5ID0gbWV0YSAmJiBtZXRhLnksCiAgICAgICAgICAgIHh5OwoKICAgICAgICAvLyBpZiB0aGUgZGV2aWNlIGNvbnRhaW5zIGV4cGxpY2l0IExPTkcvTEFUIGRhdGEsIHVzZSB0aGF0IHRvIHBvc2l0aW9uCiAgICAgICAgaWYgKHNldExvbmdMYXQobm9kZSkpIHsKICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2Ugd2FudCB0byB1cGRhdGUgY2FjaGVkIG1ldGEgZGF0YS4uLgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIGVsc2UgaWYgd2UgaGF2ZSBbeCx5XSBjYWNoZWQgaW4gbWV0YSBkYXRhLCB1c2UgdGhhdC4uLgogICAgICAgIGlmICh4ICYmIHkpIHsKICAgICAgICAgICAgbm9kZS5maXhlZCA9IHRydWU7CiAgICAgICAgICAgIG5vZGUucHggPSBub2RlLnggPSB4OwogICAgICAgICAgICBub2RlLnB5ID0gbm9kZS55ID0geTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgdGhpcyBpcyBhIG5vZGUgdXBkYXRlIChub3QgYSBub2RlIGFkZCkuLiBza2lwIHJhbmRvbWl6ZXIKICAgICAgICBpZiAoZm9yVXBkYXRlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIE5vdGU6IFBsYWNpbmcgaW5jb21pbmcgdW5waW5uZWQgbm9kZXMgYXQgZXhhY3RseSB0aGUgc2FtZSBwb2ludAogICAgICAgIC8vICAgICAgICAoY2VudGVyIG9mIHRoZSB2aWV3KSBjYXVzZXMgdGhlbSB0byBleHBsb2RlIG91dHdhcmRzIHdoZW4KICAgICAgICAvLyAgICAgICAgdGhlIGZvcmNlIGxheW91dCBraWNrcyBpbi4gU28sIHdlIHNwcmVhZCB0aGVtIG91dCBhIGJpdAogICAgICAgIC8vICAgICAgICBpbml0aWFsbHksIHRvIHByb3ZpZGUgYSBtb3JlIHNlcmVuZSBsYXlvdXQgY29udmVyZ2VuY2UuCiAgICAgICAgLy8gICAgICAgQWRkaXRpb25hbGx5LCBpZiB0aGUgbm9kZSBpcyBhIGhvc3QsIHdlIHBsYWNlIGl0IG5lYXIKICAgICAgICAvLyAgICAgICAgdGhlIGRldmljZSBpdCBpcyBjb25uZWN0ZWQgdG8uCgogICAgICAgIGZ1bmN0aW9uIHJhbmQoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB4OiBybmQucmFuZERpbShkaW1bMF0pLAogICAgICAgICAgICAgICAgeTogcm5kLnJhbmREaW0oZGltWzFdKQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbmVhcihub2RlKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB4OiBub2RlLnggKyBuZWFyRGlzdCArIHJuZC5zcHJlYWQobmVhckRpc3QpLAogICAgICAgICAgICAgICAgeTogbm9kZS55ICsgbmVhckRpc3QgKyBybmQuc3ByZWFkKG5lYXJEaXN0KQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RGV2aWNlKGNwKSB7CiAgICAgICAgICAgIHZhciBkID0gbHVbY3AuZGV2aWNlXTsKICAgICAgICAgICAgcmV0dXJuIGQgfHwgcmFuZCgpOwogICAgICAgIH0KCiAgICAgICAgeHkgPSAobm9kZS5jbGFzcyA9PT0gJ2hvc3QnKSA/IG5lYXIoZ2V0RGV2aWNlKG5vZGUuY3ApKSA6IHJhbmQoKTsKICAgICAgICBhbmd1bGFyLmV4dGVuZChub2RlLCB4eSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0TG9uZ0xhdChub2RlKSB7CiAgICAgICAgdmFyIGxvYyA9IG5vZGUubG9jYXRpb24sCiAgICAgICAgICAgIGNvb3JkOwoKICAgICAgICBpZiAobG9jICYmIGxvYy50eXBlID09PSAnbG5nbGF0JykgewogICAgICAgICAgICBjb29yZCA9IGNvb3JkRnJvbUxuZ0xhdChsb2MpOwogICAgICAgICAgICBub2RlLmZpeGVkID0gdHJ1ZTsKICAgICAgICAgICAgbm9kZS5weCA9IG5vZGUueCA9IGNvb3JkWzBdOwogICAgICAgICAgICBub2RlLnB5ID0gbm9kZS55ID0gY29vcmRbMV07CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXNldEFsbExvY2F0aW9ucygpIHsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHNldExvbmdMYXQoZCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbWtTdmdDbHMoZGgsIHQsIG9uKSB7CiAgICAgICAgdmFyIG5kaCA9ICdub2RlICcgKyBkaCwKICAgICAgICAgICAgbmRodCA9IHQgPyBuZGggKyAnICcgKyB0IDogbmRoOwogICAgICAgIHJldHVybiBvbiA/IG5kaHQgKyAnIG9ubGluZScgOiBuZGh0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZU5vZGUoZGV2aWNlKSB7CiAgICAgICAgdmFyIG5vZGUgPSBkZXZpY2U7CgogICAgICAgIC8vIEF1Z21lbnQgYXMgbmVlZGVkLi4uCiAgICAgICAgbm9kZS5jbGFzcyA9ICdkZXZpY2UnOwogICAgICAgIG5vZGUuc3ZnQ2xhc3MgPSBta1N2Z0NscygnZGV2aWNlJywgZGV2aWNlLnR5cGUsIGRldmljZS5vbmxpbmUpOwogICAgICAgIHBvc2l0aW9uTm9kZShub2RlKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVIb3N0Tm9kZShob3N0KSB7CiAgICAgICAgdmFyIG5vZGUgPSBob3N0OwoKICAgICAgICAvLyBBdWdtZW50IGFzIG5lZWRlZC4uLgogICAgICAgIG5vZGUuY2xhc3MgPSAnaG9zdCc7CiAgICAgICAgaWYgKCFub2RlLnR5cGUpIHsKICAgICAgICAgICAgbm9kZS50eXBlID0gJ2VuZHN0YXRpb24nOwogICAgICAgIH0KICAgICAgICBub2RlLnN2Z0NsYXNzID0gbWtTdmdDbHMoJ2hvc3QnLCBub2RlLnR5cGUpOwogICAgICAgIHBvc2l0aW9uTm9kZShub2RlKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVIb3N0TGluayhob3N0KSB7CiAgICAgICAgdmFyIHNyYyA9IGhvc3QuaWQsCiAgICAgICAgICAgIGRzdCA9IGhvc3QuY3AuZGV2aWNlLAogICAgICAgICAgICBpZCA9IGhvc3QuaW5ncmVzcywKICAgICAgICAgICAgbG5rID0gbGlua0VuZFBvaW50cyhzcmMsIGRzdCk7CgogICAgICAgIGlmICghbG5rKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gU3ludGhlc2l6ZSBsaW5rIC4uLgogICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGxuaywgewogICAgICAgICAgICBrZXk6IGlkLAogICAgICAgICAgICBjbGFzczogJ2xpbmsnLAogICAgICAgICAgICAvLyBOT1RFOiBzcmNQb3J0IGxlZnQgdW5kZWZpbmVkIChob3N0IGVuZCBvZiB0aGUgbGluaykKICAgICAgICAgICAgdGd0UG9ydDogaG9zdC5jcC5wb3J0LAoKICAgICAgICAgICAgdHlwZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2hvc3RMaW5rJzsgfSwKICAgICAgICAgICAgZXhwZWN0ZWQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sCiAgICAgICAgICAgIG9ubGluZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gaG9zdGxpbmsgdGFyZ2V0IGlzIGVkZ2Ugc3dpdGNoCiAgICAgICAgICAgICAgICByZXR1cm4gbG5rLnRhcmdldC5vbmxpbmU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxpbmtXaWR0aDogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBsbms7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTGluayhsaW5rKSB7CiAgICAgICAgdmFyIGxuayA9IGxpbmtFbmRQb2ludHMobGluay5zcmMsIGxpbmsuZHN0KTsKCiAgICAgICAgaWYgKCFsbmspIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBhbmd1bGFyLmV4dGVuZChsbmssIHsKICAgICAgICAgICAga2V5OiBsaW5rLmlkLAogICAgICAgICAgICBjbGFzczogJ2xpbmsnLAogICAgICAgICAgICBmcm9tU291cmNlOiBsaW5rLAogICAgICAgICAgICBzcmNQb3J0OiBsaW5rLnNyY1BvcnQsCiAgICAgICAgICAgIHRndFBvcnQ6IGxpbmsuZHN0UG9ydCwKICAgICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgICAgIHgxOiAwLAogICAgICAgICAgICAgICAgeTE6IDAsCiAgICAgICAgICAgICAgICB4MjogMCwKICAgICAgICAgICAgICAgIHkyOiAwCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBmdW5jdGlvbnMgdG8gYWdncmVnYXRlIGR1YWwgbGluayBzdGF0ZQogICAgICAgICAgICB0eXBlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGxuay5mcm9tU291cmNlLAogICAgICAgICAgICAgICAgICAgIHQgPSBsbmsuZnJvbVRhcmdldDsKICAgICAgICAgICAgICAgIHJldHVybiAocyAmJiBzLnR5cGUpIHx8ICh0ICYmIHQudHlwZSkgfHwgZGVmYXVsdExpbmtUeXBlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBleHBlY3RlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHMgPSBsbmsuZnJvbVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICB0ID0gbG5rLmZyb21UYXJnZXQ7CiAgICAgICAgICAgICAgICByZXR1cm4gKHMgJiYgcy5leHBlY3RlZCkgJiYgKHQgJiYgdC5leHBlY3RlZCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9ubGluZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHMgPSBsbmsuZnJvbVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICB0ID0gbG5rLmZyb21UYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgYm90aCA9IGxuay5zb3VyY2Uub25saW5lICYmIGxuay50YXJnZXQub25saW5lOwogICAgICAgICAgICAgICAgcmV0dXJuIGJvdGggJiYgKHMgJiYgcy5vbmxpbmUpICYmICh0ICYmIHQub25saW5lKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbGlua1dpZHRoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGxuay5mcm9tU291cmNlLAogICAgICAgICAgICAgICAgICAgIHQgPSBsbmsuZnJvbVRhcmdldCwKICAgICAgICAgICAgICAgICAgICB3cyA9IChzICYmIHMubGlua1dpZHRoKSB8fCAwLAogICAgICAgICAgICAgICAgICAgIHd0ID0gKHQgJiYgdC5saW5rV2lkdGgpIHx8IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gbG5rLnBvc2l0aW9uLm11bHRpTGluayA/IDUgOiBNYXRoLm1heCh3cywgd3QpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGxuazsKICAgIH0KCgogICAgZnVuY3Rpb24gbGlua0VuZFBvaW50cyhzcmNJZCwgZHN0SWQpIHsKICAgICAgICB2YXIgc3JjTm9kZSA9IGx1W3NyY0lkXSwKICAgICAgICAgICAgZHN0Tm9kZSA9IGx1W2RzdElkXSwKICAgICAgICAgICAgc01pc3MgPSAhc3JjTm9kZSA/IG1pc3NNc2coJ3NyYycsIHNyY0lkKSA6ICcnLAogICAgICAgICAgICBkTWlzcyA9ICFkc3ROb2RlID8gbWlzc01zZygnZHN0JywgZHN0SWQpIDogJyc7CgogICAgICAgIGlmIChzTWlzcyB8fCBkTWlzcykgewogICAgICAgICAgICAkbG9nLmVycm9yKCdOb2RlKHMpIG5vdCBvbiBtYXAgZm9yIGxpbms6JyArIHNNaXNzICsgZE1pc3MpOwogICAgICAgICAgICAvL2xvZ2ljRXJyb3IoJ05vZGUocykgbm90IG9uIG1hcCBmb3IgbGluazpcbicgKyBzTWlzcyArIGRNaXNzKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNvdXJjZTogc3JjTm9kZSwKICAgICAgICAgICAgdGFyZ2V0OiBkc3ROb2RlCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBtaXNzTXNnKHdoYXQsIGlkKSB7CiAgICAgICAgcmV0dXJuICdcblsnICsgd2hhdCArICddICInICsgaWQgKyAnIiBtaXNzaW5nJzsKICAgIH0KCgogICAgZnVuY3Rpb24gbWFrZU5vZGVLZXkoZCwgd2hhdCkgewogICAgICAgIHZhciBwb3J0ID0gd2hhdCArICdQb3J0JzsKICAgICAgICByZXR1cm4gZFt3aGF0XSArICcvJyArIGRbcG9ydF07CiAgICB9CgogICAgZnVuY3Rpb24gbWFrZUxpbmtLZXkoZCwgZmxpcHBlZCkgewogICAgICAgIHZhciBvbmUgPSBmbGlwcGVkID8gbWFrZU5vZGVLZXkoZCwgJ2RzdCcpIDogbWFrZU5vZGVLZXkoZCwgJ3NyYycpLAogICAgICAgICAgICB0d28gPSBmbGlwcGVkID8gbWFrZU5vZGVLZXkoZCwgJ3NyYycpIDogbWFrZU5vZGVLZXkoZCwgJ2RzdCcpOwogICAgICAgIHJldHVybiBvbmUgKyAnLScgKyB0d287CiAgICB9CgogICAgZnVuY3Rpb24gZmluZExpbmtCeUlkKGlkKSB7CiAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSByZXZlcnNlIGxvb2t1cCwgZWxzZSBkZWZhdWx0IHRvIGdpdmVuIGlkCiAgICAgICAgdmFyIGtleSA9IHJsa1tpZF0gfHwgaWQ7CiAgICAgICAgcmV0dXJuIGtleSAmJiBsdVtrZXldOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRMaW5rKGxpbmtEYXRhLCBvcCkgewogICAgICAgIHZhciBrZXkgPSBtYWtlTGlua0tleShsaW5rRGF0YSksCiAgICAgICAgICAgIGtleXJldiA9IG1ha2VMaW5rS2V5KGxpbmtEYXRhLCAxKSwKICAgICAgICAgICAgbGluayA9IGx1W2tleV0sCiAgICAgICAgICAgIGxpbmtSZXYgPSBsdVtrZXlyZXZdLAogICAgICAgICAgICByZXN1bHQgPSB7fSwKICAgICAgICAgICAgbGRhdGEgPSBsaW5rIHx8IGxpbmtSZXYsCiAgICAgICAgICAgIHJhd0xpbms7CgogICAgICAgIGlmIChvcCA9PT0gJ2FkZCcpIHsKICAgICAgICAgICAgaWYgKGxpbmspIHsKICAgICAgICAgICAgICAgIC8vIHRyeWluZyB0byBhZGQgYSBsaW5rIHRoYXQgd2UgYWxyZWFkeSBrbm93IGFib3V0CiAgICAgICAgICAgICAgICByZXN1bHQubGRhdGEgPSBsaW5rOwogICAgICAgICAgICAgICAgcmVzdWx0LmJhZExvZ2ljID0gJ2FkZExpbms6IGxpbmsgYWxyZWFkeSBhZGRlZCc7CgogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmtSZXYpIHsKICAgICAgICAgICAgICAgIC8vIHdlIGZvdW5kIHRoZSByZXZlcnNlIG9mIHRoZSBsaW5rIHRvIGJlIGFkZGVkCiAgICAgICAgICAgICAgICByZXN1bHQubGRhdGEgPSBsaW5rUmV2OwogICAgICAgICAgICAgICAgaWYgKGxpbmtSZXYuZnJvbVRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5iYWRMb2dpYyA9ICdhZGRMaW5rOiBsaW5rIGFscmVhZHkgYWRkZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ3VwZGF0ZScpIHsKICAgICAgICAgICAgaWYgKCFsZGF0YSkgewogICAgICAgICAgICAgICAgcmVzdWx0LmJhZExvZ2ljID0gJ3VwZGF0ZUxpbms6IGxpbmsgbm90IGZvdW5kJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJhd0xpbmsgPSBsaW5rID8gbGRhdGEuZnJvbVNvdXJjZSA6IGxkYXRhLmZyb21UYXJnZXQ7CiAgICAgICAgICAgICAgICByZXN1bHQudXBkYXRlV2l0aCA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5leHRlbmQocmF3TGluaywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgYXBpLnJlc3R5bGVMaW5rRWxlbWVudChsZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAncmVtb3ZlJykgewogICAgICAgICAgICBpZiAoIWxkYXRhKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuYmFkTG9naWMgPSAncmVtb3ZlTGluazogbGluayBub3QgZm91bmQnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmF3TGluayA9IGxpbmsgPyBsZGF0YS5mcm9tU291cmNlIDogbGRhdGEuZnJvbVRhcmdldDsKCiAgICAgICAgICAgICAgICBpZiAoIXJhd0xpbmspIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYmFkTG9naWMgPSAncmVtb3ZlTGluazogbGluayBub3QgZm91bmQnOwoKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlbW92ZVJhd0xpbmsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsaW5rIG91dCBvZiBhZ2dyZWdhdGUgbGlua3NCeURldmljZSBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5rc0ZvckRldlBhaXIgPSBsaW5rc0J5RGV2aWNlW2xkYXRhLmRldmljZVBhaXJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm12SWR4ID0gZnMuZmluZChsZGF0YS5rZXksIGxpbmtzRm9yRGV2UGFpciwgJ2tleScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocm12SWR4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzRm9yRGV2UGFpci5zcGxpY2Uocm12SWR4LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsZGF0YS5wb3NpdGlvbi5tdWx0aWxpbmsgPSBsaW5rc0ZvckRldlBhaXIubGVuZ3RoID49IDU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb21Tb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkYXRhLmZyb21Tb3VyY2UgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxkYXRhLmZyb21UYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9tb3RlIHRhcmdldCBpbnRvIHNvdXJjZSBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkYXRhLmZyb21Tb3VyY2UgPSBsZGF0YS5mcm9tVGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkYXRhLmZyb21UYXJnZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkYXRhLmtleSA9IGtleXJldjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbHVba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdVtrZXlyZXZdID0gbGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJsa1trZXlyZXZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb21UYXJnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkYXRhLmZyb21UYXJnZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJsa1trZXlyZXZdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZGF0YS5mcm9tU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGkucmVzdHlsZUxpbmtFbGVtZW50KGxkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5yZW1vdmVMaW5rRWxlbWVudChsZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kRGV2aWNlcyhvZmZsaW5lT25seSkgewogICAgICAgIHZhciBhID0gW107CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBpZiAoZC5jbGFzcyA9PT0gJ2RldmljZScgJiYgIShvZmZsaW5lT25seSAmJiBkLm9ubGluZSkpIHsKICAgICAgICAgICAgICAgIGEucHVzaChkKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRBdHRhY2hlZEhvc3RzKGRldklkKSB7CiAgICAgICAgdmFyIGhvc3RzID0gW107CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBpZiAoZC5jbGFzcyA9PT0gJ2hvc3QnICYmIGQuY3AuZGV2aWNlID09PSBkZXZJZCkgewogICAgICAgICAgICAgICAgaG9zdHMucHVzaChkKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBob3N0czsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kQXR0YWNoZWRMaW5rcyhkZXZJZCkgewogICAgICAgIHZhciBsbmtzID0gW107CiAgICAgICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBpZiAoZC5zb3VyY2UuaWQgPT09IGRldklkIHx8IGQudGFyZ2V0LmlkID09PSBkZXZJZCkgewogICAgICAgICAgICAgICAgbG5rcy5wdXNoKGQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGxua3M7CiAgICB9CgogICAgLy8gcmV0dXJucyBvbmUtd2F5IGxpbmtzIG9yIHdoZXJlIHRoZSBpbnRlcm5hbCBsaW5rIHR5cGVzIGRpZmZlcgogICAgZnVuY3Rpb24gZmluZEJhZExpbmtzKCkgewogICAgICAgIHZhciBsbmtzID0gW10sCiAgICAgICAgICAgIHNyYywgdGd0OwogICAgICAgIGxpbmtzLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgLy8gTk9URTogc2tpcCBlZGdlIGxpbmtzLCB3aGljaCBhcmUgc3ludGhlc2l6ZWQKICAgICAgICAgICAgaWYgKGQudHlwZSgpICE9PSAnaG9zdExpbmsnKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgZC5iYWQ7CiAgICAgICAgICAgICAgICBzcmMgPSBkLmZyb21Tb3VyY2U7CiAgICAgICAgICAgICAgICB0Z3QgPSBkLmZyb21UYXJnZXQ7CiAgICAgICAgICAgICAgICBpZiAoc3JjICYmICF0Z3QpIHsKICAgICAgICAgICAgICAgICAgICBkLmJhZCA9ICdtaXNzaW5nIGxpbmsnOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMudHlwZSAhPT0gdGd0LnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBkLmJhZCA9ICd0eXBlIG1pc21hdGNoJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkLmJhZCkgewogICAgICAgICAgICAgICAgICAgIGxua3MucHVzaChkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBsbmtzOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBNb2R1bGUgZGVmaW5pdGlvbgoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgLmZhY3RvcnkoJ1RvcG9Nb2RlbFNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICdGblNlcnZpY2UnLCAnUmFuZG9tU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF9ybmRfKSB7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgcm5kID0gX3JuZF87CgogICAgICAgICAgICBmdW5jdGlvbiBpbml0TW9kZWwoX2FwaV8sIF9kaW1fKSB7CiAgICAgICAgICAgICAgICBhcGkgPSBfYXBpXzsKICAgICAgICAgICAgICAgIGRpbSA9IF9kaW1fOwogICAgICAgICAgICAgICAgbHUgPSBhcGkubmV0d29yay5sb29rdXA7CiAgICAgICAgICAgICAgICBybGsgPSBhcGkubmV0d29yay5yZXZMaW5rVG9LZXk7CiAgICAgICAgICAgICAgICBub2RlcyA9IGFwaS5uZXR3b3JrLm5vZGVzOwogICAgICAgICAgICAgICAgbGlua3MgPSBhcGkubmV0d29yay5saW5rczsKICAgICAgICAgICAgICAgIGxpbmtzQnlEZXZpY2UgPSBhcGkubmV0d29yay5saW5rc0J5RGV2aWNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBuZXdEaW0oX2RpbV8pIHsKICAgICAgICAgICAgICAgIGRpbSA9IF9kaW1fOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkZXN0cm95TW9kZWwoKSB7IH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0TW9kZWw6IGluaXRNb2RlbCwKICAgICAgICAgICAgICAgIG5ld0RpbTogbmV3RGltLAogICAgICAgICAgICAgICAgZGVzdHJveU1vZGVsOiBkZXN0cm95TW9kZWwsCgogICAgICAgICAgICAgICAgcG9zaXRpb25Ob2RlOiBwb3NpdGlvbk5vZGUsCiAgICAgICAgICAgICAgICByZXNldEFsbExvY2F0aW9uczogcmVzZXRBbGxMb2NhdGlvbnMsCiAgICAgICAgICAgICAgICBjcmVhdGVEZXZpY2VOb2RlOiBjcmVhdGVEZXZpY2VOb2RlLAogICAgICAgICAgICAgICAgY3JlYXRlSG9zdE5vZGU6IGNyZWF0ZUhvc3ROb2RlLAogICAgICAgICAgICAgICAgY3JlYXRlSG9zdExpbms6IGNyZWF0ZUhvc3RMaW5rLAogICAgICAgICAgICAgICAgY3JlYXRlTGluazogY3JlYXRlTGluaywKICAgICAgICAgICAgICAgIGNvb3JkRnJvbUxuZ0xhdDogY29vcmRGcm9tTG5nTGF0LAogICAgICAgICAgICAgICAgbG5nTGF0RnJvbUNvb3JkOiBsbmdMYXRGcm9tQ29vcmQsCiAgICAgICAgICAgICAgICBmaW5kTGluazogZmluZExpbmssCiAgICAgICAgICAgICAgICBmaW5kTGlua0J5SWQ6IGZpbmRMaW5rQnlJZCwKICAgICAgICAgICAgICAgIGZpbmREZXZpY2VzOiBmaW5kRGV2aWNlcywKICAgICAgICAgICAgICAgIGZpbmRBdHRhY2hlZEhvc3RzOiBmaW5kQXR0YWNoZWRIb3N0cywKICAgICAgICAgICAgICAgIGZpbmRBdHRhY2hlZExpbmtzOiBmaW5kQXR0YWNoZWRMaW5rcywKICAgICAgICAgICAgICAgIGZpbmRCYWRMaW5rczogZmluZEJhZExpbmtzCiAgICAgICAgICAgIH0KICAgICAgICB9XSk7Cn0oKSk7Cozc71Z4dAYAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQuAkAAQAZ828CoBzbAqAdglScf9duSkrw5VmmIgBAPMwtQAAABAQgKAKNfDgBNpgqM3O9WBXgGAJECAACRAgAACAAnrR4TaPcoH9LFCABFAAKDLgNAAEAGeovAqAc2wKgHYJUnH/XbkpK8OVZpiIAYDzMXhgAAAQEICgCjXw8ATaYKR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb1Nwcml0ZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVh1+BgCwHAAAsBwAAGj3KB/SxQgAJ60eEwgARQAcojfOQABABlahwKgHYMCoBzYf9ZUnOVZpiNuSlQuAGAFirHsAAAEBCAoATaYLAKNfD0hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA3MTczDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFNwcml0ZSBNb2R1bGUuCiBEZWZpbmVzIGJlaGF2aW9yIGZvciBsb2FkaW5nIHNwcml0ZXMgaW50byB0aGUgc3ByaXRlIGxheWVyLgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICRodHRwLCBmcywgZ3MsIHN1cywgd3NzOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHRzc2lkID0gJ1RvcG9TcHJpdGVTZXJ2aWNlOiAnLAogICAgICAgIGZvbnRzaXplID0gMjA7ICAvLyBkZWZhdWx0IGZvbnQgc2l6ZSAyMHB0LgoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgc3ByaXRlTGF5ZXIsIGRlZnNFbGVtZW50OwoKCiAgICBmdW5jdGlvbiByZWdpc3RlclBhdGhzQXNHbHlwaHMocGF0aHMpIHsKICAgICAgICB2YXIgY3VzdG9tID0ge30sCiAgICAgICAgICAgIGlkcyA9IFtdOwoKICAgICAgICBmdW5jdGlvbiBta2QoZCkgewogICAgICAgICAgICByZXR1cm4gZnMuaXNBKGQpID8gZC5qb2luKCcnKSA6IGQ7CiAgICAgICAgfQoKICAgICAgICBwYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7CiAgICAgICAgICAgIHZhciB0YWcgPSAnc3ByXycgKyBwYXRoLnRhZzsKCiAgICAgICAgICAgIGlmIChwYXRoLmdseXBoKSB7CiAgICAgICAgICAgICAgICAvLyBhc3N1bXB0aW9uIGlzIHRoYXQgd2UgYXJlIHVzaW5nIGEgYnVpbHQtaW4gZ2x5cGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3VzdG9tWydfJyArIHRhZ10gPSBwYXRoLnZpZXdib3ggfHwgJzAgMCAxMDAwIDEwMDAnOwogICAgICAgICAgICBjdXN0b21bdGFnXSA9IG1rZChwYXRoLmQpOwogICAgICAgICAgICBpZHMucHVzaCh0YWcpOwogICAgICAgIH0pOwoKICAgICAgICBncy5yZWdpc3RlckdseXBocyhjdXN0b20pOwogICAgICAgIGdzLmxvYWREZWZzKGRlZnNFbGVtZW50LCBpZHMsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5U3Ryb2tlU3R5bGUocywgdXNlKSB7CiAgICAgICAgdmFyIHN0eWxlOwogICAgICAgIGlmIChzKSB7CiAgICAgICAgICAgIHN0eWxlID0ge307CiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzLCBmdW5jdGlvbiAodmFsdWUsIGtleSkgewogICAgICAgICAgICAgICAgc3R5bGVbJ3N0cm9rZS0nICsga2V5XSA9IHZhbHVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdXNlLnN0eWxlKHN0eWxlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlGaWxsQ2xhc3MoZiwgdXNlKSB7CiAgICAgICAgdXNlLmNsYXNzZWQoJ2ZpbGwtJyArIGYsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRvU3ByaXRlKHNwciwgZGVmLCBwYXRobWV0YSkgewogICAgICAgIHZhciBwbWV0YSA9IHBhdGhtZXRhW2RlZi5wYXRoXSwKICAgICAgICAgICAgYyA9IHNwci5jbGFzcyB8fCAnZ3JheTEnLAogICAgICAgICAgICBwID0gc3ByLnBvcyB8fCBbMCwwXSwKICAgICAgICAgICAgbGFiID0gc3ByLmxhYmVsLAogICAgICAgICAgICBkaW0gPSBkZWYuZGltIHx8IFs0MCw0MF0sCiAgICAgICAgICAgIHcgPSBkaW1bMF0sCiAgICAgICAgICAgIGggPSBkaW1bMV0sCiAgICAgICAgICAgIGR5ID0gZGVmLmxhYmVseW9mZiB8fCAxLAogICAgICAgICAgICBzYyA9IGRlZi5zY2FsZSwKICAgICAgICAgICAgeGZtID0gc3VzLnRyYW5zbGF0ZShwKSwKICAgICAgICAgICAgZywgYXR0ciwgdXNlOwoKICAgICAgICBpZiAoc2MpIHsKICAgICAgICAgICAgeGZtICs9IHN1cy5zY2FsZShzYywgc2MpOwogICAgICAgIH0KCiAgICAgICAgZyA9IHNwcml0ZUxheWVyLmFwcGVuZCgnZycpCiAgICAgICAgICAgIC5jbGFzc2VkKGMsIHRydWUpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB4Zm0pOwoKICAgICAgICBhdHRyID0gewogICAgICAgICAgICB3aWR0aDogdywKICAgICAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgICAgICAneGxpbms6aHJlZic6ICcjJyArIHBtZXRhLnUKICAgICAgICB9OwoKICAgICAgICB1c2UgPSBnLmFwcGVuZCgndXNlJykuYXR0cihhdHRyKTsKICAgICAgICBhcHBseVN0cm9rZVN0eWxlKHBtZXRhLnMsIHVzZSk7CiAgICAgICAgYXBwbHlGaWxsQ2xhc3MoZGVmLmZpbGwsIHVzZSk7CgoKICAgICAgICAvLyBhZGQgc3VicGF0aHMgaWYgdGhleSBoYXZlIGJlZW4gZGVmaW5lZAogICAgICAgIGlmIChmcy5pc0EoZGVmLnN1YnBhdGhzKSkgewogICAgICAgICAgICBkZWYuc3VicGF0aHMuZm9yRWFjaChmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgcG1ldGEgPSBwYXRobWV0YVt2LnBhdGhdOwogICAgICAgICAgICAgICAgYXR0ciA9IHsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogdywKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGgsCiAgICAgICAgICAgICAgICAgICAgJ3hsaW5rOmhyZWYnOiAnIycgKyBwbWV0YS51LAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc3VzLnRyYW5zbGF0ZSh2LnBvcykKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB1c2UgPSBnLmFwcGVuZCgndXNlJykuYXR0cihhdHRyKTsKICAgICAgICAgICAgICAgIGFwcGx5U3Ryb2tlU3R5bGUocG1ldGEucywgdXNlKTsKICAgICAgICAgICAgICAgIGFwcGx5RmlsbENsYXNzKGRlZi5zdWJwYXRoZmlsbCwgdXNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobGFiKSB7CiAgICAgICAgICAgIGcuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC50ZXh0KGxhYikKICAgICAgICAgICAgICAgIC5hdHRyKHsgeDogdyAvIDIsIHk6IGggKiBkeSB9KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZG9MYWJlbChsYWJlbCkgewogICAgICAgIHZhciBjID0gbGFiZWwuY2xhc3MgfHwgJ2dyYXkxJywKICAgICAgICAgICAgcCA9IGxhYmVsLnBvcyB8fCBbMCwwXSwKICAgICAgICAgICAgc3ogPSBsYWJlbC5zaXplIHx8IDEuMCwKICAgICAgICAgICAgZyA9IHNwcml0ZUxheWVyLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuY2xhc3NlZChjLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHN1cy50cmFuc2xhdGUocCkpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC50ZXh0KGxhYmVsLnRleHQpCiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChmb250c2l6ZSAqIHN6KSsncHQnKTsKICAgIH0KCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIGV2ZW50IGhhbmRsZXJzCgogICAgLy8gSGFuZGxlcyByZXNwb25zZSBmcm9tICdzcHJpdGVMaXN0UmVxdWVzdCcgd2hpY2ggbGlzdHMgYWxsIHRoZQogICAgLy8gcmVnaXN0ZXJlZCBzcHJpdGUgZGVmaW5pdGlvbnMgb24gdGhlIHNlcnZlci4KICAgIC8vIChzZWUgb25vcy11cGxvYWQtc3ByaXRlcykKICAgIGZ1bmN0aW9uIGluTGlzdChwYXlsb2FkKSB7CiAgICAgICAgJGxvZy5kZWJ1Zyh0c3NpZCArICdSZWdpc3RlcmVkIHNwcml0ZSBkZWZpbml0aW9uczonLCBwYXlsb2FkLm5hbWVzKTsKICAgICAgICAvLyBTb21lIGRheSwgd2Ugd2lsbCBtYWtlIHRoaXMgbGlzdCBhdmFpbGFibGUgdG8gdGhlIHVzZXIgaW4KICAgICAgICAvLyAgYSBkcm9wZG93biBzZWxlY3Rpb24gYm94Li4uCiAgICB9CgogICAgLy8gSGFuZGxlcyByZXNwb25zZSBmcm9tICdzcHJpdGVEYXRhUmVxdWVzdCcgd2hpY2ggcHJvdmlkZXMgdGhlCiAgICAvLyAgZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBzcHJpdGUgZGVmaW5pdGlvbi4KICAgIGZ1bmN0aW9uIGluRGF0YShwYXlsb2FkKSB7CiAgICAgICAgdmFyIGRhdGEgPSBwYXlsb2FkLmRhdGEsCiAgICAgICAgICAgIG5hbWUsIGRlc2MsIHBmeCwgc3ByaXRlcywgbGFiZWxzLCBhbHBoYSwKICAgICAgICAgICAgcGF0aHMsIGRlZm4sIGxvYWQsCiAgICAgICAgICAgIHBhdGhtZXRhID0ge30sCiAgICAgICAgICAgIGRlZnMgPSB7fSwKICAgICAgICAgICAgd2FybiA9IFtdOwoKICAgICAgICBpZiAoIWRhdGEpIHsKICAgICAgICAgICAgJGxvZy53YXJuKHRzc2lkICsgJ05vIHNwcml0ZSBkYXRhIGxvYWRlZC4nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBuYW1lID0gZGF0YS5kZWZuX25hbWU7CiAgICAgICAgZGVzYyA9IGRhdGEuZGVmbl9kZXNjOwogICAgICAgIHBhdGhzID0gZGF0YS5wYXRoczsKICAgICAgICBkZWZuID0gZGF0YS5kZWZuOwogICAgICAgIGxvYWQgPSBkYXRhLmxvYWQ7CiAgICAgICAgcGZ4ID0gdHNzaWQgKyAnWycgKyBuYW1lICsgJ106ICc7CgogICAgICAgICRsb2cuZGVidWcoIkxvYWRpbmcgc3ByaXRlcy4uLlsiICsgbmFtZSArICJdIiwgZGVzYyk7CgogICAgICAgIGZ1bmN0aW9uIG5vKHdoYXQpIHsKICAgICAgICAgICAgd2Fybi5wdXNoKHBmeCArICdObyAnICsgd2hhdCArICcgcHJvcGVydHkgZGVmaW5lZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFwYXRocykgbm8oJ3BhdGhzJyk7CiAgICAgICAgaWYgKCFkZWZuKSBubygnZGVmbicpOwogICAgICAgIGlmICghbG9hZCkgbm8oJ2xvYWQnKTsKCiAgICAgICAgaWYgKHdhcm4ubGVuZ3RoKSB7CiAgICAgICAgICAgICRsb2cuZXJyb3Iod2Fybi5qb2luKCdcbicpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGN1c3RvbSBwYXRocyBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSBnbHlwaCBEQiwgYW5kIGltcG9ydGVkCiAgICAgICAgcmVnaXN0ZXJQYXRoc0FzR2x5cGhzKHBhdGhzKTsKCiAgICAgICAgcGF0aHMuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgICAgICBwYXRobWV0YVtwLnRhZ10gPSB7CiAgICAgICAgICAgICAgICBzOiBwLnN0cm9rZSwKICAgICAgICAgICAgICAgIHU6IHAuZ2x5cGggfHwgJ3Nwcl8nICsgcC50YWcKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgZGVmbi5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGRlZnNbZC5pZF0gPSBkOwogICAgICAgIH0pOwoKICAgICAgICAvLyBzcHJpdGVzLCBsYWJlbHMgYW5kIGFscGhhIGFyZSBlYWNoIG9wdGlvbmFsIGNvbXBvbmVudHMgb2YgdGhlIGxvYWQKICAgICAgICBzcHJpdGVzID0gbG9hZC5zcHJpdGVzOwogICAgICAgIGxhYmVscyA9IGxvYWQubGFiZWxzOwogICAgICAgIGFscGhhID0gbG9hZC5hbHBoYTsKCiAgICAgICAgaWYgKGFscGhhKSB7CiAgICAgICAgICAgIHNwcml0ZUxheWVyLnN0eWxlKCdvcGFjaXR5JywgYWxwaGEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNwcml0ZXMpIHsKICAgICAgICAgICAgc3ByaXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzcHIpIHsKICAgICAgICAgICAgICAgIHZhciBkZWYgPSBkZWZzW3Nwci5pZF07CiAgICAgICAgICAgICAgICBkb1Nwcml0ZShzcHIsIGRlZiwgcGF0aG1ldGEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChsYWJlbHMpIHsKICAgICAgICAgICAgbGFiZWxzLmZvckVhY2goZG9MYWJlbCk7CiAgICAgICAgfQogICAgfQoKCiAgICBmdW5jdGlvbiBsb2FkU3ByaXRlcyhsYXllciwgZGVmc0VsZW0sIGRlZm5hbWUpIHsKICAgICAgICB2YXIgbmFtZSA9IGRlZm5hbWUgfHwgJ3Nwcml0ZXMnOwogICAgICAgIHNwcml0ZUxheWVyID0gbGF5ZXI7CiAgICAgICAgZGVmc0VsZW1lbnQgPSBkZWZzRWxlbTsKCiAgICAgICAgJGxvZy5pbmZvKHRzc2lkICsgJ1JlcXVlc3Rpbmcgc3ByaXRlIGRlZmluaXRpb24gWycrbmFtZSsnXS4uLicpOwoKICAgICAgICB3c3Muc2VuZEV2ZW50KCdzcHJpdGVMaXN0UmVxdWVzdCcpOwogICAgICAgIHdzcy5zZW5kRXZlbnQoJ3Nwcml0ZURhdGFSZXF1ZXN0Jywge25hbWU6IG5hbWV9KTsKICAgIH0KCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBNT0RVTEUgREVGSU5JVElPTiA9PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvU3ByaXRlU2VydmljZScsCiAgICAgICAgWyckbG9nJywgJyRodHRwJywgJ0ZuU2VydmljZScsICdHbHlwaFNlcnZpY2UnLAogICAgICAgICAgICAnU3ZnVXRpbFNlcnZpY2UnLCAnV2ViU29ja2V0U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kaHR0cF8sIF9mc18sIF9nc18sIF9zdXNfLCBfd3NzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkaHR0cCA9IF8kaHR0cF87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwogICAgICAgICAgICBzdXMgPSBfc3VzXzsKICAgICAgICAgICAgd3NzID0gX3dzc187CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbG9hZFNwcml0ZXM6IGxvYWRTcHJpdGVzLAogICAgICAgICAgICAgICAgc3ByaXRlTGlzdFJlc3BvbnNlOiBpbkxpc3QsCiAgICAgICAgICAgICAgICBzcHJpdGVEYXRhUmVzcG9uc2U6IGluRGF0YQogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKCn0oKSk7Cozc71bAfgYAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADQuBEAAQAZ82cCoBzbAqAdglScf9duSlQs5VoX2gBAPM+yQAAABAQgKAKNfDwBNpguM3O9W6YAGAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5bvBAAEAGO+jAqAdgwKgHNh/1lSxw2FvMBQnXVIAYAVqQEgAAAQEICgBNpgsAo18NMA0KDQqM3O9W64IGAJICAACSAgAACAAnrR4TaPcoH9LFCABFAAKE5KJAAEAGw+rAqAc2wKgHYJUsH/UFCddUcNhb0YAYAzm8JgAAAQEICgCjXw8ATaYLR0VUIC9vbm9zL3VpL2FwcC92aWV3L3RvcG8vdG9wb1RyYWZmaWMuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71brggYAlQIAAJUCAAAIACetHhNo9ygf0sUIAEUAAocuBUAAQAZ6hcCoBzbAqAdglScf9duSlQs5VoX2gBgPMzAZAAABAQgKAKNfDwBNpgtHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdG9wby90b3BvVHJhZmZpY05ldy5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVozTBgBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANNU2QABABtWmwKgHYMCoBzYf9ZUiQcEvvVh6mZ+AEAIUkA0AAAEBCAoATaYQAKNfC4zc71Zi1wYAphwAAKYcAABo9ygf0sUIACetHhMIAEUAHJgYt0AAQAZ1wsCoB2DAqAc2H/WVK2c+ckT2amFhgBgBsqxxAAABAQgKAE2mEACjXwxIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogNzE2Mw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBPYmxpcXVlIFZpZXcgTW9kdWxlLgogUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byB2aWV3IHRoZSB0b3BvbG9neSBhcyB0d28gcGxhbmVzIChwYWNrZXQgJiBvcHRpY2FsKQogZnJvbSBhbiBvYmxpcXVlIChzaWRlLW9uKSBwZXJzcGVjdGl2ZS4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZnMKICAgIHZhciAkbG9nLCBmcywgc3VzLCBmbGFzaDsKCiAgICAvLyBhcGkgdG8gdG9wb0ZvcmNlCiAgICB2YXIgYXBpOwogICAgLyoKICAgICBmb3JjZSgpICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBmb3JjZSBsYXlvdXQgb2JqZWN0CiAgICAgem9vbUxheWVyKCkgICAgICAgICAgICAgICAgICAgIC8vIGdldCByZWYgdG8gem9vbSBsYXllcgogICAgIG5vZGVHQkJveCgpICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYm91bmRpbmcgYm94IG9mIG5vZGUgZ3JvdXAgbGF5ZXIKICAgICBub2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICBsaW5rKCkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2YgbGlua3MKICAgICBub2RlcygpICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBuZXR3b3JrIG5vZGVzIGFycmF5CiAgICAgdGlja1N0dWZmICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZiB0byB0aWNrIGZ1bmN0aW9ucwogICAgIG5vZGVMb2NrKGIpICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0LWFuZC1zZXQgbm9kZUxvY2sgc3RhdGUKICAgICBvcGFjaWZ5TWFwKGIpICAgICAgICAgICAgICAgICAgLy8gc2hvdyBvciBoaWRlIG1hcCBsYXllcgogICAgIGluTGF5ZXIoZCwgbGF5ZXIpICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBkIGluIGxheWVyIHsncGt0J3wnb3B0J30KICAgICBjYWxjTGlua1BvcygpICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlcyBsaW5rIHBvcyBiYXNlZCBvbiBub2RlIGRhdGEKICAgICAqLwoKICAgIC8vIGNvbmZpZ3VyYXRpb24KICAgIHZhciB4c2t5ID0gLS43LCAgICAgLy8geCBza2V3IHkgZmFjdG9yCiAgICAgICAgeHNrID0gLTM1LCAgICAgIC8vIHggc2tldyBhbmdsZQogICAgICAgIHlzYyA9IC41LCAgICAgICAvLyB5IHNjYWxlCiAgICAgICAgcGFkID0gNTAsCiAgICAgICAgdGltZSA9IDE1MDAsCiAgICAgICAgZmlsbCA9IHsKICAgICAgICAgICAgcGt0OiAncmdiYSgxMzAsMTMwLDE3MCwwLjMpJywgICAvLyBibHVlLWlzaAogICAgICAgICAgICBvcHQ6ICdyZ2JhKDE3MCwxMzAsMTcwLDAuMyknICAgIC8vIG1hZ2VudGEtaXNoCiAgICAgICAgfTsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIG9ibGlxdWUgPSBmYWxzZSwKICAgICAgICB4ZmZuID0gbnVsbCwKICAgICAgICBwbGFuZSA9IHt9LAogICAgICAgIG9sZE5vZGVMb2NrOwoKCiAgICBmdW5jdGlvbiBwbGFuZUlkKHRhZykgewogICAgICAgIHJldHVybiAndG9wby1vYnZpZXctJyArIHRhZyArICdQbGFuZSc7CiAgICB9CgogICAgZnVuY3Rpb24geXRmbihoLCBkaXIpIHsKICAgICAgICByZXR1cm4gaCAqIHlzYyAqIGRpciAqIDEuMTsKICAgIH0KCiAgICBmdW5jdGlvbiBvYlhmb3JtKGgsIGRpcikgewogICAgICAgIHZhciB5dCA9IHl0Zm4oaCwgZGlyKTsKICAgICAgICByZXR1cm4gc3VzLnNjYWxlKDEsIHlzYykgKyBzdXMudHJhbnNsYXRlKDAsIHl0KSArIHN1cy5za2V3WCh4c2spOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vWGZvcm0oKSB7CiAgICAgICAgcmV0dXJuIHN1cy5za2V3WCgwKSArIHN1cy50cmFuc2xhdGUoMCwwKSArIHN1cy5zY2FsZSgxLDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhZEJveChib3gsIHApIHsKICAgICAgICBib3gueCAtPSBwOwogICAgICAgIGJveC55IC09IHA7CiAgICAgICAgYm94LndpZHRoICs9IHAqMjsKICAgICAgICBib3guaGVpZ2h0ICs9IHAqMjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b09ibGlxdWVWaWV3KCkgewogICAgICAgIHZhciBib3ggPSBhcGkubm9kZUdCQm94KCksCiAgICAgICAgICAgIG94LCBveTsKCiAgICAgICAgcGFkQm94KGJveCwgcGFkKTsKCiAgICAgICAgb3ggPSBib3gueCArIGJveC53aWR0aCAvIDI7CiAgICAgICAgb3kgPSBib3gueSArIGJveC5oZWlnaHQgLyAyOwoKICAgICAgICAvLyByZW1lbWJlciBub2RlIGxvY2sgc3RhdGUsIHRoZW4gbG9jayB0aGUgbm9kZXMgZG93bgogICAgICAgIG9sZE5vZGVMb2NrID0gYXBpLm5vZGVMb2NrKHRydWUpOwogICAgICAgIGFwaS5vcGFjaWZ5TWFwKGZhbHNlKTsKCiAgICAgICAgaW5zZXJ0UGxhbmVzKG94LCBveSk7CgogICAgICAgIHhmZm4gPSBmdW5jdGlvbiAoeHksIGRpcikgewogICAgICAgICAgICB2YXIgeXQgPSB5dGZuKGJveC5oZWlnaHQsIGRpciksCiAgICAgICAgICAgICAgICBheCA9IHh5LnggLSBveCwKICAgICAgICAgICAgICAgIGF5ID0geHkueSAtIG95LAogICAgICAgICAgICAgICAgeCA9IGF4ICsgYXkgKiB4c2t5LAogICAgICAgICAgICAgICAgeSA9IChheSArIHl0KSAqIHlzYzsKICAgICAgICAgICAgcmV0dXJuIHt4OiBveCArIHgsIHk6IG95ICsgeX07CiAgICAgICAgfTsKCiAgICAgICAgc2hvd1BsYW5lKCdwa3QnLCBib3gsIC0xKTsKICAgICAgICBzaG93UGxhbmUoJ29wdCcsIGJveCwgMSk7CiAgICAgICAgb2JUcmFuc2l0aW9uTm9kZXMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b05vcm1hbFZpZXcoKSB7CiAgICAgICAgeGZmbiA9IG51bGw7CgogICAgICAgIGhpZGVQbGFuZSgncGt0Jyk7CiAgICAgICAgaGlkZVBsYW5lKCdvcHQnKTsKICAgICAgICBvYlRyYW5zaXRpb25Ob2RlcygpOwoKICAgICAgICByZW1vdmVQbGFuZXMoKTsKCiAgICAgICAgLy8gcmVzdG9yZSBub2RlIGxvY2sgc3RhdGUKICAgICAgICBhcGkubm9kZUxvY2sob2xkTm9kZUxvY2spOwogICAgICAgIGFwaS5vcGFjaWZ5TWFwKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9iVHJhbnNpdGlvbk5vZGVzKCkgewogICAgICAgIC8vIHJldHVybiB0aGUgZGlyZWN0aW9uIGZvciB0aGUgbm9kZQogICAgICAgIC8vIC0xIGZvciBwa3QgbGF5ZXIsIDEgZm9yIG9wdGljYWwgbGF5ZXIKICAgICAgICBmdW5jdGlvbiBkaXIoZCkgewogICAgICAgICAgICByZXR1cm4gYXBpLmluTGF5ZXIoZCwgJ3BrdCcpID8gLTEgOiAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKHhmZm4pIHsKICAgICAgICAgICAgYXBpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgdmFyIG9sZHh5ID0ge3g6IGQueCwgeTogZC55fSwKICAgICAgICAgICAgICAgICAgICBjb29yZHMgPSB4ZmZuKG9sZHh5LCBkaXIoZCkpOwogICAgICAgICAgICAgICAgZC5vbGR4eSA9IG9sZHh5OwogICAgICAgICAgICAgICAgZC5weCA9IGQueCA9IGNvb3Jkcy54OwogICAgICAgICAgICAgICAgZC5weSA9IGQueSA9IGNvb3Jkcy55OwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcGkubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkID0gZC5vbGR4eSB8fCB7eDogZC54LCB5OiBkLnl9OwogICAgICAgICAgICAgICAgZC5weCA9IGQueCA9IG9sZC54OwogICAgICAgICAgICAgICAgZC5weSA9IGQueSA9IG9sZC55OwogICAgICAgICAgICAgICAgZGVsZXRlIGQub2xkeHk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgYXBpLm5vZGUoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKHRpbWUpCiAgICAgICAgICAgIC5hdHRyKGFwaS50aWNrU3R1ZmYubm9kZUF0dHIpOwogICAgICAgIGFwaS5saW5rKCkudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbih0aW1lKQogICAgICAgICAgICAuY2FsbChhcGkuY2FsY0xpbmtQb3MpCiAgICAgICAgICAgIC5hdHRyKGFwaS50aWNrU3R1ZmYubGlua0F0dHIpCiAgICAgICAgICAgIC5jYWxsKGFwaS5hcHBseU51bUxpbmtMYWJlbHMpOwogICAgICAgIGFwaS5saW5rTGFiZWwoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmR1cmF0aW9uKHRpbWUpCiAgICAgICAgICAgIC5hdHRyKGFwaS50aWNrU3R1ZmYubGlua0xhYmVsQXR0cik7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd1BsYW5lKHRhZywgYm94LCBkaXIpIHsKICAgICAgICAvLyBzZXQgYm94IG9yaWdpbiBhdCBjZW50ZXIuLgogICAgICAgIGJveC54ID0gLWJveC53aWR0aC8yOwogICAgICAgIGJveC55ID0gLWJveC5oZWlnaHQvMjsKCiAgICAgICAgcGxhbmVbdGFnXS5zZWxlY3QoJ3JlY3QnKQogICAgICAgICAgICAuYXR0cihib3gpCiAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMCkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuZHVyYXRpb24odGltZSkKICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKQogICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgb2JYZm9ybShib3guaGVpZ2h0LCBkaXIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlUGxhbmUodGFnKSB7CiAgICAgICAgcGxhbmVbdGFnXS5zZWxlY3QoJ3JlY3QnKQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbih0aW1lKQogICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDApCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBub1hmb3JtKCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc2VydFBsYW5lcyhveCwgb3kpIHsKICAgICAgICBmdW5jdGlvbiBpbnModGFnKSB7CiAgICAgICAgICAgIHZhciBpZCA9IHBsYW5lSWQodGFnKSwKICAgICAgICAgICAgICAgIGcgPSBhcGkuem9vbUxheWVyKCkuaW5zZXJ0KCdnJywgJyN0b3BvLUcnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIGlkKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBzdXMudHJhbnNsYXRlKG94LG95KSk7CiAgICAgICAgICAgIGcuYXBwZW5kKCdyZWN0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgZmlsbFt0YWddKQogICAgICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwKTsKICAgICAgICAgICAgcGxhbmVbdGFnXSA9IGc7CiAgICAgICAgfQogICAgICAgIGlucygnb3B0Jyk7CiAgICAgICAgaW5zKCdwa3QnKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVQbGFuZXMoKSB7CiAgICAgICAgZnVuY3Rpb24gcmVtKHRhZykgewogICAgICAgICAgICB2YXIgaWQgPSBwbGFuZUlkKHRhZyk7CiAgICAgICAgICAgIGFwaS56b29tTGF5ZXIoKS5zZWxlY3QoJyMnK2lkKQogICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmR1cmF0aW9uKHRpbWUgKyA1MCkKICAgICAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgICAgICAgICAgZGVsZXRlIHBsYW5lW3RhZ107CiAgICAgICAgfQogICAgICAgIHJlbSgnb3B0Jyk7CiAgICAgICAgcmVtKCdwa3QnKTsKICAgIH0KCgovLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gPT09IE1PRFVMRSBERUZJTklUSU9OID09PQoKYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb09ibGlxdWVTZXJ2aWNlJywKICAgIFsnJGxvZycsICdGblNlcnZpY2UnLCAnU3ZnVXRpbFNlcnZpY2UnLCAnRmxhc2hTZXJ2aWNlJywKCiAgICBmdW5jdGlvbiAoXyRsb2dfLCBfZnNfLCBfc3VzXywgX2ZsYXNoXykgewogICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgZnMgPSBfZnNfOwogICAgICAgIHN1cyA9IF9zdXNfOwogICAgICAgIGZsYXNoID0gX2ZsYXNoXzsKCiAgICAgICAgZnVuY3Rpb24gaW5pdE9ibGlxdWUoX2FwaV8pIHsKICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkZXN0cm95T2JsaXF1ZSgpIHsgfQoKICAgICAgICBmdW5jdGlvbiB0b2dnbGVPYmxpcXVlKCkgewogICAgICAgICAgICBvYmxpcXVlID0gIW9ibGlxdWU7CiAgICAgICAgICAgIGlmIChvYmxpcXVlKSB7CiAgICAgICAgICAgICAgICBhcGkuZm9yY2UoKS5zdG9wKCk7CiAgICAgICAgICAgICAgICBmbGFzaC5mbGFzaCgnT2JsaXF1ZSB2aWV3Jyk7CiAgICAgICAgICAgICAgICB0b09ibGlxdWVWaWV3KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmbGFzaC5mbGFzaCgnTm9ybWFsIHZpZXcnKTsKICAgICAgICAgICAgICAgIHRvTm9ybWFsVmlldygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBpbml0T2JsaXF1ZTogaW5pdE9ibGlxdWUsCiAgICAgICAgICAgIGRlc3Ryb3lPYmxpcXVlOiBkZXN0cm95T2JsaXF1ZSwKCiAgICAgICAgICAgIGlzT2JsaXF1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JsaXF1ZTsgfSwKICAgICAgICAgICAgdG9nZ2xlT2JsaXF1ZTogdG9nZ2xlT2JsaXF1ZQogICAgICAgIH07CiAgICB9XSk7Cn0oKSk7Cozc71bd1wYAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwbUAAQAY6cMCoBzbAqAdglSsf9fZqYWFnPo6ogBAFjtheAAABAQgKAKNfFQBNphCM3O9WW9oGAJwwAACcMAAAaPcoH9LFCAAnrR4TCABFADCO7g9AAEAGjHPAqAdgwKgHNh/1lSqTpynQxukAyYAYAUXAZwAAAQEICgBNphEAo18NSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDEyMjcyDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IE92ZXJsYXkgTW9kdWxlLgoKIFByb3ZpZGVzIG92ZXJsYXkgY2FwYWJpbGl0aWVzLCBhbGxvd2luZyBPTk9TIGFwcHMgdG8gcHJvdmlkZSBhZGRpdGlvbmFsCiBjdXN0b20gZGF0YS9iZWhhdmlvciBmb3IgdGhlIHRvcG9sb2d5IHZpZXcuCgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gY29uc3RhbnRzCiAgICB2YXIgdG9zID0gJ1RvcG9PdmVybGF5U2VydmljZTogJzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgJHRpbWVvdXQsIGZzLCBncywgd3NzLCBucywgdHNzLCB0cHMsIGFwaTsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIG92ZXJsYXlzID0ge30sCiAgICAgICAgY3VycmVudCA9IG51bGwsCiAgICAgICAgcmVzZXQgPSB0cnVlOwoKICAgIGZ1bmN0aW9uIGVycm9yKGZuLCBtc2cpIHsKICAgICAgICAkbG9nLmVycm9yKHRvcyArIGZuICsgJygpOiAnICsgbXNnKTsKICAgIH0KCiAgICBmdW5jdGlvbiB3YXJuKGZuLCBtc2cpIHsKICAgICAgICAkbG9nLndhcm4odG9zICsgZm4gKyAnKCk6ICcgKyBtc2cpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1rR2x5cGhJZChvaWQsIGdpZCkgewogICAgICAgIHJldHVybiAoZ2lkWzBdID09PSAnKicpID8gb2lkICsgJy0nICsgZ2lkLnNsaWNlKDEpIDogZ2lkOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUdseXBocyhvKSB7CiAgICAgICAgdmFyIGdkYXRhID0gZnMuaXNPKG8uZ2x5cGhzKSwKICAgICAgICAgICAgb2lkID0gby5vdmVybGF5SWQsCiAgICAgICAgICAgIGdpZCA9IG8uZ2x5cGhJZCB8fCAndW5rbm93bicsCiAgICAgICAgICAgIGRhdGEgPSB7fSwKICAgICAgICAgICAgbm90ZSA9IFtdOwoKICAgICAgICBvLl9nbHlwaElkID0gbWtHbHlwaElkKG9pZCwgZ2lkKTsKCiAgICAgICAgby5ta0dpZCA9IGZ1bmN0aW9uIChnKSB7CiAgICAgICAgICAgIHJldHVybiBta0dseXBoSWQob2lkLCBnKTsKICAgICAgICB9OwogICAgICAgIG8ubWtJZCA9IGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgIHJldHVybiBvaWQgKyAnLScgKyBzOwogICAgICAgIH07CgogICAgICAgIC8vIHByb2Nlc3MgZ2x5cGhzIGlmIGRlZmluZWQKICAgICAgICBpZiAoZ2RhdGEpIHsKICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGdkYXRhLCBmdW5jdGlvbiAodmFsdWUsIGtleSkgewogICAgICAgICAgICAgICAgdmFyIGZ1bGxrZXkgPSBvaWQgKyAnLScgKyBrZXk7CiAgICAgICAgICAgICAgICBkYXRhWydfJyArIGZ1bGxrZXldID0gdmFsdWUudmI7CiAgICAgICAgICAgICAgICBkYXRhW2Z1bGxrZXldID0gdmFsdWUuZDsKICAgICAgICAgICAgICAgIG5vdGUucHVzaCgnKicgKyBrZXkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZ3MucmVnaXN0ZXJHbHlwaHMoZGF0YSk7CiAgICAgICAgICAgICRsb2cuZGVidWcoJ3JlZ2lzdGVyZWQgb3ZlcmxheSBnbHlwaHM6Jywgb2lkLCBub3RlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVnaXN0ZXIob3ZlcmxheSkgewogICAgICAgIHZhciByID0gJ3JlZ2lzdGVyJywKICAgICAgICAgICAgb3ZlciA9IGZzLmlzTyhvdmVybGF5KSwKICAgICAgICAgICAga2IgPSBvdmVyID8gZnMuaXNPKG92ZXJsYXkua2V5QmluZGluZ3MpIDogbnVsbCwKICAgICAgICAgICAgaWQgPSBvdmVyID8gb3Zlci5vdmVybGF5SWQgOiAnJzsKCiAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICByZXR1cm4gZXJyb3IociwgJ25vdCBhIHJlY29nbml6ZWQgb3ZlcmxheScpOwogICAgICAgIH0KICAgICAgICBpZiAob3ZlcmxheXNbaWRdKSB7CiAgICAgICAgICAgIHJldHVybiB3YXJuKHIsICdhbHJlYWR5IHJlZ2lzdGVyZWQ6ICInICsgaWQgKyAnIicpOwogICAgICAgIH0KICAgICAgICBvdmVybGF5c1tpZF0gPSBvdmVybGF5OwogICAgICAgIGhhbmRsZUdseXBocyhvdmVybGF5KTsKCiAgICAgICAgaWYgKGtiKSB7CiAgICAgICAgICAgIGlmICghZnMuaXNBKGtiLl9rZXlPcmRlcikpIHsKICAgICAgICAgICAgICAgIHdhcm4ociwgJ25vIF9rZXlPcmRlciBhcnJheSBkZWZpbmVkIG9uIGtleUJpbmRpbmdzJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBrYi5fa2V5T3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICAgIGlmIChrICE9PSAnLScgJiYgIWtiW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4ociwgJ25vICInICsgayArICciIHByb3BlcnR5IGRlZmluZWQgb24ga2V5QmluZGluZ3MnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGxvZy5kZWJ1Zyh0b3MgKyAncmVnaXN0ZXJlZCBvdmVybGF5OiAnICsgaWQsIG92ZXJsYXkpOwogICAgfQoKICAgIC8vIHJldHVybnMgdGhlIGxpc3Qgb2Ygb3ZlcmxheSBpZGVudGlmaWVycwogICAgZnVuY3Rpb24gbGlzdCgpIHsKICAgICAgICByZXR1cm4gZDMubWFwKG92ZXJsYXlzKS5rZXlzKCk7CiAgICB9CgogICAgLy8gYWRkIGEgcmFkaW8gYnV0dG9uIGZvciBlYWNoIHJlZ2lzdGVyZWQgb3ZlcmxheQogICAgLy8gcmV0dXJuIGFuIG92ZXJsYXkgaWQgdG8gaW5kZXggbWFwCiAgICBmdW5jdGlvbiBhdWdtZW50UmJzZXQocnNldCwgc3dpdGNoRm4pIHsKICAgICAgICB2YXIgbWFwID0ge30sCiAgICAgICAgICAgIGlkeCA9IDE7CgogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChvdmVybGF5cywgZnVuY3Rpb24gKG92KSB7CiAgICAgICAgICAgIHJzZXQucHVzaCh7CiAgICAgICAgICAgICAgICBnaWQ6IG92Ll9nbHlwaElkLAogICAgICAgICAgICAgICAgdG9vbHRpcDogKG92LnRvb2x0aXAgfHwgJyhubyB0b29sdGlwKScpLAogICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0YlNlbGVjdGlvbihvdi5vdmVybGF5SWQsIHN3aXRjaEZuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG1hcFtvdi5vdmVybGF5SWRdID0gaWR4Kys7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICAvLyBhbiBvdmVybGF5IHdhcyBzZWxlY3RlZCB2aWEgdG9vbGJhciByYWRpbyBidXR0b24gcHJlc3MgZnJvbSB1c2VyCiAgICBmdW5jdGlvbiB0YlNlbGVjdGlvbihpZCwgc3dpdGNoRm4pIHsKICAgICAgICB2YXIgc2FtZSA9IGN1cnJlbnQgJiYgY3VycmVudC5vdmVybGF5SWQgPT09IGlkLAogICAgICAgICAgICBwYXlsb2FkID0ge30sCiAgICAgICAgICAgIGFjdGlvbnM7CgogICAgICAgIGZ1bmN0aW9uIGRvb3Aob3ApIHsKICAgICAgICAgICAgdmFyIG9pZCA9IGN1cnJlbnQub3ZlcmxheUlkOwogICAgICAgICAgICAkbG9nLmRlYnVnKCdPdmVybGF5OicsIG9wLCBvaWQpOwogICAgICAgICAgICBjdXJyZW50W29wXSgpOwogICAgICAgICAgICBwYXlsb2FkW29wXSA9IG9pZDsKICAgICAgICB9CgogICAgICAgIGlmIChyZXNldCB8fCAhc2FtZSkgewogICAgICAgICAgICByZXNldCA9IGZhbHNlOwogICAgICAgICAgICBjdXJyZW50ICYmIGRvb3AoJ2RlYWN0aXZhdGUnKTsKICAgICAgICAgICAgY3VycmVudCA9IG92ZXJsYXlzW2lkXTsKICAgICAgICAgICAgY3VycmVudCAmJiBkb29wKCdhY3RpdmF0ZScpOwogICAgICAgICAgICBhY3Rpb25zID0gY3VycmVudCAmJiBmcy5pc08oY3VycmVudC5rZXlCaW5kaW5ncyk7CiAgICAgICAgICAgIHN3aXRjaEZuKGlkLCBhY3Rpb25zKTsKCiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3RvcG9TZWxlY3RPdmVybGF5JywgcGF5bG9hZCk7CgogICAgICAgICAgICAvLyBFbnN1cmUgc3VtbWFyeSBhbmQgZGV0YWlscyBwYW5lbHMgYXJlIHVwZGF0ZWQgaW1tZWRpYXRlbHkuLgogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0U3VtbWFyeScpOwogICAgICAgICAgICB0c3MudXBkYXRlRGV0YWlsKCk7CiAgICAgICAgfQogICAgfQoKICAgIHZhciBjb3JlQnV0dG9ucyA9IHsKICAgICAgICBzaG93RGV2aWNlVmlldzogewogICAgICAgICAgICBnaWQ6ICdzd2l0Y2gnLAogICAgICAgICAgICB0dDogJ1Nob3cgRGV2aWNlIFZpZXcnLAogICAgICAgICAgICBwYXRoOiAnZGV2aWNlJwogICAgICAgIH0sCiAgICAgICAgc2hvd0Zsb3dWaWV3OiB7CiAgICAgICAgICAgIGdpZDogJ2Zsb3dUYWJsZScsCiAgICAgICAgICAgIHR0OiAnU2hvdyBGbG93IFZpZXcgZm9yIHRoaXMgRGV2aWNlJywKICAgICAgICAgICAgcGF0aDogJ2Zsb3cnCiAgICAgICAgfSwKICAgICAgICBzaG93UG9ydFZpZXc6IHsKICAgICAgICAgICAgZ2lkOiAncG9ydFRhYmxlJywKICAgICAgICAgICAgdHQ6ICdTaG93IFBvcnQgVmlldyBmb3IgdGhpcyBEZXZpY2UnLAogICAgICAgICAgICBwYXRoOiAncG9ydCcKICAgICAgICB9LAogICAgICAgIHNob3dHcm91cFZpZXc6IHsKICAgICAgICAgICAgZ2lkOiAnZ3JvdXBUYWJsZScsCiAgICAgICAgICAgIHR0OiAnU2hvdyBHcm91cCBWaWV3IGZvciB0aGlzIERldmljZScsCiAgICAgICAgICAgIHBhdGg6ICdncm91cCcKICAgICAgICB9LAogICAgICAgIHNob3dNZXRlclZpZXc6IHsKICAgICAgICAgICAgZ2lkOiAnbWV0ZXJUYWJsZScsCiAgICAgICAgICAgIHR0OiAnU2hvdyBNZXRlciBWaWV3IGZvciB0aGlzIERldmljZScsCiAgICAgICAgICAgIHBhdGg6ICdtZXRlcicKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHJldHJpZXZlcyBhIGJ1dHRvbiBkZWZpbml0aW9uIGZyb20gdGhlIGN1cnJlbnQgb3ZlcmxheSBhbmQgZ2VuZXJhdGVzCiAgICAvLyAgYSBidXR0b24gZGVzY3JpcHRvciB0byBiZSBhZGRlZCB0byB0aGUgcGFuZWwsIHdpdGggdGhlIGRhdGEgYmFrZWQgaW4KICAgIGZ1bmN0aW9uIF9nZXRCdXR0b25EZWYoaWQsIGRhdGEpIHsKICAgICAgICB2YXIgYnRucyA9IGN1cnJlbnQgJiYgY3VycmVudC5idXR0b25zLAogICAgICAgICAgICBiID0gYnRucyAmJiBidG5zW2lkXSwKICAgICAgICAgICAgY2IgPSBmcy5pc0YoYi5jYiksCiAgICAgICAgICAgIGYgPSBjYiA/IGZ1bmN0aW9uICgpIHsgY2IoZGF0YSk7IH0gOiBmdW5jdGlvbiAoKSB7fTsKCiAgICAgICAgcmV0dXJuIGIgPyB7CiAgICAgICAgICAgIGlkOiBjdXJyZW50Lm1rSWQoaWQpLAogICAgICAgICAgICBnaWQ6IGN1cnJlbnQubWtHaWQoYi5naWQpLAogICAgICAgICAgICB0dDogYi50dCwKICAgICAgICAgICAgY2I6IGYKICAgICAgICB9IDogbnVsbDsKICAgIH0KCiAgICAvLyBpbnN0YWxsIGNvcmUgYnV0dG9ucywgYW5kIGluY2x1ZGUgYW55IGFkZGl0aW9uYWwgZnJvbSB0aGUgY3VycmVudCBvdmVybGF5CiAgICBmdW5jdGlvbiBpbnN0YWxsQnV0dG9ucyhidXR0b25zLCBkYXRhLCBkZXZJZCkgewogICAgICAgIGJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgdmFyIGJ0biA9IGNvcmVCdXR0b25zW2lkXSwKICAgICAgICAgICAgICAgIGdpZCA9IGJ0biAmJiBidG4uZ2lkLAogICAgICAgICAgICAgICAgdHQgPSBidG4gJiYgYnRuLnR0LAogICAgICAgICAgICAgICAgcGF0aCA9IGJ0biAmJiBidG4ucGF0aDsKCiAgICAgICAgICAgIGlmIChidG4pIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgICAgIGlkOiAnY29yZS0nICsgaWQsCiAgICAgICAgICAgICAgICAgICAgZ2lkOiBnaWQsCiAgICAgICAgICAgICAgICAgICAgdHQ6IHR0LAogICAgICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IG5zLm5hdlRvKHBhdGgsIHtkZXZJZDogZGV2SWQgfSk7IH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGJ0biA9IF9nZXRCdXR0b25EZWYoaWQsIGRhdGEpKSB7CiAgICAgICAgICAgICAgICB0cHMuYWRkQWN0aW9uKGJ0bik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGREZXRhaWxCdXR0b24oaWQpIHsKICAgICAgICB2YXIgYiA9IF9nZXRCdXR0b25EZWYoaWQpOwogICAgICAgIGlmIChiKSB7CiAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgaWQ6IGN1cnJlbnQubWtJZChpZCksCiAgICAgICAgICAgICAgICBnaWQ6IGN1cnJlbnQubWtHaWQoYi5naWQpLAogICAgICAgICAgICAgICAgY2I6IGIuY2IsCiAgICAgICAgICAgICAgICB0dDogYi50dAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEhvb2tzIGZvciBvdmVybGF5cwoKICAgIGZ1bmN0aW9uIF9ob29rKHgpIHsKICAgICAgICB2YXIgaCA9IGN1cnJlbnQgJiYgY3VycmVudC5ob29rczsKICAgICAgICByZXR1cm4gaCAmJiBmcy5pc0YoaFt4XSk7CiAgICB9CgogICAgZnVuY3Rpb24gZXNjYXBlSG9vaygpIHsKICAgICAgICB2YXIgZWggPSBfaG9vaygnZXNjYXBlJyk7CiAgICAgICAgcmV0dXJuIGVoID8gZWgoKSA6IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGVtcHR5U2VsZWN0SG9vaygpIHsKICAgICAgICB2YXIgY2IgPSBfaG9vaygnZW1wdHknKTsKICAgICAgICBjYiAmJiBjYigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNpbmdsZVNlbGVjdEhvb2soZGF0YSkgewogICAgICAgIHZhciBjYiA9IF9ob29rKCdzaW5nbGUnKTsKICAgICAgICBjYiAmJiBjYihkYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtdWx0aVNlbGVjdEhvb2soc2VsZWN0T3JkZXIpIHsKICAgICAgICB2YXIgY2IgPSBfaG9vaygnbXVsdGknKTsKICAgICAgICBjYiAmJiBjYihzZWxlY3RPcmRlcik7CiAgICB9CgogICAgZnVuY3Rpb24gbW91c2VPdmVySG9vayh3aGF0KSB7CiAgICAgICAgdmFyIGNiID0gX2hvb2soJ21vdXNlb3ZlcicpOwogICAgICAgIGNiICYmIGNiKHdoYXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlT3V0SG9vaygpIHsKICAgICAgICB2YXIgY2IgPSBfaG9vaygnbW91c2VvdXQnKTsKICAgICAgICBjYiAmJiBjYigpOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEV2ZW50IChmcm9tIHNlcnZlcikgSGFuZGxlcnMKCiAgICBmdW5jdGlvbiBzZXRBcGkoX2FwaV8sIF90c3NfKSB7CiAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgdHNzID0gX3Rzc187CiAgICB9CgogICAgLy9wcm9jZXNzIGhpZ2hsaWdodCBldmVudCB3aXRoIG9wdGlvbmFsIGRlbGF5CiAgICBmdW5jdGlvbiBzaG93SGlnaGxpZ2h0cyhkYXRhKSB7CiAgICAgICAgZnVuY3Rpb24gZG9IaWdobGlnaHQoKSB7CiAgICAgICAgICAgIF9zaG93SGlnaGxpZ2h0cyhkYXRhKTsKICAgICAgICB9CgogICAgICAgIGlmIChkYXRhLmRlbGF5KSB7CiAgICAgICAgICAgICR0aW1lb3V0KGRvSGlnaGxpZ2h0LCBkYXRhLmRlbGF5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb0hpZ2hsaWdodCgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfc2hvd0hpZ2hsaWdodHMoZGF0YSkgewogICAgICAgIHZhciBsZXNzOwoKICAgICAgICAvKgogICAgICAgICAgIEFQSSB0byB0b3BvRm9yY2UKICAgICAgICAgICAgIGNsZWFyTGlua1RyYWZmaWNTdHlsZSgpCiAgICAgICAgICAgICByZW1vdmVMaW5rTGFiZWxzKCkKICAgICAgICAgICAgIGZpbmRMaW5rQnlJZCggaWQgKQogICAgICAgICAgICAgZmluZE5vZGVCeUlkKCBpZCApCiAgICAgICAgICAgICB1cGRhdGVMaW5rcygpCiAgICAgICAgICAgICB1cGRhdGVOb2RlcygpCiAgICAgICAgICAgICBzdXBMYXllcnMoIGJvb2wsIFtsZXNzXSApCiAgICAgICAgICAgICB1bnN1cE5vZGUoIGlkLCBbbGVzc10gKQogICAgICAgICAgICAgdW5zdXBMaW5rKCBrZXksIFtsZXNzXSApCiAgICAgICAgICovCgogICAgICAgIGFwaS5jbGVhck5vZGVEZWNvKCk7CiAgICAgICAgYXBpLnJlbW92ZU5vZGVCYWRnZXMoKTsKICAgICAgICBhcGkuY2xlYXJMaW5rVHJhZmZpY1N0eWxlKCk7CiAgICAgICAgYXBpLnJlbW92ZUxpbmtMYWJlbHMoKTsKCiAgICAgICAgLy8gaGFuZGxlIGVsZW1lbnQgc3VwcHJlc3Npb24KICAgICAgICBpZiAoZGF0YS5zdWJkdWUpIHsKICAgICAgICAgICAgbGVzcyA9IGRhdGEuc3ViZHVlID09PSAnbWluJzsKICAgICAgICAgICAgYXBpLnN1cExheWVycyh0cnVlLCBsZXNzKTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBpLnN1cExheWVycyhmYWxzZSk7CiAgICAgICAgICAgIGFwaS5zdXBMYXllcnMoZmFsc2UsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgZGF0YS5ob3N0cy5mb3JFYWNoKGZ1bmN0aW9uIChob3N0KSB7CiAgICAgICAgICAgIHZhciBoZGF0YSA9IGFwaS5maW5kTm9kZUJ5SWQoaG9zdC5pZCksCiAgICAgICAgICAgICAgICBiYWRnZURhdGEgPSBob3N0LmJhZGdlIHx8IG51bGw7CgogICAgICAgICAgICBpZiAoaGRhdGEgJiYgIWhkYXRhLmVsLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgIGhkYXRhLmJhZGdlID0gYmFkZ2VEYXRhOwogICAgICAgICAgICAgICAgaWYgKCFob3N0LnN1YmR1ZSkgewogICAgICAgICAgICAgICAgICAgIGFwaS51bnN1cE5vZGUoaGRhdGEuaWQsIGxlc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVE9ETzogZnVydGhlciBoaWdobGlnaHRpbmc/CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZGF0YS5kZXZpY2VzLmZvckVhY2goZnVuY3Rpb24gKGRldmljZSkgewogICAgICAgICAgICB2YXIgZGRhdGEgPSBhcGkuZmluZE5vZGVCeUlkKGRldmljZS5pZCksCiAgICAgICAgICAgICAgICBiYWRnZURhdGEgPSBkZXZpY2UuYmFkZ2UgfHwgbnVsbDsKCiAgICAgICAgICAgIGlmIChkZGF0YSAmJiAhZGRhdGEuZWwuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgZGRhdGEuYmFkZ2UgPSBiYWRnZURhdGE7CiAgICAgICAgICAgICAgICBpZiAoIWRldmljZS5zdWJkdWUpIHsKICAgICAgICAgICAgICAgICAgICBhcGkudW5zdXBOb2RlKGRkYXRhLmlkLCBsZXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXIgaGlnaGxpZ2h0aW5nPwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGRhdGEubGlua3MuZm9yRWFjaChmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICB2YXIgbGRhdGEgPSBhcGkuZmluZExpbmtCeUlkKGxpbmsuaWQpLAogICAgICAgICAgICAgICAgbGFiID0gbGluay5sYWJlbCwKICAgICAgICAgICAgICAgIHVuaXRzLCBwb3J0Y2xzLCBtYWduaXR1ZGU7CiAgICAgICAgICAgIGlmIChsZGF0YSAmJiAhbGRhdGEuZWwuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgaWYgKCFsaW5rLnN1YmR1ZSkgewogICAgICAgICAgICAgICAgICAgIGFwaS51bnN1cExpbmsobGRhdGEua2V5LCBsZXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxkYXRhLmVsLmNsYXNzZWQobGluay5jc3MsIHRydWUpOwogICAgICAgICAgICAgICAgbGRhdGEubGFiZWwgPSBsYWI7CgogICAgICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSBwdWxsZWQgb3V0IGludG8gdHJhZmZpYyBvdmVybGF5CiAgICAgICAgICAgICAgICAvLyBpbmplY3QgYWRkaXRpb25hbCBzdHlsaW5nIGZvciBwb3J0LWJhc2VkIHRyYWZmaWMKICAgICAgICAgICAgICAgIGlmIChmcy5lbmRzV2l0aChsYWIsICdicHMnKSkgewogICAgICAgICAgICAgICAgICAgIHVuaXRzID0gbGFiLnN1YnN0cmluZyhsYWIubGVuZ3RoLTQpOwogICAgICAgICAgICAgICAgICAgIHBvcnRjbHMgPSAncG9ydC10cmFmZmljLScgKyB1bml0czsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIEdCcHMKICAgICAgICAgICAgICAgICAgICBpZiAodW5pdHMuc3Vic3RyaW5nKDAsMSkgPT09ICdHJykgewogICAgICAgICAgICAgICAgICAgICAgICBtYWduaXR1ZGUgPSBmcy5wYXJzZUJpdFJhdGUobGFiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hZ25pdHVkZSA+PSA5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Y2xzICs9ICctY2hva2VkJwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxkYXRhLmVsLmNsYXNzZWQocG9ydGNscywgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgYXBpLnVwZGF0ZU5vZGVzKCk7CiAgICAgICAgYXBpLnVwZGF0ZUxpbmtzKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb092ZXJsYXlTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnJHRpbWVvdXQnLCAnRm5TZXJ2aWNlJywgJ0dseXBoU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywKICAgICAgICAgICAgJ05hdlNlcnZpY2UnLCAnVG9wb1BhbmVsU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kdGltZW91dF8sIF9mc18sIF9nc18sIF93c3NfLCBfbnNfLCBfdHBzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkdGltZW91dCA9IF8kdGltZW91dF87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgZ3MgPSBfZ3NfOwogICAgICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwogICAgICAgICAgICB0cHMgPSBfdHBzXzsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICByZWdpc3RlcjogcmVnaXN0ZXIsCiAgICAgICAgICAgICAgICBzZXRBcGk6IHNldEFwaSwKICAgICAgICAgICAgICAgIGxpc3Q6IGxpc3QsCiAgICAgICAgICAgICAgICBhdWdtZW50UmJzZXQ6IGF1Z21lbnRSYnNldCwKICAgICAgICAgICAgICAgIG1rR2x5cGhJZDogbWtHbHlwaElkLAogICAgICAgICAgICAgICAgdGJTZWxlY3Rpb246IHRiU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgaW5zdGFsbEJ1dHRvbnM6IGluc3RhbGxCdXR0b25zLAogICAgICAgICAgICAgICAgYWRkRGV0YWlsQnV0dG9uOiBhZGREZXRhaWxCdXR0b24sCiAgICAgICAgICAgICAgICByZXNldE9uVG9vbGJhckRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsgcmVzZXQgPSB0cnVlOyB9LAogICAgICAgICAgICAgICAgaG9va3M6IHsKICAgICAgICAgICAgICAgICAgICBlc2NhcGU6IGVzY2FwZUhvb2ssCiAgICAgICAgICAgICAgICAgICAgZW1wdHlTZWxlY3Q6IGVtcHR5U2VsZWN0SG9vaywKICAgICAgICAgICAgICAgICAgICBzaW5nbGVTZWxlY3Q6IHNpbmdsZVNlbGVjdEhvb2ssCiAgICAgICAgICAgICAgICAgICAgbXVsdGlTZWxlY3Q6IG11bHRpU2VsZWN0SG9vaywKICAgICAgICAgICAgICAgICAgICBtb3VzZU92ZXI6IG1vdXNlT3Zlckhvb2ssCiAgICAgICAgICAgICAgICAgICAgbW91c2VPdXQ6IG1vdXNlT3V0SG9vawogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICBzaG93SGlnaGxpZ2h0czogc2hvd0hpZ2hsaWdodHMKICAgICAgICAgICAgfQogICAgICAgIH1dKTsKCn0oKSk7jNzvVqPaBgCSAgAAkgIAAAgAJ60eE2j3KB/SxQgARQAChHBuQABABjgfwKgHNsCoB2CVKx/19mphYWc+jqiAGAWkGe0AAAEBCAoAo18VAE2mEEdFVCAvb25vcy91aS9hcHAvdmlldy90b3BvL3RvcG9Ub29sYmFyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WqtoGAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0t/BAAEAG8uzAqAc2wKgHYJUqH/XG6QDJk6daKoAQBT1w3gAAAQEICgCjXxUATaYRjNzvVvrcBgDvBAAA7wQAAGj3KB/SxQgAJ60eEwgARQAE4dU3QABABtD4wKgHYMCoBzYf9ZUiQcEvvVh6mZ+AGAIUlLoAAAEBCAoATaYRAKNfC0hUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiB0ZXh0L2Nzcw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KNDI5DQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb29sdGlwIFNlcnZpY2UgLS0gQ1NTIGZpbGUKICovCgojdG9vbHRpcCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDgwJTsKICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgcGFkZGluZzogNXB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgei1pbmRleDogNTAwMDsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogY29sb3JzIHN1YmplY3QgdG8gY2hhbmdlICovCgoubGlnaHQgI3Rvb2x0aXAgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKICAgIGNvbG9yOiAjNDQ0OwogICAgYm9yZGVyLWNvbG9yOiAjY2NjOwp9CgouZGFyayAjdG9vbHRpcCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTUxNTE1OwogICAgY29sb3I6ICNCMkIyQjI7CiAgICBib3JkZXItY29sb3I6ICMyNTI1MjU7Cn0NCozc71Yz3QYAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoG38UAAQAbwnsCoBzbAqAdglSof9cbpAMmTp1oqgBgFPQ2jAAABAQgKAKNfFQBNphFHRVQgL29ub3MvdWkvYXBwL3ZpZXcvZGV2aWNlL2RldmljZS5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVtXjBgDdMAAA3TAAAGj3KB/SxQgAJ60eEwgARQAwz+4YQABABowpwKgHYMCoBzYf9ZUqk6daKsbpAxaAGAFPwKgAAAEBCAoATaYRAKNfFUhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMjMzNw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSwyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIERldmljZSBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICRzY29wZSwgJGxvYywgZnMsIG1hc3QsIHBzLCB3c3MsIGlzLCBucywga3M7CgogICAgLy8gaW50ZXJuYWwgc3RhdGUKICAgIHZhciBkZXRhaWxzUGFuZWwsCiAgICAgICAgcFN0YXJ0WSwKICAgICAgICBwSGVpZ2h0LAogICAgICAgIHRvcCwKICAgICAgICBib3R0b20sCiAgICAgICAgaWNvbkRpdiwKICAgICAgICB3U2l6ZSwKICAgICAgICBlZGl0aW5nTmFtZSA9IGZhbHNlOwoKICAgIC8vIGNvbnN0YW50cwogICAgdmFyIHRvcFBkZyA9IDEzLAogICAgICAgIGN0bnJQZGcgPSAyNCwKICAgICAgICBzY3JvbGxTaXplID0gMTcsCiAgICAgICAgcG9ydHNUYmxQZGcgPSA1MCwKCiAgICAgICAgcE5hbWUgPSAnZGV2aWNlLWRldGFpbHMtcGFuZWwnLAogICAgICAgIGRldGFpbHNSZXEgPSAnZGV2aWNlRGV0YWlsc1JlcXVlc3QnLAogICAgICAgIGRldGFpbHNSZXNwID0gJ2RldmljZURldGFpbHNSZXNwb25zZScsCiAgICAgICAgbmFtZUNoYW5nZVJlcSA9ICdkZXZpY2VOYW1lQ2hhbmdlUmVxdWVzdCcsCiAgICAgICAgbmFtZUNoYW5nZVJlc3AgPSAnZGV2aWNlTmFtZUNoYW5nZVJlc3BvbnNlJywKCiAgICAgICAgcHJvcE9yZGVyID0gWwogICAgICAgICAgICAnaWQnLCAndHlwZScsICdtYXN0ZXJpZCcsICdjaGFzc2lzaWQnLAogICAgICAgICAgICAnbWZyJywgJ2h3JywgJ3N3JywgJ3Byb3RvY29sJywgJ3NlcmlhbCcKICAgICAgICBdLAogICAgICAgIGZyaWVuZGx5UHJvcHMgPSBbCiAgICAgICAgICAgICdVUkknLCAnVHlwZScsICdNYXN0ZXIgSUQnLCAnQ2hhc3NpcyBJRCcsCiAgICAgICAgICAgICdWZW5kb3InLCAnSC9XIFZlcnNpb24nLCAnUy9XIFZlcnNpb24nLCAnUHJvdG9jb2wnLCAnU2VyaWFsICMnCiAgICAgICAgXSwKICAgICAgICBwb3J0Q29scyA9IFsKICAgICAgICAgICAgJ2VuYWJsZWQnLCAnaWQnLCAnc3BlZWQnLCAndHlwZScsICdlbGlua3NfZGVzdCcsICduYW1lJwogICAgICAgIF0sCiAgICAgICAgZnJpZW5kbHlQb3J0Q29scyA9IFsKICAgICAgICAgICAgJ0VuYWJsZWQnLCAnSUQnLCAnU3BlZWQnLCAnVHlwZScsICdFZ3Jlc3MgTGlua3MnLCAnTmFtZScKICAgICAgICBdOwoKICAgIGZ1bmN0aW9uIGNsb3NlUGFuZWwoKSB7CiAgICAgICAgaWYgKGRldGFpbHNQYW5lbC5pc1Zpc2libGUoKSkgewogICAgICAgICAgICAkc2NvcGUuc2VsSWQgPSBudWxsOwogICAgICAgICAgICBkZXRhaWxzUGFuZWwuaGlkZSgpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZENsb3NlQnRuKGRpdikgewogICAgICAgIGlzLmxvYWRFbWJlZGRlZEljb24oZGl2LCAncGx1cycsIDMwKTsKICAgICAgICBkaXYuc2VsZWN0KCdnJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgyNSwgMCkgcm90YXRlKDQ1KScpOwogICAgICAgIGRpdi5vbignY2xpY2snLCBjbG9zZVBhbmVsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleGl0RWRpdE1vZGUobmFtZUgyLCBuYW1lKSB7CiAgICAgICAgbmFtZUgyLmh0bWwobmFtZSk7CiAgICAgICAgbmFtZUgyLmNsYXNzZWQoJ2VkaXRhYmxlJywgdHJ1ZSk7CiAgICAgICAgZWRpdGluZ05hbWUgPSBmYWxzZTsKICAgICAgICBrcy5lbmFibGVHbG9iYWxLZXlzKHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVkaXROYW1lU2F2ZSgpIHsKICAgICAgICB2YXIgbmFtZUgyID0gdG9wLnNlbGVjdCgnaDInKSwKICAgICAgICAgICAgaWQgPSAkc2NvcGUucGFuZWxEYXRhLmlkLAogICAgICAgICAgICB2YWwsCiAgICAgICAgICAgIG5ld1ZhbDsKCiAgICAgICAgaWYgKGVkaXRpbmdOYW1lKSB7CiAgICAgICAgICAgIHZhbCA9IG5hbWVIMi5zZWxlY3QoJ2lucHV0JykucHJvcGVydHkoJ3ZhbHVlJykudHJpbSgpOwogICAgICAgICAgICBuZXdWYWwgPSB2YWwgfHwgaWQ7CgogICAgICAgICAgICBleGl0RWRpdE1vZGUobmFtZUgyLCBuZXdWYWwpOwogICAgICAgICAgICAkc2NvcGUucGFuZWxEYXRhLm5hbWUgPSBuZXdWYWw7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQobmFtZUNoYW5nZVJlcSwgeyBpZDogaWQsIG5hbWU6IHZhbCB9KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZWRpdE5hbWVDYW5jZWwoKSB7CiAgICAgICAgaWYgKGVkaXRpbmdOYW1lKSB7CiAgICAgICAgICAgIGV4aXRFZGl0TW9kZSh0b3Auc2VsZWN0KCdoMicpLCAkc2NvcGUucGFuZWxEYXRhLm5hbWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGVkaXROYW1lKCkgewogICAgICAgIHZhciBuYW1lSDIgPSB0b3Auc2VsZWN0KCdoMicpLAogICAgICAgICAgICB0ZiwgZWw7CgogICAgICAgIGlmICghZWRpdGluZ05hbWUpIHsKICAgICAgICAgICAgbmFtZUgyLmNsYXNzZWQoJ2VkaXRhYmxlJywgZmFsc2UpOwogICAgICAgICAgICBuYW1lSDIuaHRtbCgnJyk7CiAgICAgICAgICAgIHRmID0gbmFtZUgyLmFwcGVuZCgnaW5wdXQnKS5jbGFzc2VkKCduYW1lLWlucHV0JywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3ZhbHVlJywgJHNjb3BlLnBhbmVsRGF0YS5uYW1lKTsKICAgICAgICAgICAgZWwgPSB0ZlswXVswXTsKICAgICAgICAgICAgZWwuZm9jdXMoKTsKICAgICAgICAgICAgZWwuc2VsZWN0KCk7CiAgICAgICAgICAgIGVkaXRpbmdOYW1lID0gdHJ1ZTsKICAgICAgICAgICAga3MuZW5hYmxlR2xvYmFsS2V5cyhmYWxzZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUVzY2FwZSgpIHsKICAgICAgICByZXR1cm4gZWRpdE5hbWVDYW5jZWwoKSB8fCBjbG9zZVBhbmVsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0VXBQYW5lbCgpIHsKICAgICAgICB2YXIgY29udGFpbmVyLCBjbG9zZUJ0biwgdGJsRGl2OwogICAgICAgIGRldGFpbHNQYW5lbC5lbXB0eSgpOwoKICAgICAgICBjb250YWluZXIgPSBkZXRhaWxzUGFuZWwuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjb250YWluZXInLCB0cnVlKTsKCiAgICAgICAgdG9wID0gY29udGFpbmVyLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndG9wJywgdHJ1ZSk7CiAgICAgICAgY2xvc2VCdG4gPSB0b3AuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjbG9zZS1idG4nLCB0cnVlKTsKICAgICAgICBhZGRDbG9zZUJ0bihjbG9zZUJ0bik7CiAgICAgICAgaWNvbkRpdiA9IHRvcC5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2Rldi1pY29uJywgdHJ1ZSk7CiAgICAgICAgdG9wLmFwcGVuZCgnaDInKS5jbGFzc2VkKCdlZGl0YWJsZScsIHRydWUpLm9uKCdjbGljaycsIGVkaXROYW1lKTsKCiAgICAgICAgdGJsRGl2ID0gdG9wLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndG9wLXRhYmxlcycsIHRydWUpOwogICAgICAgIHRibERpdi5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2xlZnQnLCB0cnVlKS5hcHBlbmQoJ3RhYmxlJyk7CiAgICAgICAgdGJsRGl2LmFwcGVuZCgnZGl2JykuY2xhc3NlZCgncmlnaHQnLCB0cnVlKS5hcHBlbmQoJ3RhYmxlJyk7CgogICAgICAgIHRvcC5hcHBlbmQoJ2hyJyk7CgogICAgICAgIGJvdHRvbSA9IGNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2JvdHRvbScsIHRydWUpOwogICAgICAgIGJvdHRvbS5hcHBlbmQoJ2gyJykuY2xhc3NlZCgncG9ydHMtdGl0bGUnLCB0cnVlKS5odG1sKCdQb3J0cycpOwogICAgICAgIGJvdHRvbS5hcHBlbmQoJ3RhYmxlJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkUHJvcCh0Ym9keSwgaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgdmFyIHRyID0gdGJvZHkuYXBwZW5kKCd0cicpOwoKICAgICAgICBmdW5jdGlvbiBhZGRDZWxsKGNscywgdHh0KSB7CiAgICAgICAgICAgIHRyLmFwcGVuZCgndGQnKS5hdHRyKCdjbGFzcycsIGNscykuaHRtbCh0eHQpOwogICAgICAgIH0KICAgICAgICBhZGRDZWxsKCdsYWJlbCcsIGZyaWVuZGx5UHJvcHNbaW5kZXhdICsgJyA6Jyk7CiAgICAgICAgYWRkQ2VsbCgndmFsdWUnLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVUb3AodGJsRGl2LCBkZXRhaWxzKSB7CiAgICAgICAgdmFyIGxlZnRUYmwgPSB0YmxEaXYuc2VsZWN0KCcubGVmdCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoJ3RhYmxlJykKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgcmlnaHRUYmwgPSB0YmxEaXYuc2VsZWN0KCcucmlnaHQnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCd0YWJsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3Rib2R5Jyk7CgogICAgICAgIGlzLmxvYWRFbWJlZGRlZEljb24oaWNvbkRpdiwgZGV0YWlscy5faWNvbmlkX3R5cGUsIDQwKTsKICAgICAgICB0b3Auc2VsZWN0KCdoMicpLmh0bWwoZGV0YWlscy5uYW1lKTsKCiAgICAgICAgcHJvcE9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHByb3AsIGkpIHsKICAgICAgICAgICAgLy8gcHJvcGVydGllcyBhcmUgc3BsaXQgaW50byB0d28gdGFibGVzCiAgICAgICAgICAgIGFkZFByb3AoaSA8IDQgPyBsZWZ0VGJsIDogcmlnaHRUYmwsIGksIGRldGFpbHNbcHJvcF0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFBvcnRSb3codGJvZHksIHBvcnQpIHsKICAgICAgICB2YXIgdHIgPSB0Ym9keS5hcHBlbmQoJ3RyJyk7CgogICAgICAgIHBvcnRDb2xzLmZvckVhY2goZnVuY3Rpb24gKGNvbCkgewogICAgICAgICAgICB0ci5hcHBlbmQoJ3RkJykuaHRtbChwb3J0W2NvbF0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlQm90dG9tKHRhYmxlLCBwb3J0cykgewogICAgICAgIHZhciB0aGVhZGVyID0gdGFibGUuYXBwZW5kKCd0aGVhZCcpLmFwcGVuZCgndHInKSwKICAgICAgICAgICAgdGJvZHkgPSB0YWJsZS5hcHBlbmQoJ3Rib2R5JyksCiAgICAgICAgICAgIHRiV2lkdGgsIHRiSGVpZ2h0OwoKICAgICAgICBmcmllbmRseVBvcnRDb2xzLmZvckVhY2goZnVuY3Rpb24gKGNvbCkgewogICAgICAgICAgICB0aGVhZGVyLmFwcGVuZCgndGgnKS5odG1sKGNvbCk7CiAgICAgICAgfSk7CiAgICAgICAgcG9ydHMuZm9yRWFjaChmdW5jdGlvbiAocG9ydCkgewogICAgICAgICAgICBhZGRQb3J0Um93KHRib2R5LCBwb3J0KTsKICAgICAgICB9KTsKCiAgICAgICAgdGJXaWR0aCA9IGZzLm5vUHhTdHlsZSh0Ym9keSwgJ3dpZHRoJykgKyBzY3JvbGxTaXplOwogICAgICAgIHRiSGVpZ2h0ID0gcEhlaWdodAogICAgICAgICAgICAgICAgICAgIC0gKGZzLm5vUHhTdHlsZShkZXRhaWxzUGFuZWwuZWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnLnRvcCcpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICArIGZzLm5vUHhTdHlsZShkZXRhaWxzUGFuZWwuZWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnLnBvcnRzLXRpdGxlJyksICdoZWlnaHQnKQogICAgICAgICAgICAgICAgICAgICsgcG9ydHNUYmxQZGcpOwoKICAgICAgICB0YWJsZS5zdHlsZSh7CiAgICAgICAgICAgIGhlaWdodDogdGJIZWlnaHQgKyAncHgnLAogICAgICAgICAgICB3aWR0aDogdGJXaWR0aCArICdweCcsCiAgICAgICAgICAgIG92ZXJmbG93OiAnYXV0bycsCiAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycKICAgICAgICB9KTsKCiAgICAgICAgZGV0YWlsc1BhbmVsLndpZHRoKHRiV2lkdGggKyBjdG5yUGRnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3B1bGF0ZU5hbWUoZGl2LCBuYW1lKSB7CiAgICAgICAgdmFyIGxhYiA9IGRpdi5zZWxlY3QoJy5sYWJlbCcpLAogICAgICAgICAgICB2YWwgPSBkaXYuc2VsZWN0KCcudmFsdWUnKTsKICAgICAgICBsYWIuaHRtbCgnRnJpZW5kbHkgTmFtZTonKTsKICAgICAgICB2YWwuaHRtbChuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3B1bGF0ZURldGFpbHMoZGV0YWlscykgewogICAgICAgIHZhciBuYW1lRGl2LCB0b3BUYnMsIGJ0bVRibCwgcG9ydHM7CiAgICAgICAgc2V0VXBQYW5lbCgpOwoKICAgICAgICBuYW1lRGl2ID0gdG9wLnNlbGVjdCgnLm5hbWUtZGl2Jyk7CiAgICAgICAgdG9wVGJzID0gdG9wLnNlbGVjdCgnLnRvcC10YWJsZXMnKTsKICAgICAgICBidG1UYmwgPSBib3R0b20uc2VsZWN0KCd0YWJsZScpOwogICAgICAgIHBvcnRzID0gZGV0YWlscy5wb3J0czsKCiAgICAgICAgcG9wdWxhdGVOYW1lKG5hbWVEaXYsIGRldGFpbHMubmFtZSk7CiAgICAgICAgcG9wdWxhdGVUb3AodG9wVGJzLCBkZXRhaWxzKTsKICAgICAgICBwb3B1bGF0ZUJvdHRvbShidG1UYmwsIHBvcnRzKTsKCiAgICAgICAgZGV0YWlsc1BhbmVsLmhlaWdodChwSGVpZ2h0KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNwRGV0YWlsc0NiKGRhdGEpIHsKICAgICAgICAkc2NvcGUucGFuZWxEYXRhID0gZGF0YS5kZXRhaWxzOwogICAgICAgICRzY29wZS4kYXBwbHkoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNwTmFtZUNiKGRhdGEpIHsKICAgICAgICBpZiAoZGF0YS53YXJuKSB7CiAgICAgICAgICAgICRsb2cud2FybihkYXRhLndhcm4sIGRhdGEuaWQpOwogICAgICAgICAgICB0b3Auc2VsZWN0KCdoMicpLmh0bWwoZGF0YS5pZCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZURldGFpbHNQYW5lKCkgewogICAgICAgIGRldGFpbHNQYW5lbCA9IHBzLmNyZWF0ZVBhbmVsKHBOYW1lLCB7CiAgICAgICAgICAgIHdpZHRoOiB3U2l6ZS53aWR0aCwKICAgICAgICAgICAgbWFyZ2luOiAwLAogICAgICAgICAgICBoaWRlTWFyZ2luOiAwCiAgICAgICAgfSk7CiAgICAgICAgZGV0YWlsc1BhbmVsLmVsKCkuc3R5bGUoewogICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgICAgICAgICAgdG9wOiBwU3RhcnRZICsgJ3B4JwogICAgICAgIH0pOwogICAgICAgICRzY29wZS5oaWRlUGFuZWwgPSBmdW5jdGlvbiAoKSB7IGRldGFpbHNQYW5lbC5oaWRlKCk7IH07CiAgICAgICAgZGV0YWlsc1BhbmVsLmhpZGUoKTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZEZXZpY2UnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkRldmljZUN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGxvY2F0aW9uJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnRm5TZXJ2aWNlJywKICAgICAgICAgICAgJ01hc3RTZXJ2aWNlJywgJ1BhbmVsU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywgJ0ljb25TZXJ2aWNlJywKICAgICAgICAgICAgJ05hdlNlcnZpY2UnLCAnS2V5U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kc2NvcGVfLCBfJGxvY2F0aW9uXywKICAgICAgICAgICAgICAgICAgdGJzLCBfZnNfLCBfbWFzdF8sIF9wc18sIF93c3NfLCBfaXNfLCBfbnNfLCBfa3NfKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXMsCiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IHt9OwoKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2MgPSBfJGxvY2F0aW9uXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBtYXN0ID0gX21hc3RfOwogICAgICAgICAgICBwcyA9IF9wc187CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwogICAgICAgICAgICBpcyA9IF9pc187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAga3MgPSBfa3NfOwoKICAgICAgICAgICAgcGFyYW1zID0gJGxvYy5zZWFyY2goKTsKCiAgICAgICAgICAgICRzY29wZS5wYW5lbERhdGEgPSB7fTsKICAgICAgICAgICAgJHNjb3BlLmZsb3dUaXAgPSAnU2hvdyBmbG93IHZpZXcgZm9yIHNlbGVjdGVkIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5wb3J0VGlwID0gJ1Nob3cgcG9ydCB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUuZ3JvdXBUaXAgPSAnU2hvdyBncm91cCB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUubWV0ZXJUaXAgPSAnU2hvdyBtZXRlciB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwoKICAgICAgICAgICAgLy8gZGV0YWlscyBwYW5lbCBoYW5kbGVycwogICAgICAgICAgICBoYW5kbGVyc1tkZXRhaWxzUmVzcF0gPSByZXNwRGV0YWlsc0NiOwogICAgICAgICAgICBoYW5kbGVyc1tuYW1lQ2hhbmdlUmVzcF0gPSByZXNwTmFtZUNiOwogICAgICAgICAgICB3c3MuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKCiAgICAgICAgICAgIC8vIHF1ZXJ5IGZvciBpZiBhIGNlcnRhaW4gZGV2aWNlIG5lZWRzIHRvIGJlIGhpZ2hsaWdodGVkCiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ2RldklkJykpIHsKICAgICAgICAgICAgICAgICRzY29wZS5zZWxJZCA9IHBhcmFtc1snZGV2SWQnXTsKICAgICAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoZGV0YWlsc1JlcSwgeyBpZDogJHNjb3BlLnNlbElkIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBzZWxDYigkZXZlbnQsIHJvdykgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5zZWxJZCkgewogICAgICAgICAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoZGV0YWlsc1JlcSwgeyBpZDogcm93LmlkIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGlkZVBhbmVsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdHb3QgYSBjbGljayBvbjonLCByb3cpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAnZGV2aWNlJywKICAgICAgICAgICAgICAgIHNlbENiOiBzZWxDYgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5zZWxJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgsIHsgZGV2SWQ6ICRzY29wZS5zZWxJZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgd3NzLnVuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZEZXZpY2VDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSkKCiAgICAuZGlyZWN0aXZlKCdkZXZpY2VEZXRhaWxzUGFuZWwnLAogICAgWyckcm9vdFNjb3BlJywgJyR3aW5kb3cnLCAnJHRpbWVvdXQnLCAnS2V5U2VydmljZScsCiAgICBmdW5jdGlvbiAoJHJvb3RTY29wZSwgJHdpbmRvdywgJHRpbWVvdXQsIGtzKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSkgewogICAgICAgICAgICB2YXIgdW5iaW5kV2F0Y2g7CgogICAgICAgICAgICBmdW5jdGlvbiBoZWlnaHRDYWxjKCkgewogICAgICAgICAgICAgICAgcFN0YXJ0WSA9IGZzLm5vUHhTdHlsZShkMy5zZWxlY3QoJy50YWJ1bGFyLWhlYWRlcicpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWFzdC5tYXN0SGVpZ2h0KCkgKyB0b3BQZGc7CiAgICAgICAgICAgICAgICB3U2l6ZSA9IGZzLndpbmRvd1NpemUocFN0YXJ0WSk7CiAgICAgICAgICAgICAgICBwSGVpZ2h0ID0gd1NpemUuaGVpZ2h0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBpbml0UGFuZWwoKSB7CiAgICAgICAgICAgICAgICBoZWlnaHRDYWxjKCk7CiAgICAgICAgICAgICAgICBjcmVhdGVEZXRhaWxzUGFuZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTYWZhcmkgaGFzIGEgYnVnIHdoZXJlIGl0IHJlbmRlcnMgdGhlIGZpeGVkLWxheW91dCB0YWJsZSB3cm9uZwogICAgICAgICAgICAvLyBpZiB5b3UgYXNrIGZvciB0aGUgd2luZG93J3Mgc2l6ZSB0b28gZWFybHkKICAgICAgICAgICAgaWYgKHNjb3BlLm9ub3MuYnJvd3NlciA9PT0gJ3NhZmFyaScpIHsKICAgICAgICAgICAgICAgICR0aW1lb3V0KGluaXRQYW5lbCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbml0UGFuZWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjcmVhdGUga2V5IGJpbmRpbmdzIHRvIGhhbmRsZSBwYW5lbAogICAgICAgICAgICBrcy5rZXlCaW5kaW5ncyh7CiAgICAgICAgICAgICAgICBlbnRlcjogZWRpdE5hbWVTYXZlLAogICAgICAgICAgICAgICAgZXNjOiBbaGFuZGxlRXNjYXBlLCAnQ2xvc2UgdGhlIGRldGFpbHMgcGFuZWwnXSwKICAgICAgICAgICAgICAgIF9oZWxwRm9ybWF0OiBbJ2VzYyddCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBrcy5nZXN0dXJlTm90ZXMoWwogICAgICAgICAgICAgICAgWydjbGljaycsICdTZWxlY3QgYSByb3cgdG8gc2hvdyBkZXZpY2UgZGV0YWlscyddLAogICAgICAgICAgICAgICAgWydzY3JvbGwgZG93bicsICdTZWUgbW9yZSBkZXZpY2VzJ10KICAgICAgICAgICAgXSk7CgogICAgICAgICAgICAvLyBpZiB0aGUgcGFuZWxEYXRhIGNoYW5nZXMKICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdwYW5lbERhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3Qoc2NvcGUucGFuZWxEYXRhKSkgewogICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRGV0YWlscyhzY29wZS5wYW5lbERhdGEpOwogICAgICAgICAgICAgICAgICAgIGRldGFpbHNQYW5lbC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHdpbmRvdyBzaXplIGNoYW5nZXMKICAgICAgICAgICAgdW5iaW5kV2F0Y2ggPSAkcm9vdFNjb3BlLiR3YXRjaENvbGxlY3Rpb24oCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaDogJHdpbmRvdy5pbm5lckhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgdzogJHdpbmRvdy5pbm5lcldpZHRoCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3Qoc2NvcGUucGFuZWxEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRDYWxjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRGV0YWlscyhzY29wZS5wYW5lbERhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB1bmJpbmRXYXRjaCgpOwogICAgICAgICAgICAgICAga3MudW5iaW5kS2V5cygpOwogICAg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p4rFxukFX4AYAVmYLAAAAQEICgBNphIAo18WSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDE5NzQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUsMjAxNiBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBGbG93IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHNjb3BlLCAkbG9jYXRpb24sIGZzLCB0YnMsIG5zOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkZsb3cnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkZsb3dDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRsb2NhdGlvbicsCiAgICAgICAgICAgICdGblNlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsICdOYXZTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sIF8kbG9jYXRpb25fLCBfZnNfLCBfdGJzXywgX25zXykgewogICAgICAgICAgICB2YXIgcGFyYW1zOwogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICAgICAgJGxvY2F0aW9uID0gXyRsb2NhdGlvbl87CiAgICAgICAgICAgIGZzID0gX2ZzXzsKICAgICAgICAgICAgdGJzID0gX3Ric187CiAgICAgICAgICAgIG5zID0gX25zXzsKICAgICAgICAgICAgJHNjb3BlLmRldmljZVRpcCA9ICdTaG93IGRldmljZSB0YWJsZSc7CiAgICAgICAgICAgICRzY29wZS5wb3J0VGlwID0gJ1Nob3cgcG9ydCB2aWV3IGZvciB0aGlzIGRldmljZSc7CiAgICAgICAgICAgICRzY29wZS5ncm91cFRpcCA9ICdTaG93IGdyb3VwIHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLm1ldGVyVGlwID0gJ1Nob3cgbWV0ZXIgdmlldyBmb3Igc2VsZWN0ZWQgZGV2aWNlJzsKCiAgICAgICAgICAgIHBhcmFtcyA9ICRsb2NhdGlvbi5zZWFyY2goKTsKICAgICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZGV2SWQnKSkgewogICAgICAgICAgICAgICAgJHNjb3BlLmRldklkID0gcGFyYW1zWydkZXZJZCddOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAnZmxvdycsCiAgICAgICAgICAgICAgICBxdWVyeTogcGFyYW1zCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLm5hdiA9IGZ1bmN0aW9uIChwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmRldklkKSB7CiAgICAgICAgICAgICAgICAgICAgbnMubmF2VG8ocGF0aCwgeyBkZXZJZDogJHNjb3BlLmRldklkIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJGxvZy5sb2coJ092Rmxvd0N0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKjNzvVtvwBgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLf0QABABvLowKgHNsCoB2CVKh/1xukFX5OnkuSAEAWkMyUAAAEBCAoAo18WAE2mEozc71YT9AYAjQIAAI0CAAAIACetHhNo9ygf0sUIAEUAAn+39UAAQAbwnMCoBzbAqAdglSof9cbpBV+Tp5LkgBgFpONdAAABAQgKAKNfFwBNphJHRVQgL29ub3MvdWkvYXBwL3ZpZXcvZ3JvdXAvZ3JvdXAuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ak9AYAdhsAAHYbAABo9ygf0sUIACetHhMIAEUAG2hu8UAAQAYguMCoB2DAqAc2H/WVLHDYW9EFCdmkgBgBY6tBAAABAQgKAE2mEgCjXw9IVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogNjg1OQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBUb3BvbG9neSBUcmFmZmljIE1vZHVsZS4KIERlZmluZXMgYmVoYXZpb3IgZm9yIHZpZXdpbmcgZGlmZmVyZW50IHRyYWZmaWMgbW9kZXMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIGZsYXNoLCB3c3MsIGFwaTsKCiAgICAvKgogICAgICAgQVBJIHRvIHRvcG9Gb3JjZQogICAgICAgICBob3ZlcmVkKCkKICAgICAgICAgc29tZXRoaW5nU2VsZWN0ZWQoKQogICAgICAgICBzZWxlY3RPcmRlcigpCiAgICAgKi8KCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyIHRyYWZmaWNNb2RlID0gbnVsbCwKICAgICAgICBob3Zlck1vZGUgPSBudWxsOwoKCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBIZWxwZXIgZnVuY3Rpb25zCgogICAgLy8gaW52b2tlZCBpbiByZXNwb25zZSB0byBjaGFuZ2UgaW4gc2VsZWN0aW9uIGFuZC9vciBtb3VzZW92ZXIvb3V0OgogICAgZnVuY3Rpb24gcmVxdWVzdFRyYWZmaWNGb3JNb2RlKG1vdXNlKSB7CiAgICAgICAgaWYgKHRyYWZmaWNNb2RlID09PSAnZmxvd3MnKSB7CiAgICAgICAgICAgIHJlcXVlc3REZXZpY2VMaW5rRmxvd3MoKTsKICAgICAgICB9IGVsc2UgaWYgKHRyYWZmaWNNb2RlID09PSAnaW50ZW50cycpIHsKICAgICAgICAgICAgaWYgKCFtb3VzZSB8fCBob3Zlck1vZGUgPT09ICdpbnRlbnRzJykgewogICAgICAgICAgICAgICAgcmVxdWVzdFJlbGF0ZWRJbnRlbnRzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkbyBub3RoaW5nCiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlcXVlc3REZXZpY2VMaW5rRmxvd3MoKSB7CiAgICAgICAgLy8gZ2VuZXJhdGVzIHBheWxvYWQgYmFzZWQgb24gY3VycmVudCBob3Zlci1zdGF0ZQogICAgICAgIHZhciBob3YgPSBhcGkuaG92ZXJlZCgpOwoKICAgICAgICBmdW5jdGlvbiBob3ZlclZhbGlkKCkgewogICAgICAgICAgICByZXR1cm4gaG92ZXJNb2RlID09PSAnZmxvd3MnICYmCiAgICAgICAgICAgICAgICBob3YgJiYgKGhvdi5jbGFzcyA9PT0gJ2RldmljZScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFwaS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3REZXZpY2VMaW5rRmxvd3MnLCB7CiAgICAgICAgICAgICAgICBpZHM6IGFwaS5zZWxlY3RPcmRlcigpLAogICAgICAgICAgICAgICAgaG92ZXI6IGhvdmVyVmFsaWQoKSA/IGhvdi5pZCA6ICcnCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXF1ZXN0UmVsYXRlZEludGVudHMoKSB7CiAgICAgICAgLy8gZ2VuZXJhdGVzIHBheWxvYWQgYmFzZWQgb24gY3VycmVudCBob3Zlci1zdGF0ZQogICAgICAgIHZhciBob3YgPSBhcGkuaG92ZXJlZCgpOwoKICAgICAgICBmdW5jdGlvbiBob3ZlclZhbGlkKCkgewogICAgICAgICAgICByZXR1cm4gaG92ZXJNb2RlID09PSAnaW50ZW50cycgJiYKICAgICAgICAgICAgICAgIGhvdiAmJiAoaG92LmNsYXNzID09PSAnaG9zdCcgfHwgaG92LmNsYXNzID09PSAnZGV2aWNlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYXBpLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICAgICAgd3NzLnNlbmRFdmVudCgncmVxdWVzdFJlbGF0ZWRJbnRlbnRzJywgewogICAgICAgICAgICAgICAgaWRzOiBhcGkuc2VsZWN0T3JkZXIoKSwKICAgICAgICAgICAgICAgIGhvdmVyOiBob3ZlclZhbGlkKCkgPyBob3YuaWQgOiAnJwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgVHJhZmZpYyByZXF1ZXN0cyBpbnZva2VkIGZyb20ga2V5c3Ryb2tlcyBvciB0b29sYmFyIGJ1dHRvbnMuLi4KCiAgICBmdW5jdGlvbiBjYW5jZWxUcmFmZmljKGZvcmNlZCkgewogICAgICAgIGlmICghdHJhZmZpY01vZGUgfHwgKCFmb3JjZWQgJiYgdHJhZmZpY01vZGUgPT09ICdhbGxGbG93UG9ydCcpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHRyYWZmaWNNb2RlID0gaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdjYW5jZWxUcmFmZmljJyk7CiAgICAgICAgZmxhc2guZmxhc2goJ1RyYWZmaWMgbW9uaXRvcmluZyBjYW5jZWxlZCcpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dBbGxGbG93VHJhZmZpYygpIHsKICAgICAgICB0cmFmZmljTW9kZSA9ICdhbGxGbG93UG9ydCc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0QWxsRmxvd1RyYWZmaWMnKTsKICAgICAgICBmbGFzaC5mbGFzaCgnQWxsIEZsb3cgVHJhZmZpYycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dBbGxQb3J0VHJhZmZpYygpIHsKICAgICAgICB0cmFmZmljTW9kZSA9ICdhbGxGbG93UG9ydCc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0QWxsUG9ydFRyYWZmaWMnKTsKICAgICAgICBmbGFzaC5mbGFzaCgnQWxsIFBvcnQgVHJhZmZpYycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dEZXZpY2VMaW5rRmxvd3MgKCkgewogICAgICAgIHRyYWZmaWNNb2RlID0gaG92ZXJNb2RlID0gJ2Zsb3dzJzsKICAgICAgICByZXF1ZXN0RGV2aWNlTGlua0Zsb3dzKCk7CiAgICAgICAgZmxhc2guZmxhc2goJ0RldmljZSBGbG93cycpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dSZWxhdGVkSW50ZW50cyAoKSB7CiAgICAgICAgdHJhZmZpY01vZGUgPSBob3Zlck1vZGUgPSAnaW50ZW50cyc7CiAgICAgICAgcmVxdWVzdFJlbGF0ZWRJbnRlbnRzKCk7CiAgICAgICAgZmxhc2guZmxhc2goJ1JlbGF0ZWQgUGF0aHMnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93UHJldkludGVudCgpIHsKICAgICAgICBpZiAodHJhZmZpY01vZGUgPT09ICdpbnRlbnRzJykgewogICAgICAgICAgICBob3Zlck1vZGUgPSBudWxsOwogICAgICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0UHJldlJlbGF0ZWRJbnRlbnQnKTsKICAgICAgICAgICAgZmxhc2guZmxhc2goJ1ByZXZpb3VzIHJlbGF0ZWQgaW50ZW50Jyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dOZXh0SW50ZW50KCkgewogICAgICAgIGlmICh0cmFmZmljTW9kZSA9PT0gJ2ludGVudHMnKSB7CiAgICAgICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3ROZXh0UmVsYXRlZEludGVudCcpOwogICAgICAgICAgICBmbGFzaC5mbGFzaCgnTmV4dCByZWxhdGVkIGludGVudCcpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzaG93U2VsZWN0ZWRJbnRlbnRUcmFmZmljKCkgewogICAgICAgIGlmICh0cmFmZmljTW9kZSA9PT0gJ2ludGVudHMnKSB7CiAgICAgICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgICAgIHdzcy5zZW5kRXZlbnQoJ3JlcXVlc3RTZWxlY3RlZEludGVudFRyYWZmaWMnKTsKICAgICAgICAgICAgZmxhc2guZmxhc2goJ1RyYWZmaWMgb24gU2VsZWN0ZWQgUGF0aCcpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBmb3JjZSB0aGUgc3lzdGVtIHRvIGNyZWF0ZSBhIHNpbmdsZSBpbnRlbnQgc2VsZWN0aW9uCiAgICBmdW5jdGlvbiBzZWxlY3RJbnRlbnQoZGF0YSkgewogICAgICAgIHRyYWZmaWNNb2RlID0gJ2ludGVudHMnOwogICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgd3NzLnNlbmRFdmVudCgnc2VsZWN0SW50ZW50JywgZGF0YSk7CiAgICAgICAgZmxhc2guZmxhc2goJ1NlbGVjdGluZyBJbnRlbnQgJyArIGRhdGEua2V5KTsKICAgIH0KCgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gYWN0aW9uIGJ1dHRvbnMgb24gZGV0YWlsIHBhbmVsIChtdWx0aXBsZSBzZWxlY3Rpb24pCgogICAgZnVuY3Rpb24gYWRkSG9zdEludGVudCAoKSB7CiAgICAgICAgdmFyIHNvID0gYXBpLnNlbGVjdE9yZGVyKCk7CiAgICAgICAgd3NzLnNlbmRFdmVudCgnYWRkSG9zdEludGVudCcsIHsKICAgICAgICAgICAgb25lOiBzb1swXSwKICAgICAgICAgICAgdHdvOiBzb1sxXSwKICAgICAgICAgICAgaWRzOiBzbwogICAgICAgIH0pOwogICAgICAgIHRyYWZmaWNNb2RlID0gJ2ludGVudHMnOwogICAgICAgIGhvdmVyTW9kZSA9IG51bGw7CiAgICAgICAgZmxhc2guZmxhc2goJ0hvc3QtdG8tSG9zdCBmbG93IGFkZGVkJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkTXVsdGlTb3VyY2VJbnRlbnQgKCkgewogICAgICAgIHZhciBzbyA9IGFwaS5zZWxlY3RPcmRlcigpOwogICAgICAgIHdzcy5zZW5kRXZlbnQoJ2FkZE11bHRpU291cmNlSW50ZW50JywgewogICAgICAgICAgICBzcmM6IHNvLnNsaWNlKDAsIHNvLmxlbmd0aCAtIDEpLAogICAgICAgICAgICBkc3Q6IHNvW3NvLmxlbmd0aCAtIDFdLAogICAgICAgICAgICBpZHM6IHNvCiAgICAgICAgfSk7CiAgICAgICAgdHJhZmZpY01vZGUgPSAnaW50ZW50cyc7CiAgICAgICAgaG92ZXJNb2RlID0gbnVsbDsKICAgICAgICBmbGFzaC5mbGFzaCgnTXVsdGktU291cmNlIGZsb3cgYWRkZWQnKTsKICAgIH0KCgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA9PT0gTU9EVUxFIERFRklOSVRJT04gPT09CgogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAuZmFjdG9yeSgnVG9wb1RyYWZmaWNTZXJ2aWNlJywKICAgICAgICBbJyRsb2cnLCAnRm5TZXJ2aWNlJywgJ0ZsYXNoU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX2ZsYXNoXywgX3dzc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICBmbGFzaCA9IF9mbGFzaF87CiAgICAgICAgICAgIHdzcyA9IF93c3NfOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluaXRUcmFmZmljOiBmdW5jdGlvbiAoX2FwaV8pIHsgYXBpID0gX2FwaV87IH0sCiAgICAgICAgICAgICAgICBkZXN0cm95VHJhZmZpYzogZnVuY3Rpb24gKCkgeyB9LAoKICAgICAgICAgICAgICAgIC8vIGludm9rZWQgZnJvbSB0b29sYmFyIG92ZXJsYXkgYnV0dG9ucyBvciBrZXlzdHJva2VzCiAgICAgICAgICAgICAgICBjYW5jZWxUcmFmZmljOiBjYW5jZWxUcmFmZmljLAogICAgICAgICAgICAgICAgc2hvd0FsbEZsb3dUcmFmZmljOiBzaG93QWxsRmxvd1RyYWZmaWMsCiAgICAgICAgICAgICAgICBzaG93QWxsUG9ydFRyYWZmaWM6IHNob3dBbGxQb3J0VHJhZmZpYywKICAgICAgICAgICAgICAgIHNob3dEZXZpY2VMaW5rRmxvd3M6IHNob3dEZXZpY2VMaW5rRmxvd3MsCiAgICAgICAgICAgICAgICBzaG93UmVsYXRlZEludGVudHM6IHNob3dSZWxhdGVkSW50ZW50cywKICAgICAgICAgICAgICAgIHNob3dQcmV2SW50ZW50OiBzaG93UHJldkludGVudCwKICAgICAgICAgICAgICAgIHNob3dOZXh0SW50ZW50OiBzaG93TmV4dEludGVudCwKICAgICAgICAgICAgICAgIHNob3dTZWxlY3RlZEludGVudFRyYWZmaWM6IHNob3dTZWxlY3RlZEludGVudFRyYWZmaWMsCiAgICAgICAgICAgICAgICBzZWxlY3RJbnRlbnQ6IHNlbGVjdEludGVudCwKCiAgICAgICAgICAgICAgICAvLyBpbnZva2VkIGZyb20gbW91c2VvdmVyL21vdXNlb3V0IGFuZCBzZWxlY3Rpb24gY2hhbmdlCiAgICAgICAgICAgICAgICByZXF1ZXN0VHJhZmZpY0Zvck1vZGU6IHJlcXVlc3RUcmFmZmljRm9yTW9kZSwKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGVzZSBzaG91bGQgbW92ZSB0byBuZXcgVUkgZGVtbyBhcHAKICAgICAgICAgICAgICAgIC8vIGludm9rZWQgZnJvbSBidXR0b25zIG9uIGRldGFpbCAobXVsdGktc2VsZWN0KSBwYW5lbAogICAgICAgICAgICAgICAgYWRkSG9zdEludGVudDogYWRkSG9zdEludGVudCwKICAgICAgICAgICAgICAgIGFkZE11bHRpU291cmNlSW50ZW50OiBhZGRNdWx0aVNvdXJjZUludGVudAogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKjNzvVuX0BgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOSjQABABsY5wKgHNsCoB2CVLB/1BQnZpHDYdwWAEAOmYWkAAAEBCAoAo18XAE2mEozc71Yl+AYAjQIAAI0CAAAIACetHhNo9ygf0sUIAEUAAn/kpEAAQAbD7cCoBzbAqAdglSwf9QUJ2aRw2HcFgBgDpvfcAAABAQgKAKNfFwBNphJHRVQgL29ub3MvdWkvYXBwL3ZpZXcvbWV0ZXIvbWV0ZXIuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71Ys/gYAYQgAAGEIAABo9ygf0sUIACetHhMIAEUACFPVOkAAQAbNg8CoB2DAqAc2H/WVIkHBNG9YepvogBgCJJgsAAABAQgKAE2mEgCjXxZIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTk3NA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSwyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFBvcnQgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGluamVjdGVkIHJlZmVyZW5jZXMKICAgIHZhciAkbG9nLCAkc2NvcGUsICRsb2NhdGlvbiwgZnMsIHRicywgbnM7CgogICAgYW5ndWxhci5tb2R1bGUoJ292UG9ydCcsIFtdKQogICAgLmNvbnRyb2xsZXIoJ092UG9ydEN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGxvY2F0aW9uJywKICAgICAgICAgICAgJ0ZuU2VydmljZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ05hdlNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHNjb3BlXywgXyRsb2NhdGlvbl8sIF9mc18sIF90YnNfLCBfbnNfKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXM7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRzY29wZSA9IF8kc2NvcGVfOwogICAgICAgICAgICAkbG9jYXRpb24gPSBfJGxvY2F0aW9uXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0YnMgPSBfdGJzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwogICAgICAgICAgICAkc2NvcGUuZGV2aWNlVGlwID0gJ1Nob3cgZGV2aWNlIHRhYmxlJzsKICAgICAgICAgICAgJHNjb3BlLmZsb3dUaXAgPSAnU2hvdyBmbG93IHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLmdyb3VwVGlwID0gJ1Nob3cgZ3JvdXAgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUubWV0ZXJUaXAgPSAnU2hvdyBtZXRlciB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwoKICAgICAgICAgICAgcGFyYW1zID0gJGxvY2F0aW9uLnNlYXJjaCgpOwogICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdkZXZJZCcpKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuZGV2SWQgPSBwYXJhbXNbJ2RldklkJ107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdwb3J0JywKICAgICAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUubmF2ID0gZnVuY3Rpb24gKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZGV2SWQpIHsKICAgICAgICAgICAgICAgICAgICBucy5uYXZUbyhwYXRoLCB7IGRldklkOiAkc2NvcGUuZGV2SWQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZQb3J0Q3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwqM3O9WiAAHAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0PHFAAEAGbmzAqAc2wKgHYJUiH/VYepvoQcE8joAQDQ6r5AAAAQEICgCjXxcATaYSjNzvVnEDBwCLAgAAiwIAAAgAJ60eE2j3KB/SxQgARQACfTxyQABABmwiwKgHNsCoB2CVIh/1WHqb6EHBPI6AGA0OC28AAAEBCAoAo18YAE2mEkdFVCAvb25vcy91aS9hcHAvdmlldy9saW5rL2xpbmsuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YECgcAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADSNpEAAQAYdOcCoB2DAqAc2H/WVLaaTriNP2cPRgBABeJANAAABAQgKAE2mFACjXw6M3O9WWxAHANojAADaIwAAaPcoH9LFCAAnrR4TCABFACPMGL1AAEAGbojAqAdgwKgHNh/1lStnPo6o9mpjsYAYAbuzpQAAAQEICgBNphQAo18VSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDkwMDcNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgVG9vbGJhciBNb2R1bGUuCiBGdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBpbnRlcmFjdGluZyB3aXRoIHRoZSB0b29sYmFyLgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcwogICAgdmFyICRsb2csIGZzLCB0YnMsIHBzLCB0b3YsIHRkcywgYXBpOwoKICAgIC8vIEFQSToKICAgIC8vICBnZXRBY3Rpb25FbnRyeQogICAgLy8gIHNldFVwS2V5cwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgdG9vbGJhciwga2V5RGF0YSwgY2FjaGVkU3RhdGUsIHRoaXJkUm93LCBvdlJzZXQsIG92SW5kZXg7CgogICAgLy8gY29uc3RhbnRzCiAgICB2YXIgbmFtZSA9ICd0b3BvLXRiYXInLAogICAgICAgIGNvb2t0YWcgPSAndG9wb19wcmVmcycsCiAgICAgICAgc29hID0gJ3N3aXRjaE92ZXJsYXlBY3Rpb25zOiAnLAogICAgICAgIHNlbE92ZXIgPSAnU2VsZWN0IG92ZXJsYXkgaGVyZSAmI3gyMWU3OycsCiAgICAgICAgZGVmYXVsdE92ZXJsYXkgPSAndHJhZmZpYyc7CgoKICAgIC8vIGtleSB0byBidXR0b24gbWFwcGluZyBkYXRhCiAgICB2YXIgazJiID0gewogICAgICAgIE86IHsgaWQ6ICdzdW1tYXJ5LXRvZycsIGdpZDogJ3N1bW1hcnknLCBpc2VsOiB0cnVlfSwKICAgICAgICBJOiB7IGlkOiAnaW5zdGFuY2UtdG9nJywgZ2lkOiAndWlBdHRhY2hlZCcsIGlzZWw6IHRydWUgfSwKICAgICAgICBEOiB7IGlkOiAnZGV0YWlscy10b2cnLCBnaWQ6ICdkZXRhaWxzJywgaXNlbDogdHJ1ZSB9LAogICAgICAgIEg6IHsgaWQ6ICdob3N0cy10b2cnLCBnaWQ6ICdlbmRzdGF0aW9uJywgaXNlbDogZmFsc2UgfSwKICAgICAgICBNOiB7IGlkOiAnb2ZmbGluZS10b2cnLCBnaWQ6ICdzd2l0Y2gnLCBpc2VsOiB0cnVlIH0sCiAgICAgICAgUDogeyBpZDogJ3BvcnRzLXRvZycsIGdpZDogJ3BvcnRzJywgaXNlbDogdHJ1ZSB9LAogICAgICAgIEI6IHsgaWQ6ICdia2dybmQtdG9nJywgZ2lkOiAnbWFwJywgaXNlbDogZmFsc2UgfSwKICAgICAgICBTOiB7IGlkOiAnc3ByaXRlLXRvZycsIGdpZDogJ2Nsb3VkJywgaXNlbDogZmFsc2UgfSwKCiAgICAgICAgLy8gVE9ETzogYWRkIHJlc2V0LW5vZGUtbG9jYXRpb25zIGJ1dHRvbiB0byB0b29sYmFyCiAgICAgICAgLy9YOiB7IGlkOiAnbm9kZWxvY2stdG9nJywgZ2lkOiAnbG9jaycsIGlzZWw6IGZhbHNlIH0sCiAgICAgICAgWjogeyBpZDogJ29ibGlxdWUtdG9nJywgZ2lkOiAnb2JsaXF1ZScsIGlzZWw6IGZhbHNlIH0sCiAgICAgICAgTjogeyBpZDogJ2ZpbHRlcnMtYnRuJywgZ2lkOiAnZmlsdGVycycgfSwKICAgICAgICBMOiB7IGlkOiAnY3ljbGVMYWJlbHMtYnRuJywgZ2lkOiAnY3ljbGVMYWJlbHMnIH0sCiAgICAgICAgUjogeyBpZDogJ3Jlc2V0Wm9vbS1idG4nLCBnaWQ6ICdyZXNldFpvb20nIH0sCgogICAgICAgIEU6IHsgaWQ6ICdlcU1hc3Rlci1idG4nLCBnaWQ6ICdlcU1hc3RlcicgfQogICAgfTsKCiAgICB2YXIgcHJvaGliaXRlZCA9IFsKICAgICAgICAnVCcsICdiYWNrU2xhc2gnLCAnc2xhc2gnLAogICAgICAgICdYJyAvLyBuZWVkZWQgdW50aWwgd2UgcmUtaW5zdGF0ZSBYIGFib3ZlLgogICAgXTsKICAgIHByb2hpYml0ZWQgPSBwcm9oaWJpdGVkLmNvbmNhdChkMy5tYXAoazJiKS5rZXlzKCkpOwoKCiAgICAvLyBpbml0aWFsIHRvZ2dsZSBzdGF0ZTogZGVmYXVsdCBzZXR0aW5ncyBhbmQgdGFnIHRvIGtleSBtYXBwaW5nCiAgICB2YXIgZGVmYXVsdFByZWZzU3RhdGUgPSB7CiAgICAgICAgICAgIHN1bW1hcnk6IDEsCiAgICAgICAgICAgIGluc3RzOiAxLAogICAgICAgICAgICBkZXRhaWw6IDEsCiAgICAgICAgICAgIGhvc3RzOiAwLAogICAgICAgICAgICBvZmZkZXY6IDEsCiAgICAgICAgICAgIHBvcnRobDogMSwKICAgICAgICAgICAgYmc6IDAsCiAgICAgICAgICAgIHNwcjogMCwKICAgICAgICAgICAgdG9vbGJhcjogMAogICAgICAgIH0sCiAgICAgICAgcHJlZnNNYXAgPSB7CiAgICAgICAgICAgIHN1bW1hcnk6ICdPJywKICAgICAgICAgICAgaW5zdHM6ICdJJywKICAgICAgICAgICAgZGV0YWlsOiAnRCcsCiAgICAgICAgICAgIGhvc3RzOiAnSCcsCiAgICAgICAgICAgIG9mZmRldjogJ00nLAogICAgICAgICAgICBwb3J0aGw6ICdQJywKICAgICAgICAgICAgYmc6ICdCJywKICAgICAgICAgICAgc3ByOiAnUycKICAgICAgICAgICAgLy8gTk9URTogdG9vbGJhciBzdGF0ZSBpcyBoYW5kbGVkIHNlcGFyYXRlbHkKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIGluaXQoX2FwaV8pIHsKICAgICAgICBhcGkgPSBfYXBpXzsKCiAgICAgICAgLy8gcmV0cmlldmUgaW5pdGlhbCB0b2dnbGUgYnV0dG9uIHNldHRpbmdzIGZyb20gdXNlciBwcmVmcwogICAgICAgIHNldEluaXRUb2dnbGVTdGF0ZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvcG9EZWZQcmVmcygpIHsKICAgICAgICByZXR1cm4gYW5ndWxhci5leHRlbmQoe30sIGRlZmF1bHRQcmVmc1N0YXRlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRJbml0VG9nZ2xlU3RhdGUoKSB7CiAgICAgICAgY2FjaGVkU3RhdGUgPSBwcy5hc051bWJlcnMocHMuZ2V0UHJlZnMoY29va3RhZykpOwogICAgICAgICRsb2cuZGVidWcoJ1RPT0xCQVItLS0tIHJlYWQgcHJlZnMgc3RhdGU6JywgY2FjaGVkU3RhdGUpOwoKICAgICAgICBpZiAoIWNhY2hlZFN0YXRlKSB7CiAgICAgICAgICAgIGNhY2hlZFN0YXRlID0gdG9wb0RlZlByZWZzKCk7CiAgICAgICAgICAgIHBzLnNldFByZWZzKGNvb2t0YWcsIGNhY2hlZFN0YXRlKTsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygnVE9PTEJBUi0tLS0gU2V0IGRlZmF1bHQgcHJlZnMgc3RhdGU6JywgY2FjaGVkU3RhdGUpOwogICAgICAgIH0KCiAgICAgICAgYW5ndWxhci5mb3JFYWNoKHByZWZzTWFwLCBmdW5jdGlvbiAodiwgaykgewogICAgICAgICAgICB2YXIgY2ZnID0gazJiW3ZdOwogICAgICAgICAgICBjZmcgJiYgKGNmZy5pc2VsID0gISFjYWNoZWRTdGF0ZVtrXSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdEtleURhdGEoKSB7CiAgICAgICAgLy8gVE9ETzogdXNlIGFuZ3VsYXIgZm9yRWFjaCBpbnN0ZWFkIG9mIGQzLm1hcAogICAgICAgIGtleURhdGEgPSBkMy5tYXAoazJiKTsKICAgICAgICBrZXlEYXRhLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgZGF0YSA9IGFwaS5nZXRBY3Rpb25FbnRyeShrZXkpOwogICAgICAgICAgICB2YWx1ZS5jYiA9IGRhdGFbMF07ICAgICAgICAgICAgICAgICAgICAgLy8gb24tY2xpY2sgY2FsbGJhY2sKICAgICAgICAgICAgdmFsdWUudHQgPSBkYXRhWzFdICsgJyAoJyArIGtleSArICcpJzsgIC8vIHRvb2x0aXAKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRCdXR0b24oa2V5KSB7CiAgICAgICAgdmFyIHYgPSBrZXlEYXRhLmdldChrZXkpOwogICAgICAgIHYuYnRuID0gdG9vbGJhci5hZGRCdXR0b24odi5pZCwgdi5naWQsIHYuY2IsIHYudHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFRvZ2dsZShrZXksIHN1cHByZXNzSWZNb2JpbGUpIHsKICAgICAgICB2YXIgdiA9IGtleURhdGEuZ2V0KGtleSk7CiAgICAgICAgaWYgKHN1cHByZXNzSWZNb2JpbGUgJiYgZnMuaXNNb2JpbGUoKSkgeyByZXR1cm47IH0KICAgICAgICB2LnRvZyA9IHRvb2xiYXIuYWRkVG9nZ2xlKHYuaWQsIHYuZ2lkLCB2LmlzZWwsIHYuY2IsIHYudHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEZpcnN0Um93KCkgewogICAgICAgIGFkZFRvZ2dsZSgnSScpOwogICAgICAgIGFkZFRvZ2dsZSgnTycpOwogICAgICAgIGFkZFRvZ2dsZSgnRCcpOwogICAgICAgIHRvb2xiYXIuYWRkU2VwYXJhdG9yKCk7CgogICAgICAgIGFkZFRvZ2dsZSgnSCcpOwogICAgICAgIGFkZFRvZ2dsZSgnTScpOwogICAgICAgIGFkZFRvZ2dsZSgnUCcsIHRydWUpOwogICAgICAgIGFkZFRvZ2dsZSgnQicpOwogICAgICAgIGFkZFRvZ2dsZSgnUycsIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFNlY29uZFJvdygpIHsKICAgICAgICAvL2FkZFRvZ2dsZSgnWCcpOwogICAgICAgIGFkZFRvZ2dsZSgnWicpOwogICAgICAgIGFkZEJ1dHRvbignTicpOwogICAgICAgIGFkZEJ1dHRvbignTCcpOwogICAgICAgIGFkZEJ1dHRvbignUicpOwogICAgICAgIHRvb2xiYXIuYWRkU2VwYXJhdG9yKCk7CiAgICAgICAgYWRkQnV0dG9uKCdFJyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkT3ZlcmxheXMoKSB7CiAgICAgICAgdG9vbGJhci5hZGRTZXBhcmF0b3IoKTsKCiAgICAgICAgLy8gZ2VuZXJhdGUgcmFkaW8gYnV0dG9uIHNldCBmb3Igb3ZlcmxheXM7IHN0YXJ0IHdpdGggJ25vbmUnCiAgICAgICAgdmFyIHJzZXQgPSBbewogICAgICAgICAgICAgICAgZ2lkOiAndW5rbm93bicsCiAgICAgICAgICAgICAgICB0b29sdGlwOiAnTm8gT3ZlcmxheScsCiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRvdi50YlNlbGVjdGlvbihudWxsLCBzd2l0Y2hPdmVybGF5QWN0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1dOwogICAgICAgIG92SW5kZXggPSB0b3YuYXVnbWVudFJic2V0KHJzZXQsIHN3aXRjaE92ZXJsYXlBY3Rpb25zKTsKICAgICAgICBvdlJzZXQgPSB0b29sYmFyLmFkZFJhZGlvU2V0KCd0b3BvLW92ZXJsYXlzJywgcnNldCk7CiAgICB9CgogICAgLy8gaW52b2tlZCBieSBvdmVybGF5IHNlcnZpY2UgdG8gc3dpdGNoIG91dCBvbGQgYnV0dG9ucyBhbmQgc3dpdGNoIGluIG5ldwogICAgZnVuY3Rpb24gc3dpdGNoT3ZlcmxheUFjdGlvbnMob2lkLCBrZXlCaW5kaW5ncykgewogICAgICAgIHZhciBwcm9oaWJpdHMgPSBbXSwKICAgICAgICAgICAga2IgPSBmcy5pc08oa2V5QmluZGluZ3MpIHx8IHt9LAogICAgICAgICAgICBvcmRlciA9IGZzLmlzQShrYi5fa2V5T3JkZXIpIHx8IFtdOwoKICAgICAgICBpZiAoa2V5QmluZGluZ3MgJiYgIWtleUJpbmRpbmdzLl9rZXlPcmRlcikgewogICAgICAgICAgICAkbG9nLndhcm4oc29hICsgJ25vIF9rZXlPcmRlciBwcm9wZXJ0eSBkZWZpbmVkJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gc2FuaXR5IHJlbW92YWwgb2YgcmVzZXJ2ZWQgcHJvcGVydHkgbmFtZXMKICAgICAgICAgICAgWydlc2MnLCAnX2tleUxpc3RlbmVyJywgJ19oZWxwRm9ybWF0J10uZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgZnMucmVtb3ZlRnJvbUFycmF5KGssIG9yZGVyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBlbnN1cmUgZGlhbG9nIGhhcyBjbG9zZWQgKGlmIG9wZW5lZCBieSBvdXRnb2luZyBvdmVybGF5KQogICAgICAgIHRkcy5jbG9zZURpYWxvZygpOwogICAgICAgIHRoaXJkUm93LmNsZWFyKCk7CgogICAgICAgIGlmICghb3JkZXIubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXJkUm93LnNldFRleHQoc2VsT3Zlcik7CiAgICAgICAgICAgIHRoaXJkUm93LmNsYXNzZWQoJ3JpZ2h0JywgdHJ1ZSk7CiAgICAgICAgICAgIGFwaS5zZXRVcEtleXMoKTsgLy8gY2xlYXIgcHJldmlvdXMgb3ZlcmxheSBrZXkgYmluZGluZ3MKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcmRSb3cuY2xhc3NlZCgncmlnaHQnLCBmYWxzZSk7CiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChvcmRlciwgZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlLCBiaWQsIGdpZCwgdHQ7CgogICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWQuaW5kZXhPZihrZXkpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBwcm9oaWJpdHMucHVzaChrZXkpOwoKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBrZXlCaW5kaW5nc1trZXldOwogICAgICAgICAgICAgICAgICAgIGJpZCA9IG9pZCArICctJyArIGtleTsKICAgICAgICAgICAgICAgICAgICBnaWQgPSB0b3YubWtHbHlwaElkKG9pZCwgdmFsdWUuZ2lkKTsKICAgICAgICAgICAgICAgICAgICB0dCA9IHZhbHVlLnR0ICsgJyAoJyArIGtleSArICcpJzsKICAgICAgICAgICAgICAgICAgICB0aGlyZFJvdy5hZGRCdXR0b24oYmlkLCBnaWQsIHZhbHVlLmNiLCB0dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcGkuc2V0VXBLZXlzKGtleUJpbmRpbmdzKTsgLy8gYWRkIG92ZXJsYXkga2V5IGJpbmRpbmdzCiAgICAgICAgfQoKICAgICAgICBpZiAocHJvaGliaXRzLmxlbmd0aCkgewogICAgICAgICAgICAkbG9nLndhcm4oc29hICsgJ1Byb2hpYml0ZWQga2V5IGJpbmRpbmdzIGlnbm9yZWQ6JywgcHJvaGliaXRzKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVG9vbGJhcigpIHsKICAgICAgICBpbml0S2V5RGF0YSgpOwogICAgICAgIHRvb2xiYXIgPSB0YnMuY3JlYXRlVG9vbGJhcihuYW1lKTsKICAgICAgICBhZGRGaXJzdFJvdygpOwogICAgICAgIHRvb2xiYXIuYWRkUm93KCk7CiAgICAgICAgYWRkU2Vjb25kUm93KCk7CiAgICAgICAgYWRkT3ZlcmxheXMoKTsKICAgICAgICB0aGlyZFJvdyA9IHRvb2xiYXIuYWRkUm93KCk7CiAgICAgICAgdGhpcmRSb3cuc2V0VGV4dChzZWxPdmVyKTsKICAgICAgICB0aGlyZFJvdy5jbGFzc2VkKCdyaWdodCcsIHRydWUpOwoKICAgICAgICBpZiAoY2FjaGVkU3RhdGUudG9vbGJhcikgewogICAgICAgICAgICB0b29sYmFyLnNob3coKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b29sYmFyLmhpZGUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVzdHJveVRvb2xiYXIoKSB7CiAgICAgICAgdGJzLmRlc3Ryb3lUb29sYmFyKG5hbWUpOwogICAgICAgIHRvdi5yZXNldE9uVG9vbGJhckRlc3Ryb3koKTsKICAgIH0KCiAgICAvLyBhbGxvd3MgdXMgdG8gZW5zdXJlIHRoZSBidXR0b24gc3RhdGVzIHRyYWNrIGtleSBzdHJva2VzCiAgICBmdW5jdGlvbiBrZXlMaXN0ZW5lcihrZXkpIHsKICAgICAgICB2YXIgdiA9IGtleURhdGEuZ2V0KGtleSk7CgogICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSB2YWxpZCBidXR0b24gbWFwcGluZwogICAgICAgICAgICBpZiAodi50b2cpIHsKICAgICAgICAgICAgICAgIC8vIGl0J3MgYSB0b2dnbGUgYnV0dG9uCiAgICAgICAgICAgICAgICB2LnRvZy50b2dnbGVOb0NiKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlVG9vbGJhcigpIHsKICAgICAgICB0b29sYmFyLnRvZ2dsZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldERlZmF1bHRPdmVybGF5KCkgewogICAgICAgIHZhciBpZHggPSBvdkluZGV4W2RlZmF1bHRPdmVybGF5XSB8fCAwOwogICAgICAgIG92UnNldC5zZWxlY3RlZEluZGV4KGlkeCk7CiAgICB9CgogICAgLy8gYW4gb3ZlcmxheSB3YXMgc2VsZWN0ZWQgdmlhIEZ1bmN0aW9uLUtleSBwcmVzcwogICAgZnVuY3Rpb24gZm5rZXkoaWR4KSB7CiAgICAgICAgaWYgKGlkeCA8IG92UnNldC5zaXplKCkgJiYgaWR4ICE9PSBvdlJzZXQuc2VsZWN0ZWRJbmRleCgpKSB7CiAgICAgICAgICAgIG92UnNldC5zZWxlY3RlZEluZGV4KGlkeCk7CiAgICAgICAgfQogICAgfQoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlRvcG8nKQogICAgICAgIC5mYWN0b3J5KCdUb3BvVG9vbGJhclNlcnZpY2UnLAogICAgICAgIFsnJGxvZycsICdGblNlcnZpY2UnLCAnVG9vbGJhclNlcnZpY2UnLCAnUHJlZnNTZXJ2aWNlJywKICAgICAgICAgICAgJ1RvcG9PdmVybGF5U2VydmljZScsICdUb3BvRGlhbG9nU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF9mc18sIF90YnNfLCBfcHNfLCBfdG92XywgX3Rkc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0YnMgPSBfdGJzXzsKICAgICAgICAgICAgcHMgPSBfcHNfOwogICAgICAgICAgICB0b3YgPSBfdG92XzsKICAgICAgICAgICAgdGRzID0gX3Rkc187CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5pdDogaW5pdCwKICAgICAgICAgICAgICAgIGNyZWF0ZVRvb2xiYXI6IGNyZWF0ZVRvb2xiYXIsCiAgICAgICAgICAgICAgICBkZXN0cm95VG9vbGJhcjogZGVzdHJveVRvb2xiYXIsCiAgICAgICAgICAgICAgICBrZXlMaXN0ZW5lcjoga2V5TGlzdGVuZXIsCiAgICAgICAgICAgICAgICB0b2dnbGVUb29sYmFyOiB0b2dnbGVUb29sYmFyLAogICAgICAgICAgICAgICAgc2V0RGVmYXVsdE92ZXJsYXk6IHNldERlZmF1bHRPdmVybGF5LAogICAgICAgICAgICAgICAgZm5rZXk6IGZua2V5CiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwp9KCkpO4zc71ZFEgcAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADRwb0AAQAY6bsCoBzbAqAdglSsf9fZqY7FnPrJAgBAFbrKPAAABAQgKAKNfGABNphSM3O9WXBMHAM4hAADOIQAAaPcoH9LFCAAnrR4TCABFACHAjaVAAEAG+6vAqAdgwKgHNh/1lS2mk64jT9nD0YAYAXixmQAAAQEICgBNphQAo18OSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDg0ODMNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTUgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gVG9wb2xvZ3kgU2VsZWN0aW9uIE1vZHVsZS4KIERlZmluZXMgYmVoYXZpb3Igd2hlbiBzZWxlY3Rpbmcgbm9kZXMuCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZzCiAgICB2YXIgJGxvZywgZnMsIHdzcywgdG92LCB0cHMsIHR0cywgbnM7CgogICAgLy8gYXBpIHRvIHRvcG9Gb3JjZQogICAgdmFyIGFwaTsKICAgIC8qCiAgICAgICBub2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlZiB0byBEMyBzZWxlY3Rpb24gb2Ygbm9kZXMKICAgICAgIHpvb21pbmdPclBhbm5pbmcoIGV2ICkKICAgICAgIHVwZGF0ZURldmljZUNvbG9ycyggW2Rldl0gKQogICAgICAgZGVzZWxlY3RMaW5rKCkKICAgICAqLwoKICAgIC8vIGludGVybmFsIHN0YXRlCiAgICB2YXIgaG92ZXJlZCwgICAgICAgICAgICAgICAgLy8gdGhlIG5vZGUgb3ZlciB3aGljaCB0aGUgbW91c2UgaXMgaG92ZXJpbmcKICAgICAgICBzZWxlY3Rpb25zID0ge30sICAgICAgICAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZXMgKGJ5IGlkKQogICAgICAgIHNlbGVjdE9yZGVyID0gW10sICAgICAgIC8vIHRoZSBvcmRlciBpbiB3aGljaCB3ZSBtYWRlIHNlbGVjdGlvbnMKICAgICAgICBjb25zdW1lQ2xpY2sgPSBmYWxzZTsgICAvLyB1c2VkIHRvIGNvb3JkaW5hdGUgd2l0aCBTVkcgY2xpY2sgaGFuZGxlcgoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gblNlbCgpIHsKICAgICAgICByZXR1cm4gc2VsZWN0T3JkZXIubGVuZ3RoOwogICAgfQogICAgZnVuY3Rpb24gZ2V0U2VsKGlkeCkgewogICAgICAgIHJldHVybiBzZWxlY3Rpb25zW3NlbGVjdE9yZGVyW2lkeF1dOwogICAgfQogICAgZnVuY3Rpb24gYWxsU2VsZWN0aW9uc0NsYXNzKGNscykgewogICAgICAgIGZvciAodmFyIGk9MCwgbj1uU2VsKCk7IGk8bjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChnZXRTZWwoaSkub2JqLmNsYXNzICE9PSBjbHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIG5vZGVNb3VzZU92ZXIobSkgewogICAgICAgIGlmICghbS5kcmFnU3RhcnRlZCkgewogICAgICAgICAgICBpZiAoaG92ZXJlZCAhPSBtKSB7CiAgICAgICAgICAgICAgICBob3ZlcmVkID0gbTsKICAgICAgICAgICAgICAgIHRvdi5ob29rcy5tb3VzZU92ZXIoewogICAgICAgICAgICAgICAgICAgIGlkOiBtLmlkLAogICAgICAgICAgICAgICAgICAgIGNsYXNzOiBtLmNsYXNzLAogICAgICAgICAgICAgICAgICAgIHR5cGU6IG0udHlwZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZU1vdXNlT3V0KG0pIHsKICAgICAgICBpZiAoIW0uZHJhZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgaWYgKGhvdmVyZWQpIHsKICAgICAgICAgICAgICAgIGhvdmVyZWQgPSBudWxsOwogICAgICAgICAgICAgICAgdG92Lmhvb2tzLm1vdXNlT3V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBzZWxlY3RPYmplY3Qob2JqKSB7CiAgICAgICAgdmFyIGVsID0gdGhpcywKICAgICAgICAgICAgbm9kZUV2ID0gZWwgJiYgZWwudGFnTmFtZSA9PT0gJ2cnLAogICAgICAgICAgICBldiA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50IHx8IHt9LAogICAgICAgICAgICBuOwoKICAgICAgICBpZiAoYXBpLnpvb21pbmdPclBhbm5pbmcoZXYpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChub2RlRXYpIHsKICAgICAgICAgICAgbiA9IGQzLnNlbGVjdChlbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBpLm5vZGUoKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoZCA9PSBvYmopIHsKICAgICAgICAgICAgICAgICAgICBuID0gZDMuc2VsZWN0KGVsID0gdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoIW4pIHJldHVybjsKCiAgICAgICAgaWYgKG5vZGVFdikgewogICAgICAgICAgICBjb25zdW1lQ2xpY2sgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBhcGkuZGVzZWxlY3RMaW5rKCk7CgogICAgICAgIGlmIChldi5zaGlmdEtleSAmJiBuLmNsYXNzZWQoJ3NlbGVjdGVkJykpIHsKICAgICAgICAgICAgZGVzZWxlY3RPYmplY3Qob2JqLmlkKTsKICAgICAgICAgICAgdXBkYXRlRGV0YWlsKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZXYuc2hpZnRLZXkpIHsKICAgICAgICAgICAgZGVzZWxlY3RBbGwodHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBzZWxlY3Rpb25zW29iai5pZF0gPSB7IG9iajogb2JqLCBlbDogZWwgfTsKICAgICAgICBzZWxlY3RPcmRlci5wdXNoKG9iai5pZCk7CgogICAgICAgIG4uY2xhc3NlZCgnc2VsZWN0ZWQnLCB0cnVlKTsKICAgICAgICBhcGkudXBkYXRlRGV2aWNlQ29sb3JzKG9iaik7CiAgICAgICAgdXBkYXRlRGV0YWlsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RPYmplY3QoaWQpIHsKICAgICAgICB2YXIgb2JqID0gc2VsZWN0aW9uc1tpZF07CiAgICAgICAgaWYgKG9iaikgewogICAgICAgICAgICBkMy5zZWxlY3Qob2JqLmVsKS5jbGFzc2VkKCdzZWxlY3RlZCcsIGZhbHNlKTsKICAgICAgICAgICAgZGVsZXRlIHNlbGVjdGlvbnNbaWRdOwogICAgICAgICAgICBmcy5yZW1vdmVGcm9tQXJyYXkoaWQsIHNlbGVjdE9yZGVyKTsKICAgICAgICAgICAgYXBpLnVwZGF0ZURldmljZUNvbG9ycyhvYmoub2JqKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVzZWxlY3RBbGwoc2tpcFVwZGF0ZSkgewogICAgICAgIHZhciBzb21ldGhpbmcgPSAoc2VsZWN0T3JkZXIubGVuZ3RoID4gMCk7CgogICAgICAgIC8vIGRlc2VsZWN0IGFsbCBub2RlcyBpbiB0aGUgbmV0d29yay4uLgogICAgICAgIGFwaS5ub2RlKCkuY2xhc3NlZCgnc2VsZWN0ZWQnLCBmYWxzZSk7CiAgICAgICAgc2VsZWN0aW9ucyA9IHt9OwogICAgICAgIHNlbGVjdE9yZGVyID0gW107CiAgICAgICAgYXBpLnVwZGF0ZURldmljZUNvbG9ycygpOwogICAgICAgIGlmICghc2tpcFVwZGF0ZSkgewogICAgICAgICAgICB1cGRhdGVEZXRhaWwoKTsKICAgICAgICB9CgogICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHNvbWV0aGluZyB3YXMgc2VsZWN0ZWQKICAgICAgICByZXR1cm4gc29tZXRoaW5nOwogICAgfQoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIHJlcXVlc3REZXRhaWxzKGRhdGEpIHsKICAgICAgICB3c3Muc2VuZEV2ZW50KCdyZXF1ZXN0RGV0YWlscycsIHsKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGNsYXNzOiBkYXRhLmNsYXNzCiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gPT09IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb24gdXBkYXRlRGV0YWlsKCkgewogICAgICAgIHZhciBuU2VsID0gc2VsZWN0T3JkZXIubGVuZ3RoOwogICAgICAgIGlmICghblNlbCkgewogICAgICAgICAgICBlbXB0eVNlbGVjdCgpOwogICAgICAgIH0gZWxzZSBpZiAoblNlbCA9PT0gMSkgewogICAgICAgICAgICBzaW5nbGVTZWxlY3QoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtdWx0aVNlbGVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eVNlbGVjdCgpIHsKICAgICAgICB0b3YuaG9va3MuZW1wdHlTZWxlY3QoKTsKICAgICAgICB0cHMuZGlzcGxheU5vdGhpbmcoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaW5nbGVTZWxlY3QoKSB7CiAgICAgICAgdmFyIGRhdGEgPSBnZXRTZWwoMCkub2JqOwogICAgICAgIHJlcXVlc3REZXRhaWxzKGRhdGEpOwogICAgICAgIC8vIE5PVEU6IGRldGFpbCBwYW5lbCBpcyBzaG93biBhcyBhIHJlc3BvbnNlIHRvIHJlY2VpdmluZwogICAgICAgIC8vICAgICAgIGEgJ3Nob3dEZXRhaWxzJyBldmVudCBmcm9tIHRoZSBzZXJ2ZXIuIFNlZSAnc2hvd0RldGFpbHMnCiAgICAgICAgLy8gICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gYmVsb3cuLi4KICAgIH0KCiAgICBmdW5jdGlvbiBtdWx0aVNlbGVjdCgpIHsKICAgICAgICAvLyBkaXNwbGF5IHRoZSBzZWxlY3RlZCBub2RlcyBpbiB0aGUgZGV0YWlsIHBhbmVsCiAgICAgICAgdHBzLmRpc3BsYXlNdWx0aShzZWxlY3RPcmRlcik7CiAgICAgICAgYWRkSG9zdFNlbGVjdGlvbkFjdGlvbnMoKTsKICAgICAgICB0b3YuaG9va3MubXVsdGlTZWxlY3Qoc2VsZWN0T3JkZXIpOwogICAgICAgIHRwcy5kaXNwbGF5U29tZXRoaW5nKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkSG9zdFNlbGVjdGlvbkFjdGlvbnMoKSB7CiAgICAgICAgaWYgKGFsbFNlbGVjdGlvbnNDbGFzcygnaG9zdCcpKSB7CiAgICAgICAgICAgIGlmIChuU2VsKCkgPT09IDIpIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgICAgIGlkOiAnaG9zdC1mbG93LWJ0bicsCiAgICAgICAgICAgICAgICAgICAgZ2lkOiAnZW5kc3RhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgY2I6IHR0cy5hZGRIb3N0SW50ZW50LAogICAgICAgICAgICAgICAgICAgIHR0OiAnQ3JlYXRlIEhvc3QtdG8tSG9zdCBGbG93JwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoblNlbCgpID49IDIpIHsKICAgICAgICAgICAgICAgIHRwcy5hZGRBY3Rpb24oewogICAgICAgICAgICAgICAgICAgIGlkOiAnbXVsdC1zcmMtZmxvdy1idG4nLAogICAgICAgICAgICAgICAgICAgIGdpZDogJ2Zsb3dzJywKICAgICAgICAgICAgICAgICAgICBjYjogdHRzLmFkZE11bHRpU291cmNlSW50ZW50LAogICAgICAgICAgICAgICAgICAgIHR0OiAnQ3JlYXRlIE11bHRpLVNvdXJjZSBGbG93JwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8vID09PSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIEV2ZW50IEhhbmRsZXJzCgogICAgLy8gZGlzcGxheSB0aGUgZGF0YSBmb3IgdGhlIHNpbmdsZSBzZWxlY3RlZCBub2RlCiAgICBmdW5jdGlvbiBzaG93RGV0YWlscyhkYXRhKSB7CiAgICAgICAgdmFyIGJ1dHRvbnMgPSBmcy5pc0EoZGF0YS5idXR0b25zKSB8fCBbXTsKICAgICAgICB0cHMuZGlzcGxheVNpbmdsZShkYXRhKTsKICAgICAgICB0b3YuaW5zdGFsbEJ1dHRvbnMoYnV0dG9ucywgZGF0YSwgZGF0YS5wcm9wc1snVVJJJ10pOwogICAgICAgIHRvdi5ob29rcy5zaW5nbGVTZWxlY3QoZGF0YSk7CiAgICAgICAgdHBzLmRpc3BsYXlTb21ldGhpbmcoKTsKICAgIH0KCiAgICAvLyByZXR1cm5zIHRydWUgaWYgb25lIG9yIG1vcmUgbm9kZXMgYXJlIHNlbGVjdGVkLgogICAgZnVuY3Rpb24gc29tZXRoaW5nU2VsZWN0ZWQoKSB7CiAgICAgICAgcmV0dXJuIG5TZWwoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlja0NvbnN1bWVkKHgpIHsKICAgICAgICB2YXIgY2MgPSBjb25zdW1lQ2xpY2s7CiAgICAgICAgY29uc3VtZUNsaWNrID0gISF4OwogICAgICAgIHJldHVybiBjYzsKICAgIH0KCiAgICAvLyByZXR1cm5zIGEgc2VsZWN0aW9uIGNvbnRleHQsIHByb3ZpZGluZyBpbmZvIGFib3V0IHdoYXQgaXMgc2VsZWN0ZWQKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbkNvbnRleHQoKSB7CiAgICAgICAgdmFyIGRldmljZXMgPSBbXSwKICAgICAgICAgICAgaG9zdHMgPSBbXSwKICAgICAgICAgICAgdHlwZXMgPSB7fTsKCiAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdGlvbnMsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBvID0gZC5vYmosCiAgICAgICAgICAgICAgICBjID0gby5jbGFzczsKCiAgICAgICAgICAgIGlmIChjID09PSAnZGV2aWNlJykgewogICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoKG8uaWQpOwogICAgICAgICAgICAgICAgdHlwZXNbby5pZF0gPSBvLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMgPT09ICdob3N0JykgewogICAgICAgICAgICAgICAgaG9zdHMucHVzaChvLmlkKTsKICAgICAgICAgICAgICAgIHR5cGVzW28uaWRdID0gby50eXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGRldmljZXM6IGRldmljZXMsCiAgICAgICAgICAgIGhvc3RzOiBob3N0cywKICAgICAgICAgICAgdHlwZXM6IHR5cGVzCiAgICAgICAgfTsKICAgIH0KCiAgICAvLyA9PT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vID09PSBNT0RVTEUgREVGSU5JVElPTiA9PT0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZUb3BvJykKICAgIC5mYWN0b3J5KCdUb3BvU2VsZWN0U2VydmljZScsCiAgICAgICAgWyckbG9nJywgJ0ZuU2VydmljZScsICdXZWJTb2NrZXRTZXJ2aWNlJywgJ1RvcG9PdmVybGF5U2VydmljZScsCiAgICAgICAgICAgICdUb3BvUGFuZWxTZXJ2aWNlJywgJ1RvcG9UcmFmZmljU2VydmljZScsICdOYXZTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKF8kbG9nXywgX2ZzXywgX3dzc18sIF90b3ZfLCBfdHBzXywgX3R0c18sIF9uc18pIHsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICAgICAgdG92ID0gX3Rvdl87CiAgICAgICAgICAgIHRwcyA9IF90cHNfOwogICAgICAgICAgICB0dHMgPSBfdHRzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwoKICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFNlbGVjdChfYXBpXykgewogICAgICAgICAgICAgICAgYXBpID0gX2FwaV87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lTZWxlY3QoKSB7IH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbml0U2VsZWN0OiBpbml0U2VsZWN0LAogICAgICAgICAgICAgICAgZGVzdHJveVNlbGVjdDogZGVzdHJveVNlbGVjdCwKCiAgICAgICAgICAgICAgICBzaG93RGV0YWlsczogc2hvd0RldGFpbHMsCgogICAgICAgICAgICAgICAgbm9kZU1vdXNlT3Zlcjogbm9kZU1vdXNlT3ZlciwKICAgICAgICAgICAgICAgIG5vZGVNb3VzZU91dDogbm9kZU1vdXNlT3V0LAogICAgICAgICAgICAgICAgc2VsZWN0T2JqZWN0OiBzZWxlY3RPYmplY3QsCiAgICAgICAgICAgICAgICBkZXNlbGVjdE9iamVjdDogZGVzZWxlY3RPYmplY3QsCiAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbDogZGVzZWxlY3RBbGwsCiAgICAgICAgICAgICAgICB1cGRhdGVEZXRhaWw6IHVwZGF0ZURldGFpbCwKCiAgICAgICAgICAgICAgICBob3ZlcmVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBob3ZlcmVkOyB9LAogICAgICAgICAgICAgICAgc2VsZWN0T3JkZXI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlbGVjdE9yZGVyOyB9LAogICAgICAgICAgICAgICAgc29tZXRoaW5nU2VsZWN0ZWQ6IHNvbWV0aGluZ1NlbGVjdGVkLAoKICAgICAgICAgICAgICAgIGNsaWNrQ29uc3VtZWQ6IGNsaWNrQ29uc3VtZWQsCiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Db250ZXh0OiBzZWxlY3Rpb25Db250ZXh0CiAgICAgICAgICAgIH07CiAgICAgICAgfV0pOwp9KCkpOwqM3O9W0hMHAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0wdFAAEAG6QvAqAc2wKgHYJUtH/VP2cPRppPPr4AQBW6cOQAAAQEICgCjXxkATaYUjNzvVlEXBwB6FAAAehQAAGj3KB/SxQgAJ60eEwgARQAUbDfUQABABl7RwKgHYMCoBzYf9ZUnOVaF9tuSl16AGAFrpEUAAAEBCAoATaYUAKNfD0hUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiA1MDcxDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqLwoKLyoKIE9OT1MgR1VJIC0tIFRvcG9sb2d5IFRyYWZmaWMgT3ZlcmxheSBNb2R1bGUuCiBEZWZpbmVzIGJlaGF2aW9yIGZvciB2aWV3aW5nIGRpZmZlcmVudCB0cmFmZmljIG1vZGVzLgogSW5zdGFsbGVkIGFzIGEgVG9wb2xvZ3kgT3ZlcmxheS4KICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csIHRvdiwgdHRzOwoKICAgIC8vIE5PVEU6IG5vIGludGVybmFsIHN0YXRlIGhlcmUgLS0gc2VlIFRvcG9UcmFmZmljU2VydmljZSBmb3IgdGhhdAoKICAgIC8vIE5PVEU6IHByb3ZpZGluZyBidXR0b24gZGlzYWJsaW5nIHJlcXVpcmVzIHRvbyBiaWcgYSByZWZhY3RvcmluZyBvZgogICAgLy8gICAgICAgdGhlIGJ1dHRvbiBmYWN0b3J5IGV0Yy4gV2lsbCBoYXZlIHRvIGJlIGRvbmUgYW5vdGhlciB0aW1lLgoKCiAgICAvLyB0cmFmZmljIG92ZXJsYXkgZGVmaW5pdGlvbgogICAgdmFyIG92ZXJsYXkgPSB7CiAgICAgICAgb3ZlcmxheUlkOiAndHJhZmZpYycsCiAgICAgICAgZ2x5cGhJZDogJ2FsbFRyYWZmaWMnLAogICAgICAgIHRvb2x0aXA6ICdUcmFmZmljIE92ZXJsYXknLAoKICAgICAgICAvLyBOT1RFOiBUcmFmZmljIGdseXBocyBhbHJlYWR5IGluc3RhbGxlZCBhcyBwYXJ0IG9mIHRoZSBiYXNlIE9OT1Mgc2V0LgoKICAgICAgICBhY3RpdmF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkbG9nLmRlYnVnKCJUcmFmZmljIG92ZXJsYXkgQUNUSVZBVEVEIik7CiAgICAgICAgfSwKCiAgICAgICAgZGVhY3RpdmF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0dHMuY2FuY2VsVHJhZmZpYyh0cnVlKTsKICAgICAgICAgICAgJGxvZy5kZWJ1ZygiVHJhZmZpYyBvdmVybGF5IERFQUNUSVZBVEVEIik7CiAgICAgICAgfSwKCiAgICAgICAgLy8gZGV0YWlsIHBhbmVsIGJ1dHRvbiBkZWZpbml0aW9ucwogICAgICAgIC8vIChrZXlzIG1hdGNoIGJ1dHRvbiBpZGVudGlmaWVycywgYWxzbyBkZWZpbmVkIGluIFRyYWZmaWNPdmVybGF5LmphdmEpCiAgICAgICAgYnV0dG9uczogewogICAgICAgICAgICBzaG93RGV2aWNlRmxvd3M6IHsKICAgICAgICAgICAgICAgIGdpZDogJ2Zsb3dzJywKICAgICAgICAgICAgICAgIHR0OiAnU2hvdyBEZXZpY2UgRmxvd3MnLAogICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uIChkYXRhKSB7IHR0cy5zaG93RGV2aWNlTGlua0Zsb3dzKCk7IH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHNob3dSZWxhdGVkVHJhZmZpYzogewogICAgICAgICAgICAgICAgZ2lkOiAncmVsYXRlZEludGVudHMnLAogICAgICAgICAgICAgICAgdHQ6ICdTaG93IFJlbGF0ZWQgVHJhZmZpYycsCiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKGRhdGEpIHsgdHRzLnNob3dSZWxhdGVkSW50ZW50cygpOyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBrZXkgYmluZGluZ3MgZm9yIHRyYWZmaWMgb3ZlcmxheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAvLyBOT1RFOiBmdWxseSBxdWFsLiBidXR0b24gSUQgaXMgZGVyaXZlZCBmcm9tIG92ZXJsYXktaWQgYW5kIGtleS1uYW1lCiAgICAgICAga2V5QmluZGluZ3M6IHsKICAgICAgICAgICAgMDogewogICAgICAgICAgICAgICAgY2I6IGZ1bmN0aW9uICgpIHsgdHRzLmNhbmNlbFRyYWZmaWModHJ1ZSk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ0NhbmNlbCB0cmFmZmljIG1vbml0b3JpbmcnLAogICAgICAgICAgICAgICAgZ2lkOiAneE1hcmsnCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBBOiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd0FsbEZsb3dUcmFmZmljKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ01vbml0b3IgYWxsIHRyYWZmaWMgdXNpbmcgZmxvdyBzdGF0cycsCiAgICAgICAgICAgICAgICBnaWQ6ICdhbGxUcmFmZmljJwogICAgICAgICAgICB9LAogICAgICAgICAgICBROiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd0FsbFBvcnRUcmFmZmljKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ01vbml0b3IgYWxsIHRyYWZmaWMgdXNpbmcgcG9ydCBzdGF0cycsCiAgICAgICAgICAgICAgICBnaWQ6ICdhbGxUcmFmZmljJwogICAgICAgICAgICB9LAogICAgICAgICAgICBGOiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd0RldmljZUxpbmtGbG93cygpOyB9LAogICAgICAgICAgICAgICAgdHQ6ICdTaG93IGRldmljZSBsaW5rIGZsb3dzJywKICAgICAgICAgICAgICAgIGdpZDogJ2Zsb3dzJwogICAgICAgICAgICB9LAogICAgICAgICAgICBWOiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd1JlbGF0ZWRJbnRlbnRzKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ1Nob3cgYWxsIHJlbGF0ZWQgaW50ZW50cycsCiAgICAgICAgICAgICAgICBnaWQ6ICdyZWxhdGVkSW50ZW50cycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbGVmdEFycm93OiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd1ByZXZJbnRlbnQoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnU2hvdyBwcmV2aW91cyByZWxhdGVkIGludGVudCcsCiAgICAgICAgICAgICAgICBnaWQ6ICdwcmV2SW50ZW50JwogICAgICAgICAgICB9LAogICAgICAgICAgICByaWdodEFycm93OiB7CiAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24gKCkgeyB0dHMuc2hvd05leHRJbnRlbnQoKTsgfSwKICAgICAgICAgICAgICAgIHR0OiAnU2hvdyBuZXh0IHJlbGF0ZWQgaW50ZW50JywKICAgICAgICAgICAgICAgIGdpZDogJ25leHRJbnRlbnQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFc6IHsKICAgICAgICAgICAgICAgIGNiOiBmdW5jdGlvbiAoKSB7IHR0cy5zaG93U2VsZWN0ZWRJbnRlbnRUcmFmZmljKCk7IH0sCiAgICAgICAgICAgICAgICB0dDogJ01vbml0b3IgdHJhZmZpYyBvZiBzZWxlY3RlZCBpbnRlbnQnLAogICAgICAgICAgICAgICAgZ2lkOiAnaW50ZW50VHJhZmZpYycKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIF9rZXlPcmRlcjogWwogICAgICAgICAgICAgICAgJzAnLCAnQScsICdRJywgJ0YnLCAnVicsICdsZWZ0QXJyb3cnLCAncmlnaHRBcnJvdycsICdXJwogICAgICAgICAgICBdCiAgICAgICAgfSwKCiAgICAgICAgaG9va3M6IHsKICAgICAgICAgICAgLy8gaG9vayBmb3IgaGFuZGxpbmcgZXNjYXBlIGtleQogICAgICAgICAgICBlc2NhcGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIE11c3QgcmV0dXJuIHRydWUgdG8gY29uc3VtZSBFU0MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICAgIHJldHVybiB0dHMuY2FuY2VsVHJhZmZpYyh0cnVlKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIGhvb2tzIGZvciB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4uLgogICAgICAgICAgICBlbXB0eTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdHRzLmNhbmNlbFRyYWZmaWMoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2luZ2xlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgdHRzLnJlcXVlc3RUcmFmZmljRm9yTW9kZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBtdWx0aTogZnVuY3Rpb24gKHNlbGVjdE9yZGVyKSB7CiAgICAgICAgICAgICAgICB0dHMucmVxdWVzdFRyYWZmaWNGb3JNb2RlKCk7CiAgICAgICAgICAgICAgICB0b3YuYWRkRGV0YWlsQnV0dG9uKCdzaG93UmVsYXRlZFRyYWZmaWMnKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIG1vdXNlIGhvb2tzCiAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24gKG0pIHsKICAgICAgICAgICAgICAgIC8vIG0gaGFzIGlkLCBjbGFzcywgYW5kIHR5cGUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgdHRzLnJlcXVlc3RUcmFmZmljRm9yTW9kZSh0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHR0cy5yZXF1ZXN0VHJhZmZpY0Zvck1vZGUodHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8vIGludm9rZSBjb2RlIHRvIHJlZ2lzdGVyIHdpdGggdGhlIG92ZXJsYXkgc2VydmljZQogICAgYW5ndWxhci5tb2R1bGUoJ292VG9wbycpCiAgICAgICAgLnJ1bihbJyRsb2cnLCAnVG9wb092ZXJsYXlTZXJ2aWNlJywgJ1RvcG9UcmFmZmljU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF90b3ZfLCBfdHRzXykgewogICAgICAgICAgICAkbG9nID0gXyRsb2dfOwogICAgICAgICAgICB0b3YgPSBfdG92XzsKICAgICAgICAgICAgdHRzID0gX3R0c187CiAgICAgICAgICAgIHRvdi5yZWdpc3RlcihvdmVybGF5KTsKICAgICAgICB9XSk7Cgp9KCkpOwqM3O9WMhgHAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0LgZAAEAGfNfAqAc2wKgHYJUnH/XbkpdeOVaaLoAQDzPV8gAAAQEICgCjXxkATaYUjNzvVj0aBwCLAgAAiwIAAAgAJ60eE2j3KB/SxQgARQACfXBwQABABjgkwKgHNsCoB2CVKx/19mpjsWc+skCAGAWkAdQAAAEBCAoAo18ZAE2mFEdFVCAvb25vcy91aS9hcHAvdmlldy9ob3N0L2hvc3QuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71avGgcAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoHB0kAAQAbmvcCoBzbAqAdglS0f9U/Zw9Gmk8+vgBgFpBamAAABAQgKAKNfGQBNphRHRVQgL29ub3MvdWkvYXBwL3ZpZXcvaW50ZW50L2ludGVudC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVskaBwBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANI2rQABABh0ywKgHYMCoBzYf9ZUtppPPr0/Zxh6AEAGDkA0AAAEBCAoATaYVAKNfGYzc71aqHQcAiQIAAIkCAAAIACetHhNo9ygf0sUIAEUAAnsuB0AAQAZ6j8CoBzbAqAdglScf9duSl145VpougBgPM3EfAAABAQgKAKNfGQBNphRHRVQgL29ub3MvdWkvYXBwL3ZpZXcvYXBwL2FwcC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVpAnBwCgBwAAoAcAAGj3KB/SxQgAJ60eEwgARQAHko2sQABABhXTwKgHYMCoBzYf9ZUtppPPr0/Zxh6AGAGDl2sAAAEBCAoATaYVAKNfGUhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNzgxDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEludGVudCBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgYW5ndWxhci5tb2R1bGUoJ292SW50ZW50JywgW10pCiAgICAgICAgLmNvbnRyb2xsZXIoJ092SW50ZW50Q3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ05hdlNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCB0YnMsIG5zKSB7CgogICAgICAgICAgICBmdW5jdGlvbiBzZWxDYigkZXZlbnQsIHJvdykgewogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnR290IGEgY2xpY2sgb246Jywgcm93KTsKICAgICAgICAgICAgICAgIHZhciBtID0gLyhcZCspXHM6XHMoLiopLy5leGVjKHJvdy5hcHBJZCksCiAgICAgICAgICAgICAgICAgICAgaWQgPSBtID8gbVsxXSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG0gPyBtWzJdIDogbnVsbDsKCiAgICAgICAgICAgICAgICAkc2NvcGUuaW50ZW50RGF0YSA9ICgkc2NvcGUuc2VsSWQgJiYgbSkgPyB7CiAgICAgICAgICAgICAgICAgICAgaW50ZW50QXBwSWQ6IGlkLAogICAgICAgICAgICAgICAgICAgIGludGVudEFwcE5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgaW50ZW50S2V5OiByb3cua2V5CiAgICAgICAgICAgICAgICB9IDogbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICAgICAgc2NvcGU6ICRzY29wZSwKICAgICAgICAgICAgICAgIHRhZzogJ2ludGVudCcsCiAgICAgICAgICAgICAgICBzZWxDYjogc2VsQ2IsCiAgICAgICAgICAgICAgICBpZEtleTogJ2tleScKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUudG9wb1RpcCA9ICdTaG93IHNlbGVjdGVkIGludGVudCBvbiB0b3BvbG9neSB2aWV3JzsKCiAgICAgICAgICAgICRzY29wZS5zaG93SW50ZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGQgPSAkc2NvcGUuaW50ZW50RGF0YTsKICAgICAgICAgICAgICAgIGQgJiYgbnMubmF2VG8oJ3RvcG8nLCBkKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdkludGVudEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKjNzvVqsoBwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMHTQABABukJwKgHNsCoB2CVLR/1T9nGHqaT1w2AEAWkklYAAAEBCAoAo18aAE2mFYzc71bGLwcAkwIAAJMCAAAIACetHhNo9ygf0sUIAEUAAoXB1EAAQAbmt8CoBzbAqAdglS0f9U/Zxh6mk9cNgBgFpC0VAAABAQgKAKNfGgBNphVHRVQgL29ub3MvdWkvYXBwL3ZpZXcvc2V0dGluZ3Mvc2V0dGluZ3MuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bxQQcApgkAAKYJAABo9ygf0sUIACetHhMIAEUACZjuI0AAQAazVcCoB2DAqAc2H/WVKpOnkuTG6QeqgBgBZJlxAAABAQgKAE2mFwCjXxdIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMjI5OQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSwyMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEdyb3VwIFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHNjb3BlLCAkbG9jYXRpb24sIGZzLCB0YnMsIG5zOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkdyb3VwJywgW10pCiAgICAuY29udHJvbGxlcignT3ZHcm91cEN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGxvY2F0aW9uJywgJyRzY2UnLAogICAgICAgICAgICAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kc2NvcGVfLCBfJGxvY2F0aW9uXywgJHNjZSwgX2ZzXywgX3Ric18sIF9uc18pIHsKICAgICAgICAgICAgdmFyIHBhcmFtczsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2NhdGlvbiA9IF8kbG9jYXRpb25fOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHRicyA9IF90YnNfOwogICAgICAgICAgICBucyA9IF9uc187CiAgICAgICAgICAgICRzY29wZS5kZXZpY2VUaXAgPSAnU2hvdyBkZXZpY2UgdGFibGUnOwogICAgICAgICAgICAkc2NvcGUuZmxvd1RpcCA9ICdTaG93IGZsb3cgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUucG9ydFRpcCA9ICdTaG93IHBvcnQgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwogICAgICAgICAgICAkc2NvcGUubWV0ZXJUaXAgPSAnU2hvdyBtZXRlciB2aWV3IGZvciBzZWxlY3RlZCBkZXZpY2UnOwoKICAgICAgICAgICAgcGFyYW1zID0gJGxvY2F0aW9uLnNlYXJjaCgpOwogICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdkZXZJZCcpKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuZGV2SWQgPSBwYXJhbXNbJ2RldklkJ107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdncm91cCcsCiAgICAgICAgICAgICAgICBxdWVyeTogcGFyYW1zCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLiR3YXRjaCgndGFibGVEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFmcy5pc0VtcHR5T2JqZWN0KCRzY29wZS50YWJsZURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChncm91cCkgewogICAgICAgICAgICAgICAgICAgICAgICBncm91cC5idWNrZXRzID0gJHNjZS50cnVzdEFzSHRtbChncm91cC5idWNrZXRzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkc2NvcGUubmF2ID0gZnVuY3Rpb24gKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZGV2SWQpIHsKICAgICAgICAgICAgICAgICAgICBucy5uYXZUbyhwYXRoLCB7IGRldklkOiAkc2NvcGUuZGV2SWQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZHcm91cEN0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKjNzvVqNCBwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLf2QABABvLmwKgHNsCoB2CVKh/1xukHqpOnnEiAEAWkJ2sAAAEBCAoAo18cAE2mF4zc71b4RQcAkQIAAJECAAAIACetHhNo9ygf0sUIAEUAAoO390AAQAbwlsCoBzbAqAdglSof9cbpB6qTp5xIgBgFpOblAAABAQgKAKNfHABNphdHRVQgL29ub3MvdWkvYXBwL3ZpZXcvY2x1c3Rlci9jbHVzdGVyLmpzIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQWNjZXB0OiAqLyoNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WAVgHAJcJAACXCQAAaPcoH9LFCAAnrR4TCABFAAmJbvZAAEAGMpLAqAdgwKgHNh/1lSxw2HcFBQnb74AYAWyZYgAAAQEICgBNphkAo18XSFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KQ29udGVudC1MZW5ndGg6IDIyODQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KLyoKICogQ29weXJpZ2h0IDIwMTYgT3BlbiBOZXR3b3JraW5nIExhYm9yYXRvcnkKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogT05PUyBHVUkgLS0gTWV0ZXIgVmlldyBNb2R1bGUKICovCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmZXJlbmNlcwogICAgdmFyICRsb2csICRzY29wZSwgJGxvY2F0aW9uLCBmcywgdGJzLCBuczsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZNZXRlcicsIFtdKQogICAgLmNvbnRyb2xsZXIoJ092TWV0ZXJDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRsb2NhdGlvbicsICckc2NlJywKICAgICAgICAgICAgJ0ZuU2VydmljZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywgJ05hdlNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoXyRsb2dfLCBfJHNjb3BlXywgXyRsb2NhdGlvbl8sICRzY2UsIF9mc18sIF90YnNfLCBfbnNfKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXM7CiAgICAgICAgICAgICRsb2cgPSBfJGxvZ187CiAgICAgICAgICAgICRzY29wZSA9IF8kc2NvcGVfOwogICAgICAgICAgICAkbG9jYXRpb24gPSBfJGxvY2F0aW9uXzsKICAgICAgICAgICAgZnMgPSBfZnNfOwogICAgICAgICAgICB0YnMgPSBfdGJzXzsKICAgICAgICAgICAgbnMgPSBfbnNfOwogICAgICAgICAgICAkc2NvcGUuZGV2aWNlVGlwID0gJ1Nob3cgZGV2aWNlIHRhYmxlJzsKICAgICAgICAgICAgJHNjb3BlLmZsb3dUaXAgPSAnU2hvdyBmbG93IHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLnBvcnRUaXAgPSAnU2hvdyBwb3J0IHZpZXcgZm9yIHRoaXMgZGV2aWNlJzsKICAgICAgICAgICAgJHNjb3BlLmdyb3VwVGlwID0gJ1Nob3cgZ3JvdXAgdmlldyBmb3IgdGhpcyBkZXZpY2UnOwoKICAgICAgICAgICAgcGFyYW1zID0gJGxvY2F0aW9uLnNlYXJjaCgpOwogICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdkZXZJZCcpKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuZGV2SWQgPSBwYXJhbXNbJ2RldklkJ107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdtZXRlcicsCiAgICAgICAgICAgICAgICBxdWVyeTogcGFyYW1zCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHNjb3BlLiR3YXRjaCgndGFibGVEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFmcy5pc0VtcHR5T2JqZWN0KCRzY29wZS50YWJsZURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRlci5iYW5kcyA9ICRzY2UudHJ1c3RBc0h0bWwobWV0ZXIuYmFuZHMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5kZXZJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgsIHsgZGV2SWQ6ICRzY29wZS5kZXZJZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdk1ldGVyQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpO4zc71ZCWAcAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTkpUAAQAbGN8CoBzbAqAdglSwf9QUJ2+9w2IBagBADy1WXAAABAQgKAKNfHQBNphmM3O9W4VwHAJUCAACVAgAACAAnrR4TaPcoH9LFCABFAAKH5KZAAEAGw+PAqAc2wKgHYJUsH/UFCdvvcNiAWoAYA8s+JwAAAQEICgCjXx0ATaYZR0VUIC9vbm9zL3VpL2FwcC92aWV3L3Byb2Nlc3Nvci9wcm9jZXNzb3IuanMgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpBY2NlcHQ6ICovKg0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71Z3YwcAMgcAADIHAABo9ygf0sUIACetHhMIAEUAByRu+EAAQAY09cCoB2DAqAc2H/WVLHDYgFoFCd5CgBgBdpb9AAABAQgKAE2mGQCjXx1IVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTY3MQ0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBQYWNrZXQgUHJvY2Vzc29yIFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBpbmplY3RlZCByZWZlcmVuY2VzCiAgICB2YXIgJGxvZywgJHNjb3BlLCAkbG9jYXRpb24sIGZzLCB0YnMsIG5zOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlByb2Nlc3NvcicsIFtdKQogICAgLmNvbnRyb2xsZXIoJ092UHJvY2Vzc29yQ3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICckbG9jYXRpb24nLAogICAgICAgICAgICAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLCAnTmF2U2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uIChfJGxvZ18sIF8kc2NvcGVfLCBfJGxvY2F0aW9uXywgX2ZzXywgX3Ric18sIF9uc18pIHsKICAgICAgICAgICAgdmFyIHBhcmFtczsKICAgICAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAgICAgJHNjb3BlID0gXyRzY29wZV87CiAgICAgICAgICAgICRsb2NhdGlvbiA9IF8kbG9jYXRpb25fOwogICAgICAgICAgICBmcyA9IF9mc187CiAgICAgICAgICAgIHRicyA9IF90YnNfOwogICAgICAgICAgICBucyA9IF9uc187CiAgICAgICAgICAgICRzY29wZS5yZXF1ZXN0VGlwID0gJ1Nob3cgcGFja2V0IHJlcXVlc3RzJzsKCiAgICAgICAgICAgIHBhcmFtcyA9ICRsb2NhdGlvbi5zZWFyY2goKTsKCiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdwcm9jZXNzb3InLAogICAgICAgICAgICAgICAgcXVlcnk6IHBhcmFtcwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS5uYXYgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRzY29wZS5kZXZJZCkgewogICAgICAgICAgICAgICAgICAgIG5zLm5hdlRvKHBhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJGxvZy5sb2coJ092UHJvY2Vzc29yQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwqM3O9WtWMHAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05KdAAEAGxjXAqAc2wKgHYJUsH/UFCd5CcNiHSoAQA+dMNwAAAQEICgCjXx4ATaYZjNzvVkRmBwBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANDfYQABABnMFwKgHYMCoBzYf9ZUnOVaaLtuSmaWAEAF0kA0AAAEBCAoATaYZAKNfGYzc71aFZwcAjwIAAI8CAAAIACetHhNo9ygf0sUIAEUAAoHkqEAAQAbD58CoBzbAqAdglSwf9QUJ3kJw2IdKgBgD58LVAAABAQgKAKNfHgBNphlHRVQgL29ub3MvdWkvYXBwL3ZpZXcvdHVubmVsL3R1bm5lbC5qcyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkFjY2VwdDogKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVidtBwAEBgAABAYAAGj3KB/SxQgAJ60eEwgARQAF9m76QABABjYhwKgHYMCoBzYf9ZUscNiHSgUJ4I+AGAF/lc8AAAEBCAoATaYaAKNfHkhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMzY5DQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEhvc3QgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlR1bm5lbCcsIFtdKQogICAgLmNvbnRyb2xsZXIoJ092VHVubmVsQ3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICckc2NlJywgJ0ZuU2VydmljZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKCRsb2csICRzY29wZSwgJHNjZSwgZnMsIHRicykgewogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAndHVubmVsJwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS4kd2F0Y2goJ3RhYmxlRGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICghZnMuaXNFbXB0eU9iamVjdCgkc2NvcGUudGFibGVEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS50YWJsZURhdGEuZm9yRWFjaChmdW5jdGlvbiAodHVubmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdHVubmVsLmRpcmVjdGlvbiA9ICRzY2UudHJ1c3RBc0h0bWwodHVubmVsLmRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJGxvZy5sb2coJ092VHVubmVsQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICAgICAgfV0pOwp9KCkpOwqM3O9WbG0HAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05KlAAEAGxjPAqAc2wKgHYJUsH/UFCeCPcNiNDIAQA/5EEAAAAQEICgCjXx4ATaYajNzvVntzBwCuOAAArjgAAGj3KB/SxQgAJ60eEwgARQA4oDfZQABABjqYwKgHYMCoBzYf9ZUnOVaaLtuSmaWAGAF0yHkAAAEBCAoATaYaAKNfGUhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxNDMzOA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNS0yMDE2IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEFwcCBWaWV3IE1vZHVsZQogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gaW5qZWN0ZWQgcmVmcwogICAgdmFyICRsb2csICRzY29wZSwgd3NzLCBmcywga3MsIHBzLCBpczsKCiAgICAvLyBpbnRlcm5hbCBzdGF0ZQogICAgdmFyICBkZXRhaWxzUGFuZWwsCiAgICAgICAgIHBTdGFydFksCiAgICAgICAgIHBIZWlnaHQsCiAgICAgICAgIHRvcCwKICAgICAgICAgbWlkZGxlLAogICAgICAgICBib3R0b20sCiAgICAgICAgIHdTaXplID0gZmFsc2U7CgogICAgLy8gY29uc3RhbnRzCiAgICB2YXIgSU5TVEFMTEVEID0gJ0lOU1RBTExFRCcsCiAgICAgICAgQUNUSVZFID0gJ0FDVElWRScsCiAgICAgICAgYXBwTWdtdFJlcSA9ICdhcHBNYW5hZ2VtZW50UmVxdWVzdCcsCiAgICAgICAgdG9wUGRnID0gNTAsCiAgICAgICAgcGFuZWxXaWR0aCA9IDUwMCwKICAgICAgICBwTmFtZSA9ICdhcHBsaWNhdGlvbi1kZXRhaWxzLXBhbmVsJywKICAgICAgICBkZXRhaWxzUmVxID0gJ2FwcERldGFpbHNSZXF1ZXN0JywKICAgICAgICBkZXRhaWxzUmVzcCA9ICdhcHBEZXRhaWxzUmVzcG9uc2UnLAogICAgICAgIGZpbGVVcGxvYWRVcmwgPSAnYXBwbGljYXRpb25zL3VwbG9hZCcsCiAgICAgICAgaWNvblVybFByZWZpeCA9ICdycy9hcHBsaWNhdGlvbnMvJywKICAgICAgICBpY29uVXJsU3VmZml4ID0gJy9pY29uJywKICAgICAgICBkaWFsb2dJZCA9ICdhcHAtZGlhbG9nJywKICAgICAgICBkaWFsb2dPcHRzID0gewogICAgICAgICAgICBlZGdlOiAncmlnaHQnCiAgICAgICAgfSwKICAgICAgICBzdHJvbmdXYXJuaW5nID0gewogICAgICAgICAgICAnb3JnLm9ub3Nwcm9qZWN0LmRyaXZlcnMnOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBkaXNjb3VyYWdlbWVudCA9ICdEZWFjdGl2YXRpbmcgb3IgdW5pbnN0YWxsaW5nIHRoaXMgY29tcG9uZW50IGNhbicgKwogICAgICAgICcgaGF2ZSBzZXJpb3VzIG5lZ2F0aXZlIGNvbnNlcXVlbmNlcyEgRG8gc28gYXQgeW91ciBvd24gcmlzayEhJywKICAgICAgICBwcm9wT3JkZXIgPSBbJ2lkJywgJ3N0YXRlJywgJ2NhdGVnb3J5JywgJ3ZlcnNpb24nLCAnb3JpZ2luJywgJ3JvbGUnXSwKICAgICAgICBmcmllbmRseVByb3BzID0gWydBcHAgSUQnLCAnU3RhdGUnLCAnQ2F0ZWdvcnknLCAnVmVyc2lvbicsICdPcmlnaW4nLCAnUm9sZSddOwogICAgICAgIC8vIG5vdGU6IHVybCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkKCiAgICBmdW5jdGlvbiBjcmVhdGVEZXRhaWxzUGFuZSgpIHsKICAgICAgICBkZXRhaWxzUGFuZWwgPSBwcy5jcmVhdGVQYW5lbChwTmFtZSwgewogICAgICAgICAgICB3aWR0aDogd1NpemUud2lkdGgsCiAgICAgICAgICAgIG1hcmdpbjogMCwKICAgICAgICAgICAgaGlkZU1hcmdpbjogMAogICAgICAgIH0pOwogICAgICAgIGRldGFpbHNQYW5lbC5lbCgpLnN0eWxlKHsKICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgICAgIHRvcDogcFN0YXJ0WSArICdweCcKICAgICAgICB9KTsKICAgICAgICAkc2NvcGUuaGlkZVBhbmVsID0gZnVuY3Rpb24gKCkgeyBkZXRhaWxzUGFuZWwuaGlkZSgpOyB9OwogICAgICAgIGRldGFpbHNQYW5lbC5oaWRlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xvc2VQYW5lbCgpIHsKICAgICAgICBpZiAoZGV0YWlsc1BhbmVsLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICRzY29wZS5zZWxJZCA9IG51bGw7CiAgICAgICAgICAgIGRldGFpbHNQYW5lbC5oaWRlKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQ2xvc2VCdG4oZGl2KSB7CiAgICAgICAgaXMubG9hZEVtYmVkZGVkSWNvbihkaXYsICdwbHVzJywgMzApOwogICAgICAgIGRpdi5zZWxlY3QoJ2cnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDI1LCAwKSByb3RhdGUoNDUpJyk7CiAgICAgICAgZGl2Lm9uKCdjbGljaycsIGNsb3NlUGFuZWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFVwUGFuZWwoKSB7CiAgICAgICAgdmFyIGNvbnRhaW5lciwgY2xvc2VCdG4sIGRpdjsKCiAgICAgICAgZGV0YWlsc1BhbmVsLmVtcHR5KCk7CiAgICAgICAgZGV0YWlsc1BhbmVsLndpZHRoKHBhbmVsV2lkdGgpOwoKICAgICAgICBjb250YWluZXIgPSBkZXRhaWxzUGFuZWwuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjb250YWluZXInLCB0cnVlKTsKCiAgICAgICAgdG9wID0gY29udGFpbmVyLmFwcGVuZCgnZGl2JykuY2xhc3NlZCgndG9wJywgdHJ1ZSk7CiAgICAgICAgY2xvc2VCdG4gPSB0b3AuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjbG9zZS1idG4nLCB0cnVlKTsKICAgICAgICBhZGRDbG9zZUJ0bihjbG9zZUJ0bik7CgogICAgICAgIGRpdiA9IHRvcC5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ3RvcC1jb250ZW50JywgdHJ1ZSk7CgogICAgICAgIGZ1bmN0aW9uIG5kaXYoY2xzLCB0Y2xzKSB7CiAgICAgICAgICAgIHZhciAgZCA9IGRpdi5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoY2xzLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHRjbHMpIHsKICAgICAgICAgICAgICAgIGQuYXBwZW5kKCd0YWJsZScpLmNsYXNzZWQodGNscywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5kaXYoJ2xlZnQgYXBwLWljb24nKTsKICAgICAgICBuZGl2KCdyaWdodCcsICdhcHAtcHJvcHMnKTsKICAgICAgICBuZGl2KCdhcHAtdXJsJyk7CgogICAgICAgIGNvbnRhaW5lci5hcHBlbmQoJ2hyJyk7CgogICAgICAgIG1pZGRsZSA9IGNvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ21pZGRsZScsIHRydWUpOwogICAgICAgIG1pZGRsZS5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2FwcC1yZWFkbWUnLCB0cnVlKTsKCiAgICAgICAgY29udGFpbmVyLmFwcGVuZCgnaHInKTsKCiAgICAgICAgLy8gVE9ETzogbWFrZSBib3R0b20gY29udGFpbmVyIHNjcm9sbGFibGUKICAgICAgICBib3R0b20gPSBjb250YWluZXIuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdib3R0b20nLCB0cnVlKTsKCiAgICAgICAgZnVuY3Rpb24gblRhYmxlKGhkciwgY2xzKSB7CiAgICAgICAgICAgIGJvdHRvbS5hcHBlbmQoJ2gyJykuaHRtbChoZHIpOwogICAgICAgICAgICBib3R0b20uYXBwZW5kKCdkaXYnKS5jbGFzc2VkKGNscywgdHJ1ZSkuYXBwZW5kKCd0YWJsZScpOwogICAgICAgIH0KCiAgICAgICAgblRhYmxlKCdGZWF0dXJlcycsICdmZWF0dXJlcycpOwogICAgICAgIG5UYWJsZSgnUmVxdWlyZWQgQXBwcycsICdyZXF1aXJlZC1hcHBzJyk7CiAgICAgICAgblRhYmxlKCdQZXJtaXNzaW9ucycsICdwZXJtaXNzaW9ucycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFByb3AodGJvZHksIGluZGV4LCB2YWx1ZSkgewogICAgICAgIHZhciB0ciA9IHRib2R5LmFwcGVuZCgndHInKSwKICAgICAgICAgICAgdmNscyA9IGluZGV4ID8gJ3ZhbHVlJyA6ICd2YWx1ZS1ib2xkJzsKCiAgICAgICAgZnVuY3Rpb24gYWRkQ2VsbChjbHMsIHR4dCkgewogICAgICAgICAgICB0ci5hcHBlbmQoJ3RkJykuYXR0cignY2xhc3MnLCBjbHMpLmh0bWwodHh0KTsKICAgICAgICB9CgogICAgICAgIGFkZENlbGwoJ2xhYmVsJywgZnJpZW5kbHlQcm9wc1tpbmRleF0gKyAnOicpOwogICAgICAgIGFkZENlbGwodmNscywgdmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVybGl6ZSh1KSB7CiAgICAgICAgcmV0dXJuICc8aT5VUkw6PC9pPiA8YSBocmVmPSInICsgdSArICciIHRhcmdldD0iX2JsYW5rIj4nICsgdSArICc8L2E+JzsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRJY29uKGVsZW0sIHZhbHVlKSB7CiAgICAgICAgZWxlbS5hcHBlbmQoJ2ltZycpLmF0dHIoJ3NyYycsIGljb25VcmxQcmVmaXggKyB2YWx1ZSArIGljb25VcmxTdWZmaXgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlVG9wKGRldGFpbHMpIHsKICAgICAgICB2YXIgcHJvcHNCb2R5ID0gdG9wLnNlbGVjdCgnLmFwcC1wcm9wcycpLmFwcGVuZCgndGJvZHknKSwKICAgICAgICAgICAgdXJsID0gZGV0YWlscy51cmw7CgogICAgICAgIGFkZEljb24odG9wLnNlbGVjdCgnLmFwcC1pY29uJyksIGRldGFpbHMuaWQpOwoKICAgICAgICBwcm9wT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocHJvcCwgaSkgewogICAgICAgICAgICBhZGRQcm9wKHByb3BzQm9keSwgaSwgZGV0YWlsc1twcm9wXSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgdG9wLnNlbGVjdCgnLmFwcC11cmwnKS5odG1sKHVybGl6ZSh1cmwpKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVNaWRkbGUoZGV0YWlscykgewogICAgICAgIG1pZGRsZS5zZWxlY3QoJy5hcHAtcmVhZG1lJykudGV4dChkZXRhaWxzLnJlYWRtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVCb3R0b20oZGV0YWlscykgewoKICAgICAgICBmdW5jdGlvbiBhZGRJdGVtcyhjbHMsIGl0ZW1zKSB7CiAgICAgICAgICAgIHZhciB0YWJsZSA9IGJvdHRvbS5zZWxlY3QoJy4nICsgY2xzKS5zZWxlY3QoJ3RhYmxlJyksCiAgICAgICAgICAgICAgICB0Ym9keSA9IHRhYmxlLmFwcGVuZCgndGJvZHknKTsKCiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIHRib2R5LmFwcGVuZCgndHInKS5hcHBlbmQoJ3RkJykuaHRtbChpdGVtKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBhZGRJdGVtcygnZmVhdHVyZXMnLCBkZXRhaWxzLmZlYXR1cmVzKTsKICAgICAgICBhZGRJdGVtcygncmVxdWlyZWQtYXBwcycsIGRldGFpbHMucmVxdWlyZWRfYXBwcyk7CiAgICAgICAgYWRkSXRlbXMoJ3Blcm1pc3Npb25zJywgZGV0YWlscy5wZXJtaXNzaW9ucyk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wdWxhdGVEZXRhaWxzKGRldGFpbHMpIHsKICAgICAgICBzZXRVcFBhbmVsKCk7CiAgICAgICAgcG9wdWxhdGVUb3AoZGV0YWlscyk7CiAgICAgICAgcG9wdWxhdGVNaWRkbGUoZGV0YWlscyk7CiAgICAgICAgcG9wdWxhdGVCb3R0b20oZGV0YWlscyk7CiAgICAgICAgZGV0YWlsc1BhbmVsLmhlaWdodChwSGVpZ2h0KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNwRGV0YWlsc0NiKGRhdGEpIHsKICAgICAgICAkc2NvcGUucGFuZWxEYXRhID0gZGF0YS5kZXRhaWxzOwogICAgICAgICRzY29wZS4kYXBwbHkoKTsKICAgIH0KCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZBcHAnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkFwcEN0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnJGh0dHAnLAogICAgICAgICAnV2ViU29ja2V0U2VydmljZScsICdGblNlcnZpY2UnLCAnS2V5U2VydmljZScsICdQYW5lbFNlcnZpY2UnLAogICAgICAgICAnSWNvblNlcnZpY2UnLCAnVXJsRm5TZXJ2aWNlJywgJ0RpYWxvZ1NlcnZpY2UnLCAnVGFibGVCdWlsZGVyU2VydmljZScsCgogICAgZnVuY3Rpb24gKF8kbG9nXywgXyRzY29wZV8sICRodHRwLCBfd3NzXywgX2ZzXywgX2tzXywgX3BzXywgX2lzXywgdWZzLCBkcywgdGJzKSB7CiAgICAgICAgJGxvZyA9IF8kbG9nXzsKICAgICAgICAkc2NvcGUgPSBfJHNjb3BlXzsKICAgICAgICB3c3MgPSBfd3NzXzsKICAgICAgICBmcyA9IF9mc187CiAgICAgICAga3MgPSBfa3NfOwogICAgICAgIHBzID0gX3BzXzsKICAgICAgICBpcyA9IF9pc187CiAgICAgICAgJHNjb3BlLnBhbmVsRGF0YSA9IHt9OwogICAgICAgICRzY29wZS5jdHJsQnRuU3RhdGUgPSB7fTsKICAgICAgICAkc2NvcGUudXBsb2FkVGlwID0gJ1VwbG9hZCBhbiBhcHBsaWNhdGlvbiAoLm9hciBmaWxlKSc7CiAgICAgICAgJHNjb3BlLmFjdGl2YXRlVGlwID0gJ0FjdGl2YXRlIHNlbGVjdGVkIGFwcGxpY2F0aW9uJzsKICAgICAgICAkc2NvcGUuZGVhY3RpdmF0ZVRpcCA9ICdEZWFjdGl2YXRlIHNlbGVjdGVkIGFwcGxpY2F0aW9uJzsKICAgICAgICAkc2NvcGUudW5pbnN0YWxsVGlwID0gJ1VuaW5zdGFsbCBzZWxlY3RlZCBhcHBsaWNhdGlvbic7CgogICAgICAgIHZhciBoYW5kbGVycyA9IHt9OwoKICAgICAgICAvLyBkZXRhaWxzIHBhbmVsIGhhbmRsZXJzCiAgICAgICAgaGFuZGxlcnNbZGV0YWlsc1Jlc3BdID0gcmVzcERldGFpbHNDYjsKICAgICAgICB3c3MuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKCiAgICAgICAgZnVuY3Rpb24gc2VsQ2IoJGV2ZW50LCByb3cpIHsKICAgICAgICAgICAgLy8gJHNjb3BlLnNlbElkIGlzIHNldCBieSBjb2RlIGluIHRhYmxlQnVpbGRlcgogICAgICAgICAgICAkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbiA9ICEhJHNjb3BlLnNlbElkOwogICAgICAgICAgICByZWZyZXNoQ3RybHMoKTsKICAgICAgICAgICAgZHMuY2xvc2VEaWFsb2coKTsgIC8vIGRvbid0IHdhbnQgZGlhbG9nIGZyb20gcHJldmlvdXMgc2VsZWN0aW9uCgogICAgICAgICAgICBpZiAoJHNjb3BlLnNlbElkKSB7CiAgICAgICAgICAgICAgICB3c3Muc2VuZEV2ZW50KGRldGFpbHNSZXEsIHsgaWQ6IHJvdy5pZCB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzY29wZS5oaWRlUGFuZWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVmcmVzaEN0cmxzKCkgewogICAgICAgICAgICB2YXIgcm93LCByb3dJZHg7CiAgICAgICAgICAgIGlmICgkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgcm93SWR4ID0gZnMuZmluZCgkc2NvcGUuc2VsSWQsICRzY29wZS50YWJsZURhdGEpOwogICAgICAgICAgICAgICAgcm93ID0gcm93SWR4ID49IDAgPyAkc2NvcGUudGFibGVEYXRhW3Jvd0lkeF0gOiBudWxsOwoKICAgICAgICAgICAgICAgICRzY29wZS5jdHJsQnRuU3RhdGUuaW5zdGFsbGVkID0gcm93ICYmIHJvdy5zdGF0ZSA9PT0gSU5TVEFMTEVEOwogICAgICAgICAgICAgICAgJHNjb3BlLmN0cmxCdG5TdGF0ZS5hY3RpdmUgPSByb3cgJiYgcm93LnN0YXRlID09PSBBQ1RJVkU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuY3RybEJ0blN0YXRlLmluc3RhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJHNjb3BlLmN0cmxCdG5TdGF0ZS5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGJzLmJ1aWxkVGFibGUoewogICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICB0YWc6ICdhcHAnLAogICAgICAgICAgICBzZWxDYjogc2VsQ2IsCiAgICAgICAgICAgIHJlc3BDYjogcmVmcmVzaEN0cmxzLAogICAgICAgICAgICAvLyBwcmUtcG9wdWxhdGUgc29ydCBzbyBhY3RpdmUgYXBwcyBhcmUgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAogICAgICAgICAgICBzb3J0UGFyYW1zOiB7CiAgICAgICAgICAgICAgICBmaXJzdENvbDogJ3N0YXRlJywKICAgICAgICAgICAgICAgIGZpcnN0RGlyOiAnZGVzYycsCiAgICAgICAgICAgICAgICBzZWNvbmRDb2w6ICdpZCcsCiAgICAgICAgICAgICAgICBzZWNvbmREaXI6ICdhc2MnCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gVE9ETzogcmVleGFtaW5lIHdoZXJlIGtleWJpbmRpbmdzIHNob3VsZCBiZSAtIGRpcmVjdGl2ZSBvciBjb250cm9sbGVyPwogICAgICAgIGtzLmtleUJpbmRpbmdzKHsKICAgICAgICAgICAgZXNjOiBbJHNjb3BlLnNlbGVjdENhbGxiYWNrLCAnRGVzZWxlY3QgYXBwbGljYXRpb24nXSwKICAgICAgICAgICAgX2hlbHBGb3JtYXQ6IFsnZXNjJ10KICAgICAgICB9KTsKICAgICAgICBrcy5nZXN0dXJlTm90ZXMoWwogICAgICAgICAgICBbJ2NsaWNrIHJvdycsICdTZWxlY3QgLyBkZXNlbGVjdCBhcHBsaWNhdGlvbiddLAogICAgICAgICAgICBbJ3Njcm9sbCBkb3duJywgJ1NlZSBtb3JlIGFwcGxpY2F0aW9ucyddCiAgICAgICAgXSk7CgogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbmZpcm1hdGlvblRleHQoYWN0aW9uLCBpdGVtSWQpIHsKICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBkcy5jcmVhdGVEaXYoKTsKICAgICAgICAgICAgY29udGVudC5hcHBlbmQoJ3AnKS50ZXh0KGZzLmNhcChhY3Rpb24pICsgJyAnICsgaXRlbUlkKTsKICAgICAgICAgICAgaWYgKHN0cm9uZ1dhcm5pbmdbaXRlbUlkXSkgewogICAgICAgICAgICAgICAgY29udGVudC5hcHBlbmQoJ3AnKS50ZXh0KGRpc2NvdXJhZ2VtZW50KS5jbGFzc2VkKCdzdHJvbmcnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNvbmZpcm1BY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgICAgIHZhciBpdGVtSWQgPSAkc2NvcGUuc2VsSWQsCiAgICAgICAgICAgICAgICBzcGFyID0gJHNjb3BlLnNvcnRQYXJhbXM7CgogICAgICAgICAgICBmdW5jdGlvbiBkT2soKSB7CiAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdJbml0aWF0aW5nJywgYWN0aW9uLCAnb2YnLCBpdGVtSWQpOwogICAgICAgICAgICAgICAgd3NzLnNlbmRFdmVudChhcHBNZ210UmVxLCB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbUlkLAogICAgICAgICAgICAgICAgICAgIHNvcnRDb2w6IHNwYXIuc29ydENvbCwKICAgICAgICAgICAgICAgICAgICBzb3J0RGlyOiBzcGFyLnNvcnREaXIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkQ2FuY2VsKCkgewogICAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnQ2FuY2VsaW5nJywgYWN0aW9uLCAnb2YnLCBpdGVtSWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkcy5vcGVuRGlhbG9nKGRpYWxvZ0lkLCBkaWFsb2dPcHRzKQogICAgICAgICAgICAgICAgLnNldFRpdGxlKCdDb25maXJtIEFjdGlvbicpCiAgICAgICAgICAgICAgICAuYWRkQ29udGVudChjcmVhdGVDb25maXJtYXRpb25UZXh0KGFjdGlvbiwgaXRlbUlkKSkKICAgICAgICAgICAgICAgIC5hZGRPayhkT2spCiAgICAgICAgICAgICAgICAuYWRkQ2FuY2VsKGRDYW5jZWwpCiAgICAgICAgICAgICAgICAuYmluZEtleXMoKTsKICAgICAgICB9CgogICAgICAgICRzY29wZS5hcHBBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uKSB7CiAgICAgICAgICAgIGlmICgkc2NvcGUuY3RybEJ0blN0YXRlLnNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgY29uZmlybUFjdGlvbihhY3Rpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLiRvbignRmlsZUNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICBpZiAoJHNjb3BlLmFwcEZpbGUpIHsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsICRzY29wZS5hcHBGaWxlKTsKICAgICAgICAgICAgICAgICRodHRwLnBvc3QodWZzLnJzVXJsKGZpbGVVcGxvYWRVcmwpLCBmb3JtRGF0YSwgewogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGFuZ3VsYXIuaWRlbnRpdHksCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zb3J0Q2FsbGJhY2soJHNjb3BlLnNvcnRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRGaWxlRm9ybScpLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGtzLnVuYmluZEtleXMoKTsKICAgICAgICAgICAgd3NzLnVuYmluZEhhbmRsZXJzKGhhbmRsZXJzKTsKICAgICAgICB9KTsKCiAgICAgICAgJGxvZy5sb2coJ092QXBwQ3RybCBoYXMgYmVlbiBjcmVhdGVkJyk7CiAgICB9XSkKCiAgICAvLyB0cmlnZ2VycyB0aGUgaW5wdXQgZm9ybSB0byBhcHBlYXIgd2hlbiBidXR0b24gaXMgY2xpY2tlZAogICAgLmRpcmVjdGl2ZSgndHJpZ2dlckZvcm0nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtKSB7CiAgICAgICAgICAgICAgICBlbGVtLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRGaWxlJykKICAgICAgICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkKCiAgICAvLyBiaW5kcyB0aGUgbW9kZWwgZmlsZSB0byB0aGUgc2NvcGUgaW4gc2NvcGUuYXBwRmlsZQogICAgLy8gc2VuZHMgdXBsb2FkIHJlcXVlc3QgdG8gdGhlIHNlcnZlcgogICAgLmRpcmVjdGl2ZSgnZmlsZU1vZGVsJywgWyckcGFyc2UnLAogICAgICAgICAgICBmdW5jdGlvbiAoJHBhcnNlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycykgewogICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gJHBhcnNlKGF0dHJzLmZpbGVNb2RlbCksCiAgICAgICAgICAgICAgICAgICAgbW9kZWxTZXR0ZXIgPSBtb2RlbC5hc3NpZ247CgogICAgICAgICAgICAgICAgZWxlbS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxTZXR0ZXIoc2NvcGUsIGVsZW1bMF0uZmlsZXNbMF0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHNjb3BlLiRlbWl0KCdGaWxlQ2hhbmdlZCcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfV0pCgogICAgLmRpcmVjdGl2ZSgnYXBwbGljYXRpb25EZXRhaWxzUGFuZWwnLAogICAgICAgIFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyR0aW1lb3V0JywgJ0tleVNlcnZpY2UnLAogICAgICAgIGZ1bmN0aW9uICgkcm9vdFNjb3BlLCAkd2luZG93LCAkdGltZW91dCwga3MpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSkgewogICAgICAgICAgICAgICAgdmFyIHVuYmluZFdhdGNoOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhlaWdodENhbGMoKSB7CiAgICAgICAgICAgICAgICAgICAgcFN0YXJ0WSA9IGZzLm5vUHhTdHlsZShkMy5zZWxlY3QoJy50YWJ1bGFyLWhlYWRlcicpLCAnaGVpZ2h0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9wUGRnOwogICAgICAgICAgICAgICAgICAgIHdTaXplID0gZnMud2luZG93U2l6ZShwU3RhcnRZKTsKICAgICAgICAgICAgICAgICAgICBwSGVpZ2h0ID0gd1NpemUuaGVpZ2h0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRQYW5lbCgpIHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHRDYWxjKCk7CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGV0YWlsc1BhbmUoKTsKICAgICAgICAgICAgICAgICAgICAkbG9nLmRlYnVnKCdzdGFydCB0byBpbml0aWFsaXplIHBhbmVsIScpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBoYXMgYSBidWcgd2hlcmUgaXQgcmVuZGVycyB0aGUgZml4ZWQtbGF5b3V0IHRhYmxlIHdyb25nCiAgICAgICAgICAgICAgICAvLyBpZiB5b3UgYXNrIGZvciB0aGUgd2luZG93J3Mgc2l6ZSB0b28gZWFybHkKICAgICAgICAgICAgICAgIGlmIChzY29wZS5vbm9zLmJyb3dzZXIgPT09ICdzYWZhcmknKSB7CiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoaW5pdFBhbmVsKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFBhbmVsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjcmVhdGUga2V5IGJpbmRpbmdzIHRvIGhhbmRsZSBwYW5lbAogICAgICAgICAgICAgICAga3Mua2V5QmluZGluZ3MoewogICAgICAgICAgICAgICAgICAgIGVzYzogW2Nsb3NlUGFuZWwsICdDbG9zZSB0aGUgZGV0YWlscyBwYW5lbCddLAogICAgICAgICAgICAgICAgICAgIF9oZWxwRm9ybWF0OiBbJ2VzYyddCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGtzLmdlc3R1cmVOb3RlcyhbCiAgICAgICAgICAgICAgICAgICAgWydjbGljaycsICdTZWxlY3QgYSByb3cgdG8gc2hvdyBhcHBsaWNhdGlvbiBkZXRhaWxzJ10sCiAgICAgICAgICAgICAgICAgICAgWydzY3JvbGwgZG93bicsICdTZWUgbW9yZSBhcHBsaWNhdGlvbiddCiAgICAgICAgICAgICAgICBdKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFuZWxEYXRhIGNoYW5nZXMKICAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgncGFuZWxEYXRhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZnMuaXNFbXB0eU9iamVjdChzY29wZS5wYW5lbERhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRGV0YWlscyhzY29wZS5wYW5lbERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzUGFuZWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICB1bmJpbmRXYXRjaCA9ICRyb290U2NvcGUuJHdhdGNoQ29sbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiAkd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogJHdpbmRvdy5pbm5lcldpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmlzRW1wdHlPYmplY3Qoc2NvcGUucGFuZWxEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Q2FsYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVEZXRhaWxzKHNjb3BlLnBhbmVsRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdW5iaW5kV2F0Y2goKTsKICAgICAgICAgICAgICAgICAgICBrcy51bmJpbmRLZXlzKCk7CiAgICAgICAgICAgICAgICAgICAgcHMuZGVzdHJveVBhbmVsKHBOYW1lKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH1dKTsKfSgpKTsKjNzvVuNzBwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANC4IQABABnzVwKgHNsCoB2CVJx/125KZpTlW0pqAEA8zmzMAAAEBCAoAo18fAE2mGozc71YqeQcAoAQAAKAEAABo9ygf0sUIACetHhMIAEUABJIYxEAAQAaNu8CoB2DAqAc2H/WVK2c+skD2amX6gBgBxJRrAAABAQgKAE2mGwCjXxlIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTAxMw0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBIb3N0IFZpZXcgTW9kdWxlCiAqLwoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBhbmd1bGFyLm1vZHVsZSgnb3ZIb3N0JywgW10pCiAgICAuY29udHJvbGxlcignT3ZIb3N0Q3RybCcsCiAgICAgICAgWyckbG9nJywgJyRzY29wZScsICdUYWJsZUJ1aWxkZXJTZXJ2aWNlJywKCiAgICAgICAgZnVuY3Rpb24gKCRsb2csICRzY29wZSwgdGJzKSB7CiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdob3N0JwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRsb2cubG9nKCdPdkhvc3RDdHJsIGhhcyBiZWVuIGNyZWF0ZWQnKTsKICAgICAgICB9XSk7Cn0oKSk7Cozc71ZUgAcAvQQAAL0EAABo9ygf0sUIACetHhMIAEUABK+NrkAAQAYYtMCoB2DAqAc2H/WVLaaT1w1P2chvgBgBjZSIAAABAQgKAE2mGwCjXxpIVFRQLzEuMSAyMDAgT0sNCkNvbnRlbnQtVHlwZTogdGV4dC9qYXZhc2NyaXB0DQpDb250ZW50LUxlbmd0aDogMTA0Mg0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQovKgogKiBDb3B5cmlnaHQgMjAxNSBPcGVuIE5ldHdvcmtpbmcgTGFib3JhdG9yeQogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qCiBPTk9TIEdVSSAtLSBDb21wb25lbnQgU2V0dGluZ3MgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdlNldHRpbmdzJywgW10pCiAgICAuY29udHJvbGxlcignT3ZTZXR0aW5nc0N0cmwnLAogICAgICAgIFsnJGxvZycsICckc2NvcGUnLCAnVGFibGVCdWlsZGVyU2VydmljZScsCgogICAgICAgIGZ1bmN0aW9uICgkbG9nLCAkc2NvcGUsIHRicykgewogICAgICAgICAgICB0YnMuYnVpbGRUYWJsZSh7CiAgICAgICAgICAgICAgICBzY29wZTogJHNjb3BlLAogICAgICAgICAgICAgICAgdGFnOiAnc2V0dGluZycKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkbG9nLmxvZygnT3ZTZXR0aW5nc0N0cmwgaGFzIGJlZW4gY3JlYXRlZCcpOwogICAgICAgIH1dKTsKfSgpKTsKjNzvVqiMBwD0BQAA9AUAAGj3KB/SxQgAJ60eEwgARQAF5tU8QABABs/uwKgHYMCoBzYf9ZUiQcE8jlh6njGAGAItlb8AAAEBCAoATaYcAKNfGEhUVFAvMS4xIDIwMCBPSw0KQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQNCkNvbnRlbnQtTGVuZ3RoOiAxMzUzDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCi8qCiAqIENvcHlyaWdodCAyMDE1IE9wZW4gTmV0d29ya2luZyBMYWJvcmF0b3J5CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoKIE9OT1MgR1VJIC0tIEhvc3QgVmlldyBNb2R1bGUKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGFuZ3VsYXIubW9kdWxlKCdvdkxpbmsnLCBbXSkKICAgIC5jb250cm9sbGVyKCdPdkxpbmtDdHJsJywKICAgICAgICBbJyRsb2cnLCAnJHNjb3BlJywgJyRzY2UnLCAnRm5TZXJ2aWNlJywgJ1RhYmxlQnVpbGRlclNlcnZpY2UnLAoKICAgICAgICBmdW5jdGlvbiAoJGxvZywgJHNjb3BlLCAkc2NlLCBmcywgdGJzKSB7CiAgICAgICAgICAgIHRicy5idWlsZFRhYmxlKHsKICAgICAgICAgICAgICAgIHNjb3BlOiAkc2NvcGUsCiAgICAgICAgICAgICAgICB0YWc6ICdsaW5rJwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRzY29wZS4kd2F0Y2goJ3RhYmxlRGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICghZnMuaXNFbXB0eU9iamVjdCgkc2NvcGUudGFibGVEYXRhKSkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS50YWJsZURhdGEuZm9yRWFjaChmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmRpcmVjdGlvbiA9ICRzY2UudHJ1c3RBc0h0bWwobGluay5kaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAg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LTAxLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVkBsCADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2jx0QABABmvDwKgHNsCoB2CVIh/1WHqeMUHBQkCAGA0OnVMAAAEBCAoAo18vAE2mHEdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wMS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZAbAgA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAtvB1kAAQAbmX8CoBzbAqAdglS0f9U/ZyG+mk9uIgBgFpLdQAAABAQgKAKNfLwBNphtHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTAyLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVkBsCADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2nByQABABjfFwKgHNsCoB2CVKx/19mpl+mc+tp6AGAWkpR8AAAEBCAoAo18vAE2mG0dFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wMi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZkbAgA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAtsuCUAAQAZ6LcCoBzbAqAdglScf9duSmaU5VtKagBgPM8YEAAABAQgKAKNfLwBNphpHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTAzLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVplsCADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2uSqQABABsOMwKgHNsCoB2CVLB/1BQngj3DYjQyAGAP+PYkAAAEBCAoAo18vAE2mGkdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wMy5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZFcQgAmyMAAJsjAABo9ygf0sUIACetHhMIAEUAI40340AAQAZPocCoB2DAqAc2H/WVJzlW0prb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QABABsOKwKgHNsCoB2CVLB/1BQnjNXDYsL6AGASNFokAAAEBCAoAo18zAE2mLUdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wNS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZurAgA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAtu3+0AAQAbwOsCoBzbAqAdglSof9cbpDKCTp8SmgBgFpCHMAAABAQgKAKNfMwBNpixHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA2LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVj2uCADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2i4LQABABnoswKgHNsCoB2CVJx/125KcTDlW9fiAGA8zbo4AAAEBCAoAo18zAE2mLUdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wNi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71b4tAgA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAttwd0AAQAY3v8CoBzbAqAdglSsf9fZqa0dnPv3MgBgFpIXjAAABAQgKAKNfMwBNpi5HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA3LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4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AQgKAKNfNgBNpjFHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTA4LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVu/ZCADoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2jx4QABABmu/wKgHNsCoB2CVIh/1WHqjfkHBihmAGA0OUAoAAAEBCAoAo182AE2mMUdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0wOC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZeOwkAFiQAABYkAABo9ygf0sUIACetHhMIAEUAJAhvBEAAQAYYBcCoB2DAqAc2H/WVLHDYsL4FCeXbgBgBlbPhAAABAQgKAE2mNwCjXzNIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogaW1hZ2UvcG5nDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoyMzRFDQqJUE5HDQoaCgAAAA1JSERSAAAAeAAAAHgIBgAAADlkNtIAAAAsdEVYdENyZWF0aW9uIFRpbWUAVGh1IDEwIERlYyAyMDE1IDEzOjEzOjM1IC0wODAwwgcZAAAAAAd0SU1FB98MCwAGME3O+XAAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAEZ0FN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CkFjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVthPCQATJAAAEyQAAGj3KB/SxQgAJ60eEwgARQAkBdVOQABABrG9wKgHYMCoBzYf9ZUiQcGKGVh6piSAGAJNs94AAAEBCAoATaY5AKNfNkhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBpbWFnZS9wbmcNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjIzNEINColQTkcNChoKAAAADUlIRFIAAAB4AAAAeAgGAAAAOWQ20gAAACx0RVh0Q3JlYXRpb24gVGltZQBUaHUgMTAgRGVjIDIwMTUgMTM6MTM6MzUgLTA4MDDCBxkAAAAAB3RJTUUH3wwLAAYcfxaVkwAAAAlwSFlzAAALEQAACxEBf2RfkQAAAARnQU1BAACxjwv8YQUAACKiSURBVHja7X0JdBTXleir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AADoAgAACAAnrR4TaPcoH9LFCABFAALa5K5AAEAGw4jAqAc2wKgHYJUsH/UFCeXbcNjUl4AYBRzvXwAAAQEICgCjXz4ATaY5R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvZGFyay9sb2FkLTA5LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVndYCQAtJAAALSQAAGj3KB/SxQgAJ60eEwgARQAkH9VWQABABrGbwKgHYMCoBzYf9ZUiQcGt71h6qMuAGAJXs/gAAAEBCAoATaY5AKNfPkhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBpbWFnZS9wbmcNClRyYW5z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pPvWAAABAQgKAKNfQABNpjtHRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTExLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVv56CQDoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2nB7QABABje8wKgHNsCoB2CVKx/19mpwlWc/RYKAGAWkCnAAAAEBCAoAo19AAE2mO0dFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0xMS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YYewkAQgAAAEIAAABo9ygf0sUIACetHhMIAEUAADQY5kAAQAaR98CoB2DAqAc2H/WVK2c/RYL2anM7gBAB+pANAAABAQgKAE2mPACjX0CM3O9Ww4AJAO4BAADuAQAAaPcoH9LFCAAnrR4TCABFAAHgN/tAAEAGcTbAqAdgwKgHNh/1lSc5Vz3D25KkHYAYAZ+RuQAAAQEICgBNpjwAo189SFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMTI3DQo8IS0tIE1hc3RoZWFkIHBhcnRpYWwgSFRNTCAtLT4KPGltZyBjbGFzcz0ibmF2LW1lbnUtYnV0dG9uIiBzcmM9ImRhdGEvaW1nL25hdi1tZW51LnBuZyIKICAgICBuZy1jbGljaz0ibWFzdEN0cmwudG9nZ2xlTmF2KCkiPjwvZGl2Pgo8aW1nIGNsYXNzPSJsb2dvIiBzcmM9ImRhdGEvaW1nL29ub3MtbG9nby5wbmciPgo8c3BhbiBjbGFzcz0idGl0bGUiPk9wZW4gTmV0d29yayBPcGVyYXRpbmcgU3lzdGVtPC9zcGFuPgo8ZGl2IGlkPSJtYXN0LXJpZ2h0Ij48YSBocmVmPSJycy9sb2dvdXQiPmxvZ291dDwvYT48L2Rpdj4KDQqM3O9WMoEJAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbPIBAAEAGa7bAqAc2wKgHYJUiH/VYeq4YQcIZi4AYDQ7oRAAAAQEICgCjX0AATaY7R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xMi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNo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E2j3KB/SxQgARQAC2sHcQABABuZawKgHNsCoB2CVLR/1T9nQJaaUJC+AGAWkM2kAAAEBCAoAo19CAE2mPEdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0xMi5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71ZElwkA6QIAAOkCAAAIACetHhNo9ygf0sUIAEUAAttwfUAAQAY3ucCoBzbAqAdglSsf9fZqcztnP2k/gBgFpBZdAAABAQgKAKNfQgBNpj1HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9saWdodC9sb2FkLTEzLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyB0b3BvX3ByZWZzPXN1bW1hcnklM0ExJTJDaW5zdHMlM0ExJTJDZGV0YWlsJTNBMSUyQ2hvc3RzJTNBMCUyQ29mZmRldiUzQTElMkNwb3J0aGwlM0ExJTJDYmclM0EwJTJDc3ByJTNBMCUyQ3Rvb2xiYXIlM0EwOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czgNCg0KjNzvVjCdCQD4IwAA+CMAAGj3KB/SxQgAJ60eEwgARQAj6m8UQABABhgTwKgHYMCoBzYf9ZUscNj4SgUJ6yiAGAGqs8MAAAEBCAoATaY+AKNfQEhUVFAvMS4xIDIwMCBPSw0KRVRhZzogMTQ1ODU2MDAxMTc4Mw0KQ29udGVudC1UeXBlOiBpbWFnZS9wbmcNClRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkDQpTZXJ2ZXI6IEpldHR5KDguMS4xNy52MjAxNTA0MTUpDQoNCjIzMzANColQTkcNChoKAAAADUlIRFIAAAB4AAAAeAgGAAAAOWQ20gAAACx0RVh0Q3JlYXRpb24gVGltZQBUaHUgMTAgRGVjIDIwMTUgMTM6MTM6MzUgLTA4MDDCBxkAAAAAB3RJTUUH3wwLAAcqqbcxSwAAAAlwSFlzAAALEQAACxEBf2RfkQAAAARnQU1BAACxjwv8YQUAACKHSURBVHja7X0JfBzFlXf19NwzusfWaUm2heRTsi3rsAEfXAaDCYEA2Q8SQjZAkv0ICyTLLknWZH/ZLFkICfvBErLgXwLYWUzMjQ02xrd1WLIsyYcsS7J139fcPUf3995oJM+Mpme6RzPSyPjp1+qe7uqq6vfv9+rVq1fVhFylq3SVZi9RM12B2Uj6g19ebz761S5ZRuYc+8DAY/F33duvzMn7YKbr5Y+uAhwiDe3Y9jfToS/voWQyIk2cY1Lmr2qQKVWPqVcWn6PS080zXb9xks50BWYryRN0v7Flzr/bfvECZe9s08BWKMteWGUd6PsDR8hTIDncTNcR6aoET4EG/vza65ajBx71glIiIYqlBYTo5qyf++APDs90HSUzXYHZTOr5838tiUuY+I04cyxLrPU1xFZduWt0z0cf6Bsb58xkHa8CPAVSr7+1XVVYyvq7xupHdIY9H93lOFn+PsdxM6YprwI8ReKk9I8ksXGTG1yOI6zRQIx7P7luaPubh/RVB3QzUb+rAE+RpFl5uziaPjtxAoB1bR5kPnboekdT2w6ua/rV9VWAp0hxJSWD6oLVxkBpOMZKzOVHbh7Yve+e6a7f18qKzs/P1ygUimvgMIOiqBjYm2HfQ4MEHj9+3BBqvl2/fLqQHR2uYk3GSdLrSZKYWGi3N21IvPu+Q9P1zF8XCZasXLkyS6lUPiiRSG4HQAthnwvbCrh2C8uyDxQVFS2FYzqUzDWbNhtp3dzeQOAisQY9sV9s3KUvO7h42h58ugoKI4nWOgDuPLlcfg8AmgIS6+Xcgd/Ig2QA/XYAeVEoFYq77sbzztHhj4SkZRrOJDE11T/itm6dFt7PCk9WYWGhGoBYIJVKU+BnjNPpNAMg/Xq9vvHs2bMB2z9UywDuJrdKDkQqyHMzpL9UV1dnElq30tLSRMx7IH91TMzBvUTG8/px49LtsBNb26XHTXfcXU9+9av/iTTvQlJJ00iS4uLidJC8zbChCk2FLQEYOhcYlgnAZaemplq7urpGCI9rMDMzcymkX+GW1GAkAzJ3dHS0B6vX6tWr50PeW+D4BqjL6lNtnYS124ptTpZopRIAml/RcBYzIXLlyhc+3fP7iDMw0gVMhQDcNABmM2zYvfB6GREw2HQgdTcCs3N4H1AiyfRVy4EIwJoHGkMWpF7XQrnfhcN82FCCtZ19fYxepSGnjFZyeNRMjE7WM0/vMliWWE6dyDCfPvlQpHkYtQCjWgZw1sOhNkhSJYKM6f1dBObGiSkX0mM+vACjMQb1uhNB9b0m0WhdaqTf5iTH9WZiZVn+cqwWYjy4/xGuqyuifeOoBRiYOB+YnSQwuRIYvtTfBTgvuD11l2sdHR11+rsGkhsL128iPIZea1f38fErfQDyRat9kvROEJy2d3deO7L/83kR5WMkM58ioUElWLUC49P8qVaHw9EBTGaF5gMvRG9TUxPj7xoYd2mwS+e718JxJiIZa0kQ1lYA2O+bMm5vdXVC/awPR5KJUQuwPxUYJL0KDKRJLwSo7wbYDQjJA14ExmazVfFdRys+kLFGqzWEkl6ughnaYbOT791ClyZLmDP1pZHkY9QCDGQRk5hlWQa6TZMEprKyUg/XDgN41iD322A7VF1dPcqXBrREwF4HpVTjG+X+NSamrK+G9v3NMEv1n+z6VqSYGLUAAyB9YlQrML8f+sQ2f9dOnDjRAKp6NxxaAEQvFrt/W0DSD8FxVaAyoD7DHMfvruoaGGhjrMzECyKFrpJK4m6UOeIB7uUsnGaTSn/0q+RI8XFGHB1LlizRQh9WpVQqnXa73QBSY/dNA+q2GRieD/wMOsyGqhV2dQGSOKGMemij2yDfFdCWYt9aC/ehluiFraqsrGwoWDlWq7VdoVDo4dCvZT4wPDziSIy1yqmx66kKmsglgR1vnMNBFNcsfgUOX40Er6dzsAH9wSnA4GXAXB2AR0N7hgJhhd8tAHQDgOAVrAZdkly31arkZRDH2SCfsoqKimqhFcnJyVGo1WopWsutra34cgiNn5KUlpbeAPtNfLy7OW3ug0rGkqylJWRDnJrES90q212CHZTSoN1JBhxOaJ85ooAXIDk1lTxRWa8uLy8X1SwJoWnzZJWUlCwHsNaAKpwDgMjhWAZ7GexVcBmNl5T09PTuzs7OCQsWPVQpKSl6SJMBQILGu+wewjcDflphVwkSWdfd3S1YnQ8NDTl7e3vtALBD5GNwsbGxHSDFWVBugmd9xmlhfFy+0m7XFsWoSLJcOvYWoD0FfyYwuI7pLaTGxJA2xkF6oCvVaXOQ5qERkpCTq2UlkjPwzPpw8n1aAAZws2G3DsD160BARqHKhC0R0rR5MJ4D4AaysrLOoxEFTHVAGmxnByFdk8Vi2X/y5MkWMeBOlfr7+53QtJzWaDQObD6g6hPaBX47b8jLyV/DMTHpCtkEuEiDILF7R8ykF6SXJd6jinhoUyhju4aH4zMyMuAd7xRk9QuhiAOMHiYA4zoARhMsLTBIA8yzAGB9nufb29tt8NAd8fHxLSA95wcHB8/X1dVdBCm0BsszEoQaoKOj45JOp6uFZ2uFZ+uEF/AsaJJ9v7hl4xZ1b2eKZ3oboImS2+9wup/T66ld/80s299lNPXAYTZ0x8pD0C5+KeJGFrzh6I0S5JFCQYaHmw+HGAIzqcvDZyXPELG1tbU4yDHieVL56EPOCUOCG/vXydhJjz0wXqzFgj0BFHpolVJWg21wNByVjHg3CdWuwJGc8fSa4uLioNI+m6gbwHUEM+Mcl18AdLsGG/AQShEHGFSX6DIYhona/rlg8gDU5DWy5D9R0hzdwsS4sSBrHF8G+0IRjmpEnJGgcg2+zoVABO2Y3WQyhb27MK3k49CgwdyaHGzpzRKalipoesJTZlepVGExHCMOMPRv++GNFDwZCwytTj5n/+wiD+mU0aIcDsCD7urq6rC85BEHGCqqB6k8I0SKIc2ozWY7F+k6TTfNg/6wlvaEeDIrxrrUFPLADscVJEyT16ajrePUavVp2PMO2yH46OxHp4XbMp215Bz1jh5CtZwgpclildzNbP+4Qbeow2A0jgAPjpeVlbWGqz7TYswcOnTIAfQlSHIVPIBXkBw6B2DXAdueysrKi9NRn0iSwzDs9/wStYIUahW8jgcwLIfMVus+4JGg6EyhNG2DDe4BhVow/xtpmk5GSxGk1glbL1iM+ijr44ZMHHP5MTyNKilo4OUA8hxojxvMNjLscLocIDjiFENLyHV5i2oqvjr6vr+Bl6nQdI8mce4BhVkvqXzE9vfxXkM3RppMSlLipK5AAAYAxuhLDVzQ3XiTtfqFl8MKrqvMmWbIlUTG+voCSq1xje0G6hIh03G0KQna5hgwvhB4ac7ivZGoU1gkGNRuHLokJRLJeHA5jogMYjRFJCodrUQ5bCW0RpNhN3pOc+K8dv5IljaPaHJy3vc9n5eXFxMfH58LzVim25c/CG10y8jIyCWhXckpAYzuNIVCsQAMqEUYE+X2pbqsYoxmLC0tPVdeXn4JToXFcR7tZG+7SFibH1OCL7DSLeaKBdf4Rn5SJSUlyNNvwvEiqVTqaZuZdTpdnUqleqe+vt6/RedBU1HRNBS8Ciq5Eowm9Ti4rkwlGJNOYcTEaqhowRTLmTVkbb7gmioqhjBIz3qm9knPc8CzYuDfP6JPGjYvwxt4i9N4SjUazTMrV65MC5Z/yIyHSizAWQMkQFQIAo3xzZA2M1JMjSZiLpwhnNUTYH69PC69dFw8ibv9mxPn3c3dd3DoNFBZcD1DLpffu2TJEnmgdKECjBKKM/GEqHiM2sgLKyejlDRF1z7KTcxmCN72uoiim2W5C78c/wnacAPwNsFTI/ojt5ZcGhcXlxswXSgPUlBQECcybjmRb2rJlUSczVrofYInnYeJrcovGFZlL3J1G92zKAXPHYa0GrB3AgpPSABD26sSew+oE1GB7LORbO1txCc+dhJxHtckShVh+nt+Pv5bJpPhFBxRc6lAkgMGU4QEMIDlFHtPuEJQopW47m6No6/b44TPdfef53lpeoZVlb+6d/y33W5HvopydrhdvbwUEsAA1kiwjD0JBxLOnj07qwcRgpG5t+slzhbA2+pHsDmD4S+Jt26pHf9dXV2N3aVOEcVi4F9zoAQhAYx+YwCtTeAQIAtqB9uYaYt8nAkyV1WMHQTW0JeJokjcN751xucsAobLHwrSdjhu7HA4TgdKE3I3yel0ngP9bwj0OG6Hx6jZbD4fFi5GKXEHDkiZ0zVKIUbVOMmzF5CYdTf+P9/zFRUV54C3x4NpSPdsjj0g9QFDbEMG2D1J6wQUFEj1DsJWKWbNi9lI5tjYAmlG5nf9XeP8oU7TRJ614DO+/MCI3QE7XGqJT5It8BJshzb7eLC6TclVWVZW1peTk3NAp9NhXyzZIwgcK9BtNBqbrpRhwEA0evQAYXu6/V/0h69WOypLTn+FLz9cs2vJkiVvazSaaugX34wB9qAt5aARcSTuEvB2f1VV1UUioDEI29wk9KhotVolvH0cwzDWcI9rRjN1//zpDUx3+wHP0FckvomI8pzcqvStvy0Skvf69etxDlUC9FwUwFdjbW0tak7B4TxhGw92S+oVL63+SJab+yLTLnCIG9SzMm/pbqF5YzQM7PpDrdvXYhAg0mSpr510jk96FQtziUI3J6xhOYHoKsBTJGNN1S3EZlsoNL0kIekLzaqSZqHpp0qzYqW7aCb93k+yWcYSP/7b11vlRRIJUS1b9iqVmDgqMPsp05QARgMALGXXcBUYVdj+XtHuSH8kz8j8re1Mves4ILigshW5S0jchk2fhFJOQUFBvFKpXAaH2bDhck79YE03wr4x0MTxkADGSA4c5zWbzUkymcwFcHFxMQMF9gPQGNP7tQHa1nh+QnoD2rYURTiHPZRlGnDZxALondwPx3meAQCAAXab6kpKSt6sqKjo81cD0W0wLr4JfbNSKDAXtiQMf8UNzunAlF+8Zs2aYhy0nk4mzxQZK47dYbvYJCgtrhWtzF5QKyixB+GyicDnnwGPl/hGd8BvV3QHbP8KL0GG33LFFIaLp4B1mA9gxvKlASlOgOv58CKIHlKcbWQ4enDL+DEXaK1ouCZRqkYUxWvaxOS/fPlyHPh/BA6DTafNAJ4/hGuP+F4QBbBWq13oDiXhdZBAQXgtlmXZ+eFkZrSRpbF+IWGsuBhLUHCRKJm8Sbt4+RciiqDUajUugxzvby0Qr4RjtFSn001azlEwwNjuQibpbgADEqaBbZ6Y/GcbDX/8QbyjvzdLaHrV8gJR+QO/UQMKXqDcHd0ROsAWiyUG1IUYwGRQyWCLcM9a0hSs/k/n0KAg6UWi4+JFtb82m00hYBFzX5q0oJpgwKChF21xw/twxfazzScr47gAywV7TW0ADTuy653/FpO/SqXC4UJRrl9/K+sKBhj6YKJXtAE1HTVf4QwnmeqqV9s72vhjkn2EWqKNJbKsHCKGKisrzTigL+IW7JpOMukFAwwFGvBbCULTQ9rRSKzcFg1kPnVyFWHZVME3YASsTPSaKgjYPiLQpwDtb4fD4aiZVLSIAvG9vIhTPoMm5Dis1BU7g9DWcDqBNfJ8C4TzjtmZyjR9d3THfgHxbyhI7/uL7hBl5YIUYxxWd6B6Q4U4XIQb0ooJHptVpMhb9jzn7z33/TZDGMoC0+ct2H0BIPsdX4fzZsDkDeD5Mb/3iyzPicsxGI1GA37xBMBUjnebEFjYWaChb6mqqmoP0/NFJdlaW4QnniIXMLoDeiNvAp/L8OszZGxdTwUAi/FwTXD8OTSFbXwlibZy3QPQzcXFxf1QKK7rFANvD64NqjcYDCPnz58P+RNxs4VsrX5aH3/SO34Kg0/tgQNcek+f1kKfKJFA71e9cJmXx2t8dYT169efAeGKl8lkCui2moREd3ytvl0YDjKdqf1G3/PPfeh10gtNP6fAyJLQpDD7zx+cnJTfueo0W0Pzj811NSulujmbKYmEMD3d/574dw91aRYtEdW18kdXARZJhvIjrw+8+tKjEyd8wOV4DpIefuxg3E2bN3rmNfje9t9bTp38nr2zLZ61MRP3UDRNJIk6hyp38SvJ//epJ8kU6Ip1RESKmHYB4wV+lKb5dF0S19urpZKTjQMf7Sq1NzY8p9+7exNrnNyicU4ncfb1SM1Gwz+2PvHYgKFr6IVl770XUrxbtH/aLuron+67Z4vt/FmPWYQ+0suzNgdnsSQ7OHblT5YvWmprOPMfTFPDCs7Og5m7Peeg3WbtzA3OpDhNDa3sT05Olnd3dxuJCNMtLCp67dq1aGjhlFLXECEuXajX60eDfThyNtLAe9tfN3z8t0d5u0R+PrzhOqRQ9UrHfNcgocGiPzzJJqFtn1qd53cPGTqtDNMJvP7QZDLtFRJzPiUJxhGmTCDoImHQGQZnx6KDHMeEFQpFUmpqKtXV1YXerytmXtI/P/B3W5izdYV+LwaTK/Rdc5wocPEXzXH0QqkkKU2j0vTYnQqjk10pVyhigPXncLH0QEVOpQ2moS+MwM71Ha90942xrza/qKhIdeLEiQsCHj+qyXS6ptgxMPhNe1dH8UyUL2dZaQnh0vPnxM6ttql7dxkYZe+oHqcNvR3ovpBV9OrVq+eBxGYHG0JENxuolGboy4lxnM84mcrLC/VffrJAmpr+rK35fKa9q1NBaKkGnoZMmsEw8c/rgOdngKUdOB4Xp5+82xzc6LZh05ELJstTFRUVF/ieI1QJxsVV0oWMD2MckVQqxZGXqAeYa2jQmXq7bjefq39weNfbi5yG0Qzr+bOXE7i+uRCgvxsAXM63TQ5ATo5jGUI5HRSFiz26UuOKHKAXKSmoazkcZtJU3PcSNWsOJM+9LhDAIUkwflVbrVavFnMPWH8Vra2tM/IRDSE0tGvH47aWpu/bLrWscOp5wpZFSJjvz4CS65N3LUv1fGG2d/Y6OcbA2BwSlqW0MikdJ6HkKcSpzI3Vxsbb7crFMipJmrWg9ZoXX+ENvA9JggFc0cvN63Q6RbQBPLJ9e4Kl+fTNHC153bDnYy1rs0kJJ9JUECu9k+73XNNBRio4uvP1ts4mm0+oiJFhnD1gUJ+Hw8MG6wAAR2WpFeoHZN1xxlPVt2pXFH7uL/uQAGZZ1iEuese1/kRUxEo3NjYq5jadzqAkstcNez+JYc3mYtgCW7ZIXHBvle/h2E9hyylRCiWhlyyr/Pjg8WoAN+BKO4i9HXYXjBbDG3Ljm+vnpPAOJ4YEMEYbFBcXs0JjtKD5sNfV1c14dMfo4a9KmC8//bFlZPi7TIPP6gkBwY1svSi5nMRvubtclp59V8uuz0qhFyJoKSVcPaG1f+ioKj39DF+aUI0saP+pHujvpgaLssRhREgbcAw5kmQ+U3+/6eiBLEJxzw6/9Sc5VEiFjgZPEho4Rwi/Rg5IAdpdSWLSkDQ+/rsJhaX7qfnzrYWFhbuBp7dBnXIDhcu6V8/fC13QsyQAhdxNwsB2KGQJroKKnxH0lwbBxXHLkZGRs9P1oQ1DU9Ncy6c74pRLC581VldmEZNxo72/l3AWs19Gc8Ha3EDDgMTnh0j1rLgmb1Q2L/v7yY/8g9dKs9AFXQY9DxxkyPb3zSl3hMdxaPb+K9gaHVNyVbq/aY/RZH7DO6GtHjEajc3T4bI0VZWVmGqqv8Ua9Tc7ujoKHAN97q8zB2Zy6NI7hf4uTRP16lKiveHmW2LyV+3zVzQIUDrU7dsAMAa/TwR0wTkE9FPolbwrxGgNhy9aAkCnAdAJILEK2HOwMVardaimpga/xRcRN+XIwX1FpopjOar5C5+1XbyQyZw/J4dGSYkjMZMkTCy4oBkptYZwHiM9AcH1c4rPaKNj44g8e+GfZItX/HTOXXcFC46gi4qKcIAf14yOw3Apt8CYiMBGYgJgQ09PckxKSq+Qm/gqk5OT42rTQR2jxSx6NTw+slZU5OprK4lq0dIHbd0d11trqghnteSydlsaZzZdHn0RqDr9AuBu7nBAQJY1n2BQu3NowDuLqTg0QGrpmLie+G/c8ymjsDyZvPG+aRmImQDYfKqq1rD7o334cKoVRYSVKf6gyc3tmI5K+CNTVfmLllMniKW2migW5j3t6OshdtiIl4T6qFAxAENiSqEgsnlZxNHRTuQ5eYRpbiSxt91JbC0XiKWmSljek4qaXC7OLNSuXddOq9W3J973YP108vHyB5dPfaEZvtD/O3vj2cccnR0EzCYzPSeZlSWnEjpJR5wD/e8wrS1H5FkLiCx1HqETEggN1ygnqVQtWyZoDuVIW1uiym6/1TbcS5xdHcTe3Q75DkAlpJnyRYt/bm+7RNAgcvT3EddqtqyTcO4RmMkMDR1cSUISkcQnbFeXrN3DGQzvUDT9or2zM0aaEP+hpeH0A3D8IHE6vG8XKb2UTE6kc+YOSmLjP0+6/6EjysHBt6i1ay04tRZUbhFOByVjU02G4WXDheKOlZeXB/3MfMgAuyrY26sdLjuwytl68V1bc2MKZ7kct46Vp6TQzCmVrn4bqjLcO0dGGlnD6ISfGRiHqmjsHjsDYIHWd7ibYaUyRpqcsgoD0DBEhWMY16C2a5V0X4OGr33kaQO5YO2ulCYSlXZEnre4gnU6f5P25L8c7t25U6tKT14Vk5bZaJDLHfbyw08YPvvgF+NrTopxaLiYqVZDGRqrLD3jknJZwRHK4Xgt4a57x4PRJWvWrMmF58K5vrgEsOdn6zFqEbs7bwLI5SSMzZtfI4vp6Vlu+PyD7znaLj3laG8V6I3hgh36Q4I/N45fUny/LOY3ocd5VMPStPSd6uWr/hSz7ob9/srr/2Bnoa22usrWdN47JwGaQZYxj0hk8p2yBTll2utv6lPn5u7wzR+s4uWw+w/8lH2Ax0Zp/jVgfEgQkwQQf0d661ZJV1qaUilnv2LO1Zeg0cFP4QM3sOR65xoIXJQmIpVWxG7acoHOzv5NzID+ArVxI6+7tO+V3x0zVRxdO2GwTXoAj3WeQUPJQP1ylGSPdsONR0yHjr+TtmGDjS9/XF9DpVL9Hg6XBXFeYCGDFovl2+H6xF/QbhKo7ZThQ1/e6GhredbefnEJ67Ja/TA2cLcwDOAGU8vEZQljN0SWkXWWKBS/oVLn7k++7+GeYOUObn/zUeORAy+yRmOMV0nj5WK+cfEgqoqL2pK1FuPZhh8m3XG7QVty3SkhTC4pKbkNcP0FBqwLSQ98eAmkeIeQtMFIVD946O03nrD3dD4N7fM870HvmQdYmppOKAn1O+0Nt7bH3XTby2Keq/v55zjr6ctYeQIs0WoJnah7N/bmzWWSxcv/GpOa2icmbyRoe5+B3b1C0wMfDsLul+GYvCfKF534nR+83Lj75T+mFPyf7xiPHvh7zmQsZUfDbvj5PC0fEwhaqeit+ky7afOg/vSBH8576iUrSIlgLzE30pY4vOfgjtHdH3gXh/8kFFHm5DayEtmd6Yvym6gbbpmK4ZMsMn2CyWRCI2x6AUbK3fwE+pTfMNSVfWJvaLyRNZmftZ44jlNY0tAqnmDSBMdCNKq8MhrvUNKEjo8nlEbbrCm5zsq0X3ps7pqlp6gVm8YmPj/9e1HP0v/R52uZ+lObfOtIKVUWzdrrW+SpKd+I33x3OFalEzWdB6NS8UvoYSg39KC7mPw16PXCdmKH4cAXy5hLFx+iCPdTS3XFmGMfaSrgXr5KKGhXVYuWoTfoXWVh8XGSnv2/oahKT7JdvLhmcOdf3nD0dLlLGSM6JpbQ6Zlb5/79j18IB4Pdz4em+W3+Bg54qMntjpwyhW3qimtE6cIFOfRo1znaWx4wVR4j7PBgLqVSr3EaRgk7MsJ33+XKyOTjbR5GfTVSUrosZuOtpO/VP/7wJYdDd6a7ey5YmBjs0DVVp0D7M49vc/R0P4wOjfEayOamEO2mO34Qv+mObVQYhzdx4AB2LwPA2QL4aLbb7Q9WV1eLWnKJjyI6N8lQVpZs62zOefn9j77dOzz6D1q1mnLFBaOXaBxYdJiAlWo0m4mTY9u/uXzpk9fdtrlbvmxxryo5q6W4uBhX9vkJPPi1BGffjTF+AO454HA4Xjtx4kQvEQEGd+CAsr+xbqu5suyfxz9DhzfL5+dYYtff9KvYm279rZB8cEE42OFI2jUsyyqgjp1Wq7W+pqYG6zOpvQZL+k6o809x8bIA2Vohr79UVFT8T7gwmJbJZ273HK4RVczXD3RPcH4EJBPjfF2uLwB3o0QiQYbzLSd0Cj1DwJAKoXUZem/HfxoP7/+Zc/hyv15+zSKQ3Nt/Fld6/YtC8igqKloH9fohPAqujTQxeQDq0gHnd3R1de3wHcrDRcp0Ot1muOdp4u3FGicL3P8OSO/b7m8sh4WmbXah+43/J9ge8vHm2OHBEKB/B3DxJXBJI4BbAMzaDofzAtQTfQM4Cfp+uDeoP3zof//yhuHQ/odZg36sLZRICJ2QeHzetekbyb3P2QVY4DQ8xz2w/1col+Z5WZ1w+sjo6OhP/E0tWblyZZZCobgbDhfjR7AgHxN+lQak/68g/c0kjE0DIdM8fdS97H8OALcOHmwBnDLDcRmo2lpQtV4OCWAkLl1wJwm+zASqw7cA4Cf4ErTt3KnSShxbDV998QzrDollKQnjmJt8wmhl7i98dVuXkPqDms0HMHBB0TlBkuLXhJ6vrKx8h/gfD5cUFBTE4hfkQLMxUPdREkb/sydF5fxgUOk6ePjznpEMQQi7ITl8joGhndtfMB756qeeavljVtb1YVt3mcXhOAdgbAMwgi4aAy8dWtZbgqVzUwvDMD8AqRT08kSKonKpQQB3kQhwkWIwPszfhZ5XXtxmPLTvqXGjzkxJ2D9bqeG/trQTAHcN3PcwaJHdAN7jgT6gCe0uNivLhVYI52WBdApeijBivJzpCvCQ6JVqPT7pQ5iGhnz9kf1ZrMX4rKOr4xrN2vVWW0eruq5vwLrP6jBVDQ4zHve5Fk8FQH4CLxaqSb/LJsC1eJB0VZB1QYlPvjP+3eSolGBgZChq7dL4gZNiaznWsRa6YG8nfP9Hf3AMD5rq6uqZP/brRyr6BnDh8kk3u9defgIn1fHUCY0nUfFlkH7Gv0ITlQC7Y33FuAhPQPs7sS6XKnexdO5jT/yLNDm5tnfXu1s/PXJM/buekaEBizUYQFqQ1O8QP7aJwWDoDvKVN1/CF+msiPQRoagEmIx1FdCxLMRdNwrS5fUNQH3ll/EdW392J9Pc/P7RvsGBP3f0jOpNJqHdj8V5eXmTvnWMob8AMH6pW6gUV9tstkszyEMXRSvASO/BtpME7hdiZP1bICle3wG0lFXvUsxf+F/a0mu3/vfxysN2p6iuZSyQ3N8FULl/g90ZAXk40MsWrkH7qVDUAoxdnoGBAXSMPA6MvUS8JQcb0UY4/wgw8jlcKMx6rjZv8MOd/9a/7bWDquUrtr1ysXtB7Pqb/ojeJZFFD4JG8Nvdqqio6EXPGRyeJjySDNexP//LqqqqEzPNQ6So7Af7UnFx8XwAcyUcLnEbOvV2u73W0yFvudTyvr3j0nbCSg/Hrls38Sk46P7cB7vnYRMaTfFrAPK1QGlKSkqSId23oHt1M/xMhGOJe63mk7DfXlZWhm1vVKxLMisAngpB/zWJpml0eQrpww7Di7Mh2HyfccKPlABlAtA0flLI1xsXDXTFA4wEUlwMUvZasIhGuP4MSN9ngjOeBRS1bXA4CdrzagDvR3CIswp8Zzlie34a2t1nwOrdO9N1DTd9LSR4nFBdA9A4BFkKP3H2Xj/8rob952hAzXT9rtJVukpX6Sp9rej/A72uHilA9/G6AAAAAElFTkSuQmCCDQqM3O9Wh50JAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA05LFAAEAGxivAqAc2wKgHYJUsH/UFCesocNkcAIAQBW6oygAAAQEICgCjX0IATaY+jNzvVmyeCQBHAAAARwAAAGj3KB/SxQgAJ60eEwgARQAAOW8bQABABju9wKgHYMCoBzYf9ZUscNkcAAUJ6yiAGAGqkBIAAAEBCAoATaY+AKNfQjANCg0KjNzvVlOhCQDoAgAA6AIAAAgAJ60eE2j3KB/SxQgARQAC2uSyQABABsOEwKgHNsCoB2CVLB/1BQnrKHDZHAWAGAWkoRgAAAEBCAoAo19DAE2mPkdFVCAvb25vcy91aS9kYXRhL2ltZy9sb2FkaW5nL2RhcmsvbG9hZC0xMy5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bXogkA+SMAAPkjAABo9ygf0sUIACetHhMIAEUAI+uNwEAAQAb5ZcCoB2DAqAc2H/WVLaaUJC9P2dLLgBgBt7PEAAABAQgKAE2mPgCjX0JIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogaW1hZ2UvcG5nDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoyMzMxDQqJUE5HDQoaCgAAAA1JSERSAAAAeAAAAHgIBgAAADlkNtIAAAAsdEVYdENyZWF0aW9uIFRpbWUAVGh1IDEwIERlYyAyMDE1IDEzOjEzOjM1IC0wODAwwgcZAAAAAAd0SU1FB98MCwAGBRt9PVMAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAEZ0FNQQAAsY8L/GEFAAAiiElEQVR42u09CXgc1Xlvrr1vrSTLOm3LtiyDfMiHDPgAGwzUBHACJpwh4eiRNqVJGnqF0CYp/UogCeULKaSBACVAXEIKlEJoMDbGli184NuyseRD97Fa7Tk7M/3/nVl5tZrdndGuZMn27+95VjNvZt57//v/91/vH0IuwkW4CJMXqHPdgMkKjyxZ4ihym4/TNNUmEOmnH7R2N7L79+97nRDhXLctGZhz3YDJCqtOn+ar5s60Li5wfbHSav7CHLdtXdG0smlXz6w8UziV9O9p8cXOdRsRLiJ4lLCJEGm619tbZDasKbOaC7xGg6PcYl5ioZkbhIhpyuopZZ/9/uRJ/7lu50UE5wB2o7nfYzE6yy2mVQaaJgxFERfHOmbarQ0lduOiOUVF0vWzDYfebe49Z2z7IoJzgObeXmH1tMreAiN7tYNjPRQgGAtDU5SZZaq8Jm5VkcHTVeF1tGxqaQueizZeRHCOsLaoxB9kSEOF1TwX8Dp0Hn/bONZkZpgrusOxBr+R3dbS1dc73u27iOAc4b1Tp8SaIi9fbrXcAFTMDbsoSci2zeVW03Qby622mB3b9nd2to1n+y4iOHeQ5k8p7ZrlMC9yGbhqKkHFgFwE/AuQTE01mwoZhlwyxe3c8umZjp7xahx9rkfnfICnd+zo+XwwfMDPq2tGiHQrx1IrCz3190wv3zCebbsgESxJEgvFBaUQih1KzgYfE0e9GBPFY8oLRlzHF4DgZSwwGL7z82tX/d0ttbWG8egrOx4vmSgAiMRBnQ5lPhQLkZcoHkovXNsDx5NAbeJonr2zz9dtpJi2ApNxRro68GzKwjKWaqvl27tthnY49Yux7vMFQ8GAQEToVVDWQpkKxQXFDsUDpRrKF6DUI3WP5vlPbN55cprN/AovZJ4fQMlUlc3svHZq4S33Lbm0bKz7PakQrLBWB5QCKFadrHU1lDkkvWCJEvDlUOaNtn3vt/VGe6PRrEYNlqZIjcO25IapJdeTMRZ0JwWLBkQa4VAFpQaKmcgTM8FaD8CxHbiflOF+vBdZZ7YJgc+dB/WPw/P6NLQLkeOGgpToOvx/7w/Qb208RgIDs0gsplZ/6LeBpt3wsu9tmD9336u7928dq7Gb8AhWWCtSViUZyXESg7sT6h0CpAgq9yMSaoh2buUg8mTKiGB4rgkOV0K5hMjrOalcsszUNjhgNp1pJdEjB4no60+uP+x+NITMsFkK57nttwdKSna/1TY2lq4JzaIV5Kwg8oCnaysKTg1EXkfVABHh0TkmxZnYP1zDiXUXlMVEQa58Jy0GKSbEFJdK1oYVhC2akvFFIFWz85yOGysqCheO1RhOaAQTGbFIoZlYa9yWAOVSVHnS9FHvOpeWsylC2HIoJantMphMfHFFxX4gzxhlMBBjbR2hTKYR1Hu2YRQptZjLLi/wzn1kjHAxYRGsUO8MHW10EnnQUyEKRS/782VY03HCIcsfMelompZiDBOOiCLqRIRxOAlXVpnxRS6OJQ6OXW+4amnhWIzjhEUwkVmrTUd9nBAjBgkQFYFDq47nYP2TGa5XKW1ThcGYQCJJqlKcTbMqDEFKtI+QAiN3WVcwdnP+h3BiI5geRfvSsdZ9UAbI0LCmBbyOyD2VoQ5yirRLhsBwUZGi+MTjKM4QL8PeICX/AQ80sLZ6t2MOGQOhdyIjGAcpqvMe1QgKoOIQHD6EEs5yPzoBPob6mcJtMobiTJs9u9XusJ8ZWnclUdV0mTzXrAxDBCJtWFdbOzXfgzhhEQyDjMho13ELIvFMhuc1w+G3UE6QkYFx+K6DUDZCvWyenk6SgRMYDAYhJlExUakiBgNEiijzKu1dFJnjsFrun1Gad6PHuOvBivCEuiayOlzLsPeocw6q6LGHoMwksiqSSZJOsNauTO+G57fB+9+Bn8VQUIdBo4mPyBOpKwvlJqBFaW9a1SsIa7BBknVf/swpmYJT2HK8O7A2UzTQGAhlLkm0vHay/d76evJPTU2Ez9d4jyuCocMoNF1KZEk0+d3YoVa4/pnCTuUhoKgBOLcdfl5BZH1X9bFEZq1NaoaOVFA4Q4tSdAPc3wlt2gk/ryZpJl1UAoYL/2Kd7YRvT2YqMnJpm50Yps8kjMsF67ORiNEIYfv6mHqBrqzo8dFNpDlvYz5uCEbXHByWElkyTh0YtAOjlwdtzNuSzYTIWuEcIn0BkakueVlBZJ2A0qggbrwAEYzcBw0sIyZeMMqTaHsbET7bBYuBcJZoGZYYps0g5kuhKxxHqKQQH66klKxZuGSebf6ihr9wu7dSQ4JabjAuCFaMA2jEV0NuAvA8sm20BX+U7LaD36fhHMYzFSoFbdMoFXdA6dVCufkEHHxsI/zE8Bu0ZnmVscQ2Bw5s2dJv6e8gVjE2bN01VAFy6xYC1XJqzyT+QGCW5PffYXa7UVXblo+2jhcFVxB5zcpm7MfrRUR25w1TVRTW3Ur06bRjBsqkOgSIPkxkmzhOXpT6u4/s2HbtgooSIMuzw0vbbMRUe6kqcoeeKQhmIsTQGncNPPcgvMOXazvHXIpWhKpU1pqtTSX5iLIYD0CLFxTkIq1Q2tMJaobK6YQymzMMFLAlmiIGJt5tnCyL8tG+8VCT8B24XmlFGNZLRFtMbpCU/0BSpp2uYWuuGmDgPC2jBP8rhUnOZX9JZhgPBGM39YbBZLM4TXxI7gFQJmU06u0tTvKcl9DxQDCuVX6iHWlYr1+jTjrBQeky6LlSOJyxigoMkixWMy0w5ghWvDKndTSWV+qfPwAIFvp6iCRqZmRYsTUfqtK4mCpR+CCyVKzF2H9Cg7lwQoMN9F06xdsYbT1BxFBmr2WSyRpVwF35aMt42qIxLPUESb8eIytHE86+cWzTmIDXyMad+QhxKyUUMRAgod2fxq1W8gUyYrpHJZGEhVgAfv4OJnletp6OG4IVPbaJyFYgtFThohRVjkixjVB2K/7bSQ0sRRM1gZk/3UqCO7YRwT8wgl3j3/6+PnHftk/egz/3560t49lxZU05BuL/50R2OKCZDxE8ONqA84kIJSYOdDwVDIsC4U+eILGeLmIoqyRsQWFcN5ZCofg539Ej23974ODW1bfflTfL3DmJqlSQ2Z/zgyYoFJtMuEc4xQ0sDR0kYNeRwwdIBD1JSOpQURAEEh4MHrnOU9r1FPksb23JK4IVqxWyfXG87cMTBVbCmDo4lqXVKDhVxFTYNLoVBVGUdvsCkYH23hGCKFzHMUWjBx4FGFvNgRB5QbASmF5KZJsssl0BzqGQcCpfwsJkAW9dXf2pYLiuwppslpTS6g+SciEmSWH4/ZtHDxwYphrBOKJrdRmRfdg4zn44h5vcGrWMbU4IVuzF+OK5ZKQ5Er0+5cp6e/xCoegqC1MEo1CQNEqZb1AuN/uDsRDPNyfOwLjhDEGfMzCFEQEP6Jm7Euq8AseDmeSXXKVodJPVEXVbM/6N1IwB6VWTxXmQK8x12eN6sAzSsEMqJOK2RDgCBW/bOdDRp5xHvFytFCsZOba4FOIkupukD/iPw6gRrLDl2URGYibkYWMw7Mau5bmTHea5HcTG6fOT+GMC8cX47W/uaUkInuheReRmcjYk/Oc34ka8dJVyoWBkwQ6NdXFKV2qsO2lhZW2tbVNH/1coKSluOgv1ItBEarYR8l/KeZwdq0hm5CZDOZF3TapCLgh26rzfng/310SG+RzHug1sSdzrp8MhdtgfDB0KBLuVP9EXPEXzzTIHLU13MRcE601BwJJJsJsxF5jvcpEZID3TiQVLBcdIucnUy4Oq1BXhN/93W38iegOXPnO2d6WAO92FXBCsNyg9RvLg/prIcCgWqnRynJfC5TENclP/PhOKCGdC4Y8bm5sHlNNoqg1lfdlwGEh3IRcEo0CgR/Xx5StScKICTUmXDQrCTEqjvoDacVQQmgYjUnKAHeq2etylOCE+T9umHPqDQeYDGuvG455zeNekgAa3kzhQgtZAvQiCJPH+mPRKUJKGNrspOu0mQjQHv+O4Hk53cdQIVsxluPMAZ1AmiQLZ8pHz3aJ1TW2tJyqJDTZ2pIokqQwPIrwzHBk4OhBo/PemplRkIsLfJpmRjA9FvfkNGNu0juZcDR0Yq7wbCvowU60p2ABcS46QC4B65zqMHpCXllApJgEpjZkyBggOxIRt+3yBPanXlCiYP0B5i8hba1KfgESDMdm/JLKPPS3kJNUqDemC2YhJRHDzNVpXUAfklYadhjqBcRvlcwhfKCwkDotKYF0a3jYYi4Uae/17Xtq7V3V8FL/4/8LY7iVycD3quyhdI1EdhbIL6gxma1de1BaFXbdI8lqCU1g6n/y7WmBvILD2SqtJ0/ZPZM89Uf5wRBReyVZX2TD330TGVcKbpFkbyateeqEhNRmm260zWJoaZtlLl5sDUzz4eeG9zeyOw1qerXDKUWkg57XhYbxgdU1NgYWh55iZsyJNOuRK8trbt7XL17hp+9jbBSbsBvDJBDeVFU1lCLUs284FBGRx+wcCnYOh6ObxaNtFBOcItbW1hpZg8NZik2EoX1Y66kWICSIfFoSNH8X2jipkCd2umFQVE7Fpse3nw+GPUjPapZHdhC8Ux34CvuZwMFOcptmw/nJSFgcDIh505dNHBwZfPXBAt6k3Ed2BWf9QmMMJ1Q/nUKLGPdWqRqdRIVhxSCe2eSY7+0G9k3BLe4eeuKHJDFGjVDzDZq1iKSqzuQfjrqCcDkXaH9++a6+edyhpE9cqBQW55LVgCZG3mz4PxwOpgq5uFq1s5sbd+AknPrKJhKcIG1IFZbbSqPMeis3GWuBjizNWUhAviFLsoD/4uYbHnr1V5pKI2JuIegonHHd0Lz4IZVbq/aNZg9H3ODXDvXge3VfVCqWft3B1XbE1IEg3FRu1eU5h7Q3NsBqe0/kaDJRA5GZ6CSIdN9hvUPKgDIEuBCi5IEfkaMzwwoKsD53EcKmh3DPdalycXXaWSbg9EiX/o+N7HEp0xxqi3feOk+GS5BN6Kcyl42XY78LzOdguTAur7Cw3K2MlRaKW5E/snPjcF9HjCkRBSk9yNLSVDvukgF4EZ8tXlQq4Dp+3YTprCt1OF8da0lZIUpfwF0eR3f97+LAm65UCOUd36EXweUuNemFdfYnFL4p3YBpCLYC47o3qNlwlNufpgWGJzPUiGF+mJ70C2k/PyzCdDYXl7FSTsYZOZ71KoV4srSHdGyfR03RGR318wfHkE3oRjNYXPQjrOV8dEI29kYYKS5rEG5L6KUFn6hHFaPR7ot3RgNn7hu1c04tg9PF2k+xUjNcxgqNzFGM34QGzs1dZLaCbUml0fUn9z9FNdUTamyRzkGMiuuP1VB+xLksWuq0AMDoDF/50eZPxZcjKj58fiVTUYZnXybCp3oXUqMm0f2gH5IAw5u8qf15DZONS8nuRypHoMLpjhACn21SJOSHhhbgDHXUuNFcmq004RzEYrzVTnNBkhyP1szxLo8LlJabxkTmV7AhvKElQMTErbm1B6R2VakTqJ3m1RSNl4reFiJxYBWdUIkwH2XL4fF13EzDL5nEJUkomunQepKTU/UWmtMPN3DNvnt1tZqcDj6wvNhhon8AfMYjcnre2bfM3KWswjOtJGPdfE1l9wuU1ls3mP2pvkhJlEFHKBQVzQbYqMGRW71OZNdJ6qcmIOhWVfPnn9fVcr41baaHpv6xz2GaKRKo20jTNUPSp44Hg0bXLFr30nU92vnCrEoOujLtm1eliRMcooAwQbGGT5NN0a2/SadzOEhVI/dU1NXPfP3RoXz0h3JKlC+bY3La7F9osX3JybGVKXo8yr8FRNt1iXuhft0Z67fiZl289cEC3h+4igkcBhU4j8EfFwJGFNSdj2Wlgy24qKVg4xzk/MsduW+Xh2O/MtVsrTAzNUSryKk6hQiPnsDH0Y5ZZZaY/FBb+8spNm3QZPvKdoyPhOsQ1OJrpe4KTGXABFFT8v1L6H/GfBQbWXOu0fd9j4oKzrZYCK8t42SyGEvxaqZmhiwjN/QO/sLq0/aWXXmPN5hMFBQWaMhPlRQwExKI0vZ7IuSTQ24T6Mjq1X4VGHBmPQR9PaL3zhmqBYo8OZZNNjEP6H2mMH+lzdxCVjWoR1sD3r1hzZNrqa/aVzJiBuvEb2TLd54RgxfmPH2h8gsjO5lSVCeOkn4Ty7PmkNj22YunVfzS16L3kbSoZkav6Z+b0DqmmTuWUFOO4GO8t9pGFi0+WrFz9uwjDPFVWVpbWB5kri0aKfYHIEQWpkwWXENSVf0DiaSikpyej+vQASLlr3MSyxS+uv8RpW1Rnt5FePraGo892Nx1Oicp5KQtVy+fVuQJFJIrjoxxzptXLt59yt3y6s7S9sJi+trr68XfPbj8dBqOmYIUt43eIlmmojix7OSA4fxm+xhgAsd7ZDuPNcx22y00Mc3OxkTNjYB06F3DQkgcuhVOTTKx5NJSbbgZh1c5IVHytrfONnzTu3kBUtvPmguDbifwNeq2xVz+F8tBEpuJv1tVZKYthmcPI/MUqr2c+CEXFRobhFIWIooYEq3RISONlGPqpnXpxzY1xBp72FvvNFnMMz4cjYSYW5RmKjzL0oN8k8VEWxFjqdCgi/OpUW/0vd+8fsZEtFxYNqpxm5CLgZ3EwIqQ3d1TkFagfNTSY7HbjbNBtv19mMS0vMRkcBlrFD6OG3IyRlMk/tVFu3LUIwJeU9nlu+OJRy4JFvXa3OyaKIgn6/QwfCjFScJClTp+ytO7+1EMd2DulqLfHOt/p+Gtg1V8FVj3M8JQLgvV+Zw+dE2jWnCgIZm9bsKBobYmjrtxovhuQ++USU6a0+1ocaOn/THsu5dlRQSR9xSW9Nd/6+yZPadkQsmiYcDanUyBY0LM0vTroXr6qOxwMNh999eXeyH/84orpbivmzBqWqTYXBHfprI926nO+lfSWsjJzefmUmqkW4zoPy92z1O3wGGnGTQ8zIGYGScOZ4VczXE9iyWFRDLVG+N96rr+ZAeRqCtUxWSz8nLvuff3Fp372cIxmR+AkFwRjRnI0gmuNucKZdU6oF82C0+dXu2qsBfNnOy1LYW29o9BomFlgMDC4rmbURxGyWqvSn8/KmomM3H6ej8Ba+ozDIP3j0uuux90LDxBtMlIvy7L7/3XXLtXIj1wQjD5K3N2/WENdpN6fj7eAtXL27KpVhe5qjiXr5zkdlzo4ZhGwYROqOMNMg6Oxt+XJRoe7HVqCocA+X+BnrVHy3Se3bQtJchTHCpLmS+NJgOP5Lozr8XQVcjV0XAeHXxE5/jnds9CXibrwv4xDAAD1jcsWzao0GipFQt0802GZ5+TYmkIDZ0NpGL85pWbzzbRZTI16pTypRFFBEH18bOtHPb5nt3b2v/3bQ4d6zr5Dwt0jf0xkA5Ja5A06HjA7/H9m2umfK4KRPX8Byo+JbKJMDjFMhJH8G5THxygJC3VPZaXxwSUl1Aed1E2Xe50VvdHY/dOsZgtLUSU2IF2GUhZXDSkFUwGThGKJ+/gUm/FwyVmDtSpNxp1gTBCPB0K7AwL/wO3vbflUbWeTYmu4nsjB74k9YEi1+JETzN/xh2z+4HzZolGivovI0QaYXhitKqiTPT8Wxo1r5s4or3N5lq8o8Hh9segdtU6by0jTZUaGtnBU6mQfHXJDgkC6w1HiMXDEwiiZ2ZMemfJDM/XiOwd4YWCXb+A3n3T5n3puz57dGsYXBa5pRM48i3Fup7Tu4hxq9c0LL21gBVo8Eek6tuPQGd2ftVF2MOC+GNQ1kBX787GV9KqZM0vnFdnLV3u99LFA6MZSs2lJucXogZbP9HCgrVIEl1TFcDjCvqQ6yMmDjQBKJkELVQg/7AxPArZJjviDpNpmJl7D8M/Aqiq/GpEbEQWhJ8zv394/+IzUN/irb+/dGyR5W83VYUjIEgXxy8uK3bd93VOxt7W6tmVXv48cHwg1f6XK8fRAyCru6eggO30+YVNLi6r3QnEN+pWiB6iGsjJTtcdDX1NcTOqA/n92tPeyCqvxSwuddsbMMnOjolg3BXTUWpcNlgQqbgamhgdGaF4Xz9aXCC9K5EQgNNgaDJlrHbbYrr4BDpDaf8gf3DrTbrkWkMvScSk7w7OySNLxdP2A8Y5IJLq517fJQ5EHt2/afvJ1OSv+UITHWO2rHsaif7j6illTjIaNy4sLakwMHQ8a7I/ypC0UiZeYJB5c4nG+2BEKhzsiPGkJhEhHKEra4Rr0h7ez0nvPLmgYsT3ynqbtC8KSeBktEcpjNJBSs5EUQamAYqCZgr39A19zcNyUUouJFBk54laoRpWFqlDQyGqZ2TKwX/GoP9jZ2OP7zd4B37P1btdP4XWPwohf0RMWGld4nU8u8jjmqCM3PfUmKDf+nST8qrUg8C2BcMvxYOjtF091vdPU3Py+0gZMxYxSMm7Bxa0mGG+ObtUP8/1RsBFZ2m+prS2+YVrp3WU247cqrRYPsKyzkSSS3AleiGcoJ7wk4p7X+G8A0ckxbcA0A6ljEIgJ7oAgYHZ4CoUeNqnI/FWjZJvGNpju6ybJzxKIJAxEhQhQ66mPuvs2DsT455/bsbf52upqW0CSnJuPHTuJtuiVFUXfmm4zf8/KMmlwKqm8CoUx3P8r8v18LArjtfsz3+AJK8f8+OP2gTNPKzqqIpTiV8PvJ7JQmqym4rKGQYwY/ro1XxqHqpBVWVlpWl/qveqK4oIHLnE6VoDw4kLVkcook6WRGNNjQv0pOkJgRj4y6dM1Sntg8okBXhg8GQp93BHif7WxvX3//3x2WFXw+97yxfdcVej5abnF7Bh6msp7JeUC+md5URT9MSHcE+VbToejW0NR/s3dPf4dv9i3r0Olb0i1f0Vks206QGp+AhCclyQtWaXoJ65Zfsd0q+U71XbrLAfHGtNnkpk4CJbVEFHqCEe7AbGbWvyRF7675ZO3Mr13w+zZVV+ZXfEKrL0NTAaVCA0Tg8DCQjGx+3BgsB2Wnf/6sLd/396mz95syrDFRGHL6FHTkuwbJeU/hrHu01A3I2S1ZL383ubXVjQs2N4Vdq6vdtjuLDEZZ4DgY4krI1QS786Ek5GY0AeakEviQlMgFhvsjkQPdob4D97v7v5YjFJbXtizJ2NGG7RP1xS6HgbpfKkackV53Y7Bc7uAdb++pdsXaPYHt8RIeFdT06Hupix7hxQN4yoifwZBCxQo9TeOftBk0KUHP7ZmxZyZdvNtU02G9V6jscYYF8RGjr0qKnOmXvWMrXgLsklY+7qBFW/Z2tO/IySJG7//0fajWvv1gyuW1tUXOD6YZbN4hyatwuZFURJPhyPth/2B3/dHo88dCwjbVLLDZusXrr0PExlpWuH/iGz9yymZjS5b9MO//+ggHB755vIlz9e77OtKzOY77RyzpMhkIBnX59EiN60kjGurSHojfAB0192g0jWFefJKaNPHjY/q3OK1tqamZKbD8mg1IJdKlpoB/LwQ6Y5G/nNr98DTH2zZvmfT6LfCojrk1nlP4iNj44fgBPxoc+PnIG3/fGWx83eEY663cIYH6py2AjPLlmMg2nDDQA6Ue7ZG/DFoXQKduLsrHG2LEXFjy2BoHyMKn7zdecz3/t6OUbkiN1QWfRmQu45JQi6y5L5o9PT2noE3ozz9/e9u2d6WyyATedLptQ9g/Zwl6XyYKumvLlgwpa7AMt1rMl7j4gxrnQZ2fonZyLI0TafGL6mBJKmzX1hSJVA9hPZwVDgdjHRYOPqFowOBXU5a2r7nRGfPUynRC3r7/ieL5q++q7Lk5SkmQ1GCNaP1oS8SbfVFo/c9397S+HJjs9as9pn6hw+/h8jmXC1bdnFCPA/lpVxjy/O+Pe6eefNcM5ymwjOR6L3LvK6SWofd4qOY1d7CQqeFYylTOEiRYGBYJyXoRMzjFSOCSHyRKOVvP9NsZ9ltjT394rHB0IcNNvf72wDRP/ngA7TJogEeTXzHcwnFfahhQfVSt+vDxR7HVFoZRRC8SWsgdPBMKHTf3e9t3prPcQEkY/opDCHWImihseNPoVk5768es/2PK4H9315fT4E6z52kC2f/+b8++aTFYqnnYjFQ4XkSikSoYDBE3G4XmumIaDJLPLLGft+WH37l3q+vmR462XfcLM16/HFm1apVS+GR90KpJfLeZGRduCcWpcyNcL+u6JJfrlzpqvaanyw0Gu40UFTcYofqz57+gQNHBsJ/8vDmTzZnyVsXByW1IPpsq4hMmRgHjoENp9R831Af812hkcOS4bG41Pw73P+7fOBh3JKqQOcug8MzRI6VpjCIDNkwDi4tB7jhgKK57gE4t0u5B6VPjGz4M6JuHEBEbydytKam9ESPrFzJzrMzv5htt9xmZth4oD5I4RJI3z07e/3XPb1j104NfcF2oS8c2S5mYk9wJOwDWq1eJvJn2sMp95mU+75GRmYsStjyn4fyTr6+hD6uWXOgg+jy+q7SyeRZjB3DrRg/SEYU1L8VDj8imdctHBi0+qBhwJehHnl55Uqvxc79yxy75V4jIzugoqIQ/bCz7/ivT3Xf+YdDh5o09AEnxZ9CuSPD+MUjLaD8k9qnhBR2vY7Itmi0muE6j2odTopcBbphMN6feP8cOvd1pWMLiWyPRfvrp1CalZ3siUGoInL+xWxCCQ4ycocboLyUrhKw5Sket/HRMhOwZTqei4LwNBv0WS1PHeA7nwHkntDYDdyqcxPJTBzY5tVQdsN73kgVlHASw/lniTzJE6pQcCxCmiZs3isYgJvh8BMyPEokE2yBcqcaxbx47RKHy+B4otJivtPG0EYYYUksqwwbrrjyZPl1f/QJoVm0TeNGuVNZ2oTjhSFKc4g2wCXnwXP5SaGJvD8YP12r5zutGFWCHGHoEz64r8huIDdaWNt9Lo5bG4jFiJk2kNjMmoB93c29U+oWSIBc9O5guQ0QiLFj72SwHqH8UKWjTRhPhfk09uu4J68wkRFs1FmfTvTn2upqY4XTNK3Gaby7xGi8KiyIph3BSNdMo8HrWrJ4wLBqja9gziVhhhsW8YtB+X9LZLvy22ne4SX6U0+hpH3OEDyR0/2isKFHycfIwriznOa4KTTFrm8NRlzdfPiRvQK1qcpidldedvlAyYa7eqZeUhc2WSxqz0aB50El2E0NRvPlE72pCPMKE5mCUf1BhHk11v8oIUW/c/AgJg/7IQhWJpohf77C7brLs+JKX+WXbu1zFBZnC41BSR+dAr9WuXaCyAjTyl1QaNTs9BgLmMgUjI4NVJ20bAo6AeXVpHPUN5ctuiTICi9YzOYbS9ff0ll/7/09toJCLXFPyLdr1ZKZKxMIPxypRdrFdqHgl9cQHL0wYRGsCDoYU43ht5lC25BKHiNKEs5bQDB7qGHhN6rMxuf6YjwpWb3223Nu/OJxzmSSaFpzd3EXZDoNA40Yp0jmiZeICX8+XwaLUY/juXy5FgBKwnXxG1C+SIbbcXE9RHvxj2EQG/HE/YvmX2Zh6K+CKmTuCEee+XAg1Hj06FE0baK6tVTHazFrwWPpDP3Qpnlw+BsiJ99WG8MTSru2nOvxm/AIRlCsR6huYHY5NA2ivRatTkcSYS0ra2Y9xNF0u5dm9w/29DS/1dYWVO5FssU4qPs0vg7v+1t47rvpKij6MAb4f5nIXz1J5O0cUNqF6/fJiZBlaFIgOFdQnAJovDdn6TMiBJeE+7UaJ+DZiNwS5c9OuG+i7H+OwwWBYARABLJ4ZKu2DNVwbX1oMuUSyQYTWU3KN+AnWnHdRu8UqkLJVjJUfVBq/2coB851Q/MJFwwFJ0DZKIeOABSUMO4JqXYHlC1AuaP6nuBFuAgX4SKMDfw/I1WYREptRx4AAAAASUVORK5CYIINCozc71YsowkAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTB3UAAQAbo/8CoBzbAqAdglS0f9U/Z0sumlEfmgBAFbhS0AAABAQgKAKNfQwBNpj6M3O9W66MJAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5jcdAAEAGHRHAqAdgwKgHNh/1lS2mlEfmT9nSy4AYAbeQEgAAAQEICgBNpj4Ao19DMA0KDQqM3O9W3awJAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbwd5AAEAG5lfAqAc2wKgHYJUtH/VP2dLLppRH64AYBaQ+WQAAAQEICgCjX0MATaY+R0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xNC5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71YctAkADSQAAA0kAABo9ygf0sUIACetHhMIAEUAI/+NyEAAQAb5ScCoB2DAqAc2H/WVLaaUR+tP2dVygBgBwrPYAAABAQgKAE2mPwCjX0NIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogaW1hZ2UvcG5nDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoyMzQ1DQqJUE5HDQoaCgAAAA1JSERSAAAAeAAAAHgIBgAAADlkNtIAAAAsdEVYdENyZWF0aW9uIFRpbWUAVGh1IDEwIERlYyAyMDE1IDEzOjEzOjM1IC0wODAwwgcZAAAAAAd0SU1FB98MCwAHG/hpMXEAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAEZ0FNQQAAsY8L/GEFAAAinElEQVR42u19C3xU1bX3npkz78lMXiQhCUmAmPBMCAlJCCCiKNRH9WrVry21emvF9ru93kr79ZbeW9r+br22UquttupnudoKVSygIg8VBOSRB4kQEiAkAfLOJJm85j1zzpxz10pmwmQyjzOTSTLRLH6Hc3LOnr33Wf+z1l5r77X3JmSGZmiGpi8JproC05H0x4+sMZ/6dI84NW0WrdNtjr7vwR5ZZva+qa6XN5oBOETq27XjH6YTRx4QiMWEip1lkuUsrxPL5JsVeYWXBSkp5qmun4uoqa7AdCVJTPwz9rS599PXGwR0e4sSjnxxxvxKq677BY6Qp0FyuKmuI9KMBI+DdG/8+VXLqWNPjIJSKCTSxbmExM9am7Dp8c+muo7Cqa7AdCbF3Ln/JdTEjPyNOHMsS6w154i9qmLP4KH39+nr62dNZR1nAB4HKdZubJXnF7PenrH6gXjDoffvYz4v28tx3JRpyhmAx0kcJfqeUK0Z2+ByHGGNBmL8eP/qvp1/OaGvPBY/FfWbAXicRKVn7+FEoksjNwDYocONzKdPrGEaW3ZxHZOvrmcAHidpiop6FbkFRn9pOJuVmMtO3q47+MkDk12/L5UVnZmZKY2Ojk6hKCpeIBDIWJa1wdEvEolay8rKLKHm2/GfW/LZwf5K1mQcI73uJIxSQ7u94ZbY+x86MVnv/GWRYMHKlSsT4uPj1wG4BQDufLiXIhQK58GRB0bQLfn5+Wmh8kO54U6jKD6hyx+4SKxBT+jr9Xv0pccXTtaLfykABnCx7SsBYGPgEI1iwDBFI/AAcmoo+WtW33bFMdj/Pp+0trqLcbZzVd/jtm2bFN5Pi56sRYsWSRQKRSKAEE3TtBxUqg1u67u6ujqbm5ut/n6LahlOeXDI/aUDkKUIcnp6enegPN0pOzs7KjY2Vm5asUou+Xg/EflIx7mkm6GJvaXpB6a7768hv/zl/59o3onGn8WEkmDFihVxEolkOYA6B0CIgbMSzhpg2CyNRjMLiNZqtSbio2sQAE4DqZ0HR0CJgTSUUqm0tbe36wIkFYK0J8HHUAwfHn48WbUdXcYoxn4H43AQuVBIKIFv84azmAmRyPKe+/DQ7yeagRGtogHcWAA0DyRLjXrU/RncRw6qxWLxkry8vCRfeQBoCZ5q2R/Bh4P+ql/NVlBQsAjKX48fDvwZBYe8sbXVYFHHkKtWmtSYrMTCsu55ji4DnlnOn001137+7YnmYcQCjGoZGLgIrV1/6YDREgTZqYrHEDBXERRDQFVDXj4/iKKiogwocyUcY1S+UBM9pEYGHCy5ZLIRO+vb6OKsFmI8fvS7XEfHhPrGEQswtrkAropPWgQ5ISEh1cczW5BF06D6vXY/glpWQJ3y4CPwqn+vt7Tud10jyFo7M0Z6Rwhu053tqwaOHp4zkXyMWICBMdHASN6qFYwv7PUfk55hGB34uizffCDpQFVVFe3tGYAbB6c4X7+1ONhBQg1rd4S1i2aI14Jd9lZHO9TP+thE8jFiAQ6kmj0JPggJqPUxAANgbXDS88nD4XDQVqu10ddz+OBi/RlropgYggEALrKBirb6/LawS5Mltos1xRPJx4gFGJhpDyY9GGLMpUuXxnATpNEMzy4C0IHyY0Cd1164cMHkKwHk4Zdfgig1EVBOgJ2qeewghMffNtti/f49X5swPk5UxuMlkJRBkCjeURGQHqWU8fbs9OnTKMVVzq7JUXni3877taWlpY3+yoAPwOj5e3dqbOu4YjNbRlwstPOlLneJI27g3sjCYTbJ9ac+TZwoPk4JwGjxgjpV5eTkKIkPXxx8Wy0w08gnP1DPDBzNfpKw5eXlTdAeH4aPphbSdsC9PrjWgqa4YjAYPobnl4mPD8RF8Ptu+JB8xltdb23thjQjGiCWEvn1h4fqzjBEetPClyaK15M52CDIzc3VSCQS7ANWuak7Gq67LRaLFlTsKDUK/m2yTCZbCpdiX5kiuPD7KxUVFdf5VgSsYfHg4KAQrWVQ4QgqX00hLC4uXgZl5vuypB/JnLNVajSky+FxrlJGlCLna7oMK1DdeoeDDDIstM8ckcDjmKTZ5Jsfn5J6vn84aNJ6sgoLC1NBxc2HIwp7jNBCdh4SeBwNvqwGjgFg/IgUYQ9VamqqBQCMA6YK3ZmK6huIhnPD2bNnW0gQQW6dnZ1sX1+fA89BvgaXmJioc3aeqOAYA3JuQvwaqc0SnS2XwkuJhiUI7SnCDQFaa7aRBgtNQNRJH+MgOtpB2vsHSfba24Q9g4O1XV1dpiDr5JcmBWCQmHgALwuB9fYcgcMOBqVSqUpKSupzYzzX1tZmgN91qNVqdF3Q48EPwABHF4B7ASSwm0xiBCPWDerYBIYbfmEaqJvE9Qz+ZjcsXbRmkdUQHSemRsBF0oNffNZoJf0gvUPNsVuN8dKmUIobtV22tLQ0HbzzYLjqO+GDDdgjBeCm8YlLQoZB2gS4bHe/Dy9sgaMB6wv5CWfNmsWeOHGCCZTfRJHTTz4PdWmQy+WJUqk0CpsKs9ncXZyW+n1a25zhnh7V8hWLnZidLpO3vg+mtwdPCviA10G+u8KlridjNEkFkqYC1RwwIfYvQ1rsuuuEw5v6RFdoEqrMizioCxqBowxBsVDEjvSScMP/9YAa7oPDHzkMeuJU+bHw0WTDuSYclZxwK1qlUimcAwP8KgSqGtpdKd/004F6ob11BGhFOPuNHlXQYhlr164Ni/BNOMAgkUGXAYbM9A8lcsPT6uY6j1HPTv84KWXOsnmpyYnDaTiFzWYT8yglIE04wDRNW4PpsIA2yAFSH3Z3YVLJo0MDGycvwZajSERRcko03M8JADt0Ol2wFr5XmnCAFQoFWsG8AcMguKk0oMJHN9BUgy8s8J9kFAG/dI2NjWH5yCcc4LKyMpTgDqh0QClmGAZ7iTonuk6TTbPAZZJ7miGe3EAXf9itZkwm02USJtdvMroqOXAr2kHt9PtS1c772N14HQcHJqFOE0aOwQHijg2q5SiQ4HSJ2C+zB3r76rt7e3Fo82JtbW1XuOozWX3RDpDkS1D5JgBxVEAb9lyAld0PbXUtgBsoFiriiTH0e72fLhWTLLnEJ8OtFktXv15f2t/ffyqc9ZnMqEoHANgKTrwW/Dw1gCqjKIrVA4E/iUHnjnGXEAHE2W40ne5GFWroeQCyBqS5xUYTg4MFlTV8XyEQkpyFixp/vn/7SRJgwCNYmuywWc7ZQzPtJdUXsT3dPp9hExtPiUgcHBgIQHPDAMig/Y27ea2dPLM97MZlxI4HT0cy1tTkChRKpy/r/mS06YGmFIbWonWNxhcCT2Uu/Hgi6hQOCRYUFxcvgXMhHDc5712GtrbCOcb6pSEBYy8SKZWptNHgdpcbdfJG4uQ5RJmZudfzvjPIbw4cic4QJj16JHDu9BU35knjAriwsFANBT8Ol/8GR4orXglHVeC6CYD/rdlsfstfGMwXieiW64S1e3FffQVWOsVcOu8mT/4I8vLy0sBOWQt8THePA4NrK/zuaklJyUdnzpwxkAAUsorGaAyhUPgiFLjd+ZW5V0LoDAp/GQyq/8YRpUnl9BSR9WrD0FTRYEhAUcR6sfqH7vdAcBZKpdKHgb9zPYP8UJLh/mKQ5E04DBso/5ABVigUj0FhD3sb9HarjAiOR1Uq1cMTxtUIIlvDRcJZ3QH2E/julF6RJppo7vqnkfsoOMCzjXDpN6oUp+6IxeJbMTrFX7pQAcbu1adJgAldSFDZKPjiniJfgrnIyhWrnuBGwmQDt71DJBBdFWfNP+L6UyaTLUeekQD8cka3ZKD29JsulBeBthWnlMzlmx7S5q9atWpCI/gjgTi7NX/0DR/p3ExseU5uvzxjwVA8WXp6ugzb3CCKlFMUFX6AoYJBz6NlGGZeiHybNmRvdYWG+VHNbs+EMjmx9Wh/5vo7JSVFzHe6jotYlo329zwkgCHTUKzigBbfdCaus1PJdLuNk3hgzDn/ud+nUlKt8pyCkX7ngYGBoT75oMrlOL89gKG2wRchY97DWZB2UKvVXhwvEyOZzF0dz3N2PyzxIticwfBm7MZ7ql1/Y5ctCE8P3zIRXFDR7f7ShATw2bNne+H0Dvq7fCoBpzeCmTU/HclcWe58YcJvoA+cD829X/P86B3g+54PJJVu1Gs2m/3Gg4fsJkGb+ls4NXCc7zgF57MaSPuH8bMwcok7doyy1Z6T8TGqXCTJmEeibr7tj573S0tLmyF9DQ/hwQkDpdXV1QP+EoUMcGVlZS2cNsNxwU+yMjAanoC018LGzQgks1qdS6WmPeLtGecNdZGISNLnHfCVn8Ph+ATAO+dLkuG+DY6PQJPWBqrbuAYbysrKPqNpej0U9l9QodNwqxGuMX75BJy3QvtwF3yRZyeWvVNPg6eOEUbrIxDFG74q1aA4McXnfCQMelAoFIfh8h2cuQG87MaACTg64Thnt9v/Wl5e/jnhYZCFrfMBfGOcO5sAgKNm1kIlwxadH+nU+bMtt9g6WwHl0fz21XpJMrMqU7b9ZgXP7EW5ubk43UcMwFrAEPO54Iw3Ctt4MEhzH5z6ws69aUDirKzttlaec99APcuyFx8MIntHoHbWH82MB4eBLDXVY+75kl7p/CwijZ/Fa9G0cNAMwOMk47nKO4jdPp9vemFM3EfK5UVXJ6t+02Klu0gm/cf7M1ibZaS70LO3ahQJhUS+ZMnLgtjYSbNPxgVwfn6+BizloTXtwUHv5TMA/UUjSWrab+wXh+eJ+QUXVLY0axHR3LJhP//cbxCuiAA0XygUzgb1r0SrGgyv1t7e3pbGxkafS0WFArBg9erV0QzDPAnXa5xLC2H/dDdY0kfhvKOiooLXqjZfBLLXX7nR2e/PthUICMfQL4dQhHDFihWZwOfbnSNNGExBnMPw1ri4uEaJRPIBWNdeDdyg2+CVQADuB3D5UzhWw5e0EA+4XgvHr+AL+wckyZs8Fk8dGctP322/3sgrLa4VLcuYV80rsRsBuDmgHTd5i+4AwuHFJWq1+jtFRUVeF3IJCmAAbgGA+SJc5vhJVgRp/pCXlxfMuOa0JMOp4/e4rjl/M8vgmVAmH5AWrmwJJn+MeQNg7yMBAiugbJw0f6e30KhgJRiD6zBy0l8HCT5bIpVKnwwTHyOSLPU184nNugGvA4E7xBSxpFG1cOlHwZQB0lnkHB8WBEiHNE+hUIwJwuANMLS7MfAiX+P5Gwzp2eRrgdAvAvV/sC+a6eniraXkS3ODyj+U6A5Q5WOCKngDbLPZFsApmOhITWxs7IKg3moakTK34LeOvl5e0osk0kQH1f5idAday8H8Bj6IWM97vAF2BoIFS+oQfjMtyPx5hYbzt8apO/Bg8Q7seetPweRvNBoxc17B7TeK5MaMufMGGMS/I1gm4GzCYH8zHch0oaqAbmtJ9pnAQ6iFKjURp2cGVcaFCxcQrF6+6XFoEf1iz/u8AQZfqw5OwViB1ZWVlW1B8m5akPn858vh653N+wcY4SoOeskNHAsuDyK6o8tisdSPKZpvabisAhSGjjqf0BtcWujPJEK2WA032etqY1ijj2U0udExO+NhAK6vCTw/GwhkDAAA6T3ubdQpKDeJYZg3IaO9AeqNldml1+v/MV5GRipJs5c8y7FeeO65N0MYyrJarYeA52XE9+C+FZ6/X1ZW5jWyJqiuSow0yM/P/4lYLEZ1jX4ubobh+kjQKGiFr+mPBoMhbCu1RSLZm4OIQBonys6Je/uLiopqAcgS4C92DaM3g0tdtIHQlQIuWl8lBd0X7YzUeBH7neFcCAUuhoLxc8ZAsbNfhimj9mYvg/vepNd1C9fJov0bxF21tSpwU2Kxz0oxf4mnrcMAXzEU6lqw0R1f+PlC4SbTxep7u5/9xXujbo5C08stMLKEIpKf8ca+z8fkd7kq2V539fvmC+fyqPhZdwqEQmLTdv469uvf7lAuWBSUa+WNZgAOkgxlJ1/Vvfz8EyM3PMDlfFzEPbb5uGb9nevc8+p9d+fvLec/f5Rub4lmcSlD528EIhERxsYz8qyFLyX+y9M/JOOgmQH/IMnWysNT9KI0zbUX4riuLpUgMdGoe39PMV1f9wv9xwc3sMaxQ+icw0Ec3VrKbDT8W/NTm3WGjr7nlrz7bkg2TaRvbRdx9P8eeuAe+5VLbrMIPaTXx9ocnMWSyHBs3r8uXbDYXnfxv22Ndcs42gdmrg09oN1madutbJxGXs6KWrD7sqOjw0KCMN3CoaJxjQ4c/8UwUNdoBg6SloPpHpYlcSOJdO/ufNXwwT+e8OkSedl4Y+gSF7ITUcN910OLgvuP/nAnWiiyHqXJ6b26wctGsxknqx0H67mczzod41LRuHEkRVGPQaU34Z5/brP90WXqKiws/B+Hw/HWFylGWiiW+F5V1J9cccMbcAxf8gcX/6JYh+xWSrh6dlJM4l6dsOaayYLuaUpOTs6HgdY/CVlF41IDUqn01wDso4Cr0mMpB7xGc74EdwzVaDSf9fT0TOuFzky15wp/8tCD/+Lo611rb6hLGn+OwZGI46hEzpFQrJTdNFchj2oWUUor4zC1t7c3+PtdyBIsl8txLs5d/tbowHrB4wfUajX2suycbKaMh0xlZfn6I/vnUbNTttqvXknr2f5rKQGmco6xHUqj217Oy0P3P/kNL/paZksG0lxAkaWpUZL4HYzS4igoqKmsrGz1lWVIbTAu/AFUCpd8O9zroD1eTyK8b5qrq4s3dXXcZb5cs8l+tX6BwzCYyprcNGAgf9cPuJxnm+y1AsMPWLCj7URgdwhwhwN2aLMLoQA9ZHCnWZYSCwVizKODJa2nVeotP31j17u+3ikkgKFtXQSq95NgfgNGQbG/L22qqW/Prh/YrzX+s73p2jKH3ofJEFDCeADMo+29wgrrP7I5LnawnHHQbLULOE6glkjEcUJOnswxUTdFRSVqGFo1V0QyJBnzmuY/98ebfOQamoqGdpf/UNkNwsVCIgrggZ07YyxXa2/nRMJXDYc+ULF2O+V3WXavzBhzMeZPvmqZUGJSLaAu/uFa+xmbx46peouFbgN3upqQ3sODliaK44TZUQrN1zu1WcbzVRtVy/IPe8s+JIBFIlHQAe64F2EoZYWb6uvrpQmNtakCofhVw8f7o1izuRAO/5YtEhe4t8rzcvhPfsspCaQyIlm8tGzfidKDAG6Kv7ToaoF/xF4YNPaZZMpnVs5K8mnAhgQwTdNXoA1GL51vjNaAyWRq4Jl2wmjws0+LbEc+/L5loP8RW53H6gkBXJyJJIFEQqLvub9MnJJxX8PegwtAGL7O53fQTBrqOzqq5CkpPoe3QgIY/dqioqLdUJFvkMBjymh2vjVVw4fmizUPm04dSycCbmv/X1+TEIdDjh0N7sQ3cG7ozzEXPMhPuyuMjeujoqMfickvPiqYO3coTKe4uLgEeJtG/NhIzl1Qy8Gu8TtvNWQ3Ccy7VymKygPmLPLlKjnX6KgGA+uNUMsJlgyNjQmWD3dpZIvztxqrKtIH3n5jHd3TRTiL2SujuWDb3KEf+fgjGJcISJq1YFA8J+O7id/9vwfIMy+4bjMgmbuhXt8AEJO9bYLpjL+6YLFYjpIAn9q4uipBivOhoF/B5TIfSUrhQ9h29uzZCV9CyVRZWmQ6V/U11qi/neloy2V03cPjsAHawNCll6e/6y17kYgoCoqJ6tbb74jKWe7VG1m5cmUC1O12vHTf8xHuDQBPT/X393/ib9KZi8bdFw3qRA5f2iNQCZyINtspte1w/alOp3ubTyVCoYHjn6wwlZ/OlM+dv9V+vSHNduWyBCw5GY7EjJGwYMHFyV0KJeHcRnr8guvlli+jTaTWEEnG/NfEC5f9aNZ99wUyVoX5+flRuPcjhi3jGlpwbsOdbAjPRmIEYINWmxiVlBTybh84vVGhUMSASuGsVmt/ONeItpaXZ+mrK4h8weJN9s62NdZzlYSzWrJY2p7MmU03Rl94qk6vADhbGRwQEKfPJRjU7ujTjc5iPB0aILWiKI02+t4HPrRJLT9MXPcQr82vx0sjAJvPV1YbDr7/Cb6cfNkKwoqlLyizsqYs7NVUWbbdcv4ssVRXEen87C1Mt5bQcJBREuqhQoMBGBILpFIinpNOmLZWIsnMJrar9UT9la8S+7UGYoGPiFfeY4oaWy7OLFSV3NwqUijuin1o06SOsI0AzJ3/SNnf0PM7uv7SZqa9jXACYhbNSmTFibOJKC6eOHQ9b9mar52UpM8j4tlziCgmhojgmcBBKuRLlvCaQznQ0hIrp+mN9v4u4uhoI3RnK+Srg0pQaZIFC39GtzQRNIiYnm4yNOmKdZCh2QOcN4aGDq4wJo4Io2N2KopKDnEGw1sCkWg73d4eRcVEv2epq/0mXG8iDmb0z4OUXoFYQqhZCb1CdfThuIe/fVLW2/tXQUmJBTVdVFTUYtB086AtjUVXB85N8L7nJ2Je9ag2GCMO+kuPLXc0X3/HfrU+ibNYRlVeQEEzJ5MN+W2oyvDsGBioZw2DI4tEAeNQFQ3/hrYBWKD1GWenjEwWRSUmLccANAxR4Wy2oUHtoVXSPQ0av0NyY59xgdpdSkSEctWAJHthOetwPJP8w59+1rV7t0qekrg8Kjmt3iCRMHTZZ08ZDuz7D9eak8F0aAwxU6GAMpRWcUpqk2xJ7kkBw/w55r4Hz7lYU1hYmA6Afguu53psLI2bTV+DNvY9MEhRwsM28ubVyLJptUsNh/c9yrQ0Pc20NvPsjeECXXpDwndunG9J8dxZzGtCt/uohqnklN2Kpctfi7r51qPeyuvZtzvfXl1VaW+8MjonHppBnDoHx4l3i+dllqrWrO9WZGXt8swfjNFMeKd/BYDjfL0zAIwS/Hp5eXkVLybxIJ9WNLdtm7AjOVkmk7Cf2i7XFKHR4ZvCBy4XcDCdH7goTYSiytUb7mkQZWQ8E6XTNwjWrfO5Mlz3S787bSo/VTJisI15Abd1nkFDiUH9cgLhIdUtt500nTjzVvItt9h95e9Uyz+Cy0xvfq2LsPMCu3Qhzb+Ha72TwNuud3Ul9Z84chvTcm0r3Xp9ETtktXphrH+3MAzgBlLLZMgSRjdEnJp+iUilzwhmJxxNfOgxbaBye3f+5QnjyWPbWaMxalRJrnIxX000iKr0uqqoxGK8VPdk3N13GVRFq8/zYTJI7yo4Pe6ulgPw4W/gCh3mkzYQBeUH9/3t9adobfsWaJ/njF62b+oBpmanEIFQ8DvVrRtbNeu/8mIw79X57C84a+0NrNwBFqpURBQb/4769jtLhQuX/j1q9uzuYPJGKioqehSk8na+6YEPlTqd7k/h6EMIqqsy9luPv1h/8MVXknK/8S3jqWPf4UzGYnZwglcv9NlJQdBKxd6qA6oNd/bqa489Oefp5618trEdyWOgJbb/0PFdgwf3jS4O/wNNKsvMqmeF4q+mLMhpFNx6x3gMn9gg06tjY2NxdYTJBRgp686nsNDXDRdK99N19bexJvNW69kzuFZWMlrFI0wa4ViIRtWojFwOpYiIoqOJQKm6qixabbW1Nm1OWLn4vGDZhuFOlS2/D+pdet4/XGKrOb/Bs44CmdyiLFlzTTI76d7oO+8f96p08NEFtWUuTuQG1yks+xiGPNgQlbMSe73QWtxlOPbRElvT9W8LCPcjS1X5cMf+cE35vpC/p0QA7ap8wRLsDXpHll94hqRkvB2KqnQn+/XrK3t3v/k6o+1wljJMoig1EaWkbUv4zvefCweDne/XDKdVXpZB8ko4kbuqqsrCJ23AvML4EgLS0CABj/ZmpvXaN00Vpwnb35slkCtWOgyDhB0Y8PW7G5URS1xtHvwhrBdQotKodRtJ98uvPPkiw8Rc7uiIHTCb7QzDdI83FLf1Jz/YwWg7H8MODVcNxAlJRLXh7sejN9y9QxDGUeCcnJwEhULxYwAuOVBap/T+DPzhgMYhH5rQuUmG0tJEe/vVzFf27b9LOzC4SaWQi4bsMQftJjLUkJVqNJsdDtbRce/Sxc+u3PiVbsmShV3yxPRrK1asSKQoCuOul0NqzTAPuAFgVjlN038HoNF/49/uHjsm66m/sM1cUfrvrm3o8MeSuZkW9dr1v1Sv3/gbPvngMo64KZVYLE6H+qB13G21WuvPnz+P9RmzeEdBQcFaeI9HnJtMeq8bx9nh2A9+8F4SJpqUyWfoB2o0mh1Q+aV+ymTg5f+jtLT0AxeDwPosAutzC1x63XMJ8sNdTp8DhvjbVmAU9b2767fGz47+2NF/w6+X3LQAJPeuH2uK12znk4dzmPRBuMzG7ftc98GP7YK/D+r1+gOeAQ4YiSoSiVZjTxakGbO8lHOZ/gNarfZAODcwmbTZhc6FS9EXxJXbZrk9wqUhquF4paKiArc3H5LGkpKSbGAYMjwpQEBBs81m23Lu3LnmQHXoe/vN1w0njj7GGvTDbaFQSEQxsWfmrEpZRx78Bc3DAheBRlkP77EZihZ5q5dzMP5zu93+rLepJcCH2bjnIKTDj1aFBhhcd4BaPuxc0ySsAUKTOn3UGU+NKq3AuecebpV6DtrUOmDGqF3BQUp+A2luDRBYT5y7k7xXVlb2jK80Lbt3y1VCZpvh049+wjpDYh1EYGOTksv1DP1/Cl54rZPwIAA3CyRwKxx+3R5nnf4CdcKNN7yttSTIzs7G1WOlINV2+LCNPtKNmyJyfnBubm60XC7HtSl4LU0DDDXpdLo7fHUM9O3e+Zzx5Kc/clfLnwhkNW83tR8z03QjaIp9wOSAQ6Pw0W0BcNfyrFMbtMnboE3mvdHVRFBErvguk8nm8wUXCedGxcTEeF2ISvvS9h3GE5887XLZbAIh/XeaqvufxuZeC8Pgoqr/BKC9Ulxc/A1cPtBXGTjRDtL5DDD3QinwHrw38JwoisgJ4MDIoNe4BFU38htbXV2O/uTRdNZi3Mp0tN2kLFlrtbc1K+p0ur4jdq6ttLt7pPvN2QTgkoGbkpKSWDBw3vaWPyRTg1RKA7QY7ukFoBkmfZLaGF5OdQW8Ee4TFMJvRvbwcwjYao5lSsAF+1vMP3/vBaa/13S5trb/T93GupOd3X2Mw2uvoxww+RZIqldQwAjCHwXbToalN2o8FJEAg3GC3YO8V9XDreDAVRqJJ5NnLaQSNj/1Uyoxsbp77zv/eeRMmW27dvBil8XiNzYbAFaA9vgq8W6boBHIewgPfVowHqd8x7eIBJgMLVPheBOYFLC7DtIg00dNTdVXHIlu2/bjr9quXt17tnfw+mvNnVf7jUZe0oTrLufk5Cg87+MaYVBWGZ8NOZ10SSqVtvNMO2EUqQCTvr4+HA89xPnvqHZAO4ervB13v2kprdojnTv/D6riVdt+d+L0AfvwLABe5JzM7tXAg7Iwhjng4AP6wkDvRMImJRELMLo8er1+OzAbVxFod5ccvIajCS5/Du4U7gHIWC9XZ/e+t/tXPTv+fFy+dNmOl653zlOvXf8KPAsqFBj3Oh4YGPDak+TcVvd53J/RlyTDfR18CH+cjGB/PhSRfrAnFRYWpgLQC+FA94nFDRvhwM6RkQ4KS9O1vXRb007CUp+pb755xPcEo2kDWNhP842mAHBehfb8bX9pnC4T7oKyEgDVYBgODhLAcQnuHQCNgm3vhHRcBEvTAuDxkLPTBHvFsgKlBYD0JpPp0Zqamn4+eeOsDpqmkymKEoJB1e/ZGxcJ9IUHGAmAwEGOnwPI8b7SILhweh6k78RU1zec9KVYCK2tra13zpw5FwFE7O2Kch8Bcq7FfBVnS4Kkn2lubo4I1Rou+lJIsItQXYPrUghtcg4AixtJ9UGbewmuTzkNqBmaoRmaoRmaocmi/wX59W7l1UyD1wAAAABJRU5ErkJggg0KjNzvVni0CQBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANMHfQABABuj9wKgHNsCoB2CVLR/1T9nVcqaUa7aAEAVu7joAAAEBCAoAo19EAE2mP4zc71aFtQkARwAAAEcAAABo9ygf0sUIACetHhMIAEUAADmNz0AAQAYdCcCoB2DAqAc2H/WVLaaUa7ZP2dVygBgBwpASAAABAQgKAE2mPwCjX0QwDQoNCozc71Y/uQkA6AIAAOgCAAAIACetHhNo9ygf0sUIAEUAAtrB4EAAQAbmVsCoBzbAqAdglS0f9U/Z1XKmlGu7gBgFpOaIAAABAQgKAKNfRABNpj9HRVQgL29ub3MvdWkvZGF0YS9pbWcvbG9hZGluZy9kYXJrL2xvYWQtMTQucG5nIEhUVFAvMS4xDQpIb3N0OiAxOTIuMTY4LjcuOTY6ODE4MQ0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wDQpBY2NlcHQ6IGltYWdlL3dlYnAsaW1hZ2UvKiwqLyo7cT0wLjgNCklmLU5vbmUtTWF0Y2g6IDE0NTg1NTk2NzY3ODcNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1IENocm9taXVtLzQ4LjAuMjU2NC4xMTYgQ2hyb21lLzQ4LjAuMjU2NC4xMTYgU2FmYXJpLzUzNy4zNg0KUmVmZXJlcjogaHR0cDovLzE5Mi4xNjguNy45Njo4MTgxL29ub3MvdWkvaW5kZXguaHRtbA0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlLCBzZGNoDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuLVVTLGVuO3E9MC44DQpDb29raWU6IHRvcG9fem9vbT10eCUzQTAlMkN0eSUzQTAlMkNzYyUzQTE7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTA7IEpTRVNTSU9OSUQ9MWozbTllcmtwczh6YWo1dGl5MGR6cDdzOA0KDQqM3O9WNL0JABYkAAAWJAAAaPcoH9LFCAAnrR4TCABFACQIjdBAAEAG+TjAqAdgwKgHNh/1lS2mlGu7T9nYGIAYAcyz4QAAAQEICgBNpkAAo19ESFRUUC8xLjEgMjAwIE9LDQpFVGFnOiAxNDU4NTYwMDExNzgzDQpDb250ZW50LVR5cGU6IGltYWdlL3BuZw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNClNlcnZlcjogSmV0dHkoOC4xLjE3LnYyMDE1MDQxNSkNCg0KMjM0RQ0KiVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAALHRFWHRDcmVhdGlvbiBUaW1lAFRodSAxMCBEZWMgMjAxNSAxMzoxMzozNSAtMDgwMMIHGQAAAAAHdElNRQffDAsABTKI7cufAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAABGdBTUEAALGPC/xhBQAAIqVJREFUeNrtfQd0G9eV6JuGQSNAgGATqyhSpCirUpYoF0m2ZUtxrFhW4rhpLSdx7J+fZLM53l1nN/+77M/uJvs3zY5THGcdJ3H8U5SN0yPZiWTJskiJVrF6pxp7AwiiDubfixmIIDgDzAAgSMq65zwCnHmYefPuu/fdPoRcg2twDaYvUJM9gOkKTy9daitymM7QNNUhEPG5N8/3trKHDx/6BSHCZI8tHpjJHsB0hVWXLoWq59ZZri/I/3CVxfShOQ7rXUUzy2feXld1uXAGGTzQPhSe7DEiXENwmrCdELHG5eovMhlWl1tMBS7eYKswm5aaaWadEDCW3FZS/t4bFy54Jnuc1xCcAeTxpkGnmbdXmI2rDDRNGIoi+Rxrq8uzNJfm8UvmFBWJd9Ybjv3pVP+kse1rCM4ATvX3C7fNrOov4NnbbRzrpADB2BiaokwsU+0ycquKDM6eSpetfXt7x8hkjPEagjOENUWlnhGGNFdaTHMBr1eO43crxxpNDHNTrz/c7OHZ3e09A/25Ht81BGcIWy5ejDQUuUIVFvM6oGJuzElRRLZtqrAYa6wsd5vZZNt9uLu7I5fju4bgzEFcWFLWM9tmWpJv4GqpGBUDchHwP0AyNcNkLGQYcl2Jw77z3ctdfbkaHD3Zs3M1wAt79vSdHfYf8YSUNSNEuoVjqZWFzqZNNRX35XJs70sEi6LIQLNCy4dmhpaxwcfIUT8ORyKn5RuMO483AMGLLzAYnvze2lVfvLex0ZCLZ2VzcZOpAoBI3CNnQKuDZiTSFoVk54ZzJ+GzG6gtks619w4M9fIU01Fg5Gep9YFrU2aWMddazP+w32rohEM/mOhnft9QMCAQEboEWjO0Qmh50MzQbNDKod0MrR6pO53rf23H3gszrabXQkLy9QGUTFVbTfa1MwrvfXTpvPKJfu5phWCZtSJLtckI0wOI3Kokz4zcbD6RqDst2NrRH+wPBlMaNViaIg0269J1M0rvJBMs6E4LBCNrhVZBJOpbBu16/A7HFkNzptpD4XwpfJSR1M4VnI86XEAax8XI+/hsaE13fu7znXZX4UnCMGr9r3w30LQDbvbMfQvnLpvIuZvye7BMqddBKyLjF6SVSOz2OPQ7r7R/wnH8TTXRvpiRbZdAc6cYF08kroB7bpSb1Ny8ynS+v5cz9HWR8PmzJDLsie8/5vdoCJllNRcucOQ96C0t3f+7jomxdE1pCpaRMw9aMUnOWhuJRKFKgNJqns45ScoV4Bxe7075vle2Clhd4jDNeOkCl2icv4gwTlfSG4FUzS6w2+6urCxcPFFzOKURTCRKQspNxlop+Tlm4v6s8ox69znV/rIQhghxJY7LZLMFZlTPbCM0HaZYjhhqagll4MdR7+jAKFJmNpXfWOCa+/QE4WLKIlimXlRptOqoyK6dCsdRDfLrvL0X2L2ocg65SbXSuBiGEcMcO+IPR8So08FiJWxxSdIb5XMssXHsBsOtywonYh6nLIKJxFpNOp8lP/EgTHQQPrp0XCdV/xny2BRhAIRovzAqSDPOAqIodImx8RFSwHM39IyE75mAOZzSCI6xXj2gxlrRwuQlV6ZVFfA8Irc7SR8LScJVAgwdDBMqFL0YsGaK4QgV74MQ40chfbEbWGuTwzaHTIDQO5URjGQQ0vkbRUkUqDgAH/uIRJ3JACXn96B/Ml02qSXjusVLTtnttnOxfVdEJCruwaPHLEDhAhHvu6uxcUa2J3HKIlhmrXr8p4hEVS8NXO8CfLwFDd11iUjCe52D9hfoN5TiPjgmVU5gNpvDwQiBXVhGsM9HxJC8rlR/RZE5Nov5k7PKsm70yDmCUXiSDf1F0MrlT4ssVCXCeSIJSFpYaw+0wWSdAHm98LGLSIg+CO04tDZo26C1wnktwhgukKSxVl4hLK0gQHK4p0ui4DFsGRtweYYlFGcAFs6SfJ4zv9XX/7GmJsKRLEJODR2y0aKaSCpG/GpFSbcHzrfL7DQK8H0Ejh0lki6sNlacLWStJ7Q4CmTO0CE33QC/74cxHSGSRU1xL/YLIkEKDg/0kXBfT8JQ4UdmM+HKKgmTZwMEcyQSDBHaPcQsCpCqyrYhuo2cytqc5wzBsvmvnkiSceLE4DhQn0Ab8zGYxOG4Cb0ExxDpaCN2kLFcJybxHpURlytABKMkjQtvHMUNA8KCAz2EOnMCNoPIKPXSDCC2gvB1MA0geMWCA3Cls4VF5Ja5C+ot31ix4G9LSt6Fc1kJu80JgmXjQA1RRm4M8DgaKtBgcSheD0XWCseQSvPlhpOKUjGyZHe6Lr50AScfxoNCG+75jfKY8BlxHP6T77Z5CgODxCpGxmwuXFk54WfPibLkhBmKqkuDHve8QH//PfaSEtwqDmZjrLmi4Jh7LpXRgpIny0kSBCaZQrtJchUmZyBL2mcB0eeI5HLExYtS/1D74QMbmytLAaOj04ts2VBTp4DcUaAjETMTDqPBZjlc90w8J0sXJlzIkoUnRJpWixT2K8hGlEUuADkNSt7QOqH1qbFWrrSMUHwSDydQuommiYmNogQ52dxsjC8XUjQiykD0IZjP0dgmFkT5D00R2pp3Zc9V6BQFDJznaDo2B4WwyDPmsLmaxFRqjlJ/vb+ZWhA/egyINxjUOyk/KbL8jPXiXCAYBQ8f0Y4w7OfNteA0MRBDoEjEQDBpFwVAq1zGKS8TjmBZGu7TMVjcw3onelw5BVCVBPcg4Dl+zSZd79ixIxuqUk5YNAx0gEhI02KRwsjGSc/KywSsDAvb7thHDXdeJqI/uaEM7dYRyQaGKuCxbIwll4LMWSIZJdRYb3TVQmvP4ZgmBFw8G3XmI4iyryHi8xH/8aNEDCKrFhWlDLSAjQQE3M62oRUvG2PJGYJlPRbddmiHQ/0O/w/Ln0ixJ6Ch7qfXgzTlgKVooiQwh7s7ie/wQSJ4vQnsGnANbHzYPRQ53PI22srPZG0suXxweU/pAPEfKdkk3x8R6ksSQTHtoNTIgfirgOGIQMJdl4kwNEC44lLC2B2gG/MggAWix7znzrb8/tiJvWsf/3TW8oknJapSlpC9k3HvXECx0Yg5wglu4FGVCF2IwXNnpHAObNBRAAoODo+c+ICzrOd58l7WxpI1BMuWJ6RKVPhwBY6kcJxflbAS5tTGsSytRMGJPEreoEUJweL+IW/A3dk/jpPJc4v2d9xSBT3bWFYQLAeWP0SkwHSMgsQ99Qgc/yEM5nCO5nZKgGv+/KaLI/75lZb4cDJRVX8Q5RNhUfTD918+e+TIGOTBHGKQ30JoBUQiHi8cw+CFg1oEsYwQLCdzfRDaN4gUlxx/vQ9A2wR9vgWfX8uG4Xw6QLWZKQLiLYibpeQ/kE+f8oyEfaHQqdgRObD+BiJlcaARO54lNEBbCn3+QCTBVNUolKkUfSu0F6FVkvGLJWpPhfYFaJ9NN6lrusHc/LyoHixBUlPklXjpaHCAKO7e6+4akI/j3N0gNyUXa8yB8yEizb0qpI1gmS3/C5GQmMyRgAP8JyIldl31sMBhI1ZO31r2hAUyFA61vH6gPRZyhMF3iNxkHBbnHF2wtwAuVMOLM6HgO4i0N2gBHMhjKnFXVw2sbGy0bu8afAQUvlG/YArqRaCJeMpKyK/k4zhHyJa1bp9IaDVqJzOZ8EUkSQC4AmB4iyOTCZzqsJDjWIeBLQXNh9bjDDvuGfEd847E7O/oC3Zp/rEkXRerncwEwcU6+yMVWzO435SHhfn5ZBZIz3Rsw1LAsSirRTEIgf7bEwjt+G3HYCxcF4lGb+6zarprJgjWkw6CgDFV09qJkAqOhX1Vdo5zUbg9qiA38f/LvoBw2ed/u/XUqVi6Kppu9eZSqWoomSB4L5GCzbUCBqkN6ug/7YCmxBuGBaGO0hi7gtpxUBDahgPi7rjDqNvqzaW6pDqmDJ5nK5GQpgVwdb50dTjx1aHZYSc2lKA1UC+CIIohT1h8bUQyXERBniMkHq2+YPTAnVU7mTaCYSC4ylDHxWoxySQKXJFPQ7uqLVp3NDY6g2Kk2cqOV5FEhelBhHf7A+6Tbm/ri21tiaZHnNPtJHluFl4U9+03kmVkZKq2vA3tESKlgCTGpOBKxJX5FLQXr3a79Fwb7wR5aSmVYBIQVcyUYUCwNyzsPjTkPZB4TvastRIJyR4y/go4l5gy8d/QLicbV0amStn992dYjavg88PQVhDJZIl7Leb8vAZ9judslicRPlRYSGxmfvwJFd42HA77Wvs9B35y8KCiV032n78Nc4t+cqxRgpkfKF0j1WJQxNEJt0XHDQbZ9bdhMFjYC/UyXGH+q8nHmwoOer1rbrEYNaV/InvuC4aOByLCa6n6whxiztY2IkVYxrxJmrlhVv3BcuKYHsn6qoGaPMsslqbG6KNqtTkCwMs9IWHLDnaPJu4mE0paAXhTvozSdIDbGhoKzAw9x8SMijRqyBWlvXdgV89Q6/aW9JCmB65q23CuYH150QyGUMspDQowSp6H3d7uYV9wRy7Gdg3BGUJjY6OhfWTko8VGw5USTmrUixAWIiG/IGx+K3wwLaMPuhLlyn+8ltSWbDj8q4lkl0ZjxmlYxVdtrJUSfMJmY0rsxnrYfzkxhYMBEQ+68qWT7uGfHTmSsl6I0u9RksYaXRg1gy5Ct5zdeEAtoCItBMv+x3uhPUqkAp94HeQ+g3DuZfh8VZasr3oI8mLxLKulmqWo5OYejLuCdskX6PzPln26cn/l6I6b5IYOm/i9AP3sN0EfdDeeTrQW6mbRWHyTSI7+/ySSPxhdgOgpshMJ2V+E9l3oNzPHcz0pUGziG0Uq6r9VBxnxQkQMH/WMnNVw2dGfStEdiNjVRDnHGtUndC/eTyRuOgZ0IVi+2aegPUbUXVrItjGU5ytplPydVnD7/GKLVxDXF/Pa3OKw9/pmWQwv6bwN6taI3GTFWRAvSGAfSCznqJeCkf9vItoy9W+HdldGMzjFYZ6hwllj4a9PLTtLJNwZCJI/6ngfhxzdgaE7WivvoBVxTL1rvQjGquglGvsi61gHg8zJuwkmA/y0sCqP5WYn7RSrlyW9Yufc2aHAJS3XlgFlnSId/XGuxwTh6UVwg87f4J7s1NF/WsHqQoc9n2PNqh3i1CX8xlFk/5+PH9djm08nusMe/49eBOuVuuk07jEt4K6mUrMnEnnIwmiLoERc9wd1G67QXag3umNMpT69k4+V5/Q4EFJWn5uucF9hBTvDyDfQatarBOrFdt6n20yP3qIeHf1Rt74Qf0AvgrEEoB6EbclWnutUg9b+QHOlmecVT4rKhwSdZUdknRbTSbXmIqFv+ET8Ab0Ixpv9hqSmYjyP4Tw/T2PupjxgdfZqi3kNoEBlfxSV/00vYAmFsr8QbdEdf0wkKF0Ilp3QX4X2DlGvuYGPgQ7p/yWXbrgqYbnLzrCJ3oVYOn/sXzKuNLRukF2FyDnfJMo1rxEPqHv9jCjEZuk2VcINsRYyWk2ehIbv4YsP0kaB4NdESjbLSo2JqQgnmmY7lwWFG0uNuanVJvvZ38ASj/DZRCTjRyy6A5G6L6u2aLgY2pwx1urbRMpwQN0LV9G70PD1Nr6cPPkkwWyrM18Qo6/UGQU1D1Jc6f4io+p0M5sWLMhzmNgaShSbig0GekgInTBEuAO/273b0yazZ6ymJ2cUovqE3DecKlc4bW+SfOELJEFqez/AXJCtCgzJjUsJIe5R016ZkUedioo//b2mJq7fyq000/TfzbdZ6yJErOVpmmYo+uIZ78jJNcuX/OTJd/a+8lF5S5RZtmZx/FpERxpQDgg2s3HiS2LGwrgv0WqGJCiQptsbGuZuPXbsEPBZbumyRXOsDuvDi63mj9g5tiqhrke5y2ArrzGbFnvuWi3+/MzlVz965IhuF+M1BKcBhXYe+KNs4EjBmuOxbDew5etLCxbPsS8MzMmzrnJy7JNz8yyVRobmKAXzPi6hQp6zWRn6y+bZ5ca/Fha+fMv27boMH1lFsBwAEKubHLpaoypR+RUU/L+i+pfo1wIDa2q0W7/kNHIj9RZzgYVlXGwKQwmWaTExdJFIc/87NL+q+PKLL/6Myc+/UFRU5NUyv1kRAwGxKEljyQYUPGI1OrAU/+swiKzVfJoqcH7julqBYk9eqSYbmwf1LyrGD/XaHUQhUc3PcoH+5hVtNbevfbesvuHPcHhr/CsQlCAjBMtlGW6E9gw0dPDHe46QitGy8n0iRXhcNZL1l1csu/2DM4q2xKepJEWu4r/Jyzsk6tPyITHMcsGAs6AvMm/RiRm33vE6zzA/dMycqWpdzJRFI8ViARal9wviFoIvQEZ9WYDF8Mp0TD57DKTc1Q5i3umJbLjObl0yP89K+kPh1Rw9+rgpjRljCDk5VUvHlbkCRUSKCwd5puvyjHB3Z9GF9/bNuuQotKytrX3+T6Ppp2MgbQqW2fJ/EUnxTgXIstdPJ+MHINZVb+PvmWuz3mhkmHuKec6EgXXoXMBJi5+4BE5NkrHmdChXbQVh1+5AMPLzju7//mbrfjQ6jbMuZoJgfNcemi15jT/BtJanp7Lg9cT8+RbKbFhu45m/XeVyLgShqBhYICcrRBR1RbBSQ4KKl+HKV+3Ui3tumDUEqIKCAbPZHIxEIlTAH2DDoSBLhcIs7Ru2kFCIg9mkLvkCwo8udjS9vP/wuES2TFg0RvNpRS4CJlChM3qquQ+przY3G/Py+HrQbb9UbjbeXGo02Ay0gpleCblJIynjv2qj3Kj9GiBYWNLl/OD6d01Ll3fanc5QBIuVeobYoMfLUl4PJ1w4b790YF8JfexQdSE1ZF9ot/0jsOqPA6seI3RlgmC9NTowbwdDPqcKgtn7Fy0qWlNqm1/Bmx4G5D5QakyyXsVUjCe5UKV6LOHaQSFC+pyFXfVPfHFrYXX1Fc8QDQvOZneECTa0+dfP8RStXnPRNzy87/hPXg4HXn11TY3DUksS8rAzQbD26DEJ0Bg+6b7he8vLTRUVJQ0zzPxdTpbbtMxhc/I046DHGBCTg6jhyNizSc7HsWR/JOI77wv8Om/tOk9hZaWm0Zis1tDC//HZX/z0xZf/T5hmxwUHZIJg9GygPVprxB/GIk0K9aJZsGZhbX6DpWBhvd28DPbWhwp5Q12BwcDgvppUH0VIaa1SP56SNRMJuYOhUAD20u/aDOK/3LR+A8abo9CkRUbCOT31f/ftU0wEzwTB24jEDrQUQ0Pq/Umu1aSV9fXVqwodtRxLNiyw2+bZOGYJsGEjqjhjTIPpiH1ZEhUx26F9xOc9NOT9zvkgeerru3f7RCmwAoPpscBZMiTjfL4lv1lVETI1dGCA+zeJlN2gdi20nT4H7Vs5KONAfe6GJbOreENVhFD31NnMC+wc21Bo4KwoDTNo91MYZrJkMSXqFbOkEgUFITIUCu96q2/o+7u6B3//62PH+kbvIVbAxwNEylZQCsxA7rkT2m+ThUVlimDkAFjSEFNZ0NgRH2IYCyPBXKXvTFBSGrWpqop/fGkp9WY3tf5Gl72yPxj+5EyLycxSVKkVSJeh5M1VQ0nBRMAiodiiPj7ZZjxWctZgrVKpuDMSFiJnvL79XiH02INbdr6rlNkE/bBq7UoiBb+jBIiDQKrFqnh/hbY7lT84W7ZolKixRge+chWLk0brRUP72UQYN+6YO6tifr7z5hUFTtdQOPhQo92az9N0Oc/QZo5KXOzpIdcnCKTXHyROA0fMmNhNKbF0/dSL93SHBPe+Ifcv3+nxPP/SgQP7NcwvRm9g1gLGYCOVd2rd7q6M+p7F85pZgY6cC/Sc3nPssl4JOZa3hAPAlYai/HA29txb6+rKFhTlVdzmctGnvb67y0zGpRVm3gkjr3NyoK3i2+CoWPXAcfYlxUmOn2yEMOiYaKHygYpigCsB2yQnPCOk1moiLgM39pV0SsqvRuQGIoLQ5w8dbhkc/q44MPyjfzh4cIRkbTdXhitCVkSIPLC82HH/Z5yVB8/XNrbvGxwiZ9y+U49U215w+yyRA11dZO/QkLC9vV3RHylbqLxE/7sYqObycmOt00nfUVxM5gMv+M7J/hsqLfxHFtvzGBPLzA1GIvNLQEdtzLeCxE5FzcDU2MAIzfviaH+RhCIiOef1DZ8f8ZkabdbwvgE3B0gdPOYZ2VWXZ14LyGXpqJSd5FopJOlouX7AeFcgENzRP7TdSZHHW7a3XPiFZJ+PJQaIEyWAjmHR/3bbTbNLeMPmm4sLGowMHQ0aHAyGSIcvEG1hMXJ0qdP+4y6f398VCJF2r490+YKkE87B84TyWHHL9xc1j4vs29TWssgvRm6gRUI5eQMpM/GkCFolNAPNFBwcdH/CxnElZWYjKeI54pCpRpGFKlDQ+G7J2TKw38hJz0h3a9/QLw+6h77f5Mh/Dm73LMz4TX1+oXWFy/71JU7bHGXkqlNvjHKj70mCG8F9Qu1ef/uZEd/vf3yx5w9tp05tlceA6TxLiSRAoXUPZZVzRNpTs6pKJu7B1L2NjcXrZpY9XG7l/77KYnYCyxqNJBGlhwgJ0QrlJCRGMOc1+h0gYueYDmCa3sQ58IYFh1cQ0DlBodDDxjWJv2qUbFVsg2pvN4m/lkBEwR0UAkCtF9/qHdjsDod++NKeg6fW1tZavaJo33H69AW0Ra+sLPr7GqvpGQvLqOBUVLgVCmOY/xsJDYbCQZiv/e8NDZ+zcMw33u50X35B1lFloRSDFFHHTRRKUcPAsoS/JFKUZFYKtCgKWVVVVcYNZa5bbyoueOw6u20FCC/5qDpSSWUyFYlRHRPKV9ERAjP+knGvrpHHA4sv4g0Jwxd8vre7fKEfbe7sPPzH944rvrfmmZuv33RrofO5CrPJduVqCvcV5RPon0UjsScs+PuCofZL/uAuXzD0+v4+z54fHDo0rsIBPBtS7ceJlMitBuj2+wEgeG/KydIAKaXor91x80M1FvOTtXmW2TaO5dUryUwdBEtqSETs8gd7AbHb2z2BV57a+c7vkt33vvr66kfqK1+DvbeZSaISoWFiGFiYLxzpPe4d7oRt51fb+gcPHWx77/W2JNkHssqDocZain2jkIuJA24NfZNCSkvWq1t2/HxF86KWHr99Q63NurHUyM8CwccsvcY4SeVroh+5qqAJuSQqNHnD4eHeQPBoty/05tbe3rcjQWrnKwcOJN3X0D7dUJj/BZDOlykhNyLt22G4bg+w7l/s7B3ynvKM7AwT/762tmO9bdpyh5YT7RXvsR/qvn9Kf9IkSIlgHHzb7n34upf/+PLqFb+tyzPdP8No2ODi+QY+KoiNn/t0UZnUoqQiwuJPkE3C3tcLrHjnrr7BPT4xsvlLb7Wc1HrfhdVldU0Ftg+bGYaKX0vRvTUiRi75A53HPd43BoPBl057hd0K1WFTPVesGpHWt3Ug/dTi7zJ9l2Naho4nbl46syk/765Sk2ljHscsLTIaxpgAFUwyWiZB4aDyP2J0b42Q/kDIC7rrflDp2vwh8ppv+9utz+pM8VrT0FD6iZrSby922NYzCVKzOxQO9AYDP93V637hzZ0tB7anWU5QrpLzBLS5On6GhqKvZ5qdmZaz4as7Ws+CtP29lcX23xCOudPMGR6bb7cWmFi2AgPRxhoGMth3R3tEL4PWJdCJe3v8wY4wiWxuH/YdYiLCO7/vPj209WBXWqbQ+6qKHqi1mu+KRy6y5IFg8FJLn/v1YIj+0lM7WzoymWQiLTq9iEIHTca2+2yYKumPL1pUMr/AXOMy8nfkc4Y1dgO7sNTEsyxN04nxS0ogKhr0o6qHCKqH0OkPCpdGAl1mjn7lpNu7z06LLQfOdfc9nxC9oPfZP7Vk4W1/U1X6aonRUBSTJ9D6MBAInh8KBh/9YWd766utpzIWdGQr3wZo64m2jE5cEJuBUH6d6b2znh63acGC/Fl2Y+HlQPBjy135pY22PPMgRd/qcrmsQN2UIeBnKd/ImL0InkaMOAqCvohA3P4Q5enuPJfHsrtb+wYjp4d925qtjq27Ix7hm2/uxrBclEYxBDejJLfPNy+qXebI33a90zaDjpVzhRV13us7etnne/ThLTt2ZXNe5Cp1WENMS80SFAqfgmHpNhknwoTlP64E9v9gUxNFSgl3mSme/fi/fuUZq8U8zyAINAkHKZ8/QHlHRmiH0wEHaCLwxghscGLf4OCerzz6yS+urvFdGDhjEg2f+QzzyCOPxBzgWCIIDe+4F2LuMWba/UHvRLy8cmV+rcv09ULesNFAUVGLHao/BwbdR064/Z/6wo53dlAaZEX57W/os8XwYKRMZOWYYd+hFFwI/bG01P0keWEVZOXopHkjG3jITYKr9HAYQ/3v8mRQGEQW3VjxLVJSgBtOCGZBPAkPd0j+DcoIG6E9TJTfDYSIxkoCz2JqpZZxPL1yJbsgj/lBfZ75fhPDRgP1QQoXQfru29vv+cALe/alNDDIUjFWt/8Ikd48FmO7+Axo4HidSO9SCCT8DoUtdP99lIx/4WTMlr+ZSK94151opgQ5Q7D8gOjE/jsiVcKLf98ePhimYjwXjyjov45IxoEUJrTo+w3+KZVh4NWVK13mPO4rc/LMH+MZyQEVjAjBbd0DZ/7fxd6Nfz12rE3DMyBy/wba3UnGFY20gPa8kpojs+tbiKQ6YSAiulexKgIuCj1FV1JCThEsPxy6FDHNBV91h75jRCiaDs/Fvz0E+iGlYz3MWg2XRUr+D/j9r9Q6AFsuKXHwz5YbDY9YGEaiXIbxDrL8cz89febFb25vOadx/Ei5/5NIrtFkgBSIaTtbVNh1/Au1se+EvOY+5wjWCjABa4kUKaK1jghS8eeUKObHa5fa8g22r1WZTRutDM3DtgC7Z7mbWb7iZNXd9+wgNItBCb9JxeZlpGCwv5ZFh4CetX+ezBLLUzk/eBbRVyQG2R56aK6UCsS8ojwDudvMWh/N57g13nCYmGgDCcys7bd9cP35GYuv9wJy0buDDcsuPg+ff01iPcKoinIdY5op/+aEjt9kFaYygvXWuMTFEFW/1tbW8pV248wGO/9wKc/f6hcixj1ef3ed0eCyL1rQzd1ye0fhvIUexmCIZ4m4F36WSOz+Lyr3cBL9pacwnGnSEDyVywyiNKpnT0I2GC3bRHNcCU2xG86PBPJ7Q/6nDwTFbTPNpvzy65d1lzyw6VzlgsUeo8WiZNJEJD8ke36UIB27cFak4XRhKlMwBqMhwrQWM20B1hp9u+kfjh5FifTfQLAy0gz57Ip8+8b85Ss6qu578JKjpDTVhGPFIPTk/Fbh3EUiFUDRyl1QaDyrse+EwFSmYPRgbSGpqRjPY+D3b+KOUU8sX3LdCCu8YjYaP1S2bsOZZY9/+py9qFgLNeGin630tnJ5AbUQbQ4NHNceMsm5WFMWwbKijzHV6FVJFtqGVPICkfRIfJEE8/nmxZ+rNvEvDYRDpGjFLU/M/cj9R1mjUaRpzY+LRhU1DQPtw6leyBmLCd+cLYNF2vM4mTfXAkBJuC/iyz+wBkj83oj7IRom8LW10djiTy5ZeIOZoT8OqpCpyx/47ja3r/XkyZNoPXqWaEuxiQHGRX1bTS+FMc0h0qsNqlTmEFn5f2Ur7CYTmPIIRpCtR6huYE4ylvFDey0aR87AJEbrI69smP15jqY7XTR7eLiv79TvOjpG5N8i2eICeUDj7dCBgUaTbUnGg/OGoTdoaVtARs2oXnlcuH93TIVk92mB4ExBdgpghYFE+++4rkTaEr6gVvtR4doYQBcru9+X7bDXTOF9gWAEQASy+E9DsyTpht6gZ6+mV+JOZTUp24DleNGI8SCRVKF4iQtVH5TavwVNcyzXdID3DQXHQE6Uw9peKCjhS76QarF4SWtMj74G1+AaXIOpAf8fnwi1yvgFiOsAAAAASUVORK5CYIINCozc71aHvQkAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADTB4UAAQAbo+8CoBzbAqAdglS0f9U/Z2BimlI+PgBAFbse6AAABAQgKAKNfRABNpkCM3O9WPb4JAEcAAABHAAAAaPcoH9LFCAAnrR4TCABFAAA5jddAAEAGHQHAqAdgwKgHNh/1lS2mlI+PT9nYGIAYAcyQEgAAAQEICgBNpkAAo19EMA0KDQqM3O9WzcIJAOkCAADpAgAACAAnrR4TaPcoH9LFCABFAALbweJAAEAG5lPAqAc2wKgHYJUtH/VP2dgYppSPlIAYBaTwXgAAAQEICgCjX0UATaZAR0VUIC9vbm9zL3VpL2RhdGEvaW1nL2xvYWRpbmcvbGlnaHQvbG9hZC0xNS5wbmcgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguNy45Njo4MTgxDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDYWNoZS1Db250cm9sOiBtYXgtYWdlPTANCkFjY2VwdDogaW1hZ2Uvd2VicCxpbWFnZS8qLCovKjtxPTAuOA0KSWYtTm9uZS1NYXRjaDogMTQ1ODU1OTY3Njc4Nw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNDguMC4yNTY0LjExNiBDaHJvbWUvNDguMC4yNTY0LjExNiBTYWZhcmkvNTM3LjM2DQpSZWZlcmVyOiBodHRwOi8vMTkyLjE2OC43Ljk2OjgxODEvb25vcy91aS9pbmRleC5odG1sDQpBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIHNkY2gNCkFjY2VwdC1MYW5ndWFnZTogZW4tVVMsZW47cT0wLjgNCkNvb2tpZTogdG9wb196b29tPXR4JTNBMCUyQ3R5JTNBMCUyQ3NjJTNBMTsgdG9wb19wcmVmcz1zdW1tYXJ5JTNBMSUyQ2luc3RzJTNBMSUyQ2RldGFpbCUzQTElMkNob3N0cyUzQTAlMkNvZmZkZXYlM0ExJTJDcG9ydGhsJTNBMSUyQ2JnJTNBMCUyQ3NwciUzQTAlMkN0b29sYmFyJTNBMDsgSlNFU1NJT05JRD0xajNtOWVya3BzOHphajV0aXkwZHpwN3M4DQoNCozc71bF3AkAISQAACEkAABo9ygf0sUIACetHhMIAEUAJBON2EAAQAb5JcCoB2DAqAc2H/WVLaaUj5RP2dq/gBgB17PsAAABAQgKAE2mQQCjX0VIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTog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aHJlZj0iIy9jbHVzdGVyIj48ZGl2IGljb24gaWNvbi1pZD0ibmF2X2NsdXN0ZXIiPjwvZGl2PiBDbHVzdGVyIE5vZGVzPC9hPgo8YSBuZy1jbGljaz0ibmF2Q3RybC5oaWRlTmF2KCkiIGhyZWY9IiMvcHJvY2Vzc29yIj48ZGl2IGljb24gaWNvbi1pZD0ibmF2X3Byb2Nlc3NvcnMiPjwvZGl2PiBQYWNrZXQgUHJvY2Vzc29yczwvYT4KPGRpdiBjbGFzcz0ibmF2LWhkciI+TmV0d29yazwvZGl2Pgo8YSBuZy1jbGljaz0ibmF2Q3RybC5oaWRlTmF2KCkiIGhyZWY9IiMvdG9wbyI+PGRpdiBpY29uIGljb24taWQ9Im5hdl90b3BvIj48L2Rpdj4gVG9wb2xvZ3k8L2E+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy9kZXZpY2UiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfZGV2cyI+PC9kaXY+IERldmljZXM8L2E+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy9saW5rIj48ZGl2IGljb24gaWNvbi1pZD0ibmF2X2xpbmtzIj48L2Rpdj4gTGlua3M8L2E+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy9ob3N0Ij48ZGl2IGljb24gaWNvbi1pZD0ibmF2X2hvc3RzIj48L2Rpdj4gSG9zdHM8L2E+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy9pbnRlbnQiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfaW50ZW50cyI+PC9kaXY+IEludGVudHM8L2E+CjxhIG5nLWNsaWNrPSJuYXZDdHJsLmhpZGVOYXYoKSIgaHJlZj0iIy90dW5uZWwiPjxkaXYgaWNvbiBpY29uLWlkPSJuYXZfbGlua3MiPjwvZGl2PiBUdW5uZWxzPC9hPgoKjNzvVlqrCgBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANOS0QABABsYowKgHNsCoB2CVLB/1BQntznDZP+mAEAWkgewAAAEBCAoAo19UAE2mRYzc71a4qwoAQgAAAEIAAAAIACet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CiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgOSwKICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAxMQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgMTIsCiAgICAgICAgICAgICAgMTMsCiAgICAgICAgICAgICAgMTQsCiAgICAgICAgICAgICAgMTUsCiAgICAgICAgICAgICAgMTYKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTcKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxOAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE5CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjAKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAyMQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDIyCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjMsCiAgICAgICAgICAgICAgICAyNCwKICAgICAgICAgICAgICAgIC0xNSwKICAgICAgICAgICAgICAgIDI1CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgMjcsCiAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgMzEKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgIDMzLAogICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgIDM1CiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAzNiwKICAgICAgICAgICAgICAzNwogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgNDAKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgNDEKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDQzCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgNDQKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA0NQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDQ2CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgNDcKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA0OAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDQ5CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgNTAKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA1MQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDUyLAogICAgICAgICAgICAgICAgLTYsCiAgICAgICAgICAgICAgICA1MwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgNTQKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA1NSwKICAgICAgICAgICAgICAgIC01NCwKICAgICAgICAgICAgICAgIC01LAogICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICA1NywKICAgICAgICAgICAgICAgIDU4CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgNTksCiAgICAgICAgICAgICAgNjAsCiAgICAgICAgICAgICAgNjEsCiAgICAgICAgICAgICAgNjIsCiAgICAgICAgICAgICAgNjMsCiAgICAgICAgICAgICAgNjQKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIDY1LAogICAgICAgICAgICAgIDY2LAogICAgICAgICAgICAgIDY3LAogICAgICAgICAgICAgIDY4LAogICAgICAgICAgICAgIDY5LAogICAgICAgICAgICAgIDcwLAogICAgICAgICAgICAgIDcxCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICA3MywKICAgICAgICAgICAgICA3NCwKICAgICAgICAgICAgICA3NSwKICAgICAgICAgICAgICAtNjAsCiAgICAgICAgICAgICAgNzYKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIDc3LAogICAgICAgICAgICAgIDc4LAogICAgICAgICAgICAgIC03NCwKICAgICAgICAgICAgICA3OSwKICAgICAgICAgICAgICA4MAogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgODEsCiAgICAgICAgICAgICAgLTI3LAogICAgICAgICAgICAgIDgyLAogICAgICAgICAgICAgIDgzCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIk11bHRpUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDg0LAogICAgICAgICAgICAgICAgODUKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA4NiwKICAgICAgICAgICAgICAgIDg3LAogICAgICAgICAgICAgICAgODgsCiAgICAgICAgICAgICAgICA4OSwKICAgICAgICAgICAgICAgIC03NSwKICAgICAgICAgICAgICAgIC03OSwKICAgICAgICAgICAgICAgIDkwCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJNdWx0aVBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA5MQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDkyCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgOTMKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA5NAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDk1LAogICAgICAgICAgICAgICAgOTYsCiAgICAgICAgICAgICAgICAtOSwKICAgICAgICAgICAgICAgIDk3CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJNdWx0aVBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICA5OAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDk5CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTAwLAogICAgICAgICAgICAgICAgLTM2LAogICAgICAgICAgICAgICAgMTAxLAogICAgICAgICAgICAgICAgMTAyLAogICAgICAgICAgICAgICAgMTAzLAogICAgICAgICAgICAgICAgMTA0CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJNdWx0aVBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxMDUsCiAgICAgICAgICAgICAgICAxMDYKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAtNDAsCiAgICAgICAgICAgICAgICAxMDcsCiAgICAgICAgICAgICAgICAxMDgsCiAgICAgICAgICAgICAgICAxMDksCiAgICAgICAgICAgICAgICAtMzgsCiAgICAgICAgICAgICAgICAxMTAsCiAgICAgICAgICAgICAgICAxMTEsCiAgICAgICAgICAgICAgICAxMTIKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIk11bHRpUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDExMwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDExNAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDExNSwKICAgICAgICAgICAgICAgIDExNgogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTE3CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTE4CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTE5LAogICAgICAgICAgICAgICAgLTgxLAogICAgICAgICAgICAgICAgMTIwCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTIxCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTIyCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTIzCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTI0CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTI1LAogICAgICAgICAgICAgICAgMTI2CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTI3CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTI4CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgMTI5LAogICAgICAgICAgICAgIC02NCwKICAgICAgICAgICAgICAxMzAsCiAgICAgICAgICAgICAgMTMxLAogICAgICAgICAgICAgIDEzMgogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgLTc2LAogICAgICAgICAgICAgIC05MCwKICAgICAgICAgICAgICAxMzMsCiAgICAgICAgICAgICAgLTg2LAogICAgICAgICAgICAgIDEzNCwKICAgICAgICAgICAgICAtMTIsCiAgICAgICAgICAgICAgMTM1LAogICAgICAgICAgICAgIC04NCwKICAgICAgICAgICAgICAxMzYsCiAgICAgICAgICAgICAgLTYxCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIk11bHRpUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDEzNwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDEzOCwKICAgICAgICAgICAgICAgIC05OCwKICAgICAgICAgICAgICAgIC04LAogICAgICAgICAgICAgICAgMTM5LAogICAgICAgICAgICAgICAgLTMKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAxNDAsCiAgICAgICAgICAgICAgMTQxLAogICAgICAgICAgICAgIC03MiwKICAgICAgICAgICAgICAxNDIsCiAgICAgICAgICAgICAgMTQzCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIk11bHRpUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE0NAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE0NQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE0NgogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE0NwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE0OAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE0OSwKICAgICAgICAgICAgICAgIDE1MAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE1MSwKICAgICAgICAgICAgICAgIC01OCwKICAgICAgICAgICAgICAgIDE1MiwKICAgICAgICAgICAgICAgIDE1MywKICAgICAgICAgICAgICAgIDE1NAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIDE1NSwKICAgICAgICAgICAgICAtMTQ0LAogICAgICAgICAgICAgIDE1NiwKICAgICAgICAgICAgICAtMTMyCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAtNjIsCiAgICAgICAgICAgICAgLTEzNywKICAgICAgICAgICAgICAtODMsCiAgICAgICAgICAgICAgLTMyLAogICAgICAgICAgICAgIDE1NywKICAgICAgICAgICAgICAxNTgKICAgICAgICAgICAgXQogICAgICAgICAgXQqM3O9WdFgLANonAADaJwAAaPcoH9LFCAAnrR4TCABFACfM7kFAAEAGlQPAqAdgwKgHNh/1lSqTqBTKxukUMYAQAZi3pQAAAQEICgBNploAo19cICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAxNTksCiAgICAgICAgICAgICAgLTEwNCwKICAgICAgICAgICAgICAxNjAsCiAgICAgICAgICAgICAgMTYxLAogICAgICAgICAgICAgIC0xMTYKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTYyCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTYzLAogICAgICAgICAgICAgICAgMTY0LAogICAgICAgICAgICAgICAgMTY1CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgMTY2LAogICAgICAgICAgICAgIDE2NywKICAgICAgICAgICAgICAtMTMsCiAgICAgICAgICAgICAgLTI5LAogICAgICAgICAgICAgIDE2OAogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgLTE2LAogICAgICAgICAgICAgIC0yNSwKICAgICAgICAgICAgICAxNjksCiAgICAgICAgICAgICAgLTY4LAogICAgICAgICAgICAgIDE3MAogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJNdWx0aVBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxNzEKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxNzIKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxNzMKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxNzQKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxNzUKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAxNzYsCiAgICAgICAgICAgICAgICAtMTAyLAogICAgICAgICAgICAgICAgLTM1LAogICAgICAgICAgICAgICAgMTc3LAogICAgICAgICAgICAgICAgLTE2NSwKICAgICAgICAgICAgICAgIDE3OCwKICAgICAgICAgICAgICAgIDE3OQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIDE4MCwKICAgICAgICAgICAgICAtOTEsCiAgICAgICAgICAgICAgLTc4LAogICAgICAgICAgICAgIC0xMjAsCiAgICAgICAgICAgICAgMTgxLAogICAgICAgICAgICAgIDE4MgogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgLTExLAogICAgICAgICAgICAgIDE4MywKICAgICAgICAgICAgICAtMTY5LAogICAgICAgICAgICAgIC0yOCwKICAgICAgICAgICAgICAtODIsCiAgICAgICAgICAgICAgLTEzNgogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgMTg0LAogICAgICAgICAgICAgIC02OSwKICAgICAgICAgICAgICAtMTcwLAogICAgICAgICAgICAgIC0yNCwKICAgICAgICAgICAgICAxODUKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIC0xNjQsCiAgICAgICAgICAgICAgMTg2LAogICAgICAgICAgICAgIC00MSwKICAgICAgICAgICAgICAtMTEzLAogICAgICAgICAgICAgIDE4NywKICAgICAgICAgICAgICAtMTgzLAogICAgICAgICAgICAgIDE4OCwKICAgICAgICAgICAgICAtMTc5CiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIk11bHRpUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE4OQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE5MAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIDE5MSwKICAgICAgICAgICAgICAgIC0zMywKICAgICAgICAgICAgICAgIC0xMDEKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAxOTIsCiAgICAgICAgICAgICAgLTU5LAogICAgICAgICAgICAgIC0xNTIKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiUG9seWdvbiIsCiAgICAgICAgICAiYXJjcyI6IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgIC0xMzEsCiAgICAgICAgICAgICAgLTYzLAogICAgICAgICAgICAgIC0xNTksCiAgICAgICAgICAgICAgMTkzLAogICAgICAgICAgICAgIC0xNDEsCiAgICAgICAgICAgICAgLTE1NgogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgMTk0LAogICAgICAgICAgICAgIC0xNTMsCiAgICAgICAgICAgICAgLTU3LAogICAgICAgICAgICAgIC00LAogICAgICAgICAgICAgIC0xNDAsCiAgICAgICAgICAgICAgLTcsCiAgICAgICAgICAgICAgLTEzNSwKICAgICAgICAgICAgICAtODUsCiAgICAgICAgICAgICAgLTEzNCwKICAgICAgICAgICAgICAtODkKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTk1CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTk2CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTk3CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTk4CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMTk5CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgLTEwLAogICAgICAgICAgICAgICAgLTk3LAogICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgLTE2NywKICAgICAgICAgICAgICAgIC0xODQKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAyMDEsCiAgICAgICAgICAgICAgLTMwLAogICAgICAgICAgICAgIC0xNywKICAgICAgICAgICAgICAtMTcxLAogICAgICAgICAgICAgIC02NwogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJNdWx0aVBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAtMTA5LAogICAgICAgICAgICAgICAgMjAyCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgLTEwNiwKICAgICAgICAgICAgICAgIDIwMwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIC0xMTEsCiAgICAgICAgICAgICAgICAtMzcsCiAgICAgICAgICAgICAgICAyMDQsCiAgICAgICAgICAgICAgICAtMTUwLAogICAgICAgICAgICAgICAgMjA1LAogICAgICAgICAgICAgICAgLTE1NCwKICAgICAgICAgICAgICAgIC0xOTUsCiAgICAgICAgICAgICAgICAtODgsCiAgICAgICAgICAgICAgICAyMDYKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAtMTAzLAogICAgICAgICAgICAgIC0xNzcsCiAgICAgICAgICAgICAgMjA3LAogICAgICAgICAgICAgIC0xNjEKICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjA4CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjA5CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjEwCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjExCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjEyCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjEzCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjE0CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjE1CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgLTE4NSwKICAgICAgICAgICAgICAgIDIxNiwKICAgICAgICAgICAgICAgIC03MAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgXQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjE3CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjE4CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjE5CiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgMjIwCiAgICAgICAgICAgICAgXQogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgLTEyNiwKICAgICAgICAgICAgICAgIDIyMSwKICAgICAgICAgICAgICAgIC03NywKICAgICAgICAgICAgICAgIC02NSwKICAgICAgICAgICAgICAgIC0xMzAsCiAgICAgICAgICAgICAgICAyMjIKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAyMjMKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAyMjQKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIlBvbHlnb24iLAogICAgICAgICAgImFyY3MiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAtMTEyLAogICAgICAgICAgICAgIC0yMDcsCiAgICAgICAgICAgICAgLTg3LAogICAgICAgICAgICAgIC0xODEsCiAgICAgICAgICAgICAgLTE4OAogICAgICAgICAgICBdCiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJQb2x5Z29uIiwKICAgICAgICAgICJhcmNzIjogWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgLTE1OCwKICAgICAgICAgICAgICAtMzEsCiAgICAgICAgICAgICAgLTIwMiwKICAgICAgICAgICAgICAtNjYsCiAgICAgICAgICAgICAgLTE0MiwKICAgICAgICAgICAgICAtMTk0CiAgICAgICAgICAgIF0KICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIF0KICAgIH0KICB9LAogICJhcmNzIjogWwogICAgWwogICAgICBbCiAgICAgICAgNjM0NywKICAgICAgICAyMzAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTgKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY0NDcsCiAgICAgICAgMjM1MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICAtNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NiwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC02MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjI5MCwKICAgICAgICAyMzQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA4MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDc1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA3NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDc1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA3NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDI2CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2MzI5LAogICAgICAgIDQyMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICCM3O9WllkLANonAADaJwAAaPcoH9LFCAAnrR4TCABFACfM7khAAEAGlPzAqAdgwKgHNh/1lSqTqDxixukUMYAQAZi3pQAAAQEICgBNploAo19cICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIC0xCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2NzcxLAogICAgICAgIDQyMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC01MgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC01MQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC01MgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC01MQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC01MQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDI0LAogICAgICAgIC0xMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC02OQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC01NwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0xMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTcyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtNDcKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY4NzcsCiAgICAgICAgMjYwMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTU1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC01NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTU2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC01NywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTU2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC01NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgLTQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjA2NCwKICAgICAgICA0NjE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0zNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC00NAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDU5NjIsCiAgICAgICAgNDIxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0zMgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtNzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTEwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1ODEzLAogICAgICAgIDM0MTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zNCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDUzMTMsCiAgICAgICAgMzQxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAxOQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNTIzNiwKICAgICAgICAzNjY3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA1NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgNTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA1NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgNTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA1NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNTYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDUyMTMsCiAgICAgICAgNDgxNgogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC00MwogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjksCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMjcxMywKICAgICAgICA1MDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE0MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE0MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE0MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE0MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE0MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNDMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDI3MTMsCiAgICAgICAgMjczMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYxLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtODMsCiAgICAgICAgNjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC04MiwKICAgICAgICA2MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgyLAogICAgICAgIDU5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtODIsCiAgICAgICAgNjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC04MiwKICAgICAgICA1OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgyLAogICAgICAgIDYwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtODIsCiAgICAgICAgNjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC04MywKICAgICAgICA1OQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgNjEKICAgICAgXQqM3O9W1lkLAOUJAADlCQAAaPcoH9LFCAAnrR4TCABFAAnX7k9AAEAGsurAqAdgwKgHNh/1lSqTqGP6xukUMYAYAZiZsAAAAQEICgBNploAo19cICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAxNzMwLAogICAgICAgIDMyOTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA2NQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0OAogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgNjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOSwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI2LAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjcsCiAgICAgICAgODMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAzNAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMTc0OSwKICAgICAgICA0MjA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgNDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTczCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDE1OAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMTg0OCwKICAgICAgICA1MDE5CiAgICAgIF0sCozc71ZEWwsA2icAANonAABo9ygf0sUIACetHhMIAEUAJ8zuUUAAQAaU88CoB2DAqAc2H/WVKpOobZ3G6RQxgBABmLelAAABAQgKAE2mWgCjX1wNCjdGRTgNCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTQsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMTEwMiwKICAgICAgICAzMzM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICAtNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTkKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDkxMywKICAgICAgICAzNDk0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAxMTAyLAogICAgICAgIDM1NjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0xMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODA4LAogICAgICAgIDM3NzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDM5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMjIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc2MywKICAgICAgICAzODE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMTQKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDgzNiwKICAgICAgICAzODQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNiwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDUKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDgzLAogICAgICAgIDcwMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDgxNiwKICAgICAgICA3MDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NQogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgLTY2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MSwKICAgICAgICAtNjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQxLAogICAgICAgIC02NgogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgLTY2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MSwKICAgICAgICAtNjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQwLAogICAgICAgIC02NgogICAgICBdLAogICAgICBbCiAgICAgICAgNDEsCiAgICAgICAgLTY2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MCwKICAgICAgICAtNjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMyLAogICAgICAgIC01NQogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgLTU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMiwKICAgICAgICAtNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDMxLAogICAgICAgIC01NgogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgLTU1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMiwKICAgICAgICAtNTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMyLAogICAgICAgIC01NQogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgLTU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NCwKICAgICAgICAtODAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQzLAogICAgICAgIC04MAogICAgICBdLAogICAgICBbCiAgICAgICAgNDQsCiAgICAgICAgLTc5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NCwKICAgICAgICAtODAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ0LAogICAgICAgIC04MAogICAgICBdLAogICAgICBbCiAgICAgICAgNDQsCiAgICAgICAgLTgwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NCwKICAgICAgICAtODAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ3LAogICAgICAgIC04NQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMTczMCwKICAgICAgICAzMjkyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01MCwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ5LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTAsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00OSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUwLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTAsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00OSwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUwLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgNTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgNjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICA3OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTU2LAogICAgICAgIDk4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjgsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICA2NAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTU0LAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjYsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMywKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTM0LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICA1NQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA1MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjYsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAyOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzQsCiAgICAgICAgOTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zNywKICAgICAgICA3MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00OSwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDg3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA2NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDY4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA0OAogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIzLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTQ2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTI3CiAgICAgIIzc71Z5WwsAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS3/0AAQAby3cCoBzbAqAdglSof9cbpFDGTqJU1gBAEqyJqAAABAQgKAKNfXwBNplmM3O9WllsLAHo+AAB6PgAAaPcoH9LFCAAnrR4TCABFAD5s7lhAAEAGfkzAqAdgwKgHNh/1lSqTqJU1xukUMYAQAZjORQAAAQEICgBNploAo19fXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDUzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDU4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjksCiAgICAgICAgMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICA1NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ4LAogICAgICAgIDkzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA4MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDEwNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA1OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIDk1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzcsCiAgICAgICAgNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0OAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA0MwogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA0NgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDU5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA3NQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgOTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDY2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzkzMCwKICAgICAgICA2MjI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzkzMiwKICAgICAgICA1MDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDIsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzc2MSwKICAgICAgICA1MDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTY1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjUsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTY2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTY1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjUsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTY1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjUsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTY2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjYsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMjcxMywKICAgICAgICA1MDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMjcxMywKICAgICAgICA2NjI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NSwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAzNTg0LAogICAgICAgIDY2MjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDQzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ0LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDkxNjUsCiAgICAgICAgNzAzNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0zMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0yMwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgOTE1OCwKICAgICAgICA2NzYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTI1LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzMsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTY0LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI3LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcwLAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTEyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4ODQ4LAogICAgICAgIDY2MjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMzgKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg4NzQsCiAgICAgICAgNzA1MwogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTQKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDgyNTksCiAgICAgICAgNTc3OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDgyNDMsCiAgICAgICAgNTgwMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAtMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDMzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NTM4LAogICAgICAgIDYxNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIC00OQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIC01MQogICAgICBdLAogICAgICBbCiAgICAgICAgMjIsCiAgICAgICAgLTU5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMjAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg2MDQsCiAgICAgICAgNTYwMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDY0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA2NAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA2NAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDY0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA2NAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODQ3NSwKICAgICAgICA2MTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtMTEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc0MzYsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTQKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc0NzMsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc1MTQsCiAgICAgICAgNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC02CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3NTY0LAogICAgICAgIDcwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNywKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC01CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3NjAxLAogICAgICAgIDEwNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtNwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzYzNCwKICAgICAgICAxNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTQKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc2NzksCiAgICAgICAgMjQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzUsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICA0MAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIC04MgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzM5MiwKICAgICAgICA3NzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzM4NCwKICAgICAgICA4MTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC00NQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzcxMiwKICAgICAgICAxMTAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDY5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgMTA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgODMKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC00NwogICAgICBdLAogICAgICBbCiAgICAgICAgMjksCiAgICAgICAgLTE2MQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjg5NSwKICAgICAgICAyMDU0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI5LAogICAgICAgIC0zNgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzQ4NCwKICAgICAgICAyNDkzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTE0OQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIC0xNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDI2LAogICAgICAgIC0xMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDM1LAogICAgICAgIC0xNjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDU4LAogICAgICAgIC0xOTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC00NAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTY4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIDk4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA1OAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICA4MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtNDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC03MgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgLTM5MgogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0zNgogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTk2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTE3NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTEyMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC03NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgIIzc71a6WwsAej4AAHo+AABo9ygf0sUIACetHhMIAEUAPmzuY0AAQAZ+QcCoB2DAqAc2H/WVKpOo023G6RQxgBABmM5FAAABAQgKAE2mWgCjX18gMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjMsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICA4NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIDYwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA0MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM1LAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICA2NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAzNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMSwKICAgICAgICAxMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICA2MgogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAxNTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDEwMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjEsCiAgICAgICAgNjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05MCwKICAgICAgICAxNjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC03MCwKICAgICAgICAxOTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MSwKICAgICAgICA3MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ2LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ0LAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI4LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjYsCiAgICAgICAgNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOSwKICAgICAgICA1OQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTYsCiAgICAgICAgNDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00OCwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgMzcsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTAsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDEsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDI0LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAyOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzQsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtNwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjg3NywKICAgICAgICAyNjAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTY2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNywKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMjcsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjcsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgDQo3RkU4DQogICAzNwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgMjksCiAgICAgICAgLTMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc0OTksCiAgICAgICAgMjU4OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTk4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA5CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3NTk0LAogICAgICAgIDMwMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0zOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjgKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY3NzEsCiAgICAgICAgNDIxMgogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDU2LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NiwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgNTcsCiAgICAgICAgLTEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY5OTYsCiAgICAgICAgNDIwNwogICAgICBdLAogICAgICBbCiAgICAgICAgNTIsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgNTIsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgNTMsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgNTIsCiAgICAgICAgMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzIwNSwKICAgICAgICA0MjEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgLTQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICAtMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgMzksCiAgICAgICAgLTE0MAogICAgICBdLAogICAgICBbCiAgICAgICAgNDEsCiAgICAgICAgLTcyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNSwKICAgICAgICAtNTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTU0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC04MwogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC03MQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNSwKICAgICAgICAtMzMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDU5MDAsCiAgICAgICAgNzIzOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI2LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTI5LAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjEsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0zNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtNwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNTc2MywKICAgICAgICA2Mzc4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ0LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQzLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ0LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQzLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDQsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDMsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDQsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00NCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQzLAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDUwMTQsCiAgICAgICAgNjQ2OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAyOAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICA1MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAzNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNDg5MCwKICAgICAgICA3MjM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAzMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIDIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDQ4OTUsCiAgICAgICAgNzYzNgogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTcsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNTc5NywKICAgICAgICA3NjM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgjNzvVslfCwB6PgAAej4AAGj3KB/SxQgAJ60eEwgARQA+bO5uQABABn42wKgHYMCoBzYf9ZUqk6kRpcbpFDGAEAGYzkUAAAEBCAoATaZbAKNfXyAgMTEsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC00MgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgMzAsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0zCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAyMzY2LAogICAgICAgIDgwMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAyMzY2LAogICAgICAgIDcwMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAxODQ4LAogICAgICAgIDcwMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTY0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTY1LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjQsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMTMzMywKICAgICAgICA3MDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDkwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDkwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA5MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA5MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA5MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA4OQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA5MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA5OQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICA2MQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDU3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOSwKICAgICAgICA3OAogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgNTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIDc0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMywKICAgICAgICAxMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDc0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAzMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjYsCiAgICAgICAgMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTgKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDEzNTMsCiAgICAgICAgODY0MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDY0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDY1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDY0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDY1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDY0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDY1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDY0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA2NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA2NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA2NAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA2NAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMTMyOSwKICAgICAgICA5ODQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3MywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MiwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAxNTAwLAogICAgICAgIDk4NDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTk5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTk5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIC00MAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjMsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMzEsCiAgICAgICAgLTU5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTM5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDUsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNywKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgMzEsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDI0LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTExCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2MzkyLAogICAgICAgIDcyMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC01MgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTU3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY0NDIsCiAgICAgICAgNjkyMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTEyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTExNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC00MAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTM5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC01NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0zNQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjM1MiwKICAgICAgICA1MzM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzQsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00NSwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMwLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTIwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2MTU5LAogICAgICAgIDUwMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTM1LAogICAgICAgIDU1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDU5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAxMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICA3OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDgzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTAsCiAgICAgICAgODYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOSwKICAgICAgICA2MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDQ2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICA2MwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgNjIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDU5MDAsCiAgICAgICAgNzIzOAogICAgICBdLAogICAgICBbCiAgICAgICAgODAsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDc4LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3OCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNzgsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDc4LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3OCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjIsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjkxNCwKICAgICAgICA2OTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTEzMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEzMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEzMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMzMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY5MTAsCiAgICAgICAgNTg2MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTQKICAgICCM3O9WpWoLANwCAADcAgAACAAnrR4TaPcoH9LFCABFAALOcIBAAEAGN8PAqAc2wKgHYJUrH/X2anXiZz+NPYAYBaSmRAAAAQEICgCjX2AATaZLR0VUIC9vbm9zL3VpL2RhdGEvaW1nL25hdi1tZW51LnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czg7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjNzvVqVqCwBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANBj4QABABpHlwKgHYMCoBzYf9ZUrZz+NPfZqeHyAEAIPkA0AAAEBCAoATaZbAKNfYIzc71alagsA3QIAAN0CAAAIACetHhNo9ygf0sUIAEUAAs8uFEAAQAZ6LsCoBzbAqAdglScf9duSpsM5V2NzgBgPM1F5AAABAQgKAKNfYABNpkpHRVQgL29ub3MvdWkvZGF0YS9pbWcvb25vcy1sb2dvLnBuZyBIVFRQLzEuMQ0KSG9zdDogMTkyLjE2OC43Ljk2OjgxODENCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MA0KQWNjZXB0OiBpbWFnZS93ZWJwLGltYWdlLyosKi8qO3E9MC44DQpJZi1Ob25lLU1hdGNoOiAxNDU4NTU5Njc2Nzg3DQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dSBDaHJvbWl1bS80OC4wLjI1NjQuMTE2IENocm9tZS80OC4wLjI1NjQuMTE2IFNhZmFyaS81MzcuMzYNClJlZmVyZXI6IGh0dHA6Ly8xOTIuMTY4LjcuOTY6ODE4MS9vbm9zL3VpL2luZGV4Lmh0bWwNCkFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZSwgc2RjaA0KQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOA0KQ29va2llOiB0b3BvX3pvb209dHglM0EwJTJDdHklM0EwJTJDc2MlM0ExOyBKU0VTU0lPTklEPTFqM205ZXJrcHM4emFqNXRpeTBkenA3czg7IHRvcG9fcHJlZnM9c3VtbWFyeSUzQTElMkNpbnN0cyUzQTElMkNkZXRhaWwlM0ExJTJDaG9zdHMlM0EwJTJDb2ZmZGV2JTNBMSUyQ3BvcnRobCUzQTElMkNiZyUzQTAlMkNzcHIlM0EwJTJDdG9vbGJhciUzQTANCg0KjNzvVvZrCwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLgAQABABvLcwKgHNsCoB2CVKh/1xukUMZOpT92AEASrZ78AAAEBCAoAo19gAE2mWozc71YTbAsAIkQAACJEAABo9ygf0sUIACetHhMIAEUARBTueUAAQAZ4g8CoB2DAqAc2H/WVKpOpT93G6RQxgBABmNPtAAABAQgKAE2mWwCjX2AgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zNCwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI4LAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtNQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjQ0MiwKICAgICAgICA2OTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNiwKICAgICAgICAzNwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjU1NiwKICAgICAgICA2OTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNTIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMjMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDUyMTMsCiAgICAgICAgNTAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAzOTMwLAogICAgICAgIDYyMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDMxLAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDUwODYsCiAgICAgICAgNjIyNgogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0zMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDI3LAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICANCjdGRTgNCiAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDYxMDEsCiAgICAgICAgNDgxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0xCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2MDg5LAogICAgICAgIDQ4MTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTEwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3MjkyLAogICAgICAgIDU2MDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC01OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgLTQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICAtNTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDMwLAogICAgICAgIC00NwogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgLTEyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3NDA0LAogICAgICAgIDUyMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC02NSwKICAgICAgICAtOTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMCwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOSwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICAtMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC00NiwKICAgICAgICAtMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMTkKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDcxMTAsCiAgICAgICAgNDg1OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjEsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYwLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjAsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYwLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjAsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTU4LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTgsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01NywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTU4LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC00MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzQsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjEwOCwKICAgICAgICA0ODE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAzMgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjkxMCwKICAgICAgICA1ODYwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDI5LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjcsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgMzUsCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDU3MDIsCiAgICAgICAgMTk5NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOCwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTE1CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2MjA1LAogICAgICAgIDIwODIKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xNwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjIxNiwKICAgICAgICAyMTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC01MAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjE0NywKICAgICAgICAyMjMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjA5NiwKICAgICAgICAyMjc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjMsCiAgICAgICAgNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgLTQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTU1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgLTI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAtMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ5LAogICAgICAgIDMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICCM3O9WSWwLACJEAAAiRAAAaPcoH9LFCAAnrR4TCABFAEQU7oVAAEAGeHfAqAdgwKgHNh/1lSqTqZO9xukUMYAQAZjT7QAAAQEICgBNplsAo19gICAgICAgLTE2LAogICAgICAgIC00OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDQsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01MCwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICA0MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICA1NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTI2LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC03MSwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjgsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOSwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUzLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNTM1NSwKICAgICAgICAyMTg5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICA0MAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICA0MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICA0OQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1MQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNTgxMywKICAgICAgICAzNDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC00MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC00NQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0zCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA5NDgxLAogICAgICAgIDY3MzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC00MAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMTMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDkzODksCiAgICAgICAgNjc4MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ4LAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTE1CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA5MjYzLAogICAgICAgIDY5MTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4ODc0LAogICAgICAgIDcwNTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDM0CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4OTE0LAogICAgICAgIDczMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgOTA1MCwKICAgICAgICA3MzI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgLTIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDkzMzcsCiAgICAgICAgNzM4NAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMzEsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC01NAogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMywKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICA0MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMywKICAgICAgICAtNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTYxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC00MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MCwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMSwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ4LAogICAgICAgIC02NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0xNQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODU3MiwKICAgICAgICA1NDM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODU2NywKICAgICAgICA1NDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICA2OAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTMKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg2MDQsCiAgICAgICAgNTYwMwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC00NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTE2CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NTQ2LAogICAgICAgIDU0MzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI2LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTkKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg0OTcsCiAgICAgICAgNTQwMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjEsCiAgICAgICAgMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA0MwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAzNwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjYsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtODUKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgLTc1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzAsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICA0NAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDQ1CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4MjQzLAogICAgICAgIDU4MDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzEsCiAgICAgICAgMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDE1CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4MTM5LAogICAgICAgIDU5NjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgjNzvVt1vCwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLgBQABABvLbwKgHNsCoB2CVKh/1xukUMZOp152AEAQr4H0AAAEBCAoAo19gAE2mW4zc71b1bwsAIkQAACJEAABo9ygf0sUIACetHhMIAEUARBTukUAAQAZ4a8CoB2DAqAc2H/WVKpOp153G6RQxgBABmNPtAAABAQgKAE2mXACjX2AgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNywKICAgICAgICAtNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAtNjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc4MzUsCiAgICAgICAgNjExNAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgOTcxNiwKICAgICAgICA3OTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTE5CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA5NzkxLAogICAgICAgIDc5NzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xMwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgOTM1MCwKICAgICAgICA3NDYyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDkyODksCiAgICAgICAgODM1OAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAzNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIzLAogICAgICAgIDU0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNywKICAgICAgICA2MgogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIDY0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgDQo3RkU4DQogIDE3LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDMyLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDIyLAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC02NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTY1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC01MgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNiwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTM5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTM1LAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMwLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC00OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgLTcxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC00MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIC0zOAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNywKICAgICAgICAtNTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOCwKICAgICAgICAtNTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAtODYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTE2CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2NzEwLAogICAgICAgIDgyODAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMTIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY3ODMsCiAgICAgICAgODQ4MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtOQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzE0NiwKICAgICAgICA2OTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTU4LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTgsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01NywKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTU4LAogICAgICAgIC00CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2NTU2LAogICAgICAgIDY5MzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICA1NwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgNDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICA1MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICA2NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDkyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAzNgogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICA0NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0zNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDQ0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA0NwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgNDcsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTIxCiAgICAgIF0sCiCM3O9WJ3ALACozAAAqMwAAaPcoH9LFCAAnrR4TCABFADMc7p1AAEAGiVfAqAdgwKgHNh/1lSqTqht9xukUMYAYAZjC9QAAAQEICgBNplwAo19gICAgICBbCiAgICAgICAgMywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgNDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDI0LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtODkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIC0xNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTgwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0xMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC00NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTkKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY5NTUsCiAgICAgICAgODU3MAogICAgICBdLAogICAgICBbCiAgICAgICAgMjMsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA3CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3MTM4LAogICAgICAgIDg2NDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzAzMSwKICAgICAgICA4NzQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC02CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3MDI5LAogICAgICAgIDg3ODgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xOQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjQyNywKICAgICAgICA4MjgzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMywKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzUsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1OTQyLAogICAgICAgIDg4ODEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDMzLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgMjMsCiAgICAgICAgMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNSwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgMjksCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDQzLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgMjIsCiAgICAgICAgLTU4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMywKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDIyLAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOSwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI4LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMywKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMzAsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNjMsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDEKjNzvViB3CwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLgCQABABvLawKgHNsCoB2CVKh/1xukUMZOqTmWAEAWkaDoAAAEBCAoAo19hAE2mXIzc71ZpeQsAPB8AADwfAABo9ygf0sUIACetHhMIAEUAHy7upkAAQAadPMCoB2DAqAc2H/WVKpOqTmXG6RQxgBgBmK8HAAABAQgKAE2mXACjX2EgICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOSwKICAgICAgICA0NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIzLAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjcsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAtNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtNDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAtNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE5CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2MzIxLAogICAgICAgIDkxMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOSwKICAgICAgICA0NwogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zNSwKICAgICAgICAtNDUKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDYxOTQsCiAgICAgICAgOTQxOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2OCwKICAgICAgICA2MQogICAgICBdLAogICAgICBbCiAgICAgICAgMjksCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01MCwKICAgICAgICAtNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC00CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1NjQ4LAogICAgICAgIDg5NDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01OAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTU4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ3LAogICAgICAgIC00OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIzLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIyLAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAtNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0zOAogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNSwKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDIzLAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC01NgogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTE5CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA0ODk1LAogICAgICAgIDc2MzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgOTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI4LAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIDM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI2LA0KjNzvVtN5CwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLgDQABABvLZwKgHNsCoB2CVKh/1xukUMZOqbV+AEAYgSMQAAAEBCAoAo19hAE2mXIzc71azegsAwloAAMJaAABo9ygf0sUIACetHhMIAEUAWrTurEAAQAZhsMCoB2DAqAc2H/WVKpOqbV/G6RQxgBABmOqNAAABAQgKAE2mXACjX2E3RkU4DQoKICAgICAgICAzOAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA0MAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNDg3NywKICAgICAgICA4NjE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA0OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIDU4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA0OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDYwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDE0MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICA2OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgNDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAzNAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAxMjUKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDQ3NjEsCiAgICAgICAgOTg0NwogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA4NQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA2NwogICAgICBdLAogICAgICBbCiAgICAgICAgMzcsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC01NgogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIC01NgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgMzYsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDM1LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMjcsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI2LAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIyLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDI5LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgMjYsCiAgICAgICAgLTQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNiwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIzLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgMjIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjksCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDMxLAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjMsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgNTAsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQwLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIyLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDM0LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI5LAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM1LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTY5LAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQzLAogICAgICAgIC00MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTc1LAogICAgICAgIC0xMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC00NCwKICAgICAgICAtNjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC03MywKICAgICAgICAtOTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDYxMDgsCiAgICAgICAgNDgxNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDYwODksCiAgICAgICAgNDgxNgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTEyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1MjEzLAogICAgICAgIDQ4MTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNTEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDUwODYsCiAgICAgICAgNjIyNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxMwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjI2MiwKICAgICAgICAyMjg1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDI2LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjI5MCwKICAgICAgICAyMzQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTEsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjEsCiAgICAgICAgLTQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTEyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1OTYyLAogICAgICAgIDQyMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ2LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NywKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAzNTg2LAogICAgICAgIDg2MTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTk0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC05MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtOTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTkzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAzNTgxLAogICAgICAgIDgyNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM3LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDE1MDAsCiAgICAgICAgOTg0NwogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTYsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNzQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTUsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzU4MiwKICAgICAgICA5ODQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC03NgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTc3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC03NwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTc3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC03NwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODM0MywKICAgICAgICA0MDczCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTE2CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4MzUwLAogICAgICAgIDQwNjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICA1MQogICAgICBdLAogICAgICBbCiAgICAgICAgMzEsCiAgICAgICAgNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAtNTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAtNjUKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg0NzYsCiAgICAgICAgNDI4OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg1MTcsCiAgICAgICAgNDMwOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjcsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgODEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDY2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC00NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTY3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTcKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg1MDEsCiAgICAgICAgNDU1NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg0NTcsCiAgICAgICAgNDgzNgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NDYyLAogICAgICAgIDQ4MzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIC0xMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDM0LAogICAgICAgIC0xNDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI1LAogICAgICAgIDkzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgNjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAxMTIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc5OTQsCiAgICAgICAgMzc1OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI1LAogICAgICAgIDQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICA0NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDQ2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICA0NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDQ2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI1LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI3LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNywKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjgsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI3LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjcsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI4LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNywKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzIsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjgsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjgsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2OTk2LAogICAgICAgIDQyMDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgODYKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMywKICAgICAgICA0MAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDM3LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzOSwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDIzLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIDM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIDc0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDMwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3NDU3LAogICAgICAgIDQ4NjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDYzLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNjIsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYzLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgNjIsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYzLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNjMsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYyLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNjMsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYyLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNjMsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQzLAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg0NDQsCiAgICAgICAgNDgzNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTYyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDE5LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDcwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzMsCiAgICAgICAgLTU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NiwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjYsCiAgICAgICAgLTMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTM3LAogICAgICAgIDYwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgMjcsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1MCwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI3LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIC01NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTcxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC02OCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjcsCiAgICAgICAgLTE3CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA0ODc3LAogICAgICAgIDg2MTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDEsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDAsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzU4MiwKICAgICAgICA5ODQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3MywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3NCwKICAgICAgICAwCiAgIIzc71b/egsAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS4BEAAQAby2MCoBzbAqAdglSof9cbpFDGTqsffgBAHiuzZAAABAQgKAKNfYQBNplyM3O9WF3sLALIlAACyJQAAaPcoH9LFCAAnrR4TCABFACWk7rxAAEAGlrDAqAdgwKgHNh/1lSqTqsffxukUMYAYAZi1fQAAAQEICgBNplwAo19hICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDczLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDUzLAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDM1ODQsCiAgICAgICAgNjYyOQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDEwMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDM1ODIsCiAgICAgICAgNzQzNAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjAsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNjgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNTIsCiAgICAgICAgLTYwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMSwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDksCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgMzEsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNywKICAgICAgICAtMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIyLAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTUKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDkzNTAsCiAgICAgICAgNzQ2MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMjYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDkwNTAsCiAgICAgICAgNzMyNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgODAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA3NQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgNDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICA1NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgOAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgOTIxNCwKICAgICAgICA4MjQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICA3OAogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDIyLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAxMwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODc2MSwKICAgICAgICA2MDk3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTYxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMjYsCiAgICAgICAgNzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0yNgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODU5OCwKICAgICAgICA2MjE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgMzAsCiAgICAgICAgMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MiwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgNDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAzOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDEzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NjYzLAogICAgICAgIDY3NzIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTE4CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4ODAwLAogICAgICAgIDY2MjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0zMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC02NAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgMzQsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTYxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtNTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgNjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtODYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgLTgzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDM5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDM5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzAsCiAgICAgICAgNjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgMzQsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMjEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDM3NjEsCiAgICAgICAgNDgxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTExNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTExMwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTExMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTExNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTExMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTExNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTExMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTExMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM5LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtNzMKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC0yMQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzE2NCwKICAgICAgICAyOTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM4LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTQ2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC00NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC00NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02MSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgDQqM3O9WS3sLAEIAAABCAAAACAAnrR4TaPcoH9LFCABFAAA0uAVAAEAG8tfAqAc2wKgHYJUqH/XG6RQxk6rtT4AQCCDG0wAAAQEICgCjX2EATaZcjNzvVuqBCwAKdwAACncAAGj3KB/SxQgAJ60eEwgARQB2/O7DQABABkVRwKgHYMCoBzYf9ZUqk6rtT8bpFDGAEAGYBtYAAAEBCAoATaZdAKNfYTdGRTgNCjAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDM3NjEsCiAgICAgICAgNTAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDgxNiwKICAgICAgICA3MDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2NSwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAxODQ4LAogICAgICAgIDcwMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTYzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC02MwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODc1MiwKICAgICAgICA2NDM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAzOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC04CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA5MDQyLAogICAgICAgIDY2MjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC03NSwKICAgICAgICAtNjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNzQsCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYxLAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTI1LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDM1LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDM1LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMCwKICAgICAgICA0MAogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAtNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAtMjEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc5MzAsCiAgICAgICAgNzQ0MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtOAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODM5MiwKICAgICAgICA3ODMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTEyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NDE4LAogICAgICAgIDc5NDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTcKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDg4OTYsCiAgICAgICAgODI0MQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0zMgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC03MgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTU1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC02NgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtNTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTI0CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4ODQ4LAogICAgICAgIDY2MjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIC0zNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA1NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTU2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0yCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NjYzLAogICAgICAgIDY3NzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1NAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3Nzg2LAogICAgICAgIDcxNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMywKICAgICAgICAzNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICAxOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA3MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MywKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgNDAsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ5LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDU4LAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgMjMsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNiwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNSwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3MCwKICAgICAgICA4NgogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgNjcsCiAgICAgICAgMTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzOSwKICAgICAgICA1MgogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDI0LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQxLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDcyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDcyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQyLAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc2NTUsCiAgICAgICAgNjQ4NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTcyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgLTExMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC03MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgLTM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzAsCiAgICAgICAgLTQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIC00OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMCwKICAgICAgICAxMwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzE0NiwKICAgICAgICA2OTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMCwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC00NywKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgMjcsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgMjYsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMywKICAgICAgICA1MAogICAgICBdLAogICAgICBbCiAgICAgICAgMzgsCiAgICAgICAgMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIDYyLAogICAgICAgIDUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MSwKICAgICAgICAzOQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzY1NSwKICAgICAgICA3MDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC00MwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC00MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC00MgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC00MwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNTIzNiwKICAgICAgICAzNjY3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzksCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAzNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM0LAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjEsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjksCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDQ4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzIsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMjU4LAogICAgICAgIDg3MDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIC05MgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDYyLAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNSwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgMzgsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ1LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDU3LAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2MywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgMzQsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDM4LAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4OCwKICAgICAgICAzOAogICAgICBdLAogICAgICBbCiAgICAgICAgNDMsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgMjIsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0NiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MiwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4MywKICAgICAgICA3MDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgNDkKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDc0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICA4MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICA1NwogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA1MAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMTMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDE0NwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA1MwogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMjUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDEyMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0MiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNiwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgNAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODU5OCwKICAgICAgICA2MjE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjYsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtNwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNzgzNSwKICAgICAgICA2MTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIzLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgNDYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDc2NTUsCiAgICAgICAgNzAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE0LAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDU0LAogICAgICAgIDUyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA5MjQxLAogICAgICAgIDY4MjQKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTIzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA5MjYyLAogICAgICAgIDY4MjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC02NgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgOTI2MywKICAgICAgICA2OTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtNzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MiwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAyCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3OTk0LAogICAgICAgIDM3NTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDUsCiAgICAgICAgLTYwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgLTEwMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC02NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTM3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjEsCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDQ1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xNgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzU4MiwKICAgICAgICA3NDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMTAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIIzc71ZQggsAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS4BkAAQAby1sCoBzbAqAdglSof9cbpFDGTq2QXgBAJx05jAAABAQgKAKNfYQBNpl2M3O9WUIILAGoJAABqCQAAaPcoH9LFCAAnrR4TCABFAAlc7thAAEAGstzAqAdgwKgHNh/1lSqTq2QXxukUMYAYAZiZNQAAAQEICgBNpl0Ao19hMTAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEwMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMDEKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDcxMTAsCiAgICAgICAgNDg1OAogICAgICBdLAogICAgICBbCiAgICAgICAgMzksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgODQsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDU5LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0OSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOSwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNywKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMjQsCiAgICAgICAgLTIKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDQ3NzAsCiAgICAgICAgNjUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICA4NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDE5OAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTE1OQogICAgICBdLAogICAgICBbCiAgICAgICAgMjYsCiAgICAgICAgLTIwMgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNTcKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDQ3MzksCiAgICAgICAgMTExMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICA3OAogICAgICBdLAogICAgICBbCiAgICAgICAgMjksCiAgICAgICAgMTA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMzLAogICAgICAgIC0xMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAtOTcKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDQ3OTgsCiAgICAgICAgMTM1MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIDQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTQ2CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA0ODQxLAogICAgICAgIDE0NTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjgsCiAgICAgICAgNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjMsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgLTUwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1MTQwLAogICAgICAgIDE4NTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzOCwKICAgICAgICA2MgogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICANCozc71YxhAsAQgAAAEIAAAAIACetHhNo9ygf0sUIAEUAADS4B0AAQAby1cCoBzbAqAdglSof9cbpFDGTq20/gBAJ+0UHAAABAQgKAKNfYQBNpl2M3O9Wy4YLAAp3AAAKdwAAaPcoH9LFCAAnrR4TCABFAHb87tpAAEAGRTrAqAdgwKgHNh/1lSqTq20/xukUMYAQAZgG1gAAAQEICgBNpl0Ao19hN0ZFOA0KIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzAsCiAgICAgICAgLTQzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1MzU1LAogICAgICAgIDIxODkKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAtNjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC0zOAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zNywKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgyLAogICAgICAgIC03NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIC00MAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgMzksCiAgICAgICAgNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjIsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAzOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtNjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIC0yOAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICAtNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0zNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIC00NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIC0yNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ2LAogICAgICAgIC02MgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI5LAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI4LAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjcsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNywKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNCwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgLTg5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC00MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC00MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC00MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE0LAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIxLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgLTY3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTEwMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjcsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTY5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzNiwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC02MAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTgzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0zNgogICAgICBdLAogICAgICBbCiAgICAgICAgMzMsCiAgICAgICAgLTEzMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAtOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAzOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTM3LAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDksCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMzLAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOCwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIDI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICA0NwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgNzkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICA0OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIDYyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAyOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMzMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI3LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICA3MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIDUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNDAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICA0NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI2LAogICAgICAgIDgzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgNjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDM5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zMCwKICAgICAgICA1MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAyNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQ1LAogICAgICAgIDcwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgNDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEyLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQyLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE5LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTMsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTI0LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTQzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgLTgxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtNTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjksCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00MSwKICAgICAgICA1NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMzLAogICAgICAgIDM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjQsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAyNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDM4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIDQyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgNzEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMSwKICAgICAgICA1NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICA1OAogICAgICBdLAogICAgICBbCiAgICAgICAgLTI2LAogICAgICAgIDEyNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTE1LAogICAgICAgIDU1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMxLAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNDEsCiAgICAgICAgNzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC01MiwKICAgICAgICAxMDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zNiwKICAgICAgICA2MwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIyLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICA1NAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE2LAogICAgICAgIDM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAyMzY2LAogICAgICAgIDcwMzEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTUwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC01MAogICAgICBdLAogICAgICBbCiAgICAgICAgNDQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDQsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgNDMsCiAgICAgICAgMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODU0NiwKICAgICAgICA1NDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMzgsCiAgICAgICAgLTE1OQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgLTU5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgNTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDg5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICA1NQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDUzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NTcyLAogICAgICAgIDU0MzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICAtNjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICA2NwogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODI1OSwKICAgICAgICA1Nzc4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtNDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIC02NQogICAgICBdLAogICAgICBbCiAgICAgICAgNDUsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNiwKICAgICAgICAtMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNTIsCiAgICAgICAgMTAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTksCiAgICAgICAgNTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMywKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgLTU0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMzcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIzLAogICAgICAgIC01MgogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0xNwogICAgICBdLAogICAgICBbCiAgICAgICAgMzEsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTI2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMzAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNCwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zOCwKICAgICAgICA3OQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMiwKICAgICAgICAtNTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC01MywKICAgICAgICA0MAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQyLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDMzLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyOCwKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC01MQogICAgICBdLAogICAgICBbCiAgICAgICAgMjIsCiAgICAgICAgLTM0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTYsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDI2LAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgMjUsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0zOQogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtNDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTQzCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA4NDU3LAogICAgICAgIDQ4MzYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAxCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA3NDA0LAogICAgICAgIDUyMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOSwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMzcsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNywKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDMwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgMzgsCiAgICAgICAgOTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDEyLAogICAgICAgIDU0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAzNQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAyNwogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgNTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxOCwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAzNwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAyOAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMjIsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNSwKICAgICAgICA2NQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA0MQogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAzMAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgMjMsCiAgICAgICAgLTMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDI5LAogICAgICAgIC00MwogICAgICBdLAogICAgICBbCiAgICAgICAgMjAsCiAgICAgICAgLTI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDMzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICA0OAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgODg5NiwKICAgICAgICA4MjQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzMCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3MiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3MiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3MiwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3MiwKICAgICAgICAwCiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAzMjIsCiAgICAgICAgOTEyNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNDAxLAogICAgICAgIDkyMDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIC0yMAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzgzLAogICAgICAgIDkyODQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC01CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0zNgogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMzcwLAogICAgICAgIDk1MTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDksCiAgICAgICAgLTUyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAyOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMjEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIC0xNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgLTIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTE4CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAzMjcsCiAgICAgICAgOTYyMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAyMQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC05CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICAyOTQsCiAgICAgICAgOTY0OQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICA4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMTUKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDMzNCwKICAgICAgICA5NzE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xNiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDIwLAogICAgICAgIC0xNQogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgMjg4LAogICAgICAgIDk4NDcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDI1OCwKICAgICAgICA4NzA0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTgsCiAgICAgICAgMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMyLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTM2LAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTExLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjAsCiAgICAgICAgLTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgLTM2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDUxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xOSwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTgsCiAgICAgICAgNDcKICAgICAgXSwKICAgICAgWwogICAgICAgIDQ3LAogICAgICAgIDQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMjUsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTksCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDI5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICA0OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIwLAogICAgICAgIDc5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgMTAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTUsCiAgICAgICAgNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yOCwKICAgICAgICA0OQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMjgKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDcxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIDU1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAzOAogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDM2LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgNDQsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAtMTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDIxLAogICAgICAgIC0xMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTE4LAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNSwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTcsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA5LAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDE1LAogICAgICAgIDE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xOAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yMSwKICAgICAgICAtNTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQwLAogICAgICAgIC05NwogICAgICBdLAogICAgICBbCiAgICAgICAgLTEzLAogICAgICAgIC00NgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xMgogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTMsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTE4LAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTIsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDE3LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAyNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTksCiAgICAgICAgMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgNAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAtNDIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTE3LAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDE2LAogICAgICAgIC0zNAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtMjYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC00CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDQxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtMTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIC0yOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMCwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTgsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICA0NAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgNgogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDUzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDMxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAxNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDMyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAzMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIC02LAogICAgICAgIDIxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMzQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDEyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAxNgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTQsCiAgICAgICAgMzIKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNywKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgOAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDEzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQ2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAzNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIDI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTEsCiAgICAgICAgNTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDczLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDczLAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDc0LAogICAgICAgIDAKICAgICAgXSwKICAgICAgWwogICAgICAgIDE4LAogICAgICAgIDAKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDY1MzQsCiAgICAgICAgODMzNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC0xOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC05CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgLTMsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC03CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTYsCiAgICAgICAgLTM1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAyMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAyMwogICAgICBdLAogICAgICBbCiAgICAgICAgNywKICAgICAgICAxNAogICAgICBdLAogICAgICBbCiAgICAgICAgOSwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA4LAogICAgICAgIDE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICA3LAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC0xNAogICAgICBdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNjU1NiwKICAgICAgICA4MzgxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTEwLAogICAgICAgIDEKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIDkKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgMjQKICAgICAgXSwKICAgICAgWwogICAgICAgIDIsCiAgICAgICAgLTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMgogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE3CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1ODkwLAogICAgICAgIDg5NTcKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgMQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA1LAogICAgICAgIDEwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyMywKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTIsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTUsCiAgICAgICAgLTYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDU5MTgsCiAgICAgICAgOTAxMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIDYKICAgICAgXSwKICAgICAgWwogICAgICAgIDEzLAogICAgICAgIDgKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgMSwKICAgICAgICAtNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE0CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA2NDI3LAogICAgICAgIDgyODMKICAgICAgXSwKICAgICAgWwogICAgICAgIDAsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yNiwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0xNAogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTEKICAgjNzvVj6HCwBqCQAAagkAAGj3KB/SxQgAJ60eEwgARQAJXO7vQABABrLFwKgHYMCoBzYf9ZUqk6vkB8bpFDGAGAGYmTUAAAEBCAoATaZdAKNfYSAgIF0sCiAgICAgIFsKICAgICAgICAtMTcsCiAgICAgICAgLTQ3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOCwKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC01LAogICAgICAgIC0zMAogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgLTcKICAgICAgXSwKICAgICAgWwogICAgICAgIDcsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgOCwKICAgICAgICAxMwogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgMTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIDQwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAyMgogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0xCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMywKICAgICAgICAxMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTEsCiAgICAgICAgLTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDYsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAtMTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0yMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtOSwKICAgICAgICAtMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIC04LAogICAgICAgIC0zNwogICAgICBdLAogICAgICBbCiAgICAgICAgLTcsCiAgICAgICAgLTQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMiwKICAgICAgICAtMzgKICAgICAgXSwKICAgICAgWwogICAgICAgIDUsCiAgICAgICAgLTI1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMjIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMiwKICAgICAgICAtMjAKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMjcKICAgICAgXSwKICAgICAgWwogICAgICAgIC03LAogICAgICAgIC0zMwogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTI4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICAtMjMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTE2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC0yMwogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMywKICAgICAgICAtNTAKICAgICAgXSwKICAgICAgWwogICAgICAgIC00LAogICAgICAgIC0yNQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTE5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtMTkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xMCwKICAgICAgICAtMzkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0yMQogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC0zMgogICAgICBdLAogICAgICBbCiAgICAgICAgLTEsCiAgICAgICAgLTExCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMAogICAgICBdLAogICAgICBbCiAgICAgICAgLTIsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgNSwKICAgICAgICAtOQogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0yMAogICAgICBdLAogICAgICBbCiAgICAgICAgNiwKICAgICAgICAtMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMjkKICAgICAgXSwKICAgICAgWwogICAgICAgIC0xLAogICAgICAgIC01NQogICAgICBdLAogICAgICBbCiAgICAgICAgMCwKICAgICAgICAtMTkKICAgICAgDQqM3O9WIYgLAMoIAADKCAAAaPcoH9LFCAAnrR4TCABFAAi87vFAAEAGs2PAqAdgwKgHNh/1lSqTq+0vxukUMYAYAZiYlQAAAQEICgBNpl0Ao19hODgxDQpdCiAgICBdLAogICAgWwogICAgICBbCiAgICAgICAgNTY0OCwKICAgICAgICA4OTQ5CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA2LAogICAgICAgIC0xMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTQsCiAgICAgICAgLTE1CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMiwKICAgICAgICAtMQogICAgICBdLAogICAgICBbCiAgICAgICAgMTUsCiAgICAgICAgMwogICAgICBdLAogICAgICBbCiAgICAgICAgNTgsCiAgICAgICAgMjUKICAgICAgXSwKICAgICAgWwogICAgICAgIDI1LAogICAgICAgIDE4CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNCwKICAgICAgICAzMQogICAgICBdLAogICAgICBbCiAgICAgICAgMiwKICAgICAgICAxCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMCwKICAgICAgICAtNgogICAgICBdLAogICAgICBbCiAgICAgICAgMywKICAgICAgICAtMwogICAgICBdLAogICAgICBbCiAgICAgICAgMzIsCiAgICAgICAgMzUKICAgICAgXSwKICAgICAgWwogICAgICAgIDEwLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIDgsCiAgICAgICAgMAogICAgICBdLAogICAgICBbCiAgICAgICAgMTAsCiAgICAgICAgLTE0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNCwKICAgICAgICAtMTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC05LAogICAgICAgIC0yNAogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTIwCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC0xNgogICAgICBdLAogICAgICBbCiAgICAgICAgLTQsCiAgICAgICAgLTE3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMTAsCiAgICAgICAgLTI0CiAgICAgIF0sCiAgICAgIFsKICAgICAgICA0LAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyNiwKICAgICAgICAxNwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxLAogICAgICAgIDQKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgMgogICAgICBdLAogICAgICBbCiAgICAgICAgMjEsCiAgICAgICAgLTIzCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxNCwKICAgICAgICAtMTMKICAgICAgXSwKICAgICAgWwogICAgICAgIDExLAogICAgICAgIC02CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAxMSwKICAgICAgICA0CiAgICAgIF0KICAgIF0sCiAgICBbCiAgICAgIFsKICAgICAgICA1ODkwLAogICAgICAgIDkwMTUKICAgICAgXSwKICAgICAgWwogICAgICAgIC0zLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtNiwKICAgICAgICA3CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMSwKICAgICAgICA2CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAyLAogICAgICAgIDUKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgLTEKICAgICAgXSwKICAgICAgWwogICAgICAgIDQsCiAgICAgICAgLTgKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgLTYKICAgICAgXQogICAgXSwKICAgIFsKICAgICAgWwogICAgICAgIDU5MzksCiAgICAgICAgOTA1NQogICAgICBdLAogICAgICBbCiAgICAgICAgLTYsCiAgICAgICAgLTYKICAgICAgXSwKICAgICAgWwogICAgICAgIC0yLAogICAgICAgIDMKICAgICAgXSwKICAgICAgWwogICAgICAgIDEsCiAgICAgICAgMTIKICAgICAgXSwKICAgICAgWwogICAgICAgIDMsCiAgICAgICAgNwogICAgICBdLAogICAgICBbCiAgICAgICAgNCwKICAgICAgICAyCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAzLAogICAgICAgIC0zCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAwLAogICAgICAgIC04CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAtMywKICAgICAgICAtNwogICAgICBdCiAgICBdCiAgXSwKICAidHJhbnNmb3JtIjogewogICAgInNjYWxlIjogWwogICAgICAwLjAwNTc3Mjg3Mjg1NjYwMjM2NSwKICAgICAgMC4wMDI0ODI5ODA1NzA1MDAxNDY4CiAgICBdLAogICAgInRyYW5zbGF0ZSI6IFsKICAgICAgLTEyNC43MDk5Nzc3NDkxNTE1MywKICAgICAgMjQuNTQyMzQ5MzQwMDU2MjgzCiAgICBdCiAgfQp9Cg0KjNzvVu2ICwBCAAAAQgAAAAgAJ60eE2j3KB/SxQgARQAANLgIQABABvLUwKgHNsCoB2CVKh/1xukUMZOr9beAEAn7vI0AAAEBCAoAo19iAE2mXYzc71axkAsANRcAADUXAABo9ygf0sUIACetHhMIAEUAFyc4BUAAQAZb5cCoB2DAqAc2H/WVJzlXY3PbkqlegBgBtKcAAAABAQgKAE2mXgCjX2BIVFRQLzEuMSAyMDAgT0sNCkVUYWc6IDE0NTg1NjAwMTE3ODMNCkNvbnRlbnQtVHlwZTogaW1hZ2UvcG5nDQpUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZA0KU2VydmVyOiBKZXR0eSg4LjEuMTcudjIwMTUwNDE1KQ0KDQoxNjZEDQqJ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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJbc71bsuQMAdwAAAHcAAAABgMIAAAAQUXIOPcAAaUJCAwAAAwJ8gAAAGIIAjecAAw0/gAAQUXIOPcCAAwEAFAACAA8AAABAADEwNTE3MjBlM2RjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsNhd/UCg81Lg4IdirJt5iAAAAAIAAEFFyDj3AFJfc71b0aAAAQgAAAEIAAAD///////96AQAAAACIb8AB3sAEAgAAAQAAAAAAAAAAAAAAAQQAAAAAAABoAHQAaQBwAGwALQA3ADkANgAzADQAAACX3O9WAisCAEAAAABAAAAA////////ABiCrIHZiKoAAhABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7W1IZ5fc71ahTAIAZAAAAGQAAAABgMIAABU2aQchAwMAVv7+A4MhAQYZAQADAFMiIiIiAAAAAAAAAAAAAAD//////////wkwA1MRERERAAAAAAAABVk0BgOGIiIiIgAAAAAAAAVY3hIDhiIiIiIAAAEAAAAFTRjAl9zvVn5NAgDqBQAA6gUAAAGAwgAAFTZpByEDAwXc/v4DgxsBBhABAAMCIiIiIgAAAAkF2UAiIiIiAAABAQIBSYEBzAYGNmkHEQMDhATIyMgC5QIAANMDAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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HhMIAEUAADgwBEAAQAZ61cCoB2DAqAc2H/WVLv32k2cLoCqGgBgA7pARAAABAQgKAE2y9ACjaE6JAt6tmdzvVo3kCQBKAAAASgAAAAgAJ60eE2j3KB/SxQgARQAAPHkbQABABjG6wKgHNsCoB2CVLh/1C6Aqhv32k2uAGAEoN30AAAEBCAoAo2v5AE2y9IqCI+hl5v1FmdzvVprkCQBCAAAAQgAAAGj3KB/SxQgAJ60eEwgARQAANDAFQABABnrYwKgHYMCoBzYf9ZUu/faTawugKo6AEADukA0AAAEBCAoATbL0AKNr+Znc71awfgoAPAAAADwAAAAIACetHhM2yAcRERAIAEXAACwBCAAA/wYpYsCoB/HAqAdgxIsAswAABZQAAAAAYAIgAByyAAACBAW0AACZ3O9Wy34KADoAAAA6AAAANsgHEREQCAAnrR4TCABFAAAsAABAAEAGqirAqAdgwKgH8QCzxIvCBaTaAAAFlWASchCQwAAAAgQFtJnc71aliAoAPAAAADwAAAAIACetHhM2yAcRERAIAEXAACgCCAAA/wYoZsCoB/HAqAdgxIsAswAABZXCBaTbUBAiOMtFAAAAAAAAAACZ3O9Wz4kKAG8AAABvAAAACAAnrR4TNsgHEREQCABFwABhAwgAAP8GJy3AqAfxwKgHYMSLALMAAAWVwgWk21AYIjjbIwAA/////////////////////wA5AQQAZAC0bwEBARwCGgEEAAEAAQEEAAEAhQEEQAQARwIAQQQAAABkmdzvVuCJCgA2AAAANgAAADbIBxEREAgAJ60eEwgARQAAKBYkQABABpQKwKgHYMCoB/EAs8SLwgWk2wAABc5QEHIQkLwAAJnc71bzjQoASwAAAEsAAAA2yAcRERAIACetHhMIAEUAAD0WJUAAQAaT9MCoB2DAqAfxALPEi8IFpNsAAAXOUBhyEJDRAAD/////////////////////ABUDBgWZ3O9WaY4KADYAAAA2AAAANsgHEREQCAAnrR4TCABFAAAoFiZAAEAGlAjAqAdgwKgH8QCzxIvCBaTwAAAFzlAUchCQvAAA