DIR : /home/kozerus/public_html/wz/wz_grapher.htm
/home/kozerus/public_html/wz
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- Created by Walter Zorn -->
<html>
<head>
<title>/ko/wz_grapher.html 20230315_2330</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<!-- <link rel="stylesheet" type="text/css" href="../newwalterzorn.css"> -->
<style id="style_newwalterzorn" >
body {
margin:0px;
padding-top:0px;
padding-bottom:100px;
}
html,body,div,center,p,table,tr,th,td,ul,li {
font-family:arial,helvetica,sans-serif;
font-size:14px;
color:black;
}
big {
font-size:18px;
}
small {
font-family:verdana,helvetica,sans-serif;
font-size:10px;
}
code, tt {
font-size:13px;
font-family:courier new,courier;
white-space:nowrap;
}
a:link {
color:#3355cc;
text-decoration:underline;
font-weight:bold;
}
a:visited {
color:#8800aa;
text-decoration:underline;
font-weight:bold;
}
a:hover {
color:#660099;
background:#ececec;
text-decoration:underline;
font-weight:bold;
}
a:active {
color:#3355cc;
text-decoration:underline;
font-weight:bold;
}
a.nodeco:link {
text-decoration:none;
}
a.nodeco:visited {
text-decoration:none;
}
a.nodeco:hover {
text-decoration:none;
}
a.nodeco:active {
text-decoration:none;
}
a.code:link {
font-size:13px;
text-decoration:none;
font-family:courier new,courier;
background:#e0e0e0;
}
a.code:visited {
font-size:13px;
text-decoration:none;
font-family:courier new,courier;
background:#e0e0e0;
}
a.code:hover {
font-size:13px;
text-decoration:none;
font-family:courier new,courier;
background:#e0e0e0;
}
a.code:active {
font-size:13px;
text-decoration:none;
font-family:courier new,courier;
background:#e0e0e0;
}
tt.code {
background:#e0e0e0;
padding:1pt;
}
input {
font-size:12px;
font-family:courier new,courier,arial,helvetica,sans-serif;
color:black;
}
textarea {
background-color:white;
font-family:courier new,courier;
font-size:12px;
}
.lite {
color:#cc6666;
}
.bt1 {
font-size:17px;
font-family:arial,helvetica,sans-serif;
}
.bt1b {
font-size:17px;
font-family:arial,helvetica,sans-serif;
font-weight:bold;
}
.bt2 {
font-size:13px;
font-family:arial,helvetica,sans-serif;
}
.bt2b {
font-size:13px;
font-family:arial,helvetica,sans-serif;
font-weight:bold;
}
.bt3 {
font-size:11px;
font-family:arial,helvetica,sans-serif;
}
.bt3b {
font-size:11px;
font-family:arial,helvetica,sans-serif;
font-weight:bold;
}
</style id="style_newwalterzorn_end" >
<style type="text/css">
<!--
-->
</style>
<script id="script_wz_grapher" type="text/javascript">
<!--
function mkFourier(f) {
var htm = '';
var na = parseInt(f.FOU_NA.value), nz = parseInt(f.FOU_NZ.value), dn = parseFloat(f.FOU_DN.value);
var sgn = f.FOU_SGN[2].checked? -1 : f.FOU_SGN[3].checked? 1 : 0;
for (var i = na; i <= nz; i += (dn || nz)) {
htm += ((i == na)? '' : (sgn < 0 || !sgn && f.FOU_SGN[1].checked)? '-' : '+') + f.FOU_TERM.value.replace(/\s/g, '').replace(/sin/g,'sim').replace(/n/gi, ''+i).replace(/sim/g,'sin');
sgn = -sgn;
}
f.FOU_OUT.value = htm;
}
//-->
</script id="script_wz_grapher_end" >
<script id="script_startup">
function startup(args) {
htmout=""; j=0; k=0;
alert( "BUGS_100 startup args="+args );
return(htmout);
}
</script id="script_startup_end">
</head>
<body bgcolor=linen onload="startup('onload'); return false;" >
<div id="div_wz_grapher">
<h1>div_wz_grapher</h1>
<form name="fo" action="javascript:if (window.mkGraph) mkGraph(this);" onsubmit="return false;">
<a name="top"> </a>
<center>
<div id="body1">
<table width="99%">
<tr>
<td align="left">
<a href="http://www.walterzorn.de/grapher/grapher.htm" target="_top"><img src="../images/germany.gif" align="middle" border="0" alt="German version" width="22" height="15"></a> <small><a href="http://www.walterzorn.de/grapher/grapher.htm" target="_top">German version</a></small>
</td>
</tr>
</table>
<table>
<tr>
<td align="center"><a href="../index.htm"><img border="0" src="/js/wz/images/logo.gif" alt="" width="271" height="30"></a></td>
</tr>
</table>
<table cellspacing="12">
<tr valign="top">
<td><a href="/js/wz/index.htm">Home</a></td>
<td><a href="/js/wz/dragdrop/dragdrop_e.htm">DHTML-Drag&Drop-Library</a></td>
<td><a href="/js/wz/jsgraphics/jsgraphics_e.htm">VectorGraphics-Library</a></td>
<td><a href="/js/wz/tooltip/tooltip_e.htm">Tooltips-Library</a></td>
<td><br></td>
<td style="border: 1px solid #000099;">
</td>
</tr>
</table>
<table cellpadding="6" width="740">
<tr>
<td align="left">
<b><big>Online Function Grapher</big></b><br>
<small>Written entirely in JavaScript<br>By Walter Zorn</small>
</td>
</tr>
</table>
<table cellpadding="6" width="740">
<tr>
<td align="left">
Currently under development:
A standalone application version of this Function Graphing Program, written in C language,
much faster, essentially more capabilities, e.g. scrolling and zooming the displayed range, built-in function calculator, numerical integration, solving differential equations numerically ... <a href="grapher_app.htm">free download of WZGrapher</a>.<br>
</td>
</tr>
</table>
<div id="inputs" style="position:relative;text-align:left;">
<div style="padding-top:8px;padding-right:8px;padding-left:8px;">
<input type="submit" class="bt2" value="Plot Graph" onclick="if (window.mkGraph) mkGraph(this.form); return false;">
<input name="Add" type="checkbox">don't delete previous graphs
<input type="button" class="bt2" value="Delete graphs" onmouseup="this.form.F.focus()" onclick="delGraphs(1)">
<br>
x min <input name="XA" type="text" class="input" size="8" maxlength="13" value="-5">
x max <input name="XZ" type="text" class="input" size="8" maxlength="13" value="5">
y min <input name="YA" type="text" class="input" size="8" maxlength="13" value="-5">
y max <input name="YZ" type="text" class="input" size="8" maxlength="13" value="5">
<br>
<b>Function f(x)</b><small> (up to 5 functions may be entered simultaneously, separated from each other by a semicolon)</small>
<hr color="black" />
<hr color="white" />
<br>
<textarea id="textarea" name="F" class="input" cols="90" rows="4">cos(pi*x) / (-LN2*x);
sqrt(9-x^2);
-sqrt(9-x^2)
</textarea id="textarea_end" >
</div>
</div>
</div>
<div id="graphframe" style="position:relative;left:0px;top:0px;">
<hr color="white" />
<hr color="black" />
<br />
<noscript><big><b><font color="#cc0000"> <br>JavaScript not enabled. Graph of function can't be created.</font></b></big></noscript>
<br>Function Graph Area.
</div>
<div id="terms" style="position:relative;left:0px;top:0px;width:690px;padding:3px;text-align:left;"></div>
<div id="body2">
<table cellpadding="14">
<tr>
<td align="left">
<big> <br><b>Operators and Helper Functions</b></big> <small>upper/lower case is arbitrary</small>
<table>
<tr>
<td valign="top">
<b>+ - * : /</b>
<br>
<b>() [] {}</b>
</td>
<td>
Plus, minus, multiplication, division, grouping symbols.
Multiplication sign <b>*</b> is not necessary and can be omitted. Examples:
<b style="white-space:nowrap;">0.5x^3-3x</b> or <b style="white-space:nowrap;">pixeln(2cos[LN2x])</b> or <b style="white-space:nowrap;">Pipi/(Exe)</b>
Using different types of grouping symbols (parentheses, brackets, braces) for clarity of nested expressions is optional, but not necessary.
</td>
</tr>
<tr>
<td valign="top">
<i>base</i><b>^</b><i>exponent</i>
<br>or<br>
<span style="white-space:nowrap;"><b>p(</b>base<b>,</b>exponent<b>)</b></span>
</td>
<td>
Exponentiation base<sup>exponent</sup>, for example <b>p(x,2)</b> or <b>x^2</b> .
Instead of <b>^</b> you can also type a single quote <b>'</b> or a double quote <b>"</b>.
If you don't use p(), make sure that bases or exponents composed by sub-expressions such as additions, subtractions, multiplications or divisions, are clearly marked off by being completely enclosed into parentheses, brackets or braces.
Example: <b style="white-space:nowrap;">(x/3)^(2x)</b> .
Instead of <b style="white-space:nowrap;">x"3</b>, of course, you can also enter <b style="white-space:nowrap;">xxx</b>.
Or, instead of <b style="white-space:nowrap;">tan(x)'2</b> you may type <b style="white-space:nowrap;">tan(x)tan(x)</b>.
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>root(</b>arg<b>,</b>index<b>)</b></span>
</td>
<td>
"<i>index</i>-th" root of <i>argument</i>.
Example: <b style="white-space:nowrap;">root(x,6)</b> sixth root of x, <b style="white-space:nowrap;">root[tan(x),4]</b> fourth root of the tangent of x.
</td>
</tr>
<tr>
<td valign="top">
<b>sqrt()</b>
</td>
<td>
Square root of argument (number or expression inside the parentheses). Equivalent to root(<i>argument</i>,2)
</td>
</tr>
<tr>
<td valign="top">
<b>cbrt()</b>
</td>
<td>
Cube root of argument. Equivalent to root(<i>argument</i>,3)
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>logn(</b>arg<b>,</b>base<b>)</b></span>
</td>
<td>
Logarithm base-<i>base</i> of <i>arg</i>.
</td>
</tr>
<tr>
<td valign="top">
<b>ln()</b>
</td>
<td>
Natural logarithm of argument
(base-E logarithm of argument where E is Euler's constant)
</td>
</tr>
<tr>
<td valign="top">
<b>lg()</b>
</td>
<td>
Logarithm base-10 of argument, equivalent to <span style="white-space:nowrap;">logn(<i>argument</i>,10)</span>.
</td>
</tr>
<tr>
<td valign="top">
<b>lb()</b>
</td>
<td>
Logarithm base-2 of argument.
</td>
</tr>
<tr>
<td valign="top">
<b>exp()</b>
</td>
<td>
Exponential Function E to the power of argument, equivalent to E^<i>argument</i>
</td>
</tr>
<tr>
<td valign="top">
<b>sin()</b>
</td>
<td>
Sine of argument
</td>
</tr>
<tr>
<td valign="top">
<b>cos()</b>
</td>
<td>
Cosine
</td>
</tr>
<tr>
<td valign="top">
<b>tan()</b>
</td>
<td>
Tangent
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>cot()</b></span>
</td>
<td>
Cotangent
</td>
</tr>
<tr>
<td valign="top">
<b>sec()</b>
</td>
<td>
Secant of argument, equiv. to 1/cos(<i>arg</i>).
</td>
</tr>
<tr>
<td valign="top">
<b>csc()</b>
</td>
<td>
Cosecant, equiv. to 1/sin(<i>arg</i>).
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>asin()</b></span>
</td>
<td>
Arc sine
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>acos()</b></span>
</td>
<td>
Arc cosine
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>atan()</b></span>
</td>
<td>
Arc tangent
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>acot()</b></span>
</td>
<td>
Arc cotangent
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>asec()</b></span>
</td>
<td>
Arc secant, inverse secant.
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>acsc()</b></span>
</td>
<td>
Arc cosecant, inverse cosecant.
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>sinh()</b></span>
</td>
<td>
Hyperbolic sine, Sinus hyperbolicus
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>cosh()</b></span>
</td>
<td>
Hyperbolic cosine, Cosinus hyperbolicus
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>tanh()</b></span>
</td>
<td>
Hyperbolic tangent, Tangens hyperbolicus
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>coth()</b></span>
</td>
<td>
Hyperbolic cotangent, Cotangens hyperbolicus
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>sech()</b></span>
</td>
<td>
Hyperbolic secant, Secans hyperbolicus.
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>csch()</b></span>
</td>
<td>
Hyperbolic cosecant, Cosecans hyperbolicus.
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>asinh()</b></span>
</td>
<td>
Area sine, Area sinus hyperbolicus, inverse sinh().
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>acosh()</b></span>
</td>
<td>
Area cosine, Area cosinus hyperbolicus, inverse cosh().
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>atanh()</b></span>
</td>
<td>
Area tangent, Area tangens hyperbolicus, inverse tanh().
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>acoth()</b></span>
</td>
<td>
Area cotangent, Area cotangens hyperbolicus, inverse cotanh().
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>asech()</b></span>
</td>
<td>
Area- secant, Area secans hyperbolicus, inverse sech().
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>acsch()</b></span>
</td>
<td>
Area- cosecant, Area cosecans hyperbolicus, inverse csch().
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>gaussd(x,</b>mean<b>,</b>sigma<b>)</b></span>
</td>
<td>
Gaussian distribution ("Bell Curve").
<b style="white-space:nowrap;">gaussd(x,0,1)</b>, by the way, is the special case "Normal distribution density with mean-value=0, standard-deviation=1".
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>min(</b>arg1<b>,</b>arg2<b>)</b></span>
</td>
<td>
Returns the lesser of the two arguments
</td>
</tr>
<tr>
<td valign="top">
<span style="white-space:nowrap;"><b>max(</b>arg1<b>,</b>arg2<b>)</b></span>
</td>
<td>
Returns the greater of the two arguments
</td>
</tr>
<tr>
<td valign="top">
<b style="white-space:nowrap;">round()</b>
</td>
<td>
Rounds argument up or down to the closest integer
</td>
</tr>
<tr>
<td valign="top">
<b style="white-space:nowrap;">floor()</b>
</td>
<td>
Rounds arg down.
</td>
</tr>
<tr>
<td valign="top">
<b style="white-space:nowrap;">ceil()</b>
</td>
<td>
Rounds arg up.
</td>
</tr>
<tr>
<td valign="top">
<b>abs()</b> or <b>| |</b>
</td>
<td>
Absolute value of argument.
Example: <b style="white-space:nowrap;">2abs(sin[x])</b> or alternatively <b style="white-space:nowrap;">2|sin(x)|</b> .
</td>
</tr>
<tr>
<td valign="top">
<b>sgn()</b>
</td>
<td>
Sign Function.
<br>
<table>
<tr>
<td rowspan="3" valign="middle">
<b style="white-space:nowrap;">sgn(x)</b> =
</td>
<td> 1 for x > 0</td>
</tr>
<tr>
<td> 0 for x = 0</td>
</tr>
<tr>
<td>-1 for x < 0</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="left">
<big> <br><b>Predefined Constants, Values</b></big> <small>upper/lower case is arbitrary</small>
<table>
<tr>
<td valign="top">
<b>rand</b>
</td>
<td>
Random number between 0 und 1. Example:<br><b style="white-space:nowrap;">pi*rand*sin(x)</b> or even <b style="white-space:nowrap;">Pirandsin(x)</b> .
</td>
</tr>
<tr>
<td valign="top">
<b>E</b>
</td>
<td>
Euler's constant 2.718281828459045...
</td>
</tr>
<tr>
<td valign="top">
<b>LN2</b>
</td>
<td>
Natural logarithm of 2, is 0.6931471805599453...
</td>
</tr>
<tr>
<td valign="top">
<b>LN10</b>
</td>
<td>
Natural logarithm of 10, is 2.302585092994046...
</td>
</tr>
<tr>
<td valign="top">
<b>LOG2E</b>
</td>
<td>
Base-2 logarithm of E (E: see above), is 1.4426950408889633...
</td>
</tr>
<tr>
<td valign="top">
<b>LOG10E</b>
</td>
<td>
Base-10 logarithmus of E, is 0.4342944819032518...
</td>
</tr>
<tr>
<td valign="top">
<b>PHI</b>
</td>
<td>
Golden Ratio 1.61803398874989...
</td>
</tr>
<tr>
<td valign="top">
<b>PI</b>
</td>
<td>
3.141592653589793...
</td>
</tr>
<tr>
<td valign="top">
<b>SQRT1_2</b>
</td>
<td>
Square root of 1/2, is 0.7071067811865476...
</td>
</tr>
<tr>
<td valign="top">
<b>SQRT2</b>
</td>
<td>
Square root of 2, is 1.4142135623730951...
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="left">
<big> <br><b>Notes</b></big>
<br>
Enter functions in standard mathematical notation, using x as independent variable.
As evident from the examples on this page, arguments to helper functions must be enclosed into parentheses (or braces or brackets).
<br> <br>
Grouping symbols such as parentheses, and helper functions may be arbitrarily deeply nested. Examples:<br>
<b style="white-space:nowrap;">cos[atan(5x)^4]</b> or <b style="white-space:nowrap;">sqrt{16*[1-sec(x)^2/4]}</b>
<br> <br>
The function plotter engine follows the common rules of math. notation and order of operation;
for example, expressions inside parentheses have increased precedence, * and / have higher precedence than + and -, etc..
In case no grouping symbols are used, <b style="white-space:nowrap;">2*x-3/x</b> evaluates as if it were <b style="white-space:nowrap;">(2*x) - (3/x)</b>.
<br> <br>
Since horizontal fraction lines aren't available to clearly mark off fraction expressions composed by sub-expressions, is is recommended to insert numerator and denominator each completely into parentheses (or brackets or braces).
For example, type in <b style="white-space:nowrap;">pi-(5-x)/(3x)*acoth(x)</b> instead of <b style="white-space:nowrap;">pi-5-x/3x*acoth(x)</b> which otherwise would evaluate to <b style="white-space:nowrap;">pi-5-(x/3)*x*acoth(x)</b>.
<br> <br>
Upper and lower case may be arbitrarily used and mixed, even for predefined constants.
Spaces may be used for clarity as you wish, but neither help nor harm; the program engine ignores them.
<br> <br>
Range of x (x min to x max) should not extend beyond minus 10<sup>12</sup> and plus 10<sup>12</sup>.
Range of y (y min to y max) is optional; if not specified, the function-grapher engine tries to evaluate it for the specified x range.
<br> <br>
</td>
</tr>
<tr>
<td align="left">
<big> <br><b>Multiple Functions at Once</b></big>
<br>
You may enter up to 5 functions simultaneously, each terminated by a semicolon.
Of course building the diagram then will take more time, possibly several seconds.
Example (you may copy it into the function input):<br>
<b>
sqrt[16*(1-x²/2)];<br>
-sqrt[16*(1-x²/2)];<br>
sqrt[2*(1-x²/16)];<br>
-sqrt[2*(1-x²/16)]
</b>
</td>
</tr>
<tr>
<td align="left">
<big> <br><b>Create Fourier Series</b></big>
<br>
<table cellpadding="5">
<tr>
<td align="left" bgcolor="#eeeeee">
<small>
The Fourier Series will be written into the lightblue area below.
<br>
You may copy it from there, and enter it into the input of the Function Grapher
<br> <br></small>
<b>n:</b>
from <input name="FOU_NA" type="text" size="4" value="1">
to <input name="FOU_NZ" type="text" size="4" maxlength="4" value="10">
step width <input name="FOU_DN" type="text" size="4" value="1">
<br>
Single terms:
Add<input type="radio" name="FOU_SGN" checked>
subtract<input type="radio" name="FOU_SGN">
or alternate, beginning with plus<input type="radio" name="FOU_SGN">
minus<input type="radio" name="FOU_SGN" checked>
<br>
<b>Single term:</b>
<input name="FOU_TERM" type="text" size="44" value="0.9^n * cos(n*x)/2">
<input class="bt2" type="button" value="Create Fourier Series" onclick="mkFourier(this.form)">
<br>
<textarea name="FOU_OUT" cols="82" rows="20" style="background:#d3e6ff;"></textarea>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center">
<table cellpadding="40">
<tr>
<td><a href="#top"><img border="0" src="../images/topOfPage.gif" alt="Seitenanfang" width="21" height="20"></a></td>
<td><a href="../index.htm" target="_top">Home</a></td>
</tr>
</table>
</td>
</tr>
</table>
<hr width="95%" size="1" noshade>
<table width="740">
<tr>
<td>
<small>Walter Zorn
<br><a href="http://www.kreuzotter.de/impressum.htm">Impressum and about this page</a></small>
<br>
<br> <br> <br> <br> <br> <br> <br> <br> <br> <br>
</td>
</tr>
</table>
</div>
</center>
</form>
<div id="div_files" >
<output id="zonelist"></output>
<div id="dropzone">
dropzone
<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
<canvas id="canvas_dropzone" style="z-index: 1;
position:absolute;
left:0px;
top:0px;
" height="100px" width="200" background-color="darkSlategrey" color="ivory">
WARN_1387 unauthorized access has been logged
</canvas>
</div id=div_canvas_end>
</div id=dropzone_end>
<script name="script_fileselect">
function handleFileSelect(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files; // FileList object.
// files is a FileList of File objects. List some properties.
var output = [];
for (var i = 0, f; f = files[i]; i++) {
output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
f.size, ' bytes, last modified: ',
f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
'</li>');
}
document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
}
function handleDragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
}
// Setup the dnd listeners.
var dropZone = document.getElementById('dropzone');
dropZone.addEventListener('dragover', handleDragOver, false);
dropZone.addEventListener('drop', handleFileSelect, false);
</script>
<hr><hr><hr>
<label class="fileContainer">
files
<input id="files" name="files[]" multiple="" type="file">
</label>
<output id="zonelist"></output>
<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// files is a FileList of File objects. List some properties.
var output = [];
for (var i = 0, f; f = files[i]; i++) {
output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
f.size, ' bytes, last modified: ',
f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
'</li>');
}
document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
<div id="div_files2" hidden >
<label class="fileContainer">
files2
<input id="files" name="files[]" multiple="" type="file">
</label>
<output id="zonelist"></output>
</div>
<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) { continue; }
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
// Render thumbnail.
var span = document.createElement('span');
span.innerHTML = ['<img class="thumb" src="', e.target.result,
'" title="', escape(theFile.name), '"/>'].join('');
document.getElementById('zonelist').insertBefore(span, null);
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
<script id="script_previewfile">
function previewfile(file) {
if (tests.filereader === true && acceptedTypes[file.type] === true) {
var reader = new FileReader();
reader.onload = function (event) {
var image = new Image();
image.src = event.target.result;
image.width = 250; // a fake resize
holder.appendChild(image);
};
reader.readAsDataURL(file);
}
else {
holder.innerHTML +=
'<p>done: koupload'
+ file.name
+ ' '
+ (file.size ? (file.size/1024|0) + 'K' : '');
console.log(file);
}
}
function readfiles(files) {
debugger;
var formData = tests.formdata ? new FormData() : null;
for (var i = 0; i < files.length; i++) {
if (tests.formdata) formData.append('file', files[i]);
previewfile(files[i]);
}
// now post a new XHR request
if (tests.formdata) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
xhr.onload = function() {
progress.value = progress.innerHTML = 100;
};
if (tests.progress) {
xhr.upload.onprogress = function (event) {
if (event.lengthComputable) {
var complete = (event.loaded / event.total * 100 | 0);
progress.value = progress.innerHTML = complete;
}
}
}
xhr.send(formData);
}
}
if (tests.dnd) {
holder.ondragover = function () { this.className = 'hover'; return false; };
holder.ondragend = function () { this.className = ''; return false; };
holder.ondrop = function (e) {
this.className = '';
e.preventDefault();
readfiles(e.dataTransfer.files);
}
}
else {
fileupload.className = 'hidden';
fileupload.querySelector('input').onchange = function () {
readfiles(this.files);
};
}
</script>
<script id="script_myfilework>
funtion myfilework( j, file ) {
alert( j+" file="+file );
}
</script>
<script id="script_upload_input">>
var upload = document.getElementsByTagName('input')[0],
holder2 = document.getElementById('holder2'),
state = document.getElementById('status');
if (typeof window.FileReader === 'undefined') {
state.className = 'fail';
}
else {
state.className = 'success';
state.innerHTML = 'File API & FileReader available';
}
upload.onchange = function (e) {
e.preventDefault();
var file = upload.files[0],
reader = new FileReader();
reader.onload = function (event) {
var img = new Image();
img.src = event.target.result;
// note: no onload required since we've got the dataurl...I think! :)
if (img.width > 560) { // holder width
img.width = 560;
}
holder2.innerHTML = '';
holder.appendChild(img);
};
reader.readAsDataURL(file);
return false;
};
// var formData = new FormData();
// formData.append("part_num", "123ABC");
// formData.append("part_price", 7.95);
// formData.append("part_image", somefile)
//
// var xhr = new XMLHttpRequest();
// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
// xhr.send(formData);
</script>
<canvas color="darkSlategrey" height="100" width="400"></canvas>
<script>
var canvas = document.getElementsByTagName('canvas')[0],
ctx = null,
grad = null,
body = document.getElementsByTagName('body')[0],
color = 255;
color = lightblue;
if (canvas.getContext('2d')) {
ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, 600, 600);
ctx.save();
// Create radial gradient
// grad = ctx.createRadialGradient(0,0,0,0,0,600);
// grad.addColorStop(0, '#000');
// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
// assign gradients to fill
// ctx.fillStyle = grad;
ctx.fillstyle = "lightblue";
// draw 600x600 fill
ctx.fillRect(0,0,600,600);
ctx.save();
body.onmousemove = function (event) {
var width = window.innerWidth,
height = window.innerHeight,
x = event.clientX,
y = event.clientY,
rx = 600 * x / width,
ry = 600 * y / height;
var xc = ~~(256 * x / width);
var yc = ~~(256 * y / height);
grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
grad.addColorStop(0, '#000');
grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
// ctx.restore();
// ctx.fillStyle = grad;
ctx.fillstyle="lightblue";
ctx.fillRect(0,0,600,600);
// ctx.save();
};
}
</script>
<!-- DIV_CSV -->
<div id="div_csv"><h3>div_csv 300</h3></div id="div_csv_end" >
<script id="script_upload_csv" type="text/javascript">
// function upload_csv() {
function Upload() {
// var files = evt.dataTransfer.files; // FileList object.
// var fileUpload = document.getElementById("upload_files");
var fileUpload = document.getElementById("fileUpload");
var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
if (regex.test(fileUpload.value.toLowerCase())) {
if (typeof (FileReader) != "undefined") {
var reader = new FileReader();
reader.onload = function (e) {
var table = document.createElement("table");
var rows = e.target.result.split("\n");
for (var i = 0; i < rows.length; i++) {
var row = table.insertRow(-1);
// var cells = rows[i].split("|");
var cells = rows[i].split(",");
for (var j = 0; j < cells.length; j++) {
var cell = row.insertCell(-1);
cell.innerHTML = cells[j];
}
}
var csv2tbl = document.getElementById("csv2tbl");
csv2tbl.innerHTML = "";
csv2tbl.appendChild(table);
}
reader.readAsText(fileUpload.files[0]);
file_csv=fileUpload.files[0];
file_csvlen = fileUpload.files.length;
alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
load_file_csv(file_csv);
}
else {
alert("csv2tbl warn: unauthorized access noted");
}
}
else {
alert("csv2tbl fail: unsuppoted format");
}
}
</script id="script_upload_csv" >
<script id="script_load_file_csv">
function load_file_csv(file_csv) {
alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
file_psv=file_csv.replace(",","|");
return(file_psv);
}
</script id="script_load_file_csv_end">
<label id="label_upload_csv" class="fileContainer">
files.csv.psv.txt
<input id="fileUpload" type="file"></input id="fileUpload_end" >
</label id="label_upload_csv_end" >
     
<label id="label_parse_csv" class="fileContainer">
parse.csv.psv.txt
<input id="upload" value="Upload" onclick="Upload()" type="button"></input>
</label id="label_parse_csv" >
<div id="csv2tbl"><h3>csv2tbl MSG_367</h3></div id="csv2tbl_end" >
<script id="script_uploads" type="text/javascript">
// grab the file input and bind a change event onto it
// new html5 formdata object.
// for each entry, add to formdata to later access via $_FILES["file" + i]
//send formdata to server-side
$(function() {
$('#file').bind("change", function() {
var formData = new FormData();
for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
formData.append("file" + i, document.getElementById('file').files[i]);
}
$.ajax({
// url: "file-upload.php", // our php file
// url: "ka1_fileupload.php", // our php file
// nurl: "http://ka1/ka1.php?q=up", // our php file
// url: "/kup.php", // our php file
// url: "/ka1_up.php", // our php file
// url: "/ka1.php?q=kup", // our php file
// url: "/ko0.php?q=kup", // our php file
// url: "/ko1.php?q=kup", // our php file
// bugs url: "10.0.0.112:/ka1.php?q=up", // our php file
// url: "/ko.php?todo=mp3s", // our php file
url: "/ko.php?kup", // our php file
type: 'post',
data: formData,
dataType: 'html', // we return html from our php file
async: true,
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
success : function(data) {
$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
$('#upload-result .alert').append(data);
},
error : function(request) {
console.log(request.responseText);
}
});
});
});
</script id="script_uploads_end" >
<hr color=white>
<hr color=black>
<div id='editableDiv' contenteditable='true'>paste</div id='editableDiv_end' >
<hr color=black>
<hr color=white>
<hr color=black>
<div id='div' contenteditable='true'>ffpaste</div id='div_end'>
<hr color=black>
<hr color=white>
<script id="script_clipboard" >
function handlePaste (e) {
var clipboardData, pastedData;
// Stop data actually being pasted into div
e.stopPropagation();
e.preventDefault();
// Get pasted data via clipboard API
clipboardData = e.clipboardData || window.clipboardData;
pastedData = clipboardData.getData('Text');
// Do whatever with pasteddata
alert(pastedData);
}
document.getElementById('editableDiv').addEventListener('paste', handlePaste);
</script id="script_clipboard_end" >
<script id="script_clipboard_ff" >
// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
// Check for 'text/html' in types list. See abligh's answer below for deatils on
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// Safari/Edge don't advertise HTML data even if it is available
// Extract data and pass it to callback
// Stop the data from actually being pasted
// Everything else: Move existing element contents to a DocumentFragment for safekeeping
// Then wait for browser to paste content into it and cleanup
function handlepaste_ff (e) {
var types, pastedData, savedContent;
if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
types = e.clipboardData.types;
if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
pastedData = e.clipboardData.getData('text/html');
// processPaste(editableDiv, pastedData);
processPaste_ff(editableDiv, pastedData);
e.stopPropagation();
e.preventDefault();
return false;
}
}
savedContent = document.createDocumentFragment();
while(editableDiv.childNodes.length > 0) {
savedContent.appendChild(editableDiv.childNodes[0]);
}
waitForPastedData(editableDiv, savedContent);
return true;
}
// If data has been processes by browser, process it
// Retrieve pasted content via innerHTML
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
// Restore saved content
// Call callback
// Else wait 20ms and try again
function waitForPastedData (elem, savedContent) {
if (elem.childNodes && elem.childNodes.length > 0) {
var pastedData = elem.innerHTML;
elem.innerHTML = "";
elem.appendChild(savedContent);
processPaste_ff(elem, pastedData);
}
else {
setTimeout(function () {
waitForPastedData(elem, savedContent)
}, 20);
}
}
// Do whatever with gathered data;
// Modern browsers. Note: 3rd argument is required for Firefox <= 6
function processPaste_ff (elem, pastedData) {
alert(pastedData);
elem.focus();
}
if (editableDiv.addEventListener) {
editableDiv.addEventListener('paste', handlepaste, false);
}
// IE <= 8
else {
editableDiv.attachEvent('onpaste', handlepaste);
}
$(document).on('paste','[contenteditable]',function(e) {
e.preventDefault();
var text = (e.originalEvent || e).clipboardData.getData('text/plain');
window.document.execCommand('insertText', false, text);
});
</script id="script_clipboard_ff_end" >
<script id="script_clipboard_jskit" >
function getSelectionText(){
var selectedText = ""
if (window.getSelection){ // all modern browsers and IE9+
selectedText = window.getSelection().toString()
}
return selectedText
}
document.addEventListener('mouseup', function(){
var thetext = getSelectionText()
if (thetext.length > 0){ // check there's some text selected
console.log(thetext) // logs whatever textual content the user has selected on the page
}
}, false)
function copySelectionText(){
var copysuccess // var to check whether execCommand successfully executed
try{
copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
}
catch(e){
copysuccess = false
}
return copysuccess
}
</script id="script_clipboard_jskit_end" >
</div id="div_files_end">
<br />
<hr color="yellow" />
<div id="div_tail" >
<h1>div_tail</h1>
<a href=./ target=_blank><img src=/imgs/gif/disks/disk_yellow.gif></a>
</div id="div_tail_end" >
<script id="script_wz_lang" type="text/javascript">
<!--
var G_LANG = "E";
//-->
</script id="script_wz_lang_end" >
<!-- <script id="script_wz_grapher" type="text/javascript" src="/js/wz/wz_grapher.js"></script> -->
<script id="script_b64_wz_grapher"
src="data:/text/plain;base64,LyogVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHVudG91Y2hlZCBhdCBhbGwgdGltZXMuCnd6X2dyYXBoZXIuanMKCkNvcHlyaWdodCAoYykgMjAwMyBXYWx0ZXIgWm9ybi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KQ3JlYXRlZCAzMC4gOS4gMjAwMyBieSBXYWx0ZXIgWm9ybiAoV2ViOiBodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tICkKTGFzdCBtb2RpZmllZDogMjguIDMuIDIwMDcKClRoZSBsYXRlc3QgdmVyc2lvbiBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbQpvciBodHRwOi8vd3d3LmRldmlyYS5jb20Kb3IgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmRlCgpDcm9zcy1icm93c2VyIEphdmFTY3JpcHQgZnVuY3Rpb24gZ3JhcGhlci4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOwp5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CmVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CndpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuClNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYXQgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sIGZvciBtb3JlIGRldGFpbHMuCiovCgoKLyoqKioqKioqKioqICBDb25maWcgdmFyaWFibGVzICAqKioqKioqKioqLwp2YXIgQk9SREVSQ09MT1IgPSAnI2Q2ZDZkNic7CnZhciBGUkFNRUNPTE9SID0gJyNlZWVlZWUnOwp2YXIgQ05WQ09MT1IgPSAnI2ZmZmZmZic7CnZhciBTQ0FMRUNPTE9SID0gJyMwMDAwMDAnOwp2YXIgQVhDT0xPUiA9ICcjNjY2NjY2JzsKdmFyIEdSSURDT0xPUiA9ICcjZDZkNmQ2JzsKdmFyIEdSQVBIQ09MT1IgPSBbCgknZmYwMDAwJywKCScwMDlmMDAnLAoJJzQ0NDRmZicsCgknZmZhYTAwJywKCScwMGUwZTAnLAoJJ2IwMDA5OScsCgknMDBkMDAwJywKCSdjYzY2MzMnLAoJJzMzMzNjYycsCgknZmY3NzQ0JywKCScwMGMwYWEnLAoJJ2ZmMDBmZicsCgknMDA2ZjAwJywKCSdjYzAwMDAnLAoJJzAwOTZkMCcsCgknOTkwMGVlJwpdOwp2YXIgREVGVyA9IDUyMDsgLy8gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNhbnZhcwp2YXIgTEVGVCA9IDUwOyAgLy8gbGVmdCBtYXJnaW4gY29ubnRhaW5pbmcgeS1oYXNoIGxheWVyCnZhciBUT1AgPSA0OyAgICAvLyB0b3AgICAiCnZhciBSSUdIVCA9IDEyNDsvLyByaWdodCAiICBjb250YWluaW5nIG9wdGlvbnMKdmFyIEJPVFRPTSA9IDIyOy8vIGJvdHRvbSBtYXJnaW4gY29udGFpbmluZyB4LWhhc2ggbGF5ZXIKLyoqKioqKioqKiAgIEVuZCBjb25maWcgdmFyaWFibGVzICAgKioqKioqKioqKiovCgoKdmFyIGdfZnJhbWUsCmdfaW5wdXRUYiwKZ19jbnYsICAgICAgICAgLy8gY2FudmFzCmdfZ3JpZGx5ciwKZ194bHlyLCBnX3lseXIsLy8gbGF5ZXJzIGZvciB4LSBhbmQgeS1oYXNoCmdfdGVybWx5ciwgICAgIC8vIHRlcm1zdHJpbmctbGF5ZXIgb24gYm90dG9tIG9mIGNhbnZhcwpnX29wdHNseXIsCmdfY29vcmR0aXAsICAgIC8vIHRvb2x0aXAgZGlzcGxheWluZyBtb3VzZS1jby1vcmRpbmF0ZXMKZ19uID0gMCwgICAgICAgLy8gbnVtYmVyIG9mIGdyYXBocyBvbiBjbnYKZ19odG0gPSAnJywKZ190ZXJtLApnX3csIGdfaCwgICAgICAvLyBzaXplIG9mIGNudgpnX3hhLCBnX3h6LCAgICAvLyB4IG1pbiwgeCBtYXgKZ195YSwgZ195eiwKZ19keCwgZ19keSwgICAgLy8gZGVsdGEgdmFsdWUvcHgKZ19wYWdlWCwgZ19wYWdlWSwgLy8gcG9zaXRpb24gb2YgY2FudmFzCmdfd2FpdCA9IDAsCmdfaW5maW4gPSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAsCgpnX2FkaHRtLCBnX2RvbSwKZ19tb3osCmdfdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksCmdfaWUgPSAhISghd2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmFsbCAmJiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpKSwKZ19pZW1hYyA9ICEhKGdfaWUgJiYgZ191YS5pbmRleE9mKCdtYWMnKSA+PSAwKSwKZ19rcSA9ICEhKGdfdWEuaW5kZXhPZigna29ucXUnKSA+PSAwKSwKZ19kYiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5IHx8IG51bGw7CgoKZnVuY3Rpb24gaW5pdChvKQp7CglnX2ZyYW1lID0gZ2V0RGl2KCdncmFwaGZyYW1lJyk7CglpZiAoIWdfZnJhbWUpIHJldHVybjsKCWdfdyA9IGdfaCA9IERFRlc7CgkobyA9IGdfZnJhbWUuc3R5bGUpLndpZHRoID0gKExFRlQrZ193KzErUklHSFQpKydweCc7CglvLmhlaWdodCA9IChUT1ArZ19oK0JPVFRPTSkrJ3B4JzsKCW8uYmFja2dyb3VuZCA9IChnX2lucHV0VGIgPSBnZXREaXYoJ2lucHV0cycpKS5zdHlsZS5iYWNrZ3JvdW5kID0gRlJBTUVDT0xPUjsKCWdfaW5wdXRUYi5zdHlsZS53aWR0aCA9IChnX3crMStMRUZUK1JJR0hUKSsncHgnOwoJby5ib3JkZXJCb3R0b20gPSBvLmJvcmRlclJpZ2h0ID0gby5ib3JkZXJMZWZ0ID0gZ19pbnB1dFRiLnN0eWxlLmJvcmRlclRvcCA9IGdfaW5wdXRUYi5zdHlsZS5ib3JkZXJSaWdodCA9IGdfaW5wdXRUYi5zdHlsZS5ib3JkZXJMZWZ0ID0gJzFweCBzb2xpZCAnK0JPUkRFUkNPTE9SOwoJZ19hZGh0bSA9ICh0eXBlb2YgZ19mcmFtZS5pbnNlcnRBZGphY2VudEhUTUwgIT0gInVuZGVmaW5lZCIpOwoJZ19kb20gPSAoIWdfYWRodG0gJiYKCQl0eXBlb2YgZ19mcmFtZS5hcHBlbmRDaGlsZCAhPSAidW5kZWZpbmVkIiAmJgoJCXR5cGVvZiBkb2N1bWVudC5jcmVhdGVSYW5nZSAhPSAidW5kZWZpbmVkIiAmJgoJCXR5cGVvZiAobyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpLnNldFN0YXJ0QmVmb3JlICE9ICJ1bmRlZmluZWQiICYmCgkJdHlwZW9mIG8uY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50ICE9ICJ1bmRlZmluZWQiKTsKCWdfbW96ID0gZG9jdW1lbnQuYm9keSAmJiB0eXBlb2YgZG9jdW1lbnQuYm9keS5zdHlsZS5Nb3pPcGFjaXR5ICE9ICJ1bmRlZmluZWQiOwoJZ2V0Q252UG9zKCk7CglwYWludChnX2ZyYW1lLAoJCW1rRGl2KCcnLCAnJywgTEVGVCwgVE9QLCBnX3crMSwgZ19oKzEsIENOVkNPTE9SLCAnYmdseXInKSsKCQlta0RpdignJywgJycsIExFRlQsIFRPUCwgZ193KzEsIGdfaCsxLCAnJywgJ2dyaWRseXInKSsKCQlta0RpdignJywgJycsIExFRlQsIFRPUCwgZ193KzEsIGdfaCsxLCAnJywgJ2Nudmx5cicpKwoJCW1rRGl2KCcnLCAnJywgTEVGVCwgVE9QK2dfaCsxLCBnX3crMSwgQk9UVE9NLCAnJywgJ3hseXInLCB0cnVlKSsKCQlta0RpdignJywgJ3JpZ2h0JywgMCwgVE9QLCBMRUZULCBnX2grMSwgJycsICd5bHlyJywgdHJ1ZSkrCgkJbWtEaXYoJycsICcnLCBMRUZUK2dfdys0LCBUT1ArKGdfaD4+MSktMjAwLCBSSUdIVCwgZ19oLCAnJywgJ29wdHMnLCB0cnVlKQoJKTsKCXBhaW50KGdldERpdignb3B0cycpLAoJCSc8aW5wdXQgbmFtZT0iR1JJRCIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQgb25jbGljaz0ic2V0VGltZW91dChcJ3NldEdyaWRWaXMoKTtcJywgMTApIj4nK1NfU0hPV0dSSUQrCgkJJzxicj4mbmJzcDs8YnI+PGlucHV0IG5hbWU9IlhZUkFUSU8iIHR5cGU9ImNoZWNrYm94Ij4nK1NfU0FNRVNDQUxFKwoJCSc8YnI+Jm5ic3A7PGJyPjxpbnB1dCBuYW1lPSJGSVRXTkQiIHR5cGU9ImNoZWNrYm94Ij4nK1NfRklUV05EKwoJCSc8YnI+Jm5ic3A7PGJyPjxpbnB1dCBuYW1lPSJQUlQiIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJzZXRUaW1lb3V0KFwncHJ0KCk7XCcsIDEwKSI+JytTX1BSVFZJRVcrCgkJJzxicj4mbmJzcDs8YnI+Jm5ic3A7PGJyPiZuYnNwOzxicj4nK1NfUE9TVFJFUElORywKCQl0cnVlCgkpOwoJKG8gPSAoZ19jbnYgPSBnZXREaXYoJ2Nudmx5cicpKS5zdHlsZSkuekluZGV4ID0gMTsKCW8uY3Vyc29yID0gJ2Nyb3NzaGFpcic7CglnX3hseXIgPSBnZXREaXYoJ3hseXInKTsKCWdfeWx5ciA9IGdldERpdigneWx5cicpOwoJZ19ncmlkbHlyID0gZ2V0RGl2KCdncmlkbHlyJyk7CglnX3Rlcm1seXIgPSBnZXREaXYoJ3Rlcm1zJyk7CglnX29wdHNseXIgPSBnZXREaXYoJ29wdHMnKTsKCWlmIChkb2N1bWVudC5jYXB0dXJlRXZlbnRzKSBkb2N1bWVudC5jYXB0dXJlRXZlbnRzKEV2ZW50Lk1PVVNFTU9WRSk7Cgl3aW5kb3cub25yZXNpemUgPSBnZXRDbnZQb3M7Cn0KCgpmdW5jdGlvbiBpc051bSh4KQp7CglyZXR1cm4gKCFpc05hTih4KSAmJiB0eXBlb2YgeCA9PSAnbnVtYmVyJyk7Cn0KCgpmdW5jdGlvbiBnZXREaXYoeCkKewoJeCA9ICEhZG9jdW1lbnQuYWxsPyBkb2N1bWVudC5hbGxbeF0gOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh4KSA6IG51bGw7CglyZXR1cm4gKHggJiYgdHlwZW9mIHguc3R5bGUgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHguaW5uZXJIVE1MICE9ICd1bmRlZmluZWQnKT8geCA6IG51bGw7Cn0KCgpmdW5jdGlvbiBnZXRDbnZQb3MobykKewoJZ19wYWdlWCA9IExFRlQrMTsKCWdfcGFnZVkgPSBUT1A7CglvID0gZ19mcmFtZTsKCXdoaWxlIChvLm9mZnNldFBhcmVudCkKCXsKCQlnX3BhZ2VYICs9IG8ub2Zmc2V0TGVmdDsKCQlnX3BhZ2VZICs9IG8ub2Zmc2V0VG9wOwoJCW8gPSBvLm9mZnNldFBhcmVudDsKCX0KfQoKCmZ1bmN0aW9uIGdldFZhbChlbCwgeSkKewoJcmV0dXJuICgoeSA9IGVsLnZhbHVlLnJlcGxhY2UoLyAvZywgJycpKSA9PSAnJyB8fCAhaXNOYU4oeSA9IHBhcnNlRmxvYXQoeS5yZXBsYWNlKC9cLC8sJy4nKSkpKT8geSA6ICduJzsKfQoKCmZ1bmN0aW9uIGFsZXJ0RXJyKGVsLCBzdHIpCnsKCWFsZXJ0KFNfRVJSX0JBU0UgKyBzdHIpOwoJZWwuZm9jdXMoKTsKCWVsLnNlbGVjdCgpOwp9CgoKZnVuY3Rpb24gc2V0Q3NzV0gobywgdywgaCwgb3ZlcikKewoJKG8gPSBvLnN0eWxlKS53aWR0aCA9IHcrJ3B4JzsKCW8uaGVpZ2h0ID0gaCsncHgnOwoJaWYgKCFvdmVyKQoJewoJCW8uY2xpcCA9ICdyZWN0KDAsJyt3KydweCwnK2grJ3B4LDApJzsKCQlvLm92ZXJmbG93ID0gJ2hpZGRlbic7Cgl9Cn0KCgpmdW5jdGlvbiByZXNpemVDbnYobykKewoJZ19pbnB1dFRiLnN0eWxlLndpZHRoID0gKExFRlQrZ193KzErUklHSFQpKydweCc7CglzZXRDc3NXSChnX2ZyYW1lLCBMRUZUK2dfdysxK1JJR0hULCBNYXRoLm1heCgzNTAsIFRPUCtnX2grQk9UVE9NKSk7CglzZXRDc3NXSChnZXREaXYoJ2JnbHlyJyksIGdfdysxLCBnX2grMSk7CglzZXRDc3NXSChnX2NudiwgZ193KzEsIGdfaCsxKTsKCXNldENzc1dIKGdfZ3JpZGx5ciwgZ193KzEsIGdfaCsxKTsKCXNldENzc1dIKGdfeWx5ciwgTEVGVCwgZ19oKzEsIHRydWUpOwoJc2V0Q3NzV0goKG8gPSBnX3hseXIpLCBnX3crMSwgQk9UVE9NLCB0cnVlKTsKCW8uc3R5bGUudG9wID0gKFRPUCtnX2grMSkrJ3B4JzsKCWdfb3B0c2x5ci5zdHlsZS5sZWZ0ID0gKExFRlQrZ193KzUpKydweCc7Cn0KCgpmdW5jdGlvbiBmaXRXbmQoKQp7CglpZiAoZG9jdW1lbnQuZm9ybXMuZm8uRklUV05ELmNoZWNrZWQpCgl7CgkJaWYgKCEhKChvID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpICYmIG8uY2xpZW50V2lkdGgpKQoJCXsKCQkJdmFyIF93ID0gby5jbGllbnRXaWR0aDsKCQkJdmFyIF9oID0gby5jbGllbnRIZWlnaHQ7CgkJfQoJCWVsc2UKCQl7CgkJCXZhciBfdyA9IHdpbmRvdy5pbm5lcldpZHRoOwoJCQl2YXIgX2ggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CgkJfQoJCWdfdyA9IGdfaCA9IE1hdGgubWluKF93LV93JTItTEVGVC1SSUdIVCwgX2gtX2glMi1UT1AtQk9UVE9NKS00OwoJfQoJZWxzZSBnX3cgPSBnX2ggPSBERUZXOwoJcmVzaXplQ252KCk7CglnZXRDbnZQb3MoKTsKfQoKCmZ1bmN0aW9uIGluaXRDb29yZHRpcChvKQp7CgkobyA9IChnX2Nvb3JkdGlwID0gZ2V0RGl2KCdjb29yZHRpcCcpKS5zdHlsZSkubGVmdCA9IChnX3BhZ2VYKzE1KSsncHgnOwoJby50b3AgPSAoZ19wYWdlWSsxMCkrJ3B4JzsKCW8uekluZGV4ID0gMjsKCXBhaW50KGdfY29vcmR0aXAsICc8c21hbGwgc3R5bGU9ImJhY2tncm91bmQ6JytDTlZDT0xPUisnO3doaXRlLXNwYWNlOm5vd3JhcDsiPicrU19DT09SRFRJUCsnPFwvc21hbGw+Jyk7CglnX2Nudi5vbm1vdXNlb3ZlciA9IGZ1bmN0aW9uKCkge2RvY3VtZW50Lm9ubW91c2Vtb3ZlID0gY29vcmRUaXA7IGdfY252Lm9ubW91c2VvdmVyID0gbnVsbDt9Cn0KCgpmdW5jdGlvbiBwcnQoKQp7CglnZXREaXYoJ2JvZHkxJykuc3R5bGUuZGlzcGxheSA9IGdldERpdignYm9keTInKS5zdHlsZS5kaXNwbGF5ID0gKGRvY3VtZW50LmZvcm1zLmZvLlBSVC5jaGVja2VkKT8gJ25vbmUnIDogJ2Jsb2NrJzsKCWdldENudlBvcygpOwp9CgoKZnVuY3Rpb24gc2V0R3JpZFZpcygpCnsKCWdfZ3JpZGx5ci5zdHlsZS52aXNpYmlsaXR5ID0gKGRvY3VtZW50LmZvcm1zLmZvLkdSSUQuY2hlY2tlZCk/ICd2aXNpYmxlJyA6ICdoaWRkZW4nOwp9CgoKZnVuY3Rpb24gZGVsR3JhcGhzKGFzaykKewoJaWYgKGFzayAmJiAhKGdfbiAmJiB3aW5kb3cuY29uZmlybShTX0RFTEdSQVBIUykpKSByZXR1cm47CglnX24gPSAwOwoJcGFpbnQoZ19jbnYsICcnKTsKCXBhaW50KGdfdGVybWx5ciwgJycpOwp9CgoKU3RyaW5nLnByb3RvdHlwZS50b0V4cCA9IGZ1bmN0aW9uKCkKewoJdmFyIG5lZyA9ICh0aGlzLmNoYXJBdCgwKSA9PSAnLScpKjE7Cgl2YXIgbiA9IHRoaXMubWF0Y2goL1sxLTldL2cpLmxlbmd0aDsKCWlmIChNYXRoLmFicyhwYXJzZUZsb2F0KHRoaXMpKSA+IDEpCgkJcmV0dXJuIHRoaXMuc3Vic3RyaW5nKDAsbmVnKzEpICsgKChuLTEpPyAoJy4nK3RoaXMuc3Vic3RyaW5nKG5lZysxLCB0aGlzLmluZGV4T2YoJzAnKSkpIDogJycpICsgJyoxMDxzdXA+JyArICh0aGlzLmxlbmd0aC0xLW5lZykgKyAnPFwvc3VwPic7CglyZXR1cm4gKG5lZz8gJy0nIDogJycpICsgdGhpcy5tYXRjaCgvWzEtOV0vKVswXSArICgobi0xKT8gKCcuJyt0aGlzLnN1YnN0cmluZyh0aGlzLmxlbmd0aC1uKzEpKSA6ICcnKSArICcqMTA8c3VwPi0nICsgKHRoaXMuc3Vic3RyaW5nKHRoaXMuaW5kZXhPZignLicpKzEpLmxlbmd0aC1uKzEpICsgJzxcL3N1cD4nOwp9CgoKZnVuY3Rpb24gc2hpZnRMKHgsIG4pCnsKCXZhciBuZWcgPSAoeCA8IDApPyAnLScgOiAnJzsKCXggPSAnJytNYXRoLmFicyh4KTsKCXdoaWxlIChuLS0pCgl7CgkJaWYgKHguY2hhckF0KHgubGVuZ3RoLTEpID09ICcwJykKCQkJeCA9IHguc3Vic3RyaW5nKDAsIHgubGVuZ3RoLTEpOwoJCWVsc2UgaWYgKCEoL1wuLykudGVzdCh4KSkKCQkJeCA9IHguc3Vic3RyaW5nKDAsIHgubGVuZ3RoLTEpKycuJyt4LmNoYXJBdCh4Lmxlbmd0aC0xKTsKCQllbHNlIGlmICgheC5pbmRleE9mKCcuJykpCgkJCXggPSAnLjAnK3guc3Vic3RyaW5nKDEpOwoJCWVsc2UgeCA9IHguc3Vic3RyaW5nKDAsIHguaW5kZXhPZignLicpLTEpKycuJyt4LmNoYXJBdCh4LmluZGV4T2YoJy4nKS0xKSt4LnN1YnN0cmluZyh4LmluZGV4T2YoJy4nKSsxKTsKCX0KCWlmICh4LmNoYXJBdCgwKSA9PSAnLicpIHggPSAnMCcreDsKCXJldHVybiBuZWcreDsKfQoKCmZ1bmN0aW9uIG1rSXYoeCkKewoJeCAqPSBERUZXL2dfdzs7Cgl2YXIgaSA9IDA7Cgl3aGlsZSAoeC0xMDAgPD0gMCkKCXsKCQl4ICo9IDEwOwoJCWkrKzsKCX0KCXdoaWxlICh4LTEwMDAgPiAwKQoJewoJCXggLz0gMTA7CgkJaS0tOwoJfQoJeCA9IE1hdGguZmxvb3IoeCk7Cgl4ID0gKHgtNjAwID49IDApPyAxMDAgOiAoeC0zMDAgPj0gMCk/IDUwIDogKHgtMjAwID49IDApPyAyNSA6IDIwOwoJd2hpbGUgKGkgPCAwKQoJewoJCXggPSBwYXJzZUludCh4ICs9ICcwJyk7CgkJaSsrOwoJfQoJcmV0dXJuIHBhcnNlRmxvYXQoc2hpZnRMKHgsIGkpKTsKfQoKCmZ1bmN0aW9uIG1rTnVtU3RyKG4sIGl2LCB0b0UpCnsKCXZhciBpID0gMDsKCWlmICghbiB8fCAhaXYpIHJldHVybiAnMCc7Cgl3aGlsZSAoTWF0aC5hYnMoaXYpLTEgPCAwKQoJewoJCWl2ICo9IDEwOwoJCWkrKzsKCX0KCW4gPSBzaGlmdEwoIXRvRT8gTWF0aC5yb3VuZChuKml2KSA6IChuKml2KSwgaSk7CglyZXR1cm4gKHRvRSAmJiBuLmxlbmd0aCA+IDYpPyBuLnRvRXhwKCkgOiBuOwp9CgoKZnVuY3Rpb24gbWtTY2FsZSgpCnsKCXZhciBpdnggPSBta0l2KGdfeHotZ194YSksIGl2eSA9IG1rSXYoKGdfeXotZ195YSkqZ193L2dfaCksCglyeCA9IGl2eC9nX2R4LCByeSA9IGl2eS9nX2R5LAoJaHRtID0gJycsIGdyaWRodG0gPSAnJywKCXBvcywgc3RyLCBzdHJzLCBzdHJsLAoJbGltdCA9IE1hdGgucm91bmQoZ194ei9nX2R4KSwgbGltYiA9IE1hdGgucm91bmQoZ194YS9nX2R4KSwKCWogPSBNYXRoLmNlaWwoZ194YS9pdngpLAoJaSA9IE1hdGgucm91bmQoaipyeCk7Cgl3aGlsZSAoaS1saW10IDw9IDApCgl7CgkJc3RycyA9IChzdHIgPSAnJytta051bVN0cihqLCBpdngsIHRydWUpKS5tYXRjaCgvW15cPlw8YS16XSsvZyk7CgkJc3RybCA9IHN0cnNbMF0ubGVuZ3RoICsgKHN0cnNbMV0/IHN0cnNbMV0ubGVuZ3RoIDogMCk7CgkJaHRtICs9IG1rRGl2KCcnLCAnJywgKHBvcyA9IGktbGltYiksIDAsIDEsIDQsIFNDQUxFQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSkrCgkJCW1rRGl2KCc8Zm9udCBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6YmxhY2s7Ij4nK3N0cisnPFwvZm9udD4nLCAnJywgcG9zLTMqc3RybCwgNCwgMTYqc3RybCwgMTIsICcnLCAnJywgdHJ1ZSwgZmFsc2UpOwoJCWdyaWRodG0gKz0gbWtEaXYoJycsICcnLCAgcG9zLCAwLCAxLCBnX2grMSwgIWo/IEFYQ09MT1IgOiBHUklEQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSk7CgkJaSA9IE1hdGgucm91bmQoKytqKnJ4KTsKCX0KCXBhaW50KGdfeGx5ciwgaHRtKTsKCXZhciBzY2x3ID0gcGFyc2VJbnQoZ195bHlyLnN0eWxlLndpZHRoKTsKCWh0bSA9ICcnOwoJbGltdCA9IE1hdGgucm91bmQoZ195ei9nX2R5KSwgbGltYiA9IE1hdGgucm91bmQoZ195YS9nX2R5KTsKCWogPSBNYXRoLmNlaWwoZ195YS9pdnkpOwoJaSA9IE1hdGgucm91bmQoaipyeSk7Cgl3aGlsZSAoaS1saW10IDw9IDApCgl7CgkJc3RybCA9IChzdHIgPSAnJytta051bVN0cihqLCBpdnksIHRydWUpKS5sZW5ndGg7CgkJaHRtICs9IG1rRGl2KCcnLCAnJywgc2Nsdy00LCAocG9zID0gZ19oLWkrbGltYiksIDQsIDEsIFNDQUxFQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSkrCgkJCW1rRGl2KCc8Zm9udCBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6YmxhY2s7Ij4nK3N0cisnPFwvZm9udD4nLCAncmlnaHQnLCAwLCBwb3MtNywgc2Nsdy02LCAxMiwgJycsICcnLCB0cnVlLCBmYWxzZSk7CgkJZ3JpZGh0bSArPSBta0RpdignJywgJycsICAwLCBwb3MsIGdfdysxLCAxLCAhaj8gQVhDT0xPUiA6IEdSSURDT0xPUiwgJycsIGZhbHNlLCB0cnVlKTsKCQlpID0gTWF0aC5yb3VuZCgrK2oqcnkpOwoJfQoJcGFpbnQoZ195bHlyLCBodG0pOwoJcGFpbnQoZ19ncmlkbHlyLCBncmlkaHRtKTsKfQoKCmZ1bmN0aW9uIG1rRGl2KHR4dCwgYWxpZ24sIHgsIHksIHcsIGgsIGMsIGlkLCBvdmVyLCBjdXQpCnsKCWlmIChjdXQpCgl7CgkJaWYgKHgtZ193ID4gMCB8fCB4K3cgPCAwIHx8IHktZ19oID4gMCB8fCB5K2ggPCAwKSByZXR1cm4gJyc7CgkJaWYgKHkgPCAwKQoJCXsKCQkJaCArPSB5OwoJCQl5ID0gMDsKCQl9CgkJaWYgKHkraC1nX2gtMSA+IDApIGggPSBnX2grMS15OwoJCWlmICh4IDwgMCkKCQl7CgkJCXcgKz0geDsKCQkJeCA9IDA7CgkJfQoJCWlmICh4K3ctZ193LTEgPiAwKSB3ID0gZ193KzEreDsKCX0KCWlmIChnX2llKSByZXR1cm4gKCclJScreCsnOycreSsnOycrdysnOycraCsnOycrKGFsaWduPyAncmlnaDsnIDogJ2xlZjsnKSsoYz8gKGMrJzsnKSA6ICc7JykrKG92ZXI/ICd2aXNpYmxlOycgOiAnaGlkZGVuOycpKyhpZD8gKCcgaWQ9IicraWQrJyI+JykgOiAnPicpK3R4dCk7CglyZXR1cm4gKCc8ZGl2JysKCQkoaWQ/ICcgaWQ9IicraWQrJyInIDogJycpKwoJCScgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6JyArIHggKyAncHg7dG9wOicgKyB5ICsgJ3B4O3dpZHRoOicgKyB3ICsgJ3B4O2hlaWdodDonICsgaCArICdweDsnKwoJCShvdmVyPyAnJyA6ICgnY2xpcDpyZWN0KDAsJyArIHcgKyAncHgsJyArIGggKyAncHgsMCk7JyArIChnX21vej8gJycgOiAnb3ZlcmZsb3c6aGlkZGVuOycpKSkrCgkJKGM/ICdiYWNrZ3JvdW5kLWNvbG9yOicgKyBjICsgJzsnIDogJycpKwoJCSd0ZXh0LWFsaWduOicgKyAoYWxpZ24gfHwgJ2xlZnQnKSArICc7Ij4nICsgdHh0ICsgJzxcL2Rpdj4nCgkpOwp9CgoKZnVuY3Rpb24gZ1JlcGxhY2UoeCkKewoJcmV0dXJuIHgucmVwbGFjZSgvJSUoW147XSspOyhbXjtdKyk7KFteO10rKTsoW147XSspOyhbXjtdKyk7KFteO10qKTsoW147XSspOyhbXiUlXSopL2csCgkJJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6JDFweDt0b3A6JDJweDt3aWR0aDokM3B4O2hlaWdodDokNHB4O3RleHQtYWxpZ246JDV0OycrCgkJJ2JhY2tncm91bmQ6JDY7b3ZlcmZsb3c6JDc7IiQ4PFwvZGl2PicpOwp9CgoKZnVuY3Rpb24gcGFpbnQoY252LCBodG0sIGFkZCkKewoJaWYgKGNudikKCXsKCQlpZiAoYWRkKQoJCXsKCQkJdmFyIG87CgkJCWlmIChnX2FkaHRtKSBjbnYuaW5zZXJ0QWRqYWNlbnRIVE1MKCJCZWZvcmVFbmQiLCBnUmVwbGFjZShodG0pKTsKCQkJZWxzZSBpZiAoZ19kb20pCgkJCXsKCQkJCW8gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCQkJby5zZXRTdGFydEJlZm9yZShjbnYpOwoJCQkJbyA9IG8uY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bSk7CgkJCQljbnYuYXBwZW5kQ2hpbGQobyk7CgkJCX0KCQkJZWxzZSBjbnYuaW5uZXJIVE1MICs9IGh0bTsKCQl9CgkJZWxzZSBjbnYuaW5uZXJIVE1MID0gZ19pZT8gZ1JlcGxhY2UoaHRtKSA6IGh0bTsKCX0KfQoKCmZ1bmN0aW9uIHNjYWxlWSh4KQp7CglyZXR1cm4gKE1hdGgubWluKE1hdGgubWF4KGdfaCtNYXRoLnJvdW5kKChnX3lhLXgpL2dfZHkpLCAtMSksIGdfaCsxKSk7Cn0KCgpmdW5jdGlvbiBta1Rlcm0oeCkKewoJeCA9IHgudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccy9nLCcnKS4KCQlyZXBsYWNlKC9mKFwofFx7fFxbKXgoXCl8XH18XF0pXD0vZywgJycpLgoJCXJlcGxhY2UoL21hdGhcLi9nLCcnKS4KCQlyZXBsYWNlKC9cLipcOysvZywnOycpLgoJCXJlcGxhY2UoL1tcLlw7XSokLywnJykuCgkJcmVwbGFjZSgvXHwoW15cfF0qKVx8L2csJ2FicygkMSknKS4KCQlyZXBsYWNlKC86L2csJ1wvJykuCgkJcmVwbGFjZSgvsi9nLCdeMicpLgoJCXJlcGxhY2UoL7MvZywnXjMnKS4KCQlyZXBsYWNlKC9bXCJcJ10vZywnXicpLgoJCXJlcGxhY2UoL2UvZywnRScpLgoJCXJlcGxhY2UoL2xvZyhcZCkvZywnTE9HJDEnKS4KCQlyZXBsYWNlKC9sbihcZCkvZywnTE4kMScpLgoJCXJlcGxhY2UoL2FyYyh1cyk/fGFyRWF8YXIvZywnYScpLgoJCXJlcGxhY2UoL2h5cChFcmJvbGljdXMpPy9nLCdoJykuCgkJcmVwbGFjZSgvY29zaW4odXN8RSk/L2csJ2NvcycpLgoJCXJlcGxhY2UoL3Npbih1c3xFKS9nLCdzaW4nKS4KCQlyZXBsYWNlKC9zRWMoYW4oc3x0KSk/L2csJ3NlYycpLgoJCXJlcGxhY2UoL2Nvc2VjL2csJ2NzYycpLgoJCXJlcGxhY2UoL3RhbmdFbltzdF0vZywndGFuJykuCgkJcmVwbGFjZSgvY290YW4vZywnY290JykuCgkJcmVwbGFjZSgvcmFuZG9tKFwofFx7fFxbKShcKXxcfXxcXSl8cmFuZChvbSk/L2csJ3JhbmRvbSgpJykuCgkJcmVwbGFjZSgvKHB8cG93ZXIpKFwofFx7fFxbKS9nLCdwb3ckMicpLgoJCXJlcGxhY2UoLyhifHEpcihcKHxce3xcWykvZywnJDFydCQyJykuCgkJcmVwbGFjZSgvKHNxcnxzcXJ0KShcZCkvZywnU1FSVCQyJykuCgkJcmVwbGFjZSgvdGFuMi9nLCAndGFueicpLgoJCXJlcGxhY2UoL21heC9nLCdtYXonKS4KCQlyZXBsYWNlKC9waS9nLCdQSScpLgoJCXJlcGxhY2UoL3BoaS9nLCdQSEknKS4KCQlyZXBsYWNlKC95LywnbnV0cycpLgoJCXJlcGxhY2UoL2NFaWwvZywnY2VpbCcpLgoJCXJlcGxhY2UoL0V4cG93fEV4cC9nLCdleHAnKS4KCQlyZXBsYWNlKC8oW15tXXxeKShcKHxce3xcWykoXCl8XH18XF0pL2csJyQxJDJ4JDMnKS4KCQlyZXBsYWNlKC8oXCh8XHt8XFspXCwvZywnJDF4LCcpLgoJCXJlcGxhY2UoL1wsKFwpfFx9fFxdKS9nLCcseCQxJykuCgkJcmVwbGFjZSgvXCxcLC9nLCcseCwnKTsKCXggPSB4LnJlcGxhY2UoLyhbXkddXGRcZHxbXkdcZF1cZHxeXGR8XlxkXGQpRS9nLCckMSpFJyk7Cgl4ID0geC5yZXBsYWNlKC8oUlQxXzJ8UlQyfExOMTB8TE4yKShcZCkvZywnJDEqJDInKTsKCXZhciByZWcgPSAvKHh8RXxQSXxcKXxcfXxcXSkoRXxcZCkvZzsKCXdoaWxlICh4Lm1hdGNoKHJlZykpIHggPSB4LnJlcGxhY2UocmVnLCckMSokMicpOwoJcmVnID0gLyhcZHxFfFBJfHh8XCl8XH18XF0pKFwofFx7fFxbfHh8YXxjfGV4cHxmfGdhdXN8bHxtfHBvd3xyfHN8dGFufEx8UEl8U1FSVCkvZzsKCXdoaWxlICh4Lm1hdGNoKHJlZykpIHggPSB4LnJlcGxhY2UocmVnLCckMSokMicpOwoJeCA9IHgucmVwbGFjZSgvdGFuei9nLCd0YW4yJykucmVwbGFjZSgvbWF6L2csJ21heCcpOwoJcmV0dXJuIHg7Cn0KCgpmdW5jdGlvbiBXek1hdGgoKQp7Cgl0aGlzLlBISSA9IDEuNjE4MDMzOTg4NzQ5ODk0ODQ4MjA0NTg2ODM0MzY1NjsKCXRoaXMucm9vdCA9IGZ1bmN0aW9uKHgsIHhwKSB7cmV0dXJuIE1hdGgucG93KHgsIDEveHApO307Cgl0aGlzLmNicnQgPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgucG93KHgsIDEvMyk7fTsKCXRoaXMubG9nbiA9IGZ1bmN0aW9uKHgsIGJzKSB7cmV0dXJuIE1hdGgubG9nKHgpL01hdGgubG9nKGJzKTt9OwoJdGhpcy5sbiA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5sb2coeCk7fTsKCXRoaXMubGcgPSBmdW5jdGlvbiAoeCkge3JldHVybiBNYXRoLmxvZyh4KS9NYXRoLkxOMTA7fTsKCXRoaXMubGIgPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKHgpL01hdGguTE4yO307Cgl0aGlzLmNvdCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5jb3MoeCkvTWF0aC5zaW4oeCk7fTsKCXRoaXMuc2VjID0gZnVuY3Rpb24oeCkge3JldHVybiAxL01hdGguY29zKHgpO307Cgl0aGlzLmNzYyA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gMS9NYXRoLnNpbih4KTt9OwoJdGhpcy5hY290ID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmF0YW4oLXgpK01hdGguUEkvMjt9OwoJdGhpcy5hc2VjID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmFjb3MoMS94KTt9OwoJdGhpcy5hY3NjID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmFzaW4oMS94KTt9OwoJdGhpcy5zaW5oID0gZnVuY3Rpb24oeCkge3JldHVybiAoTWF0aC5leHAoeCktTWF0aC5leHAoLXgpKS8yO307Cgl0aGlzLmNvc2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCh4KStNYXRoLmV4cCgteCkpLzI7fTsKCXRoaXMuc2VjaCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gMi8oTWF0aC5leHAoeCkrTWF0aC5leHAoLXgpKTt9OwoJdGhpcy5jc2NoID0gZnVuY3Rpb24oeCkge3JldHVybiAyLyhNYXRoLmV4cCh4KS1NYXRoLmV4cCgteCkpO307Cgl0aGlzLnRhbmggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCgyKngpLTEpLyhNYXRoLmV4cCgyKngpKzEpO307Cgl0aGlzLmNvdGggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCgyKngpKzEpLyhNYXRoLmV4cCgyKngpLTEpO307Cgl0aGlzLmFzaW5oID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZyh4K01hdGguc3FydCh4KngrMSkpO307Cgl0aGlzLmFjb3NoID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZyh4K01hdGguc3FydCh4KngtMSkpO307Cgl0aGlzLmF0YW5oID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZygoMSt4KS8oMS14KSkvMjt9OwoJdGhpcy5hY290aCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5sb2coKHgrMSkvKHgtMSkpLzI7fTsKCXRoaXMuYXNlY2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKDEveCtNYXRoLnNxcnQoMS8oeCp4KS0xKSk7fTsKCXRoaXMuYWNzY2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKDEveCtNYXRoLnNxcnQoMS8oeCp4KSsxKSk7fTsKCXRoaXMuZ2F1c3NkID0gZnVuY3Rpb24oeCxtLHMpIHtyZXR1cm4gMS8ocyoyLjUwNjYyODI3NDYzMTAwMDIpKk1hdGguZXhwKC0oeCAtPSBtKSp4LygyKnMqcykpO307Cgl0aGlzLnNnbiA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gKHggPCAwKT8gLTEgOiAoeCA+IDApPyAxIDogMDt9OwoJdGhpcy5mYWN0ID0gZnVuY3Rpb24oeCkKCXsKCQl4ID0gTWF0aC5yb3VuZChNYXRoLmFicyh4KSk7CgkJaWYgKHggPiAxKSByZXR1cm4geCp0aGlzLmZhY3QoeC0xKTsKCQlyZXR1cm4gMTsKCX07IAp9Cld6TWF0aC5wcm90b3R5cGUgPSBNYXRoOwpXek1hdGggPSBuZXcgV3pNYXRoKCk7ICAgICAgICAKCgpmdW5jdGlvbiBta1Bvdyh4KQp7Cgl4ID0geC5yZXBsYWNlKC9ce3xcWy9nLCcoJykucmVwbGFjZSgvXH18XF0vZywnKScpOwoJd2hpbGUgKC9cXi8udGVzdCh4KSkKCXsKCQl2YXIgYXogPSB4LnNlYXJjaCgvXF4vKSwKCQlhID0geC5zdWJzdHJpbmcoMCwgYXopLCB6ID0geC5zdWJzdHJpbmcoYXorMSksCgkJcCA9IDAsIGNoLCBsaW0gPSBhei0xOwoJCXdoaWxlICh0cnVlKQoJCXsKCQkJY2ggPSBhLmNoYXJBdChsaW0pOwoJCQlpZiAoY2ggPT0gJyknKSBwKys7CgkJCWVsc2UgaWYgKGNoID09ICcoJykgcC0tOwoJCQlpZiAocCA8IDAgfHwgIXAgJiYgKCEobGltKzEpIHx8IC9bXCtcLVwqXC9cLF0vLnRlc3QoY2gpKSkgYnJlYWs7CgkJCWxpbS0tOwoJCX0KCQlhID0gYS5zdWJzdHJpbmcoMCwgbGltKzEpICsgJ3BvdygnICsgYS5zdWJzdHJpbmcobGltKzEsIGF6KTsKCQlsaW0gPSAwOyBwID0gMDsKCQl3aGlsZSAodHJ1ZSkKCQl7CgkJCWNoID0gei5jaGFyQXQobGltKTsKCQkJaWYgKGNoID09ICcoJykgcCsrOwoJCQllbHNlIGlmIChjaCA9PSAnKScpIHAtLTsKCQkJaWYgKHAgPCAwIHx8ICFwICYmIChsaW0gPT0gei5sZW5ndGggfHwgbGltID4gMCAmJiAvW1wrXC1cKlwvXF5cLF0vLnRlc3QoY2gpKSkgYnJlYWs7CgkJCWxpbSsrOwoJCX0KCQl6ID0gei5zdWJzdHJpbmcoMCwgbGltKSArICcpJyArIHouc3Vic3RyaW5nKGxpbSk7CgkJeCA9IGErJywnK3o7Cgl9CglyZXR1cm4geDsKfQoKCk51bWJlci5wcm90b3R5cGUubGltID0gZnVuY3Rpb24oaSwgaiwgeGRpciwgeWRpcikKewoJdmFyIHl5ID0gcGFyc2VGbG9hdCh0aGlzKSwgeSwKCWluY3IgPSBnX2R4LzEwMCwgX2luY3IgPSBpbmNyKnhkaXIsIHF0ID0gMSwgbGltID0gKGdfeGErKGoreGRpcikqZ19keCksCgl4ID0gZ194YStqKmdfZHg7Cgl3aGlsZSAocXQgPCAweDEwMDAwMCAmJiAhISgoeGRpciA8IDApPyAoeC1saW0gPiAwKSA6ICh4LWxpbSA8IDApKSkKCXsKCQl4ICs9IF9pbmNyOwoJCXkgPSBnRXZhbCh4LCBnX3Rlcm1baV0pOwoJCWlmIChpc051bSh5KSAmJiB5KnlkaXIteXkqeWRpciA+IDApIHl5ID0geTsKCQllbHNlCgkJewoJCQl4IC09IF9pbmNyOwoJCQlfaW5jciA9IGluY3IqeGRpci8ocXQgPDw9IDMpOwoJCX0KCX0KCXJldHVybiB5eTsKfQoKCmZ1bmN0aW9uIGdFdmFsKHgsIHRlcm0sIHkpCnsKCXdpdGggKFd6TWF0aCkgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHBhcnNlRmxvYXQoZXZhbCh0ZXJtKSksLWdfaW5maW4pLGdfaW5maW4pOwp9CgoKZnVuY3Rpb24gbWtHcmFwaChmKQp7CglpZiAoIWdfY252KQoJewoJCWFsZXJ0KFNfT0xEQlJPV1NFUik7CgkJcmV0dXJuOwoJfQoJZ19odG0gPSAnJzsKCXZhciB4YSA9IGdldFZhbChmLlhBKSwKCXh6ID0gZ2V0VmFsKGYuWFopOwoJaWYgKCFpc051bSh4YSkpIHJldHVybiBhbGVydEVycihmLlhBLCAneCBtaW4nKTsKCWlmICghaXNOdW0oeHopKSByZXR1cm4gYWxlcnRFcnIoZi5YWiwgJ3ggbWF4Jyk7CglpZiAoeGEgPj0geHopIHJldHVybiBhbGVydEVycihmLlhBLCBTX0VSUl9YUkFOR0UpOwoJaWYgKCFmLkFkZC5jaGVja2VkKSBnX24gPSAwOwoJaWYgKCFnX24pCgl7CgkJdmFyIHlhID0gZ2V0VmFsKGYuWUEpLAoJCXl6ID0gZ2V0VmFsKGYuWVopOwoJCWlmICghaXNOdW0oeWEpICYmIHlhICE9ICcnKSByZXR1cm4gYWxlcnRFcnIoZi5ZQSwgJ3kgbWluJyk7CgkJaWYgKCFpc051bSh5eikgJiYgeXogIT0gJycpIHJldHVybiBhbGVydEVycihmLllaLCAneSBtYXgnKTsKCQlpZiAoaXNOdW0oeWEpICYmIGlzTnVtKHl6KSAmJiB5YSA+PSB5eikgcmV0dXJuIGFsZXJ0RXJyKGYuWUEsIFNfRVJSX1lSQU5HRSk7CgkJZml0V25kKCk7CgkJZ194YSA9IHhhOwoJCWdfeHogPSB4ejsKCQlnX2R4ID0gKHh6LXhhKS9nX3c7CgkJZ195YSA9IHlhOwoJCWdfeXogPSB5ejsKCQlpZiAoIWlzTnVtKHlhKSkgeWEgPSBnX2luZmluOwoJCWlmICghaXNOdW0oeXopKSB5eiA9IC1nX2luZmluOwoJCWRlbEdyYXBocygpOwoJfQoJZ190ZXJtID0gbWtUZXJtKGYuRi52YWx1ZSkuc3BsaXQoJzsnKTsKCXZhciB0ZXJtID0gW107Cgl2YXIgeXkgPSBbXSwgeTsKCXRyeQoJewoJCWZvciAoaSA9IDA7IGkgPCBnX3Rlcm0ubGVuZ3RoOyBpKyspCgkJewoJCQlnX3Rlcm1baV0gPSBta1Bvdyh0ZXJtW2ldID0gZ190ZXJtW2ldKTsKCQkJd2hpbGUgKHRydWUpCgkJCXsKCQkJCXZhciBjb21zID0gKGdfdGVybVtpXS5tYXRjaCgvXCwvZykgfHwgW10pLmxlbmd0aCwgbWV0aHMgPSAoZ190ZXJtW2ldLm1hdGNoKC9wb3d8bWlufG1heHxhdGFuMnxyb290fGxvZ258Z2F1fHNzZD8vZykgfHwgW10pLmxlbmd0aDsKCQkJCWlmIChjb21zID4gbWV0aHMgJiYgZ190ZXJtW2ldLm1hdGNoKC9cZCtcLFxkLykpIHJldHVybiBhbGVydEVycihmLkYsIFNfRVJSX1RERUNJKTsKCQkJCWVsc2UgaWYgKGNvbXMgPiBtZXRocykgcmV0dXJuIGFsZXJ0RXJyKGYuRiwgU19FUlJfVENPTU0pOwoJCQkJZWxzZSBpZiAoY29tcyA8IG1ldGhzKSByZXR1cm4gYWxlcnRFcnIoZi5GLCBTX0VSUl9UTUlTU0NPTU0pOwoJCQkJZWxzZSBicmVhazsKCQkJfQoJCQlpZiAoL1x8Ly50ZXN0KGdfdGVybVtpXSkpIHJldHVybiBhbGVydEVycihmLkYsIFNfRVJSX1RQSVBFKTsKCQkJaWYgKChnX3Rlcm1baV0ubWF0Y2goL1woL2cpIHx8IFtdKS5sZW5ndGggIT0gKGdfdGVybVtpXS5tYXRjaCgvXCkvZykgfHwgW10pLmxlbmd0aCkgcmV0dXJuIGFsZXJ0RXJyKGYuRiwgU19FUlJfVFBBUkVOVEgpOwoJCQl2YXIgcmFuZCA9ICEoZ190ZXJtW2ldLmluZGV4T2YoJ3JhbicpIDwgMCk7CgkJCXl5W2ldID0gW107CgkJCXl5W2ldW2dfd10gPSBnRXZhbChnX3h6LCBnX3Rlcm1baV0pOwoJCQl2YXIgaiA9IGdfdysxOyB3aGlsZSAoai0tKQoJCQl7CgkJCQlpZiAoaikgeXlbaV1bai0xXSA9IGdFdmFsKGdfeGErKGotMSkqZ19keCwgZ190ZXJtW2ldKTsKCQkJCWlmIChpc051bSh5ID0geXlbaV1bal0pKQoJCQkJewoJCQkJCWlmICghcmFuZCkKCQkJCQl7CgkJCQkJCWlmIChpc051bSh5eVtpXVtqLTFdKSAmJiBpc051bSh5eVtpXVtqKzFdKSkKCQkJCQkJewoJCQkJCQkJaWYgKHl5W2ldW2otMV0gPCAwICYmIHkgPiAwICYmIHl5W2ldW2orMV0teSA8IDApCgkJCQkJCQkJeSA9IHkubGltKGksaiwtMSwxKTsKCQkJCQkJCWVsc2UgaWYgKHl5W2ldW2otMV0gPiAwICYmIHkgPCAwICYmIHl5W2ldW2orMV0teSA+IDApCgkJCQkJCQkJeSA9IHkubGltKGksaiwtMSwtMSk7CgkJCQkJCQllbHNlIGlmICh5eVtpXVtqKzFdID4gMCAmJiB5IDwgMCAmJiB5eVtpXVtqLTFdLXkgPiAwKQoJCQkJCQkJCXkgPSB5LmxpbShpLGosMSwtMSk7CgkJCQkJCQllbHNlIGlmICh5eVtpXVtqKzFdIDwgMCAmJiB5ID4gMCAmJiB5eVtpXVtqLTFdLXkgPCAwKQoJCQkJCQkJCXkgPSB5LmxpbShpLGosMSwxKTsKCQkJCQkJfQoJCQkJCQllbHNlIGlmIChqLWdfdyAmJiAhaXNOdW0oeXlbaV1baisxXSkgJiYgaXNOdW0oeXlbaV1bai0xXSkpCgkJCQkJCQl5ID0geS5saW0oaSxqLDEsKHkteXlbaV1bai0xXSA+IDApPyAxIDogLTEpOwoJCQkJCQllbHNlIGlmIChqICYmICFpc051bSh5eVtpXVtqLTFdKSAmJiBpc051bSh5eVtpXVtqKzFdKSkKCQkJCQkJCXkgPSB5LmxpbShpLGosLTEsKHkteXlbaV1baisxXSA+IDApPyAxIDogLTEpOwoJCQkJCQl5eVtpXVtqXSA9IHk7CgkJCQkJfQoJCQkJCWlmICghaXNOdW0oZ195YSkpIHlhID0gTWF0aC5taW4oeWEsIHkpOwoJCQkJCWlmICghaXNOdW0oZ195eikpIHl6ID0gTWF0aC5tYXgoeXosIHkpOwoJCQkJfQoJCQl9CgkJfQoJfQoJY2F0Y2ggKGVycikKCXsKCQlhbGVydEVycihmLkYsIFNfRVJSX1RFUk0pOwoJCXJldHVybjsKCX0KCWlmICghZ19uKQoJewoJCWdfeXogPSB5ejsKCQlnX3lhID0geWE7CgkJdmFyIG9sZGggPSBnX2g7CgkJaWYgKGRvY3VtZW50LmZvcm1zLmZvLlhZUkFUSU8uY2hlY2tlZCkKCQl7CgkJCWdfZHkgPSBnX2R4OwoJCQl2YXIgaCA9IChnX3l6LWdfeWEpL2dfZHk7CgkJCWlmIChoID4gMTAwKmdfdykKCQkJewoJCQkJaWYgKGdfeWEgPCAwICYmIGdfeWEgPCAtZ193KmdfZHkpIGdfeWEgKj0gMTAwKmdfdy9oOwoJCQkJaWYgKGdfeXogPiAwICYmIGdfeXogPiBnX3cqZ19keSkgZ195eiAqPSAxMDAqZ193L2g7CgkJCX0KCQkJaWYgKGgtMSA8IDApIGdfeWEgLT0gZ19keTsKCQkJZ19oID0gTWF0aC5yb3VuZCgoZ195ei1nX3lhKS9nX2R5KTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKCEoZ195ei1nX3lhKSkKCQkJewoJCQkJZ195YSAtPSAoZ194ei1nX3hhKS8yOwoJCQkJZ195eiArPSAoZ194ei1nX3hhKS8yOwoJCQl9CgkJCWdfaCA9IGdfdzsKCQkJZ19keSA9IChnX3l6LWdfeWEpL2dfaDsKCQl9CgkJaWYgKG9sZGggIT0gZ19oKSByZXNpemVDbnYoKTsKCQlta1NjYWxlKCk7Cgl9Cgl2YXIgdGVybWh0bSA9ICcnLCBjaSA9IDAsIHg7CgkvL3ZhciB0MCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Cglmb3IgKGkgPSAwOyBpIDwgZ190ZXJtLmxlbmd0aDsgaSsrKQoJewoJCXZhciBjID0gJyMnICsgR1JBUEhDT0xPUlsoY2krKyklR1JBUEhDT0xPUi5sZW5ndGhdOwoJCXZhciB0cCwgYm90OwoJCXZhciBveCA9IGdfdysxOwoJCXZhciBveSA9ICcnOwoJCXZhciBueSA9IChpc051bSh5eVtpXVtnX3ddKSk/IHNjYWxlWSh5eVtpXVtnX3ddKSA6ICcnOwoJCXggPSBnX3crMTsgd2hpbGUgKHgtLSkKCQl7CgkJCXkgPSBueTsKCQkJbnkgPSAoeCAmJiBpc051bSh5eVtpXVt4LTFdKSk/IHNjYWxlWSh5eVtpXVt4LTFdKSA6ICcnOwoJCQlpZiAoaXNOdW0oeSkpCgkJCXsKCQkJCWlmICghaXNOdW0ob3kpKSBveSA9IHk7CgkJCQlpZiAoIWlzTnVtKG55KSkKCQkJCXsKCQkJCQlpZiAob3gteC0xIHx8ICEob3kteSkpCgkJCQkJewoJCQkJCQl0cCA9IHk7CgkJCQkJCWJvdCA9IHkrMTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAob3kteSA8IDApCgkJCQkJewoJCQkJCQl0cCA9IG95OwoJCQkJCQlib3QgPSB5KzE7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXRwID0geTsKCQkJCQkJYm90ID0gb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveCA9IHg7CgkJCQkJb3kgPSAnJzsKCQkJCX0KCQkJCWVsc2UgaWYgKG55LXkgPiAwKQoJCQkJewoJCQkJCWlmIChveC14LTEpCgkJCQkJewoJCQkJCQlib3QgPSB5KzE7CgkJCQkJCXRwID0geTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoKG95LXkgPiAwIHx8ICEob3kteSkgJiYgeSA8IDApICYmIG55ID4gb3kgJiYgKGlzTnVtKHl5W2ldW3gtMl0pPyB5eVtpXVt4LTJdLXl5W2ldW3gtMV0gPj0gMCA6IHRydWUpKQoJCQkJCXsKCQkJCQkJdHAgPSB5OwoJCQkJCQlib3QgPSAhaXNOdW0oeXlbaV1beCsxXSk/IG55IDogb3k7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWlmIChpc051bSh5eVtpXVt4LTJdKSAmJiBzY2FsZVkoeXlbaV1beC0yXSktbnkgPD0gMCkgYm90ID0gbnk7CgkJCQkJCWVsc2UgYm90ID0geStNYXRoLnJvdW5kKChueS15KS8yKTsKCQkJCQkJdHAgPSAob3kteSA+IDApPyB5IDogb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveSA9IGJvdDsKCQkJCQlveCA9IHg7CgkJCQl9CgkJCQllbHNlIGlmIChueS15IDwgMCkKCQkJCXsKCQkJCQlpZiAob3gteC0xKQoJCQkJCXsKCQkJCQkJdHAgPSB5OwoJCQkJCQlib3QgPSB5KzE7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKChveS15IDwgMCB8fCAhKG95LXkpICYmIHktZ19oID4gMCkgJiYgbnkgPCBveSkKCQkJCQl7CgkJCQkJCXRwID0gIWlzTnVtKHl5W2ldW3grMV0pPyBueSsxIDogb3k7CgkJCQkJCWJvdCA9IHkrMTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKGlzTnVtKHl5W2ldW3gtMl0pICYmIHNjYWxlWSh5eVtpXVt4LTJdKS1ueSA+PSAwKSB0cCA9IG55KzE7CgkJCQkJCWVsc2UgdHAgPSB5LU1hdGguZmxvb3IoKHktbnkpLzIpOwoJCQkJCQlib3QgPSAob3kteSA8PSAwKT8geSsxIDogb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveSA9IHRwOwoJCQkJCW94ID0geDsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCW95ID0gJyc7CgkJCQlveCA9IHg7CgkJCX0KCQl9CgkJLy90ZXJtW2ldID0gZ190ZXJtW2ldOwoJCXRlcm1odG0gKz0gKCc8c21hbGwgc3R5bGU9ImNvbG9yOicgKyBjICsgJyI+PGI+JyArIHRlcm1baV0ucmVwbGFjZSgvcmFuZG9tXChcKS9nLCdyYW5kJykucmVwbGFjZSgvcG93L2csJ3AnKS5yZXBsYWNlKC9sb2dcKC9nLCdsbignKS5yZXBsYWNlKC9ydFwoL2csJ3IoJykucmVwbGFjZSgvUlQvZywnUicpICsgJzxcL2I+PFwvc21hbGw+PGJyPicpOwoJCWdfbiArKzsKCX0KCXBhaW50KGdfY252LCBnX2h0bSwgdHJ1ZSk7CgkvL2FsZXJ0KChuZXcgRGF0ZSgpKS5nZXRUaW1lKCktdDApOwoJcGFpbnQoZ190ZXJtbHlyLCB0ZXJtaHRtLCB0cnVlKTsKCWlmICghZ19jb29yZHRpcCkgaW5pdENvb3JkdGlwKCk7Cn0KCgpmdW5jdGlvbiBjb29yZFRpcChlKQp7CglpZiAoZ193YWl0KSByZXR1cm47CglnX3dhaXQgPSAxOwoJc2V0VGltZW91dCgnZ193YWl0ID0gMDsnLCAxKTsKCXZhciB4ID0gKGUgPSBlIHx8IHdpbmRvdy5ldmVudCkucGFnZVggfHwgZS5jbGllbnRYIHx8IDAsCgl5ID0gZS5wYWdlWSB8fCBlLmNsaWVudFkgfHwgMDsKCWlmIChnX2llIHx8IGdfa3EpCgl7CgkJeCArPSBnX2RiLnNjcm9sbExlZnQtKGdfaWUgJiYgIWdfaWVtYWMpKjI7CgkJeSArPSBnX2RiLnNjcm9sbFRvcC0oZ19pZSAmJiAhZ19pZW1hYykqMjsKCX0KCWlmICh4LWdfcGFnZVggPj0gMCAmJiB4LWdfcGFnZVgtZ193IDw9IDAgJiYgeS1nX3BhZ2VZID49IDAgJiYgeS1nX3BhZ2VZLWdfaCA8PSAwKQoJewoJCWdfY29vcmR0aXAuc3R5bGUubGVmdCA9ICh4KzE2KSsncHgnOwoJCWdfY29vcmR0aXAuc3R5bGUudG9wID0gKHktMTIpKydweCc7CgkJcGFpbnQoZ19jb29yZHRpcCwKCQkJJzxzbWFsbCBzdHlsZT0iYmFja2dyb3VuZDonK0NOVkNPTE9SKyc7d2hpdGUtc3BhY2U6bm93cmFwOyI+eCA9ICcrCgkJCW1rTnVtU3RyKHgtZ19wYWdlWCtNYXRoLnJvdW5kKGdfeGEvZ19keCksIGdfZHgpKycmbmJzcDs8YnI+eSA9ICcrCgkJCW1rTnVtU3RyKGdfaC15K2dfcGFnZVkrTWF0aC5yb3VuZChnX3lhL2dfZHkpLCBnX2R5KSsnJm5ic3A7PFwvc21hbGw+JywKCQkJZmFsc2UKCQkpOwoJCWlmIChnX2Nvb3JkdGlwLnN0eWxlLnZpc2liaWxpdHkgPT0gJ2hpZGRlbicpIGdfY29vcmR0aXAuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKCX0KCWVsc2UgZ19jb29yZHRpcC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7Cn0KCgpkb2N1bWVudC53cml0ZShnX2llPyBnUmVwbGFjZShta0RpdignJywgJycsIDAsIDAsIDAsIDAsICcnLCAnY29vcmR0aXAnLCB0cnVlKSkgOiBta0RpdignJywgJycsIDAsIDAsIDAsIDAsICcnLCAnY29vcmR0aXAnLCB0cnVlKSk7CndpbmRvdy5vbmxvYWQgPSBpbml0Owo=">
</script id="script_b64_wz_grapher_end">
<!-- <script id="script_wz_grapherstr" type="text/javascript" src="/js/wz/wz_grapherstr.js"></script> -->
<script id="script_b64_wz_grapherstr"
src="data:/text/plain;base64,aWYod2luZG93LkdfTEFORyAmJiBHX0xBTkcgPT0gIkQiKQ0Kew0KICAgIHZhciBTX1NIT1dHUklEID0gJ0dpdHRlciB6ZWlnZW4nOw0KICAgIHZhciBTX1NBTUVTQ0FMRSA9ICdpZGVudC4gTWEmc3psaWc7c3RhYiBmJnV1bWw7ciBiZWlkZSBBY2hzZW4gWypdJzsNCiAgICB2YXIgU19GSVRXTkQgPSAnRGlhZ3JhbW0tIEdyJm91bWw7JnN6bGlnO2UgYW4gRmVuc3RlciBhbnBhc3NlbiBbKl0nOw0KICAgIHZhciBTX1BSVFZJRVcgPSAnRHJ1Y2thbnNpY2h0JzsNCiAgICB2YXIgU19QT1NUUkVQSU5HID0gJ1sqXSBzaWNodGJhciBlcnN0IG5hY2ggTmV1emVpY2huZW4nOw0KICAgIHZhciBTX0NPT1JEVElQID0gJ1dlcnRlIGltIERpYWdyYW1tIGsmb3VtbDtubmVuIG1pdCBkZXIgTWF1cyBuJmF1bWw7aGVydW5nc3dlaXNlIGFiZ2V0YXN0ZXQgd2VyZGVuJzsNCiAgICB2YXIgU19ERUxHUkFQSFMgPSAnU29sbGVuIGFsbGUgR3JhcGhlbiBhdXMgZGVyIFplaWNoZW5mbORjaGUgZ2Vs9nNjaHQgd2VyZGVuPyc7DQogICAgdmFyIFNfREVMTEFTVEdSQVBIID0gJ1NvbGwgZGVyIGxldHp0ZSBHcmFwaCB3aXJrbGljaCBnZWz2c2NodCB3ZXJkZW4/JzsNCiAgICB2YXIgU19PTERCUk9XU0VSID0gJ0RpZSBKYXZhU2NyaXB0LVVudGVyc3R1ZXR6dW5nIElocmVzIEJyb3dzZXJzIGlzdCB1bnp1cmVpY2hlbmQnOw0KICAgIHZhciBTX0VSUl9CQVNFID0gJ1VuZ/xsdGlnZSBFaW5nYWJlIGb8ciAnOw0KICAgIHZhciBTX0VSUl9YUkFOR0UgPSAnRGVmaW5pdGlvbnNiZXJlaWNoIHZvbiB4LlxueCBtaW4gbXVzcyBrbGVpbmVyIGFscyB4IG1heCBzZWluLic7DQogICAgdmFyIFNfRVJSX1lSQU5HRSA9ICdXZXJ0ZWJlcmVpY2ggdm9uIHkuXG55IG1pbiBtdXNzIGtsZWluZXIgYWxzIHkgbWF4IHNlaW4uJzsNCiAgICB2YXIgU19FUlJfVEVSTSA9ICdGdW5rdGlvbnN0ZXJtLlxuS2VpbiBUaXBwZmVobGVyP1xuTnVyIGVybGF1YnRlIFJlY2hlbm9wZXJhdG9yZW4gdmVyd2VuZGV0P1xuS2xhbW1lcnVuZyBvaz9cbkJpdHRlIFN5bnRheCD8YmVycHL8ZmVuLic7DQogICAgdmFyIFNfRVJSX1RDT01NID0gJ0Z1bmt0aW9uc3Rlcm0uXG5adSB2aWVsZSBLb21tYXRhLic7DQogICAgdmFyIFNfRVJSX1RERUNJID0gJ0Z1bmt0aW9uc3Rlcm0uXG5adSB2aWVsZSBLb21tYXRhLlxuQml0dGUgUHVua3QgYWxzIERlemltYWx0cmVubnplaWNoZW4gdmVyd2VuZGVuLic7DQogICAgdmFyIFNfRVJSX1RNSVNTQ09NTSA9ICdGdW5rdGlvbnN0ZXJtLlxuKE1pbmRlc3RlbnMpIGVpbmUgZGVyIEhpbGZzZnVua3Rpb25lbiBiZW72dGlndCB6d2VpIChnYXVzc2QoKSBkcmVpKSBBcmd1bWVudGUuXG5BbnNjaGVpbmVuZCBmZWhsdCBlaW4gQXJndW1lbnQsIGJ6dy4gZGFzIEtvbW1hIHp3aXNjaGVuIGRlbiBBcmd1bWVudGVuLic7DQogICAgdmFyIFNfRVJSX1RQSVBFID0gJ0Z1bmt0aW9uc3Rlcm0uXG5FaW4gc2Vua3JlY2h0ZXIgU3RyaWNoIChQaXBlKSB6dXZpZWwgb2RlciB6dXdlbmlnLic7DQogICAgdmFyIFNfRVJSX1RQQVJFTlRIID0gJ0Z1bmt0aW9uc3Rlcm0uXG5GYWxzY2hlIEtsYW1tZXJ1bmcuXG5BbnphaGwg9mZmbmVuZGVyIHVuZCBzY2hsaWXfZW5kZXIgS2xhbW1lcm4gc3RpbW10IG5pY2h0IPxiZXJlaW4uJzsNCn0NCmVsc2UNCnsNCiAgICB2YXIgU19TSE9XR1JJRCA9ICdTaG93IGdyaWQgbGluZXMnOw0KICAgIHZhciBTX1NBTUVTQ0FMRSA9ICdTYW1lIHNjYWxlIGZvciBib3RoIGF4ZXMgWypdJzsNCiAgICB2YXIgU19GSVRXTkQgPSAnRml0IGRpYWdyYW0gaW50byB3aW5kb3cgWypdJzsNCiAgICB2YXIgU19QUlRWSUVXID0gJ1ByaW50IHByZXZpZXcnOw0KICAgIHZhciBTX1BPU1RSRVBJTkcgPSAnWypdIHZpc2libGUgYWZ0ZXIgcmVkcmF3aW5nJzsNCiAgICB2YXIgU19DT09SRFRJUCA9ICdNb3ZlIG1vdXNlIG92ZXIgZGlhZ3JhbSB0byBzY2FuIGNvb3JkaW5hdGVzJzsNCiAgICB2YXIgU19ERUxHUkFQSFMgPSAnRGVsZXRlIGFsbCBncmFwaHM/JzsNCiAgICB2YXIgU19ERUxMQVNUR1JBUEggPSAnRGVsZXRlIGxhdGVzdCBncmFwaD8nOw0KICAgIHZhciBTX09MREJST1dTRVIgPSAnWW91ciBicm93c2VyXCdzIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gaXMgaW5zdWZmaWNpZW50Lic7DQogICAgdmFyIFNfRVJSX0JBU0UgPSAnSW52YWxpZCAnOw0KICAgIHZhciBTX0VSUl9YUkFOR0UgPSAnaW50ZXJ2YWwgc3BlY2lmaWVkIGZvciB4LlxueCBtaW4gbXVzdCBiZSBsZXNzZXIgdGhhbiB4IG1heC4nOw0KICAgIHZhciBTX0VSUl9ZUkFOR0UgPSAncmFuZ2UgZm9yIHkuXG55IG1pbiBtdXN0IGJlIGxlc3NlciB0aGFuIHkgbWF4Lic7DQogICAgdmFyIFNfRVJSX1RFUk0gPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cblR5cG8/XG5JbnZhbGlkIHVzYWdlIG9mIG9wZXJhdG9ycz9cbkVycm9yIHdpdGggb3BlbmluZyBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcz9cblBsZWFzZSBjaGVjayBzeW50YXguJzsNCiAgICB2YXIgU19FUlJfVENPTU0gPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cblRvbyBtYW55IGNvbW1hcy4nOw0KICAgIHZhciBTX0VSUl9UREVDSSA9ICdmdW5jdGlvbiBleHByZXNzaW9uLlxuVG9vIG1hbnkgY29tbWFzLlxuVXNlIHBvaW50IGFzIGRlY2ltYWwgcG9pbnQuJzsNCiAgICB2YXIgU19FUlJfVE1JU1NDT01NID0gJ2Z1bmN0aW9uIGV4cHJlc3Npb24uXG4oQXQgbGVhc3QpIG9uZSBvZiB0aGUgaGVscGVyIGZ1bmN0aW9ucyByZXF1aXJlcyB0d28gKG9yIGdhdXNzZCgpOiB0aHJlZSkgYXJndW1lbnRzLlxuQXBwYXJlbnRseSBvbmUgYXJndW1lbnQgaXMgbWlzc2luZywgb3IgYSBjb21tYSBzZXBhcmF0aW5nIGFyZ3VtZW50cyBmcm9tIGVhY2ggb3RoZXIuJzsNCiAgICB2YXIgU19FUlJfVFBJUEUgPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cbkFwcGFyZW50bHkgdHlwby4gT25lIHRvbyBtYW55IHBpcGVzIChcJ3xcJykuJzsNCiAgICB2YXIgU19FUlJfVFBBUkVOVEggPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cbk9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMgZG9uXCd0IG1hdGNoLic7DQp9DQo=">
</script id="script_b64_wz_grapherstr_end">
<script id="script_wz_grapherstr" >
if(window.G_LANG && G_LANG == "D") {
var S_SHOWGRID='Gitter zeigen';
var S_SAMESCALE='ident. Maßstab für beide Achsen [*]';
var S_FITWND='Diagramm- Größe an Fenster anpassen [*]';
var S_PRTVIEW='Druckansicht';
var S_POSTREPING='[*] sichtbar erst nach Neuzeichnen';
var S_COORDTIP='Werte im Diagramm können mit der Maus näherungsweise abgetastet werden';
var S_DELGRAPHS='Sollen alle Graphen aus der Zeichenfläche gelöscht werden?';
var S_DELLASTGRAPH='Soll der letzte Graph wirklich gelöscht werden?';
var S_OLDBROWSER='Die JavaScript-Unterstuetzung Ihres Browsers ist unzureichend';
var S_ERR_BASE='Ungültige Eingabe für ';
var S_ERR_XRANGE='Definitionsbereich von x.\nx min muss kleiner als x max sein.';
var S_ERR_YRANGE='Wertebereich von y.\ny min muss kleiner als y max sein.';
var S_ERR_TERM='Funktionsterm.\nKein Tippfehler?\nNur erlaubte Rechenoperatoren verwendet?\nKlammerung ok?\nBitte Syntax überprüfen.';
var S_ERR_TCOMM='Funktionsterm.\nZu viele Kommata.';
var S_ERR_TDECI='Funktionsterm.\nZu viele Kommata.\nBitte Punkt als Dezimaltrennzeichen verwenden.';
var S_ERR_TMISSCOMM='Funktionsterm.\n(Mindestens) eine der Hilfsfunktionen benötigt zwei (gaussd() drei) Argumente.\nAnscheinend fehlt ein Argument, bzw. das Komma zwischen den Argumenten.';
var S_ERR_TPIPE='Funktionsterm.\nEin senkrechter Strich (Pipe) zuviel oder zuwenig.';
var S_ERR_TPARENTH='Funktionsterm.\nFalsche Klammerung.\nAnzahl öffnender und schließender Klammern stimmt nicht überein.';
}
else {
var S_SHOWGRID='Show grid lines';
var S_SAMESCALE='Same scale for both axes [*]';
var S_FITWND='Fit diagram into window [*]';
var S_PRTVIEW='Print preview';
var S_POSTREPING='[*] visible after redrawing';
var S_COORDTIP='Move mouse over diagram to scan coordinates';
var S_DELGRAPHS='Delete all graphs?';
var S_DELLASTGRAPH='Delete latest graph?';
var S_OLDBROWSER='Your browser\'s JavaScript implementation is insufficient.';
var S_ERR_BASE='Invalid ';
var S_ERR_XRANGE='interval specified for x.\nx min must be lesser than x max.';
var S_ERR_YRANGE='range for y.\ny min must be lesser than y max.';
var S_ERR_TERM='function expression.\nTypo?\nInvalid usage of operators?\nError with opening and closing parentheses?\nPlease check syntax.';
var S_ERR_TCOMM='function expression.\nToo many commas.';
var S_ERR_TDECI='function expression.\nToo many commas.\nUse point as decimal point.';
var S_ERR_TMISSCOMM='function expression.\n(At least) one of the helper functions requires two (or gaussd(): three) arguments.\nApparently one argument is missing, or a comma separating arguments from each other.';
var S_ERR_TPIPE='function expression.\nApparently typo. One too many pipes (\'|\').';
var S_ERR_TPARENTH='function expression.\nOpening and closing parentheses don\'t match.';
}
</script id="script_wz_grapherstr_end">
</div id="div_wz_grapher_end">
</body>
</html>
//
koh5_pano
Drag mouse to navigate.
Navigation
- Left/Right Mouse drag: Changes camera heading.
- Up/Sown Mouse drag: Changes camera pitch.
- Scroll wheel: Changes camera field of view.
- I-Key: Displays Info panel with canvas size, image size and FPS.
17.Aug.2010, Martin Wengenmayer