<?php
//$colors = $_GET['color'];//Thought these variables made more sense up here.
$gradient = "red,orange,yellow,green,blue,indigo,violet";//$_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 = $step / $steps * $arrLen;
$curr = $colorArray[$index];
$next = $colorArray[$index + 1];
$curr[0] + ($step % $stepsPerGrad) / $stepsPerGrad * ($next[0] - $curr[0]),
$curr[1] + ($step % $stepsPerGrad) / $stepsPerGrad * ($next[1] - $curr[1]),
$curr[2] + ($step % $stepsPerGrad) / $stepsPerGrad * ($next[2] - $curr[2])
));
}
else{
}
}
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);
}
?>
PD9waHAKLy8kY29sb3JzID0gJF9HRVRbJ2NvbG9yJ107Ly9UaG91Z2h0IHRoZXNlIHZhcmlhYmxlcyBtYWRlIG1vcmUgc2Vuc2UgdXAgaGVyZS4KJGdyYWRpZW50ID0gInJlZCxvcmFuZ2UseWVsbG93LGdyZWVuLGJsdWUsaW5kaWdvLHZpb2xldCI7Ly8kX0dFVFsnZ3JhZGllbnQnXTsKaWYgKGlzc2V0KCRjb2xvcnMpKXsgLy9hZGRlZCB0aGVzZSB0byBhdm9pZCBzZW5kaW5nIGEgYmxhbmsgcGFnZSB3aXRoIGltYWdlIGhlYWRlcnMuIAogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGltYWdlL3BuZycpOwogICAgJHR5cGUgPSAnY29sb3InOwp9IGVsc2UgaWYgKGlzc2V0KCRncmFkaWVudCkpewogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGltYWdlL3BuZycpOwogICAgJHR5cGUgPSAnZ3JhZGllbnQnOwp9CgokY29sb3JuYW1lcyA9IGFycmF5KAogICAgInBpbmsiID0+ICJGRkMwQ0IiLAogICAgImxpZ2h0cGluayIgPT4gIkZGQjZDMSIsCiAgICAiaG90cGluayIgPT4gIkZGNjlCNCIsCiAgICAiZGVlcHBpbmsiID0+ICJGRjE0OTMiLAogICAgInBhbGV2aW9sZXRyZWQiID0+ICJEQjcwOTMiLAogICAgIm1lZGl1bXZpb2xldHJlZCIgPT4gIkM3MTU4NSIsCiAgICAibGlnaHRzYWxtb24iID0+ICJGRkEwN0EiLAogICAgInNhbG1vbiIgPT4gIkZBODA3MiIsCiAgICAiZGFya3NhbG1vbiIgPT4gIkU5OTY3QSIsCiAgICAibGlnaHRjb3JhbCIgPT4gIkYwODA4MCIsCiAgICAiaW5kaWFucmVkIiA9PiAiQ0Q1QzVDIiwKICAgICJjcmltc29uIiA9PiAiREMxNDNDIiwKICAgICJmaXJlYnJpY2siID0+ICJCMjIyMjIiLAogICAgImRhcmtyZWQiID0+ICI4QjAwMDAiLAogICAgInJlZCIgPT4gIkZGMDAwMCIsCiAgICAib3JhbmdlcmVkIiA9PiAiRkY0NTAwIiwKICAgICJ0b21hdG8iID0+ICJGRjYzNDciLAogICAgImNvcmFsIiA9PiAiRkY3RjUwIiwKICAgICJkYXJrb3JhbmdlIiA9PiAiRkY4QzAwIiwKICAgICJvcmFuZ2UiID0+ICJGRkE1MDAiLAogICAgImdvbGQiID0+ICJGRkQ3MDAiLAogICAgInllbGxvdyIgPT4gIkZGRkYwMCIsCiAgICAibGlnaHR5ZWxsb3ciID0+ICJGRkZGRTAiLAogICAgImxlbW9uY2hpZmZvbiIgPT4gIkZGRkFDRCIsCiAgICAibGlnaHRnb2xkZW5yb2R5ZWxsb3ciID0+ICJGQUZBRDIiLAogICAgInBhcGF5YXdoaXAiID0+ICJGRkVGRDUiLAogICAgIm1vY2Nhc2luIiA9PiAiRkZFNEI1IiwKICAgICJwZWFjaHB1ZmYiID0+ICJGRkRBQjkiLAogICAgInBhbGVnb2xkZW5yb2QiID0+ICJFRUU4QUEiLAogICAgImtoYWtpIiA9PiAiRjBFNjhDIiwKICAgICJkYXJra2hha2kiID0+ICJCREI3NkIiLAogICAgImNvcm5zaWxrIiA9PiAiRkZGOERDIiwKICAgICJibGFuY2hlZGFsbW9uZCIgPT4gIkZGRUJDRCIsCiAgICAiYmlzcXVlIiA9PiAiRkZFNEM0IiwKICAgICJuYXZham93aGl0ZSIgPT4gIkZGREVBRCIsCiAgICAid2hlYXQiID0+ICJGNURFQjMiLAogICAgImJ1cmx5d29vZCIgPT4gIkRFQjg4NyIsCiAgICAidGFuIiA9PiAiRDJCNDhDIiwKICAgICJyb3N5YnJvd24iID0+ICJCQzhGOEYiLAogICAgInNhbmR5YnJvd24iID0+ICJGNEE0NjAiLAogICAgImdvbGRlbnJvZCIgPT4gIkRBQTUyMCIsCiAgICAiZGFya2dvbGRlbnJvZCIgPT4gIkI4ODYwQiIsCiAgICAicGVydSIgPT4gIkNEODUzRiIsCiAgICAiY2hvY29sYXRlIiA9PiAiRDI2OTFFIiwKICAgICJzYWRkbGVicm93biIgPT4gIjhCNDUxMyIsCiAgICAic2llbm5hIiA9PiAiQTA1MjJEIiwKICAgICJicm93biIgPT4gIkE1MkEyQSIsCiAgICAibWFyb29uIiA9PiAiODAwMDAwIiwKICAgICJkYXJrb2xpdmVncmVlbiIgPT4gIjU1NkIyRiIsCiAgICAib2xpdmUiID0+ICI4MDgwMDAiLAogICAgIm9saXZlZHJhYiIgPT4gIjZCOEUyMyIsCiAgICAieWVsbG93Z3JlZW4iID0+ICI5QUNEMzIiLAogICAgImxpbWVncmVlbiIgPT4gIjMyQ0QzMiIsCiAgICAibGltZSIgPT4gIjAwRkYwMCIsCiAgICAibGF3bmdyZWVuIiA9PiAiN0NGQzAwIiwKICAgICJjaGFydHJldXNlIiA9PiAiN0ZGRjAwIiwKICAgICJncmVlbnllbGxvdyIgPT4gIkFERkYyRiIsCiAgICAic3ByaW5nZ3JlZW4iID0+ICIwMEZGN0YiLAogICAgIm1lZGl1bXNwcmluZ2dyZWVuIiA9PiAiMDBGQTlBIiwKICAgICJsaWdodGdyZWVuIiA9PiAiOTBFRTkwIiwKICAgICJwYWxlZ3JlZW4iID0+ICI5OEZCOTgiLAogICAgImRhcmtzZWFncmVlbiIgPT4gIjhGQkM4RiIsCiAgICAibWVkaXVtc2VhZ3JlZW4iID0+ICIzQ0IzNzEiLAogICAgInNlYWdyZWVuIiA9PiAiMkU4QjU3IiwKICAgICJmb3Jlc3RncmVlbiIgPT4gIjIyOEIyMiIsCiAgICAiZ3JlZW4iID0+ICIwMDgwMDAiLAogICAgImRhcmtncmVlbiIgPT4gIjAwNjQwMCIsCiAgICAibWVkaXVtYXF1YW1hcmluZSIgPT4gIjY2Q0RBQSIsCiAgICAiYXF1YSIgPT4gIjAwRkZGRiIsCiAgICAiY3lhbiIgPT4gIjAwRkZGRiIsCiAgICAibGlnaHRjeWFuIiA9PiAiRTBGRkZGIiwKICAgICJwYWxldHVycXVvaXNlIiA9PiAiQUZFRUVFIiwKICAgICJhcXVhbWFyaW5lIiA9PiAiN0ZGRkQ0IiwKICAgICJ0dXJxdW9pc2UiID0+ICI0MEUwRDAiLAogICAgIm1lZGl1bXR1cnF1b2lzZSIgPT4gIjQ4RDFDQyIsCiAgICAiZGFya3R1cnF1b2lzZSIgPT4gIjAwQ0VEMSIsCiAgICAibGlnaHRzZWFncmVlbiIgPT4gIjIwQjJBQSIsCiAgICAiY2FkZXRibHVlIiA9PiAiNUY5RUEwIiwKICAgICJkYXJrY3lhbiIgPT4gIjAwOEI4QiIsCiAgICAidGVhbCIgPT4gIjAwODA4MCIsCiAgICAibGlnaHRzdGVlbGJsdWUiID0+ICJCMEM0REUiLAogICAgInBvd2RlcmJsdWUiID0+ICJCMEUwRTYiLAogICAgImxpZ2h0Ymx1ZSIgPT4gIkFERDhFNiIsCiAgICAic2t5Ymx1ZSIgPT4gIjg3Q0VFQiIsCiAgICAibGlnaHRza3libHVlIiA9PiAiODdDRUZBIiwKICAgICJkZWVwc2t5Ymx1ZSIgPT4gIjAwQkZGRiIsCiAgICAiZG9kZ2VyYmx1ZSIgPT4gIjFFOTBGRiIsCiAgICAiY29ybmZsb3dlcmJsdWUiID0+ICI2NDk1RUQiLAogICAgInN0ZWVsYmx1ZSIgPT4gIjQ2ODJCNCIsCiAgICAicm95YWxibHVlIiA9PiAiNDE2OUUxIiwKICAgICJibHVlIiA9PiAiMDAwMEZGIiwKICAgICJtZWRpdW1ibHVlIiA9PiAiMDAwMENEIiwKICAgICJkYXJrYmx1ZSIgPT4gIjAwMDA4QiIsCiAgICAibmF2eSIgPT4gIjAwMDA4MCIsCiAgICAibWlkbmlnaHRibHVlIiA9PiAiMTkxOTcwIiwKICAgICJsYXZlbmRlciIgPT4gIkU2RTZGQSIsCiAgICAidGhpc3RsZSIgPT4gIkQ4QkZEOCIsCiAgICAicGx1bSIgPT4gIkREQTBERCIsCiAgICAidmlvbGV0IiA9PiAiRUU4MkVFIiwKICAgICJvcmNoaWQiID0+ICJEQTcwRDYiLAogICAgImZ1Y2hzaWEiID0+ICJGRjAwRkYiLAogICAgIm1hZ2VudGEiID0+ICJGRjAwRkYiLAogICAgIm1lZGl1bW9yY2hpZCIgPT4gIkJBNTVEMyIsCiAgICAibWVkaXVtcHVycGxlIiA9PiAiOTM3MERCIiwKICAgICJibHVldmlvbGV0IiA9PiAiOEEyQkUyIiwKICAgICJkYXJrdmlvbGV0IiA9PiAiOTQwMEQzIiwKICAgICJkYXJrb3JjaGlkIiA9PiAiOTkzMkNDIiwKICAgICJkYXJrbWFnZW50YSIgPT4gIjhCMDA4QiIsCiAgICAicHVycGxlIiA9PiAiODAwMDgwIiwKICAgICJpbmRpZ28iID0+ICI0QjAwODIiLAogICAgImRhcmtzbGF0ZWJsdWUiID0+ICI0ODNEOEIiLAogICAgInNsYXRlYmx1ZSIgPT4gIjZBNUFDRCIsCiAgICAibWVkaXVtc2xhdGVibHVlIiA9PiAiN0I2OEVFIiwKICAgICJ3aGl0ZSIgPT4gIkZGRkZGRiIsCiAgICAic25vdyIgPT4gIkZGRkFGQSIsCiAgICAiaG9uZXlkZXciID0+ICJGMEZGRjAiLAogICAgIm1pbnRjcmVhbSIgPT4gIkY1RkZGQSIsCiAgICAiYXp1cmUiID0+ICJGMEZGRkYiLAogICAgImFsaWNlYmx1ZSIgPT4gIkYwRjhGRiIsCiAgICAiZ2hvc3R3aGl0ZSIgPT4gIkY4RjhGRiIsCiAgICAid2hpdGVzbW9rZSIgPT4gIkY1RjVGNSIsCiAgICAic2Vhc2hlbGwiID0+ICJGRkY1RUUiLAogICAgImJlaWdlIiA9PiAiRjVGNURDIiwKICAgICJvbGRsYWNlIiA9PiAiRkRGNUU2IiwKICAgICJmbG9yYWx3aGl0ZSIgPT4gIkZGRkFGMCIsCiAgICAiaXZvcnkiID0+ICJGRkZGRjAiLAogICAgImFudGlxdWV3aGl0ZSIgPT4gIkZBRUJENyIsCiAgICAibGluZW4iID0+ICJGQUYwRTYiLAogICAgImxhdmVuZGVyYmx1c2giID0+ICJGRkYwRjUiLAogICAgIm1pc3R5cm9zZSIgPT4gIkZGRTRFMSIsCiAgICAiZ2FpbnNib3JvIiA9PiAiRENEQ0RDIiwKICAgICJsaWdodGdyYXkiID0+ICJEM0QzRDMiLAogICAgImxpZ2h0Z3JleSIgPT4gIkQzRDNEMyIsCiAgICAic2lsdmVyIiA9PiAiQzBDMEMwIiwKICAgICJkYXJrZ3JheSIgPT4gIkE5QTlBOSIsCiAgICAiZGFya2dyZXkiID0+ICJBOUE5QTkiLAogICAgImdyYXkiID0+ICI4MDgwODAiLAogICAgImdyZXkiID0+ICI4MDgwODAiLAogICAgImRpbWdyYXkiID0+ICI2OTY5NjkiLAogICAgImRpbWdyZXkiID0+ICI2OTY5NjkiLAogICAgImxpZ2h0c2xhdGVncmF5IiA9PiAiNzc4ODk5IiwKICAgICJsaWdodHNsYXRlZ3JleSIgPT4gIjc3ODg5OSIsCiAgICAic2xhdGVncmF5IiA9PiAiNzA4MDkwIiwKICAgICJzbGF0ZWdyZXkiID0+ICI3MDgwOTAiLAogICAgImRhcmtzbGF0ZWdyYXkiID0+ICIyRjRGNEYiLAogICAgImRhcmtzbGF0ZWdyZXkiID0+ICIyRjRGNEYiLAogICAgImJsYWNrIiA9PiAiMDAwMDAwIgopOwoKCmZ1bmN0aW9uIHJnYkZyb21IZXgoJGhleFZhbHVlKXsKICAgIGlmIChzdHJsZW4oJGhleFZhbHVlKSA9PSAzKSB7IC8vc2hvcnRoYW5kIGNoZWNrCiAgICAgICAgJHIgPSBoZXhkZWMoc3RyX3JlcGVhdCgkaGV4VmFsdWVbMF0sIDIpKTsKICAgICAgICAkZyA9IGhleGRlYyhzdHJfcmVwZWF0KCRoZXhWYWx1ZVsxXSwgMikpOwogICAgICAgICRiID0gaGV4ZGVjKHN0cl9yZXBlYXQoJGhleFZhbHVlWzJdLCAyKSk7CiAgICB9CiAgICBlbHNlIGlmIChzdHJsZW4oJGhleFZhbHVlKSA9PSA2KXsgLy9zdGFuZGFyZCBoZXggY29sb3IKICAgICAgICAkciA9IGhleGRlYyhzdWJzdHIoJGhleFZhbHVlLCAwLCAyKSk7CiAgICAgICAgJGcgPSBoZXhkZWMoc3Vic3RyKCRoZXhWYWx1ZSwgMiwgMikpOwogICAgICAgICRiID0gaGV4ZGVjKHN1YnN0cigkaGV4VmFsdWUsIDQsIDIpKTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgJHIgPSAwOwogICAgICAgICRnID0gMDsKICAgICAgICAkYiA9IDA7CiAgICB9CgogICAgJHJnYiA9IGFycmF5KAogICAgICAgICRyLAogICAgICAgICRnLAogICAgICAgICRiCiAgICApOwogICAgcmV0dXJuICRyZ2I7Cn0KCmZ1bmN0aW9uIGdldEhleEJ5TmFtZSgkbmFtZSl7CiAgICBnbG9iYWwgJGNvbG9ybmFtZXM7CiAgICBpZiAoaXNzZXQoJGNvbG9ybmFtZXNbJG5hbWVdKSkgewogICAgICAgIHJldHVybiAkY29sb3JuYW1lc1skbmFtZV07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQoKLyoKICogJGlucHV0IC0gYSBzdHJpbmcsIHBvc3NpYmx5IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIEhleFZhbHVlcyBhbmQvb3IgY29sb3IgbmFtZXMKICoKICogcmV0dXJucyBhbiBhcnJheSBvZiBbciwgZywgYl0gYXJyYXlzCiAqLwpmdW5jdGlvbiBwYXJzZUNvbG9ycygkaW5wdXQpewogICAgJGNvbG9yQXJyYXkgPSBhcnJheSgpOwogICAgJHBhcnRzID0gZXhwbG9kZSgiLCIsICRpbnB1dCk7CiAgICAKICAgIGZvcmVhY2goJHBhcnRzIGFzICRjb2xvcil7CiAgICAgICAgJGJ5TmFtZSA9IGdldEhleEJ5TmFtZSgkY29sb3IpOwogICAgICAgIGlmKCFpc3NldCgkYnlOYW1lKSl7CiAgICAgICAgICAgIGFycmF5X3B1c2goJGNvbG9yQXJyYXksIHJnYkZyb21IZXgoJGNvbG9yKSk7CiAgICAgICAgfSBlbHNlewogICAgICAgICAgICBpZiAoc3RycG9zKCRieU5hbWUsICIsIikgIT09IEZBTFNFKXsKICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIG11bHRpLXBhcnQgbmFtZSwgZWc6IHJveWdiaXYKICAgICAgICAgICAgICAgIGZvcmVhY2gocGFyc2VDb2xvcnMoJGJ5TmFtZSkgYXMgJGNvbCl7CiAgICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkY29sb3JBcnJheSwgJGNvbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJGNvbG9yQXJyYXksIHJnYkZyb21IZXgoJGJ5TmFtZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gJGNvbG9yQXJyYXk7Cn0KCi8qIAogKiAkY29sb3JBcnJheSAtIGFuIGFycmF5IG9mIFtyLCBnLCBiXSBhcnJheXMuIAogKgogKiByZXR1cm5zIGFuIGFycmF5IG9mIFtyLCBnLCBiXSBhcnJheXMuIAogKi8KZnVuY3Rpb24gaW50ZXJwb2xhdGVHcmFkaWVudCgkY29sb3JBcnJheSl7CiAgICAkc3RlcHMgPSAyMDA7CiAgICAkYXJyTGVuID0gY291bnQoJGNvbG9yQXJyYXkpIC0gMTsKICAgICRzdGVwc1BlckdyYWQgPSAkc3RlcHMvJGFyckxlbjsKICAgICRvdXRwdXQgPSBhcnJheSgpOwogICAgCiAgICBmb3IoJHN0ZXAgPSAwOyRzdGVwIDwgJHN0ZXBzOyAkc3RlcCsrKXsKICAgIAkkaW5kZXggPSAkc3RlcCAvICRzdGVwcyAqICRhcnJMZW47CiAgICAgICAgJGN1cnIgPSAkY29sb3JBcnJheVskaW5kZXhdOwogICAgICAgICRuZXh0ID0gJGNvbG9yQXJyYXlbJGluZGV4ICsgMV07CgogICAgICAgIGlmKGlzc2V0KCRuZXh0KSl7CiAgICAgICAgICAgIGFycmF5X3B1c2goJG91dHB1dCwgYXJyYXkoCiAgICAgICAgICAgICAgICAkY3VyclswXSArICgkc3RlcCAlICRzdGVwc1BlckdyYWQpIC8gJHN0ZXBzUGVyR3JhZCAqICgkbmV4dFswXSAtICRjdXJyWzBdKSwKICAgICAgICAgICAgICAgICRjdXJyWzFdICsgKCRzdGVwICUgJHN0ZXBzUGVyR3JhZCkgLyAkc3RlcHNQZXJHcmFkICogKCRuZXh0WzFdIC0gJGN1cnJbMV0pLAogICAgICAgICAgICAgICAgJGN1cnJbMl0gKyAoJHN0ZXAgJSAkc3RlcHNQZXJHcmFkKSAvICRzdGVwc1BlckdyYWQgKiAoJG5leHRbMl0gLSAkY3VyclsyXSkKICAgICAgICAgICAgKSk7CiAgICAgICAgfQoJCWVsc2V7CiAgICAgICAgICAgIGFycmF5X3B1c2goJG91dHB1dCwgJGN1cnIpOwogICAgICAgIH0KICAgIH0KICAgICAgICAKICAgIHJldHVybiAkb3V0cHV0Owp9CgovKiAKICogJGNvbG9yQXJyYXkgLSBhbiBhcnJheSBvZiBbciwgZywgYl0gYXJyYXlzLiAKICoKICogcmV0dXJucyBhbiBpbWFnZS4gCiAqLwpmdW5jdGlvbiBjcmVhdGVTd2F0Y2goJGNvbG9yQXJyYXkpewogICAgJGltZyA9IGltYWdlY3JlYXRlKDIwMCwgNDApOwogICAgJGNvbFdpZHRoID0gMjAwIC8gY291bnQoJGNvbG9yQXJyYXkpOwogICAgJHggPSAwOwogICAgZm9yZWFjaCgkY29sb3JBcnJheSBhcyAkcmdiKSB7CiAgICAgICAgJGNvbG9yID0gaW1hZ2Vjb2xvcmFsbG9jYXRlKCRpbWcsICRyZ2JbMF0sICRyZ2JbMV0sICRyZ2JbMl0pOwogICAgICAgIGltYWdlZmlsbGVkcmVjdGFuZ2xlKCRpbWcsICR4LCAwLCAkeCArICRjb2xXaWR0aCwgNDAsICRjb2xvcik7CiAgICAgICAgJHggKz0gJGNvbFdpZHRoOwogICAgfQogICAgcmV0dXJuIGltYWdlcG5nKCRpbWcpOwp9CgoKCgppZiAoJHR5cGUgPT0gJ2NvbG9yJykgewogICAgJGNvbG9yQXJyYXkgPSBwYXJzZUNvbG9ycyhzdHJ0b2xvd2VyKCRjb2xvcnMpKTsKfSBlbHNlIGlmICgkdHlwZSA9PSAnZ3JhZGllbnQnKXsKICAgICRjb2xvckFycmF5ID0gaW50ZXJwb2xhdGVHcmFkaWVudChwYXJzZUNvbG9ycyhzdHJ0b2xvd2VyKCRncmFkaWVudCkpKTsKfSBlbHNlIHsKICAgIGVjaG8gJ0dPIEFXQVknOwp9CgppZiAoaXNzZXQoJGNvbG9yQXJyYXkpKXsKICAgIGNyZWF0ZVN3YXRjaCgkY29sb3JBcnJheSk7Cn0KCj8+