1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-24 11:24:14 +00:00
ESPUI/src/dataControlsJS.h
2022-09-27 10:31:07 -04:00

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