<?php
'visited' => false ,
'shortest_path' => INF,
'chk' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'gor' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'pet' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'spo' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'pet' => array ( 'time' => 3 , 'transport' => 'bus' ) ,
'kre' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 6 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'chk' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vas' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'sen' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'spo' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'nov' => array ( 'time' => 11 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'gor' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'isa' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'let' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'nov' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'vas' => array ( 'time' => 11 , 'transport' => 'foot' ) ,
'isa' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
'ras' => array ( 'time' => 7 , 'transport' => 'bus' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'nov' => array ( 'time' => 7 , 'transport' => 'bus' ) ,
'sen' => array ( 'time' => 3 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'vas' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'sen' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gor' => array ( 'time' => 6 , 'transport' => 'sub' ) ,
'let' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
'vla' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'ras' => array ( 'time' => 3 , 'transport' => 'foot' ) ,
'spo' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'gos' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vla' => array ( 'time' => 4 , 'transport' => 'sub' ) ,
'vit' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'teh' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'sen' => array ( 'time' => 4 , 'transport' => 'sub' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
'vit' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'sen' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'teh' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'vla' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'sen' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vit' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
)
)
) ;
function get_shortest_path( $paths , $start_point , $end_point ) // Получаем путь
{
//Проверка на существование искомых вершин
} else {
echo "Такой точки не существует $end_point \n " ;
return ;
}
} else {
echo "Такой точки не существует $start_point \n " ;
return ;
} else {
echo "Таких точек не существует $start_point , $end_point \n " ;
return ;
}
}
$current_point = $start_point ;
// делаем длинну пути стартовой точки = 0
$paths [ $current_point ] [ 'shortest_path' ] = 0 ;
// циклим пока точка до которой мы идем не станет true
while ( $paths [ $end_point ] [ 'visited' ] == false ) {
// смотрим соседей вершины и длинну пути и присваем if длина пути+пройденый путь меньше чем есть
$paths [ $current_point ] [ 'visited' ] = true ; // ставим посещение true
foreach ( $paths [ $current_point ] [ 'neighbors' ] as $name => $time_transport ) {
if ( $paths [ $name ] [ 'visited' ] == false ) {
$time = $time_transport [ 'time' ] ;
if ( $time + $paths [ $current_point ] [ 'shortest_path' ] < $paths [ $name ] [ 'shortest_path' ] ) {
$paths [ $name ] [ 'shortest_path' ] = $time + $paths [ $current_point ] [ 'shortest_path' ] ;
}
}
}
$min_path = INF; // переменная для сравнения
// делаем старт поинт вершину с наименьшем пути
foreach ( $paths as $name => $value ) {
if ( $paths [ $name ] [ 'visited' ] == false ) {
if ( $paths [ $name ] [ 'shortest_path' ] < $min_path ) {
$min_path = $paths [ $name ] [ 'shortest_path' ] ;
$current_point = $name ;
}
}
}
}
return $paths ;
}
function print_shortest_path( $paths , $start_point , $end_point ) // Печатаем путь
{
//Проверка на существование искомых вершин
} else {
echo "Такой точки не существует $end_point \n " ;
return ;
}
} else {
echo "Такой точки не существует $start_point \n " ;
return ;
} else {
echo "Таких точек не существует $start_point , $end_point \n " ;
return ;
}
}
'sub' => 'Из неё едешь на метро' ,
'foot' => 'Из неё идешь пешком' ,
'bus' => 'Из неё едешь на автобусе'
) ;
$min_path = INF;
$curent_point = $end_point ;
while ( $curent_point != $start_point ) { // циклим пока не дойдем до начальной точки
$made_path [ ] = $curent_point ;
foreach ( $paths [ $curent_point ] [ 'neighbors' ] as $name => $time_transport ) {
if ( $paths [ $name ] [ 'visited' ] == true ) {
if ( $paths [ $name ] [ 'shortest_path' ] < $min_path ) {
$transport_name = $time_transport [ 'transport' ] ;
$min_path = $paths [ $name ] [ 'shortest_path' ] ;
$curent_point = $name ;
}
}
}
}
$made_path [ ] = $start_point ;
echo "Начальная точка: $start_point \n " ;
foreach ( $made_path as $key => $path ) {
if ( $key == 0 ) {
continue ;
}
$previous_point = $paths [ $made_path [ $key - 1 ] ] ;
echo $transport_name [ $previous_point [ 'neighbors' ] [ $path ] [ 'transport' ] ]
. " до точки " . $path . " за "
. $previous_point [ 'neighbors' ] [ $path ] [ 'time' ] . " мин.\n " ;
}
echo "В итоге ты попадешь в точку $end_point за " . $paths [ $end_point ] [ 'shortest_path' ] . " мин.\n " ;
}
$start_point = 'pet' ;
$end_point = 'nov' ;
$shortest_path = get_shortest_path( $paths , $start_point , $end_point ) ;
print_shortest_path( $shortest_path , $start_point , $end_point ) ;
PD9waHAKCiRwYXRocyA9IGFycmF5KAogICAgJ3BldCcgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknY2hrJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAxMCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdidXMnKSwKICAgICAgICAJCSdnb3InICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDMsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAJKQogICAgKSwKCiAgICAnY2hrJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdwZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDEwLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2J1cycpLAogICAgICAgIAkJJ3NwbycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnZ29yJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdwZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDMsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQkna3JlJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA1LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDYsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAJKQogICAgKSwKICAgIAogICAgJ3NwbycgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknY2hrJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZhcycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTAsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgCSkKICAgICksCiAgICAKICAgICd2YXMnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NwbycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTAsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ25vdicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTEsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdrcmUnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2dvcicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNSwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAJKQogICAgKSwKICAgIAogICAgJ2xldCcgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknZHZvJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdkdm8nICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2lzYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdsZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDYsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdpc2EnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2R2bycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknbm92JyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA1LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnbm92JyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSd2YXMnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDExLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdpc2EnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDUsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgICAgIAkJJ3JhcycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdidXMnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAncmFzJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdub3YnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnZ29zJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSd2YXMnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ2R2bycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknZ29yJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ2xldCcgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQkndmxhJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwgICAgCiAgICAJKQogICAgKSwKICAgIAogICAgJ3NlbicgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQkncmFzJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdzcG8nICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZsYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSd2aXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQkndGVoJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgCSkKICAgICksCiAgICAKICAgICd2bGEnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NlbicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgICAgIAkJJ3ZpdCcgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAogICAgCiAgICAndml0JyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdzZW4nICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQkndGVoJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAyLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZsYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAoKICAgICd0ZWgnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NlbicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSd2aXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksICAKICAgIAkpCiAgICApCik7CgpmdW5jdGlvbiBnZXRfc2hvcnRlc3RfcGF0aCgkcGF0aHMsICRzdGFydF9wb2ludCwgJGVuZF9wb2ludCkgLy8g0J/QvtC70YPRh9Cw0LXQvCDQv9GD0YLRjAogewkKIAkKIAkvL9Cf0YDQvtCy0LXRgNC60LAg0L3QsCDRgdGD0YnQtdGB0YLQstC+0LLQsNC90LjQtSDQuNGB0LrQvtC80YvRhSDQstC10YDRiNC40L0KIAlpZiAoYXJyYXlfa2V5X2V4aXN0cygkc3RhcnRfcG9pbnQsICRwYXRocykpIHsKIAkJaWYgKGFycmF5X2tleV9leGlzdHMoJGVuZF9wb2ludCwgJHBhdGhzKSkgewogCSAJCiAJCX1lbHNlIHsKIAkgCWVjaG8gItCi0LDQutC+0Lkg0YLQvtGH0LrQuCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCICRlbmRfcG9pbnQgXG4iOwogCSAJcmV0dXJuOwogCQl9CiAJfWVsc2UgewogCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkZW5kX3BvaW50LCAkcGF0aHMpKSB7CiAJIAllY2hvICLQotCw0LrQvtC5INGC0L7Rh9C60Lgg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiAkc3RhcnRfcG9pbnQgXG4iOwogCSAJcmV0dXJuOwogCQl9ZWxzZSB7CiAJIAllY2hvICLQotCw0LrQuNGFINGC0L7Rh9C10Log0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiAkc3RhcnRfcG9pbnQsICRlbmRfcG9pbnQgXG4iOwogCSAJcmV0dXJuOwogCQl9CiAJfQogCQogCQogCSAKIAkKIAkkY3VycmVudF9wb2ludCA9ICRzdGFydF9wb2ludDsKIAkvLyDQtNC10LvQsNC10Lwg0LTQu9C40L3QvdGDINC/0YPRgtC4INGB0YLQsNGA0YLQvtCy0L7QuSDRgtC+0YfQutC4ID0gMAogCSRwYXRoc1skY3VycmVudF9wb2ludF1bJ3Nob3J0ZXN0X3BhdGgnXSA9IDA7IAoJLy8g0YbQuNC60LvQuNC8INC/0L7QutCwINGC0L7Rh9C60LAg0LTQviDQutC+0YLQvtGA0L7QuSDQvNGLINC40LTQtdC8INC90LUg0YHRgtCw0L3QtdGCIHRydWUKIAl3aGlsZSAoJHBhdGhzWyRlbmRfcG9pbnRdWyd2aXNpdGVkJ10gPT0gZmFsc2UpIHsgCiAJCS8vINGB0LzQvtGC0YDQuNC8INGB0L7RgdC10LTQtdC5INCy0LXRgNGI0LjQvdGLINC4INC00LvQuNC90L3RgyDQv9GD0YLQuCDQuCDQv9GA0LjRgdCy0LDQtdC8IGlmINC00LvQuNC90LAg0L/Rg9GC0Lgr0L/RgNC+0LnQtNC10L3Ri9C5INC/0YPRgtGMINC80LXQvdGM0YjQtSDRh9C10Lwg0LXRgdGC0YwKIAkJJHBhdGhzWyRjdXJyZW50X3BvaW50XVsndmlzaXRlZCddID0gdHJ1ZTsgLy8g0YHRgtCw0LLQuNC8INC/0L7RgdC10YnQtdC90LjQtSB0cnVlIAogCQkKIAkJZm9yZWFjaCAoJHBhdGhzWyRjdXJyZW50X3BvaW50XVsnbmVpZ2hib3JzJ10gYXMgJG5hbWUgPT4gJHRpbWVfdHJhbnNwb3J0KSB7IAoJCQlpZiAoJHBhdGhzWyRuYW1lXVsndmlzaXRlZCddID09IGZhbHNlKSB7CgkJCQkkdGltZSA9ICR0aW1lX3RyYW5zcG9ydFsndGltZSddOwoJCQkJaWYgKCR0aW1lKyRwYXRoc1skY3VycmVudF9wb2ludF1bJ3Nob3J0ZXN0X3BhdGgnXSA8ICRwYXRoc1skbmFtZV1bJ3Nob3J0ZXN0X3BhdGgnXSkgewoJCQkJCSRwYXRoc1skbmFtZV1bJ3Nob3J0ZXN0X3BhdGgnXSA9ICR0aW1lKyRwYXRoc1skY3VycmVudF9wb2ludF1bJ3Nob3J0ZXN0X3BhdGgnXTsKCQkJCX0KCQkJfSAKCQl9CgkJJG1pbl9wYXRoID0gSU5GOyAvLyDQv9C10YDQtdC80LXQvdC90LDRjyDQtNC70Y8g0YHRgNCw0LLQvdC10L3QuNGPCgkJLy8g0LTQtdC70LDQtdC8INGB0YLQsNGA0YIg0L/QvtC40L3RgiDQstC10YDRiNC40L3RgyDRgSDQvdCw0LjQvNC10L3RjNGI0LXQvCDQv9GD0YLQuAoJCWZvcmVhY2ggKCRwYXRocyBhcyAgJG5hbWUgPT4gJHZhbHVlKSB7IAoJCQlpZiAoJHBhdGhzWyRuYW1lXVsndmlzaXRlZCddID09IGZhbHNlICkgewoJCQkJaWYgKCRwYXRoc1skbmFtZV1bJ3Nob3J0ZXN0X3BhdGgnXSA8ICRtaW5fcGF0aCkgewoJCQkJCSRtaW5fcGF0aCA9ICRwYXRoc1skbmFtZV1bJ3Nob3J0ZXN0X3BhdGgnXTsKCQkJCQkkY3VycmVudF9wb2ludCA9ICRuYW1lOwoJCQkJfQoJCQl9CgkJfQogCX0KIAlyZXR1cm4gJHBhdGhzOwp9CQkKCmZ1bmN0aW9uIHByaW50X3Nob3J0ZXN0X3BhdGgoJHBhdGhzLCAkc3RhcnRfcG9pbnQsICRlbmRfcG9pbnQpIC8vINCf0LXRh9Cw0YLQsNC10Lwg0L/Rg9GC0YwKewoJCgkvL9Cf0YDQvtCy0LXRgNC60LAg0L3QsCDRgdGD0YnQtdGB0YLQstC+0LLQsNC90LjQtSDQuNGB0LrQvtC80YvRhSDQstC10YDRiNC40L0KIAlpZiAoYXJyYXlfa2V5X2V4aXN0cygkc3RhcnRfcG9pbnQsICRwYXRocykpIHsKIAkJaWYgKGFycmF5X2tleV9leGlzdHMoJGVuZF9wb2ludCwgJHBhdGhzKSkgewogCSAJCiAJCX1lbHNlIHsKIAkgCWVjaG8gItCi0LDQutC+0Lkg0YLQvtGH0LrQuCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCICRlbmRfcG9pbnQgXG4iOwogCSAJcmV0dXJuOwogCQl9CiAJfWVsc2UgewogCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkZW5kX3BvaW50LCAkcGF0aHMpKSB7CiAJIAllY2hvICLQotCw0LrQvtC5INGC0L7Rh9C60Lgg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiAkc3RhcnRfcG9pbnQgXG4iOwogCSAJcmV0dXJuOwogCQl9ZWxzZSB7CiAJIAllY2hvICLQotCw0LrQuNGFINGC0L7Rh9C10Log0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiAkc3RhcnRfcG9pbnQsICRlbmRfcG9pbnQgXG4iOwogCSAJcmV0dXJuOwogCQl9CiAJfQoJCgkkdHJhbnNwb3J0X25hbWUgPSBhcnJheSgKCQkJCSdzdWInID0+ICfQmNC3INC90LXRkSDQtdC00LXRiNGMINC90LAg0LzQtdGC0YDQvicsCgkJCQknZm9vdCcgPT4gJ9CY0Lcg0L3QtdGRINC40LTQtdGI0Ywg0L/QtdGI0LrQvtC8JywKCQkJCSdidXMnID0+ICfQmNC3INC90LXRkSDQtdC00LXRiNGMINC90LAg0LDQstGC0L7QsdGD0YHQtScKCSk7CgkkbWluX3BhdGggPSBJTkY7CgkkY3VyZW50X3BvaW50ID0gJGVuZF9wb2ludDsKICAgIHdoaWxlICgkY3VyZW50X3BvaW50ICE9ICRzdGFydF9wb2ludCkgeyAgLy8g0YbQuNC60LvQuNC8INC/0L7QutCwINC90LUg0LTQvtC50LTQtdC8INC00L4g0L3QsNGH0LDQu9GM0L3QvtC5INGC0L7Rh9C60LgKICAgIAkkbWFkZV9wYXRoW10gPSAkY3VyZW50X3BvaW50OwogICAgCWZvcmVhY2ggKCRwYXRoc1skY3VyZW50X3BvaW50XVsnbmVpZ2hib3JzJ10gYXMgICRuYW1lID0+ICR0aW1lX3RyYW5zcG9ydCkgeyAKCQkJaWYgKCRwYXRoc1skbmFtZV1bJ3Zpc2l0ZWQnXSA9PSB0cnVlICkgewoJCQkJaWYgKCRwYXRoc1skbmFtZV1bJ3Nob3J0ZXN0X3BhdGgnXSA8ICRtaW5fcGF0aCkgewoJCQkJCSR0cmFuc3BvcnRfbmFtZSA9ICR0aW1lX3RyYW5zcG9ydFsndHJhbnNwb3J0J107CgkJCQkJJG1pbl9wYXRoID0gJHBhdGhzWyRuYW1lXVsnc2hvcnRlc3RfcGF0aCddOwoJCQkJCSRjdXJlbnRfcG9pbnQgPSAkbmFtZTsKCQkJCX0KCQkJfQoJCX0KICAgIH0gCiAgICAkbWFkZV9wYXRoW10gPSAkc3RhcnRfcG9pbnQ7CiAgICAkbWFkZV9wYXRoICAgPSBhcnJheV9yZXZlcnNlICgkbWFkZV9wYXRoKTsKCWVjaG8gItCd0LDRh9Cw0LvRjNC90LDRjyDRgtC+0YfQutCwOiAkc3RhcnRfcG9pbnRcbiI7Cglmb3JlYWNoICgkbWFkZV9wYXRoIGFzICRrZXkgPT4gJHBhdGgpIHsKCQlpZiAoJGtleSA9PSAwICkgewoJCQljb250aW51ZTsKCQl9CgkJJHByZXZpb3VzX3BvaW50ID0gJHBhdGhzWyRtYWRlX3BhdGhbJGtleS0xXV07CgkJZWNobyAkdHJhbnNwb3J0X25hbWVbJHByZXZpb3VzX3BvaW50WyduZWlnaGJvcnMnXVskcGF0aF1bJ3RyYW5zcG9ydCddXQoJCS4iINC00L4g0YLQvtGH0LrQuCAiLiRwYXRoLiIg0LfQsCAiCgkJLiRwcmV2aW91c19wb2ludFsnbmVpZ2hib3JzJ11bJHBhdGhdWyd0aW1lJ10uIiDQvNC40L0uXG4iOwoJfQoJZWNobyAi0JIg0LjRgtC+0LPQtSDRgtGLINC/0L7Qv9Cw0LTQtdGI0Ywg0LIg0YLQvtGH0LrRgyAkZW5kX3BvaW50INC30LAgIi4kcGF0aHNbJGVuZF9wb2ludF1bJ3Nob3J0ZXN0X3BhdGgnXS4iINC80LjQvS5cbiI7Cn0KCiRzdGFydF9wb2ludCA9ICdwZXQnOwokZW5kX3BvaW50ID0gJ25vdic7Cgokc2hvcnRlc3RfcGF0aCA9IGdldF9zaG9ydGVzdF9wYXRoKCRwYXRocywkc3RhcnRfcG9pbnQsICRlbmRfcG9pbnQpOwpwcmludF9zaG9ydGVzdF9wYXRoKCRzaG9ydGVzdF9wYXRoLCRzdGFydF9wb2ludCwgJGVuZF9wb2ludCk7CgoJCQoJCQoJCQoJCQogCgkJCgkJ