Files

1 line
22 KiB
Python

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKUGxhdWQgTUNQIFNlcnZlciBmb3IgTVBNCkNvbm5lY3RzIHRvIHRoZSBQbGF1ZCBBUEkgYW5kIGV4cG9zZXMgdG9vbHMgZm9yIGxpc3RpbmcsIHNlYXJjaGluZywKYW5kIHJlYWRpbmcgdHJhbnNjcmlwdHMsIHN1bW1hcmllcywgYW5kIG5vdGVzIGZyb20gUGxhdWQgcmVjb3JkaW5ncy4KCkNyZWRlbnRpYWxzIChjaGVja2VkIGluIG9yZGVyKToKICAxLiBQTEFVRF9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZQogIDIuIH4vLnBsYXVkL3Rva2Vucy1tY3AuanNvbiAgKGRlc2t0b3AgYXBwIGF1dGhUb2tlbiDigJQgdmFsaWQgfjYgbW9udGhzKQogIDMuIH4vLnBsYXVkL2NvbmZpZy5qc29uICAgICAgKG1hbnVhbGx5IGltcG9ydGVkIDI0LWhvdXIgd2ViIHRva2VuKQoKVG8gcmVuZXc6IHJlLXJ1biBwbGF1ZF9kZWNyeXB0X3Rva2Vucy5weSBmcm9tIHRoZSBDbGF1ZGUgQ29Xb3JrIGZvbGRlci4KIiIiCgppbXBvcnQgZ3ppcAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHVybGxpYi5wYXJzZQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZXpvbmUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKZnJvbSBtY3Auc2VydmVyLmZhc3RtY3AgaW1wb3J0IEZhc3RNQ1AKCiMg4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAClBMQVVEX1JFR0lPTiA9IG9zLmVudmlyb24uZ2V0KCJQTEFVRF9SRUdJT04iLCAidXMiKQpCQVNFX1VSTCA9ICJodHRwczovL2FwaS5wbGF1ZC5ldSIgaWYgUExBVURfUkVHSU9OID09ICJldSIgZWxzZSAiaHR0cHM6Ly9hcGkucGxhdWQuYWkiCkNPTkZJR19QQVRIICAgICAgPSBQYXRoLmhvbWUoKSAvICIucGxhdWQiIC8gImNvbmZpZy5qc29uIgpUT0tFTlNfTUNQX1BBVEggID0gUGF0aC5ob21lKCkgLyAiLnBsYXVkIiAvICJ0b2tlbnMtbWNwLmpzb24iCgoKIyDilIDilIAgVG9rZW4gcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfbG9hZF90b2tlbigpIC0+IE9wdGlvbmFsW3N0cl06CiAgICAjIDEuIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlCiAgICBlbnZfdG9rZW4gPSBvcy5lbnZpcm9uLmdldCgiUExBVURfVE9LRU4iLCAiIikuc3RyaXAoKQogICAgaWYgZW52X3Rva2VuOgogICAgICAgIHJldHVybiBlbnZfdG9rZW4KCiAgICAjIDIuIHRva2Vucy1tY3AuanNvbiDigJQgZGVza3RvcCBhcHAgYXV0aFRva2VuICh+Ni1tb250aCBleHBpcnkpCiAgICAjICAgIFdyaXR0ZW4gYnkgcGxhdWRfZGVjcnlwdF90b2tlbnMucHk7IHJlbmV3IGJ5IHJlLXJ1bm5pbmcgdGhhdCBzY3JpcHQuCiAgICBpZiBUT0tFTlNfTUNQX1BBVEguZXhpc3RzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhUT0tFTlNfTUNQX1BBVEgucmVhZF90ZXh0KCkpCiAgICAgICAgICAgIHQgPSBkYXRhLmdldCgiYWNjZXNzX3Rva2VuIiwgIiIpLnN0cmlwKCkKICAgICAgICAgICAgaWYgdDoKICAgICAgICAgICAgICAgIHJldHVybiB0CiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICMgMy4gY29uZmlnLmpzb24g4oCUIG1hbnVhbGx5IGltcG9ydGVkIDI0LWhvdXIgd2ViIHRva2VuIChsZWdhY3kgZmFsbGJhY2spCiAgICBpZiBDT05GSUdfUEFUSC5leGlzdHMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKENPTkZJR19QQVRILnJlYWRfdGV4dCgpKQogICAgICAgICAgICB0b2tlbl9ibG9jayA9IGRhdGEuZ2V0KCJ0b2tlbiIpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rZW5fYmxvY2ssIGRpY3QpOgogICAgICAgICAgICAgICAgdCA9ICh0b2tlbl9ibG9jay5nZXQoInRva2VuIikgb3IgdG9rZW5fYmxvY2suZ2V0KCJhY2Nlc3NUb2tlbiIpIG9yICIiKS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZiB0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rZW5fYmxvY2ssIHN0cikgYW5kIHRva2VuX2Jsb2NrLnN0cmlwKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fYmxvY2suc3RyaXAoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfZ2V0X3Rva2VuKCkgLT4gc3RyOgogICAgdG9rZW4gPSBfbG9hZF90b2tlbigpCiAgICBpZiBub3QgdG9rZW46CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAiTm8gUGxhdWQgdG9rZW4gZm91bmQuIFJ1biB0aGUgcGxhdWQtY29ubmVjdG9yIGltcG9ydC10b2tlbiBjb21tYW5kICIKICAgICAgICAgICAgIm9yIHNldCB0aGUgUExBVURfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUuIgogICAgICAgICkKICAgIHJldHVybiB0b2tlbgoKCiMg4pSA4pSAIEhUVFAgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfYXBpX2dldChwYXRoOiBzdHIsIHBhcmFtczogT3B0aW9uYWxbZGljdF0gPSBOb25lKSAtPiBkaWN0OgogICAgIiIiR0VUIHJlcXVlc3QgdG8gdGhlIFBsYXVkIEFQSSB1c2luZyBjdXJsIChieXBhc3NlcyBDbG91ZGZsYXJlIGJyb3dzZXIgY2hlY2spLiIiIgogICAgdG9rZW4gPSBfZ2V0X3Rva2VuKCkKICAgIHVybCA9IGYie0JBU0VfVVJMfXtwYXRofSIKICAgIGlmIHBhcmFtczoKICAgICAgICBxdWVyeSA9ICImIi5qb2luKAogICAgICAgICAgICBmIntrfT17dXJsbGliLnBhcnNlLnF1b3RlKHN0cih2KSl9IgogICAgICAgICAgICBmb3IgaywgdiBpbiBwYXJhbXMuaXRlbXMoKSBpZiB2IGlzIG5vdCBOb25lCiAgICAgICAgKQogICAgICAgIGlmIHF1ZXJ5OgogICAgICAgICAgICB1cmwgPSBmInt1cmx9P3txdWVyeX0iCgogICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgWyJjdXJsIiwgIi1zIiwgIi1mIiwKICAgICAgICAgIi1IIiwgZiJBdXRob3JpemF0aW9uOiBCZWFyZXIge3Rva2VufSIsCiAgICAgICAgICItSCIsICJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICB1cmxdLAogICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSwgdGltZW91dD0zMCwKICAgICkKICAgIGlmIHJlc3VsdC5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICBmIlBsYXVkIEFQSSBlcnJvciAoY3VybCBleGl0IHtyZXN1bHQucmV0dXJuY29kZX0pOiB7cmVzdWx0LnN0ZGVycls6MzAwXX0iCiAgICAgICAgKQogICAgdHJ5OgogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlc3VsdC5zdGRvdXQpCiAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKGYiSW52YWxpZCBKU09OIGZyb20gUGxhdWQgQVBJOiB7cmVzdWx0LnN0ZG91dFs6MzAwXX0iKQoKCmRlZiBfZmV0Y2hfczNfanNvbih1cmw6IHN0cikgLT4gb2JqZWN0OgogICAgIiIiRmV0Y2ggYW5kIGRlY29tcHJlc3MgYSBnemlwcGVkIEpTT04gZnJvbSBhIHNpZ25lZCBTMyBVUkwuIiIiCiAgICByZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bigKICAgICAgICBbImN1cmwiLCAiLXMiLCAiLWYiLCB1cmxdLAogICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRpbWVvdXQ9MzAsCiAgICApCiAgICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihmIlMzIGZldGNoIGZhaWxlZCAoY3VybCBleGl0IHtyZXN1bHQucmV0dXJuY29kZX0pIikKICAgIHRyeToKICAgICAgICBjb250ZW50ID0gZ3ppcC5kZWNvbXByZXNzKHJlc3VsdC5zdGRvdXQpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICBjb250ZW50ID0gcmVzdWx0LnN0ZG91dCAgIyBOb3QgZ3ppcHBlZAogICAgcmV0dXJuIGpzb24ubG9hZHMoY29udGVudC5kZWNvZGUoInV0Zi04IikpCgoKZGVmIF9mZXRjaF9zM190ZXh0KHVybDogc3RyKSAtPiBzdHI6CiAgICAiIiJGZXRjaCBhIHNpZ25lZCBTMyBVUkwgYW5kIHJldHVybiByYXcgdGV4dCwgaGFuZGxpbmcgZ3ppcCBhbmQgSlNPTiBncmFjZWZ1bGx5LiIiIgogICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgWyJjdXJsIiwgIi1zIiwgIi1mIiwgdXJsXSwKICAgICAgICBjYXB0dXJlX291dHB1dD1UcnVlLCB0aW1lb3V0PTMwLAogICAgKQogICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gMDoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoZiJTMyBmZXRjaCBmYWlsZWQgKGN1cmwgZXhpdCB7cmVzdWx0LnJldHVybmNvZGV9KSIpCiAgICB0cnk6CiAgICAgICAgcmF3ID0gZ3ppcC5kZWNvbXByZXNzKHJlc3VsdC5zdGRvdXQpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICByYXcgPSByZXN1bHQuc3Rkb3V0CiAgICB0ZXh0ID0gcmF3LmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKQogICAgIyBJZiBpdCdzIEpTT04sIHByZXR0eS1wcmludCBpdDsgb3RoZXJ3aXNlIHJldHVybiBhcy1pcwogICAgdHJ5OgogICAgICAgIHBhcnNlZCA9IGpzb24ubG9hZHModGV4dCkKICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlZCwgbGlzdCk6CiAgICAgICAgICAgICMgTGlzdCBvZiBzZWdtZW50cyDigJQgZXh0cmFjdCBjb250ZW50IGZpZWxkcwogICAgICAgICAgICByZXR1cm4gIlxuXG4iLmpvaW4oCiAgICAgICAgICAgICAgICBzdHIoc2VnLmdldCgiY29udGVudCIpIG9yIHNlZy5nZXQoInRleHQiKSBvciBzZWcpCiAgICAgICAgICAgICAgICBmb3Igc2VnIGluIHBhcnNlZCBpZiBzZWcKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBqc29uLmR1bXBzKHBhcnNlZCwgaW5kZW50PTIpCiAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgcmV0dXJuIHRleHQKCgojIOKUgOKUgCBEYXRhIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpkZWYgX2ZtdF9kdXJhdGlvbihtczogaW50KSAtPiBzdHI6CiAgICBtaW5zID0gbXMgLy8gNjAwMDAKICAgIGlmIG1pbnMgPCA2MDoKICAgICAgICByZXR1cm4gZiJ7bWluc31tIgogICAgcmV0dXJuIGYie21pbnMgLy8gNjB9aCB7bWlucyAlIDYwfW0iCgoKZGVmIF9mbXRfZGF0ZSh0c19tczogaW50KSAtPiBzdHI6CiAgICB0cnk6CiAgICAgICAgZHQgPSBkYXRldGltZS5mcm9tdGltZXN0YW1wKHRzX21zIC8gMTAwMCwgdHo9dGltZXpvbmUudXRjKQogICAgICAgIHJldHVybiBkdC5zdHJmdGltZSgiJVktJW0tJWQgJUg6JU0gVVRDIikKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuIHN0cih0c19tcykKCgpkZWYgX3N1bW1hcmlzZV9yZWNvcmRpbmcocjogZGljdCkgLT4gZGljdDoKICAgICIiIlJldHVybiBhIGNvbXBhY3QgZGljdCBzdWl0YWJsZSBmb3IgbGlzdGluZy4iIiIKICAgIHJldHVybiB7CiAgICAgICAgImlkIjogci5nZXQoImlkIiwgIiIpLAogICAgICAgICJ0aXRsZSI6IHIuZ2V0KCJmaWxlbmFtZSIpIG9yIHIuZ2V0KCJmaWxlX25hbWUiKSBvciByLmdldCgidGl0bGUiKSBvciAiKHVudGl0bGVkKSIsCiAgICAgICAgImRhdGUiOiBfZm10X2RhdGUoci5nZXQoInN0YXJ0X3RpbWUiLCAwKSksCiAgICAgICAgImR1cmF0aW9uIjogX2ZtdF9kdXJhdGlvbihyLmdldCgiZHVyYXRpb24iLCAwKSksCiAgICAgICAgImhhc190cmFuc2NyaXB0IjogYm9vbChyLmdldCgiaXNfdHJhbnMiKSksCiAgICAgICAgImhhc19zdW1tYXJ5IjogYm9vbChyLmdldCgiYXV0b19zdW1fbm90ZSIpIG9yIHIuZ2V0KCJpc19zdW0iKSksCiAgICB9CgoKZGVmIF9mb3JtYXRfdHJhbnNjcmlwdChzZWdtZW50czogbGlzdCkgLT4gc3RyOgogICAgIiIiRm9ybWF0IHRyYW5zY3JpcHQgc2VnbWVudHMgaW50byByZWFkYWJsZSB0ZXh0LiIiIgogICAgbGluZXMgPSBbXQogICAgY3VycmVudF9zcGVha2VyID0gTm9uZQogICAgZm9yIHNlZyBpbiBzZWdtZW50czoKICAgICAgICBzcGVha2VyID0gc2VnLmdldCgic3BlYWtlciIpIG9yIHNlZy5nZXQoIm9yaWdpbmFsX3NwZWFrZXIiKSBvciAiIgogICAgICAgIGNvbnRlbnQgPSBzZWcuZ2V0KCJjb250ZW50IiwgIiIpLnN0cmlwKCkKICAgICAgICBpZiBub3QgY29udGVudDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBzcGVha2VyIGFuZCBzcGVha2VyICE9IGN1cnJlbnRfc3BlYWtlcjoKICAgICAgICAgICAgaWYgbGluZXM6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiIpCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIlt7c3BlYWtlcn1dIikKICAgICAgICAgICAgY3VycmVudF9zcGVha2VyID0gc3BlYWtlcgogICAgICAgIGxpbmVzLmFwcGVuZChjb250ZW50KQogICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKCgpkZWYgX2dldF9jb250ZW50X3VybChjb250ZW50X2xpc3Q6IGxpc3QsIGRhdGFfdHlwZTogc3RyKSAtPiBPcHRpb25hbFtzdHJdOgogICAgIiIiRmluZCBhIGRhdGFfbGluayBVUkwgZnJvbSBjb250ZW50X2xpc3QgYnkgZGF0YV90eXBlLiIiIgogICAgZm9yIGl0ZW0gaW4gY29udGVudF9saXN0OgogICAgICAgIGlmIGl0ZW0uZ2V0KCJkYXRhX3R5cGUiKSA9PSBkYXRhX3R5cGUgYW5kIGl0ZW0uZ2V0KCJkYXRhX2xpbmsiKToKICAgICAgICAgICAgcmV0dXJuIGl0ZW1bImRhdGFfbGluayJdCiAgICByZXR1cm4gTm9uZQoKCiMg4pSA4pSAIE1DUCBzZXJ2ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACm1jcCA9IEZhc3RNQ1AoInBsYXVkLW1wbSIpCgoKQG1jcC50b29sKCkKZGVmIHBsYXVkX2xpc3RfcmVjb3JkaW5ncygKICAgIGxpbWl0OiBpbnQgPSA1MCwKICAgIG9ubHlfd2l0aF90cmFuc2NyaXB0OiBib29sID0gRmFsc2UsCikgLT4gc3RyOgogICAgIiIiCiAgICBMaXN0IFBsYXVkIHJlY29yZGluZ3MgbmV3ZXN0LWZpcnN0LgoKICAgIEFyZ3M6CiAgICAgICAgbGltaXQ6IE1heCBudW1iZXIgdG8gcmV0dXJuIChkZWZhdWx0IDUwLCBtYXggMjAwKS4KICAgICAgICBvbmx5X3dpdGhfdHJhbnNjcmlwdDogSWYgdHJ1ZSwgb25seSByZXR1cm4gcmVjb3JkaW5ncyB0aGF0IGhhdmUgYSB0cmFuc2NyaXB0LgogICAgIiIiCiAgICByZXNwID0gX2FwaV9nZXQoIi9maWxlL3NpbXBsZS93ZWIiKQogICAgaWYgaXNpbnN0YW5jZShyZXNwLCBkaWN0KToKICAgICAgICByZWNvcmRpbmdzID0gcmVzcC5nZXQoImRhdGFfZmlsZV9saXN0Iikgb3IgcmVzcC5nZXQoImRhdGEiKSBvciBbXQogICAgZWxzZToKICAgICAgICByZWNvcmRpbmdzID0gcmVzcCBpZiBpc2luc3RhbmNlKHJlc3AsIGxpc3QpIGVsc2UgW10KCiAgICBpZiBvbmx5X3dpdGhfdHJhbnNjcmlwdDoKICAgICAgICByZWNvcmRpbmdzID0gW3IgZm9yIHIgaW4gcmVjb3JkaW5ncyBpZiByLmdldCgiaXNfdHJhbnMiKV0KCiAgICByZWNvcmRpbmdzID0gcmVjb3JkaW5nc1s6bWluKGxpbWl0LCAyMDApXQogICAgcmV0dXJuIGpzb24uZHVtcHMoW19zdW1tYXJpc2VfcmVjb3JkaW5nKHIpIGZvciByIGluIHJlY29yZGluZ3NdLCBpbmRlbnQ9MikKCgpAbWNwLnRvb2woKQpkZWYgcGxhdWRfc2VhcmNoX3JlY29yZGluZ3MoCiAgICB0aXRsZV9jb250YWluczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBzdGFydF9kYXRlOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGVuZF9kYXRlOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIG9ubHlfd2l0aF90cmFuc2NyaXB0OiBib29sID0gRmFsc2UsCiAgICBtYXhfcmVzdWx0czogaW50ID0gMjAsCikgLT4gc3RyOgogICAgIiIiCiAgICBTZWFyY2ggcmVjb3JkaW5ncyBieSB0aXRsZSBhbmQvb3IgZGF0ZSByYW5nZS4KCiAgICBBcmdzOgogICAgICAgIHRpdGxlX2NvbnRhaW5zOiBTdWJzdHJpbmcgdG8gbWF0Y2ggaW4gdGhlIHJlY29yZGluZyB0aXRsZSAoY2FzZS1pbnNlbnNpdGl2ZSkuCiAgICAgICAgc3RhcnRfZGF0ZTogSVNPIGRhdGUgc3RyaW5nLCBlLmcuICcyMDI2LTA0LTAxJy4gT25seSByZWNvcmRpbmdzIG9uIG9yIGFmdGVyIHRoaXMgZGF0ZS4KICAgICAgICBlbmRfZGF0ZTogSVNPIGRhdGUgc3RyaW5nLCBlLmcuICcyMDI2LTA1LTAxJy4gT25seSByZWNvcmRpbmdzIG9uIG9yIGJlZm9yZSB0aGlzIGRhdGUuCiAgICAgICAgb25seV93aXRoX3RyYW5zY3JpcHQ6IElmIHRydWUsIG9ubHkgcmV0dXJuIHJlY29yZGluZ3MgdGhhdCBoYXZlIGEgdHJhbnNjcmlwdC4KICAgICAgICBtYXhfcmVzdWx0czogTWF4IG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybiAoZGVmYXVsdCAyMCkuCiAgICAiIiIKICAgIHJlc3AgPSBfYXBpX2dldCgiL2ZpbGUvc2ltcGxlL3dlYiIpCiAgICBpZiBpc2luc3RhbmNlKHJlc3AsIGRpY3QpOgogICAgICAgIHJlY29yZGluZ3MgPSByZXNwLmdldCgiZGF0YV9maWxlX2xpc3QiKSBvciByZXNwLmdldCgiZGF0YSIpIG9yIFtdCiAgICBlbHNlOgogICAgICAgIHJlY29yZGluZ3MgPSByZXNwIGlmIGlzaW5zdGFuY2UocmVzcCwgbGlzdCkgZWxzZSBbXQoKICAgIGRlZiBtYXRjaGVzKHI6IGRpY3QpIC0+IGJvb2w6CiAgICAgICAgaWYgb25seV93aXRoX3RyYW5zY3JpcHQgYW5kIG5vdCByLmdldCgiaXNfdHJhbnMiKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgdGl0bGUgPSAoci5nZXQoImZpbGVuYW1lIikgb3Igci5nZXQoImZpbGVfbmFtZSIpIG9yIHIuZ2V0KCJ0aXRsZSIpIG9yICIiKS5sb3dlcigpCiAgICAgICAgaWYgdGl0bGVfY29udGFpbnMgYW5kIHRpdGxlX2NvbnRhaW5zLmxvd2VyKCkgbm90IGluIHRpdGxlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBpZiBzdGFydF9kYXRlIG9yIGVuZF9kYXRlOgogICAgICAgICAgICB0c19tcyA9IHIuZ2V0KCJzdGFydF90aW1lIiwgMCkKICAgICAgICAgICAgcmVjX2RhdGUgPSBkYXRldGltZS5mcm9tdGltZXN0YW1wKHRzX21zIC8gMTAwMCwgdHo9dGltZXpvbmUudXRjKS5kYXRlKCkKICAgICAgICAgICAgaWYgc3RhcnRfZGF0ZSBhbmQgcmVjX2RhdGUgPCBkYXRldGltZS5mcm9taXNvZm9ybWF0KHN0YXJ0X2RhdGUpLmRhdGUoKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBpZiBlbmRfZGF0ZSBhbmQgcmVjX2RhdGUgPiBkYXRldGltZS5mcm9taXNvZm9ybWF0KGVuZF9kYXRlKS5kYXRlKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIG1hdGNoZWQgPSBbciBmb3IgciBpbiByZWNvcmRpbmdzIGlmIG1hdGNoZXMocildWzptYXhfcmVzdWx0c10KICAgIHJldHVybiBqc29uLmR1bXBzKFtfc3VtbWFyaXNlX3JlY29yZGluZyhyKSBmb3IgciBpbiBtYXRjaGVkXSwgaW5kZW50PTIpCgoKQG1jcC50b29sKCkKZGVmIHBsYXVkX2dldF90cmFuc2NyaXB0KHJlY29yZGluZ19pZDogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgIEdldCB0aGUgZnVsbCB0cmFuc2NyaXB0IGZvciBhIFBsYXVkIHJlY29yZGluZy4KCiAgICBBcmdzOgogICAgICAgIHJlY29yZGluZ19pZDogVGhlIHJlY29yZGluZyBJRCAoZnJvbSBwbGF1ZF9saXN0X3JlY29yZGluZ3MpLgogICAgIiIiCiAgICByZXNwID0gX2FwaV9nZXQoZiIvZmlsZS9kZXRhaWwve3JlY29yZGluZ19pZH0iKQogICAgZGF0YSA9IHJlc3AuZ2V0KCJkYXRhIiwgcmVzcCkgaWYgaXNpbnN0YW5jZShyZXNwLCBkaWN0KSBlbHNlIHJlc3AKCiAgICB0aXRsZSA9IGRhdGEuZ2V0KCJmaWxlX25hbWUiKSBvciBkYXRhLmdldCgiZmlsZW5hbWUiKSBvciBkYXRhLmdldCgidGl0bGUiKSBvciAiKHVudGl0bGVkKSIKICAgIGNvbnRlbnRfbGlzdCA9IGRhdGEuZ2V0KCJjb250ZW50X2xpc3QiKSBvciBbXQogICAgdHJhbnNjcmlwdCA9ICIiCgogICAgIyBUcnkgcG9saXNoZWQgdHJhbnNjcmlwdCBmaXJzdCwgZmFsbCBiYWNrIHRvIHJhdwogICAgZm9yIGR0eXBlIGluICgidHJhbnNhY3Rpb25fcG9saXNoIiwgInRyYW5zYWN0aW9uIik6CiAgICAgICAgdXJsID0gX2dldF9jb250ZW50X3VybChjb250ZW50X2xpc3QsIGR0eXBlKQogICAgICAgIGlmIHVybDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VnbWVudHMgPSBfZmV0Y2hfczNfanNvbih1cmwpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlZ21lbnRzLCBsaXN0KToKICAgICAgICAgICAgICAgICAgICB0cmFuc2NyaXB0ID0gX2Zvcm1hdF90cmFuc2NyaXB0KHNlZ21lbnRzKQogICAgICAgICAgICAgICAgICAgIGlmIHRyYW5zY3JpcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHRyYW5zY3JpcHQgPSBmIkVycm9yIGZldGNoaW5nIHRyYW5zY3JpcHQ6IHtlfSIKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgcmV0dXJuIGpzb24uZHVtcHMoewogICAgICAgICJpZCI6IHJlY29yZGluZ19pZCwKICAgICAgICAidGl0bGUiOiB0aXRsZSwKICAgICAgICAiZGF0ZSI6IF9mbXRfZGF0ZShkYXRhLmdldCgic3RhcnRfdGltZSIsIDApKSwKICAgICAgICAiZHVyYXRpb24iOiBfZm10X2R1cmF0aW9uKGRhdGEuZ2V0KCJkdXJhdGlvbiIsIDApKSwKICAgICAgICAidHJhbnNjcmlwdCI6IHRyYW5zY3JpcHQgb3IgIk5vIHRyYW5zY3JpcHQgYXZhaWxhYmxlIGZvciB0aGlzIHJlY29yZGluZy4iLAogICAgfSwgaW5kZW50PTIpCgoKQG1jcC50b29sKCkKZGVmIHBsYXVkX2dldF9zdW1tYXJ5KHJlY29yZGluZ19pZDogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgIEdldCB0aGUgQUktZ2VuZXJhdGVkIHN1bW1hcnkvbWVldGluZyBub3RlcyBmb3IgYSBQbGF1ZCByZWNvcmRpbmcuCiAgICBUcmllcyBhdXRvX3N1bV9ub3RlIChyaWNoIEFJIG1lZXRpbmcgbm90ZXMpIGZpcnN0LCB0aGVuIG91dGxpbmUgKHRpbWVzdGFtcGVkIHRvcGljIGxpc3QpLgoKICAgIEFyZ3M6CiAgICAgICAgcmVjb3JkaW5nX2lkOiBUaGUgcmVjb3JkaW5nIElEIChmcm9tIHBsYXVkX2xpc3RfcmVjb3JkaW5ncykuCiAgICAiIiIKICAgIHJlc3AgPSBfYXBpX2dldChmIi9maWxlL2RldGFpbC97cmVjb3JkaW5nX2lkfSIpCiAgICBkYXRhID0gcmVzcC5nZXQoImRhdGEiLCByZXNwKSBpZiBpc2luc3RhbmNlKHJlc3AsIGRpY3QpIGVsc2UgcmVzcAoKICAgIHRpdGxlID0gZGF0YS5nZXQoImZpbGVfbmFtZSIpIG9yIGRhdGEuZ2V0KCJmaWxlbmFtZSIpIG9yIGRhdGEuZ2V0KCJ0aXRsZSIpIG9yICIodW50aXRsZWQpIgogICAgY29udGVudF9saXN0ID0gZGF0YS5nZXQoImNvbnRlbnRfbGlzdCIpIG9yIFtdCiAgICBzdW1tYXJ5ID0gIiIKICAgIHN1bW1hcnlfdHlwZSA9ICIiCgogICAgIyAxLiBUcnkgcmljaCBBSSBtZWV0aW5nIG5vdGVzIChhdXRvX3N1bV9ub3RlKSDigJQgc2hvd24gYXMgIlN1bW1hcnkiIGluIFBsYXVkIHdlYiBVSQogICAgdXJsID0gX2dldF9jb250ZW50X3VybChjb250ZW50X2xpc3QsICJhdXRvX3N1bV9ub3RlIikKICAgIGlmIHVybDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1bW1hcnkgPSBfZmV0Y2hfczNfdGV4dCh1cmwpCiAgICAgICAgICAgIGlmIHN1bW1hcnkuc3RyaXAoKToKICAgICAgICAgICAgICAgIHN1bW1hcnlfdHlwZSA9ICJhdXRvX3N1bV9ub3RlIgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgc3VtbWFyeSA9IGYiRXJyb3IgZmV0Y2hpbmcgQUkgc3VtbWFyeToge2V9IgoKICAgICMgMi4gRmFsbCBiYWNrIHRvIHRpbWVzdGFtcGVkIHRvcGljIG91dGxpbmUKICAgIGlmIG5vdCBzdW1tYXJ5LnN0cmlwKCk6CiAgICAgICAgdXJsID0gX2dldF9jb250ZW50X3VybChjb250ZW50X2xpc3QsICJvdXRsaW5lIikKICAgICAgICBpZiB1cmw6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG91dGxpbmVfZGF0YSA9IF9mZXRjaF9zM19qc29uKHVybCkKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3V0bGluZV9kYXRhLCBkaWN0KToKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5ID0ganNvbi5kdW1wcyhvdXRsaW5lX2RhdGEsIGluZGVudD0yKQogICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG91dGxpbmVfZGF0YSwgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBbXQogICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG91dGxpbmVfZGF0YToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBkaWN0KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChpdGVtLmdldCgiY29udGVudCIpIG9yIGl0ZW0uZ2V0KCJ0ZXh0Iikgb3Igc3RyKGl0ZW0pKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihpdGVtKSkKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gIlxuXG4iLmpvaW4ocCBmb3IgcCBpbiBwYXJ0cyBpZiBwKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gc3RyKG91dGxpbmVfZGF0YSkKICAgICAgICAgICAgICAgIGlmIHN1bW1hcnkuc3RyaXAoKToKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5X3R5cGUgPSAib3V0bGluZSIKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc3VtbWFyeSA9IGYiRXJyb3IgZmV0Y2hpbmcgb3V0bGluZToge2V9IgoKICAgIHJldHVybiBqc29uLmR1bXBzKHsKICAgICAgICAiaWQiOiByZWNvcmRpbmdfaWQsCiAgICAgICAgInRpdGxlIjogdGl0bGUsCiAgICAgICAgImRhdGUiOiBfZm10X2RhdGUoZGF0YS5nZXQoInN0YXJ0X3RpbWUiLCAwKSksCiAgICAgICAgInN1bW1hcnlfdHlwZSI6IHN1bW1hcnlfdHlwZSBvciAibm9uZSIsCiAgICAgICAgInN1bW1hcnkiOiBzdW1tYXJ5IG9yICJObyBzdW1tYXJ5IGF2YWlsYWJsZSBmb3IgdGhpcyByZWNvcmRpbmcuIiwKICAgIH0sIGluZGVudD0yKQoKCkBtY3AudG9vbCgpCmRlZiBwbGF1ZF9nZXRfbm90ZXMocmVjb3JkaW5nX2lkOiBzdHIpIC0+IHN0cjoKICAgICIiIgogICAgR2V0IEFJ LWdlbmVyYXRlZCBub3RlcyBhbmQgYWN0aW9uIGl0ZW1zIGZvciBhIFBsYXVkIHJlY29yZGluZy4KICAgIFJldHVybnMgYWxsIG5vdGUgZW50cmllcyBmcm9tIHRoZSBjb250ZW50X2xpc3QgKGFjdGlvbiBpdGVtcywga2V5IHBvaW50cywgZXRjLikuCgogICAgQXJnczoKICAgICAgICByZWNvcmRpbmdfaWQ6IFRoZSByZWNvcmRpbmcgSUQgKGZyb20gcGxhdWRfbGlzdF9yZWNvcmRpbmdzKS4KICAgICIiIgogICAgcmVzcCA9IF9hcGlfZ2V0KGYiL2ZpbGUvZGV0YWlsL3tyZWNvcmRpbmdfaWR9IikKICAgIGRhdGEgPSByZXNwLmdldCgiZGF0YSIsIHJlc3ApIGlmIGlzaW5zdGFuY2UocmVzcCwgZGljdCkgZWxzZSByZXNwCgogICAgdGl0bGUgPSBkYXRhLmdldCgiZmlsZV9uYW1lIikgb3IgZGF0YS5nZXQoImZpbGVuYW1lIikgb3IgZGF0YS5nZXQoInRpdGxlIikgb3IgIih1bnRpdGxlZCkiCiAgICBjb250ZW50X2xpc3QgPSBkYXRhLmdldCgiY29udGVudF9saXN0Iikgb3IgW10KICAgIG5vdGVzID0gW10KCiAgICBmb3IgaXRlbSBpbiBjb250ZW50X2xpc3Q6CiAgICAgICAgZHR5cGUgPSBpdGVtLmdldCgiZGF0YV90eXBlIiwgIiIpCiAgICAgICAgdXJsID0gaXRlbS5nZXQoImRhdGFfbGluayIpCiAgICAgICAgaWYgbm90IHVybCBvciBkdHlwZSBpbiAoInRyYW5zYWN0aW9uIiwgInRyYW5zYWN0aW9uX3BvbGlzaCIpOgogICAgICAgICAgICBjb250aW51ZSAgIyBTa2lwIHJhdyB0cmFuc2NyaXB0IHR5cGVzCgogICAgICAgIG5vdGVfdGl0bGUgPSBpdGVtLmdldCgiZGF0YV90aXRsZSIpIG9yIGl0ZW0uZ2V0KCJkYXRhX3RhYl9uYW1lIikgb3IgZHR5cGUKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5vdGVfZGF0YSA9IF9mZXRjaF9zM19qc29uKHVybCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub3RlX2RhdGEsIGxpc3QpOgogICAgICAgICAgICAgICAgY29udGVudCA9ICJcbiIuam9pbigKICAgICAgICAgICAgICAgICAgICBzdHIoc2VnLmdldCgiY29udGVudCIpIG9yIHNlZy5nZXQoInRleHQiKSBvciBzZWcpCiAgICAgICAgICAgICAgICAgICAgZm9yIHNlZyBpbiBub3RlX2RhdGEgaWYgc2VnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub3RlX2RhdGEsIGRpY3QpOgogICAgICAgICAgICAgICAgY29udGVudCA9IGpzb24uZHVtcHMobm90ZV9kYXRhLCBpbmRlbnQ9MikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzdHIobm90ZV9kYXRhKQoKICAgICAgICAgICAgaWYgY29udGVudC5zdHJpcCgpOgogICAgICAgICAgICAgICAgbm90ZXMuYXBwZW5kKHsidHlwZSI6IGR0eXBlLCAidGl0bGUiOiBub3RlX3RpdGxlLCAiY29udGVudCI6IGNvbnRlbnR9KQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbm90ZXMuYXBwZW5kKHsidHlwZSI6IGR0eXBlLCAidGl0bGUiOiBub3RlX3RpdGxlLCAiY29udGVudCI6IGYiRXJyb3I6IHtlfSJ9KQoKICAgIHJldHVybiBqc29uLmR1bXBzKHsKICAgICAgICAiaWQiOiByZWNvcmRpbmdfaWQsCiAgICAgICAgInRpdGxlIjogdGl0bGUsCiAgICAgICAgImRhdGUiOiBfZm10X2RhdGUoZGF0YS5nZXQoInN0YXJ0X3RpbWUiLCAwKSksCiAgICAgICAgIm5vdGVzIjogbm90ZXMgaWYgbm90ZXMgZWxzZSBbeyJ0eXBlIjogIm5vbmUiLCAiY29udGVudCI6ICJObyBub3RlcyBhdmFpbGFibGUgZm9yIHRoaXMgcmVjb3JkaW5nLiJ9XSwKICAgIH0sIGluZGVudD0yKQoKCkBtY3AudG9vbCgpCmRlZiBwbGF1ZF9nZXRfcmVjb3JkaW5nX2RldGFpbChyZWNvcmRpbmdfaWQ6IHN0cikgLT4gc3RyOgogICAgIiIiCiAgICBHZXQgZnVsbCBtZXRhZGF0YSBmb3IgYSBQbGF1ZCByZWNvcmRpbmcgaW5jbHVkaW5nIHRpdGxlLCBkYXRlLCBkdXJhdGlvbiwKICAgIHRyYW5zY3JpcHQgYXZhaWxhYmlsaXR5LCBhbmQgYXZhaWxhYmxlIGNvbnRlbnQgdHlwZXMuCgogICAgQXJnczoKICAgICAgICByZWNvcmRpbmdfaWQ6IFRoZSByZWNvcmRpbmcgSUQgKGZyb20gcGxhdWRfbGlzdF9yZWNvcmRpbmdzKS4KICAgICIiIgogICAgcmVzcCA9IF9hcGlfZ2V0KGYiL2ZpbGUvZGV0YWlsL3tyZWNvcmRpbmdfaWR9IikKICAgIGRhdGEgPSByZXNwLmdldCgiZGF0YSIsIHJlc3ApIGlmIGlzaW5zdGFuY2UocmVzcCwgZGljdCkgZWxzZSByZXNwCgogICAgY29udGVudF9saXN0ID0gZGF0YS5nZXQoImNvbnRlbnRfbGlzdCIpIG9yIFtdCiAgICBjb250ZW50X3R5cGVzID0gW2l0ZW0uZ2V0KCJkYXRhX3R5cGUiKSBmb3IgaXRlbSBpbiBjb250ZW50X2xpc3QgaWYgaXRlbS5nZXQoImRhdGFfdHlwZSIpXQoKICAgIHJldHVybiBqc29uLmR1bXBzKHsKICAgICAgICAiaWQiOiByZWNvcmRpbmdfaWQsCiAgICAgICAgInRpdGxlIjogZGF0YS5nZXQoImZpbGVfbmFtZSIpIG9yIGRhdGEuZ2V0KCJmaWxlbmFtZSIpIG9yIGRhdGEuZ2V0KCJ0aXRsZSIpIG9yICIodW50aXRsZWQpIiwKICAgICAgICAiZGF0ZSI6IF9mbXRfZGF0ZShkYXRhLmdldCgic3RhcnRfdGltZSIsIDApKSwKICAgICAgICAiZHVyYXRpb24iOiBfZm10X2R1cmF0aW9uKGRhdGEuZ2V0KCJkdXJhdGlvbiIsIDApKSwKICAgICAgICAiaGFzX3RyYW5zY3JpcHQiOiAidHJhbnNhY3Rpb24iIGluIGNvbnRlbnRfdHlwZXMgb3IgInRyYW5zYWN0aW9uX3BvbGlzaCIgaW4gY29udGVudF90eXBlcywKICAgICAgICAiaGFzX3N1bW1hcnkiOiAiYXV0b19zdW1fbm90ZSIgaW4gY29udGVudF90eXBlcyBvciAib3V0bGluZSIgaW4gY29udGVudF90eXBlcywKICAgICAgICAiY29udGVudF90eXBlcyI6IGNvbnRlbnRfdHlwZXMsCiAgICAgICAgImRldmljZSI6IGRhdGEuZ2V0KCJzZXJpYWxfbnVtYmVyIikgb3IgZGF0YS5nZXQoImRldmljZV9uYW1lIikgb3IgInVua25vd24iLAogICAgICAgICJ0YWdzIjogZGF0YS5nZXQoImZpbGV0YWdfaWRfbGlzdCIpIG9yIGRhdGEuZ2V0KCJmaWxldGFnIikgb3IgW10sCiAgICB9LCBpbmRlbnQ9MikKCgpAbWNwLnRvb2woKQpkZWYgcGxhdWRfdXNlcl9pbmZvKCkgLT4gc3RyOgogICAgIiIiR2V0IHRoZSBjdXJyZW50IFBsYXVkIGFjY291bnQgaW5mb3JtYXRpb24gYW5kIGNvbm5lY3Rpb24gc3RhdHVzLiIiIgogICAgcmV0dXJuIGpzb24uZHVtcHMoewogICAgICAgICJyZWdpb24iOiBQTEFVRF9SRUdJT04sCiAgICAgICAgImFwaV9iYXNlIjogQkFTRV9VUkwsCiAgICAgICAgInRva2VuX2xvYWRlZCI6IGJvb2woX2xvYWRfdG9rZW4oKSksCiAgICB9LCBpbmRlbnQ9MikKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWNwLnJ1bigpCg==