#!/usr/bin/python
# coding:utf-8
import pygame
from pygame.locals import *
import sys
import time
import threading
#map Create
lst=[0]*39
'''
# mapName:Color_group:List_price:Construction_cost:Remarks
#Color_group=0 White_Blank Color_group=1 Brown Color_group=2 Railway
#Color_group=3 light blue Color_group=4 Bright purple
#Color_group=5 Orange Color_group=6 Red Color_group=7 yellow Color_group=8 A public company Color_group=9 Green
#Color_group=10 dark blue
'''
#building&land information
land0={ 'mapName':'GO', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Starting_point'}
land1={ 'mapName':'Mediterranean_Street', 'Color_group':'1', 'List_price':'60', 'Construction_cost':'50', 'Remarks':'No_information'}
land2={ 'mapName':'Joint_Fund', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Pull_a_joint_fund_card'}
land3={ 'mapName':'Baltic_Street', 'Color_group':'1', 'List_price':'60', 'Construction_cost':'50', 'Remarks':'No_information'}
land4={ 'mapName':'income_tax', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Pay_$200'}
land5={ 'mapName':'Leading_train', 'Color_group':'2', 'List_price':'200', 'Construction_cost':'0', 'Remarks':'No_information'}
land6={ 'mapName':'Oriental_street', 'Color_group':'3', 'List_price':'100', 'Construction_cost':'50', 'Remarks':'No_information'}
land7={ 'mapName':'Accidentality', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Pull_a_chance_card'}
land8={ 'mapName':'Vermont_Avenue', 'Color_group':'3', 'List_price':'100', 'Construction_cost':'50', 'Remarks':'No_information'}
land9 ={'mapName':'Connecticut_Street', 'Color_group':'3', 'List_price':'120', 'Construction_cost':'50', 'Remarks':'No_information'}
land10={'mapName':'prison', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Nothing_happens_at_the_tour'}
land11={'mapName':'St. Charles Place', 'Color_group':'4', 'List_price':'140', 'Construction_cost':'100', 'Remarks':'No_information'}
land12={'mapName':'Power company', 'Color_group':'8', 'List_price':'150', 'Construction_cost':'0', 'Remarks':'No_information'}
land13={'mapName':'State street', 'Color_group':'4', 'List_price':'140', 'Construction_cost':'100', 'Remarks':'No_information'}
land14={'mapName':'Virginia Street', 'Color_group':'4', 'List_price':'160', 'Construction_cost':'100', 'Remarks':'No_information'}
land15={'mapName':'Pennsylvania Railway', 'Color_group':'2', 'List_price':'200', 'Construction_cost':'0', 'Remarks':'No_information'}
land16={'mapName':'St. James Place', 'Color_group':'5', 'List_price':'180', 'Construction_cost':'100', 'Remarks':'No_information'}
land17={'mapName':'Joint_Fund', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Pull_a_joint_fund_card'}
land18={'mapName':'Tennessee Street', 'Color_group':'5', 'List_price':'180', 'Construction_cost':'100', 'Remarks':'No_information'}
land19={'mapName':'New York Street', 'Color_group':'5', 'List_price':'200', 'Construction_cost':'100', 'Remarks':'No_information'}
land20={'mapName':'Free parking', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'nothing happens'}
land21={'mapName':'Kentucky Street', 'Color_group':'6', 'List_price':'220', 'Construction_cost':'150', 'Remarks':'No_information'}
land22={'mapName':'Accidentality', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Pull_a_chance_card'}
land23={'mapName':'Indiana Street', 'Color_group':'6', 'List_price':'220', 'Construction_cost':'150', 'Remarks':'No_information'}
land24={'mapName':'Illinois Avenue', 'Color_group':'6', 'List_price':'240', 'Construction_cost':'150', 'Remarks':'No_information'}
land25={'mapName':'B & O Railway', 'Color_group':'2', 'List_price':'200', 'Construction_cost':'0', 'Remarks':'No_information'}
land26={'mapName':'Atlantic Street', 'Color_group':'7', 'List_price':'260', 'Construction_cost':'150', 'Remarks':'No_information'}
land27={'mapName':'Vent Nord street', 'Color_group':'7', 'List_price':'260', 'Construction_cost':'150', 'Remarks':'No_information'}
land28={'mapName':'Water company', 'Color_group':'8', 'List_price':'150', 'Construction_cost':'0', 'Remarks':'No_information'}
land29={'mapName':'Atlantic Street', 'Color_group':'7', 'List_price':'280', 'Construction_cost':'150', 'Remarks':'No_information'}
land30={'mapName':'Go to jail', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Go to jail'}
land31={'mapName':'Pacific Street', 'Color_group':'9', 'List_price':'300', 'Construction_cost':'200', 'Remarks':'No_information'}
land32={'mapName':'North Carolina Street','Color_group':'9', 'List_price':'300', 'Construction_cost':'200', 'Remarks':'No_information'}
land33={'mapName':'Joint_Fund', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Pull_a_joint_fund_card'}
land34={'mapName':'Pennsylvania Street', 'Color_group':'9', 'List_price':'320', 'Construction_cost':'200', 'Remarks':'No_information'}
land35={'mapName':'Shortline railway', 'Color_group':'2', 'List_price':'200', 'Construction_cost':'0', 'Remarks':'No_information'}
land36={'mapName':'Accidentality', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'Pull_a_chance_card'}
land37={'mapName':'Park Place', 'Color_group':'10','List_price':'350', 'Construction_cost':'200', 'Remarks':'No_information'}
land38={'mapName':'Excise Tax', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'I pay $ 100'}
land39={'mapName':'Board walk', 'Color_group':'10','List_price':'400', 'Construction_cost':'200', 'Remarks':'No_information'}
# User information
user_list0=[1500,'def','hij']
#Movement value,Ownership,Asset management
'''
#Search keywords
#for k in building0:print k
#land={'mapName':'', 'Color_group':'0', 'List_price':'0', 'Construction_cost':'0', 'Remarks':'No_information'}
# User information
user_list0=['abc','def','hij']
print user_list0[0]
'''
def main():
(w,h) = (860,600) # 画面サイズ
pygame.init() # pygame初期化
pygame.display.set_mode((w, h), 0, 32) # 画面設定
screen = pygame.display.get_surface()
bg = pygame.image.load("monopolyBoard.png").convert_alpha() # 背景画像の取得
rect_bg = bg.get_rect()
# reimu
player = pygame.image.load("tohodots_byznp/01_00_reimu.png").convert_alpha()
player2 = pygame.image.load("tohodots_byznp/01_01_reimu.png").convert_alpha()
player3 = pygame.image.load("tohodots_byznp/reimu_works.jpg").convert_alpha()
# marisa
player4 = pygame.image.load("tohodots_byznp/02_00_marisa.png").convert_alpha()
player5 = pygame.image.load("tohodots_byznp/02_01_marisa.png").convert_alpha()
player6 = pygame.image.load("tohodots_byznp/icon_marisa01-2.jpg").convert_alpha()
# remiria
player7 = pygame.image.load("tohodots_byznp/03_00_remiria.png").convert_alpha()
player8 = pygame.image.load("tohodots_byznp/03_01_remiria.png").convert_alpha()
player9 = pygame.image.load("tohodots_byznp/remi.png").convert_alpha()
# sakuya
player11= pygame.image.load("tohodots_byznp/04_00_sakuya.png").convert_alpha()
player12= pygame.image.load("tohodots_byznp/04_01_sakuya.png").convert_alpha()
player13= pygame.image.load("tohodots_byznp/saku.png").convert_alpha()
rect_player = player.get_rect()
# rect_player.center = (550,550)
aiueo=0
xxx=550
yyy=550
use01=2500
use02=2500
use03=2500
use04=2500
font = pygame.font.Font(None,14)
while (1):
pygame.display.update() # 画面更新
pygame.time.wait(30) # 更新時間間隔
screen.fill((0, 20, 0, 0)) # 画面の背景色
screen.blit(bg, rect_bg) # 背景画像の描画
#screen.blit(player, rect_player) # プレイヤー画像の描画
screen.blit(player3,(600,0)) # アイコン画像の描画
screen.blit(player6,(600,150))
screen.blit(player9,(600,300))
screen.blit(player13,(600,450))
text = font.render("Possession money $2500",True,(255,255,255)) # 描画する文字列の設定
screen.blit(text, [700,5])# 文字列の表示位置
text2 = font.render("Possession money $2500",True,(255,255,255)) # 描画する文字列の設定
screen.blit(text2, [700,155])# 文字列の表示位置
text3 = font.render("Possession money $2500",True,(255,255,255)) # 描画する文字列の設定
screen.blit(text3, [700,305])# 文字列の表示位置
text4 = font.render("Possession money $2500",True,(255,255,255)) # 描画する文字列の設定
screen.blit(text4, [700,455])# 文字列の表示位置
#pygame.draw.rect(screen,(0,80,0),Rect(10,10,80,50),5) # 四角形を描画(塗りつぶしなし)
pygame.draw.rect(screen,(165,75,150),Rect(700,17,15,20)) # 四角形を描画(塗りつぶし)
if aiueo==0:
screen.blit(player,(xxx,yyy)) # プレイヤー画像の描画
time.sleep(0.5)
aiueo=aiueo+1
elif aiueo==1:
screen.blit(player2,(xxx,yyy)) # プレイヤー2画像の描画
time.sleep(0.5)
aiueo=0
else :aiueo=0
screen.blit(player5,(20,550)) # プレイヤー画像の描画
screen.blit(player8,(180,550)) # プレイヤー画像の描画
screen.blit(player12,(0,550)) # プレイヤー画像の描画
# 終了用のイベント処理
for event in pygame.event.get():
if event.type == QUIT: # 閉じるボタンが押されたとき
pygame.quit()
sys.exit()
if event.type == KEYDOWN: # キーを押したとき
if event.key == K_ESCAPE: # Escキーが押されたとき
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()
IyEvdXNyL2Jpbi9weXRob24KIyBjb2Rpbmc6dXRmLTgKCmltcG9ydCBweWdhbWUKZnJvbSBweWdhbWUubG9jYWxzIGltcG9ydCAqCmltcG9ydCBzeXMKCmltcG9ydCB0aW1lCmltcG9ydCB0aHJlYWRpbmcKCiNtYXAgQ3JlYXRlCmxzdD1bMF0qMzkKCicnJwojIG1hcE5hbWU6Q29sb3JfZ3JvdXA6TGlzdF9wcmljZTpDb25zdHJ1Y3Rpb25fY29zdDpSZW1hcmtzCiNDb2xvcl9ncm91cD0wIFdoaXRlX0JsYW5rIENvbG9yX2dyb3VwPTEgQnJvd24gQ29sb3JfZ3JvdXA9MiBSYWlsd2F5CiNDb2xvcl9ncm91cD0zIGxpZ2h0IGJsdWUgIENvbG9yX2dyb3VwPTQgQnJpZ2h0IHB1cnBsZQojQ29sb3JfZ3JvdXA9NSBPcmFuZ2UgIENvbG9yX2dyb3VwPTYgUmVkICAgQ29sb3JfZ3JvdXA9NyB5ZWxsb3cgICBDb2xvcl9ncm91cD04IEEgcHVibGljIGNvbXBhbnkgICBDb2xvcl9ncm91cD05IEdyZWVuICAKI0NvbG9yX2dyb3VwPTEwIGRhcmsgYmx1ZQonJycKCiNidWlsZGluZyZsYW5kIGluZm9ybWF0aW9uCmxhbmQwPXsgJ21hcE5hbWUnOidHTycsICAgICAgICAgICAgICAgICAgICdDb2xvcl9ncm91cCc6JzAnLCAnTGlzdF9wcmljZSc6JzAnLCAgICAnQ29uc3RydWN0aW9uX2Nvc3QnOicwJywgICAnUmVtYXJrcyc6J1N0YXJ0aW5nX3BvaW50J30KbGFuZDE9eyAnbWFwTmFtZSc6J01lZGl0ZXJyYW5lYW5fU3RyZWV0JywgJ0NvbG9yX2dyb3VwJzonMScsICdMaXN0X3ByaWNlJzonNjAnLCAgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzUwJywgICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMj17ICdtYXBOYW1lJzonSm9pbnRfRnVuZCcsICAgICAgICAgICAnQ29sb3JfZ3JvdXAnOicwJywgJ0xpc3RfcHJpY2UnOicwJywgICAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidQdWxsX2Ffam9pbnRfZnVuZF9jYXJkJ30KbGFuZDM9eyAnbWFwTmFtZSc6J0JhbHRpY19TdHJlZXQnLCAgICAgICAgJ0NvbG9yX2dyb3VwJzonMScsICdMaXN0X3ByaWNlJzonNjAnLCAgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzUwJywgICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kND17ICdtYXBOYW1lJzonaW5jb21lX3RheCcsICAgICAgICAgICAnQ29sb3JfZ3JvdXAnOicwJywgJ0xpc3RfcHJpY2UnOicwJywgICAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidQYXlfJDIwMCd9CmxhbmQ1PXsgJ21hcE5hbWUnOidMZWFkaW5nX3RyYWluJywgICAgICAgICdDb2xvcl9ncm91cCc6JzInLCAnTGlzdF9wcmljZSc6JzIwMCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicwJywgICAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDY9eyAnbWFwTmFtZSc6J09yaWVudGFsX3N0cmVldCcsICAgICAgJ0NvbG9yX2dyb3VwJzonMycsICdMaXN0X3ByaWNlJzonMTAwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzUwJywgICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kNz17ICdtYXBOYW1lJzonQWNjaWRlbnRhbGl0eScsICAgICAgICAnQ29sb3JfZ3JvdXAnOicwJywgJ0xpc3RfcHJpY2UnOicwJywgICAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidQdWxsX2FfY2hhbmNlX2NhcmQnfQpsYW5kOD17ICdtYXBOYW1lJzonVmVybW9udF9BdmVudWUnLCAgICAgICAnQ29sb3JfZ3JvdXAnOiczJywgJ0xpc3RfcHJpY2UnOicxMDAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonNTAnLCAgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CmxhbmQ5ID17J21hcE5hbWUnOidDb25uZWN0aWN1dF9TdHJlZXQnLCAgICdDb2xvcl9ncm91cCc6JzMnLCAnTGlzdF9wcmljZSc6JzEyMCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOic1MCcsICAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDEwPXsnbWFwTmFtZSc6J3ByaXNvbicsICAgICAgICAgICAgICAgJ0NvbG9yX2dyb3VwJzonMCcsICdMaXN0X3ByaWNlJzonMCcsICAgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzAnLCAgICdSZW1hcmtzJzonTm90aGluZ19oYXBwZW5zX2F0X3RoZV90b3VyJ30KbGFuZDExPXsnbWFwTmFtZSc6J1N0LiBDaGFybGVzIFBsYWNlJywgICAgJ0NvbG9yX2dyb3VwJzonNCcsICdMaXN0X3ByaWNlJzonMTQwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzEwMCcsICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMTI9eydtYXBOYW1lJzonUG93ZXIgY29tcGFueScsICAgICAgICAnQ29sb3JfZ3JvdXAnOic4JywgJ0xpc3RfcHJpY2UnOicxNTAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CmxhbmQxMz17J21hcE5hbWUnOidTdGF0ZSBzdHJlZXQnLCAgICAgICAgICdDb2xvcl9ncm91cCc6JzQnLCAnTGlzdF9wcmljZSc6JzE0MCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicxMDAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDE0PXsnbWFwTmFtZSc6J1ZpcmdpbmlhIFN0cmVldCcsICAgICAgJ0NvbG9yX2dyb3VwJzonNCcsICdMaXN0X3ByaWNlJzonMTYwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzEwMCcsICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMTU9eydtYXBOYW1lJzonUGVubnN5bHZhbmlhIFJhaWx3YXknLCAnQ29sb3JfZ3JvdXAnOicyJywgJ0xpc3RfcHJpY2UnOicyMDAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CmxhbmQxNj17J21hcE5hbWUnOidTdC4gSmFtZXMgUGxhY2UnLCAgICAgICdDb2xvcl9ncm91cCc6JzUnLCAnTGlzdF9wcmljZSc6JzE4MCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicxMDAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDE3PXsnbWFwTmFtZSc6J0pvaW50X0Z1bmQnLCAgICAgICAgICAgJ0NvbG9yX2dyb3VwJzonMCcsICdMaXN0X3ByaWNlJzonMCcsICAgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzAnLCAgICdSZW1hcmtzJzonUHVsbF9hX2pvaW50X2Z1bmRfY2FyZCd9CmxhbmQxOD17J21hcE5hbWUnOidUZW5uZXNzZWUgU3RyZWV0JywgICAgICdDb2xvcl9ncm91cCc6JzUnLCAnTGlzdF9wcmljZSc6JzE4MCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicxMDAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDE5PXsnbWFwTmFtZSc6J05ldyBZb3JrIFN0cmVldCcsICAgICAgJ0NvbG9yX2dyb3VwJzonNScsICdMaXN0X3ByaWNlJzonMjAwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzEwMCcsICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMjA9eydtYXBOYW1lJzonRnJlZSBwYXJraW5nJywgICAgICAgICAnQ29sb3JfZ3JvdXAnOicwJywgJ0xpc3RfcHJpY2UnOicwJywgICAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidub3RoaW5nIGhhcHBlbnMnfQpsYW5kMjE9eydtYXBOYW1lJzonS2VudHVja3kgU3RyZWV0JywgICAgICAnQ29sb3JfZ3JvdXAnOic2JywgJ0xpc3RfcHJpY2UnOicyMjAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMTUwJywgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CmxhbmQyMj17J21hcE5hbWUnOidBY2NpZGVudGFsaXR5JywgICAgICAgICdDb2xvcl9ncm91cCc6JzAnLCAnTGlzdF9wcmljZSc6JzAnLCAgICAnQ29uc3RydWN0aW9uX2Nvc3QnOicwJywgICAnUmVtYXJrcyc6J1B1bGxfYV9jaGFuY2VfY2FyZCd9CmxhbmQyMz17J21hcE5hbWUnOidJbmRpYW5hIFN0cmVldCcsICAgICAgICdDb2xvcl9ncm91cCc6JzYnLCAnTGlzdF9wcmljZSc6JzIyMCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicxNTAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDI0PXsnbWFwTmFtZSc6J0lsbGlub2lzIEF2ZW51ZScsICAgICAgJ0NvbG9yX2dyb3VwJzonNicsICdMaXN0X3ByaWNlJzonMjQwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzE1MCcsICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMjU9eydtYXBOYW1lJzonQiAmIE8gUmFpbHdheScsICAgICAgICAnQ29sb3JfZ3JvdXAnOicyJywgJ0xpc3RfcHJpY2UnOicyMDAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CmxhbmQyNj17J21hcE5hbWUnOidBdGxhbnRpYyBTdHJlZXQnLCAgICAgICdDb2xvcl9ncm91cCc6JzcnLCAnTGlzdF9wcmljZSc6JzI2MCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicxNTAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDI3PXsnbWFwTmFtZSc6J1ZlbnQgTm9yZCBzdHJlZXQnLCAgICAgJ0NvbG9yX2dyb3VwJzonNycsICdMaXN0X3ByaWNlJzonMjYwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzE1MCcsICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMjg9eydtYXBOYW1lJzonV2F0ZXIgY29tcGFueScsICAgICAgICAnQ29sb3JfZ3JvdXAnOic4JywgJ0xpc3RfcHJpY2UnOicxNTAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CmxhbmQyOT17J21hcE5hbWUnOidBdGxhbnRpYyBTdHJlZXQnLCAgICAgICdDb2xvcl9ncm91cCc6JzcnLCAnTGlzdF9wcmljZSc6JzI4MCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicxNTAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDMwPXsnbWFwTmFtZSc6J0dvIHRvIGphaWwnLCAgICAgICAgICAgJ0NvbG9yX2dyb3VwJzonMCcsICdMaXN0X3ByaWNlJzonMCcsICAgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzAnLCAgICdSZW1hcmtzJzonR28gdG8gamFpbCd9CmxhbmQzMT17J21hcE5hbWUnOidQYWNpZmljIFN0cmVldCcsICAgICAgICdDb2xvcl9ncm91cCc6JzknLCAnTGlzdF9wcmljZSc6JzMwMCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicyMDAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDMyPXsnbWFwTmFtZSc6J05vcnRoIENhcm9saW5hIFN0cmVldCcsJ0NvbG9yX2dyb3VwJzonOScsICdMaXN0X3ByaWNlJzonMzAwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzIwMCcsICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMzM9eydtYXBOYW1lJzonSm9pbnRfRnVuZCcsICAgICAgICAgICAnQ29sb3JfZ3JvdXAnOicwJywgJ0xpc3RfcHJpY2UnOicwJywgICAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidQdWxsX2Ffam9pbnRfZnVuZF9jYXJkJ30KbGFuZDM0PXsnbWFwTmFtZSc6J1Blbm5zeWx2YW5pYSBTdHJlZXQnLCAgJ0NvbG9yX2dyb3VwJzonOScsICdMaXN0X3ByaWNlJzonMzIwJywgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzIwMCcsICdSZW1hcmtzJzonTm9faW5mb3JtYXRpb24nfQpsYW5kMzU9eydtYXBOYW1lJzonU2hvcnRsaW5lIHJhaWx3YXknLCAgICAnQ29sb3JfZ3JvdXAnOicyJywgJ0xpc3RfcHJpY2UnOicyMDAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMCcsICAgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CmxhbmQzNj17J21hcE5hbWUnOidBY2NpZGVudGFsaXR5JywgICAgICAgICdDb2xvcl9ncm91cCc6JzAnLCAnTGlzdF9wcmljZSc6JzAnLCAgICAnQ29uc3RydWN0aW9uX2Nvc3QnOicwJywgICAnUmVtYXJrcyc6J1B1bGxfYV9jaGFuY2VfY2FyZCd9CmxhbmQzNz17J21hcE5hbWUnOidQYXJrIFBsYWNlJywgICAgICAgICAgICdDb2xvcl9ncm91cCc6JzEwJywnTGlzdF9wcmljZSc6JzM1MCcsICAnQ29uc3RydWN0aW9uX2Nvc3QnOicyMDAnLCAnUmVtYXJrcyc6J05vX2luZm9ybWF0aW9uJ30KbGFuZDM4PXsnbWFwTmFtZSc6J0V4Y2lzZSBUYXgnLCAgICAgICAgICAgJ0NvbG9yX2dyb3VwJzonMCcsICdMaXN0X3ByaWNlJzonMCcsICAgICdDb25zdHJ1Y3Rpb25fY29zdCc6JzAnLCAgICdSZW1hcmtzJzonSSBwYXkgJCAxMDAnfQpsYW5kMzk9eydtYXBOYW1lJzonQm9hcmQgd2FsaycsICAgICAgICAgICAnQ29sb3JfZ3JvdXAnOicxMCcsJ0xpc3RfcHJpY2UnOic0MDAnLCAgJ0NvbnN0cnVjdGlvbl9jb3N0JzonMjAwJywgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CgojIFVzZXIgaW5mb3JtYXRpb24KdXNlcl9saXN0MD1bMTUwMCwnZGVmJywnaGlqJ10KI01vdmVtZW50IHZhbHVlLE93bmVyc2hpcCxBc3NldCBtYW5hZ2VtZW50CgoKJycnCiNTZWFyY2gga2V5d29yZHMKI2ZvciBrIGluIGJ1aWxkaW5nMDpwcmludCBrCiNsYW5kPXsnbWFwTmFtZSc6JycsICdDb2xvcl9ncm91cCc6JzAnLCAnTGlzdF9wcmljZSc6JzAnLCAnQ29uc3RydWN0aW9uX2Nvc3QnOicwJywgJ1JlbWFya3MnOidOb19pbmZvcm1hdGlvbid9CgojIFVzZXIgaW5mb3JtYXRpb24KdXNlcl9saXN0MD1bJ2FiYycsJ2RlZicsJ2hpaiddCnByaW50IHVzZXJfbGlzdDBbMF0KCicnJwoKCgoKZGVmIG1haW4oKToKICAgICh3LGgpID0gKDg2MCw2MDApICAgICAgICAgICAgICAgICAgICAgICAjIOeUu+mdouOCteOCpOOCugogICAgcHlnYW1lLmluaXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHlnYW1l5Yid5pyf5YyWCiAgICBweWdhbWUuZGlzcGxheS5zZXRfbW9kZSgodywgaCksIDAsIDMyKSAgIyDnlLvpnaLoqK3lrpoKICAgIHNjcmVlbiA9IHB5Z2FtZS5kaXNwbGF5LmdldF9zdXJmYWNlKCkKICAgIGJnID0gcHlnYW1lLmltYWdlLmxvYWQoIm1vbm9wb2x5Qm9hcmQucG5nIikuY29udmVydF9hbHBoYSgpICAgICMg6IOM5pmv55S75YOP44Gu5Y+W5b6XCiAgICByZWN0X2JnID0gYmcuZ2V0X3JlY3QoKQogICAgCiAgICAjIHJlaW11CiAgICBwbGF5ZXIgPSBweWdhbWUuaW1hZ2UubG9hZCgidG9ob2RvdHNfYnl6bnAvMDFfMDBfcmVpbXUucG5nIikuY29udmVydF9hbHBoYSgpCiAgICBwbGF5ZXIyID0gcHlnYW1lLmltYWdlLmxvYWQoInRvaG9kb3RzX2J5em5wLzAxXzAxX3JlaW11LnBuZyIpLmNvbnZlcnRfYWxwaGEoKQogICAgcGxheWVyMyA9IHB5Z2FtZS5pbWFnZS5sb2FkKCJ0b2hvZG90c19ieXpucC9yZWltdV93b3Jrcy5qcGciKS5jb252ZXJ0X2FscGhhKCkKICAgIAogICAgIyBtYXJpc2EKICAgIHBsYXllcjQgPSBweWdhbWUuaW1hZ2UubG9hZCgidG9ob2RvdHNfYnl6bnAvMDJfMDBfbWFyaXNhLnBuZyIpLmNvbnZlcnRfYWxwaGEoKQogICAgcGxheWVyNSA9IHB5Z2FtZS5pbWFnZS5sb2FkKCJ0b2hvZG90c19ieXpucC8wMl8wMV9tYXJpc2EucG5nIikuY29udmVydF9hbHBoYSgpCiAgICBwbGF5ZXI2ID0gcHlnYW1lLmltYWdlLmxvYWQoInRvaG9kb3RzX2J5em5wL2ljb25fbWFyaXNhMDEtMi5qcGciKS5jb252ZXJ0X2FscGhhKCkgICAgCiAgICAKICAgICMgcmVtaXJpYQogICAgcGxheWVyNyA9IHB5Z2FtZS5pbWFnZS5sb2FkKCJ0b2hvZG90c19ieXpucC8wM18wMF9yZW1pcmlhLnBuZyIpLmNvbnZlcnRfYWxwaGEoKQogICAgcGxheWVyOCA9IHB5Z2FtZS5pbWFnZS5sb2FkKCJ0b2hvZG90c19ieXpucC8wM18wMV9yZW1pcmlhLnBuZyIpLmNvbnZlcnRfYWxwaGEoKQogICAgcGxheWVyOSA9IHB5Z2FtZS5pbWFnZS5sb2FkKCJ0b2hvZG90c19ieXpucC9yZW1pLnBuZyIpLmNvbnZlcnRfYWxwaGEoKQogICAgCiAgICAjIHNha3V5YQogICAgcGxheWVyMTE9IHB5Z2FtZS5pbWFnZS5sb2FkKCJ0b2hvZG90c19ieXpucC8wNF8wMF9zYWt1eWEucG5nIikuY29udmVydF9hbHBoYSgpCiAgICBwbGF5ZXIxMj0gcHlnYW1lLmltYWdlLmxvYWQoInRvaG9kb3RzX2J5em5wLzA0XzAxX3Nha3V5YS5wbmciKS5jb252ZXJ0X2FscGhhKCkKICAgIHBsYXllcjEzPSBweWdhbWUuaW1hZ2UubG9hZCgidG9ob2RvdHNfYnl6bnAvc2FrdS5wbmciKS5jb252ZXJ0X2FscGhhKCkgICAgCiAgICAKICAgIHJlY3RfcGxheWVyID0gcGxheWVyLmdldF9yZWN0KCkKICMgICByZWN0X3BsYXllci5jZW50ZXIgPSAoNTUwLDU1MCkKCgogICAgYWl1ZW89MAogICAgCiAgICB4eHg9NTUwCiAgICB5eXk9NTUwCiAgICAKICAgIAogICAgdXNlMDE9MjUwMAogICAgdXNlMDI9MjUwMAogICAgdXNlMDM9MjUwMAogICAgdXNlMDQ9MjUwMAogICAgICAgIAogICAgICAgIAogICAgZm9udCA9IHB5Z2FtZS5mb250LkZvbnQoTm9uZSwxNCkKCgoJCgogICAgd2hpbGUgKDEpOgogICAgICAgIHB5Z2FtZS5kaXNwbGF5LnVwZGF0ZSgpICAgICAgICAgICAgICMg55S76Z2i5pu05pawCiAgICAgICAgcHlnYW1lLnRpbWUud2FpdCgzMCkgICAgICAgICAgICAgICAgIyDmm7TmlrDmmYLplpPplpPpmpQKICAgICAgICBzY3JlZW4uZmlsbCgoMCwgMjAsIDAsIDApKSAgICAgICAgICAjIOeUu+mdouOBruiDjOaZr+iJsgogICAgICAgIHNjcmVlbi5ibGl0KGJnLCByZWN0X2JnKSAgICAgICAgICAgICMg6IOM5pmv55S75YOP44Gu5o+P55S7CiAgICAgICAgI3NjcmVlbi5ibGl0KHBsYXllciwgcmVjdF9wbGF5ZXIpICAgICMg44OX44Os44Kk44Ok44O855S75YOP44Gu5o+P55S7CgkKCQkKCXNjcmVlbi5ibGl0KHBsYXllcjMsKDYwMCwwKSkgICAgIyDjgqLjgqTjgrPjg7PnlLvlg4/jga7mj4/nlLsKCXNjcmVlbi5ibGl0KHBsYXllcjYsKDYwMCwxNTApKSAgICAKCXNjcmVlbi5ibGl0KHBsYXllcjksKDYwMCwzMDApKQoJc2NyZWVuLmJsaXQocGxheWVyMTMsKDYwMCw0NTApKQoKCQoJdGV4dCA9IGZvbnQucmVuZGVyKCJQb3NzZXNzaW9uIG1vbmV5ICAkMjUwMCIsVHJ1ZSwoMjU1LDI1NSwyNTUpKSAjIOaPj+eUu+OBmeOCi+aWh+Wtl+WIl+OBruioreWumgoJc2NyZWVuLmJsaXQodGV4dCwgWzcwMCw1XSkjIOaWh+Wtl+WIl+OBruihqOekuuS9jee9rgoJCgl0ZXh0MiA9IGZvbnQucmVuZGVyKCJQb3NzZXNzaW9uIG1vbmV5ICQyNTAwIixUcnVlLCgyNTUsMjU1LDI1NSkpICMg5o+P55S744GZ44KL5paH5a2X5YiX44Gu6Kit5a6aCglzY3JlZW4uYmxpdCh0ZXh0MiwgWzcwMCwxNTVdKSMg5paH5a2X5YiX44Gu6KGo56S65L2N572uCgkgCgl0ZXh0MyA9IGZvbnQucmVuZGVyKCJQb3NzZXNzaW9uIG1vbmV5ICQyNTAwIixUcnVlLCgyNTUsMjU1LDI1NSkpICMg5o+P55S744GZ44KL5paH5a2X5YiX44Gu6Kit5a6aCglzY3JlZW4uYmxpdCh0ZXh0MywgWzcwMCwzMDVdKSMg5paH5a2X5YiX44Gu6KGo56S65L2N572uCgkKCXRleHQ0ID0gZm9udC5yZW5kZXIoIlBvc3Nlc3Npb24gbW9uZXkgJDI1MDAiLFRydWUsKDI1NSwyNTUsMjU1KSkgIyDmj4/nlLvjgZnjgovmloflrZfliJfjga7oqK3lrpoKCXNjcmVlbi5ibGl0KHRleHQ0LCBbNzAwLDQ1NV0pIyDmloflrZfliJfjga7ooajnpLrkvY3nva4JCgkKICAgICNweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwoMCw4MCwwKSxSZWN0KDEwLDEwLDgwLDUwKSw1KSAgICMg5Zub6KeS5b2i44KS5o+P55S7KOWhl+OCiuOBpOOBtuOBl+OBquOBlykKICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwoMTY1LDc1LDE1MCksUmVjdCg3MDAsMTcsMTUsMjApKSAgICAjIOWbm+inkuW9ouOCkuaPj+eUuyjloZfjgorjgaTjgbbjgZcpCiAgIAkKCSAgIAoKCWlmIGFpdWVvPT0wOgoJCXNjcmVlbi5ibGl0KHBsYXllciwoeHh4LHl5eSkpICAgICMg44OX44Os44Kk44Ok44O855S75YOP44Gu5o+P55S7CgkJdGltZS5zbGVlcCgwLjUpCgkJYWl1ZW89YWl1ZW8rMQoJZWxpZiBhaXVlbz09MToKCQkJc2NyZWVuLmJsaXQocGxheWVyMiwoeHh4LHl5eSkpICMg44OX44Os44Kk44Ok44O8MueUu+WDj+OBruaPj+eUuwoJCQl0aW1lLnNsZWVwKDAuNSkKCQkJYWl1ZW89MAoJZWxzZSA6YWl1ZW89MAoKCXNjcmVlbi5ibGl0KHBsYXllcjUsKDIwLDU1MCkpICAgIyDjg5fjg6zjgqTjg6Tjg7znlLvlg4/jga7mj4/nlLsKCXNjcmVlbi5ibGl0KHBsYXllcjgsKDE4MCw1NTApKSAgICAjIOODl+ODrOOCpOODpOODvOeUu+WDj+OBruaPj+eUuwoJc2NyZWVuLmJsaXQocGxheWVyMTIsKDAsNTUwKSkgICAgIyDjg5fjg6zjgqTjg6Tjg7znlLvlg4/jga7mj4/nlLsKCQoJCgkKCiAgICAgICAgIyDntYLkuobnlKjjga7jgqTjg5njg7Pjg4jlh6bnkIYKICAgICAgICBmb3IgZXZlbnQgaW4gcHlnYW1lLmV2ZW50LmdldCgpOgogICAgICAgICAgICBpZiBldmVudC50eXBlID09IFFVSVQ6ICAgICAgICAgICMg6ZaJ44GY44KL44Oc44K/44Oz44GM5oq844GV44KM44Gf44Go44GNCiAgICAgICAgICAgICAgICBweWdhbWUucXVpdCgpCiAgICAgICAgICAgICAgICBzeXMuZXhpdCgpCiAgICAgICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gS0VZRE9XTjogICAgICAgIyDjgq3jg7zjgpLmirzjgZfjgZ/jgajjgY0KICAgICAgICAgICAgICAgIGlmIGV2ZW50LmtleSA9PSBLX0VTQ0FQRTogICAjIEVzY+OCreODvOOBjOaKvOOBleOCjOOBn+OBqOOBjQogICAgICAgICAgICAgICAgICAgIHB5Z2FtZS5xdWl0KCkKICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgICAgIG1haW4oKQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==