Untitled
unknown
plain_text
2 years ago
28 kB
20
Indexable
<!DOCTYPE html>
<html xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"><meta charset="utf-8"><head><title>TAG Tricks</title>
<style type="text/css">
body {
font: normal 12px Verdana, Arial, sans-serif;
background-color: white; /* Lighter, whiter background for a modern look */
}
.select-css {
font-size: 14px;
font-family: sans-serif;
font-weight: 700;
color: #555; /* Updated text color for better contrast on white background */
line-height: 1.3;
padding: .5em 1.5em .5em .8em; /* Adjusted right padding for content balance */
margin: 0;
background-color: white; /* Changed to white for a modern look */
border: 1px solid #cccccc; /* Added border to distinguish the dropdown */
border-radius: 4px; /* Rounded corners for the select box */
appearance: none; /* Standardized appearance */
background-repeat: no-repeat, repeat; /* Maintains the background image */
background-position: right .7em top 50%, 0 0; /* Position for the background image */
background-size: .65em auto, 100%;
}
/* ... other existing select-css and related pseudo-element rules ... */
input[type=text], input[type=password], input[type=email], input[type=search], /* Updated input types for consistency */
textarea, /* Included textarea for text input fields */
select {
width: 100%; /* Full width */
padding: 10px; /* Padding for a larger, touch-friendly interface */
margin: 5px 0 22px 0; /* Margin for spacing, with a larger bottom space for error messages */
display: inline-block; /* Ensures that the input takes up the full width of its container */
border: 1px solid #ccc; /* Border for definition */
border-radius: 4px; /* Rounded corners for all input types */
box-sizing: border-box; /* Box-sizing for border inclusion in width calculation */
background-color: #f8f8f8; /* A light background color */
box-shadow: 0 1px 3px rgba(0,0,0,0.1) inset; /* Inner shadow for a subtle depth effect */
transition: border-color 0.3s; /* Transition for the border color */
}
input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, input[type=search]:focus,
textarea:focus, /* Focus states for inputs and textarea */
select:focus {
border: 1px solid #4CAF50; /* Green border for focus state */
}
input[type=button], input[type=submit], input[type=reset], /* Button types */
button {
background-color: #4CAF50; /* Green background for buttons */
color: white; /* White text color for buttons */
padding: 10px 20px; /* Padding for button size */
margin: 8px 0; /* Margin for spacing around buttons */
border: none; /* No border for a flat style */
border-radius: 4px; /* Rounded corners for buttons */
cursor: pointer; /* Cursor to indicate button functionality */
width: auto; /* Auto width to wrap content */
box-shadow: 0 1px 3px rgba(0,0,0,0.1); /* Box shadow for a subtle 3D effect */
transition: background-color 0.25s ease-out; /* Smooth background color transition */
}
input[type=button]:hover, input[type=submit]:hover, input[type=reset]:hover,
button:hover {
background-color: #45a049; /* A lighter green for the hover state */
}
/* ... any other custom styles or overrides ... */
</style>
</head><body bgcolor="#B9CDF5">
<h1>STVA & Modem MultiTool</h1>
<table><tbody><tr><td><h2>Account (Affects this column)</h2>
<b>Legacy Company:</b><br />
<label class="container">TWC<input type="radio" name="mso" id="mso" value="&mso=twc" checked=""><span class="checkmark"></span></label>
<label class="container">BHN<input type="radio" name="mso" id="mso" value="&mso=bh"><span class="checkmark"></span></label>
<!-- Charter support has not been tested! -->
<label class="container">CHTR<input type="radio" name="mso" id="mso" value="&mso=chtr"><span class="checkmark"></span></label><br><br>
<b>ID Type:</b><br>
<label class="container">Username<input type="radio" name="idtype" id="idtype" value="&username=" checked=""><span class="checkmark"></span></label>
<label class="container">Customer GUID<input type="radio" name="idtype" id="idtype" value="&customerGuid="><span class="checkmark"></span></label><br />
<label class="container">Account GUID<input type="radio" name="idtype" id="idtype" value="&accountGuid="><span class="checkmark"></span></label>
<label class="container">Div:Account<input type="radio" name="idtype" id="idtype" value="&accountId="><span class="checkmark"></span></label><br />
<input type="text" id="identry" name="identry" placeholder="User Identity" autofocus="">
</td></tr>
<tr><td>
<h2>Account Tools:</h2>
<button class="button" onclick="recalcA() "style="font-size: 24px; width:99%;">Recalculate Entitlements</button><br />
<div style="display:flex;"><input style="width:100%" class="button" type="submit" onclick="pinfinderp()" value="Get Parental Pin">
<input style="width:100%" class="button" type="submit" onclick="pinfindert()" value="Get Transactional Pin"><br /></div>
<div style="display:flex;"><input style="width:100%" class="button" type="submit" onclick="lineupcheck()" value="Get Lineup">
<input style="width:100%" class="button" type="submit" onclick="idcheck()" value="Get Identity"></div>
</td></tr>
<tr><td><h2>Behind Own Modem Check</h2>
<div style="display:flex;">
<input style="margin: 2px 0px; width:100%;" type="text" id="ipentry" placeholder="Public IP Address" autofocus="">
<input class="button" type="submit" onclick="btmcheck()" value="Check"></div>
<br></td></tr></tbody></table>
</tbody></table>
<div class="column2"><table style="width:382px;"><tbody>
<tr><td><h2>Ticket Lookup</h2>
<div style="display:flex;">
<select class="select-css" style="margin: 2px 2px; width:49%;" name="ticksystem" id="ticksystem">
<option value="https://remweb.bhn.net/forms/ars01/Ticket+Search?F536870913=">AIM</option>
<option value="https://charter.cherwellondemand.com/CherwellPortal/IT/Command/Queries.GoToRecord?BusObID=945bdc738df5d10ca26a704b41ba7c5a7f1fa47bfc&PublicID=">BOT</option>
<option value="http://csoc.corp.chartercom.com/issuesubmitter/IssueSubmit.aspx?Ticket=">CET</option>
<option value="https://charter.cherwellondemand.com/CherwellPortal/IT/Command/Queries.GoToRecord?BusObID=6dd53665c0c24cab86870a21cf6434ae&PublicID=">Cherwell</option>
<option value="https://corportal.corp.chartercom.com/main/forms/default.aspx?Forms=120&TicketID=">ETD</option>
<option id="INC" selected value="https://cars-web-usr.corp.chartercom.com/arsys/servlet/ViewFormServlet?form=HPD%3AHelp+Desk&server=cars-app-usr&qual='1000000161'="">INC (CARS)</option>
<option selected value="https://vm0pntoolsw0001.corp.chartercom.com/incidentportal/?report_type=incident_search&incident_id=">INC (NOC)</option>
<!-- Deprecated <option value="http://kstlutcwp14.corp.chartercom.com/arsys/forms/remedycc/CCTT%3AEVT%3AEvents/Default+Administrator+View/?eid=">IRIS</option> -->
<!-- Deprecated <option value="https://issuetrak.twcable.com/beta.aspx#/IssueSplitView/Id/">IssueTrak</option> -->
<option value="https://jira.charter.com/browse/">JIRA</option>
<option value="https://cars-web-usr.corp.chartercom.com/arsys/servlet/ViewFormServlet?form=CHR%3ASCI%3ASingle+Customer+Issue&server=cars-app-usr&eid=">SCI</option>
<option value="https://tms.corp.chartercom.com/Task/DetailRO/">TMS</option>
<option value="https://ucm.chartercom.com/SPA/#/issue/update/">UCM</option>
</select><input style="margin: 2px 2px; width:50%;" class="ticketcontainer" type="text" id="ticket" name="ticket" placeholder="FULL Ticket Number"></<br /><br />
</div>
<div style="display:flex;"><input class="button" class="ticketcontainer" style="width:50%" type="submit" onclick="ticketlookup()" value="Look Up">
<input class="button" class="ticketcontainer" style="width:50%" type="submit" onclick="ticketshare()" value="Get Link"></div>
</td></tr>
<tr><td><h2>Device Delete</h2>
<form method="post" action="https://bps-tools.cdptpa.rr.com/bps/omp_tools/device_delete.pl" enctype="multipart/form-data" target="bhnddt"><select style="width:99%;" class="select-css" name="rdc">
<option value="austtx.bps.rr.com">austtx.bps.rr.com</option>
<option value="bps2prod-vip.bhn.net" selected>bps2prod-vip.bhn.net</option>
<option value="clmboh.bps.rr.com">clmboh.bps.rr.com</option>
<option value="dnvrco.bps.rr.com">dnvrco.bps.rr.com</option>
<option value="nycmny.bps.rr.com">nycmny.bps.rr.com</option>
<option value="orngca.bps.rr.com">orngca.bps.rr.com</option>
<option value="rlghnc.bps.rr.com">rlghnc.bps.rr.com</option>
<option value="syrcny.bps.rr.com">syrcny.bps.rr.com</option>
</select><br><div style="display:flex;"><input style="margin: 2px 0px; width:100%;" type="text" name="sub_devmac" placeholder="MAC Address" id="sdevmac"><input style="margin-left: 2px;"class="button" type="submit" name=".submit" value="Query"></div></form>
</td></tr>
<tr><td><h2>Modem Proxy</h2>
<b>HTTP admin port must be enabled from Scope.</b></br></br>
<b>Type:</b> <label class="container">IPv4<input onclick="showipv4();" type="radio" name="iptype" value="selipv4"><span class="checkmark" id="selipv4"></span></label>
<label class="container">IPv6<input onclick="showipv6();" type="radio" name="iptype" value="selipv6"><br /><span class="checkmark" id="selipv6"></span></label>
<div id="showipv4">
<input style="margin: 2px 0px; width:35%;" type="text" id="ipaddress4" name="ipaddress4" placeholder="IPv4 Address">
<select style="margin: 3px 0px;" class="select-css" name="region4" id="region4">
<option value=".car.cproxy.scope.charter.com">Carolinas </option>
<option value=".mwe.cproxy.scope.charter.com">Midwest</option>
<option value=".nyc.cproxy.scope.charter.com">NYC</option>
<option value=".bhn.cproxy.scope.charter.com">Orlando</option>
<option value=".ner.cproxy.scope.charter.com">Syracuse</option>
<option value=".bhn.cproxy.scope.charter.com">Tampa</option>
<option value=".tex.cproxy.scope.charter.com">Texas/KC</option>
<option value=".pwe.cproxy.scope.charter.com">PacWest</option>
</select>
<input class="button" type="submit" onclick="proxylink()" value="Connect"><br /></div>
<div id="showipv6">
<input style="margin: 2px 0px; width:35%;" type="text" id="ipaddress6" name="ipaddress6" placeholder="IPv6 Address">
<select style="margin: 3px 0px;" class="select-css" name="region6" id="region6">
<!-- Deprecated <option value="dnvrco-ccare-jump-v6-02.cloud.twc.net">Legacy 1</option>
<option value="dnvrco-ccare-jump-v6-02.cloud.twc.net">Legacy 2</option>
<option value="dnvrco-ccare-jump-v6-02.cloud.twc.net">Legacy 3</option> -->
<option selected value="cproxy.scope.charter.com">Main </option>
</select><input class="button" type="submit" onclick="proxylink6()" value="Connect"></div>
</td></tr>
<tr><td><h2>Modem Live Ping (<a href="../ScopeID.png" onclick="window.open('ScopeID.png', 'newwindow', 'width=554, height=26'); return false;">?</a>)<br /></h2>
<div style="display:flex;"><input style="margin: 2px 0px; width:100%;" type="text" id="scopeid" placeholder="Scope ID">
<input style="" class="button" type="submit" onclick="pingmodem()" value="Ping Modem"></div><br />
</tr></td>
</tbody>
</table>
<div class="column3"><table style="width:250px;"><tbody>
<tr><td><h2>Roku Eligibility(<a href="https://charterukm.custhelp.com/app/answers/answer_view/a_id/1019740" target="_blank">?</a>)</h2>
<div class="card">
<div class="card-body" id="rokuTool">
<div class="text-center" id="loading">
<p><i>Please allow up to 20 seconds for the tool to load...</i></p>
</div>
<div hidden="" id="toolPrompts">
<input class="form-control" id="acctInput" onkeyup="checkAcctInput()" placeholder="Nine-Digit Account Number" type="text">
<span hidden="" id="acctInputErr" style="color: red;"><b>Please check the Account number</b></span>
<div hidden="" id="zipPrompt"><input class="form-control" id="zipInput" onkeyup="checkZipInput()" placeholder="Five-Digit Zip Code" type="text">
<p hidden="" id="zipInputErr" style="color: red;"><b>Please check the zip code</b></p>
</div>
<div hidden="" id="statePrompt">State Info Here</div>
<button class="btn btn-primary" style="font-size: 17px; width:99%;" disabled="disabled" id="submitBtn" onclick="checkEligibility()" type="submit">Check Eligibility</button></div>
<div hidden="" id="toolOutput">
<hr>
<p hidden="" id="success">Eligible for STVA via Roku</p>
<p hidden="" id="notPass">NOT eligible for STVA via Roku</p>
<button class="btn btn-primary" id="resetBtn" onclick="reset()" type="reset">Check Again</button></div>
</div>
</div>
</div></td>
</tr>
</tbody></table>
</div></div><div style="position: absolute; bottom: 5px;">This tool works best in Chrome. Last update: 06/14/2021. Updated Roku eligibility link.</div>
<script type="text/JavaScript">
var test1="test";
var server="http://ipvs.prd.spectrum.net/saint/api/";
var recalc1="customer?req=Entitlements";
var recalc2="&cacheWriteBehind=true&recalculate=true";
var btm1="customer?ip=";
var btm2="&req=BehindOwnModem&sessionId=tagtricks";
var lineup="customer?req=marketLineup";
var identity="customer?req=Customer,Devices,Address,Metadata";
var incpart1="https://cars-web-usr.corp.chartercom.com/arsys/servlet/ViewFormServlet?form=HPD%3AHelp+Desk&server=cars-app-usr&qual='1000000161'=\""
var incpart2="\""
var href1="<br /><a href=\""
var href2=">Click</a>"
var ping1="https://scope.charter.com/#/popout/"
var ping2="/cablemodem-modem-resetPopout"
var pinp="customer/parentalcontrols/pin?"
var pint="customer/tvod/pin?"
var shipv4 = document.getElementById("showipv4");
var shipv6 = document.getElementById("showipv6");
function buildvar(){
identry=document.getElementById('identry').value
identry2=identry;
idtype=document.querySelector('input[name="idtype"]:checked').value.trim();
ipentry=document.getElementById('ipentry').value
mso=document.querySelector('input[name="mso"]:checked').value.trim();
ticket=document.getElementById('ticket').value
ticksystem=document.querySelector('#ticksystem option:checked').value.trim();
typecheck="&username="
scopeid=document.getElementById('scopeid').value.trim();
ipaddress4=document.getElementById('ipaddress4').value.replace(/[.\s]+/g,"-");
region4=document.querySelector('#region4 option:checked').value;
// Force lowercase if username chosen. Use uppercase, otherwise.
if (document.querySelector('input[name="idtype"]:checked').value.trim().includes("username"))
{
// identry2=identry.toLowerCase();
}
else {
identry2=identry.toUpperCase();
}
}
function recalcA(){
buildvar();
window.open(this.server+recalc1+idtype+identry2+recalc2+mso, "_blank", "width=400,height=300");
}
function btmcheck(){
buildvar();
window.open(server+btm1+ipentry+idtype+identry2+btm2+mso, "_blank", "width=150,height=50");
}
function pinfinderp(){
buildvar();
window.open(server+pinp+idtype+identry2+mso, "_blank", "width=400,height=300");
}
function pinfindert(){
buildvar();
window.open(server+pint+idtype+identry2+mso, "_blank", "width=400,height=300");
}
function idcheck(){
buildvar();
window.open(server+identity+idtype+identry2+mso, "_blank", "width=400,height=300");
}
function lineupcheck(){
buildvar();
window.open(server+lineup+idtype+identry2+mso, "_blank", "width=400,height=300");
}
function ticketlookup(){
buildvar();
if (document.getElementById("INC").selected)
{ticket=ticket+incpart2}
window.open(ticksystem+ticket, "_blank");
}
function inclookup(){
buildvar();
if (document.getElementById("INC").selected)
{ticket=ticket+incpart2}
window.open(incpart1+inctick+incpart2, "_blank");
}
function incshare(){
if (document.getElementById("INC").selected)
{ticket=ticket+incpart2}
buildvar();
alert(incpart1+inctick+incpart2);
}
function ticketshare(){
buildvar();
if (document.getElementById("INC").selected)
{ticket=ticket+incpart2}
alert(ticksystem+ticket);
}
function pingmodem(){
buildvar();
window.open(ping1+scopeid+ping2, 'newwindow', 'width=1000, height=550'); return false;
}
function proxylink(){
buildvar();
// Debug
window.open("https://"+this.ipaddress4+region4, "_blank");
}
function showipv4() {
shipv4.style.display = "flex";
shipv6.style.display = "none";
}
function showipv6() {
shipv6.style.display = "flex";
shipv4.style.display = "none";
}
// <!-- Code taken and adapted from legacy IPv6 Portal -->
function proxylink6(){
region6=document.querySelector('#region6 option:checked').value;
var fqdn = region6;
var ipaddress6 = document.getElementById('ipaddress6').value;
var port = "80";
if (ipaddress6 && validateIpAddress(ipaddress6)){
if (ipaddress6.indexOf(':') >= 0) {
var normalize = ipaddress6.split(':');
for (var i = 0; i < normalize.length; i++) {
normalize[i] = normalize[i].padStart(4, "0");
}
if (port != 80) {
var url = "http://" + normalize.join('') + "." + port + "." + fqdn;
window.open(url);
} else {
var url = "http://" + normalize.join('') + "." + fqdn;
window.open(url);
}
}
} else {
var message = "Invalid IP address provided: " + ipaddress6;
}
if (message){
alert(message);
}
}
function validateIpAddress(ipaddress6){
var expression = /^((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7}$/;
if (expression.test(ipaddress6))
{
// good IP
return true;
}
else
{
// bad IP
return false;
}
}
</script>
<!-- Roku Eligibility checker, from HOW6536. -->
<script async="" src="https://sharepoint.charter.com/corp/OperationalReadiness/lob-specialinitiatives/Shared%20Documents/HTML%20Tools/sampleData.js"></script><script>
let needsZip = true;
let needsState = false;
let exception = false;
function checkAcctInput(){
let valid = true;
let currAcctInput = document.getElementById("acctInput").value;
currAcctInput = currAcctInput.replace(/\s/g, '');
currAcctInput = [...currAcctInput];
for(i=0;i<currAcctInput.length;i++){
if(!(currAcctInput[i] >= '0' && currAcctInput[i] <= '9')){
valid = false;
}
}
valid ? document.getElementById("acctInputErr").hidden = true : document.getElementById("acctInputErr").hidden = false;
if(currAcctInput.length === 9){
valid ? document.getElementById("submitBtn").disabled = false : document.getElementById("submitBtn").disabled = true;
} else if(currAcctInput.length === 16){
needsZip = false;
needsState= false;
valid ? document.getElementById("submitBtn").disabled = false : document.getElementById("submitBtn").disabled = true;
} else{
document.getElementById("submitBtn").disabled = true;
document.getElementById("zipPrompt").hidden = true;
document.getElementById("zipInput").value = "";
document.getElementById("zipInputErr").hidden = true;
document.getElementById("statePrompt").hidden = true;
needsState = false;
needsZip = true;
document.getElementById("stateInput").value = "0";
}
}
function checkZipInput(){
let valid = true;
let currZip = document.getElementById("zipInput").value;
currZip = currZip.replace(/\s/g, '');
currZip = [...currZip];
for(z=0;z<currZip.length;z++){
if(!(currZip[z] >= '0' && currZip[z] <= '9')){
valid = false;
}
}
valid ? document.getElementById("zipInputErr").hidden = true : document.getElementById("zipInputErr").hidden = false;
if(currZip.length === 5){
needsZip = false;
(valid && !needsState) ? document.getElementById("submitBtn").disabled = false : document.getElementById("submitBtn").disabled = true;
} else{
needsZip = true;
document.getElementById("submitBtn").disabled = true;
}
}
function loadStateData(){
let stateSelect = "<select name='stateInput' id='stateInput' onchange='checkStateInput()'><option value='0'>Select a State</option>";
for(s=0;s<stateList.length;s++){
let currState = stateList[s];
stateSelect += "<option value='"+(s+1)+"'>"+currState+"</option>";
}
stateSelect += "<option value='Not Listed'>Not Listed</option></select>";
document.getElementById("statePrompt").innerHTML = stateSelect;
}
function checkStateInput(){
let selectedState = document.getElementById("stateInput").value;
if(selectedState !== '0'){
needsState = false;
exception = true;
} else {
needsState = true;
exception = false;
}
console.log(needsState);
checkZipInput();
}
function checkEligibility(){
let acctInput = document.getElementById("acctInput").value;
acctInput = acctInput.replace(/\s/g, '');
if(acctInput.length === 9){
if(needsZip){
document.getElementById("submitBtn").disabled = true;
checkException();
document.getElementById("zipPrompt").hidden = false;
document.getElementById("zipInput").focus();
}
}
if(!needsZip){
document.getElementById("acctInput").disabled = true;
document.getElementById("zipInput").disabled = true;
document.getElementById("submitBtn").hidden = true;
checkResults();
}
}
function checkException(){
acctInput = document.getElementById("acctInput").value;
for(e=0;e<exceptionData.length;e++){
if(exceptionData[e].billing_id === acctInput){
needsState = true;
break;
}
}
if(needsState){
document.getElementById("statePrompt").hidden = false;
}
}
function checkResults(){
let acct = document.getElementById("acctInput").value;
acct = acct.replace(/\s/g, '');
let zip = document.getElementById("zipInput").value;
zip = zip.replace(/\s/g, '');
let state = document.getElementById("stateInput").value;
state = parseInt(state);
state = stateList[state-1];
let isEligible = false;
if (acct.length === 16){
acct = parseInt(acct);
if (csgData.includes(acct)){
isEligible = true;
}
} else{
for(id=0;id<icomsData.length;id++){
if(icomsData[id].billing_id === acct){
if(icomsData[id].billing_zip_code === zip){
isEligible = true;
break;
}
}
}
if(exception){
for(ie=0;ie<exceptionData.length;ie++){
if(exceptionData[ie].billing_id === acct){
console.log(exceptionData[ie].device_streaming_state_name);
console.log(state);
if(exceptionData[ie].device_streaming_state_name === state){
isEligible = true;
break;
}
}
}
}
}
document.getElementById("toolOutput").hidden = false;
isEligible ? document.getElementById("success").hidden = false : document.getElementById("notPass").hidden = false;
canReset = true;
}
function reset(){
document.getElementById("acctInput").disabled = false;
document.getElementById("zipInput").disabled = false;
document.getElementById("zipInput").value = "";
document.getElementById("acctInput").value = "";
document.getElementById("submitBtn").hidden = false;
document.getElementById("submitBtn").disabled = true;
document.getElementById("zipPrompt").hidden = true;
document.getElementById("zipInput").value = "";
document.getElementById("zipInputErr").hidden = true
document.getElementById("toolOutput").hidden = true;
document.getElementById("success").hidden = true;
document.getElementById("notPass").hidden = true;
needsZip = true;
needsState = false;
exception = false;
document.getElementById("statePrompt").hidden = true;
document.getElementById("stateInput").value = "0";
}
document.getElementById("acctInput").onkeydown = function(e) {
if(e.keyCode === 13){
if(document.getElementById("submitBtn").disabled === false){
checkEligibility();
}
}
}
document.getElementById("zipInput").onkeydown = function(e) {
if(e.keyCode === 13){
if(document.getElementById("submitBtn").disabled === false){
checkEligibility();
}
}
}
window.onbeforeunload = function(){
reset();
}
</script><!-- End my unique code for Roku tool --><!-- Boot Strap JS Code --><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
<!-- TAG Tricks by Joshua Salter. All except recalc function were reverse engineered. NO SUPPORT for functions other than recalc. I do not own any functions, including recalc, that this form takes advantage of. Last update 06/14/2021. -->
</body></html>Editor is loading...