# simply put, what this does is let you select your priorities for rooms, and fill in which
# champions you have.
# then the logic finds the champion for each room who has the highest value, with the
# least remaining value for all the other rooms.
# My "database" is missing a lot of information for champions I don't have. If you can
# fill in the blanks, PM me.
# -- Carnou, Earth-228
# Special thanks to Zero and Zero's league, [GLC] The Corps, for helping me fill in the "database".
# Currently missing champions: Martian Manhunter, Nightwing, Sinestro
# Constantine, Zatana,
# we can fill out these rooms (training, bio_lab, steel, chips, armory, drone, research, power)
# with more data as we get it.
# for any champions not yet listed, it requires clicking on an assignee of each room, getting
# the percentage they contribute, and adding it to each room.
### This section is the "configuration" section
# You list your order of preference for the rooms
# And you list the champions that you have.
# Here, we fill out the list of champions that you actually have. As this
# grows, we'll have more champions in each room than are necessarily in this list
champions = [
'aquaman' ,
'atom' ,
'bane' ,
'batgirl' ,
'batman' ,
'black adam' ,
'black canary' ,
'captain cold' ,
'catwoman' ,
'cyborg' ,
'deadshot' ,
'dr fate' ,
'flash' ,
'green arrow' ,
'harley quinn' ,
'joker' ,
'killer croc' ,
'luthor' ,
'mera' ,
'penguin' ,
'poison ivy' ,
'red hood' ,
'red robin' ,
'robin' ,
'scarecrow' ,
'shazam' ,
'stargirl' ,
'superman' ,
'vixen' ,
'wonder woman' ,
]
# Here, we set the priority FROM LOWEST TO HIGHEST
# The algorithm will favor maximizing the rooms at the bottom
# do not add or remove rooms, simply rearrange them
priority = [
'training' ,
'training' ,
'armory' ,
'steel' ,
'steel' ,
'chips' ,
'chips' ,
'research' ,
'drone' ,
'drone' ,
'bio_lab' ,
'bio_lab' ,
'power' ,
'power' ,
]
### This is "the database". It's not really a database, but it's where
# we track champion data for each room
# Once I get the complete database information, this will go in the
# "don't touch!" section
training = {
'aquaman' : 30 ,
'atom' : 15 ,
'bane' : 30 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 30 ,
'captain cold' : 10 ,
'catwoman' : 15 ,
'cyborg' : 20 ,
'deadshot' : 20 ,
'deathstroke' :30 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 15 ,
'green lantern' : 20 ,
'harley quinn' : 30 ,
'joker' : 30 ,
'killer croc' : 15 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 15 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 20 ,
'stargirl' : 20 ,
'superman' : 30 ,
'twoface' : 20 ,
'vixen' : 15 ,
'wonder woman' : 15 ,
}
bio_lab = {
'aquaman' : 30 ,
'atom' : 15 ,
'bane' : 30 ,
'batgirl' : 20 ,
'batman' : 20 ,
'black adam' : 10 ,
'black canary' : 30 ,
'captain cold' : 10 ,
'catwoman' : 10 ,
'cyborg' : 20 ,
'deadshot' : 20 ,
'deathstroke' :30 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 30 ,
'harley quinn' : 20 ,
'joker' : 30 ,
'killer croc' : 15 ,
'luthor' : 20 ,
'mera' : 15 ,
'penguin' : 20 ,
'poison ivy' : 30 ,
'raven' : 30 ,
'red hood' : 15 ,
'red robin' : 20 ,
'robin' : 30 ,
'scarecrow' : 20 ,
'shazam' : 30 ,
'stargirl' : 20 ,
'superman' : 30 ,
'twoface' : 30 ,
'vixen' : 15 ,
'wonder woman' : 10 ,
}
steel = {
'aquaman' : 20 ,
'atom' : 10 ,
'bane' : 20 ,
'batgirl' : 20 ,
'batman' : 30 ,
'black adam' : 15 ,
'black canary' : 20 ,
'captain cold' : 10 ,
'catwoman' : 10 ,
'cyborg' : 30 ,
'deadshot' : 30 ,
'deathstroke' :20 ,
'dr fate' : 30 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 30 ,
'harley quinn' : 20 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 20 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 30 ,
'red hood' : 10 ,
'red robin' : 20 ,
'robin' : 20 ,
'scarecrow' : 20 ,
'shazam' : 30 ,
'stargirl' : 30 ,
'superman' : 30 ,
'twoface' : 20 ,
'vixen' : 10 ,
'wonder woman' : 15 ,
}
chips = {
'aquaman' : 20 ,
'atom' : 10 ,
'bane' : 20 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 20 ,
'captain cold' : 10 ,
'catwoman' : 15 ,
'cyborg' : 30 ,
'deadshot' : 20 ,
'deathstroke' :30 ,
'dr fate' : 20 ,
'flash' : 20 ,
'green arrow' : 15 ,
'green lantern' : 20 ,
'harley quinn' : 30 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 30 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 10 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 20 ,
'stargirl' : 20 ,
'superman' : 20 ,
'twoface' : 20 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
armory = {
'aquaman' : 20 ,
'atom' : 10 ,
'bane' : 30 ,
'batgirl' : 20 ,
'batman' : 30 ,
'black adam' : 15 ,
'black canary' : 20 ,
'captain cold' : 10 ,
'catwoman' : 15 ,
'cyborg' : 30 ,
'deadshot' : 30 ,
'deathstroke' :30 ,
'dr fate' : 30 ,
'flash' : 30 ,
'green arrow' : 15 ,
'green lantern' : 20 ,
'harley quinn' : 20 ,
'joker' : 30 ,
'killer croc' : 15 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 10 ,
'red robin' : 20 ,
'robin' : 20 ,
'scarecrow' : 20 ,
'shazam' : 20 ,
'stargirl' : 30 ,
'superman' : 20 ,
'twoface' : 30 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
drone = {
'aquaman' : 20 ,
'atom' : 15 ,
'bane' : 20 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 20 ,
'catwoman' : 10 ,
'captain cold' : 10 ,
'cyborg' : 30 ,
'deadshot' : 20 ,
'deathstroke' :30 ,
'dr fate' : 30 ,
'flash' : 20 ,
'green arrow' : 15 ,
'green lantern' : 30 ,
'harley quinn' : 30 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 10 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 30 ,
'stargirl' : 20 ,
'superman' : 20 ,
'twoface' : 20 ,
'vixen' : 15 ,
'wonder woman' : 10 ,
}
research = {
'aquaman' : 30 ,
'atom' : 15 ,
'bane' : 30 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 20 ,
'catwoman' : 10 ,
'captain cold' : 10 ,
'cyborg' : 20 ,
'deadshot' : 20 ,
'deathstroke' :20 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 20 ,
'harley quinn' : 30 ,
'joker' : 30 ,
'killer croc' : 10 ,
'luthor' : 30 ,
'mera' : 15 ,
'penguin' : 20 ,
'poison ivy' : 30 ,
'raven' : 20 ,
'red hood' : 15 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 20 ,
'stargirl' : 20 ,
'superman' : 20 ,
'twoface' : 30 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
power = {
'aquaman' : 30 ,
'atom' : 10 ,
'bane' : 30 ,
'batgirl' : 20 ,
'batman' : 30 ,
'black adam' : 15 ,
'black canary' : 30 ,
'captain cold' : 10 ,
'catwoman' : 10 ,
'cyborg' : 30 ,
'deadshot' : 20 ,
'deathstroke' :20 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 30 ,
'harley quinn' : 20 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 20 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 30 ,
'red hood' : 10 ,
'red robin' : 20 ,
'robin' : 30 ,
'scarecrow' : 20 ,
'shazam' : 30 ,
'stargirl' : 30 ,
'superman' : 30 ,
'twoface' : 20 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
### DO NOT MODIFY BEYOND THIS POINT
### (unless you like coding logic)
rooms = {
'training' : training,
'bio_lab' : bio_lab,
'steel' : steel,
'chips' : chips,
'armory' : armory,
'drone' : drone,
'research' : research,
'power' : power,
}
def calculate_value( champion) :
value = sum ( [ rooms[ room] [ champion] for room in priority] )
return value
while priority:
room_name = priority.pop ( )
score = -1
champ = ""
value = 999999
for champion in champions:
champ_value = calculate_value( champion)
if rooms[ room_name] [ champion] > score:
score = rooms[ room_name] [ champion]
champ = champion
value = champ_value
if rooms[ room_name] [ champion] == score and champ_value < value:
score = rooms[ room_name] [ champion]
champ = champion
value = champ_value
champions.remove ( champ)
print ( f"{champ} assigned to {room_name} with {score} points" )
IyBzaW1wbHkgcHV0LCB3aGF0IHRoaXMgZG9lcyBpcyBsZXQgeW91IHNlbGVjdCB5b3VyIHByaW9yaXRpZXMgZm9yIHJvb21zLCBhbmQgZmlsbCBpbiB3aGljaAojIGNoYW1waW9ucyB5b3UgaGF2ZS4KIyB0aGVuIHRoZSBsb2dpYyBmaW5kcyB0aGUgY2hhbXBpb24gZm9yIGVhY2ggcm9vbSB3aG8gaGFzIHRoZSBoaWdoZXN0IHZhbHVlLCB3aXRoIHRoZQojIGxlYXN0IHJlbWFpbmluZyB2YWx1ZSBmb3IgYWxsIHRoZSBvdGhlciByb29tcy4KIyBNeSAiZGF0YWJhc2UiIGlzIG1pc3NpbmcgYSBsb3Qgb2YgaW5mb3JtYXRpb24gZm9yIGNoYW1waW9ucyBJIGRvbid0IGhhdmUuICBJZiB5b3UgY2FuCiMgZmlsbCBpbiB0aGUgYmxhbmtzLCBQTSBtZS4KIyAtLSBDYXJub3UsIEVhcnRoLTIyOAoKIyBTcGVjaWFsIHRoYW5rcyB0byBaZXJvIGFuZCBaZXJvJ3MgbGVhZ3VlLCBbR0xDXSBUaGUgQ29ycHMsIGZvciBoZWxwaW5nIG1lIGZpbGwgaW4gdGhlICJkYXRhYmFzZSIuCiMgQ3VycmVudGx5IG1pc3NpbmcgY2hhbXBpb25zOiBNYXJ0aWFuIE1hbmh1bnRlciwgTmlnaHR3aW5nLCBTaW5lc3RybwojIENvbnN0YW50aW5lLCBaYXRhbmEsCgojIHdlIGNhbiBmaWxsIG91dCB0aGVzZSByb29tcyAodHJhaW5pbmcsIGJpb19sYWIsIHN0ZWVsLCBjaGlwcywgYXJtb3J5LCBkcm9uZSwgcmVzZWFyY2gsIHBvd2VyKQojIHdpdGggbW9yZSBkYXRhIGFzIHdlIGdldCBpdC4KIyBmb3IgYW55IGNoYW1waW9ucyBub3QgeWV0IGxpc3RlZCwgaXQgcmVxdWlyZXMgY2xpY2tpbmcgb24gYW4gYXNzaWduZWUgb2YgZWFjaCByb29tLCBnZXR0aW5nIAojIHRoZSBwZXJjZW50YWdlIHRoZXkgY29udHJpYnV0ZSwgYW5kIGFkZGluZyBpdCB0byBlYWNoIHJvb20uCgojIyMgVGhpcyBzZWN0aW9uIGlzIHRoZSAiY29uZmlndXJhdGlvbiIgc2VjdGlvbgojIFlvdSBsaXN0IHlvdXIgb3JkZXIgb2YgcHJlZmVyZW5jZSBmb3IgdGhlIHJvb21zCiMgQW5kIHlvdSBsaXN0IHRoZSBjaGFtcGlvbnMgdGhhdCB5b3UgaGF2ZS4KCiMgSGVyZSwgd2UgZmlsbCBvdXQgdGhlIGxpc3Qgb2YgY2hhbXBpb25zIHRoYXQgeW91IGFjdHVhbGx5IGhhdmUuICBBcyB0aGlzCiMgZ3Jvd3MsIHdlJ2xsIGhhdmUgbW9yZSBjaGFtcGlvbnMgaW4gZWFjaCByb29tIHRoYW4gYXJlIG5lY2Vzc2FyaWx5IGluIHRoaXMgbGlzdApjaGFtcGlvbnMgPSBbCgknYXF1YW1hbicsCgknYXRvbScsCgknYmFuZScsCgknYmF0Z2lybCcsCgknYmF0bWFuJywKCSdibGFjayBhZGFtJywKCSdibGFjayBjYW5hcnknLAoJJ2NhcHRhaW4gY29sZCcsCgknY2F0d29tYW4nLAoJJ2N5Ym9yZycsCgknZGVhZHNob3QnLAoJJ2RyIGZhdGUnLAoJJ2ZsYXNoJywKCSdncmVlbiBhcnJvdycsCgknaGFybGV5IHF1aW5uJywKCSdqb2tlcicsCgkna2lsbGVyIGNyb2MnLAoJJ2x1dGhvcicsCgknbWVyYScsCgkncGVuZ3VpbicsCgkncG9pc29uIGl2eScsCgkncmVkIGhvb2QnLAoJJ3JlZCByb2JpbicsCgkncm9iaW4nLAoJJ3NjYXJlY3JvdycsCgknc2hhemFtJywKCSdzdGFyZ2lybCcsCgknc3VwZXJtYW4nLAoJJ3ZpeGVuJywKCSd3b25kZXIgd29tYW4nLApdCgojIEhlcmUsIHdlIHNldCB0aGUgcHJpb3JpdHkgRlJPTSBMT1dFU1QgVE8gSElHSEVTVAojIFRoZSBhbGdvcml0aG0gd2lsbCBmYXZvciBtYXhpbWl6aW5nIHRoZSByb29tcyBhdCB0aGUgYm90dG9tCiMgZG8gbm90IGFkZCBvciByZW1vdmUgcm9vbXMsIHNpbXBseSByZWFycmFuZ2UgdGhlbQpwcmlvcml0eSA9IFsKICAgICd0cmFpbmluZycsIAogICAgJ3RyYWluaW5nJywgCiAgICAnYXJtb3J5JywgCiAgICAnc3RlZWwnLCAKICAgICdzdGVlbCcsIAogICAgJ2NoaXBzJywgCiAgICAnY2hpcHMnLCAKICAgICdyZXNlYXJjaCcsIAogICAgJ2Ryb25lJywgCiAgICAnZHJvbmUnLCAKICAgICdiaW9fbGFiJywgCiAgICAnYmlvX2xhYicsIAogICAgJ3Bvd2VyJywKICAgICdwb3dlcicsCiAgICBdCiAKIyMjIFRoaXMgaXMgInRoZSBkYXRhYmFzZSIuICBJdCdzIG5vdCByZWFsbHkgYSBkYXRhYmFzZSwgYnV0IGl0J3Mgd2hlcmUKIyB3ZSB0cmFjayBjaGFtcGlvbiBkYXRhIGZvciBlYWNoIHJvb20KIyBPbmNlIEkgZ2V0IHRoZSBjb21wbGV0ZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiwgdGhpcyB3aWxsIGdvIGluIHRoZSAKIyAiZG9uJ3QgdG91Y2ghIiBzZWN0aW9uCnRyYWluaW5nID0gewogICAgJ2FxdWFtYW4nOiAzMCwKICAgICdhdG9tJzogMTUsCiAgICAnYmFuZSc6IDMwLAogICAgJ2JhdGdpcmwnOiAzMCwKICAgICdiYXRtYW4nOiAzMCwKICAgICdibGFjayBhZGFtJzogMTAsCiAgICAnYmxhY2sgY2FuYXJ5JzogMzAsCiAgICAnY2FwdGFpbiBjb2xkJzogMTAsCiAgICAnY2F0d29tYW4nOiAxNSwKICAgICdjeWJvcmcnOiAyMCwKICAgICdkZWFkc2hvdCc6IDIwLAogICAgJ2RlYXRoc3Ryb2tlJzozMCwKICAgICdkciBmYXRlJzogMjAsCiAgICAnZmxhc2gnOiAzMCwKICAgICdncmVlbiBhcnJvdyc6IDE1LAogICAgJ2dyZWVuIGxhbnRlcm4nOiAyMCwKICAgICdoYXJsZXkgcXVpbm4nOiAzMCwKICAgICdqb2tlcic6IDMwLAogICAgJ2tpbGxlciBjcm9jJzogMTUsCiAgICAnbHV0aG9yJzogMzAsCiAgICAnbWVyYSc6IDEwLAogICAgJ3Blbmd1aW4nOiAyMCwKICAgICdwb2lzb24gaXZ5JzogMjAsCiAgICAncmF2ZW4nOiAyMCwKICAgICdyZWQgaG9vZCc6IDE1LAogICAgJ3JlZCByb2Jpbic6IDMwLAogICAgJ3JvYmluJzogMzAsIAogICAgJ3NjYXJlY3Jvdyc6IDMwLAogICAgJ3NoYXphbSc6IDIwLAogICAgJ3N0YXJnaXJsJzogMjAsCiAgICAnc3VwZXJtYW4nOiAzMCwKICAgICd0d29mYWNlJzogMjAsCiAgICAndml4ZW4nOiAxNSwKICAgICd3b25kZXIgd29tYW4nOiAxNSwKfQoKYmlvX2xhYiA9IHsKICAgICdhcXVhbWFuJzogMzAsCiAgICAnYXRvbSc6IDE1LAogICAgJ2JhbmUnOiAzMCwKICAgICdiYXRnaXJsJzogMjAsCiAgICAnYmF0bWFuJzogMjAsCiAgICAnYmxhY2sgYWRhbSc6IDEwLAogICAgJ2JsYWNrIGNhbmFyeSc6IDMwLAogICAgJ2NhcHRhaW4gY29sZCc6IDEwLAogICAgJ2NhdHdvbWFuJzogMTAsCiAgICAnY3lib3JnJzogMjAsCiAgICAnZGVhZHNob3QnOiAyMCwKICAgICdkZWF0aHN0cm9rZSc6MzAsCiAgICAnZHIgZmF0ZSc6IDIwLAogICAgJ2ZsYXNoJzogMzAsCiAgICAnZ3JlZW4gYXJyb3cnOiAxMCwKICAgICdncmVlbiBsYW50ZXJuJzogMzAsCiAgICAnaGFybGV5IHF1aW5uJzogMjAsCiAgICAnam9rZXInOiAzMCwKICAgICdraWxsZXIgY3JvYyc6IDE1LAogICAgJ2x1dGhvcic6IDIwLAogICAgJ21lcmEnOiAxNSwKICAgICdwZW5ndWluJzogMjAsCiAgICAncG9pc29uIGl2eSc6IDMwLAogICAgJ3JhdmVuJzogMzAsCiAgICAncmVkIGhvb2QnOiAxNSwKICAgICdyZWQgcm9iaW4nOiAyMCwKICAgICdyb2Jpbic6IDMwLCAKICAgICdzY2FyZWNyb3cnOiAyMCwKICAgICdzaGF6YW0nOiAzMCwKICAgICdzdGFyZ2lybCc6IDIwLAogICAgJ3N1cGVybWFuJzogMzAsCiAgICAndHdvZmFjZSc6IDMwLAogICAgJ3ZpeGVuJzogMTUsCiAgICAnd29uZGVyIHdvbWFuJzogMTAsCn0KCnN0ZWVsID0gewogICAgJ2FxdWFtYW4nOiAyMCwKICAgICdhdG9tJzogMTAsCiAgICAnYmFuZSc6IDIwLAogICAgJ2JhdGdpcmwnOiAyMCwKICAgICdiYXRtYW4nOiAzMCwKICAgICdibGFjayBhZGFtJzogMTUsCiAgICAnYmxhY2sgY2FuYXJ5JzogMjAsCiAgICAnY2FwdGFpbiBjb2xkJzogMTAsCiAgICAnY2F0d29tYW4nOiAxMCwKICAgICdjeWJvcmcnOiAzMCwKICAgICdkZWFkc2hvdCc6IDMwLAogICAgJ2RlYXRoc3Ryb2tlJzoyMCwKICAgICdkciBmYXRlJzogMzAsCiAgICAnZmxhc2gnOiAzMCwKICAgICdncmVlbiBhcnJvdyc6IDEwLAogICAgJ2dyZWVuIGxhbnRlcm4nOiAzMCwKICAgICdoYXJsZXkgcXVpbm4nOiAyMCwKICAgICdqb2tlcic6IDIwLAogICAgJ2tpbGxlciBjcm9jJzogMTAsCiAgICAnbHV0aG9yJzogMjAsCiAgICAnbWVyYSc6IDEwLAogICAgJ3Blbmd1aW4nOiAyMCwKICAgICdwb2lzb24gaXZ5JzogMjAsCiAgICAncmF2ZW4nOiAzMCwKICAgICdyZWQgaG9vZCc6IDEwLAogICAgJ3JlZCByb2Jpbic6IDIwLAogICAgJ3JvYmluJzogMjAsIAogICAgJ3NjYXJlY3Jvdyc6IDIwLAogICAgJ3NoYXphbSc6IDMwLAogICAgJ3N0YXJnaXJsJzogMzAsCiAgICAnc3VwZXJtYW4nOiAzMCwKICAgICd0d29mYWNlJzogMjAsCiAgICAndml4ZW4nOiAxMCwKICAgICd3b25kZXIgd29tYW4nOiAxNSwKfQoKY2hpcHMgPSB7CiAgICAnYXF1YW1hbic6IDIwLAogICAgJ2F0b20nOiAxMCwKICAgICdiYW5lJzogMjAsCiAgICAnYmF0Z2lybCc6IDMwLAogICAgJ2JhdG1hbic6IDMwLAogICAgJ2JsYWNrIGFkYW0nOiAxMCwKICAgICdibGFjayBjYW5hcnknOiAyMCwKICAgICdjYXB0YWluIGNvbGQnOiAxMCwKICAgICdjYXR3b21hbic6IDE1LAogICAgJ2N5Ym9yZyc6IDMwLAogICAgJ2RlYWRzaG90JzogMjAsCiAgICAnZGVhdGhzdHJva2UnOjMwLAogICAgJ2RyIGZhdGUnOiAyMCwKICAgICdmbGFzaCc6IDIwLAogICAgJ2dyZWVuIGFycm93JzogMTUsCiAgICAnZ3JlZW4gbGFudGVybic6IDIwLAogICAgJ2hhcmxleSBxdWlubic6IDMwLAogICAgJ2pva2VyJzogMjAsCiAgICAna2lsbGVyIGNyb2MnOiAxMCwKICAgICdsdXRob3InOiAzMCwKICAgICdtZXJhJzogMTAsCiAgICAncGVuZ3Vpbic6IDMwLAogICAgJ3BvaXNvbiBpdnknOiAyMCwKICAgICdyYXZlbic6IDIwLAogICAgJ3JlZCBob29kJzogMTAsCiAgICAncmVkIHJvYmluJzogMzAsCiAgICAncm9iaW4nOiAzMCwgCiAgICAnc2NhcmVjcm93JzogMzAsCiAgICAnc2hhemFtJzogMjAsCiAgICAnc3RhcmdpcmwnOiAyMCwKICAgICdzdXBlcm1hbic6IDIwLAogICAgJ3R3b2ZhY2UnOiAyMCwKICAgICd2aXhlbic6IDEwLAogICAgJ3dvbmRlciB3b21hbic6IDEwLAp9Cgphcm1vcnkgPSB7CiAgICAnYXF1YW1hbic6IDIwLAogICAgJ2F0b20nOiAxMCwKICAgICdiYW5lJzogMzAsCiAgICAnYmF0Z2lybCc6IDIwLAogICAgJ2JhdG1hbic6IDMwLAogICAgJ2JsYWNrIGFkYW0nOiAxNSwKICAgICdibGFjayBjYW5hcnknOiAyMCwKICAgICdjYXB0YWluIGNvbGQnOiAxMCwKICAgICdjYXR3b21hbic6IDE1LAogICAgJ2N5Ym9yZyc6IDMwLAogICAgJ2RlYWRzaG90JzogMzAsCiAgICAnZGVhdGhzdHJva2UnOjMwLAogICAgJ2RyIGZhdGUnOiAzMCwKICAgICdmbGFzaCc6IDMwLAogICAgJ2dyZWVuIGFycm93JzogMTUsCiAgICAnZ3JlZW4gbGFudGVybic6IDIwLAogICAgJ2hhcmxleSBxdWlubic6IDIwLAogICAgJ2pva2VyJzogMzAsCiAgICAna2lsbGVyIGNyb2MnOiAxNSwKICAgICdsdXRob3InOiAzMCwKICAgICdtZXJhJzogMTAsCiAgICAncGVuZ3Vpbic6IDIwLAogICAgJ3BvaXNvbiBpdnknOiAyMCwKICAgICdyYXZlbic6IDIwLAogICAgJ3JlZCBob29kJzogMTAsCiAgICAncmVkIHJvYmluJzogMjAsCiAgICAncm9iaW4nOiAyMCwgCiAgICAnc2NhcmVjcm93JzogMjAsCiAgICAnc2hhemFtJzogMjAsCiAgICAnc3RhcmdpcmwnOiAzMCwKICAgICdzdXBlcm1hbic6IDIwLAogICAgJ3R3b2ZhY2UnOiAzMCwKICAgICd2aXhlbic6IDEwLAogICAgJ3dvbmRlciB3b21hbic6IDEwLAp9Cgpkcm9uZSA9IHsKICAgICdhcXVhbWFuJzogMjAsCiAgICAnYXRvbSc6IDE1LAogICAgJ2JhbmUnOiAyMCwKICAgICdiYXRnaXJsJzogMzAsCiAgICAnYmF0bWFuJzogMzAsCiAgICAnYmxhY2sgYWRhbSc6IDEwLAogICAgJ2JsYWNrIGNhbmFyeSc6IDIwLAogICAgJ2NhdHdvbWFuJzogMTAsCiAgICAnY2FwdGFpbiBjb2xkJzogMTAsCiAgICAnY3lib3JnJzogMzAsCiAgICAnZGVhZHNob3QnOiAyMCwKICAgICdkZWF0aHN0cm9rZSc6MzAsCiAgICAnZHIgZmF0ZSc6IDMwLAogICAgJ2ZsYXNoJzogMjAsCiAgICAnZ3JlZW4gYXJyb3cnOiAxNSwKICAgICdncmVlbiBsYW50ZXJuJzogMzAsCiAgICAnaGFybGV5IHF1aW5uJzogMzAsCiAgICAnam9rZXInOiAyMCwKICAgICdraWxsZXIgY3JvYyc6IDEwLAogICAgJ2x1dGhvcic6IDMwLAogICAgJ21lcmEnOiAxMCwKICAgICdwZW5ndWluJzogMjAsCiAgICAncG9pc29uIGl2eSc6IDIwLAogICAgJ3JhdmVuJzogMjAsCiAgICAncmVkIGhvb2QnOiAxMCwKICAgICdyZWQgcm9iaW4nOiAzMCwKICAgICdyb2Jpbic6IDMwLCAKICAgICdzY2FyZWNyb3cnOiAzMCwKICAgICdzaGF6YW0nOiAzMCwKICAgICdzdGFyZ2lybCc6IDIwLAogICAgJ3N1cGVybWFuJzogMjAsCiAgICAndHdvZmFjZSc6IDIwLAogICAgJ3ZpeGVuJzogMTUsCiAgICAnd29uZGVyIHdvbWFuJzogMTAsCn0KCnJlc2VhcmNoID0gewogICAgJ2FxdWFtYW4nOiAzMCwKICAgICdhdG9tJzogMTUsCiAgICAnYmFuZSc6IDMwLAogICAgJ2JhdGdpcmwnOiAzMCwKICAgICdiYXRtYW4nOiAzMCwKICAgICdibGFjayBhZGFtJzogMTAsCiAgICAnYmxhY2sgY2FuYXJ5JzogMjAsCiAgICAnY2F0d29tYW4nOiAxMCwKICAgICdjYXB0YWluIGNvbGQnOiAxMCwKICAgICdjeWJvcmcnOiAyMCwKICAgICdkZWFkc2hvdCc6IDIwLAogICAgJ2RlYXRoc3Ryb2tlJzoyMCwKICAgICdkciBmYXRlJzogMjAsCiAgICAnZmxhc2gnOiAzMCwKICAgICdncmVlbiBhcnJvdyc6IDEwLAogICAgJ2dyZWVuIGxhbnRlcm4nOiAyMCwKICAgICdoYXJsZXkgcXVpbm4nOiAzMCwKICAgICdqb2tlcic6IDMwLAogICAgJ2tpbGxlciBjcm9jJzogMTAsCiAgICAnbHV0aG9yJzogMzAsCiAgICAnbWVyYSc6IDE1LAogICAgJ3Blbmd1aW4nOiAyMCwKICAgICdwb2lzb24gaXZ5JzogMzAsCiAgICAncmF2ZW4nOiAyMCwKICAgICdyZWQgaG9vZCc6IDE1LAogICAgJ3JlZCByb2Jpbic6IDMwLAogICAgJ3JvYmluJzogMzAsIAogICAgJ3NjYXJlY3Jvdyc6IDMwLAogICAgJ3NoYXphbSc6IDIwLAogICAgJ3N0YXJnaXJsJzogMjAsCiAgICAnc3VwZXJtYW4nOiAyMCwKICAgICd0d29mYWNlJzogMzAsCiAgICAndml4ZW4nOiAxMCwKICAgICd3b25kZXIgd29tYW4nOiAxMCwKfQoKcG93ZXIgPSB7CiAgICAnYXF1YW1hbic6IDMwLAogICAgJ2F0b20nOiAxMCwKICAgICdiYW5lJzogMzAsCiAgICAnYmF0Z2lybCc6IDIwLAogICAgJ2JhdG1hbic6IDMwLAogICAgJ2JsYWNrIGFkYW0nOiAxNSwKICAgICdibGFjayBjYW5hcnknOiAzMCwKICAgICdjYXB0YWluIGNvbGQnOiAxMCwKICAgICdjYXR3b21hbic6IDEwLAogICAgJ2N5Ym9yZyc6IDMwLAogICAgJ2RlYWRzaG90JzogMjAsCiAgICAnZGVhdGhzdHJva2UnOjIwLAogICAgJ2RyIGZhdGUnOiAyMCwKICAgICdmbGFzaCc6IDMwLAogICAgJ2dyZWVuIGFycm93JzogMTAsCiAgICAnZ3JlZW4gbGFudGVybic6IDMwLAogICAgJ2hhcmxleSBxdWlubic6IDIwLAogICAgJ2pva2VyJzogMjAsCiAgICAna2lsbGVyIGNyb2MnOiAxMCwKICAgICdsdXRob3InOiAyMCwKICAgICdtZXJhJzogMTAsCiAgICAncGVuZ3Vpbic6IDIwLAogICAgJ3BvaXNvbiBpdnknOiAyMCwKICAgICdyYXZlbic6IDMwLAogICAgJ3JlZCBob29kJzogMTAsCiAgICAncmVkIHJvYmluJzogMjAsCiAgICAncm9iaW4nOiAzMCwgCiAgICAnc2NhcmVjcm93JzogMjAsCiAgICAnc2hhemFtJzogMzAsCiAgICAnc3RhcmdpcmwnOiAzMCwKICAgICdzdXBlcm1hbic6IDMwLAogICAgJ3R3b2ZhY2UnOiAyMCwKICAgICd2aXhlbic6IDEwLAogICAgJ3dvbmRlciB3b21hbic6IDEwLAp9CgojIyMgRE8gTk9UIE1PRElGWSBCRVlPTkQgVEhJUyBQT0lOVAojIyMgKHVubGVzcyB5b3UgbGlrZSBjb2RpbmcgbG9naWMpCnJvb21zID0gewogICAgJ3RyYWluaW5nJzogdHJhaW5pbmcsCiAgICAnYmlvX2xhYic6IGJpb19sYWIsCiAgICAnc3RlZWwnOiBzdGVlbCwKICAgICdjaGlwcyc6IGNoaXBzLAogICAgJ2FybW9yeSc6IGFybW9yeSwKICAgICdkcm9uZSc6IGRyb25lLAogICAgJ3Jlc2VhcmNoJzogcmVzZWFyY2gsCiAgICAncG93ZXInOiBwb3dlciwKfQoKZGVmIGNhbGN1bGF0ZV92YWx1ZShjaGFtcGlvbik6CiAgICB2YWx1ZSA9IHN1bShbcm9vbXNbcm9vbV1bY2hhbXBpb25dIGZvciByb29tIGluIHByaW9yaXR5XSkKICAgIHJldHVybiB2YWx1ZQoKd2hpbGUgcHJpb3JpdHk6CiAgICByb29tX25hbWUgPSBwcmlvcml0eS5wb3AoKQogICAgc2NvcmUgPSAtMQogICAgY2hhbXAgPSAiIgogICAgdmFsdWUgPSA5OTk5OTkKCiAgICBmb3IgY2hhbXBpb24gaW4gY2hhbXBpb25zOgogICAgICAgIGNoYW1wX3ZhbHVlID0gY2FsY3VsYXRlX3ZhbHVlKGNoYW1waW9uKQogICAgICAgIGlmIHJvb21zW3Jvb21fbmFtZV1bY2hhbXBpb25dID4gc2NvcmU6CiAgICAgICAgICAgIHNjb3JlID0gcm9vbXNbcm9vbV9uYW1lXVtjaGFtcGlvbl0KICAgICAgICAgICAgY2hhbXAgPSBjaGFtcGlvbgogICAgICAgICAgICB2YWx1ZSA9IGNoYW1wX3ZhbHVlCiAgICAgICAgaWYgcm9vbXNbcm9vbV9uYW1lXVtjaGFtcGlvbl0gPT0gc2NvcmUgYW5kIGNoYW1wX3ZhbHVlIDwgdmFsdWU6CiAgICAgICAgICAgIHNjb3JlID0gcm9vbXNbcm9vbV9uYW1lXVtjaGFtcGlvbl0KICAgICAgICAgICAgY2hhbXAgPSBjaGFtcGlvbgogICAgICAgICAgICB2YWx1ZSA9IGNoYW1wX3ZhbHVlCiAgICAgICAgICAgIAogICAgY2hhbXBpb25zLnJlbW92ZShjaGFtcCkKICAgIHByaW50KGYie2NoYW1wfSBhc3NpZ25lZCB0byB7cm9vbV9uYW1lfSB3aXRoIHtzY29yZX0gcG9pbnRzIikKCgo=