ESPUI/src/dataControlsJS.h

112 lines
32 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;var WebSocketTimer=null;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);let idData=savedData[id];return Array.isArray(idData)?idData:[];}
return[];}
function restart(){$(document).add("*").off();$("#row").html("");conStatusError();start();}
function conStatusError(){if(true===websockConnected){websockConnected=false;websock.close();$("#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");}
if(null===WebSocketTimer){WebSocketTimer=setInterval(function(){if(websock.readyState===3){restart();}},5000);}
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("websock Error");console.log(evt);restart();};var handleEvent=function(evt){console.log(evt);try{var data=JSON.parse(evt.data);}
catch(Event){console.error(Event);websock.send("uiok:"+0);return;}
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){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("step",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).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=new Date().getTime();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; "+data.elementStyle+"' id='num"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input "+inputType+"style='color:black; "+data.elementStyle+"' id='text"+id+
"' value='"+data.value+"' onchange='textchange("+id+")' />";case UI_SELECT:return"<select style='color:black; "+data.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[4306] PROGMEM = { 31,139,8,0,22,146,123,99,2,255,197,27,107,115,218,72,242,187,127,133,172,164,130,56,99,30,155,77,54,11,150,83,4,147,132,91,199,246,217,248,178,117,217,156,75,192,96,84,22,146,86,18,118,124,132,255,126,61,61,15,205,232,1,216,222,220,125,137,81,79,79,79,191,102,186,167,123,50,14,252,56,49,46,7,87,131,147,193,112,208,61,190,250,112,57,176,127,106,54,59,99,49,112,222,63,62,237,30,1,172,37,96,103,71,221,97,255,234,244,253,251,139,254,208,110,169,184,253,223,135,253,147,35,70,163,165,192,135,131,97,255,216,86,0,103,64,49,67,15,65,233,34,131,171,30,133,252,164,35,245,24,214,79,41,214,187,203,225,240,244,196,126,169,227,113,104,171,249,50,197,60,238,190,3,38,126,214,17,25,176,213,252,57,197,187,248,60,24,246,62,246,207,237,87,58,170,132,183,154,175,20,236,227,193,17,192,94,103,112,25,180,213,124,157,98,158,92,126,122,7,176,95,116,76,14,109,53,127,81,212,5,122,4,131,156,93,14,237,55,58,182,50,210,106,190,73,103,124,56,239,158,125,180,127,229,128,238,209,17,131,92,157,157,14,78,40,42,31,232,29,247,187,231,28,185,213,252,85,89,177,251,206,110,101,12,194,96,138,65,46,250,199,253,30,80,203,216,68,128,91,138,85,78,207,134,3,170,255,140,89,4,184,165,152,229,211,0,0,25,171,32,172,165,216,228,83,247,119,187,149,177,7,194,90,170,41,134,253,51,187,149,181,4,2,91,138,29,62,116,47,63,244,237,86,198,14,28,218,82,204,208,237,245,168,111,100,76,192,161,173,55,170,98,206,186,231,221,225,41,152,241,215,172,110,228,72,75,85,247,224,83,31,118,84,70,223,20,216,82,160,114,195,28,157,126,62,145,219,229,184,255,126,40,183,197,249,224,195,199,161,116,254,94,255,100,8,190,36,244,214,187,26,94,158,255,227,242,116,112,209,151,164,122,87,253,79,253,243,238,113,186,253,122,87,103,125,152,117,62,248,39,76,253,73,2,63,247,135,221,139,179,143,221,99,133,252,213,197,229,201,251,227,211,207,218,26,189,238,249,249,233,80,110,150,222,85,247,120,240,175,238,57,88,240,181,4,29,117,207,127,147,142,223,187,58,57,61,1,241,95,189,234,220,58,145,113,29,57,225,236,200,73,28,219,39,119,70,55,138,156,123,171,138,35,51,39,238,142,199,196,179,167,142,23,19,4,197,158,59,33,81,47,240,19,215,95,4,139,152,15,77,23,254,56,113,3,223,24,7,94,16,245,60,39,142,45,252,57,152,84,151,252,135,125,178,152,143,72,36,225,157,248,206,77,198,51,5,207,137,137,170,179,118,68,146,69,228,155,240,207,159,139,192,141,137,217,225,40,92,133,2,129,204,73,228,120,19,57,156,234,83,96,132,36,33,81,228,222,146,72,34,165,250,21,72,119,36,113,226,112,230,120,137,68,146,250,22,56,241,194,159,122,193,157,66,135,169,95,140,143,157,40,10,210,249,194,20,98,216,241,220,255,56,145,235,75,4,106,152,54,255,77,173,34,16,39,78,116,99,118,38,100,234,44,188,68,0,205,206,106,181,67,173,112,71,70,113,48,190,233,40,191,193,36,62,25,39,100,162,24,235,51,25,93,192,16,73,134,46,104,200,246,23,158,151,90,42,34,127,46,72,156,156,70,46,241,19,135,130,206,72,52,119,227,24,126,89,213,229,106,71,98,198,206,45,249,32,156,4,134,188,96,236,120,23,73,16,57,215,164,30,147,100,144,144,185,101,146,56,92,184,232,75,177,89,251,251,197,233,73,61,78,64,210,107,119,122,111,73,23,171,86,59,10,225,8,214,15,34,133,182,11,94,128,94,6,43,78,208,37,181,181,174,11,215,74,137,119,220,169,37,167,238,162,188,213,101,74,11,153,10,157,40,38,41,86,181,227,145,196,112,25,130,132,126,113,39,95,59,76,233,108,67,212,221,152,109,12,134,89,125,203,254,182,191,124,5,121,24,34,254,212,68,115,162,4,180,245,220,154,4,227,197,28,148,92,173,59,147,137,101,254,205,172,214,131,233,20,246,216,115,203,124,22,5,119,240,61,75,230,158,101,154,85,186,67,47,192,26,139,184,15,126,20,1,14,39,163,210,206,226,44,65,236,36,90,16,219,182,179,206,80,93,150,184,7,7,215,199,94,0,234,96,172,72,186,192,80,68,230,193,45,97,27,217,196,29,186,127,29,17,226,155,121,84,16,74,195,139,200,164,0,139,73,136,28,27,13,227,36,48,56,71,84,160,23,207,222,188,126,249,170,83,48,43,213,147,6,245,173,229,216,115,199,55,109,174,230,218,170,74,183,134,212,208,204,241,39,30,249,167,27,187,35,215,115,147,251,30,0,174,9,211,212,110,86,35,47,94,236,10,11,213,103,238,100,66,252,234,82,154,79,35,43,76,42,209,65,244,254,45,252,56,118,227,132,248,112,182,153,183,114,205,49,174,105,214,138,121,169,161,25,208,99,239,92,127,18,220,213,169,167,211,85,234,97,16,37,187,182,105,126,255,94,60,242,166,89,54,242,243,207,47,165,193,241,48,151,7,128,101,222,197,237,70,195,220,203,78,156,5,113,226,59,115,178,103,182,243,131,148,234,158,217,184,3,157,119,86,4,248,125,52,113,78,99,7,196,165,187,18,60,85,63,155,170,203,204,89,69,143,21,31,206,236,91,199,179,132,254,153,253,132,231,70,196,153,220,83,151,160,126,255,82,55,89,237,85,179,217,164,235,9,228,192,15,66,226,219,146,18,185,77,104,92,242,227,192,35,192,239,53,136,192,48,13,138,183,133,147,151,109,134,132,124,3,125,72,223,2,140,220,6,164,91,181,179,234,164,172,225,30,220,134,55,68,44,58,36,84,106,132,194,182,161,134,147,25,53,57,72,177,59,138,38,121,26,64,61,24,29,125,13,93,156,154,68,247,120,128,79,50,231,45,12,214,39,120,220,174,118,192,57,32,234,35,185,148,2,114,205,129,82,152,152,248,112,94,46,220,224,6,156,179,89,229,39,114,135,197,64,98,203,109,56,10,38,247,200,233,152,80,159,129,189,35,114,11,186,102,61,185,15,9,207,46,244,123,86,187,224,0,166,160,196,25,197,190,115,91,4,6,126,97,167,39,234,16,248,36,46,147,77,141,32,244,100,147,165,66,60,144,7,225,148,116,20,120,113,125,26,68,125,7,152,39,30,161,226,217,135,168,82,200,4,190,49,27,44,41,122,59,19,98,57,114,181,182,234,40,246,178,228,44,208,124,202,106,18,36,142,39,214,59,180,244,229,61,226,95,39,179,253,86,85,158,37,186,33,74,209,65,144,17,236,202,155,142,80,117,122,27,109,255,127,37,100,122,167,78,13,39,20,249,182,247,40,137,183,153,159,215,1,187,189,183,179,71,99,68,188,192,153,192,22,211,177,241,158,222,150,142,157,184,137,71,152,215,120,206,136,120,232,134,115,199,245,63,194,225,7,57,40,247,194,20,33,75,15,111,215,109,241,197,174,186,242,51,189,203,74,16,187,74,202,79,188,147,41,131,252,46,213,22,90,198,104,231,145,42,156,142,195,224,227,240,211,177,197,54,185,206,4,171,5,228,38,45,179,179,168,112,163,196,55,247,16,13,114,65,12,244,73,176,24,207,80,247,237,244,240,169,46,73,61,140,8,53,251,17,203,145,169,42,23,73,66,79,83,72,12,44,78,162,70,15,91,48,74,13,169,128,77,31,67,131,135,234,21,102,25,25,243,138,154,196,102,233,216,137,4,57,130,32,203,208,29,15,25,204,144,165,101,22,169,119,250,123,43,229,133,211,71,235,46,116,38,76,232,203,179,218,99,117,87,68,67,213,29,178,232,61,157,69,122,1,127,58,147,26,149,28,155,209,211,217,196,210,192,211,249,212,201,228,24,29,61,157,81,90,221,120,58,159,26,149,28,155,227,167,179,201,138,43,79,103,52,67,103,237,238,198,42,226,230,205,23,209,148,254,2,227,186,181,155,203,3,114,100,135,221,119,121,154,122,226,225,132,33,70,160,3,207,61,60,112,140,192,159,3,37,178,8,237,10,224,48,57,164,70,247,204,106,197,152,69,100,106,87,40,5,5,94,57,228,31,120,204,236,153,7,13,231,240,160,1,36,11,51,26,185,230,196,189,133,43,49,46,165,17,59,104,192,8,157,75,231,217,64,160,174,19,128,175,17,153,244,216,183,181,244,130,32,108,83,51,173,170,152,252,89,166,19,186,108,101,7,176,167,174,7,201,154,154,221,243,27,247,115,43,153,185,49,240,147,36,112,163,162,130,153,85,200,241,33,209,166,114,239,39,193,62,59,75,77,8,248,212,153,76,132,155,53,213,1,104,62,1,236,216,97,20,204,67,200,200,135,206,200,72,2,131,77,164,191,224,30,66,171,81,6,92,71,193,39,223,178,60,110,151,202,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,223,224,222,103,180,255,248,3,239,54,5,62,87,224,82,172,2,43,205,15,233,49,204,232,177,76,130,177,205,64,84,189,207,98,200,121,198,9,183,129,142,218,97,159,169,209,130,16,239,168,212,110,236,167,185,183,35,108,183,99,86,12,116,1,187,34,160,204,35,232,128,128,176,197,8,197,62,20,48,76,42,0,112,208,96,52,15,205,188,68,159,6,165,226,0,248,185,85,121,22,123,149,34,17,120,222,68,93,191,28,135,57,193,220,245,77,61,96,210,235,168,193,233,131,41,55,47,80,138,84,182,66,78,206,238,239,63,94,78,231,219,26,57,233,229,114,243,10,229,88,114,13,134,254,163,53,154,147,37,119,188,14,251,103,63,92,165,113,66,194,31,44,105,193,18,89,81,177,229,179,57,144,200,90,230,23,190,117,191,218,185,34,169,136,163,112,29,134,203,72,132,3,23,183,215,86,126,110,205,68,88,26,122,245,189,155,233,82,181,241,204,140,177,182,3,100,136,85,165,5,87,90,142,177,138,24,171,135,139,120,102,45,191,181,147,184,118,223,78,133,135,51,47,83,48,126,12,163,10,155,74,207,172,93,160,159,47,95,255,226,245,68,227,137,90,75,116,64,170,108,92,54,68,176,134,179,57,45,88,91,98,207,28,164,74,59,20,235,18,106,162,156,222,242,184,127,137,165,129,161,211,59,255,44,10,66,8,81,247,86,133,223,145,47,146,123,143,84,170,44,169,80,9,9,127,133,97,238,176,234,140,98,150,228,21,103,205,13,6,162,115,211,124,219,108,183,30,198,90,252,100,222,88,130,86,66,11,89,211,54,230,14,75,206,174,104,113,219,202,205,98,155,219,74,127,40,83,107,102,171,217,52,149,178,237,255,78,72,126,109,167,180,224,32,82,136,209,226,232,99,189,66,167,244,24,182,148,242,1,230,146,16,118,254,34,222,50,164,54,51,87,70,220,245,195,69,50,188,15,215,83,166,245,65,78,88,78,40,113,55,86,30,201,165,102,79,21,56,71,236,49,246,224,101,150,124,21,37,203,89,30,3,171,214,143,101,94,39,245,24,206,211,98,71,250,200,164,157,71,99,213,40,186,228,181,179,184,38,127,145,238,179,180,30,35,0,139,23,5,91,100,240,169,143,97,53,186,85,195,106,18,12,46,78,47,176,176,105,101,171,221,9,196,219,182,185,23,221,98,71,38,19,159,68,63,88,175,154,155,151,254,141,31,220,249,6,117,100,122,161,193,91,136,41,38,165,219,131,142,31,218,162,204,248,226,133,4,30,104,79,138,170,75,184,53,141,73,28,247,125,7,226,218,196,18,149,251,12,29,117,142,70,76,43,178,179,75,141,168,244,82,141,187,19,69,176,50,83,133,142,79,60,205,80,234,180,2,43,165,19,214,157,8,60,86,83,154,28,229,139,132,125,173,238,228,214,137,103,193,29,216,136,102,140,249,193,25,196,18,43,171,24,219,214,98,83,117,201,69,215,91,170,44,14,237,203,167,13,252,97,197,62,127,202,32,62,211,119,11,2,146,62,82,16,16,249,36,65,0,216,27,4,241,37,159,28,80,41,136,104,91,234,108,152,123,202,187,13,94,219,134,239,170,104,251,21,138,144,242,46,152,86,184,85,217,148,252,113,198,214,113,84,202,199,78,137,79,210,42,4,150,95,246,121,104,191,194,47,179,90,39,180,195,160,84,23,120,89,225,75,243,43,207,89,244,58,3,75,22,232,233,200,160,62,61,19,121,234,85,136,201,174,247,74,231,109,14,236,57,215,196,86,186,19,106,219,158,241,199,218,194,188,250,192,246,6,208,179,69,162,192,225,120,162,101,143,134,216,195,149,225,88,128,191,120,60,112,236,206,131,149,160,39,72,89,205,240,194,133,228,156,45,179,134,115,76,38,214,177,238,151,113,174,172,66,131,208,154,53,88,232,94,183,72,178,205,34,162,122,86,184,4,173,119,173,93,193,25,109,177,6,139,230,235,12,205,195,253,90,99,111,177,144,218,172,96,195,53,55,158,64,36,192,195,141,255,212,201,142,40,76,161,134,87,225,12,202,34,44,94,78,86,80,233,49,87,203,47,40,206,71,54,178,103,26,188,135,234,196,252,196,152,184,49,110,94,216,59,75,217,203,229,157,90,165,73,203,10,180,237,50,17,194,241,102,25,194,177,38,132,22,153,203,9,79,183,32,60,45,35,76,235,223,229,164,183,208,123,56,42,35,77,91,21,229,164,189,45,72,123,101,164,177,187,80,78,59,218,130,118,84,64,91,123,53,35,174,141,220,99,98,250,102,3,29,38,102,175,55,216,59,45,90,126,205,158,130,169,235,0,129,241,13,243,156,204,62,113,96,149,91,162,31,134,26,17,229,233,134,32,162,191,102,17,148,92,127,35,45,253,89,84,74,78,150,148,184,72,173,244,234,183,142,141,44,14,196,184,48,29,23,45,142,12,237,102,158,118,9,91,27,200,139,206,7,123,79,161,244,48,210,87,30,110,124,228,198,99,216,171,188,164,142,72,118,105,184,81,158,136,142,71,182,18,118,180,216,167,199,32,56,49,168,0,161,231,140,137,213,248,247,31,71,123,141,235,154,137,225,149,245,85,176,95,132,23,179,118,65,32,83,195,52,133,240,8,182,90,241,174,76,105,4,44,153,216,193,131,76,101,112,236,120,222,200,25,223,92,16,200,169,119,109,147,90,197,100,254,170,170,71,76,74,185,21,138,88,9,127,83,81,152,46,52,156,157,242,117,107,124,213,206,106,37,94,229,200,98,83,170,103,204,137,150,105,34,108,111,204,172,223,154,6,230,208,180,47,144,201,162,247,104,107,160,109,154,29,4,221,1,155,197,228,232,8,37,68,255,34,62,85,76,201,194,74,237,180,82,253,254,93,198,220,242,250,235,97,83,107,138,108,67,247,237,58,178,233,147,31,246,180,9,172,191,254,185,144,254,130,130,223,177,115,221,255,210,190,125,166,147,248,248,151,24,88,254,44,126,151,193,110,159,76,20,217,187,83,46,42,104,201,61,213,178,198,152,30,21,118,37,185,11,232,139,237,197,220,143,5,6,53,35,69,112,162,137,145,176,247,84,180,67,84,156,151,99,83,112,246,74,116,25,89,183,200,60,104,0,232,96,22,53,104,27,137,103,248,105,85,20,187,73,216,71,204,20,93,211,231,37,143,17,37,102,111,73,145,164,144,137,182,63,97,181,53,12,22,115,130,215,118,113,121,214,251,108,148,53,177,157,51,205,58,201,230,218,70,93,78,31,242,0,86,70,178,91,154,14,131,38,184,18,84,236,53,251,92,47,118,228,118,186,58,44,247,58,46,36,106,96,246,166,154,26,208,196,27,175,32,41,135,36,189,77,251,138,63,108,63,136,193,164,104,107,136,86,194,202,26,131,59,210,208,104,67,3,255,221,191,139,156,48,223,227,166,196,14,205,236,243,35,177,20,75,154,113,49,172,92,149,45,199,91,238,52,1,2,76,37,211,102,83,106,6,70,103,218,79,53,213,246,124,17,38,11,180,149,67,189,247,10,156,50,100,133,87,121,160,8,110,153,180,148,217,120,179,106,120,119,91,60,88,19,149,249,150,249,86,6,125,48,10,236,192,146,218,8,252,113,33,234,160,97,233,199,190,72,221,12,62,207,228,59,138,238,76,190,166,235,115,24,26,159,251,3,174,54,10,190,85,24,231,130,241,192,239,81,189,8,70,233,123,105,166,33,204,0,177,19,189,129,115,83,108,217,131,6,106,70,81,93,238,232,21,42,132,91,136,96,150,191,216,131,67,107,225,49,174,181,231,21,204,214,234,51,38,67,55,54,229,208,84,140,93,136,202,173,141,162,211,23,89,236,237,196,139,103,191,190,126,213,236,164,47,48,54,173,206,222,253,108,203,64,6,91,227,33,122,52,15,248,70,106,91,22,116,100,141,3,239,209,28,224,171,162,109,57,208,145,53,14,70,107,57,104,48,119,208,138,120,204,163,222,154,192,90,234,61,83,55,154,87,74,88,229,239,138,182,228,149,99,23,115,59,22,220,158,254,70,25,21,187,239,160,1,190,172,158,22,44,169,16,142,174,236,74,53,59,79,183,213,22,27,158,207,208,183,59,219,218,250,33,196,54,58,174,83,49,230,46,40,162,9,127,157,111,118,165,213,108,42,175,77,212,3,15,181,161,199,157,34,134,249,117,2,118,41,134,133,66,12,164,88,112,162,226,217,47,162,122,38,219,18,122,98,226,240,104,136,137,76,123,4,183,143,155,142,81,18,26,169,228,88,226,226,79,105,152,236,236,86,85,42,42,4,1,76,241,5,34,191,252,48,253,129,161,27,10,131,74,254,167,51,9,216,105,76,125,32,199,172,96,150,125,253,83,198,164,82,125,43,100,145,231,163,50,96,99,9,235,161,74,20,133,47,206,84,186,186,86,50,43,92,159,37,192,98,249,169,123,189,136,8,210,228,157,124,254,66,13,6,198,14,127,170,148,201,249,148,33,252,0,2,42,125,76,169,57,253,207,131,227,99,227,93,223,232,26,8,54,202,93,134,201,197,123,72,63,202,61,88,130,207,121,195,15,163,65,255,15,21,236,201,121,200,212,76,38,198,20,130,232,253,174,122,10,56,244,173,2,137,130,57,173,203,51,78,17,36,57,61,84,177,71,112,223,148,122,100,65,54,4,29,23,209,10,22,9,232,35,69,14,81,149,101,255,91,81,175,220,103,115,219,242,20,49,115,187,202,188,70,16,61,23,194,200,22,244,218,213,170,72,69,212,30,43,188,44,162,182,253,177,44,34,139,147,178,46,194,239,236,217,14,190,168,227,60,132,36,175,228,20,63,47,221,230,65,67,150,224,174,38,123,230,254,162,221,46,55,188,33,120,16,225,220,61,117,155,151,0,15,90,65,187,246,110,110,186,63,136,182,118,121,223,208,51,127,16,97,53,243,236,101,155,217,133,205,237,66,231,213,238,185,188,120,94,230,195,169,115,22,205,42,244,81,225,125,171,213,127,1,213,103,58,13,116,66,0,0 };