1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-27 21:34:13 +00:00
ESPUI/src/dataControlsJS.h
2022-09-21 15:45:48 -04:00

113 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("websock Error");console.log(evt);conStatusError();};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){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; "+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[4250] PROGMEM = { 31,139,8,0,206,101,43,99,2,255,197,27,105,119,218,72,242,187,127,133,172,228,5,177,198,28,185,38,3,150,243,8,38,9,59,190,214,198,147,121,155,201,250,9,104,140,158,133,164,145,132,137,199,225,191,111,117,245,161,110,33,1,198,51,187,95,98,84,93,93,93,93,85,221,117,117,134,129,31,39,198,85,239,186,119,218,235,247,218,199,215,159,174,122,246,203,122,189,53,20,3,23,221,227,179,246,17,192,26,2,118,126,212,238,119,175,207,62,126,188,236,246,237,134,138,219,253,173,223,61,61,98,52,26,10,188,223,235,119,143,109,5,112,14,20,51,244,16,148,46,210,187,238,80,200,75,29,169,195,176,94,166,88,31,174,250,253,179,83,251,149,142,199,161,141,250,171,20,243,184,253,1,152,120,173,35,50,96,163,254,58,197,187,252,210,235,119,62,119,47,236,55,58,170,132,55,234,111,20,236,227,222,17,192,222,102,112,25,180,81,127,155,98,158,94,157,124,0,216,79,58,38,135,54,234,63,41,226,2,57,130,66,206,175,250,246,59,29,91,25,105,212,223,165,51,62,93,180,207,63,219,63,115,64,251,232,136,65,174,207,207,122,167,20,149,15,116,142,187,237,11,142,220,168,255,172,172,216,254,96,55,50,10,97,48,69,33,151,221,227,110,7,168,101,116,34,192,13,69,43,103,231,253,30,149,127,70,45,2,220,80,212,114,210,3,64,70,43,8,107,40,58,57,105,255,102,55,50,250,64,88,67,85,69,191,123,110,55,178,154,64,96,67,209,195,167,246,213,167,174,221,200,232,129,67,27,138,26,218,157,14,181,141,140,10,56,180,241,78,21,204,121,251,162,221,63,3,53,254,156,149,141,28,105,168,226,238,157,116,225,68,101,228,77,129,13,5,42,15,204,209,217,151,83,121,92,142,187,31,251,242,88,92,244,62,125,238,75,227,239,116,79,251,96,75,66,110,157,235,254,213,197,191,174,206,122,151,93,73,170,115,221,61,233,94,180,143,211,227,215,185,62,239,194,172,139,222,175,48,245,165,4,126,233,246,219,151,231,159,219,199,10,249,235,203,171,211,143,199,103,95,180,53,58,237,139,139,179,190,60,44,157,235,246,113,239,223,237,11,208,224,91,9,58,106,95,252,34,13,191,115,125,122,118,10,219,127,243,166,117,231,68,198,77,228,132,147,35,39,113,108,159,204,141,118,20,57,247,86,25,71,38,78,220,30,14,137,103,143,29,47,38,8,138,61,119,68,162,78,224,39,174,63,11,102,49,31,26,207,252,97,226,6,190,49,12,188,32,234,120,78,28,91,248,179,55,42,63,240,31,246,233,108,58,32,145,132,183,226,185,155,12,39,10,158,19,19,85,102,205,136,36,179,200,55,225,159,63,102,129,27,19,179,197,81,184,8,5,2,153,146,200,241,70,114,56,149,167,192,8,73,66,162,200,189,35,145,68,74,229,43,144,230,36,113,226,112,226,120,137,68,146,242,22,56,241,204,31,123,193,92,161,195,196,47,198,135,78,20,5,233,124,161,10,49,236,120,238,159,78,228,250,18,129,42,166,201,127,83,173,8,196,145,19,221,154,173,17,25,59,51,47,17,64,179,181,88,236,80,45,204,201,32,14,134,183,45,229,55,168,196,39,195,132,140,178,26,137,200,31,51,18,39,103,145,75,252,196,161,160,115,18,77,221,56,134,95,86,249,97,177,35,49,99,231,142,124,18,198,0,67,94,48,116,188,203,36,136,156,27,82,141,73,210,75,200,212,50,73,28,206,92,180,153,216,172,252,243,242,236,180,26,39,176,163,27,119,124,111,73,83,42,151,91,10,225,8,214,15,34,133,182,11,218,70,107,130,21,71,104,122,218,90,55,185,107,165,196,91,238,216,146,83,119,109,127,230,121,229,135,148,22,50,21,58,81,76,82,172,114,139,201,48,93,242,171,59,250,6,76,50,240,215,111,89,126,157,40,1,17,60,183,70,193,112,54,5,201,149,171,206,104,100,153,255,48,203,213,96,60,134,3,242,220,50,159,69,193,28,190,39,201,212,179,76,179,220,226,170,168,14,189,0,214,6,3,103,84,84,210,112,2,47,65,11,179,184,11,118,18,193,10,5,234,163,212,37,46,172,17,145,105,112,71,216,193,50,241,196,236,223,68,132,248,102,121,9,21,248,212,240,34,50,202,193,98,76,35,23,70,205,56,13,12,206,1,101,242,197,179,119,111,95,189,105,229,204,74,183,174,65,125,235,97,232,185,195,219,38,151,92,101,161,109,122,226,248,35,143,252,234,198,238,192,245,220,228,190,3,128,27,16,208,3,232,113,55,43,128,23,47,118,133,204,171,19,119,52,34,126,249,65,42,132,30,128,212,94,185,146,36,58,236,188,123,7,63,142,221,56,33,62,92,53,230,157,92,115,136,107,154,149,124,94,42,40,117,52,172,185,235,143,130,121,149,26,36,93,165,26,6,81,178,107,155,230,143,31,249,35,239,234,69,35,175,95,191,146,250,197,187,245,11,25,92,194,111,146,88,230,60,110,214,106,230,94,118,226,36,136,19,223,153,146,61,179,185,60,72,169,238,153,181,57,136,188,181,32,192,239,214,196,57,141,29,97,176,129,31,132,196,183,133,100,45,114,151,208,107,219,143,3,143,192,252,27,32,201,48,13,138,183,129,205,21,217,102,66,190,3,127,82,215,233,153,73,237,63,137,102,164,181,104,165,172,225,105,218,132,55,68,4,146,217,51,166,81,35,20,182,9,53,156,204,168,201,65,138,157,71,158,57,75,106,88,104,127,43,200,35,133,36,186,223,193,251,111,148,185,174,96,180,58,194,219,106,177,3,74,3,231,136,244,202,59,146,6,178,207,161,114,87,49,241,225,106,154,185,193,45,88,77,93,92,117,45,230,43,136,45,207,199,32,24,221,35,175,67,248,34,17,24,181,240,193,116,209,106,114,31,18,238,133,245,124,164,153,115,215,81,80,226,12,98,223,185,203,3,3,191,112,4,19,117,8,206,22,46,147,13,33,224,234,206,6,21,185,120,176,31,132,83,210,81,224,197,213,113,16,117,29,96,158,120,132,110,207,62,68,153,130,199,252,206,180,240,64,209,155,25,23,197,145,203,149,69,75,209,152,37,103,129,232,83,86,147,32,113,60,177,222,161,165,47,239,17,255,38,153,236,55,202,242,144,235,138,40,68,135,141,12,34,226,220,182,132,168,211,172,173,249,255,221,33,147,59,189,86,225,234,32,223,247,182,218,241,38,243,151,101,192,178,220,102,246,206,138,136,23,56,35,56,100,58,54,230,179,77,105,216,137,155,120,132,89,141,231,12,136,135,102,56,117,92,255,51,113,192,134,132,21,166,8,89,122,152,133,54,197,23,75,9,229,103,154,243,73,16,75,185,228,39,230,46,202,32,207,57,154,66,202,232,134,60,82,134,107,178,31,124,238,159,28,91,236,148,235,76,176,156,121,105,210,67,118,22,221,220,32,241,205,61,68,131,88,10,29,112,18,204,134,19,148,125,51,189,126,202,15,164,26,70,132,170,253,136,197,146,84,148,179,36,161,215,42,56,108,139,147,168,208,91,23,148,82,65,42,160,211,109,104,112,31,186,96,222,95,223,155,200,221,215,239,142,221,72,224,188,5,89,134,238,120,200,96,134,44,45,71,72,185,211,223,27,9,47,28,111,45,187,208,25,177,77,95,157,87,182,149,93,30,13,85,118,200,162,247,116,22,105,162,250,116,38,53,42,75,108,70,79,103,19,83,232,167,243,169,147,89,98,116,240,116,70,105,21,224,233,124,106,84,150,216,28,62,157,77,86,132,120,58,163,25,58,43,79,55,86,219,214,31,190,136,198,218,151,232,215,173,221,165,56,96,137,108,191,253,97,153,166,30,120,56,97,136,30,232,192,115,15,15,28,35,240,167,64,137,204,66,187,4,56,108,31,82,162,123,102,185,100,76,34,50,182,75,148,130,2,47,29,242,15,188,102,246,204,131,154,115,120,80,3,146,185,17,141,92,115,228,222,25,238,8,151,210,136,29,212,96,132,206,165,243,108,32,80,213,9,192,215,128,140,58,236,219,130,60,59,8,155,84,77,139,50,70,127,150,233,132,46,91,217,1,236,177,235,65,176,102,73,181,209,116,8,83,217,231,86,50,113,99,224,39,73,32,213,161,27,51,203,182,109,67,196,77,247,189,159,4,251,236,46,53,193,225,83,99,50,17,110,86,84,3,160,241,4,176,99,135,81,48,13,33,52,239,59,3,35,9,12,54,145,254,178,124,172,218,24,144,38,130,77,190,103,113,220,46,221,79,149,33,193,12,11,62,33,38,112,60,18,81,18,19,39,161,52,141,81,64,98,195,15,18,131,124,135,132,204,104,254,254,59,38,29,57,54,151,99,82,172,82,41,213,15,241,49,204,232,176,72,130,177,205,64,84,188,207,98,136,121,134,9,215,129,142,218,98,159,169,210,130,16,147,71,170,55,246,211,220,219,17,186,219,49,75,6,154,128,93,18,80,102,17,116,64,64,216,98,132,98,31,10,24,6,21,0,56,168,49,154,135,230,242,142,78,122,133,219,1,240,115,171,244,44,246,74,121,91,224,113,19,53,253,98,28,102,4,83,215,55,117,135,73,243,68,131,211,7,85,174,95,160,16,169,104,133,165,125,182,127,251,251,247,233,124,95,177,79,154,101,174,95,161,24,75,174,193,208,255,110,137,46,237,101,233,122,237,119,207,55,60,9,238,40,239,20,236,153,134,235,135,179,132,157,94,126,34,98,247,79,98,193,177,21,7,4,153,137,19,18,174,225,6,187,23,235,239,122,89,174,251,202,79,215,55,123,169,14,40,92,29,100,172,144,47,68,56,112,121,119,99,45,207,173,152,8,75,189,163,126,188,50,13,151,38,94,107,177,125,226,36,147,106,20,204,224,224,211,18,9,80,132,29,211,242,98,223,157,194,175,90,163,94,175,231,113,90,13,103,241,196,122,248,222,76,226,202,125,51,149,6,220,83,153,34,233,54,156,43,124,43,253,160,102,142,192,190,126,251,139,215,19,77,21,170,62,81,221,47,179,113,89,236,199,2,204,122,87,190,178,172,156,185,252,148,86,31,214,18,212,224,54,205,204,184,193,137,165,129,161,179,185,127,30,5,33,184,149,123,171,196,243,218,203,228,222,35,165,50,11,4,84,66,194,128,97,152,91,176,58,35,159,37,153,150,172,200,58,192,163,214,205,247,245,102,227,113,172,197,79,230,141,5,85,5,180,144,53,237,164,238,176,128,234,154,22,138,173,165,89,236,148,91,233,15,101,106,197,132,131,96,42,53,208,255,221,38,121,170,77,105,193,53,169,16,3,198,182,182,10,157,210,54,108,41,41,63,198,127,224,42,254,34,222,50,164,214,51,87,68,28,47,244,254,125,184,154,50,173,233,113,194,114,66,129,185,177,146,198,82,56,245,212,13,47,17,219,70,31,188,52,178,92,249,200,114,182,140,129,37,231,109,153,215,73,109,195,121,90,160,72,31,80,52,151,209,88,5,137,46,121,227,204,110,200,95,36,251,44,173,109,54,192,252,69,206,17,233,157,116,209,207,70,119,182,226,92,147,160,119,121,118,137,197,72,43,91,161,78,192,235,54,205,189,232,14,219,27,25,255,36,122,157,122,165,219,188,242,111,253,96,238,27,212,144,105,18,130,153,131,41,38,165,199,131,142,31,218,162,52,248,226,133,4,30,104,207,101,32,220,137,130,33,137,227,174,239,128,95,27,89,162,220,158,161,163,206,209,136,105,133,113,22,126,137,234,172,22,127,209,141,21,169,42,116,124,226,105,138,82,167,229,104,41,157,176,234,70,224,190,154,210,228,40,95,37,236,91,121,103,105,157,120,18,204,65,71,52,158,93,30,156,128,47,177,178,130,177,109,205,55,149,31,248,214,245,246,36,243,67,251,178,109,207,31,13,236,243,54,189,248,76,123,242,2,146,54,224,5,68,182,219,5,128,245,215,197,151,108,167,211,93,16,209,3,212,217,48,247,148,55,9,188,30,13,223,101,209,67,203,221,66,202,187,96,90,225,86,101,83,242,199,25,91,197,81,33,31,59,5,54,73,43,7,88,50,217,231,174,253,26,191,204,114,149,208,174,128,82,17,224,165,128,175,245,111,60,102,209,107,3,44,88,160,183,35,131,250,244,78,228,161,87,46,38,75,201,149,182,217,20,216,115,110,136,173,116,20,212,14,47,227,143,245,88,121,197,128,157,13,160,103,139,64,129,195,241,70,203,94,13,177,135,43,195,181,0,127,241,122,224,216,173,71,11,65,15,144,178,146,225,197,6,201,57,91,102,5,231,24,76,172,98,221,47,226,92,89,133,58,161,21,107,48,215,189,106,145,100,147,69,68,197,43,119,9,90,163,90,185,130,51,216,96,13,230,205,87,41,154,187,251,149,202,222,96,33,181,193,192,134,43,110,60,2,79,128,151,27,255,169,147,29,80,152,66,13,19,245,12,202,44,204,95,78,86,61,233,53,87,89,94,80,220,143,108,4,242,105,222,247,116,98,126,99,140,220,24,15,47,156,157,7,217,127,229,221,85,165,177,202,138,170,205,162,45,132,195,245,123,8,135,218,38,52,207,92,76,120,188,1,225,113,17,97,90,179,46,38,189,129,220,195,65,17,105,218,94,40,38,237,109,64,218,43,34,141,29,129,98,218,209,6,180,163,28,218,218,19,20,145,54,114,139,137,33,21,38,104,48,248,203,230,111,147,104,201,52,123,11,166,166,3,4,134,183,204,114,50,231,196,129,85,238,136,126,25,106,68,148,119,23,130,136,254,52,68,80,114,253,181,180,244,39,70,41,57,89,240,226,91,106,164,169,223,42,54,178,56,224,227,194,116,92,180,37,50,180,235,203,180,11,216,90,67,94,116,43,216,27,8,165,239,144,190,205,112,227,35,55,30,194,89,229,101,112,68,178,11,221,141,242,252,113,56,176,21,183,163,249,62,221,7,193,141,65,55,16,122,206,144,88,181,255,252,126,180,87,187,169,152,232,94,89,47,4,123,60,152,152,53,115,28,153,234,166,41,132,123,176,197,130,119,82,10,61,96,193,196,22,94,100,42,131,67,199,243,6,206,240,246,146,64,76,189,107,155,84,43,38,179,87,85,60,98,82,202,173,16,196,66,216,155,138,194,100,161,225,236,20,175,91,225,171,182,22,11,241,150,70,22,155,82,57,99,76,244,144,6,194,246,218,200,250,189,105,96,12,77,107,249,153,40,122,143,150,243,155,166,217,66,208,28,216,204,39,71,71,40,33,250,23,241,169,96,10,22,86,202,173,165,242,143,31,210,231,22,87,135,15,235,90,249,118,19,186,239,87,145,77,159,233,176,7,73,160,253,213,79,124,244,87,15,60,199,94,234,216,23,246,218,51,221,191,237,95,79,96,249,51,255,45,5,203,62,217,86,100,191,77,73,84,80,147,123,170,102,141,33,189,42,236,82,50,15,232,107,228,217,212,143,5,6,85,35,69,112,162,145,145,176,55,80,180,171,147,31,151,99,35,111,242,70,116,6,89,135,199,60,168,1,232,96,18,213,104,235,135,71,248,105,85,20,59,64,216,251,203,20,93,211,39,33,219,108,37,102,239,50,145,164,216,19,109,89,194,106,43,24,204,231,4,211,118,145,60,235,189,49,202,154,56,206,27,181,21,178,205,181,37,121,200,11,88,25,201,30,105,58,12,146,224,66,80,177,87,156,115,189,216,177,116,210,213,97,121,214,113,33,81,3,179,215,213,212,128,38,102,188,130,164,28,146,244,214,157,43,254,104,251,32,6,149,162,174,193,91,9,45,107,12,238,72,69,163,14,13,252,119,127,30,57,225,114,95,154,18,59,52,179,79,134,196,82,44,104,198,197,176,114,85,180,28,111,147,211,0,8,48,149,72,155,77,169,24,232,157,105,15,212,84,91,234,121,152,204,209,150,14,245,126,41,112,202,144,21,94,229,133,34,184,101,187,165,204,198,235,69,195,59,210,226,145,153,168,204,55,204,247,210,233,131,82,224,4,22,212,70,224,143,11,94,7,21,75,63,246,69,232,102,240,121,38,63,81,244,100,242,53,93,159,195,80,249,220,30,112,181,65,240,189,196,56,23,140,7,126,135,202,69,48,74,31,31,51,9,97,4,136,221,227,53,156,155,226,200,30,212,80,50,138,232,150,174,94,33,66,200,66,4,179,252,149,29,92,90,51,143,113,173,61,137,96,186,86,159,30,25,186,178,41,135,166,162,236,92,84,174,109,220,58,125,69,197,222,59,188,120,246,243,219,55,245,86,250,106,98,221,234,236,173,206,166,12,100,176,53,30,162,173,121,192,119,77,155,178,160,35,107,28,120,91,115,128,47,129,54,229,64,71,214,56,24,172,228,160,198,204,65,43,226,49,139,122,111,2,107,169,245,140,221,104,90,42,96,149,191,5,218,144,87,142,157,207,237,80,112,123,246,11,101,84,156,190,131,26,216,178,122,91,176,160,66,24,186,114,42,213,232,60,61,86,27,28,120,62,67,63,238,236,104,235,151,16,59,232,184,78,201,152,186,32,136,58,252,117,190,219,165,70,189,174,188,16,81,47,60,148,134,238,119,242,24,230,233,4,156,82,116,11,185,24,72,49,231,70,197,187,95,120,245,76,180,37,228,196,182,195,189,33,6,50,205,1,100,31,183,45,163,192,53,210,157,99,137,139,63,127,97,123,103,89,85,225,86,193,9,96,136,47,16,121,242,195,228,7,138,174,41,12,42,241,159,206,36,96,167,62,245,145,28,179,130,89,246,197,78,17,147,74,245,45,151,69,30,143,74,135,141,37,172,199,10,81,20,190,56,83,233,234,90,201,44,119,125,22,0,139,229,199,238,205,44,34,72,147,119,242,249,171,50,24,24,58,252,121,81,38,230,83,134,240,3,8,168,244,49,164,230,244,191,244,142,143,141,15,93,163,109,32,216,40,54,25,182,47,222,67,250,187,204,131,5,248,156,55,252,48,106,244,255,35,193,153,156,134,76,204,100,100,140,193,137,222,239,170,183,128,67,223,42,144,40,152,210,186,60,227,20,65,146,211,67,21,123,0,249,166,148,35,115,178,33,200,56,143,86,48,75,232,75,25,137,28,162,40,139,254,39,158,94,185,207,198,182,197,33,98,38,187,202,188,70,16,61,23,194,200,230,244,218,213,170,72,73,212,30,75,188,44,162,182,253,177,44,34,139,147,178,46,194,115,246,108,7,95,212,113,30,67,146,87,114,242,159,132,110,242,160,33,75,112,87,219,123,38,127,209,178,203,53,111,8,30,69,120,41,79,221,228,37,192,163,86,208,210,222,245,77,247,71,209,214,146,247,53,61,243,71,17,86,35,207,78,182,153,157,219,220,206,53,94,45,207,229,197,243,34,27,78,141,51,111,86,174,141,10,235,91,44,254,11,247,155,148,223,80,65,0,0 };