function fmt($section, $name, $value, $when, $alldata, $cf = NULL) { global $dfmt, $rownum; if ($alldata == null) { $alldata = array(); } $errorclass = 'err'; $warnclass = 'warn'; $lstclass = 'lst'; $hiclass = 'hi'; $loclass = 'lo'; $c2class = 'two'; $totclass = 'tot'; $b = ' '; $class = ''; $nams = explode('.', $name); if (count($nams) > 1) { $name = $nams[count($nams) - 1]; } $done = false; if ($value === null) { $ret = $b; $done = true; } else { if ($cf != NULL and function_exists($cf)) { list($ret, $class) = $cf($section, $name, $value, $when, $alldata, $warnclass, $errorclass, $hiclass, $loclass, $totclass); if ($ret !== '') { $done = true; } } } if ($done === false) { $ret = $value; /* * To speed up the PHP, the case statement is just $name * It used to be $section.'.'.$name * If any names clash, the case code will need to check the value of * $section to resolve the clash - as with 'Last Share Time' below * If the code picks up a field that you wish to format differently, * then you'll need a customsummarypage 'fmt' extension */ switch ($name) { case 'Last Share Time': if ($section == 'POOL') { if ($value == 0) { $ret = 'Never'; } else { $ret = date('H:i:s d-M', $value); } } else { if ($value == 0 || isset($alldata['Last Share Pool']) && $alldata['Last Share Pool'] == -1) { $ret = 'Never'; $class = $warnclass; } else { $ret = date('H:i:s', $value); $class = classlastshare($when, $alldata, $warnclass, $errorclass); } } break; case 'Last getwork': case 'Last Valid Work': if ($value == 0) { $ret = 'Never'; } else { $ret = $value - $when . 's'; } break; case 'Last Share Pool': if ($value == -1) { $ret = 'None'; $class = $warnclass; } break; case 'Elapsed': case 'Device Elapsed': $s = $value % 60; $value -= $s; $value /= 60; if ($value == 0) { $ret = $s . 's'; } else { $m = $value % 60; $value -= $m; $value /= 60; if ($value == 0) { $ret = sprintf("%dm{$b}%02ds", $m, $s); } else { $h = $value % 24; $value -= $h; $value /= 24; if ($value == 0) { $ret = sprintf("%dh{$b}%02dm{$b}%02ds", $h, $m, $s); } else { if ($value == 1) { $days = ''; } else { $days = 's'; } $ret = sprintf("%dday{$days}{$b}%02dh{$b}%02dm{$b}%02ds", $value, $h, $m, $s); } } } break; case 'Last Well': if ($value == '0') { $ret = 'Never'; $class = $warnclass; } else { $ret = date('H:i:s', $value); } break; case 'Last Not Well': if ($value == '0') { $ret = 'Never'; } else { $ret = date('H:i:s', $value); $class = $errorclass; } break; case 'Reason Not Well': if ($value != 'None') { $class = $errorclass; } break; case 'Utility': $ret = number_format($value, 2) . '/m'; if ($value == 0) { $class = $errorclass; } else { if (isset($alldata['Difficulty Accepted']) && isset($alldata['Accepted']) && isset($alldata['MHS av']) && $alldata['Difficulty Accepted'] > 0 && $alldata['Accepted'] > 0) { $expected = 60 * $alldata['MHS av'] * (pow(10, 6) / pow(2, 32)); if ($expected == 0) { $expected = 1.0E-6; } // 1 H/s $da = $alldata['Difficulty Accepted']; $a = $alldata['Accepted']; $expected /= $da / $a; $ratio = $value / $expected; if ($ratio < 0.9) { $class = $loclass; } else { if ($ratio > 1.1) { $class = $hiclass; } } } } break; case 'Work Utility': $ret = number_format($value, 2) . '/m'; break; case 'Temperature': $ret = $value . '°C'; if (!isset($alldata['GPU'])) { if ($value == 0) { $ret = ' '; } break; } case 'GPU Clock': case 'Memory Clock': case 'GPU Voltage': case 'GPU Activity': if ($value == 0) { $class = $warnclass; } break; case 'Fan Percent': if ($value == 0) { $class = $warnclass; } else { if ($value == 100) { $class = $errorclass; } else { if ($value > 85) { $class = $warnclass; } } } break; case 'Fan Speed': if ($value == 0) { $class = $warnclass; } else { if (isset($alldata['Fan Percent'])) { $test = $alldata['Fan Percent']; if ($test == 100) { $class = $errorclass; } else { if ($test > 85) { $class = $warnclass; } } } } break; case 'MHS av': case 'MHS 5s': case 'MHS 1m': case 'MHS 5m': case 'MHS 15m': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . $parts[1]; } $ret = number_format((double) $parts[0]) . $dec; if ($value == 0) { $class = $errorclass; } else { if (isset($alldata['Difficulty Accepted']) && isset($alldata['Accepted']) && isset($alldata['Utility']) && $alldata['Difficulty Accepted'] > 0 && $alldata['Accepted'] > 0) { $expected = 60 * $value * (pow(10, 6) / pow(2, 32)); if ($expected == 0) { $expected = 1.0E-6; } // 1 H/s $da = $alldata['Difficulty Accepted']; $a = $alldata['Accepted']; $expected /= $da / $a; $ratio = $alldata['Utility'] / $expected; if ($ratio < 0.9) { $class = $hiclass; } else { if ($ratio > 1.1) { $class = $loclass; } } } } break; case 'Total MH': case 'Getworks': case 'Works': case 'Accepted': case 'Rejected': case 'Local Work': case 'Discarded': case 'Diff1 Shares': case 'Diff1 Work': case 'Times Sent': case 'Bytes Sent': case 'Net Bytes Sent': case 'Times Recv': case 'Bytes Recv': case 'Net Bytes Recv': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . $parts[1]; } $ret = number_format((double) $parts[0]) . $dec; break; case 'Hs': case 'W': case 'history_time': case 'Pool Wait': case 'Pool Max': case 'Pool Min': case 'Pool Av': case 'Min Diff': case 'Max Diff': case 'Work Diff': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . endzero($parts[1]); } $ret = number_format((double) $parts[0]) . $dec; break; case 'Status': if ($value != 'Alive') { $class = $errorclass; } break; case 'Enabled': if ($value != 'Y') { $class = $warnclass; } break; case 'No Device': if ($value != 'false') { $class = $errorclass; } break; case 'When': case 'Current Block Time': $ret = date($dfmt, $value); break; case 'Difficulty Accepted': case 'Difficulty Rejected': case 'Difficulty Stale': case 'Last Share Difficulty': if ($value != '') { $ret = number_format((double) $value, 2); } break; case 'Device Hardware%': case 'Device Rejected%': case 'Pool Rejected%': case 'Pool Stale%': if ($value != '') { $ret = number_format((double) $value, 2) . '%'; } break; case 'Best Share': case 'Hardware Errors': if ($value != '') { $ret = number_format((double) $value); } break; // BUTTON. // BUTTON. case 'Rig': case 'Pool': case 'GPU': break; // Sample GEN fields // Sample GEN fields case 'Mined': if ($value != '') { $ret = number_format((double) $value * 100.0, 3) . '%'; } break; case 'Acc': case 'Rej': if ($value != '') { $ret = number_format((double) $value * 100.0, 2) . '%'; } break; case 'GHS av': case 'GHS 5m': case 'GHS WU': case 'GHS Acc': if ($value != '') { $ret = number_format((double) $value, 2); } break; case 'AvShr': if ($value != '') { $ret = number_format((double) $value, 2); } if ($value == 0) { $class = $warnclass; } break; } } if ($section == 'NOTIFY' && substr($name, 0, 1) == '*' && $value != '0') { $class = $errorclass; } if ($class == '' && $section != 'POOL') { $class = classlastshare($when, $alldata, $lstclass, $lstclass); } if ($class == '' && $section == 'total') { $class = $totclass; } if ($class == '' && $rownum % 2 == 0) { $class = $c2class; } if ($ret === '') { $ret = $b; } if ($class !== '') { $class = " class={$class}"; } return array($ret, $class); }
function fmt($section, $name, $value, $when, $alldata) { global $dfmt, $rownum; if ($alldata == null) { $alldata = array(); } $errorclass = ' class=err'; $warnclass = ' class=warn'; $lstclass = ' class=lst'; $hiclass = ' class=hi'; $loclass = ' class=lo'; $c2class = ' class=two'; $totclass = ' class=tot'; $b = ' '; $ret = $value; $class = ''; $nams = explode('.', $name); if (count($nams) > 1) { $name = $nams[count($nams) - 1]; } if ($value === null) { $ret = $b; } else { switch ($section . '.' . $name) { case 'GPU.Last Share Time': case 'PGA.Last Share Time': case 'ASC.Last Share Time': case 'DEVS.Last Share Time': if ($value == 0 || isset($alldata['Last Share Pool']) && $alldata['Last Share Pool'] == -1) { $ret = 'Never'; $class = $warnclass; } else { $ret = date('H:i:s', $value); $class = classlastshare($when, $alldata, $warnclass, $errorclass); } break; case 'GPU.Last Valid Work': case 'PGA.Last Valid Work': case 'ASC.Last Valid Work': case 'DEVS.Last Valid Work': if ($value == 0) { $ret = 'Never'; } else { $ret = $value - $when . 's'; } break; case 'POOL.Last Share Time': if ($value == 0) { $ret = 'Never'; } else { $ret = date('H:i:s d-M', $value); } break; case 'GPU.Last Share Pool': case 'PGA.Last Share Pool': case 'ASC.Last Share Pool': case 'DEVS.Last Share Pool': if ($value == -1) { $ret = 'None'; $class = $warnclass; } break; case 'SUMMARY.Elapsed': case 'STATS.Elapsed': $s = $value % 60; $value -= $s; $value /= 60; if ($value == 0) { $ret = $s . 's'; } else { $m = $value % 60; $value -= $m; $value /= 60; if ($value == 0) { $ret = sprintf("%dm{$b}%02ds", $m, $s); } else { $h = $value % 24; $value -= $h; $value /= 24; if ($value == 0) { $ret = sprintf("%dh{$b}%02dm{$b}%02ds", $h, $m, $s); } else { if ($value == 1) { $days = ''; } else { $days = 's'; } $ret = sprintf("%dday{$days}{$b}%02dh{$b}%02dm{$b}%02ds", $value, $h, $m, $s); } } } break; case 'NOTIFY.Last Well': if ($value == '0') { $ret = 'Never'; $class = $warnclass; } else { $ret = date('H:i:s', $value); } break; case 'NOTIFY.Last Not Well': if ($value == '0') { $ret = 'Never'; } else { $ret = date('H:i:s', $value); $class = $errorclass; } break; case 'NOTIFY.Reason Not Well': if ($value != 'None') { $class = $errorclass; } break; case 'GPU.Utility': case 'PGA.Utility': case 'ASC.Utility': case 'DEVS.Utility': case 'SUMMARY.Utility': case 'total.Utility': $ret = $value . '/m'; if ($value == 0) { $class = $errorclass; } else { if (isset($alldata['Difficulty Accepted']) && isset($alldata['Accepted']) && isset($alldata['MHS av']) && $alldata['Difficulty Accepted'] > 0 && $alldata['Accepted'] > 0) { $expected = 60 * $alldata['MHS av'] * (pow(10, 6) / pow(2, 32)); if ($expected == 0) { $expected = 1.0E-6; } // 1 H/s $da = $alldata['Difficulty Accepted']; $a = $alldata['Accepted']; $expected /= $da / $a; $ratio = $value / $expected; if ($ratio < 0.9) { $class = $loclass; } else { if ($ratio > 1.1) { $class = $hiclass; } } } } break; case 'SUMMARY.Work Utility': case 'total.Work Utility': $ret = $value . '/m'; break; case 'GPU.Temperature': case 'PGA.Temperature': case 'ASC.Temperature': case 'DEVS.Temperature': $ret = $value . '°C'; if (!isset($alldata['GPU'])) { if ($value == 0) { $ret = ' '; } break; } case 'GPU.GPU Clock': case 'DEVS.GPU Clock': case 'GPU.Memory Clock': case 'DEVS.Memory Clock': case 'GPU.GPU Voltage': case 'DEVS.GPU Voltage': case 'GPU.GPU Activity': case 'DEVS.GPU Activity': if ($value == 0) { $class = $warnclass; } break; case 'GPU.Fan Percent': case 'DEVS.Fan Percent': if ($value == 0) { $class = $warnclass; } else { if ($value == 100) { $class = $errorclass; } else { if ($value > 85) { $class = $warnclass; } } } break; case 'GPU.Fan Speed': case 'DEVS.Fan Speed': if ($value == 0) { $class = $warnclass; } else { if (isset($alldata['Fan Percent'])) { $test = $alldata['Fan Percent']; if ($test == 100) { $class = $errorclass; } else { if ($test > 85) { $class = $warnclass; } } } } break; case 'GPU.MHS av': case 'PGA.MHS av': case 'ASC.MHS av': case 'DEVS.MHS av': case 'SUMMARY.MHS av': case 'total.MHS av': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . $parts[1]; } $ret = number_format((double) $parts[0]) . $dec; if ($value == 0) { $class = $errorclass; } else { if (isset($alldata['Difficulty Accepted']) && isset($alldata['Accepted']) && isset($alldata['Utility']) && $alldata['Difficulty Accepted'] > 0 && $alldata['Accepted'] > 0) { $expected = 60 * $value * (pow(10, 6) / pow(2, 32)); if ($expected == 0) { $expected = 1.0E-6; } // 1 H/s $da = $alldata['Difficulty Accepted']; $a = $alldata['Accepted']; $expected /= $da / $a; $ratio = $alldata['Utility'] / $expected; if ($ratio < 0.9) { $class = $hiclass; } else { if ($ratio > 1.1) { $class = $loclass; } } } } break; case 'GPU.Total MH': case 'PGA.Total MH': case 'ASC.Total MH': case 'DEVS.Total MH': case 'SUMMARY.Total MH': case 'total.Total MH': case 'SUMMARY.Getworks': case 'POOL.Getworks': case 'total.Getworks': case 'GPU.Accepted': case 'PGA.Accepted': case 'ASC.Accepted': case 'DEVS.Accepted': case 'SUMMARY.Accepted': case 'POOL.Accepted': case 'total.Accepted': case 'GPU.Rejected': case 'PGA.Rejected': case 'ASC.Rejected': case 'DEVS.Rejected': case 'SUMMARY.Rejected': case 'POOL.Rejected': case 'total.Rejected': case 'SUMMARY.Local Work': case 'total.Local Work': case 'SUMMARY.Discarded': case 'POOL.Discarded': case 'total.Discarded': case 'POOL.Diff1 Shares': case 'total.Diff1 Shares': case 'GPU.Diff1 Work': case 'PGA.Diff1 Work': case 'ASC.Diff1 Work': case 'total.Diff1 Work': case 'STATS.Times Sent': case 'STATS.Bytes Sent': case 'STATS.Net Bytes Sent': case 'STATS.Times Recv': case 'STATS.Bytes Recv': case 'STATS.Net Bytes Recv': case 'total.Times Sent': case 'total.Bytes Sent': case 'total.Net Bytes Sent': case 'total.Times Recv': case 'total.Bytes Recv': case 'total.Net Bytes Recv': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . $parts[1]; } $ret = number_format((double) $parts[0]) . $dec; break; case 'STATS.Hs': case 'STATS.W': case 'STATS.history_time': case 'STATS.Pool Wait': case 'STATS.Pool Max': case 'STATS.Pool Min': case 'STATS.Pool Av': case 'STATS.Min Diff': case 'STATS.Max Diff': case 'STATS.Work Diff': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . endzero($parts[1]); } $ret = number_format((double) $parts[0]) . $dec; break; case 'GPU.Status': case 'PGA.Status': case 'ASC.Status': case 'DEVS.Status': case 'POOL.Status': if ($value != 'Alive') { $class = $errorclass; } break; case 'GPU.Enabled': case 'PGA.Enabled': case 'ASC.Enabled': case 'ASC.Enabled': case 'DEVS.Enabled': if ($value != 'Y') { $class = $warnclass; } break; case 'STATUS.When': case 'COIN.Current Block Time': $ret = date($dfmt, $value); break; case 'BUTTON.Rig': case 'BUTTON.Pool': case 'BUTTON.GPU': $ret = $value; break; case 'SUMMARY.Difficulty Accepted': case 'GPU.Difficulty Accepted': case 'PGA.Difficulty Accepted': case 'ASC.Difficulty Accepted': case 'DEVS.Difficulty Accepted': case 'POOL.Difficulty Accepted': case 'total.Difficulty Accepted': case 'SUMMARY.Difficulty Rejected': case 'GPU.Difficulty Rejected': case 'PGA.Difficulty Rejected': case 'ASC.Difficulty Rejected': case 'DEVS.Difficulty Rejected': case 'POOL.Difficulty Rejected': case 'total.Difficulty Rejected': case 'SUMMARY.Difficulty Stale': case 'POOL.Difficulty Stale': case 'total.Difficulty Stale': case 'GPU.Last Share Difficulty': case 'PGA.Last Share Difficulty': case 'ASC.Last Share Difficulty': case 'DEVS.Last Share Difficulty': case 'POOL.Last Share Difficulty': if ($value != '') { $ret = number_format((double) $value, 2); } break; case 'DEVS.Device Hardware%': case 'DEVS.Device Rejected%': case 'ASC.Device Hardware%': case 'ASC.Device Rejected%': case 'PGA.Device Hardware%': case 'PGA.Device Rejected%': case 'GPU.Device Hardware%': case 'GPU.Device Rejected%': case 'POOL.Pool Rejected%': case 'POOL.Pool Stale%': case 'SUMMARY.Device Hardware%': case 'SUMMARY.Device Rejected%': case 'SUMMARY.Pool Rejected%': case 'SUMMARY.Pool Stale%': if ($value != '') { $ret = number_format((double) $value, 2) . '%'; } break; case 'SUMMARY.Best Share': if ($value != '') { $ret = number_format((double) $value); } break; } } if ($section == 'NOTIFY' && substr($name, 0, 1) == '*' && $value != '0') { $class = $errorclass; } if ($class == '' && $section != 'POOL') { $class = classlastshare($when, $alldata, $lstclass, $lstclass); } if ($class == '' && $section == 'total') { $class = $totclass; } if ($class == '' && $rownum % 2 == 0) { $class = $c2class; } if ($ret === '') { $ret = $b; } return array($ret, $class); }
function fmt($section, $name, $value, $when, $alldata) { global $dfmt, $rownum; if ($alldata == null) { $alldata = array(); } $errorclass = ' class=err'; $warnclass = ' class=warn'; $lstclass = ' class=lst'; $hiclass = ' class=hi'; $loclass = ' class=lo'; $c2class = ' class=two'; $totclass = ' class=tot'; $b = ' '; $ret = $value; $class = ''; if ($value === null) { $ret = $b; } else { switch ($section . '.' . $name) { case 'GPU.Last Share Time': case 'PGA.Last Share Time': if ($value == 0 || isset($alldata['Last Share Pool']) && $alldata['Last Share Pool'] == -1) { $ret = 'Never'; $class = $warnclass; } else { $ret = date('H:i:s', $value); $class = classlastshare($when, $alldata, $warnclass, $errorclass); } break; case 'POOL.Last Share Time': if ($value == 0) { $ret = 'Never'; } else { $ret = date('H:i:s d-M', $value); } break; case 'GPU.Last Share Pool': case 'PGA.Last Share Pool': if ($value == -1) { $ret = 'None'; $class = $warnclass; } break; case 'SUMMARY.Elapsed': $s = $value % 60; $value -= $s; $value /= 60; if ($value == 0) { $ret = $s . 's'; } else { $m = $value % 60; $value -= $m; $value /= 60; if ($value == 0) { $ret = sprintf("%dm{$b}%02ds", $m, $s); } else { $h = $value % 24; $value -= $h; $value /= 24; if ($value == 0) { $ret = sprintf("%dh{$b}%02dm{$b}%02ds", $h, $m, $s); } else { if ($value == 1) { $days = ''; } else { $days = 's'; } $ret = sprintf("%dday{$days}{$b}%02dh{$b}%02dm{$b}%02ds", $value, $h, $m, $s); } } } break; case 'NOTIFY.Last Well': if ($value == '0') { $ret = 'Never'; $class = $warnclass; } else { $ret = date('H:i:s', $value); } break; case 'NOTIFY.Last Not Well': if ($value == '0') { $ret = 'Never'; } else { $ret = date('H:i:s', $value); $class = $errorclass; } break; case 'NOTIFY.Reason Not Well': if ($value != 'None') { $class = $errorclass; } break; case 'GPU.Utility': case 'PGA.Utility': case 'SUMMARY.Utility': case 'total.Utility': $ret = $value . '/m'; if ($value == 0) { $class = $errorclass; } else { if (isset($alldata['MHS av'])) { $expected = 60 * $alldata['MHS av'] * (pow(10, 6) / pow(2, 32)); if ($expected == 0) { $expected = 1.0E-6; } // 1 H/s $ratio = $value / $expected; if ($ratio < 0.9) { $class = $loclass; } else { if ($ratio > 1.1) { $class = $hiclass; } } } } break; case 'PGA.Temperature': $ret = $value . '°C'; break; case 'GPU.Temperature': $ret = $value . '°C'; case 'GPU.GPU Clock': case 'GPU.Memory Clock': case 'GPU.GPU Voltage': case 'GPU.GPU Activity': if ($value == 0) { $class = $warnclass; } break; case 'GPU.Fan Percent': if ($value == 0) { $class = $warnclass; } else { if ($value == 100) { $class = $errorclass; } else { if ($value > 85) { $class = $warnclass; } } } break; case 'GPU.Fan Speed': if ($value == 0) { $class = $warnclass; } else { if (isset($alldata['Fan Percent'])) { $test = $alldata['Fan Percent']; if ($test == 100) { $class = $errorclass; } else { if ($test > 85) { $class = $warnclass; } } } } break; case 'GPU.MHS av': case 'PGA.MHS av': case 'SUMMARY.MHS av': case 'total.MHS av': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . $parts[1]; } $ret = number_format($parts[0]) . $dec; if ($value == 0) { $class = $errorclass; } else { if (isset($alldata['Utility'])) { $expected = 60 * $value * (pow(10, 6) / pow(2, 32)); $utility = $alldata['Utility']; $ratio = $utility / $expected; if ($ratio < 0.9) { $class = $hiclass; } else { if ($ratio > 1.1) { $class = $loclass; } } } } break; case 'GPU.Total MH': case 'PGA.Total MH': case 'SUMMARY.Total MH': case 'total.Total MH': case 'SUMMARY.Getworks': case 'POOL.Getworks': case 'total.Getworks': case 'GPU.Accepted': case 'PGA.Accepted': case 'SUMMARY.Accepted': case 'POOL.Accepted': case 'total.Accepted': case 'GPU.Rejected': case 'PGA.Rejected': case 'SUMMARY.Rejected': case 'POOL.Rejected': case 'total.Rejected': case 'SUMMARY.Local Work': case 'total.Local Work': case 'SUMMARY.Discarded': case 'POOL.Discarded': case 'total.Discarded': $parts = explode('.', $value, 2); if (count($parts) == 1) { $dec = ''; } else { $dec = '.' . $parts[1]; } $ret = number_format($parts[0]) . $dec; break; case 'GPU.Status': case 'PGA.Status': case 'POOL.Status': if ($value != 'Alive') { $class = $errorclass; } break; case 'GPU.Enabled': case 'PGA.Enabled': if ($value != 'Y') { $class = $warnclass; } break; case 'STATUS.When': $ret = date($dfmt, $value); break; case 'BUTTON.Rig': case 'BUTTON.Pool': case 'BUTTON.GPU': $ret = $value; break; } } if ($section == 'NOTIFY' && substr($name, 0, 1) == '*' && $value != '0') { $class = $errorclass; } if ($class == '' && $section != 'POOL') { $class = classlastshare($when, $alldata, $lstclass, $lstclass); } if ($class == '' && $section == 'total') { $class = $totclass; } if ($class == '' && $rownum % 2 == 0) { $class = $c2class; } if ($ret == '') { $ret = $b; } return array($ret, $class); }