# -*- coding: utf-8 -*-
from HTMLParser import HTMLParser
from htmlentitydefs import name2codepoint
import codecs, re, pprint
def get_bar(lhs, rhs, bar_len, mid_str_fmt):
dis_chr = u'\u25a0'
emp_chr = u' '
ls = emp_chr * (bar_len - lhs) + dis_chr * int(lhs)
rs = dis_chr * rhs + emp_chr * (bar_len - rhs)
return u'{0:>{1}}'.format(ls, bar_len) + \
mid_str_fmt.format(lhs, rhs) + \
u'{0:<{1}}'.format(rs, bar_len)
class MyHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.match_commentary = ''
def handle_data(self, data):
if 'commentaryUpdater' in data:
temp = data[data.find('commentaryUpdater.load([[')+25:]
temp = temp[temp.find('[['):temp.find(']]')+1]
self.match_commentary = re.sub('\[,+', '[', temp)
match_id = raw_input("Enter match id: ")
with codecs.open(match_id, 'r') as f:
s = f.read()
parser = MyHTMLParser()
parser.feed(s)
fmt = '%-6s|%-15s|%-62s|%s'
match_commentary_list = [c[:-2] for c in eval(parser.match_commentary)
if c[0][0].isdigit()]
for comment in match_commentary_list:
if len(comment[2]) > 60:
comment[2] = comment[2][:60]
print fmt % tuple(comment)
attempt_count = [0,0]
yellow_count = [0,0]
red_count = [0,0]
goal_count = [0,0]
penalty_count = [0,0]
foul_count = [0,0]
offside_count = [0,0]
corner_count = [0,0]
ontarget_count = [0,0]
offtarget_count = [0,0]
blocked_count = [0,0]
owngoal_count = [0,0]
sub_count = [0,0]
hitpost_count = [0,0]
first_attempt = ('','')
first_yellow = ('','')
first_red = ('','')
first_goal = ('','')
first_penalty = ('','')
first_foul = ('','')
first_offside = ('','')
first_corner = ('','')
first_ontarget = ('','')
first_offtarget = ('','')
first_blocked = ('','')
first_owngoal = ('','')
first_sub = ('','')
first_hitpost = ('','')
team = ()
for comment in match_commentary_list:
if 'end 2' in comment[1]:
team = re.findall(r'ends, (.+) [0-9]+, (.+) [0-9]+\.', comment[2])[0]
elif 'red' in comment[1] or 'secondyellow' in comment[1]:
first_red = comment[-1],comment[0]
if comment[-1]=='home': red_count[0] += 1
else: red_count[1] += 1
elif 'yellow' in comment[1]:
first_yellow = comment[-1],comment[0]
if comment[-1]=='home': yellow_count[0] += 1
else: yellow_count[1] += 1
elif 'penalty lost' in comment[1]:
first_foul = comment[-1],comment[0]
if comment[-1]=='home': foul_count[0] += 1
else: foul_count[1] += 1
if comment[-1]=='home':
penalty_count[1] += 1
first_penalty = 'away',comment[0]
else:
penalty_count[0] += 1
first_penalty = 'home',comment[0]
elif 'free kick lost' in comment[1]:
first_foul = comment[-1],comment[0]
if comment[-1]=='home': foul_count[0] += 1
else: foul_count[1] += 1
elif 'corner' in comment[1]:
first_corner = comment[-1],comment[0]
if comment[-1]=='home': corner_count[0] += 1
else: corner_count[1] += 1
elif 'offside' in comment[1]:
first_offside = comment[-1],comment[0]
if comment[-1]=='home': offside_count[0] += 1
else: offside_count[1] += 1
elif 'own goal' in comment[1]:
first_owngoal = comment[-1],comment[0]
if comment[-1]=='home':
first_goal = 'away',comment[0]
goal_count[1] += 1
owngoal_count[0] += 1
else:
first_goal = 'home',comment[0]
goal_count[0] += 1
owngoal_count[1] += 1
elif 'goal' in comment[1]:
first_goal = first_attempt = comment[-1],comment[0]
if comment[-1]=='home':
goal_count[0] += 1
ontarget_count[0] += 1
else:
goal_count[1] += 1
ontarget_count[1] += 1
elif 'saved' in comment[1]:
first_ontarget = first_attempt = comment[-1],comment[0]
if comment[-1]=='home': ontarget_count[0] += 1
else: ontarget_count[1] += 1
elif 'miss' in comment[1]:
first_offtarget = first_attempt = comment[-1],comment[0]
if comment[-1]=='home': offtarget_count[0] += 1
else: offtarget_count[1] += 1
elif 'post' in comment[1]:
first_hitpost = first_attempt = comment[-1],comment[0]
if comment[-1]=='home': hitpost_count[0] += 1
else: hitpost_count[1] += 1
elif 'blocked' in comment[1]:
first_blocked = first_attempt = comment[-1],comment[0]
if comment[-1]=='home': blocked_count[0] += 1
else: blocked_count[1] += 1
elif 'substitution' in comment[1]:
first_sub = comment[-1],comment[0]
if comment[-1]=='home': sub_count[0] += 1
else: sub_count[1] += 1
else:
if 'free kick won' not in comment[1]:
print 'uncategorized comment:', comment[1], comment[-1], comment[0]
attempt_count[0] = ontarget_count[0] + offtarget_count[0] +\
hitpost_count[0] + blocked_count[0]
attempt_count[1] = ontarget_count[1] + offtarget_count[1] +\
hitpost_count[1] + blocked_count[1]
print '\ngoals: home %d, away %d' % tuple(goal_count)
print 'first goal: %s %s' % first_goal
print '\nown goals: home %d, away %d' % tuple(owngoal_count)
print 'first own goal: %s %s' % first_owngoal
print '\npenalties: home %d, away %d' % tuple(penalty_count)
print 'first penalty: %s %s' % first_penalty
print '\ntotal sub: home %d, away %d' % tuple(sub_count)
print 'first sub: %s %s' % first_sub
bar_len = max(len(team[0]), attempt_count[0], yellow_count[0], red_count[0],\
offside_count[0], foul_count[0], corner_count[0]) + 1
print '\n\n{0:>{4}} {1:>2} - {2:<2} {3}\n'.format(team[0], goal_count[0],\
goal_count[1], team[1], 13 + bar_len)
mid_str_fmt = u' {0:>2} {1:<2} '
print ' Shots %s' % (get_bar(attempt_count[0], attempt_count[1],\
bar_len, mid_str_fmt))
print ' On target %s' % (get_bar(ontarget_count[0], ontarget_count[1],\
bar_len, mid_str_fmt))
print ' Off target %s' % (get_bar(offtarget_count[0], offtarget_count[1],\
bar_len, mid_str_fmt))
print 'Hit woodwork %s' % (get_bar(hitpost_count[0], hitpost_count[1],\
bar_len, mid_str_fmt))
print ' Blocked %s' % (get_bar(blocked_count[0], blocked_count[1],\
bar_len, mid_str_fmt))
print ''
print 'Yellow cards %s' % (get_bar(yellow_count[0], yellow_count[1],\
bar_len, mid_str_fmt))
print ' Red cards %s' % (get_bar(red_count[0], red_count[1],\
bar_len, mid_str_fmt))
print ''
print ' Offsides %s' % (get_bar(offside_count[0], offside_count[1],\
bar_len, mid_str_fmt))
print ' Fouls %s' % (get_bar(foul_count[0], foul_count[1],\
bar_len, mid_str_fmt))
print ' Corners %s' % (get_bar(corner_count[0], corner_count[1],\
bar_len, mid_str_fmt))
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCmZyb20gSFRNTFBhcnNlciBpbXBvcnQgSFRNTFBhcnNlcgpmcm9tIGh0bWxlbnRpdHlkZWZzIGltcG9ydCBuYW1lMmNvZGVwb2ludAppbXBvcnQgY29kZWNzLCByZSwgcHByaW50CgpkZWYgZ2V0X2JhcihsaHMsIHJocywgYmFyX2xlbiwgbWlkX3N0cl9mbXQpOgogICAgZGlzX2NociA9IHUnXHUyNWEwJwogICAgZW1wX2NociA9IHUnICcKICAgIGxzID0gZW1wX2NociAqIChiYXJfbGVuIC0gbGhzKSArIGRpc19jaHIgKiBpbnQobGhzKQogICAgcnMgPSBkaXNfY2hyICogcmhzICsgZW1wX2NociAqIChiYXJfbGVuIC0gcmhzKQoJCiAgICByZXR1cm4gdSd7MDo+ezF9fScuZm9ybWF0KGxzLCBiYXJfbGVuKSArIFwKCQkgICAgbWlkX3N0cl9mbXQuZm9ybWF0KGxocywgcmhzKSArIFwKCQkgICAgdSd7MDo8ezF9fScuZm9ybWF0KHJzLCBiYXJfbGVuKQoKY2xhc3MgTXlIVE1MUGFyc2VyKEhUTUxQYXJzZXIpOgoJZGVmIF9faW5pdF9fKHNlbGYpOgoJCUhUTUxQYXJzZXIuX19pbml0X18oc2VsZikKCQlzZWxmLm1hdGNoX2NvbW1lbnRhcnkgPSAnJwoJCQoJZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgoJCWlmICdjb21tZW50YXJ5VXBkYXRlcicgaW4gZGF0YToKCQkJdGVtcCA9IGRhdGFbZGF0YS5maW5kKCdjb21tZW50YXJ5VXBkYXRlci5sb2FkKFtbJykrMjU6XQoJCQl0ZW1wID0gdGVtcFt0ZW1wLmZpbmQoJ1tbJyk6dGVtcC5maW5kKCddXScpKzFdCgkJCXNlbGYubWF0Y2hfY29tbWVudGFyeSA9IHJlLnN1YignXFssKycsICdbJywgdGVtcCkKCQkJCgptYXRjaF9pZCA9IHJhd19pbnB1dCgiRW50ZXIgbWF0Y2ggaWQ6ICIpCndpdGggY29kZWNzLm9wZW4obWF0Y2hfaWQsICdyJykgYXMgZjoKCXMgPSBmLnJlYWQoKQoKcGFyc2VyID0gTXlIVE1MUGFyc2VyKCkKcGFyc2VyLmZlZWQocykKCmZtdCA9ICclLTZzfCUtMTVzfCUtNjJzfCVzJwoJCQptYXRjaF9jb21tZW50YXJ5X2xpc3QgPSBbY1s6LTJdIGZvciBjIGluIGV2YWwocGFyc2VyLm1hdGNoX2NvbW1lbnRhcnkpCgkJCQkJCQkJaWYgY1swXVswXS5pc2RpZ2l0KCldCgpmb3IgY29tbWVudCBpbiBtYXRjaF9jb21tZW50YXJ5X2xpc3Q6CglpZiBsZW4oY29tbWVudFsyXSkgPiA2MDoKCQljb21tZW50WzJdID0gY29tbWVudFsyXVs6NjBdCglwcmludCBmbXQgJSB0dXBsZShjb21tZW50KQoKCmF0dGVtcHRfY291bnQgPSBbMCwwXQp5ZWxsb3dfY291bnQgID0gWzAsMF0KcmVkX2NvdW50ICAgICA9IFswLDBdCmdvYWxfY291bnQgICAgPSBbMCwwXQpwZW5hbHR5X2NvdW50ID0gWzAsMF0KZm91bF9jb3VudCAgICA9IFswLDBdCm9mZnNpZGVfY291bnQgPSBbMCwwXQpjb3JuZXJfY291bnQgID0gWzAsMF0Kb250YXJnZXRfY291bnQgPSBbMCwwXQpvZmZ0YXJnZXRfY291bnQgPSBbMCwwXQpibG9ja2VkX2NvdW50ID0gWzAsMF0Kb3duZ29hbF9jb3VudCA9IFswLDBdCnN1Yl9jb3VudCAgICAgPSBbMCwwXQpoaXRwb3N0X2NvdW50ID0gWzAsMF0KCmZpcnN0X2F0dGVtcHQgPSAoJycsJycpCmZpcnN0X3llbGxvdyAgPSAoJycsJycpCmZpcnN0X3JlZCAgICAgPSAoJycsJycpCmZpcnN0X2dvYWwgICAgPSAoJycsJycpCmZpcnN0X3BlbmFsdHkgPSAoJycsJycpCmZpcnN0X2ZvdWwgICAgPSAoJycsJycpCmZpcnN0X29mZnNpZGUgPSAoJycsJycpCmZpcnN0X2Nvcm5lciAgPSAoJycsJycpCmZpcnN0X29udGFyZ2V0ID0gKCcnLCcnKQpmaXJzdF9vZmZ0YXJnZXQgPSAoJycsJycpCmZpcnN0X2Jsb2NrZWQgPSAoJycsJycpCmZpcnN0X293bmdvYWwgPSAoJycsJycpCmZpcnN0X3N1YiAgICAgPSAoJycsJycpCmZpcnN0X2hpdHBvc3QgPSAoJycsJycpCgp0ZWFtID0gKCkKCmZvciBjb21tZW50IGluIG1hdGNoX2NvbW1lbnRhcnlfbGlzdDoKCWlmICdlbmQgMicgaW4gY29tbWVudFsxXToKCQl0ZWFtID0gcmUuZmluZGFsbChyJ2VuZHMsICguKykgWzAtOV0rLCAoLispIFswLTldK1wuJywgY29tbWVudFsyXSlbMF0KCWVsaWYgJ3JlZCcgaW4gY29tbWVudFsxXSBvciAnc2Vjb25keWVsbG93JyBpbiBjb21tZW50WzFdOgoJCWZpcnN0X3JlZCA9IGNvbW1lbnRbLTFdLGNvbW1lbnRbMF0KCQlpZiBjb21tZW50Wy0xXT09J2hvbWUnOiByZWRfY291bnRbMF0gKz0gMQoJCWVsc2U6IHJlZF9jb3VudFsxXSArPSAxCgllbGlmICd5ZWxsb3cnIGluIGNvbW1lbnRbMV06CgkJZmlyc3RfeWVsbG93ID0gY29tbWVudFstMV0sY29tbWVudFswXQoJCWlmIGNvbW1lbnRbLTFdPT0naG9tZSc6IHllbGxvd19jb3VudFswXSArPSAxCgkJZWxzZTogeWVsbG93X2NvdW50WzFdICs9IDEKCWVsaWYgJ3BlbmFsdHkgbG9zdCcgaW4gY29tbWVudFsxXToKCQlmaXJzdF9mb3VsID0gY29tbWVudFstMV0sY29tbWVudFswXQoJCWlmIGNvbW1lbnRbLTFdPT0naG9tZSc6IGZvdWxfY291bnRbMF0gKz0gMQoJCWVsc2U6IGZvdWxfY291bnRbMV0gKz0gMQoJCWlmIGNvbW1lbnRbLTFdPT0naG9tZSc6CgkJCXBlbmFsdHlfY291bnRbMV0gKz0gMQoJCQlmaXJzdF9wZW5hbHR5ID0gJ2F3YXknLGNvbW1lbnRbMF0KCQllbHNlOgoJCQlwZW5hbHR5X2NvdW50WzBdICs9IDEKCQkJZmlyc3RfcGVuYWx0eSA9ICdob21lJyxjb21tZW50WzBdCgllbGlmICdmcmVlIGtpY2sgbG9zdCcgaW4gY29tbWVudFsxXToKCQlmaXJzdF9mb3VsID0gY29tbWVudFstMV0sY29tbWVudFswXQoJCWlmIGNvbW1lbnRbLTFdPT0naG9tZSc6IGZvdWxfY291bnRbMF0gKz0gMQoJCWVsc2U6IGZvdWxfY291bnRbMV0gKz0gMQoJZWxpZiAnY29ybmVyJyBpbiBjb21tZW50WzFdOgoJCWZpcnN0X2Nvcm5lciA9IGNvbW1lbnRbLTFdLGNvbW1lbnRbMF0KCQlpZiBjb21tZW50Wy0xXT09J2hvbWUnOiBjb3JuZXJfY291bnRbMF0gKz0gMQoJCWVsc2U6IGNvcm5lcl9jb3VudFsxXSArPSAxCgllbGlmICdvZmZzaWRlJyBpbiBjb21tZW50WzFdOgoJCWZpcnN0X29mZnNpZGUgPSBjb21tZW50Wy0xXSxjb21tZW50WzBdCgkJaWYgY29tbWVudFstMV09PSdob21lJzogb2Zmc2lkZV9jb3VudFswXSArPSAxCgkJZWxzZTogb2Zmc2lkZV9jb3VudFsxXSArPSAxCgllbGlmICdvd24gZ29hbCcgaW4gY29tbWVudFsxXToKCQlmaXJzdF9vd25nb2FsID0gY29tbWVudFstMV0sY29tbWVudFswXQoJCWlmIGNvbW1lbnRbLTFdPT0naG9tZSc6CgkJCWZpcnN0X2dvYWwgPSAnYXdheScsY29tbWVudFswXQoJCQlnb2FsX2NvdW50WzFdICs9IDEKCQkJb3duZ29hbF9jb3VudFswXSArPSAxCgkJZWxzZToKCQkJZmlyc3RfZ29hbCA9ICdob21lJyxjb21tZW50WzBdCgkJCWdvYWxfY291bnRbMF0gKz0gMQoJCQlvd25nb2FsX2NvdW50WzFdICs9IDEKCWVsaWYgJ2dvYWwnIGluIGNvbW1lbnRbMV06CgkJZmlyc3RfZ29hbCA9IGZpcnN0X2F0dGVtcHQgPSBjb21tZW50Wy0xXSxjb21tZW50WzBdCgkJaWYgY29tbWVudFstMV09PSdob21lJzoKCQkJZ29hbF9jb3VudFswXSArPSAxCgkJCW9udGFyZ2V0X2NvdW50WzBdICs9IDEKCQllbHNlOgoJCQlnb2FsX2NvdW50WzFdICs9IDEKCQkJb250YXJnZXRfY291bnRbMV0gKz0gMQoJZWxpZiAnc2F2ZWQnIGluIGNvbW1lbnRbMV06CgkJZmlyc3Rfb250YXJnZXQgPSBmaXJzdF9hdHRlbXB0ID0gY29tbWVudFstMV0sY29tbWVudFswXQoJCWlmIGNvbW1lbnRbLTFdPT0naG9tZSc6IG9udGFyZ2V0X2NvdW50WzBdICs9IDEKCQllbHNlOiBvbnRhcmdldF9jb3VudFsxXSArPSAxCgllbGlmICdtaXNzJyBpbiBjb21tZW50WzFdOgoJCWZpcnN0X29mZnRhcmdldCA9IGZpcnN0X2F0dGVtcHQgPSBjb21tZW50Wy0xXSxjb21tZW50WzBdCgkJaWYgY29tbWVudFstMV09PSdob21lJzogb2ZmdGFyZ2V0X2NvdW50WzBdICs9IDEKCQllbHNlOiBvZmZ0YXJnZXRfY291bnRbMV0gKz0gMQoJZWxpZiAncG9zdCcgaW4gY29tbWVudFsxXToKCQlmaXJzdF9oaXRwb3N0ID0gZmlyc3RfYXR0ZW1wdCA9IGNvbW1lbnRbLTFdLGNvbW1lbnRbMF0KCQlpZiBjb21tZW50Wy0xXT09J2hvbWUnOiBoaXRwb3N0X2NvdW50WzBdICs9IDEKCQllbHNlOiBoaXRwb3N0X2NvdW50WzFdICs9IDEKCWVsaWYgJ2Jsb2NrZWQnIGluIGNvbW1lbnRbMV06CgkJZmlyc3RfYmxvY2tlZCA9IGZpcnN0X2F0dGVtcHQgPSBjb21tZW50Wy0xXSxjb21tZW50WzBdCgkJaWYgY29tbWVudFstMV09PSdob21lJzogYmxvY2tlZF9jb3VudFswXSArPSAxCgkJZWxzZTogYmxvY2tlZF9jb3VudFsxXSArPSAxCgllbGlmICdzdWJzdGl0dXRpb24nIGluIGNvbW1lbnRbMV06CgkJZmlyc3Rfc3ViID0gY29tbWVudFstMV0sY29tbWVudFswXQoJCWlmIGNvbW1lbnRbLTFdPT0naG9tZSc6IHN1Yl9jb3VudFswXSArPSAxCgkJZWxzZTogc3ViX2NvdW50WzFdICs9IDEKCWVsc2U6CgkJaWYgJ2ZyZWUga2ljayB3b24nIG5vdCBpbiBjb21tZW50WzFdOgoJCQlwcmludCAndW5jYXRlZ29yaXplZCBjb21tZW50OicsIGNvbW1lbnRbMV0sIGNvbW1lbnRbLTFdLCBjb21tZW50WzBdCglhdHRlbXB0X2NvdW50WzBdID0gb250YXJnZXRfY291bnRbMF0gKyBvZmZ0YXJnZXRfY291bnRbMF0gK1wKCQkJCQkgICBoaXRwb3N0X2NvdW50WzBdICsgYmxvY2tlZF9jb3VudFswXQoJYXR0ZW1wdF9jb3VudFsxXSA9IG9udGFyZ2V0X2NvdW50WzFdICsgb2ZmdGFyZ2V0X2NvdW50WzFdICtcCgkJCQkJICAgaGl0cG9zdF9jb3VudFsxXSArIGJsb2NrZWRfY291bnRbMV0KCQkJCgoKcHJpbnQgJ1xuZ29hbHM6IGhvbWUgJWQsIGF3YXkgJWQnICUgdHVwbGUoZ29hbF9jb3VudCkKcHJpbnQgJ2ZpcnN0IGdvYWw6ICVzICVzJyAlIGZpcnN0X2dvYWwKcHJpbnQgJ1xub3duIGdvYWxzOiBob21lICVkLCBhd2F5ICVkJyAlIHR1cGxlKG93bmdvYWxfY291bnQpCnByaW50ICdmaXJzdCBvd24gZ29hbDogJXMgJXMnICUgZmlyc3Rfb3duZ29hbAoKcHJpbnQgJ1xucGVuYWx0aWVzOiBob21lICVkLCBhd2F5ICVkJyAlIHR1cGxlKHBlbmFsdHlfY291bnQpCnByaW50ICdmaXJzdCBwZW5hbHR5OiAlcyAlcycgJSBmaXJzdF9wZW5hbHR5CgpwcmludCAnXG50b3RhbCBzdWI6IGhvbWUgJWQsIGF3YXkgJWQnICUgdHVwbGUoc3ViX2NvdW50KQpwcmludCAnZmlyc3Qgc3ViOiAlcyAlcycgJSBmaXJzdF9zdWIKCmJhcl9sZW4gPSBtYXgobGVuKHRlYW1bMF0pLCBhdHRlbXB0X2NvdW50WzBdLCB5ZWxsb3dfY291bnRbMF0sIHJlZF9jb3VudFswXSxcCgkJCSAgb2Zmc2lkZV9jb3VudFswXSwgZm91bF9jb3VudFswXSwgY29ybmVyX2NvdW50WzBdKSArIDEKcHJpbnQgJ1xuXG57MDo+ezR9fSB7MTo+Mn0gLSB7Mjo8Mn0gezN9XG4nLmZvcm1hdCh0ZWFtWzBdLCBnb2FsX2NvdW50WzBdLFwKCWdvYWxfY291bnRbMV0sIHRlYW1bMV0sIDEzICsgYmFyX2xlbikKbWlkX3N0cl9mbXQgPSB1JyB7MDo+Mn0gICB7MTo8Mn0gJwpwcmludCAnICAgICAgIFNob3RzICVzJyAlIChnZXRfYmFyKGF0dGVtcHRfY291bnRbMF0sIGF0dGVtcHRfY291bnRbMV0sXAoJCQkJCQkgICAgYmFyX2xlbiwgbWlkX3N0cl9mbXQpKQpwcmludCAnICAgT24gdGFyZ2V0ICVzJyAlIChnZXRfYmFyKG9udGFyZ2V0X2NvdW50WzBdLCBvbnRhcmdldF9jb3VudFsxXSxcCgkJCQkJCSAgICBiYXJfbGVuLCBtaWRfc3RyX2ZtdCkpCnByaW50ICcgIE9mZiB0YXJnZXQgJXMnICUgKGdldF9iYXIob2ZmdGFyZ2V0X2NvdW50WzBdLCBvZmZ0YXJnZXRfY291bnRbMV0sXAoJCQkJCQkgICAgYmFyX2xlbiwgbWlkX3N0cl9mbXQpKQpwcmludCAnSGl0IHdvb2R3b3JrICVzJyAlIChnZXRfYmFyKGhpdHBvc3RfY291bnRbMF0sIGhpdHBvc3RfY291bnRbMV0sXAoJCQkJCQkgICAgYmFyX2xlbiwgbWlkX3N0cl9mbXQpKQpwcmludCAnICAgICBCbG9ja2VkICVzJyAlIChnZXRfYmFyKGJsb2NrZWRfY291bnRbMF0sIGJsb2NrZWRfY291bnRbMV0sXAoJCQkJCQkgICAgYmFyX2xlbiwgbWlkX3N0cl9mbXQpKQpwcmludCAnJwpwcmludCAnWWVsbG93IGNhcmRzICVzJyAlIChnZXRfYmFyKHllbGxvd19jb3VudFswXSwgeWVsbG93X2NvdW50WzFdLFwKCQkJCQkJICAgIGJhcl9sZW4sIG1pZF9zdHJfZm10KSkKcHJpbnQgJyAgIFJlZCBjYXJkcyAlcycgJSAoZ2V0X2JhcihyZWRfY291bnRbMF0sIHJlZF9jb3VudFsxXSxcCgkJCQkJCSAgICBiYXJfbGVuLCBtaWRfc3RyX2ZtdCkpCnByaW50ICcnCnByaW50ICcgICAgT2Zmc2lkZXMgJXMnICUgKGdldF9iYXIob2Zmc2lkZV9jb3VudFswXSwgb2Zmc2lkZV9jb3VudFsxXSxcCgkJCQkJCSAgICBiYXJfbGVuLCBtaWRfc3RyX2ZtdCkpCnByaW50ICcgICAgICAgRm91bHMgJXMnICUgKGdldF9iYXIoZm91bF9jb3VudFswXSwgZm91bF9jb3VudFsxXSxcCgkJCQkJCSAgICBiYXJfbGVuLCBtaWRfc3RyX2ZtdCkpCnByaW50ICcgICAgIENvcm5lcnMgJXMnICUgKGdldF9iYXIoY29ybmVyX2NvdW50WzBdLCBjb3JuZXJfY291bnRbMV0sXAoJCQkJCQkgICAgYmFyX2xlbiwgbWlkX3N0cl9mbXQpKQ==