1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-27 21:34:13 +00:00
ESPUI/src/dataControlsJS.h
2022-05-29 10:14:52 +01:00

109 lines
31 KiB
C

const char JS_CONTROLS[] PROGMEM = R"=====(
const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UI_TIME=20;const UPDATE_TIME=120;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var graphData=new Array();var hasAccel=false;var sliderContinuous=false;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}}
var websock;var websockConnected=false;function requestOrientationPermission(){}
function saveGraphData(){localStorage.setItem("espuigraphs",JSON.stringify(graphData));}
function restoreGraphData(id){var savedData=localStorage.getItem("espuigraphs",graphData);if(savedData!=null){savedData=JSON.parse(savedData);return savedData[id];}
return[];}
function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();}
function conStatusError(){websockConnected=false;$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart,});}
function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}}
function start(){document.addEventListener("visibilitychange",handleVisibilityChange,false);if(window.location.port!=""||window.location.port!=80||window.location.port!=443){websock=new WebSocket("ws://"+window.location.hostname+":"+window.location.port+"/ws");}else{websock=new WebSocket("ws://"+window.location.hostname+"/ws");}
websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;};websock.onclose=function(evt){console.log("websock close");conStatusError();};websock.onerror=function(evt){console.log(evt);conStatusError();};var handleEvent=function(evt){console.log(evt);var data=JSON.parse(evt.data);var e=document.body;var center="";switch(data.type){case UI_INITIAL_GUI:$("#row").html("");$("#tabsnav").html("");$("#tabscontent").html("");if(data.sliderContinuous){sliderContinuous=data.sliderContinuous;}
data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>(data.controls.length-1)){websock.send("uiok:"+(data.controls.length-1));}
break;case UI_EXTEND_GUI:data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>data.startindex+(data.controls.length-1)){websock.send("uiok:"+(data.startindex+(data.controls.length-1)));}
break;case UI_RELOAD:window.location.reload();break;case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case UI_LABEL:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GAUGE:case UI_SEPARATOR:if(data.visible)addToHTML(data);break;case UI_BUTTON:if(data.visible){addToHTML(data);$("#btn"+data.id).on({touchstart:function(e){e.preventDefault();buttonclick(data.id,true);},touchend:function(e){e.preventDefault();buttonclick(data.id,false);},});}
break;case UI_SWITCHER:if(data.visible){addToHTML(data);switcher(data.id,data.value);}
break;case UI_CPAD:case UI_PAD:if(data.visible){addToHTML(data);$("#pf"+data.id).on({touchstart:function(e){e.preventDefault();padclick(UP,data.id,true);},touchend:function(e){e.preventDefault();padclick(UP,data.id,false);},});$("#pl"+data.id).on({touchstart:function(e){e.preventDefault();padclick(LEFT,data.id,true);},touchend:function(e){e.preventDefault();padclick(LEFT,data.id,false);},});$("#pr"+data.id).on({touchstart:function(e){e.preventDefault();padclick(RIGHT,data.id,true);},touchend:function(e){e.preventDefault();padclick(RIGHT,data.id,false);},});$("#pb"+data.id).on({touchstart:function(e){e.preventDefault();padclick(DOWN,data.id,true);},touchend:function(e){e.preventDefault();padclick(DOWN,data.id,false);},});$("#pc"+data.id).on({touchstart:function(e){e.preventDefault();padclick(CENTER,data.id,true);},touchend:function(e){e.preventDefault();padclick(CENTER,data.id,false);},});}
break;case UI_SLIDER:if(data.visible){addToHTML(data);rangeSlider(!sliderContinuous);}
break;case UI_TAB:if(data.visible){$("#tabsnav").append("<li><a onmouseup='tabclick("+data.id+")' href='#tab"+data.id+"'>"+data.value+"</a></li>");$("#tabscontent").append("<div id='tab"+data.id+"'></div>");tabs=$(".tabscontent").tabbedContent({loop:true}).data("api");$("a").filter(function(){return $(this).attr("href")==="#click-to-switch";}).on("click",function(e){var tab=prompt("Tab to switch to (number or id)?");if(!tabs.switchTab(tab)){alert("That tab does not exist :\\");}
e.preventDefault();});}
break;case UI_OPTION:if(data.parentControl){var parent=$("#select"+data.parentControl);parent.append("<option id='option"+
data.id+
"' value='"+
data.value+
"' "+
data.selected+
">"+
data.label+
"</option>");}
break;case UI_MIN:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("min",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("min",data.value);}}
break;case UI_MAX:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("max",data.value);}else if($('#text'+data.parentControl).length){$('#text'+data.parentControl).attr("maxlength",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("max",data.value);}}
break;case UI_STEP:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){parent.attr("step",data.value);}}
break;case UI_GRAPH:if(data.visible){addToHTML(data);graphData[data.id]=restoreGraphData(data.id);renderGraphSvg(graphData[data.id],"graph"+data.id);}
break;case ADD_GRAPH_POINT:var ts=Math.round(new Date().getTime()/1000);graphData[data.id].push({x:ts,y:data.value});saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case CLEAR_GRAPH:graphData[data.id]=[];saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case UI_ACCEL:if(hasAccel)break;hasAccel=true;if(data.visible){addToHTML(data);requestOrientationPermission();}
break;case UPDATE_LABEL:$("#l"+data.id).html(data.value);if(data.hasOwnProperty('elementStyle')){$("#l"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SWITCHER:switcher(data.id,data.value=="0"?0:1);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SLIDER:$("#sl"+data.id).attr("value",data.value)
slider_move($("#sl"+data.id).parent().parent(),data.value,"100",false);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_NUMBER:$("#num"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#num"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#text"+data.id).attr("style",data.elementStyle);}
if(data.hasOwnProperty('inputType')){$("#text"+data.id).attr("type",data.inputType);}
break;case UPDATE_SELECT:$("#select"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#select"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);$("#btn"+data.id).text(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_PAD:case UPDATE_CPAD:break;case UPDATE_GAUGE:$("#gauge"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#gauge"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_ACCEL:break;case UPDATE_TIME:var rv=new Date().toISOString();websock.send("time:"+rv+":"+data.id);break;default:console.error("Unknown type or event");break;}
if(data.type>=UI_TITEL&&data.type<UPDATE_OFFSET){processEnabled(data);}
if(data.type>=UPDATE_OFFSET&&data.type<UI_INITIAL_GUI){var element=$("#id"+data.id);if(data.hasOwnProperty('panelStyle')){$("#id"+data.id).attr("style",data.panelStyle);}
if(data.hasOwnProperty('visible')){if(data['visible'])
$("#id"+data.id).show();else
$("#id"+data.id).hide();}
if(data.type==UPDATE_SLIDER){element.removeClass("slider-turquoise slider-emerald slider-peterriver slider-wetasphalt slider-sunflower slider-carrot slider-alizarin");element.addClass("slider-"+colorClass(data.color));}else{element.removeClass("turquoise emerald peterriver wetasphalt sunflower carrot alizarin");element.addClass(colorClass(data.color));}
processEnabled(data);}
$(".range-slider__range").each(function(){$(this)[0].value=$(this).attr("value");$(this).next().html($(this).attr("value"));});};websock.onmessage=handleEvent;}
function sliderchange(number){var val=$("#sl"+number).val();websock.send("slvalue:"+val+":"+number);$(".range-slider__range").each(function(){$(this).attr("value",$(this)[0].value);});}
function numberchange(number){var val=$("#num"+number).val();websock.send("nvalue:"+val+":"+number);}
function textchange(number){var val=$("#text"+number).val();websock.send("tvalue:"+val+":"+number);}
function tabclick(number){var val=$("#tab"+number).val();websock.send("tabvalue:"+val+":"+number);}
function selectchange(number){var val=$("#select"+number).val();websock.send("svalue:"+val+":"+number);}
function buttonclick(number,isdown){if(isdown)websock.send("bdown:"+number);else websock.send("bup:"+number);}
function padclick(type,number,isdown){if($("#id"+number+" nav").hasClass("disabled")){return;}
switch(type){case CENTER:if(isdown)websock.send("pcdown:"+number);else websock.send("pcup:"+number);break;case UP:if(isdown)websock.send("pfdown:"+number);else websock.send("pfup:"+number);break;case DOWN:if(isdown)websock.send("pbdown:"+number);else websock.send("pbup:"+number);break;case LEFT:if(isdown)websock.send("pldown:"+number);else websock.send("plup:"+number);break;case RIGHT:if(isdown)websock.send("prdown:"+number);else websock.send("prup:"+number);break;}}
function switcher(number,state){if(state==null){if(!$("#sl"+number).hasClass("checked")){websock.send("sactive:"+number);$("#sl"+number).addClass("checked");}else{websock.send("sinactive:"+number);$("#sl"+number).removeClass("checked");}}else if(state==1){$("#sl"+number).addClass("checked");$("#sl"+number).prop("checked",true);}else if(state==0){$("#sl"+number).removeClass("checked");$("#sl"+number).prop("checked",false);}}
var rangeSlider=function(isDiscrete){var range=$(".range-slider__range");var slidercb=function(){sliderchange($(this).attr("id").replace(/^\D+/g,""));};range.on({input:function(){$(this).next().html(this.value)}});range.each(function(){$(this).next().html(this.value);if($(this).attr("callbackSet")!="true"){if(!isDiscrete){$(this).on({input:slidercb});}else{$(this).on({change:slidercb});}
$(this).attr("callbackSet","true");}});};var addToHTML=function(data){panelStyle=data.hasOwnProperty('panelStyle')?" style='"+data.panelStyle+"' ":"";panelwide=data.hasOwnProperty('wide')?"wide":"";if(!data.hasOwnProperty('parentControl')||$("#tab"+data.parentControl).length>0){var parent=data.hasOwnProperty('parentControl')?$("#tab"+data.parentControl):$("#row");var html="";switch(data.type){case UI_LABEL:case UI_BUTTON:case UI_SWITCHER:case UI_CPAD:case UI_PAD:case UI_SLIDER:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GRAPH:case UI_GAUGE:case UI_ACCEL:html="<div id='id"+data.id+"' "+panelStyle+" class='two columns "+panelwide+" card tcenter "+
colorClass(data.color)+"'><h5>"+data.label+"</h5><hr/>"+
elementHTML(data)+
"</div>";break;case UI_SEPARATOR:html="<div id='id"+data.id+"' "+panelStyle+" class='sectionbreak columns'>"+
"<h5>"+data.label+"</h5><hr/></div>";break;case UI_TIME:break;}
parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data));}}
var elementHTML=function(data){var id=data.id
var elementStyle=data.hasOwnProperty('elementStyle')?" style='"+data.elementStyle+"' ":"";var inputType=data.hasOwnProperty('inputType')?" type='"+data.inputType+"' ":"";switch(data.type){case UI_LABEL:return"<span id='l"+id+"' "+elementStyle+
" class='label label-wrap'>"+data.value+"</span>";case UI_BUTTON:return"<button id='btn"+id+"' "+elementStyle+
" onmousedown='buttonclick("+id+", true)'"+
" onmouseup='buttonclick("+id+", false)'>"+
data.value+"</button>";case UI_SWITCHER:return"<label id='sl"+id+"' "+elementStyle+
" class='switch "+(data.value=="1"?"checked":"")+
(data.hasOwnProperty('vertical')?" vert-switcher ":"")+
"'>"+
"<div class='in'>"+
"<input type='checkbox' id='s"+id+"' onClick='switcher("+id+",null)' "+
(data.value=="1"?"checked":"")+"/></div></label>";case UI_CPAD:case UI_PAD:return"<nav class='control'><ul>"+
"<li><a onmousedown='padclick(UP, "+id+", true)' "+
"onmouseup='padclick(UP, "+id+", false)' id='pf"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(RIGHT, "+id+", true)' "+
"onmouseup='padclick(RIGHT, "+id+", false)' id='pr"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(LEFT, "+id+", true)' "+
"onmouseup='padclick(LEFT, "+id+", false)' id='pl"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(DOWN, "+id+", true)' "+
"onmouseup='padclick(DOWN, "+id+", false)' id='pb"+id+"'>&#9650;</a></li>"+
"</ul>"+
(data.type==UI_CPAD?"<a class='confirm' onmousedown='padclick(CENTER,"+id+", true)' "+
"onmouseup='padclick(CENTER, "+id+", false)' id='pc"+id+"'>OK</a>":"")+
"</nav>";case UI_SLIDER:return"<div class='range-slider "+
(data.hasOwnProperty('vertical')?" vert-slider ":"")+
"'>"+
"<input id='sl"+id+"' type='range' min='0' max='100' value='"+data.value+"' "+
elementStyle+" class='range-slider__range'><span class='range-slider__value'>"+
data.value+"</span></div>";case UI_NUMBER:return"<input style='color:black;' "+elementStyle+" id='num"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input "+inputType+"style='color:black;' "+elementStyle+" id='text"+id+
"' value='"+data.value+"' onchange='textchange("+id+")' />";case UI_SELECT:return"<select style='color:black;' "+elementStyle+" id='select"+id+
"' onchange='selectchange("+id+")' />";case UI_GRAPH:return"<figure id='graph"+id+"'><figcaption>"+data.label+"</figcaption></figure>";case UI_GAUGE:return"WILL BE A GAUGE <input style='color:black;' id='gauge"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_ACCEL:return"ACCEL // Not implemented fully!<div class='accelerometer' id='accel"+id+
"' ><div class='ball"+id+"'></div><pre class='accelerometeroutput"+id+"'></pre>";default:return"";}}
var processEnabled=function(data){switch(data.type){case UI_SWITCHER:case UPDATE_SWITCHER:if(data.enabled){$("#sl"+data.id).removeClass('disabled');$("#s"+data.id).prop("disabled",false);}else{$("#sl"+data.id).addClass('disabled');$("#s"+data.id).prop("disabled",true);}
break;case UI_SLIDER:case UPDATE_SLIDER:$("#sl"+data.id).prop("disabled",!data.enabled);break;case UI_NUMBER:case UPDATE_NUMBER:$("#num"+data.id).prop("disabled",!data.enabled);break;case UI_TEXT_INPUT:case UPDATE_TEXT_INPUT:$("#text"+data.id).prop("disabled",!data.enabled);break;case UI_SELECT:case UPDATE_SELECT:$("#select"+data.id).prop("disabled",!data.enabled);break;case UI_BUTTON:case UPDATE_BUTTON:$("#btn"+data.id).prop("disabled",!data.enabled);break;case UI_PAD:case UI_CPAD:case UPDATE_PAD:case UPDATE_CPAD:if(data.enabled){$("#id"+data.id+" nav").removeClass('disabled');}else{$("#id"+data.id+" nav").addClass('disabled');}
break;}}
)=====";
const uint8_t JS_CONTROLS_GZIP[4219] PROGMEM = { 31,139,8,0,124,57,147,98,2,255,197,27,105,119,219,56,238,123,126,133,162,246,213,242,198,241,209,107,58,118,148,62,215,113,91,239,228,218,196,153,206,219,78,55,79,182,233,88,47,178,164,145,228,28,147,230,191,47,8,30,34,117,216,174,51,179,251,165,177,64,16,4,113,16,32,192,142,3,63,78,140,139,193,229,224,120,48,28,116,15,47,63,93,12,236,151,205,102,103,44,6,206,250,135,39,221,3,128,181,4,236,244,160,59,236,95,158,124,252,120,222,31,218,45,21,183,255,219,176,127,124,192,104,180,20,248,112,48,236,31,218,10,224,20,40,102,232,33,40,93,100,112,217,163,144,151,58,82,143,97,189,76,177,62,92,12,135,39,199,246,43,29,143,67,91,205,87,41,230,97,247,3,48,241,90,71,100,192,86,243,117,138,119,254,101,48,236,125,238,159,217,111,116,84,9,111,53,223,40,216,135,131,3,128,189,205,224,50,104,171,249,54,197,60,190,56,250,0,176,159,116,76,14,109,53,127,82,196,5,114,4,133,156,94,12,237,119,58,182,50,210,106,190,75,103,124,58,235,158,126,182,127,230,128,238,193,1,131,92,158,158,12,142,41,42,31,232,29,246,187,103,28,185,213,252,89,89,177,251,193,110,101,20,194,96,138,66,206,251,135,253,30,80,203,232,68,128,91,138,86,78,78,135,3,42,255,140,90,4,184,165,168,229,104,0,128,140,86,16,214,82,116,114,212,253,205,110,101,244,129,176,150,170,138,97,255,212,110,101,53,129,192,150,162,135,79,221,139,79,125,187,149,209,3,135,182,20,53,116,123,61,106,27,25,21,112,104,235,157,42,152,211,238,89,119,120,2,106,252,57,43,27,57,210,82,197,61,56,234,131,71,101,228,77,129,45,5,42,29,230,224,228,203,177,116,151,195,254,199,161,116,139,179,193,167,207,67,105,252,189,254,241,16,108,73,200,173,119,57,188,56,251,215,197,201,224,188,47,73,245,46,251,71,253,179,238,97,234,126,189,203,211,62,204,58,27,252,10,83,95,74,224,151,254,176,123,126,250,185,123,168,144,191,60,191,56,254,120,120,242,69,91,163,215,61,59,59,25,74,103,233,93,118,15,7,255,238,158,129,6,223,74,208,65,247,236,23,105,248,189,203,227,147,99,216,254,155,55,157,27,39,50,174,34,39,156,29,56,137,99,251,228,214,232,70,145,115,111,85,113,100,230,196,221,241,152,120,246,212,241,98,130,160,216,115,39,36,234,5,126,226,250,139,96,17,243,161,233,194,31,39,110,224,27,227,192,11,162,158,231,196,177,133,63,7,147,234,3,255,97,31,47,230,35,18,73,120,39,190,117,147,241,76,193,115,98,162,202,172,29,145,100,17,249,38,252,243,199,34,112,99,98,118,56,10,23,161,64,32,115,18,57,222,68,14,167,242,20,24,33,73,72,20,185,55,36,146,72,169,124,5,210,45,73,156,56,156,57,94,34,145,164,188,5,78,188,240,167,94,112,171,208,97,226,23,227,99,39,138,130,116,190,80,133,24,118,60,247,79,39,114,125,137,64,21,211,230,191,169,86,4,226,196,137,174,205,206,132,76,157,133,151,8,160,217,121,124,220,162,90,184,37,163,56,24,95,119,148,223,160,18,159,140,19,50,201,106,36,34,127,44,72,156,156,68,46,241,19,135,130,78,73,52,119,227,24,126,89,213,135,199,45,137,25,59,55,228,147,48,6,24,242,130,177,227,157,39,65,228,92,145,122,76,146,65,66,230,150,73,226,112,225,162,205,196,102,237,159,231,39,199,245,56,129,29,93,185,211,123,75,154,82,181,218,81,8,71,176,126,16,41,180,93,208,54,90,19,172,56,65,211,211,214,186,42,92,43,37,222,113,167,150,156,186,109,251,11,207,171,62,164,180,144,169,208,137,98,146,98,85,59,76,134,233,146,95,221,201,55,96,146,129,191,126,203,242,235,68,9,136,224,185,53,9,198,139,57,72,174,90,119,38,19,203,252,135,89,173,7,211,41,56,200,115,203,124,22,5,183,240,61,75,230,158,101,154,213,14,87,69,125,236,5,176,54,24,56,163,162,146,6,15,60,7,45,44,226,62,216,73,4,43,148,168,143,82,151,184,176,70,68,230,193,13,97,142,101,162,199,236,94,69,132,248,102,53,135,10,124,106,120,17,153,20,96,49,166,145,11,163,97,28,7,6,231,128,50,249,226,217,187,183,175,222,116,10,102,165,91,215,160,190,245,48,246,220,241,117,155,75,174,246,168,109,122,230,248,19,143,252,234,198,238,200,245,220,228,190,7,128,43,16,208,3,232,113,59,43,128,23,47,182,133,204,235,51,119,50,33,126,245,65,42,132,58,64,106,175,92,73,18,29,118,222,191,129,31,135,110,156,16,31,142,26,243,70,174,57,198,53,205,90,49,47,53,148,58,26,214,173,235,79,130,219,58,53,72,186,74,61,12,162,100,219,54,205,239,223,139,71,222,53,203,70,94,191,126,37,245,139,103,235,23,50,58,135,223,36,177,204,219,184,221,104,152,59,217,137,179,32,78,124,103,78,118,204,118,126,144,82,221,49,27,183,32,242,206,35,1,126,55,38,206,105,108,9,131,13,252,32,36,190,45,36,107,145,155,132,30,219,126,28,120,4,230,95,1,73,134,105,80,188,53,108,174,204,54,19,114,7,252,73,93,167,62,147,218,127,18,45,72,231,177,147,178,134,222,180,14,111,136,8,36,179,62,166,81,35,20,182,132,26,5,20,81,96,241,144,218,14,154,216,42,10,20,125,146,57,140,96,160,62,193,179,136,142,18,91,218,237,40,152,220,35,108,12,95,36,2,99,19,177,145,162,215,147,251,144,240,232,168,223,19,218,5,103,16,5,37,206,40,246,157,155,34,48,48,10,174,145,168,67,96,243,184,76,54,180,195,145,154,13,246,133,120,96,71,8,167,164,163,192,139,235,211,32,234,59,192,60,241,8,221,158,189,143,103,61,68,178,59,38,186,7,138,222,206,132,14,142,92,173,61,118,20,49,91,114,22,232,32,101,53,9,18,199,19,235,237,91,250,242,30,241,175,146,217,110,171,42,157,15,130,151,15,103,247,194,13,174,193,173,74,209,97,35,163,136,56,215,29,33,234,244,54,213,254,255,238,144,201,157,30,119,224,210,228,110,103,163,29,175,51,63,47,3,118,251,108,103,207,146,136,120,129,51,1,207,208,177,241,158,217,150,134,157,184,137,71,152,213,120,206,136,120,104,134,115,199,245,63,19,7,108,72,88,97,138,144,165,135,183,195,182,248,98,87,53,249,153,222,197,36,136,93,133,228,39,222,41,148,65,126,23,104,11,41,99,120,240,72,21,142,175,97,240,121,120,116,104,49,255,212,153,96,119,217,220,164,135,236,44,186,185,81,226,155,59,136,6,57,14,6,198,36,88,140,103,40,251,118,122,102,84,31,72,61,140,8,85,251,1,203,241,168,40,23,73,66,143,59,8,164,22,39,81,163,167,33,40,165,134,84,64,167,155,208,224,177,237,145,69,101,125,111,226,78,189,122,119,236,68,130,160,42,200,50,116,199,67,6,51,100,105,153,64,202,157,254,94,75,120,225,116,99,217,133,206,132,109,250,226,180,182,169,236,138,104,168,178,67,22,189,167,179,72,47,144,79,103,82,163,146,99,51,122,58,155,120,181,125,58,159,58,153,28,163,163,167,51,74,111,231,79,231,83,163,146,99,115,252,116,54,89,113,224,233,140,102,232,44,245,110,172,130,173,118,190,136,230,192,231,24,215,173,237,92,30,144,35,59,236,126,200,211,212,19,15,39,12,49,2,237,121,238,254,158,99,4,254,28,40,145,69,104,87,0,135,237,67,74,116,199,172,86,140,89,68,166,118,133,82,80,224,149,125,254,129,199,204,142,185,215,112,246,247,26,64,178,48,163,145,107,78,220,27,195,157,224,82,26,177,189,6,140,208,185,116,158,13,4,234,58,1,248,26,145,73,143,125,91,112,255,13,194,54,85,211,99,21,243,54,203,116,66,151,173,236,0,246,212,245,32,89,179,164,218,232,53,5,175,152,207,173,100,230,198,192,79,146,192,21,132,110,204,172,218,182,13,153,48,221,247,110,18,236,178,179,20,174,243,104,76,38,194,205,154,106,0,52,159,0,118,236,48,10,230,33,164,204,67,103,100,36,129,193,38,210,95,150,143,213,20,3,174,111,96,147,239,89,30,183,77,247,83,103,72,48,195,130,79,200,9,28,143,68,148,196,204,73,40,77,99,18,144,216,240,131,196,32,119,112,81,50,218,191,255,142,151,129,2,155,43,48,41,86,65,148,234,135,204,22,102,244,88,38,193,216,102,32,42,222,103,49,228,60,227,132,235,64,71,237,176,207,84,105,65,136,151,58,170,55,246,211,220,217,18,186,219,50,43,6,154,128,93,17,80,102,17,116,64,64,216,98,132,98,239,11,24,38,21,0,216,107,48,154,251,102,126,71,71,131,210,237,0,248,185,85,121,22,123,149,162,45,240,188,137,154,126,57,14,51,130,185,235,155,122,192,164,247,55,131,211,7,85,174,94,160,20,169,108,133,220,62,187,191,253,253,251,116,238,150,236,147,222,254,86,175,80,142,37,215,96,232,127,183,68,115,123,201,29,175,195,254,233,154,158,224,78,138,188,96,199,52,92,63,92,36,204,123,185,71,196,238,159,196,2,183,21,14,130,204,196,9,9,87,112,131,93,133,213,103,189,44,163,125,229,222,245,205,206,213,231,68,168,235,0,7,16,11,112,224,252,230,202,202,207,173,153,8,75,163,163,238,94,153,70,72,27,143,181,216,62,114,146,89,61,10,22,224,248,180,116,1,20,97,199,180,236,55,116,231,240,171,209,106,54,155,69,156,214,195,69,60,179,30,238,218,73,92,187,111,167,210,128,115,42,83,188,220,132,115,133,111,165,79,211,46,16,216,215,111,127,241,122,162,217,65,213,39,170,238,85,54,46,139,240,88,24,89,29,202,151,150,123,51,135,159,210,130,195,90,130,154,220,166,55,51,110,112,98,105,96,232,228,214,63,141,130,16,194,202,189,85,225,247,218,243,228,222,35,149,42,75,4,84,66,194,128,97,152,91,176,58,163,152,37,121,45,89,114,235,128,136,218,52,223,55,219,173,31,99,45,126,50,111,44,169,42,161,133,172,105,158,186,197,18,170,75,90,192,181,114,179,152,151,91,233,15,101,106,205,4,71,48,149,218,228,255,110,147,252,170,77,105,193,49,169,16,3,198,54,182,10,157,210,38,108,41,87,126,204,255,32,84,252,69,188,101,72,173,102,174,140,56,30,232,195,251,112,57,101,90,211,227,132,229,132,18,115,99,37,141,92,58,245,212,13,231,136,109,162,15,94,26,201,87,62,178,156,229,49,176,20,188,41,243,58,169,77,56,79,11,20,233,195,134,118,30,141,85,144,232,146,87,206,226,138,252,69,178,207,210,218,100,3,44,94,20,184,200,224,168,143,113,54,186,177,149,224,154,4,131,243,147,115,44,70,90,105,167,138,149,9,19,136,186,109,115,39,186,193,182,67,38,62,137,30,164,40,113,99,1,221,50,47,252,107,63,184,245,13,106,200,244,18,130,55,7,83,76,74,221,131,142,239,219,162,52,248,226,133,4,238,105,207,88,32,221,137,130,49,137,227,190,239,64,92,155,240,104,150,163,163,206,209,136,105,133,113,150,126,137,234,172,150,127,209,141,149,169,42,116,124,226,105,138,82,167,21,104,41,157,176,236,68,224,177,154,210,228,40,95,37,236,91,117,43,183,78,60,11,110,65,71,52,159,205,15,206,32,150,88,89,193,216,182,22,155,170,15,124,235,122,219,144,197,161,93,217,78,231,205,252,93,222,62,23,159,105,175,92,64,210,198,184,128,200,54,184,0,176,190,183,248,146,109,110,186,11,34,122,115,58,27,230,142,242,86,128,215,163,225,187,42,122,91,133,91,72,121,23,76,43,220,170,108,74,254,56,99,203,56,42,229,99,171,196,38,105,229,0,75,38,187,60,180,95,226,151,89,173,19,218,21,80,42,2,188,20,240,181,249,141,231,44,122,109,128,37,11,244,116,100,80,159,158,137,60,245,42,196,100,87,114,165,157,53,7,246,156,43,98,43,29,5,181,243,202,248,99,189,79,94,49,96,190,1,244,108,145,40,112,56,158,104,217,163,33,246,112,101,56,22,224,47,30,15,28,187,243,195,66,208,19,164,172,100,120,177,65,114,206,150,89,194,57,38,19,203,88,247,203,56,87,86,161,65,104,201,26,44,116,47,91,36,89,103,17,81,241,42,92,130,214,168,150,174,224,140,214,88,131,69,243,101,138,230,225,126,169,178,215,88,72,109,48,176,225,154,27,79,32,18,224,225,198,127,234,100,71,20,166,80,195,139,122,6,101,17,22,47,39,171,158,244,152,171,229,23,20,231,35,27,129,251,52,239,123,58,49,63,49,38,110,140,206,11,190,195,235,115,64,158,119,87,149,198,42,43,170,182,203,182,16,142,87,239,33,28,107,155,208,34,115,57,225,233,26,132,167,101,132,105,205,186,156,244,26,114,15,71,101,164,105,123,161,156,180,183,6,105,175,140,52,118,4,202,105,71,107,208,142,10,104,107,79,67,196,181,145,91,76,12,87,97,130,6,131,191,108,254,102,136,150,76,179,167,96,106,58,64,96,124,205,44,39,227,39,14,172,114,67,244,195,80,35,162,188,135,16,68,244,39,27,130,146,235,175,164,165,63,253,73,201,201,130,23,223,82,43,189,250,45,99,35,139,3,49,46,76,199,69,91,34,67,187,153,167,93,194,214,10,242,162,91,193,222,177,41,125,135,244,65,133,27,31,184,241,24,124,149,151,193,17,201,46,13,55,202,179,196,241,200,86,194,142,22,251,244,24,4,39,6,221,64,232,57,99,98,53,254,243,251,193,78,227,170,102,98,120,101,189,16,236,241,224,197,172,93,16,200,212,48,77,33,60,130,61,62,242,78,74,105,4,44,153,216,193,131,76,101,112,236,120,222,200,25,95,159,19,200,169,183,109,147,106,197,100,246,170,138,71,76,74,185,21,130,120,20,246,166,162,48,89,104,56,91,229,235,214,248,170,157,199,71,241,0,70,22,155,82,57,99,78,244,144,38,194,246,202,204,250,189,105,96,14,77,107,249,153,44,122,135,150,243,219,166,217,65,208,45,176,89,76,142,142,80,66,244,47,226,83,193,148,44,172,148,91,43,213,239,223,101,204,45,175,14,239,55,181,242,237,58,116,223,47,35,155,62,211,97,175,136,64,251,203,159,248,232,175,30,248,29,59,215,177,47,237,181,103,186,127,155,191,158,192,242,103,241,91,10,118,251,100,91,145,253,54,229,162,130,154,220,81,53,107,140,233,81,97,87,146,219,128,190,18,94,204,253,88,96,80,53,82,4,39,154,24,9,123,3,69,187,58,197,121,57,54,242,102,111,68,103,144,117,120,204,189,6,128,246,102,81,131,182,126,120,134,159,86,69,177,3,132,189,191,76,209,53,125,18,178,201,86,98,246,94,18,73,138,61,209,150,37,172,182,132,193,98,78,240,218,46,46,207,122,111,140,178,38,220,121,173,182,66,182,185,150,147,135,60,128,149,145,172,75,211,97,144,4,23,130,138,189,196,207,245,98,71,206,211,213,97,233,235,184,144,168,129,217,171,106,106,64,19,111,188,130,164,28,146,244,86,249,21,127,76,189,23,131,74,81,215,16,173,132,150,53,6,183,164,162,81,135,6,254,187,123,27,57,97,190,47,77,137,237,155,217,39,67,98,41,150,52,227,98,88,185,42,91,142,183,201,105,2,4,152,74,166,205,166,212,12,140,206,180,7,106,170,45,245,34,76,22,104,43,251,122,191,20,56,101,200,10,175,242,64,17,220,178,221,82,102,227,213,162,225,29,105,241,200,76,84,230,91,230,123,25,244,65,41,224,129,37,181,17,248,227,66,212,65,197,210,143,93,145,186,25,124,158,201,61,138,122,38,95,211,245,57,12,149,207,237,1,87,27,5,119,21,198,185,96,60,240,123,84,46,130,81,250,40,152,73,8,51,64,236,30,175,224,220,20,46,187,215,64,201,40,162,203,29,189,66,132,112,11,17,204,242,87,118,112,104,45,60,198,181,246,36,130,233,90,125,122,100,232,202,166,28,154,138,178,11,81,185,182,113,235,244,21,21,123,239,240,226,217,207,111,223,52,59,233,171,137,85,171,179,183,58,235,50,144,193,214,120,136,54,230,1,223,53,173,203,130,142,172,113,224,109,204,1,190,4,90,151,3,29,89,227,96,180,148,131,6,51,7,173,136,199,44,234,189,9,172,165,214,51,117,163,121,165,132,85,254,22,104,77,94,57,118,49,183,99,193,237,201,47,148,81,225,125,123,13,176,101,245,180,96,73,133,48,116,197,43,213,236,60,117,171,53,28,158,207,208,221,157,185,182,126,8,49,71,199,117,42,198,220,5,65,52,225,175,115,103,87,90,205,166,242,66,68,61,240,80,26,122,220,41,98,152,95,39,192,75,49,44,20,98,32,197,130,19,21,207,126,17,213,51,217,150,144,19,219,14,143,134,152,200,180,71,112,251,184,238,228,142,86,19,55,141,213,45,254,242,133,109,155,93,168,74,119,9,231,63,102,247,2,145,223,123,152,232,64,199,13,133,55,37,245,211,249,3,236,52,156,174,207,44,43,147,101,223,233,148,241,167,212,220,10,185,227,89,168,12,211,88,184,250,1,209,137,74,23,231,39,93,88,171,145,21,46,205,50,94,177,242,212,189,90,68,4,105,242,214,61,127,70,6,3,99,135,191,39,202,36,121,202,16,126,0,1,149,62,230,208,156,254,151,193,225,161,241,161,111,116,13,4,27,203,108,4,121,96,77,163,191,203,40,88,70,207,121,195,15,163,65,255,99,16,56,225,60,100,82,38,19,99,10,81,243,126,91,117,123,135,62,78,32,81,48,167,133,120,198,41,130,36,167,251,42,246,8,46,152,82,142,44,170,134,32,227,34,90,193,34,161,79,99,36,114,136,162,44,251,47,113,122,169,62,155,204,150,231,132,153,235,84,230,249,129,104,178,16,70,182,160,185,174,150,65,42,162,216,88,225,117,16,181,207,143,117,16,89,141,148,133,16,126,73,207,182,236,69,225,230,71,72,242,210,77,241,27,208,117,94,48,100,9,110,107,123,207,92,88,180,235,228,138,71,3,63,68,56,119,49,93,167,245,255,67,43,104,247,220,213,93,246,31,162,173,221,214,87,52,201,127,136,176,154,106,246,178,221,235,194,110,118,161,241,106,23,91,94,45,47,179,225,212,56,139,102,21,218,168,176,190,199,199,255,2,187,135,146,97,217,64,0,0 };