<?php
//$colors = $_GET['color'];//Thought these variables made more sense up here.
$gradient = "red,orange,yellow,green";//$_GET['gradient'];
if (isset($colors)){ //added these to avoid sending a blank page with image headers. header('Content-Type: image/png'); $type = 'color';
} else if (isset($gradient)){ header('Content-Type: image/png'); $type = 'gradient';
}
"pink" => "FFC0CB",
"lightpink" => "FFB6C1",
"hotpink" => "FF69B4",
"deeppink" => "FF1493",
"palevioletred" => "DB7093",
"mediumvioletred" => "C71585",
"lightsalmon" => "FFA07A",
"salmon" => "FA8072",
"darksalmon" => "E9967A",
"lightcoral" => "F08080",
"indianred" => "CD5C5C",
"crimson" => "DC143C",
"firebrick" => "B22222",
"darkred" => "8B0000",
"red" => "FF0000",
"orangered" => "FF4500",
"tomato" => "FF6347",
"coral" => "FF7F50",
"darkorange" => "FF8C00",
"orange" => "FFA500",
"gold" => "FFD700",
"yellow" => "FFFF00",
"lightyellow" => "FFFFE0",
"lemonchiffon" => "FFFACD",
"lightgoldenrodyellow" => "FAFAD2",
"papayawhip" => "FFEFD5",
"moccasin" => "FFE4B5",
"peachpuff" => "FFDAB9",
"palegoldenrod" => "EEE8AA",
"khaki" => "F0E68C",
"darkkhaki" => "BDB76B",
"cornsilk" => "FFF8DC",
"blanchedalmond" => "FFEBCD",
"bisque" => "FFE4C4",
"navajowhite" => "FFDEAD",
"wheat" => "F5DEB3",
"burlywood" => "DEB887",
"tan" => "D2B48C",
"rosybrown" => "BC8F8F",
"sandybrown" => "F4A460",
"goldenrod" => "DAA520",
"darkgoldenrod" => "B8860B",
"peru" => "CD853F",
"chocolate" => "D2691E",
"saddlebrown" => "8B4513",
"sienna" => "A0522D",
"brown" => "A52A2A",
"maroon" => "800000",
"darkolivegreen" => "556B2F",
"olive" => "808000",
"olivedrab" => "6B8E23",
"yellowgreen" => "9ACD32",
"limegreen" => "32CD32",
"lime" => "00FF00",
"lawngreen" => "7CFC00",
"chartreuse" => "7FFF00",
"greenyellow" => "ADFF2F",
"springgreen" => "00FF7F",
"mediumspringgreen" => "00FA9A",
"lightgreen" => "90EE90",
"palegreen" => "98FB98",
"darkseagreen" => "8FBC8F",
"mediumseagreen" => "3CB371",
"seagreen" => "2E8B57",
"forestgreen" => "228B22",
"green" => "008000",
"darkgreen" => "006400",
"mediumaquamarine" => "66CDAA",
"aqua" => "00FFFF",
"cyan" => "00FFFF",
"lightcyan" => "E0FFFF",
"paleturquoise" => "AFEEEE",
"aquamarine" => "7FFFD4",
"turquoise" => "40E0D0",
"mediumturquoise" => "48D1CC",
"darkturquoise" => "00CED1",
"lightseagreen" => "20B2AA",
"cadetblue" => "5F9EA0",
"darkcyan" => "008B8B",
"teal" => "008080",
"lightsteelblue" => "B0C4DE",
"powderblue" => "B0E0E6",
"lightblue" => "ADD8E6",
"skyblue" => "87CEEB",
"lightskyblue" => "87CEFA",
"deepskyblue" => "00BFFF",
"dodgerblue" => "1E90FF",
"cornflowerblue" => "6495ED",
"steelblue" => "4682B4",
"royalblue" => "4169E1",
"blue" => "0000FF",
"mediumblue" => "0000CD",
"darkblue" => "00008B",
"navy" => "000080",
"midnightblue" => "191970",
"lavender" => "E6E6FA",
"thistle" => "D8BFD8",
"plum" => "DDA0DD",
"violet" => "EE82EE",
"orchid" => "DA70D6",
"fuchsia" => "FF00FF",
"magenta" => "FF00FF",
"mediumorchid" => "BA55D3",
"mediumpurple" => "9370DB",
"blueviolet" => "8A2BE2",
"darkviolet" => "9400D3",
"darkorchid" => "9932CC",
"darkmagenta" => "8B008B",
"purple" => "800080",
"indigo" => "4B0082",
"darkslateblue" => "483D8B",
"slateblue" => "6A5ACD",
"mediumslateblue" => "7B68EE",
"white" => "FFFFFF",
"snow" => "FFFAFA",
"honeydew" => "F0FFF0",
"mintcream" => "F5FFFA",
"azure" => "F0FFFF",
"aliceblue" => "F0F8FF",
"ghostwhite" => "F8F8FF",
"whitesmoke" => "F5F5F5",
"seashell" => "FFF5EE",
"beige" => "F5F5DC",
"oldlace" => "FDF5E6",
"floralwhite" => "FFFAF0",
"ivory" => "FFFFF0",
"antiquewhite" => "FAEBD7",
"linen" => "FAF0E6",
"lavenderblush" => "FFF0F5",
"mistyrose" => "FFE4E1",
"gainsboro" => "DCDCDC",
"lightgray" => "D3D3D3",
"lightgrey" => "D3D3D3",
"silver" => "C0C0C0",
"darkgray" => "A9A9A9",
"darkgrey" => "A9A9A9",
"gray" => "808080",
"grey" => "808080",
"dimgray" => "696969",
"dimgrey" => "696969",
"lightslategray" => "778899",
"lightslategrey" => "778899",
"slategray" => "708090",
"slategrey" => "708090",
"darkslategray" => "2F4F4F",
"darkslategrey" => "2F4F4F",
"black" => "000000"
);
function rgbFromHex($hexValue){
if (strlen($hexValue) == 3) { //shorthand check }
else if (strlen($hexValue) == 6){ //standard hex color }
else{
$r = 0;
$g = 0;
$b = 0;
}
$r,
$g,
$b
);
return $rgb;
}
function getHexByName($name){
global $colornames;
if (isset($colornames[$name])) { return $colornames[$name];
}
else {
return null;
}
}
/*
* $input - a string, possibly comma-separated list of HexValues and/or color names
*
* returns an array of [r, g, b] arrays
*/
function parseColors($input){
foreach($parts as $color){
$byName = getHexByName($color);
} else{
if (strpos($byName, ",") !== FALSE){ // we're dealing with a multi-part name, eg: roygbiv
foreach(parseColors($byName) as $col){
}
} else{
}
}
}
return $colorArray;
}
/*
* $colorArray - an array of [r, g, b] arrays.
*
* returns an array of [r, g, b] arrays.
*/
function interpolateGradient($colorArray){
$steps = 200;
$arrLen = count($colorArray) - 1; $stepsPerGrad = $steps/$arrLen;
for($step = 0;$step < $steps; $step++){
$index = floor($step/$steps*$arrLen); $curr = $colorArray[$index];
$next = $colorArray[$index+1];
floor($curr[0] + ($step % $stepsPerGrad) / $stepsPerGrad * ($next[0] - $curr[0])), floor($curr[1] + ($step % $stepsPerGrad) / $stepsPerGrad * ($next[1] - $curr[1])), floor($curr[2] + ($step % $stepsPerGrad) / $stepsPerGrad * ($next[2] - $curr[2])) ));
}
return $output;
}
/*
* $colorArray - an array of [r, g, b] arrays.
*
* returns an image.
*/
function createSwatch($colorArray){
$colWidth = 200 / count($colorArray); $x = 0;
foreach($colorArray as $rgb) {
$x += $colWidth;
}
}
if ($type == 'color') {
} else if ($type == 'gradient'){
$colorArray = interpolateGradient
(parseColors
(strtolower($gradient))); } else {
echo 'GO AWAY';
}
createSwatch($colorArray);
}
?>
PD9waHAKLy8kY29sb3JzID0gJF9HRVRbJ2NvbG9yJ107Ly9UaG91Z2h0IHRoZXNlIHZhcmlhYmxlcyBtYWRlIG1vcmUgc2Vuc2UgdXAgaGVyZS4KJGdyYWRpZW50ID0gInJlZCxvcmFuZ2UseWVsbG93LGdyZWVuIjsvLyRfR0VUWydncmFkaWVudCddOwppZiAoaXNzZXQoJGNvbG9ycykpeyAvL2FkZGVkIHRoZXNlIHRvIGF2b2lkIHNlbmRpbmcgYSBibGFuayBwYWdlIHdpdGggaW1hZ2UgaGVhZGVycy4gCiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nJyk7CiAgICAkdHlwZSA9ICdjb2xvcic7Cn0gZWxzZSBpZiAoaXNzZXQoJGdyYWRpZW50KSl7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nJyk7CiAgICAkdHlwZSA9ICdncmFkaWVudCc7Cn0KCiRjb2xvcm5hbWVzID0gYXJyYXkoCiAgICAicGluayIgPT4gIkZGQzBDQiIsCiAgICAibGlnaHRwaW5rIiA9PiAiRkZCNkMxIiwKICAgICJob3RwaW5rIiA9PiAiRkY2OUI0IiwKICAgICJkZWVwcGluayIgPT4gIkZGMTQ5MyIsCiAgICAicGFsZXZpb2xldHJlZCIgPT4gIkRCNzA5MyIsCiAgICAibWVkaXVtdmlvbGV0cmVkIiA9PiAiQzcxNTg1IiwKICAgICJsaWdodHNhbG1vbiIgPT4gIkZGQTA3QSIsCiAgICAic2FsbW9uIiA9PiAiRkE4MDcyIiwKICAgICJkYXJrc2FsbW9uIiA9PiAiRTk5NjdBIiwKICAgICJsaWdodGNvcmFsIiA9PiAiRjA4MDgwIiwKICAgICJpbmRpYW5yZWQiID0+ICJDRDVDNUMiLAogICAgImNyaW1zb24iID0+ICJEQzE0M0MiLAogICAgImZpcmVicmljayIgPT4gIkIyMjIyMiIsCiAgICAiZGFya3JlZCIgPT4gIjhCMDAwMCIsCiAgICAicmVkIiA9PiAiRkYwMDAwIiwKICAgICJvcmFuZ2VyZWQiID0+ICJGRjQ1MDAiLAogICAgInRvbWF0byIgPT4gIkZGNjM0NyIsCiAgICAiY29yYWwiID0+ICJGRjdGNTAiLAogICAgImRhcmtvcmFuZ2UiID0+ICJGRjhDMDAiLAogICAgIm9yYW5nZSIgPT4gIkZGQTUwMCIsCiAgICAiZ29sZCIgPT4gIkZGRDcwMCIsCiAgICAieWVsbG93IiA9PiAiRkZGRjAwIiwKICAgICJsaWdodHllbGxvdyIgPT4gIkZGRkZFMCIsCiAgICAibGVtb25jaGlmZm9uIiA9PiAiRkZGQUNEIiwKICAgICJsaWdodGdvbGRlbnJvZHllbGxvdyIgPT4gIkZBRkFEMiIsCiAgICAicGFwYXlhd2hpcCIgPT4gIkZGRUZENSIsCiAgICAibW9jY2FzaW4iID0+ICJGRkU0QjUiLAogICAgInBlYWNocHVmZiIgPT4gIkZGREFCOSIsCiAgICAicGFsZWdvbGRlbnJvZCIgPT4gIkVFRThBQSIsCiAgICAia2hha2kiID0+ICJGMEU2OEMiLAogICAgImRhcmtraGFraSIgPT4gIkJEQjc2QiIsCiAgICAiY29ybnNpbGsiID0+ICJGRkY4REMiLAogICAgImJsYW5jaGVkYWxtb25kIiA9PiAiRkZFQkNEIiwKICAgICJiaXNxdWUiID0+ICJGRkU0QzQiLAogICAgIm5hdmFqb3doaXRlIiA9PiAiRkZERUFEIiwKICAgICJ3aGVhdCIgPT4gIkY1REVCMyIsCiAgICAiYnVybHl3b29kIiA9PiAiREVCODg3IiwKICAgICJ0YW4iID0+ICJEMkI0OEMiLAogICAgInJvc3licm93biIgPT4gIkJDOEY4RiIsCiAgICAic2FuZHlicm93biIgPT4gIkY0QTQ2MCIsCiAgICAiZ29sZGVucm9kIiA9PiAiREFBNTIwIiwKICAgICJkYXJrZ29sZGVucm9kIiA9PiAiQjg4NjBCIiwKICAgICJwZXJ1IiA9PiAiQ0Q4NTNGIiwKICAgICJjaG9jb2xhdGUiID0+ICJEMjY5MUUiLAogICAgInNhZGRsZWJyb3duIiA9PiAiOEI0NTEzIiwKICAgICJzaWVubmEiID0+ICJBMDUyMkQiLAogICAgImJyb3duIiA9PiAiQTUyQTJBIiwKICAgICJtYXJvb24iID0+ICI4MDAwMDAiLAogICAgImRhcmtvbGl2ZWdyZWVuIiA9PiAiNTU2QjJGIiwKICAgICJvbGl2ZSIgPT4gIjgwODAwMCIsCiAgICAib2xpdmVkcmFiIiA9PiAiNkI4RTIzIiwKICAgICJ5ZWxsb3dncmVlbiIgPT4gIjlBQ0QzMiIsCiAgICAibGltZWdyZWVuIiA9PiAiMzJDRDMyIiwKICAgICJsaW1lIiA9PiAiMDBGRjAwIiwKICAgICJsYXduZ3JlZW4iID0+ICI3Q0ZDMDAiLAogICAgImNoYXJ0cmV1c2UiID0+ICI3RkZGMDAiLAogICAgImdyZWVueWVsbG93IiA9PiAiQURGRjJGIiwKICAgICJzcHJpbmdncmVlbiIgPT4gIjAwRkY3RiIsCiAgICAibWVkaXVtc3ByaW5nZ3JlZW4iID0+ICIwMEZBOUEiLAogICAgImxpZ2h0Z3JlZW4iID0+ICI5MEVFOTAiLAogICAgInBhbGVncmVlbiIgPT4gIjk4RkI5OCIsCiAgICAiZGFya3NlYWdyZWVuIiA9PiAiOEZCQzhGIiwKICAgICJtZWRpdW1zZWFncmVlbiIgPT4gIjNDQjM3MSIsCiAgICAic2VhZ3JlZW4iID0+ICIyRThCNTciLAogICAgImZvcmVzdGdyZWVuIiA9PiAiMjI4QjIyIiwKICAgICJncmVlbiIgPT4gIjAwODAwMCIsCiAgICAiZGFya2dyZWVuIiA9PiAiMDA2NDAwIiwKICAgICJtZWRpdW1hcXVhbWFyaW5lIiA9PiAiNjZDREFBIiwKICAgICJhcXVhIiA9PiAiMDBGRkZGIiwKICAgICJjeWFuIiA9PiAiMDBGRkZGIiwKICAgICJsaWdodGN5YW4iID0+ICJFMEZGRkYiLAogICAgInBhbGV0dXJxdW9pc2UiID0+ICJBRkVFRUUiLAogICAgImFxdWFtYXJpbmUiID0+ICI3RkZGRDQiLAogICAgInR1cnF1b2lzZSIgPT4gIjQwRTBEMCIsCiAgICAibWVkaXVtdHVycXVvaXNlIiA9PiAiNDhEMUNDIiwKICAgICJkYXJrdHVycXVvaXNlIiA9PiAiMDBDRUQxIiwKICAgICJsaWdodHNlYWdyZWVuIiA9PiAiMjBCMkFBIiwKICAgICJjYWRldGJsdWUiID0+ICI1RjlFQTAiLAogICAgImRhcmtjeWFuIiA9PiAiMDA4QjhCIiwKICAgICJ0ZWFsIiA9PiAiMDA4MDgwIiwKICAgICJsaWdodHN0ZWVsYmx1ZSIgPT4gIkIwQzRERSIsCiAgICAicG93ZGVyYmx1ZSIgPT4gIkIwRTBFNiIsCiAgICAibGlnaHRibHVlIiA9PiAiQUREOEU2IiwKICAgICJza3libHVlIiA9PiAiODdDRUVCIiwKICAgICJsaWdodHNreWJsdWUiID0+ICI4N0NFRkEiLAogICAgImRlZXBza3libHVlIiA9PiAiMDBCRkZGIiwKICAgICJkb2RnZXJibHVlIiA9PiAiMUU5MEZGIiwKICAgICJjb3JuZmxvd2VyYmx1ZSIgPT4gIjY0OTVFRCIsCiAgICAic3RlZWxibHVlIiA9PiAiNDY4MkI0IiwKICAgICJyb3lhbGJsdWUiID0+ICI0MTY5RTEiLAogICAgImJsdWUiID0+ICIwMDAwRkYiLAogICAgIm1lZGl1bWJsdWUiID0+ICIwMDAwQ0QiLAogICAgImRhcmtibHVlIiA9PiAiMDAwMDhCIiwKICAgICJuYXZ5IiA9PiAiMDAwMDgwIiwKICAgICJtaWRuaWdodGJsdWUiID0+ICIxOTE5NzAiLAogICAgImxhdmVuZGVyIiA9PiAiRTZFNkZBIiwKICAgICJ0aGlzdGxlIiA9PiAiRDhCRkQ4IiwKICAgICJwbHVtIiA9PiAiRERBMEREIiwKICAgICJ2aW9sZXQiID0+ICJFRTgyRUUiLAogICAgIm9yY2hpZCIgPT4gIkRBNzBENiIsCiAgICAiZnVjaHNpYSIgPT4gIkZGMDBGRiIsCiAgICAibWFnZW50YSIgPT4gIkZGMDBGRiIsCiAgICAibWVkaXVtb3JjaGlkIiA9PiAiQkE1NUQzIiwKICAgICJtZWRpdW1wdXJwbGUiID0+ICI5MzcwREIiLAogICAgImJsdWV2aW9sZXQiID0+ICI4QTJCRTIiLAogICAgImRhcmt2aW9sZXQiID0+ICI5NDAwRDMiLAogICAgImRhcmtvcmNoaWQiID0+ICI5OTMyQ0MiLAogICAgImRhcmttYWdlbnRhIiA9PiAiOEIwMDhCIiwKICAgICJwdXJwbGUiID0+ICI4MDAwODAiLAogICAgImluZGlnbyIgPT4gIjRCMDA4MiIsCiAgICAiZGFya3NsYXRlYmx1ZSIgPT4gIjQ4M0Q4QiIsCiAgICAic2xhdGVibHVlIiA9PiAiNkE1QUNEIiwKICAgICJtZWRpdW1zbGF0ZWJsdWUiID0+ICI3QjY4RUUiLAogICAgIndoaXRlIiA9PiAiRkZGRkZGIiwKICAgICJzbm93IiA9PiAiRkZGQUZBIiwKICAgICJob25leWRldyIgPT4gIkYwRkZGMCIsCiAgICAibWludGNyZWFtIiA9PiAiRjVGRkZBIiwKICAgICJhenVyZSIgPT4gIkYwRkZGRiIsCiAgICAiYWxpY2VibHVlIiA9PiAiRjBGOEZGIiwKICAgICJnaG9zdHdoaXRlIiA9PiAiRjhGOEZGIiwKICAgICJ3aGl0ZXNtb2tlIiA9PiAiRjVGNUY1IiwKICAgICJzZWFzaGVsbCIgPT4gIkZGRjVFRSIsCiAgICAiYmVpZ2UiID0+ICJGNUY1REMiLAogICAgIm9sZGxhY2UiID0+ICJGREY1RTYiLAogICAgImZsb3JhbHdoaXRlIiA9PiAiRkZGQUYwIiwKICAgICJpdm9yeSIgPT4gIkZGRkZGMCIsCiAgICAiYW50aXF1ZXdoaXRlIiA9PiAiRkFFQkQ3IiwKICAgICJsaW5lbiIgPT4gIkZBRjBFNiIsCiAgICAibGF2ZW5kZXJibHVzaCIgPT4gIkZGRjBGNSIsCiAgICAibWlzdHlyb3NlIiA9PiAiRkZFNEUxIiwKICAgICJnYWluc2Jvcm8iID0+ICJEQ0RDREMiLAogICAgImxpZ2h0Z3JheSIgPT4gIkQzRDNEMyIsCiAgICAibGlnaHRncmV5IiA9PiAiRDNEM0QzIiwKICAgICJzaWx2ZXIiID0+ICJDMEMwQzAiLAogICAgImRhcmtncmF5IiA9PiAiQTlBOUE5IiwKICAgICJkYXJrZ3JleSIgPT4gIkE5QTlBOSIsCiAgICAiZ3JheSIgPT4gIjgwODA4MCIsCiAgICAiZ3JleSIgPT4gIjgwODA4MCIsCiAgICAiZGltZ3JheSIgPT4gIjY5Njk2OSIsCiAgICAiZGltZ3JleSIgPT4gIjY5Njk2OSIsCiAgICAibGlnaHRzbGF0ZWdyYXkiID0+ICI3Nzg4OTkiLAogICAgImxpZ2h0c2xhdGVncmV5IiA9PiAiNzc4ODk5IiwKICAgICJzbGF0ZWdyYXkiID0+ICI3MDgwOTAiLAogICAgInNsYXRlZ3JleSIgPT4gIjcwODA5MCIsCiAgICAiZGFya3NsYXRlZ3JheSIgPT4gIjJGNEY0RiIsCiAgICAiZGFya3NsYXRlZ3JleSIgPT4gIjJGNEY0RiIsCiAgICAiYmxhY2siID0+ICIwMDAwMDAiCik7CgoKZnVuY3Rpb24gcmdiRnJvbUhleCgkaGV4VmFsdWUpewogICAgaWYgKHN0cmxlbigkaGV4VmFsdWUpID09IDMpIHsgLy9zaG9ydGhhbmQgY2hlY2sKICAgICAgICAkciA9IGhleGRlYyhzdHJfcmVwZWF0KCRoZXhWYWx1ZVswXSwgMikpOwogICAgICAgICRnID0gaGV4ZGVjKHN0cl9yZXBlYXQoJGhleFZhbHVlWzFdLCAyKSk7CiAgICAgICAgJGIgPSBoZXhkZWMoc3RyX3JlcGVhdCgkaGV4VmFsdWVbMl0sIDIpKTsKICAgIH0KICAgIGVsc2UgaWYgKHN0cmxlbigkaGV4VmFsdWUpID09IDYpeyAvL3N0YW5kYXJkIGhleCBjb2xvcgogICAgICAgICRyID0gaGV4ZGVjKHN1YnN0cigkaGV4VmFsdWUsIDAsIDIpKTsKICAgICAgICAkZyA9IGhleGRlYyhzdWJzdHIoJGhleFZhbHVlLCAyLCAyKSk7CiAgICAgICAgJGIgPSBoZXhkZWMoc3Vic3RyKCRoZXhWYWx1ZSwgNCwgMikpOwogICAgfQogICAgZWxzZXsKICAgICAgICAkciA9IDA7CiAgICAgICAgJGcgPSAwOwogICAgICAgICRiID0gMDsKICAgIH0KCiAgICAkcmdiID0gYXJyYXkoCiAgICAgICAgJHIsCiAgICAgICAgJGcsCiAgICAgICAgJGIKICAgICk7CiAgICByZXR1cm4gJHJnYjsKfQoKZnVuY3Rpb24gZ2V0SGV4QnlOYW1lKCRuYW1lKXsKICAgIGdsb2JhbCAkY29sb3JuYW1lczsKICAgIGlmIChpc3NldCgkY29sb3JuYW1lc1skbmFtZV0pKSB7CiAgICAgICAgcmV0dXJuICRjb2xvcm5hbWVzWyRuYW1lXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CgovKgogKiAkaW5wdXQgLSBhIHN0cmluZywgcG9zc2libHkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgSGV4VmFsdWVzIGFuZC9vciBjb2xvciBuYW1lcwogKgogKiByZXR1cm5zIGFuIGFycmF5IG9mIFtyLCBnLCBiXSBhcnJheXMKICovCmZ1bmN0aW9uIHBhcnNlQ29sb3JzKCRpbnB1dCl7CiAgICAkY29sb3JBcnJheSA9IGFycmF5KCk7CiAgICAkcGFydHMgPSBleHBsb2RlKCIsIiwgJGlucHV0KTsKICAgIAogICAgZm9yZWFjaCgkcGFydHMgYXMgJGNvbG9yKXsKICAgICAgICAkYnlOYW1lID0gZ2V0SGV4QnlOYW1lKCRjb2xvcik7CiAgICAgICAgaWYoIWlzc2V0KCRieU5hbWUpKXsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkY29sb3JBcnJheSwgcmdiRnJvbUhleCgkY29sb3IpKTsKICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGJ5TmFtZSwgIiwiKSAhPT0gRkFMU0UpewogICAgICAgICAgICAgICAgLy8gd2UncmUgZGVhbGluZyB3aXRoIGEgbXVsdGktcGFydCBuYW1lLCBlZzogcm95Z2JpdgogICAgICAgICAgICAgICAgZm9yZWFjaChwYXJzZUNvbG9ycygkYnlOYW1lKSBhcyAkY29sKXsKICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRjb2xvckFycmF5LCAkY29sKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkY29sb3JBcnJheSwgcmdiRnJvbUhleCgkYnlOYW1lKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiAkY29sb3JBcnJheTsKfQoKLyogCiAqICRjb2xvckFycmF5IC0gYW4gYXJyYXkgb2YgW3IsIGcsIGJdIGFycmF5cy4gCiAqCiAqIHJldHVybnMgYW4gYXJyYXkgb2YgW3IsIGcsIGJdIGFycmF5cy4gCiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0ZUdyYWRpZW50KCRjb2xvckFycmF5KXsKICAgICRzdGVwcyA9IDIwMDsKCSRhcnJMZW4gPSBjb3VudCgkY29sb3JBcnJheSkgLSAxOwoJJHN0ZXBzUGVyR3JhZCA9ICRzdGVwcy8kYXJyTGVuOwogICAgJG91dHB1dCA9IGFycmF5KCk7CiAgICAKICAgIGZvcigkc3RlcCA9IDA7JHN0ZXAgPCAkc3RlcHM7ICRzdGVwKyspewoJCSRpbmRleCA9IGZsb29yKCRzdGVwLyRzdGVwcyokYXJyTGVuKTsKICAgICAgICAkY3VyciA9ICRjb2xvckFycmF5WyRpbmRleF07CiAgICAgICAgJG5leHQgPSAkY29sb3JBcnJheVskaW5kZXgrMV07CiAgICAgICAgICAgICAgICAKICAgICAgICBhcnJheV9wdXNoKCRvdXRwdXQsIGFycmF5KAogICAgICAgICAgICBmbG9vcigkY3VyclswXSArICgkc3RlcCAlICRzdGVwc1BlckdyYWQpIC8gJHN0ZXBzUGVyR3JhZCAqICgkbmV4dFswXSAtICRjdXJyWzBdKSksCiAgICAgICAgICAgIGZsb29yKCRjdXJyWzFdICsgKCRzdGVwICUgJHN0ZXBzUGVyR3JhZCkgLyAkc3RlcHNQZXJHcmFkICogKCRuZXh0WzFdIC0gJGN1cnJbMV0pKSwKICAgICAgICAgICAgZmxvb3IoJGN1cnJbMl0gKyAoJHN0ZXAgJSAkc3RlcHNQZXJHcmFkKSAvICRzdGVwc1BlckdyYWQgKiAoJG5leHRbMl0gLSAkY3VyclsyXSkpCiAgICAgICAgKSk7CiAgICB9CiAgICAKICAgIAogICAgcmV0dXJuICRvdXRwdXQ7Cn0KCi8qIAogKiAkY29sb3JBcnJheSAtIGFuIGFycmF5IG9mIFtyLCBnLCBiXSBhcnJheXMuIAogKgogKiByZXR1cm5zIGFuIGltYWdlLiAKICovCmZ1bmN0aW9uIGNyZWF0ZVN3YXRjaCgkY29sb3JBcnJheSl7CiAgICAkaW1nID0gaW1hZ2VjcmVhdGUoMjAwLCA0MCk7CiAgICAkY29sV2lkdGggPSAyMDAgLyBjb3VudCgkY29sb3JBcnJheSk7CiAgICAkeCA9IDA7CiAgICBmb3JlYWNoKCRjb2xvckFycmF5IGFzICRyZ2IpIHsKICAgICAgICAkY29sb3IgPSBpbWFnZWNvbG9yYWxsb2NhdGUoJGltZywgJHJnYlswXSwgJHJnYlsxXSwgJHJnYlsyXSk7CiAgICAgICAgaW1hZ2VmaWxsZWRyZWN0YW5nbGUoJGltZywgJHgsIDAsICR4ICsgJGNvbFdpZHRoLCA0MCwgJGNvbG9yKTsKICAgICAgICAkeCArPSAkY29sV2lkdGg7CiAgICB9CiAgICByZXR1cm4gaW1hZ2VwbmcoJGltZyk7Cn0KCgoKCmlmICgkdHlwZSA9PSAnY29sb3InKSB7CiAgICAkY29sb3JBcnJheSA9IHBhcnNlQ29sb3JzKHN0cnRvbG93ZXIoJGNvbG9ycykpOwp9IGVsc2UgaWYgKCR0eXBlID09ICdncmFkaWVudCcpewogICAgJGNvbG9yQXJyYXkgPSBpbnRlcnBvbGF0ZUdyYWRpZW50KHBhcnNlQ29sb3JzKHN0cnRvbG93ZXIoJGdyYWRpZW50KSkpOwp9IGVsc2UgewogICAgZWNobyAnR08gQVdBWSc7Cn0KCmlmIChpc3NldCgkY29sb3JBcnJheSkpewogICAgY3JlYXRlU3dhdGNoKCRjb2xvckFycmF5KTsKfQoKPz4=