1 line
8.1 KiB
Python
1 line
8.1 KiB
Python
IiIiCnN0YXRlX3JlYWRlci5weQpSQ09O7J2EIO2Gte2VtCDtjKnthqDrpqzsmKQg6rKM7J6EIOyDge2DnOulvCDsnb3slrTsmKTripQg66qo65OICiIiIgppbXBvcnQganNvbgpmcm9tIGZhY3RvcmlvX3Jjb24gaW1wb3J0IEZhY3RvcmlvUkNPTgoKCmNsYXNzIFN0YXRlUmVhZGVyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJjb246IEZhY3RvcmlvUkNPTik6CiAgICAgICAgc2VsZi5yY29uID0gcmNvbgoKICAgIGRlZiBnZXRfZnVsbF9zdGF0ZShzZWxmKSAtPiBkaWN0OgogICAgICAgICIiIuyghOyytCDqsozsnoQg7IOB7YOc66W8IO2VnCDrsojsl5Ag7IiY7KeRIiIiCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInBsYXllciI6ICAgIHNlbGYuZ2V0X3BsYXllcl9pbmZvKCksCiAgICAgICAgICAgICJpbnZlbnRvcnkiOiBzZWxmLmdldF9pbnZlbnRvcnkoKSwKICAgICAgICAgICAgInJlc291cmNlcyI6IHNlbGYuc2Nhbl9yZXNvdXJjZXMoKSwKICAgICAgICAgICAgImJ1aWxkaW5ncyI6IHNlbGYuZ2V0X2J1aWxkaW5ncygpLAogICAgICAgICAgICAidGVjaCI6ICAgICAgc2VsZi5nZXRfcmVzZWFyY2hfc3RhdHVzKCksCiAgICAgICAgfQoKICAgICMg4pSA4pSAIO2UjOugiOydtOyWtCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGRlZiBnZXRfcGxheWVyX2luZm8oc2VsZikgLT4gZGljdDoKICAgICAgICBsdWEgPSAiIiIKbG9jYWwgcCA9IGdhbWUucGxheWVyCnJjb24ucHJpbnQoZ2FtZS50YWJsZV90b19qc29uKHsKICB4ID0gbWF0aC5mbG9vcihwLnBvc2l0aW9uLngpLAogIHkgPSBtYXRoLmZsb29yKHAucG9zaXRpb24ueSksCiAgaGVhbHRoID0gcC5jaGFyYWN0ZXIgYW5kIHAuY2hhcmFjdGVyLmhlYWx0aCBvciAxMDAKfSkpCiIiIgogICAgICAgIHJhdyA9IHNlbGYucmNvbi5sdWEobHVhKQogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJhdykgaWYgcmF3IGVsc2Uge30KCiAgICAjIOKUgOKUgCDsnbjrsqTthqDrpqwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBkZWYgZ2V0X2ludmVudG9yeShzZWxmKSAtPiBkaWN0OgogICAgICAgIGx1YSA9ICIiIgpsb2NhbCBpbnYgPSBnYW1lLnBsYXllci5nZXRfbWFpbl9pbnZlbnRvcnkoKQpsb2NhbCByZXN1bHQgPSB7fQpsb2NhbCBjb250ZW50cyA9IGludi5nZXRfY29udGVudHMoKQpmb3IgbmFtZSwgY291bnQgaW4gcGFpcnMoY29udGVudHMpIGRvCiAgcmVzdWx0W25hbWVdID0gY291bnQKZW5kCnJjb24ucHJpbnQoZ2FtZS50YWJsZV90b19qc29uKHJlc3VsdCkpCiIiIgogICAgICAgIHJhdyA9IHNlbGYucmNvbi5sdWEobHVhKQogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJhdykgaWYgcmF3IGVsc2Uge30KCiAgICAjIOKUgOKUgCDsnpDsm5Ag7Yyo7LmYIOyKpOy6lCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGRlZiBzY2FuX3Jlc291cmNlcyhzZWxmLCByYWRpdXM6IGludCA9IDIwMCkgLT4gZGljdDoKICAgICAgICAiIiLtlIzroIjsnbTslrQg7KO867OAIOyekOybkCDtjKjsuZgg7JyE7LmYIO2DkOyDiSIiIgogICAgICAgIGx1YSA9IGYiIiIKbG9jYWwgcCA9IGdhbWUucGxheWVyCmxvY2FsIHN1cmZhY2UgPSBwLnN1cmZhY2UKbG9jYWwgY2VudGVyID0gcC5wb3NpdGlvbgpsb2NhbCByZXNvdXJjZXMgPSB7e319Cgpsb2NhbCBvcmVfdHlwZXMgPSB7eyJpcm9uLW9yZSIsICJjb3BwZXItb3JlIiwgImNvYWwiLCAic3RvbmUiLCAidXJhbml1bS1vcmUifX0KZm9yIF8sIG9yZSBpbiBpcGFpcnMob3JlX3R5cGVzKSBkbwogIGxvY2FsIGVudGl0aWVzID0gc3VyZmFjZS5maW5kX2VudGl0aWVzX2ZpbHRlcmVke3sKICAgIGFyZWEgPSB7ewogICAgICB7e2NlbnRlci54IC0ge3JhZGl1c30sIGNlbnRlci55IC0ge3JhZGl1c319fSwKICAgICAge3tjZW50ZXIueCArIHtyYWRpdXN9LCBjZW50ZXIueSArIHtyYWRpdXN9fX0KICAgIH19LAogICAgbmFtZSA9IG9yZQogIH19CiAgaWYgI2VudGl0aWVzID4gMCB0aGVuCiAgICAtLSDtjKjsuZgg7KSR7Ius7KCQIOqzhOyCsAogICAgbG9jYWwgc3gsIHN5ID0gMCwgMAogICAgZm9yIF8sIGUgaW4gaXBhaXJzKGVudGl0aWVzKSBkbwogICAgICBzeCA9IHN4ICsgZS5wb3NpdGlvbi54CiAgICAgIHN5ID0gc3kgKyBlLnBvc2l0aW9uLnkKICAgIGVuZAogICAgcmVzb3VyY2VzW29yZV0gPSB7ewogICAgICBjb3VudCA9ICNlbnRpdGllcywKICAgICAgY2VudGVyX3ggPSBtYXRoLmZsb29yKHN4IC8gI2VudGl0aWVzKSwKICAgICAgY2VudGVyX3kgPSBtYXRoLmZsb29yKHN5IC8gI2VudGl0aWVzKQogICAgfX0KICBlbmQKZW5kCnJjb24ucHJpbnQoZ2FtZS50YWJsZV90b19qc29uKHJlc291cmNlcykpCiIiIgogICAgICAgIHJhdyA9IHNlbGYucmNvbi5sdWEobHVhKQogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJhdykgaWYgcmF3IGVsc2Uge30KCiAgICAjIOKUgOKUgCDqsbTrrLwg66qp66GdIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgZGVmIGdldF9idWlsZGluZ3Moc2VsZiwgcmFkaXVzOiBpbnQgPSAzMDApIC0+IGxpc3Q6CiAgICAgICAgbHVhID0gZiIiIgpsb2NhbCBwID0gZ2FtZS5wbGF5ZXIKbG9jYWwgc3VyZmFjZSA9IHAuc3VyZmFjZQpsb2NhbCBjZW50ZXIgPSBwLnBvc2l0aW9uCgpsb2NhbCBlbnRpdHlfbmFtZXMgPSB7ewogICJidXJuZXItbWluaW5nLWRyaWxsIiwgImVsZWN0cmljLW1pbmluZy1kcmlsbCIsCiAgInN0b25lLWZ1cm5hY2UiLCAic3RlZWwtZnVybmFjZSIsICJlbGVjdHJpYy1mdXJuYWNlIiwKICAidHJhbnNwb3J0LWJlbHQiLCAiZmFzdC10cmFuc3BvcnQtYmVsdCIsCiAgImJ1cm5lci1pbnNlcnRlciIsICJpbnNlcnRlciIsCiAgInNtYWxsLWVsZWN0cmljLXBvbGUiLCAibWVkaXVtLWVsZWN0cmljLXBvbGUiLAogICJzdGVhbS1lbmdpbmUiLCAiYm9pbGVyIiwgIm9mZnNob3JlLXB1bXAiLAogICJhc3NlbWJsaW5nLW1hY2hpbmUtMSIsICJhc3NlbWJsaW5nLW1hY2hpbmUtMiIsCiAgImNoZXN0IiwgImlyb24tY2hlc3QiLCAic3RlZWwtY2hlc3QiCn19Cgpsb2NhbCByZXN1bHQgPSB7e319CmZvciBfLCBuYW1lIGluIGlwYWlycyhlbnRpdHlfbmFtZXMpIGRvCiAgbG9jYWwgZW50aXRpZXMgPSBzdXJmYWNlLmZpbmRfZW50aXRpZXNfZmlsdGVyZWR7ewogICAgYXJlYSA9IHt7CiAgICAgIHt7Y2VudGVyLnggLSB7cmFkaXVzfSwgY2VudGVyLnkgLSB7cmFkaXVzfX19LAogICAgICB7e2NlbnRlci54ICsge3JhZGl1c30sIGNlbnRlci55ICsge3JhZGl1c319fQogICAgfX0sCiAgICBuYW1lID0gbmFtZQogIH19CiAgaWYgI2VudGl0aWVzID4gMCB0aGVuCiAgICByZXN1bHRbbmFtZV0gPSAjZW50aXRpZXMKICBlbmQKZW5kCnJjb24ucHJpbnQoZ2FtZS50YWJsZV90b19qc29uKHJlc3VsdCkpCiIiIgogICAgICAgIHJhdyA9IHNlbGYucmNvbi5sdWEobHVhKQogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJhdykgaWYgcmF3IGVsc2Uge30KCiAgICAjIOKUgOKUgCDsl7Dqtawg7ZiE7ZmpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgZGVmIGdldF9yZXNlYXJjaF9zdGF0dXMoc2VsZikgLT4gZGljdDoKICAgICAgICBsdWEgPSAiIiIKbG9jYWwgZm9yY2UgPSBnYW1lLnBsYXllci5mb3JjZQpsb2NhbCBjb21wbGV0ZWQgPSB7fQpsb2NhbCBrID0gMApmb3IgbmFtZSwgdGVjaCBpbiBwYWlycyhmb3JjZS50ZWNobm9sb2dpZXMpIGRvCiAgaWYgdGVjaC5yZXNlYXJjaGVkIHRoZW4KICAgIGsgPSBrICsgMQogICAgY29tcGxldGVkW2tdID0gbmFtZQogIGVuZAplbmQKcmNvbi5wcmludChnYW1lLnRhYmxlX3RvX2pzb24oewogIGN1cnJlbnQgPSBmb3JjZS5jdXJyZW50X3Jlc2VhcmNoIGFuZCBmb3JjZS5jdXJyZW50X3Jlc2VhcmNoLm5hbWUgb3IgIm5vbmUiLAogIGNvbXBsZXRlZF9jb3VudCA9IGsKfSkpCiIiIgogICAgICAgIHJhdyA9IHNlbGYucmNvbi5sdWEobHVhKQogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJhdykgaWYgcmF3IGVsc2Uge30KCiAgICBkZWYgc3VtbWFyaXplX2Zvcl9haShzZWxmLCBzdGF0ZTogZGljdCkgLT4gc3RyOgogICAgICAgICIiIkFJIO2UhOuhrO2UhO2KuOyaqSDsg4Htg5wg7JqU7JW9IO2FjeyKpO2KuCDsg53shLEiIiIKICAgICAgICBwICAgPSBzdGF0ZS5nZXQoInBsYXllciIsIHt9KQogICAgICAgIGludiA9IHN0YXRlLmdldCgiaW52ZW50b3J5Iiwge30pCiAgICAgICAgcmVzID0gc3RhdGUuZ2V0KCJyZXNvdXJjZXMiLCB7fSkKICAgICAgICBibGQgPSBzdGF0ZS5nZXQoImJ1aWxkaW5ncyIsIHt9KQoKICAgICAgICBsaW5lcyA9IFsKICAgICAgICAgICAgZiIjIyDtmITsnqwg6rKM7J6EIOyDge2DnCIsCiAgICAgICAgICAgIGYiIyMjIO2UjOugiOydtOyWtCIsCiAgICAgICAgICAgIGYiLSDsnITsuZg6ICh7cC5nZXQoJ3gnLCAnPycpfSwge3AuZ2V0KCd5JywgJz8nKX0pIiwKICAgICAgICAgICAgZiItIOyytOugpToge3AuZ2V0KCdoZWFsdGgnLCAnPycpfSIsCiAgICAgICAgICAgICIiLAogICAgICAgICAgICAiIyMjIOyduOuypO2GoOumrCAo7KO87JqUIOyVhOydtO2FnCkiLAogICAgICAgIF0KCiAgICAgICAga2V5X2l0ZW1zID0gWwogICAgICAgICAgICAiaXJvbi1vcmUiLCAiY29wcGVyLW9yZSIsICJjb2FsIiwgInN0b25lIiwKICAgICAgICAgICAgImlyb24tcGxhdGUiLCAiY29wcGVyLXBsYXRlIiwgInN0ZWVsLXBsYXRlIiwKICAgICAgICAgICAgImJ1cm5lci1taW5pbmctZHJpbGwiLCAiZWxlY3RyaWMtbWluaW5nLWRyaWxsIiwKICAgICAgICAgICAgInN0b25lLWZ1cm5hY2UiLCAidHJhbnNwb3J0LWJlbHQiLCAiaW5zZXJ0ZXIiLAogICAgICAgICAgICAiYnVybmVyLWluc2VydGVyIiwgInNtYWxsLWVsZWN0cmljLXBvbGUiLAogICAgICAgIF0KICAgICAgICBmb3IgaXRlbSBpbiBrZXlfaXRlbXM6CiAgICAgICAgICAgIGNvdW50ID0gaW52LmdldChpdGVtLCAwKQogICAgICAgICAgICBpZiBjb3VudCA+IDA6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiItIHtpdGVtfToge2NvdW50feqwnCIpCgogICAgICAgIGxpbmVzICs9IFsiIiwgIiMjIyDso7zrs4Ag7J6Q7JuQIO2MqOy5mCJdCiAgICAgICAgaWYgcmVzOgogICAgICAgICAgICBmb3Igb3JlLCBpbmZvIGluIHJlcy5pdGVtcygpOgogICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgIGYiLSB7b3JlfToge2luZm9bJ2NvdW50J1197YOA7J28ICIKICAgICAgICAgICAgICAgICAgICBmIijspJHsi6w6IHtpbmZvWydjZW50ZXJfeCddfSwge2luZm9bJ2NlbnRlcl95J119KSIKICAgICAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoIi0g7YOQ7IOJ65CcIOyekOybkCDsl4bsnYwiKQoKICAgICAgICBsaW5lcyArPSBbIiIsICIjIyMg6rG07ISk65CcIOqxtOusvCJdCiAgICAgICAgaWYgYmxkOgogICAgICAgICAgICBmb3IgbmFtZSwgY291bnQgaW4gYmxkLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiItIHtuYW1lfToge2NvdW50feqwnCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKCItIOyVhOyngSDqsbTrrLwg7JeG7J2MIikKCiAgICAgICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykK |